././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/0000755000175000017500000000000014620351546013010 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/CHANGELOG.md0000644000175000017500000002556614620351225014631 0ustar00hanshans# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ## unreleased ### Added ### Fixed ### Removed * The `maven:` field is now always a string, with `yes` as a legacy special value. It is no longer treated like a boolean in any case. ## [2.2.2] - 2024-04-24 ### Added * Include sdkmanager as dep in setup.py for Homebrew package. https://github.com/Homebrew/homebrew-core/pull/164510 ## [2.2.1] - 2023-03-09 ### Added * `download_repo_index_v2()` and `download_repo_index_v2()` API functions https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1323 ### Fixed * Fix OpenJDK detection on different CPU architectures https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1315 ### Removed * Purge all references to `zipalign`, that is delegated to other things https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1316 * Remove obsolete, unused `buildozer` build type https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1322 ## [2.2.0] - 2023-02-20 ### Added * Support index-v2 format, localizable Anti-Features, Categories * New entry point for repos, entry.jar, signed with modern algorithms * New config/ subdirectory for localizable configuration * Script entries in metadata files (init, prebuild, build, etc) now handled as lists so they now support using && or ; in the script, and behave like .gitlab-ci.yml and other CI YAML. * GPG signatures for index-v1.json and index-v2.json * Use default.txt as fallback changelog when inserting fastlane metadata * scanner: F-Droid signatures now maintained in fdroid/suss * scanner: maintain signature sources in config.yml, including Exodus Privacy * scanner: use dexdump for class names * scanner: directly scan APK files when given a path * scanner: recursively scan APKs for DEX and ZIP using file magic * signindex: validate index files before signing * update: set ArchivePolicy based on VercodeOperation/signature * Include IPFS CIDv1 in index-v2.json for hosting repos on IPFS * Per-repo beta channel configuration * Add Czech translation ### Fixed * apksigner v30 or higher now required for verifying and signing APKs * 3.9 as minimum supported Python version * Lots of translation updates * Better pip packaging * nightly: big overhaul for reliable operation on all Debian/Ubuntu versions * Improved logging, fewer confusing verbose messages * scanner: fix detection of binary files without extension * import: more reliable operation, including Flutter apps * Support Java 20 and up ### Removed * Remove obsolete `fdroid stats` command ## [2.1.1] - 2022-09-06 * gradlew-fdroid: Include latest versions and checksums * nightly: update Raw URLs to fix breakage and avoid redirects * signindex: gpg-sign index-v1.json and deploy it * update: fix --use-date-from-apk when used with files (#1012) ## [2.1] - 2022-02-22 For a more complete overview, see the [2.1 milestone](https://gitlab.com/fdroid/fdroidserver/-/milestones/11) ## [2.0.5] - 2022-09-06 ### Fixed * gradlew-fdroid: Include latest versions and checksums * nightly: add support for GitHub Actions * nightly: update Raw URLs to fix breakage and avoid redirects * update: fix --use-date-from-apk when used with files (#1012) * Fix GitLab CI ## [2.0.4] - 2022-06-29 ### Fixed * deploy: ensure progress is instantiated before trying to use it * signindex: gpg-sign index-v1.json and deploy it [1080](https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1080) [1124](https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1124) ## [2.0.3] - 2021-07-01 ### Fixed * Support AutoUpdateMode: Version without pattern [931](https://gitlab.com/fdroid/fdroidserver/-/merge_requests/931) ## [2.0.2] - 2021-06-01 ### Fixed * fix "ruamel round_trip_dump will be removed" [932](https://gitlab.com/fdroid/fdroidserver/-/merge_requests/932) ## [2.0.1] - 2021-03-09 ### Fixed * metadata: stop setting up source repo when running lint/rewritemeta * scanner: show error if scan_binary fails to run apkanalyzer * common: properly parse version from NDK's source.properties * update: stop extracting and storing XML icons, they're useless * index: raise error rather than crash on bad repo file * update: handle large, corrupt, or inaccessible fastlane/triple-t files * Update SPDX License List * checkupdates: set User-Agent to make gitlab.com happy * Run push_binary_transparency only once ## [2.0] - 2021-01-31 For a more complete overview, see the [2.0 milestone](https://gitlab.com/fdroid/fdroidserver/-/milestones/10) ### Added * `fdroid update` inserts donation links based on upstream's _FUNDING.yml_ ([!754](https://gitlab.com/fdroid/fdroidserver/merge_requests/754)) * Stable, public API for most useful functions ([!798](https://gitlab.com/fdroid/fdroidserver/merge_requests/798)) * Load with any YAML lib and use with the API, no more custom parser needed ([!826](https://gitlab.com/fdroid/fdroidserver/merge_requests/826)) ([!838](https://gitlab.com/fdroid/fdroidserver/merge_requests/838)) * _config.yml_ for a safe, easy, standard configuration format ([!663](https://gitlab.com/fdroid/fdroidserver/merge_requests/663)) * Config options can be set from environment variables using this syntax: `keystorepass: {env: keystorepass}` ([!669](https://gitlab.com/fdroid/fdroidserver/merge_requests/669)) * Add SHA256 to filename of repo graphics ([!669](https://gitlab.com/fdroid/fdroidserver/merge_requests/669)) * Support for srclibs metadata in YAML format ([!700](https://gitlab.com/fdroid/fdroidserver/merge_requests/700)) * Check srclibs and app-metadata files with yamllint ([!721](https://gitlab.com/fdroid/fdroidserver/merge_requests/721)) * Added plugin system for adding subcommands to `fdroid` ([!709](https://gitlab.com/fdroid/fdroidserver/merge_requests/709)) * `fdroid update`, `fdroid publish`, and `fdroid signindex` now work with SmartCard HSMs, specifically the NitroKey HSM ([!779](https://gitlab.com/fdroid/fdroidserver/merge_requests/779)) ([!782](https://gitlab.com/fdroid/fdroidserver/merge_requests/782)) * `fdroid update` support for Triple-T Gradle Play Publisher v2.x ([!683](https://gitlab.com/fdroid/fdroidserver/merge_requests/683)) * Translated into: bo de es fr hu it ko nb_NO pl pt pt_BR pt_PT ru sq tr uk zh_Hans zh_Hant ### Fixed * Smoother process for signing APKs with `apksigner` ([!736](https://gitlab.com/fdroid/fdroidserver/merge_requests/736)) ([!821](https://gitlab.com/fdroid/fdroidserver/merge_requests/821)) * `apksigner` is used by default on new repos * All parts except _build_ and _publish_ work without the Android SDK ([!821](https://gitlab.com/fdroid/fdroidserver/merge_requests/821)) * Description: is now passed to clients unchanged, no HTML conversion ([!828](https://gitlab.com/fdroid/fdroidserver/merge_requests/828)) * Lots of improvements for scanning for proprietary code and trackers ([!748](https://gitlab.com/fdroid/fdroidserver/merge_requests/748)) ([!REPLACE](https://gitlab.com/fdroid/fdroidserver/merge_requests/REPLACE)) ([!844](https://gitlab.com/fdroid/fdroidserver/merge_requests/844)) * `fdroid mirror` now generates complete, working local mirror repos * fix build-logs dissapearing when deploying ([!685](https://gitlab.com/fdroid/fdroidserver/merge_requests/685)) * do not crash when system encoding can not be retrieved ([!671](https://gitlab.com/fdroid/fdroidserver/merge_requests/671)) * checkupdates: UpdateCheckIngore gets properly observed now ([!659](https://gitlab.com/fdroid/fdroidserver/merge_requests/659), [!660](https://gitlab.com/fdroid/fdroidserver/merge_requests/660)) * keep yaml metadata when rewrite failed ([!658](https://gitlab.com/fdroid/fdroidserver/merge_requests/658)) * import: `template.yml` now supports omitting values ([!657](https://gitlab.com/fdroid/fdroidserver/merge_requests/657)) * build: deploying buildlogs with rsync ([!651](https://gitlab.com/fdroid/fdroidserver/merge_requests/651)) * `fdroid init` generates PKCS12 keystores, drop Java < 8 support ([!801](https://gitlab.com/fdroid/fdroidserver/-/merge_requests/801)) * Parse Version Codes specified in hex ([!692](https://gitlab.com/fdroid/fdroidserver/-/merge_requests/692)) * Major refactoring on core parts of code to be more Pythonic ([!756](https://gitlab.com/fdroid/fdroidserver/-/merge_requests/756)) * `fdroid init` now works when installed with pip ### Removed * Removed all support for _.txt_ and _.json_ metadata ([!772](https://gitlab.com/fdroid/fdroidserver/-/merge_requests/772)) * dropped support for Debian 8 _jessie_ and 9 _stretch_ * dropped support for Ubuntu releases older than bionic 18.04 * dropped `fdroid server update` and `fdroid server init`, use `fdroid deploy` * `fdroid dscanner` was removed. ([!711](https://gitlab.com/fdroid/fdroidserver/-/merge_requests/711)) * `make_current_version_link` is now off by default * Dropped `force_build_tools` config option ([!797](https://gitlab.com/fdroid/fdroidserver/-/merge_requests/797)) * Dropped `accepted_formats` config option, there is only _.yml_ now ([!818](https://gitlab.com/fdroid/fdroidserver/-/merge_requests/818)) * `Provides:` was removed as a metadata field ([!654](https://gitlab.com/fdroid/fdroidserver/-/merge_requests/654)) * Remove unused `latestapps.dat` ([!794](https://gitlab.com/fdroid/fdroidserver/-/merge_requests/794)) ## [1.1.4] - 2019-08-15 ### Fixed * include bitcoin validation regex required by fdroiddata * merged Debian patches to fix test suite there ## [1.1.3] - 2019-07-03 ### Fixed * fixed test suite when run from source tarball * fixed test runs in Debian ## [1.1.2] - 2019-03-29 ### Fixed * fix bug while downloading repo index ([!636](https://gitlab.com/fdroid/fdroidserver/merge_requests/636)) ## [1.1.1] - 2019-02-03 ### Fixed * support APK Signature v2 and v3 * all SDK Version values are output as integers in the index JSON * take graphics from Fastlane dirs using any valid RFC5646 locale * print warning if not running in UTF-8 encoding * fdroid build: hide --on-server cli flag ## [1.1] - 2019-01-28 ### Fixed * a huge update with many fixes and new features: https://gitlab.com/fdroid/fdroidserver/milestones/7 * can run without and Android SDK installed * much more reliable operation with large binary APK collections * sync all translations, including newly added languages: hu it ko pl pt_PT ru * many security fixes, based on the security audit * NoSourceSince automatically adds SourceGone Anti-Feature * aapt scraping works with all known aapt versions * smoother mirror setups * much faster `fdroid update` when using androguard [Unreleased]: https://gitlab.com/fdroid/fdroidserver/compare/1.1.4...master [1.1.4]: https://gitlab.com/fdroid/fdroidserver/compare/1.1.3...1.1.4 [1.1.3]: https://gitlab.com/fdroid/fdroidserver/compare/1.1.2...1.1.3 [1.1.2]: https://gitlab.com/fdroid/fdroidserver/compare/1.1.1...1.1.2 [1.1.1]: https://gitlab.com/fdroid/fdroidserver/compare/1.1...1.1.1 [1.1]: https://gitlab.com/fdroid/fdroidserver/tags/1.1 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/LICENSE0000644000175000017500000010333014620351225014007 0ustar00hanshans GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 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 Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, our General Public Licenses are 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. 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. Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software. A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate. Many developers of free software are heartened and encouraged by the resulting cooperation. However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a server without ever releasing its source code to the public. The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community. It requires the operator of a network server to provide the source code of the modified version running there to the users of that server. Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version. An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals. This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license. 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 Affero 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. Remote Network Interaction; Use with the GNU General Public License. Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph. 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 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 work with which it is combined will remain governed by version 3 of the GNU General Public License. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU Affero 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 Affero 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 Affero 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 Affero 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 Affero 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If your software can interact with users remotely through a computer network, you should also make sure that it provides a way for users to get its source. For example, if your program is a web application, its interface could display a "Source" link that leads users to an archive of the code. There are many ways you could offer source, and different solutions will be better for different programs; see section 13 for the specific requirements. 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 AGPL, see . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/MANIFEST.in0000644000175000017500000017142214620351225014547 0ustar00hanshansinclude buildserver/config.buildserver.yml include buildserver/provision-android-ndk include buildserver/provision-android-sdk include buildserver/provision-apt-get-install include buildserver/provision-apt-proxy include buildserver/provision-gradle include buildserver/setup-env-vars include buildserver/Vagrantfile include CHANGELOG.md include completion/bash-completion include examples/config.yml include examples/fdroid_exportkeystore.py include examples/fdroid_export_keystore_to_nitrokey.py include examples/fdroid_extract_repo_pubkey.py include examples/fdroid_fetchsrclibs.py include examples/fdroid_nitrokeyimport.py include examples/opensc-fdroid.cfg include examples/public-read-only-s3-bucket-policy.json include examples/template.yml include examples/Vagrantfile.yaml include gradlew-fdroid include LICENSE include locale/bo/LC_MESSAGES/fdroidserver.po include locale/cs/LC_MESSAGES/fdroidserver.po include locale/de/LC_MESSAGES/fdroidserver.po include locale/es/LC_MESSAGES/fdroidserver.po include locale/fr/LC_MESSAGES/fdroidserver.po include locale/hu/LC_MESSAGES/fdroidserver.po include locale/it/LC_MESSAGES/fdroidserver.po include locale/ko/LC_MESSAGES/fdroidserver.po include locale/nb_NO/LC_MESSAGES/fdroidserver.po include locale/pl/LC_MESSAGES/fdroidserver.po include locale/pt/LC_MESSAGES/fdroidserver.po include locale/pt_BR/LC_MESSAGES/fdroidserver.po include locale/pt_PT/LC_MESSAGES/fdroidserver.po include locale/ro/LC_MESSAGES/fdroidserver.po include locale/ru/LC_MESSAGES/fdroidserver.po include locale/sq/LC_MESSAGES/fdroidserver.po include locale/tr/LC_MESSAGES/fdroidserver.po include locale/uk/LC_MESSAGES/fdroidserver.po include locale/zh_Hans/LC_MESSAGES/fdroidserver.po include locale/zh_Hant/LC_MESSAGES/fdroidserver.po include makebuildserver include README.md include tests/aosp_testkey_debug.keystore include tests/apk.embedded_1.apk include tests/bad-unicode-*.apk include tests/build.TestCase include tests/build-tools/17.0.0/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/17.0.0/aapt-output-com.politedroid_3.txt include tests/build-tools/17.0.0/aapt-output-com.politedroid_4.txt include tests/build-tools/17.0.0/aapt-output-com.politedroid_5.txt include tests/build-tools/17.0.0/aapt-output-com.politedroid_6.txt include tests/build-tools/17.0.0/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/17.0.0/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/17.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/17.0.0/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/17.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/17.0.0/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/17.0.0/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/17.0.0/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/17.0.0/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/17.0.0/aapt-output-souch.smsbypass_9.txt include tests/build-tools/18.1.1/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/18.1.1/aapt-output-com.politedroid_3.txt include tests/build-tools/18.1.1/aapt-output-com.politedroid_4.txt include tests/build-tools/18.1.1/aapt-output-com.politedroid_5.txt include tests/build-tools/18.1.1/aapt-output-com.politedroid_6.txt include tests/build-tools/18.1.1/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/18.1.1/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/18.1.1/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/18.1.1/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/18.1.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/18.1.1/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/18.1.1/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/18.1.1/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/18.1.1/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/18.1.1/aapt-output-souch.smsbypass_9.txt include tests/build-tools/19.0.0/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/19.0.0/aapt-output-com.politedroid_3.txt include tests/build-tools/19.0.0/aapt-output-com.politedroid_4.txt include tests/build-tools/19.0.0/aapt-output-com.politedroid_5.txt include tests/build-tools/19.0.0/aapt-output-com.politedroid_6.txt include tests/build-tools/19.0.0/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/19.0.0/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/19.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/19.0.0/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/19.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/19.0.0/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/19.0.0/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/19.0.0/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/19.0.0/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/19.0.0/aapt-output-souch.smsbypass_9.txt include tests/build-tools/19.1.0/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/19.1.0/aapt-output-com.politedroid_3.txt include tests/build-tools/19.1.0/aapt-output-com.politedroid_4.txt include tests/build-tools/19.1.0/aapt-output-com.politedroid_5.txt include tests/build-tools/19.1.0/aapt-output-com.politedroid_6.txt include tests/build-tools/19.1.0/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/19.1.0/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/19.1.0/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/19.1.0/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/19.1.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/19.1.0/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/19.1.0/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/19.1.0/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/19.1.0/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/19.1.0/aapt-output-souch.smsbypass_9.txt include tests/build-tools/20.0.0/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/20.0.0/aapt-output-com.politedroid_3.txt include tests/build-tools/20.0.0/aapt-output-com.politedroid_4.txt include tests/build-tools/20.0.0/aapt-output-com.politedroid_5.txt include tests/build-tools/20.0.0/aapt-output-com.politedroid_6.txt include tests/build-tools/20.0.0/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/20.0.0/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/20.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/20.0.0/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/20.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/20.0.0/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/20.0.0/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/20.0.0/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/20.0.0/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/20.0.0/aapt-output-souch.smsbypass_9.txt include tests/build-tools/21.1.1/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/21.1.1/aapt-output-com.politedroid_3.txt include tests/build-tools/21.1.1/aapt-output-com.politedroid_4.txt include tests/build-tools/21.1.1/aapt-output-com.politedroid_5.txt include tests/build-tools/21.1.1/aapt-output-com.politedroid_6.txt include tests/build-tools/21.1.1/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/21.1.1/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/21.1.1/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/21.1.1/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/21.1.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/21.1.1/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/21.1.1/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/21.1.1/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/21.1.1/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/21.1.1/aapt-output-souch.smsbypass_9.txt include tests/build-tools/21.1.2/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/21.1.2/aapt-output-com.politedroid_3.txt include tests/build-tools/21.1.2/aapt-output-com.politedroid_4.txt include tests/build-tools/21.1.2/aapt-output-com.politedroid_5.txt include tests/build-tools/21.1.2/aapt-output-com.politedroid_6.txt include tests/build-tools/21.1.2/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/21.1.2/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/21.1.2/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/21.1.2/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/21.1.2/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/21.1.2/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/21.1.2/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/21.1.2/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/21.1.2/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/21.1.2/aapt-output-souch.smsbypass_9.txt include tests/build-tools/22.0.0/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/22.0.0/aapt-output-com.politedroid_3.txt include tests/build-tools/22.0.0/aapt-output-com.politedroid_4.txt include tests/build-tools/22.0.0/aapt-output-com.politedroid_5.txt include tests/build-tools/22.0.0/aapt-output-com.politedroid_6.txt include tests/build-tools/22.0.0/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/22.0.0/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/22.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/22.0.0/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/22.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/22.0.0/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/22.0.0/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/22.0.0/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/22.0.0/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/22.0.0/aapt-output-souch.smsbypass_9.txt include tests/build-tools/22.0.1/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/22.0.1/aapt-output-com.politedroid_3.txt include tests/build-tools/22.0.1/aapt-output-com.politedroid_4.txt include tests/build-tools/22.0.1/aapt-output-com.politedroid_5.txt include tests/build-tools/22.0.1/aapt-output-com.politedroid_6.txt include tests/build-tools/22.0.1/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/22.0.1/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/22.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/22.0.1/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/22.0.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/22.0.1/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/22.0.1/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/22.0.1/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/22.0.1/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/22.0.1/aapt-output-souch.smsbypass_9.txt include tests/build-tools/23.0.0/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/23.0.0/aapt-output-com.politedroid_3.txt include tests/build-tools/23.0.0/aapt-output-com.politedroid_4.txt include tests/build-tools/23.0.0/aapt-output-com.politedroid_5.txt include tests/build-tools/23.0.0/aapt-output-com.politedroid_6.txt include tests/build-tools/23.0.0/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/23.0.0/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/23.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/23.0.0/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/23.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/23.0.0/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/23.0.0/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/23.0.0/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/23.0.0/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/23.0.0/aapt-output-souch.smsbypass_9.txt include tests/build-tools/23.0.1/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/23.0.1/aapt-output-com.politedroid_3.txt include tests/build-tools/23.0.1/aapt-output-com.politedroid_4.txt include tests/build-tools/23.0.1/aapt-output-com.politedroid_5.txt include tests/build-tools/23.0.1/aapt-output-com.politedroid_6.txt include tests/build-tools/23.0.1/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/23.0.1/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/23.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/23.0.1/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/23.0.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/23.0.1/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/23.0.1/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/23.0.1/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/23.0.1/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/23.0.1/aapt-output-souch.smsbypass_9.txt include tests/build-tools/23.0.2/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/23.0.2/aapt-output-com.politedroid_3.txt include tests/build-tools/23.0.2/aapt-output-com.politedroid_4.txt include tests/build-tools/23.0.2/aapt-output-com.politedroid_5.txt include tests/build-tools/23.0.2/aapt-output-com.politedroid_6.txt include tests/build-tools/23.0.2/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/23.0.2/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/23.0.2/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/23.0.2/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/23.0.2/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/23.0.2/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/23.0.2/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/23.0.2/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/23.0.2/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/23.0.2/aapt-output-souch.smsbypass_9.txt include tests/build-tools/23.0.3/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/23.0.3/aapt-output-com.politedroid_3.txt include tests/build-tools/23.0.3/aapt-output-com.politedroid_4.txt include tests/build-tools/23.0.3/aapt-output-com.politedroid_5.txt include tests/build-tools/23.0.3/aapt-output-com.politedroid_6.txt include tests/build-tools/23.0.3/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/23.0.3/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/23.0.3/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/23.0.3/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/23.0.3/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/23.0.3/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/23.0.3/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/23.0.3/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/23.0.3/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/23.0.3/aapt-output-souch.smsbypass_9.txt include tests/build-tools/24.0.0/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/24.0.0/aapt-output-com.politedroid_3.txt include tests/build-tools/24.0.0/aapt-output-com.politedroid_4.txt include tests/build-tools/24.0.0/aapt-output-com.politedroid_5.txt include tests/build-tools/24.0.0/aapt-output-com.politedroid_6.txt include tests/build-tools/24.0.0/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/24.0.0/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/24.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/24.0.0/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/24.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/24.0.0/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/24.0.0/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/24.0.0/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/24.0.0/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/24.0.0/aapt-output-souch.smsbypass_9.txt include tests/build-tools/24.0.1/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/24.0.1/aapt-output-com.politedroid_3.txt include tests/build-tools/24.0.1/aapt-output-com.politedroid_4.txt include tests/build-tools/24.0.1/aapt-output-com.politedroid_5.txt include tests/build-tools/24.0.1/aapt-output-com.politedroid_6.txt include tests/build-tools/24.0.1/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/24.0.1/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/24.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/24.0.1/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/24.0.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/24.0.1/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/24.0.1/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/24.0.1/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/24.0.1/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/24.0.1/aapt-output-souch.smsbypass_9.txt include tests/build-tools/24.0.2/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/24.0.2/aapt-output-com.politedroid_3.txt include tests/build-tools/24.0.2/aapt-output-com.politedroid_4.txt include tests/build-tools/24.0.2/aapt-output-com.politedroid_5.txt include tests/build-tools/24.0.2/aapt-output-com.politedroid_6.txt include tests/build-tools/24.0.2/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/24.0.2/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/24.0.2/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/24.0.2/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/24.0.2/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/24.0.2/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/24.0.2/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/24.0.2/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/24.0.2/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/24.0.2/aapt-output-souch.smsbypass_9.txt include tests/build-tools/24.0.3/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/24.0.3/aapt-output-com.politedroid_3.txt include tests/build-tools/24.0.3/aapt-output-com.politedroid_4.txt include tests/build-tools/24.0.3/aapt-output-com.politedroid_5.txt include tests/build-tools/24.0.3/aapt-output-com.politedroid_6.txt include tests/build-tools/24.0.3/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/24.0.3/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/24.0.3/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/24.0.3/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/24.0.3/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/24.0.3/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/24.0.3/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/24.0.3/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/24.0.3/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/24.0.3/aapt-output-souch.smsbypass_9.txt include tests/build-tools/25.0.0/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/25.0.0/aapt-output-com.politedroid_3.txt include tests/build-tools/25.0.0/aapt-output-com.politedroid_4.txt include tests/build-tools/25.0.0/aapt-output-com.politedroid_5.txt include tests/build-tools/25.0.0/aapt-output-com.politedroid_6.txt include tests/build-tools/25.0.0/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/25.0.0/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/25.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/25.0.0/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/25.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/25.0.0/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/25.0.0/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/25.0.0/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/25.0.0/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/25.0.0/aapt-output-souch.smsbypass_9.txt include tests/build-tools/25.0.1/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/25.0.1/aapt-output-com.politedroid_3.txt include tests/build-tools/25.0.1/aapt-output-com.politedroid_4.txt include tests/build-tools/25.0.1/aapt-output-com.politedroid_5.txt include tests/build-tools/25.0.1/aapt-output-com.politedroid_6.txt include tests/build-tools/25.0.1/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/25.0.1/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/25.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/25.0.1/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/25.0.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/25.0.1/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/25.0.1/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/25.0.1/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/25.0.1/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/25.0.1/aapt-output-souch.smsbypass_9.txt include tests/build-tools/25.0.2/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/25.0.2/aapt-output-com.politedroid_3.txt include tests/build-tools/25.0.2/aapt-output-com.politedroid_4.txt include tests/build-tools/25.0.2/aapt-output-com.politedroid_5.txt include tests/build-tools/25.0.2/aapt-output-com.politedroid_6.txt include tests/build-tools/25.0.2/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/25.0.2/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/25.0.2/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/25.0.2/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/25.0.2/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/25.0.2/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/25.0.2/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/25.0.2/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/25.0.2/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/25.0.2/aapt-output-souch.smsbypass_9.txt include tests/build-tools/25.0.3/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/25.0.3/aapt-output-com.politedroid_3.txt include tests/build-tools/25.0.3/aapt-output-com.politedroid_4.txt include tests/build-tools/25.0.3/aapt-output-com.politedroid_5.txt include tests/build-tools/25.0.3/aapt-output-com.politedroid_6.txt include tests/build-tools/25.0.3/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/25.0.3/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/25.0.3/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/25.0.3/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/25.0.3/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/25.0.3/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/25.0.3/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/25.0.3/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/25.0.3/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/25.0.3/aapt-output-souch.smsbypass_9.txt include tests/build-tools/26.0.0/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/26.0.0/aapt-output-com.politedroid_3.txt include tests/build-tools/26.0.0/aapt-output-com.politedroid_4.txt include tests/build-tools/26.0.0/aapt-output-com.politedroid_5.txt include tests/build-tools/26.0.0/aapt-output-com.politedroid_6.txt include tests/build-tools/26.0.0/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/26.0.0/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/26.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/26.0.0/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/26.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/26.0.0/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/26.0.0/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/26.0.0/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/26.0.0/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/26.0.0/aapt-output-souch.smsbypass_9.txt include tests/build-tools/26.0.1/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/26.0.1/aapt-output-com.politedroid_3.txt include tests/build-tools/26.0.1/aapt-output-com.politedroid_4.txt include tests/build-tools/26.0.1/aapt-output-com.politedroid_5.txt include tests/build-tools/26.0.1/aapt-output-com.politedroid_6.txt include tests/build-tools/26.0.1/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/26.0.1/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/26.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/26.0.1/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/26.0.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/26.0.1/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/26.0.1/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/26.0.1/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/26.0.1/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/26.0.1/aapt-output-souch.smsbypass_9.txt include tests/build-tools/26.0.2/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/26.0.2/aapt-output-com.politedroid_3.txt include tests/build-tools/26.0.2/aapt-output-com.politedroid_4.txt include tests/build-tools/26.0.2/aapt-output-com.politedroid_5.txt include tests/build-tools/26.0.2/aapt-output-com.politedroid_6.txt include tests/build-tools/26.0.2/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/26.0.2/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/26.0.2/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/26.0.2/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/26.0.2/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/26.0.2/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/26.0.2/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/26.0.2/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/26.0.2/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/26.0.2/aapt-output-souch.smsbypass_9.txt include tests/build-tools/26.0.3/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/26.0.3/aapt-output-com.politedroid_3.txt include tests/build-tools/26.0.3/aapt-output-com.politedroid_4.txt include tests/build-tools/26.0.3/aapt-output-com.politedroid_5.txt include tests/build-tools/26.0.3/aapt-output-com.politedroid_6.txt include tests/build-tools/26.0.3/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/26.0.3/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/26.0.3/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/26.0.3/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/26.0.3/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/26.0.3/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/26.0.3/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/26.0.3/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/26.0.3/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/26.0.3/aapt-output-souch.smsbypass_9.txt include tests/build-tools/27.0.0/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/27.0.0/aapt-output-com.politedroid_3.txt include tests/build-tools/27.0.0/aapt-output-com.politedroid_4.txt include tests/build-tools/27.0.0/aapt-output-com.politedroid_5.txt include tests/build-tools/27.0.0/aapt-output-com.politedroid_6.txt include tests/build-tools/27.0.0/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/27.0.0/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/27.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/27.0.0/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/27.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/27.0.0/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/27.0.0/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/27.0.0/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/27.0.0/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/27.0.0/aapt-output-souch.smsbypass_9.txt include tests/build-tools/27.0.1/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/27.0.1/aapt-output-com.politedroid_3.txt include tests/build-tools/27.0.1/aapt-output-com.politedroid_4.txt include tests/build-tools/27.0.1/aapt-output-com.politedroid_5.txt include tests/build-tools/27.0.1/aapt-output-com.politedroid_6.txt include tests/build-tools/27.0.1/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/27.0.1/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/27.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/27.0.1/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/27.0.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/27.0.1/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/27.0.1/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/27.0.1/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/27.0.1/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/27.0.1/aapt-output-souch.smsbypass_9.txt include tests/build-tools/27.0.2/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/27.0.2/aapt-output-com.politedroid_3.txt include tests/build-tools/27.0.2/aapt-output-com.politedroid_4.txt include tests/build-tools/27.0.2/aapt-output-com.politedroid_5.txt include tests/build-tools/27.0.2/aapt-output-com.politedroid_6.txt include tests/build-tools/27.0.2/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/27.0.2/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/27.0.2/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/27.0.2/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/27.0.2/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/27.0.2/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/27.0.2/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/27.0.2/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/27.0.2/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/27.0.2/aapt-output-souch.smsbypass_9.txt include tests/build-tools/27.0.3/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/27.0.3/aapt-output-com.politedroid_3.txt include tests/build-tools/27.0.3/aapt-output-com.politedroid_4.txt include tests/build-tools/27.0.3/aapt-output-com.politedroid_5.txt include tests/build-tools/27.0.3/aapt-output-com.politedroid_6.txt include tests/build-tools/27.0.3/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/27.0.3/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/27.0.3/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/27.0.3/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/27.0.3/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/27.0.3/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/27.0.3/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/27.0.3/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/27.0.3/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/27.0.3/aapt-output-souch.smsbypass_9.txt include tests/build-tools/28.0.0/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/28.0.0/aapt-output-com.politedroid_3.txt include tests/build-tools/28.0.0/aapt-output-com.politedroid_4.txt include tests/build-tools/28.0.0/aapt-output-com.politedroid_5.txt include tests/build-tools/28.0.0/aapt-output-com.politedroid_6.txt include tests/build-tools/28.0.0/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/28.0.0/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/28.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/28.0.0/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/28.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/28.0.0/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/28.0.0/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/28.0.0/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/28.0.0/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/28.0.0/aapt-output-souch.smsbypass_9.txt include tests/build-tools/28.0.1/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/28.0.1/aapt-output-com.politedroid_3.txt include tests/build-tools/28.0.1/aapt-output-com.politedroid_4.txt include tests/build-tools/28.0.1/aapt-output-com.politedroid_5.txt include tests/build-tools/28.0.1/aapt-output-com.politedroid_6.txt include tests/build-tools/28.0.1/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/28.0.1/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/28.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/28.0.1/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/28.0.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/28.0.1/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/28.0.1/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/28.0.1/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/28.0.1/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/28.0.1/aapt-output-souch.smsbypass_9.txt include tests/build-tools/28.0.2/aapt-output-com.politedroid_3.txt include tests/build-tools/28.0.2/aapt-output-com.politedroid_4.txt include tests/build-tools/28.0.2/aapt-output-com.politedroid_5.txt include tests/build-tools/28.0.2/aapt-output-com.politedroid_6.txt include tests/build-tools/28.0.2/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/28.0.2/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/28.0.2/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/28.0.2/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/28.0.2/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/28.0.2/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/28.0.2/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/28.0.2/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/28.0.2/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/28.0.2/aapt-output-souch.smsbypass_9.txt include tests/build-tools/28.0.3/aapt-output-com.example.test.helloworld_1.txt include tests/build-tools/28.0.3/aapt-output-com.politedroid_3.txt include tests/build-tools/28.0.3/aapt-output-com.politedroid_4.txt include tests/build-tools/28.0.3/aapt-output-com.politedroid_5.txt include tests/build-tools/28.0.3/aapt-output-com.politedroid_6.txt include tests/build-tools/28.0.3/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/28.0.3/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/28.0.3/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/28.0.3/aapt-output-no.min.target.sdk_987.txt include tests/build-tools/28.0.3/aapt-output-obb.main.oldversion_1444412523.txt include tests/build-tools/28.0.3/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/28.0.3/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/28.0.3/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/28.0.3/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/28.0.3/aapt-output-souch.smsbypass_9.txt include tests/build-tools/generate.sh include tests/check-fdroid-apk include tests/checkupdates.TestCase include tests/com.fake.IpaApp_1000000000001.ipa include tests/common.TestCase include tests/config.py include tests/config/antiFeatures.yml include tests/config/categories.yml include tests/config/de/antiFeatures.yml include tests/config/fa/antiFeatures.yml include tests/config/ic_antifeature_ads.xml include tests/config/ic_antifeature_disabledalgorithm.xml include tests/config/ic_antifeature_knownvuln.xml include tests/config/ic_antifeature_nonfreeadd.xml include tests/config/ic_antifeature_nonfreeassets.xml include tests/config/ic_antifeature_nonfreedep.xml include tests/config/ic_antifeature_nonfreenet.xml include tests/config/ic_antifeature_nosourcesince.xml include tests/config/ic_antifeature_nsfw.xml include tests/config/ic_antifeature_tracking.xml include tests/config/ic_antifeature_upstreamnonfree.xml include tests/config/ro/antiFeatures.yml include tests/config/zh-rCN/antiFeatures.yml include tests/corrupt-featureGraphic.png include tests/deploy.TestCase include tests/dummy-keystore.jks include tests/dump_internal_metadata_format.py include tests/exception.TestCase include tests/extra/manual-vmtools-test.py include tests/funding-usernames.yaml include tests/get_android_tools_versions/android-ndk-r10e/RELEASE.TXT include tests/get_android_tools_versions/android-sdk/ndk/11.2.2725575/source.properties include tests/get_android_tools_versions/android-sdk/ndk/17.2.4988734/source.properties include tests/get_android_tools_versions/android-sdk/ndk/21.3.6528147/source.properties include tests/get_android_tools_versions/android-sdk/ndk-bundle/package.xml include tests/get_android_tools_versions/android-sdk/ndk-bundle/source.properties include tests/get_android_tools_versions/android-sdk/patcher/v4/source.properties include tests/get_android_tools_versions/android-sdk/platforms/android-30/source.properties include tests/get_android_tools_versions/android-sdk/skiaparser/1/source.properties include tests/get_android_tools_versions/android-sdk/tools/source.properties include tests/gnupghome/pubring.gpg include tests/gnupghome/random_seed include tests/gnupghome/secring.gpg include tests/gnupghome/trustdb.gpg include tests/gradle-maven-blocks.yaml include tests/gradle-release-checksums.py include tests/import_subcommand.TestCase include tests/index.TestCase include tests/init.TestCase include tests/install.TestCase include tests/IsMD5Disabled.java include tests/issue-1128-min-sdk-30-poc.apk include tests/issue-1128-poc1.apk include tests/issue-1128-poc2.apk include tests/issue-1128-poc3a.apk include tests/issue-1128-poc3b.apk include tests/janus.apk include tests/keystore.jks include tests/key-tricks.py include tests/lint.TestCase include tests/main.TestCase include tests/metadata/apk/info.guardianproject.urzip.yaml include tests/metadata/apk/org.dyndns.fules.ck.yaml include tests/metadata/app.with.special.build.params.yml include tests/metadata/app.with.special.build.params/en-US/antifeatures/50_Ads.txt include tests/metadata/app.with.special.build.params/en-US/antifeatures/50_Tracking.txt include tests/metadata/app.with.special.build.params/en-US/antifeatures/Ads.txt include tests/metadata/app.with.special.build.params/en-US/antifeatures/NoSourceSince.txt include tests/metadata/app.with.special.build.params/zh-CN/antifeatures/49_Tracking.txt include tests/metadata/app.with.special.build.params/zh-CN/antifeatures/50_Ads.txt include tests/metadata/com.politedroid.yml include tests/metadata/dump/app.with.special.build.params.yaml include tests/metadata/dump/com.politedroid.yaml include tests/metadata/dump/org.adaway.yaml include tests/metadata/dump/org.smssecure.smssecure.yaml include tests/metadata/dump/org.videolan.vlc.yaml include tests/metadata/duplicate.permisssions.yml include tests/metadata/fake.ota.update.yml include tests/metadata/info.guardianproject.checkey/en-US/description.txt include tests/metadata/info.guardianproject.checkey/en-US/name.txt include tests/metadata/info.guardianproject.checkey/en-US/phoneScreenshots/checkey-phone.png include tests/metadata/info.guardianproject.checkey/en-US/phoneScreenshots/checkey.png include tests/metadata/info.guardianproject.checkey/en-US/summary.txt include tests/metadata/info.guardianproject.checkey/ja-JP/name.txt include tests/metadata/info.guardianproject.checkey.yml include tests/metadata/info.guardianproject.urzip/en-US/changelogs/100.txt include tests/metadata/info.guardianproject.urzip/en-US/changelogs/default.txt include tests/metadata/info.guardianproject.urzip/en-US/full_description.txt include tests/metadata/info.guardianproject.urzip/en-US/images/featureGraphic.png include tests/metadata/info.guardianproject.urzip/en-US/images/icon.png include tests/metadata/info.guardianproject.urzip/en-US/short_description.txt include tests/metadata/info.guardianproject.urzip/en-US/title.txt include tests/metadata/info.guardianproject.urzip/en-US/video.txt include tests/metadata/info.guardianproject.urzip.yml include tests/metadata/info.zwanenburg.caffeinetile.yml include tests/metadata/no.min.target.sdk.yml include tests/metadata/obb.main.oldversion.yml include tests/metadata/obb.mainpatch.current.yml include tests/metadata/obb.main.twoversions.yml include tests/metadata/org.adaway.yml include tests/metadata/org.fdroid.ci.test.app.yml include tests/metadata/org.fdroid.fdroid.yml include tests/metadata/org.smssecure.smssecure/signatures/134/28969C09.RSA include tests/metadata/org.smssecure.smssecure/signatures/134/28969C09.SF include tests/metadata/org.smssecure.smssecure/signatures/134/MANIFEST.MF include tests/metadata/org.smssecure.smssecure/signatures/135/28969C09.RSA include tests/metadata/org.smssecure.smssecure/signatures/135/28969C09.SF include tests/metadata/org.smssecure.smssecure/signatures/135/MANIFEST.MF include tests/metadata/org.smssecure.smssecure.yml include tests/metadata/org.videolan.vlc.yml include tests/metadata/raw.template.yml include tests/metadata-rewrite-yml/app.with.special.build.params.yml include tests/metadata-rewrite-yml/fake.ota.update.yml include tests/metadata-rewrite-yml/org.fdroid.fdroid.yml include tests/metadata/souch.smsbypass.yml include tests/metadata.TestCase include tests/minimal_targetsdk_30_unsigned.apk include tests/nightly.TestCase include tests/Norway_bouvet_europe_2.obf.zip include tests/no_targetsdk_minsdk1_unsigned.apk include tests/no_targetsdk_minsdk30_unsigned.apk include tests/openssl-version-check-test.py include tests/org.bitbucket.tickytacky.mirrormirror_1.apk include tests/org.bitbucket.tickytacky.mirrormirror_2.apk include tests/org.bitbucket.tickytacky.mirrormirror_3.apk include tests/org.bitbucket.tickytacky.mirrormirror_4.apk include tests/org.dyndns.fules.ck_20.apk include tests/org.sajeg.fallingblocks_3.apk include tests/publish.TestCase include tests/repo/com.example.test.helloworld_1.apk include tests/repo/com.politedroid_3.apk include tests/repo/com.politedroid_4.apk include tests/repo/com.politedroid_5.apk include tests/repo/com.politedroid_6.apk include tests/repo/duplicate.permisssions_9999999.apk include tests/repo/entry.json include tests/repo/fake.ota.update_1234.zip include tests/repo/index-v1.json include tests/repo/index-v2.json include tests/repo/index.xml include tests/repo/info.zwanenburg.caffeinetile_4.apk include tests/repo/main.1101613.obb.main.twoversions.obb include tests/repo/main.1101615.obb.main.twoversions.obb include tests/repo/main.1434483388.obb.main.oldversion.obb include tests/repo/main.1619.obb.mainpatch.current.obb include tests/repo/no.min.target.sdk_987.apk include tests/repo/obb.main.oldversion_1444412523.apk include tests/repo/obb.mainpatch.current_1619_another-release-key.apk include tests/repo/obb.mainpatch.current_1619.apk include tests/repo/obb.mainpatch.current/en-US/featureGraphic.png include tests/repo/obb.mainpatch.current/en-US/icon.png include tests/repo/obb.mainpatch.current/en-US/phoneScreenshots/screenshot-main.png include tests/repo/obb.mainpatch.current/en-US/sevenInchScreenshots/screenshot-tablet-main.png include tests/repo/obb.main.twoversions_1101613.apk include tests/repo/obb.main.twoversions_1101615.apk include tests/repo/obb.main.twoversions_1101617.apk include tests/repo/obb.main.twoversions_1101617_src.tar.gz include tests/repo/org.videolan.vlc/en-US/icon.png include tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot10.png include tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot12.png include tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot15.png include tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot18.png include tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot20.png include tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot22.png include tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot4.png include tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot7.png include tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot9.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot0.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot11.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot13.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot14.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot16.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot17.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot19.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot1.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot21.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot23.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot2.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot3.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot5.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot6.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot8.png include tests/repo/patch.1619.obb.mainpatch.current.obb include tests/repo/souch.smsbypass_9.apk include tests/repo/urzip-*.apk include tests/repo/v1.v2.sig_1020.apk include tests/rewritemeta.TestCase include tests/run-tests include tests/SANAPPSI.RSA include tests/SANAPPSI.SF include tests/scanner.TestCase include tests/signatures.TestCase include tests/signindex.TestCase include tests/signindex/guardianproject.jar include tests/signindex/guardianproject-v1.jar include tests/signindex/testy.jar include tests/signindex/unsigned.jar include tests/source-files/at.bitfire.davdroid/build.gradle include tests/source-files/cn.wildfirechat.chat/avenginekit/build.gradle include tests/source-files/cn.wildfirechat.chat/build.gradle include tests/source-files/cn.wildfirechat.chat/chat/build.gradle include tests/source-files/cn.wildfirechat.chat/client/build.gradle include tests/source-files/cn.wildfirechat.chat/client/src/main/AndroidManifest.xml include tests/source-files/cn.wildfirechat.chat/emojilibrary/build.gradle include tests/source-files/cn.wildfirechat.chat/gradle/build_libraries.gradle include tests/source-files/cn.wildfirechat.chat/imagepicker/build.gradle include tests/source-files/cn.wildfirechat.chat/mars-core-release/build.gradle include tests/source-files/cn.wildfirechat.chat/push/build.gradle include tests/source-files/cn.wildfirechat.chat/settings.gradle include tests/source-files/com.anpmech.launcher/app/build.gradle include tests/source-files/com.anpmech.launcher/app/src/main/AndroidManifest.xml include tests/source-files/com.anpmech.launcher/build.gradle include tests/source-files/com.anpmech.launcher/settings.gradle include tests/source-files/com.github.jameshnsears.quoteunquote/build.gradle include tests/source-files/com.integreight.onesheeld/build.gradle include tests/source-files/com.integreight.onesheeld/gradle/wrapper/gradle-wrapper.properties include tests/source-files/com.integreight.onesheeld/localeapi/build.gradle include tests/source-files/com.integreight.onesheeld/localeapi/src/main/AndroidManifest.xml include tests/source-files/com.integreight.onesheeld/oneSheeld/build.gradle include tests/source-files/com.integreight.onesheeld/oneSheeld/src/main/AndroidManifest.xml include tests/source-files/com.integreight.onesheeld/pagerIndicator/build.gradle include tests/source-files/com.integreight.onesheeld/pagerIndicator/src/main/AndroidManifest.xml include tests/source-files/com.integreight.onesheeld/pullToRefreshlibrary/build.gradle include tests/source-files/com.integreight.onesheeld/pullToRefreshlibrary/src/main/AndroidManifest.xml include tests/source-files/com.integreight.onesheeld/quickReturnHeader/build.gradle include tests/source-files/com.integreight.onesheeld/quickReturnHeader/src/main/AndroidManifest.xml include tests/source-files/com.integreight.onesheeld/settings.gradle include tests/source-files/com.jens.automation2/build.gradle include tests/source-files/com.jens.automation2/app/build.gradle include tests/source-files/com.kunzisoft.testcase/build.gradle include tests/source-files/com.nextcloud.client/build.gradle include tests/source-files/com.nextcloud.client.dev/src/generic/fastlane/metadata/android/en-US/full_description.txt include tests/source-files/com.nextcloud.client.dev/src/generic/fastlane/metadata/android/en-US/short_description.txt include tests/source-files/com.nextcloud.client.dev/src/generic/fastlane/metadata/android/en-US/title.txt include tests/source-files/com.nextcloud.client.dev/src/versionDev/fastlane/metadata/android/en-US/full_description.txt include tests/source-files/com.nextcloud.client.dev/src/versionDev/fastlane/metadata/android/en-US/short_description.txt include tests/source-files/com.nextcloud.client.dev/src/versionDev/fastlane/metadata/android/en-US/title.txt include tests/source-files/com.nextcloud.client/src/generic/fastlane/metadata/android/en-US/full_description.txt include tests/source-files/com.nextcloud.client/src/generic/fastlane/metadata/android/en-US/short_description.txt include tests/source-files/com.nextcloud.client/src/generic/fastlane/metadata/android/en-US/title.txt include tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata/android/en-US/full_description.txt include tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata/android/en-US/short_description.txt include tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata/android/en-US/title.txt include tests/source-files/com.seafile.seadroid2/app/build.gradle include tests/source-files/com.ubergeek42.WeechatAndroid/app/build.gradle.kts include tests/source-files/com.ubergeek42.WeechatAndroid/app/src/main/res/values/strings.xml include tests/source-files/de.varengold.activeTAN/build.gradle include tests/source-files/dev.patrickgold.florisboard/app/build.gradle.kts include tests/source-files/eu.siacs.conversations/build.gradle include tests/source-files/eu.siacs.conversations/metadata/en-US/name.txt include tests/source-files/fdroid/fdroidclient/AndroidManifest.xml include tests/source-files/fdroid/fdroidclient/build.gradle include tests/source-files/firebase-allowlisted/app/build.gradle include tests/source-files/firebase-allowlisted/build.gradle include tests/source-files/firebase-suspect/app/build.gradle include tests/source-files/firebase-suspect/build.gradle include tests/source-files/info.guardianproject.ripple/build.gradle include tests/source-files/open-keychain/open-keychain/build.gradle include tests/source-files/open-keychain/open-keychain/OpenKeychain/build.gradle include tests/source-files/org.mozilla.rocket/app/build.gradle include tests/source-files/org.noise_planet.noisecapture/app/build.gradle include tests/source-files/org.noise_planet.noisecapture/settings.gradle include tests/source-files/org.noise_planet.noisecapture/sosfilter/build.gradle include tests/source-files/org.tasks/app/build.gradle.kts include tests/source-files/org.tasks/build.gradle include tests/source-files/org.tasks/build.gradle.kts include tests/source-files/org.tasks/buildSrc/build.gradle.kts include tests/source-files/org.tasks/settings.gradle.kts include tests/source-files/osmandapp/osmand/build.gradle include tests/source-files/osmandapp/osmand/gradle/wrapper/gradle-wrapper.properties include tests/source-files/realm/react-native/android/build.gradle include tests/source-files/se.manyver/android/app/build.gradle include tests/source-files/se.manyver/android/build.gradle include tests/source-files/se.manyver/android/gradle.properties include tests/source-files/se.manyver/android/gradle/wrapper/gradle-wrapper.properties include tests/source-files/se.manyver/android/settings.gradle include tests/source-files/se.manyver/app.json include tests/source-files/se.manyver/index.android.js include tests/source-files/se.manyver/package.json include tests/source-files/se.manyver/react-native.config.js include tests/source-files/ut.ewh.audiometrytest/app/build.gradle include tests/source-files/ut.ewh.audiometrytest/app/src/main/AndroidManifest.xml include tests/source-files/ut.ewh.audiometrytest/build.gradle include tests/source-files/ut.ewh.audiometrytest/settings.gradle include tests/source-files/yuriykulikov/AlarmClock/gradle/wrapper/gradle-wrapper.properties include tests/source-files/Zillode/syncthing-silk/build.gradle include tests/SpeedoMeterApp.main_1.apk include tests/stats/known_apks.txt include tests/testcommon.py include tests/test-gradlew-fdroid include tests/triple-t-2/build/org.piwigo.android/app/build.gradle include tests/triple-t-2/build/org.piwigo.android/app/.gitignore include tests/triple-t-2/build/org.piwigo.android/app/src/debug/res/values/constants.xml include tests/triple-t-2/build/org.piwigo.android/app/src/debug/res/values/strings.xml include tests/triple-t-2/build/org.piwigo.android/app/src/main/java/org/piwigo/PiwigoApplication.java include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/contact-email.txt include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/contact-website.txt include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/default-language.txt include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/de-DE/full-description.txt include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/de-DE/short-description.txt include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/de-DE/title.txt include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/full-description.txt include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphics/feature-graphic/piwigo-full.png include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphics/icon/piwigo-icon.png include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphics/phone-screenshots/01_Login.jpg include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphics/phone-screenshots/02_Albums.jpg include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphics/phone-screenshots/03_Photos.jpg include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphics/phone-screenshots/04_Albums_horizontal.jpg include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphics/phone-screenshots/05_Menu.jpg include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphics/tablet-screenshots/01_Login.png include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/short-description.txt include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/title.txt include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/fr-FR/full-description.txt include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/fr-FR/short-description.txt include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/fr-FR/title.txt include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/kn-IN/full-description.txt include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/kn-IN/short-description.txt include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/kn-IN/title.txt include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/release-notes/de-DE/default.txt include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/release-notes/en-US/default.txt include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/release-notes/fr-FR/default.txt include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/release-notes/kn-IN/default.txt include tests/triple-t-2/build/org.piwigo.android/build.gradle include tests/triple-t-2/build/org.piwigo.android/settings.gradle include tests/triple-t-2/metadata/org.piwigo.android.yml include tests/triple-t-anysoftkeyboard/build/com.anysoftkeyboard.languagepack.dutch/addons/languages/dutch/apk/src/main/play/listings/en-US/title.txt include tests/triple-t-anysoftkeyboard/build/com.anysoftkeyboard.languagepack.dutch/ime/app/src/main/play/listings/en-US/title.txt include tests/triple-t-anysoftkeyboard/build/com.anysoftkeyboard.languagepack.dutch/settings.gradle include tests/triple-t-anysoftkeyboard/build/com.menny.android.anysoftkeyboard/addons/languages/dutch/apk/src/main/play/listings/en-US/title.txt include tests/triple-t-anysoftkeyboard/build/com.menny.android.anysoftkeyboard/ime/app/src/main/play/listings/en-US/title.txt include tests/triple-t-anysoftkeyboard/build/com.menny.android.anysoftkeyboard/settings.gradle include tests/triple-t-anysoftkeyboard/metadata/com.anysoftkeyboard.languagepack.dutch.yml include tests/triple-t-anysoftkeyboard/metadata/com.menny.android.anysoftkeyboard.yml include tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/contact-website.txt include tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/full-description.txt include tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/short-description.txt include tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/title.txt include tests/triple-t-flutter/metadata/fr.emersion.goguma.yml include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/settings.gradle include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/verifier/src/main/play/listings/en-US/title.txt include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/wallet/src/main/play/listings/en-US/title.txt include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/settings.gradle include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/verifier/src/main/play/listings/en-US/title.txt include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/wallet/src/main/play/listings/en-US/title.txt include tests/triple-t-multiple/metadata/ch.admin.bag.covidcertificate.verifier.yml include tests/triple-t-multiple/metadata/ch.admin.bag.covidcertificate.wallet.yml include tests/update.TestCase include tests/urzip.apk include tests/urzip-badcert.apk include tests/urzip-badsig.apk include tests/urzip-release.apk include tests/urzip-release-unsigned.apk include tests/v2.only.sig_2.apk include tests/valid-package-names/random-package-names include tests/valid-package-names/RandomPackageNames.java include tests/valid-package-names/test.py include tests/vcs.TestCase ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/PKG-INFO0000644000175000017500000001233614620351546014112 0ustar00hanshansMetadata-Version: 2.1 Name: fdroidserver Version: 2.3a1 Summary: F-Droid Server Tools Home-page: https://f-droid.org Author: The F-Droid Project Author-email: team@f-droid.org License: AGPL-3.0 Classifier: Development Status :: 4 - Beta Classifier: Intended Audience :: Developers Classifier: Intended Audience :: Information Technology Classifier: Intended Audience :: System Administrators Classifier: Intended Audience :: Telecommunications Industry Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+) Classifier: Operating System :: POSIX Classifier: Operating System :: MacOS :: MacOS X Classifier: Operating System :: Unix Classifier: Topic :: Utilities Requires-Python: >=3.9 Description-Content-Type: text/markdown Provides-Extra: docs Provides-Extra: optional Provides-Extra: test License-File: LICENSE

# F-Droid Server ### Tools for maintaining an F-Droid repository system.
--- ## What is F-Droid Server? _fdroidserver_ is a suite of tools to publish and work with collections of Android apps (APK files) and other kinds of packages. It is used to maintain the [f-droid.org application repository](https://f-droid.org/packages). These same tools can be used to create additional or alternative repositories for publishing, or to assist in creating, testing and submitting metadata to the f-droid.org repository, also known as [_fdroiddata_](https://gitlab.com/fdroid/fdroiddata). For documentation, please see . In the beginning, _fdroidserver_ was the complete server-side setup that ran f-droid.org. Since then, the website and other parts have been split out into their own projects. The name for this suite of tooling has stayed _fdroidserver_ even though it no longer contains any proper server component. ## Installing There are many ways to install _fdroidserver_, including using a range of package managers. All of the options are documented on the website: https://f-droid.org/docs/Installing_the_Server_and_Repo_Tools ## Tests To run the full test suite: tests/run-tests To run the tests for individual Python modules, see the _.TestCase_ files, e.g.: tests/metadata.TestCase It is also possible to run individual tests: tests/metadata.TestCase MetadataTest.test_rewrite_yaml_special_build_params There is a growing test suite that has good coverage on a number of key parts of this code base. It does not yet cover all the code, and there are some parts where the technical debt makes it difficult to write unit tests. New tests should be standard Python _unittest_ test cases. Whenever possible, the old tests written in _bash_ in _tests/run-tests_ should be ported to Python. This test suite has built over time a bit haphazardly, so it is not as clean, organized, or complete as it could be. We welcome contributions. The goal is to move towards standard Python testing patterns and to expand the unit test coverage. Before rearchitecting any parts of it, be sure to [contact us](https://f-droid.org/about) to discuss the changes beforehand. ### Additional tests for different linux distributions These tests are also run on various configurations through GitLab CI. This is only enabled for `master@fdroid/fdroidserver` because it takes longer to complete than the regular CI tests. Most of the time you won't need to worry about them, but sometimes it might make sense to also run them for your merge request. In that case you need to remove [these lines from .gitlab-ci.yml](https://gitlab.com/fdroid/fdroidserver/-/blob/0124b9dde99f9cab19c034cbc7d8cc6005a99b48/.gitlab-ci.yml#L90-91) and push this to a new branch of your fork. Alternatively [run them locally](https://docs.gitlab.com/runner/commands/README.html#gitlab-runner-exec) like this: `gitlab-runner exec docker ubuntu_lts` ### Buildserver The tests for the whole build server setup are entirely separate because they require at least 200 GB of disk space, and 8 GB of RAM. These test scripts are in the root of the project, all starting with _jenkins-_ since they used to be run on https://jenkins.debian.net. ## Documentation The API documentation based on the docstrings gets automatically published [here](https://fdroid.gitlab.io/fdroidserver) on every commit on the `master` branch. It can be built locally via ```bash pip install -e .[docs] cd docs sphinx-apidoc -o ./source ../fdroidserver -M -e sphinx-autogen -o generated source/*.rst make html ``` To additionally lint the code call ```bash pydocstyle fdroidserver --count ``` When writing docstrings you should follow the [numpy style guide](https://numpydoc.readthedocs.io/en/latest/format.html). ## Translation Everything can be translated. See [Translation and Localization](https://f-droid.org/docs/Translation_and_Localization) for more info.
[![](https://hosted.weblate.org/widgets/f-droid/-/287x66-white.png)](https://hosted.weblate.org/engage/f-droid)
View translation status for all languages. [![](https://hosted.weblate.org/widgets/f-droid/-/fdroidserver/multi-auto.svg)](https://hosted.weblate.org/engage/f-droid/?utm_source=widget)
././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/README.md0000644000175000017500000001060614620351225014264 0ustar00hanshans

# F-Droid Server ### Tools for maintaining an F-Droid repository system.
--- ## What is F-Droid Server? _fdroidserver_ is a suite of tools to publish and work with collections of Android apps (APK files) and other kinds of packages. It is used to maintain the [f-droid.org application repository](https://f-droid.org/packages). These same tools can be used to create additional or alternative repositories for publishing, or to assist in creating, testing and submitting metadata to the f-droid.org repository, also known as [_fdroiddata_](https://gitlab.com/fdroid/fdroiddata). For documentation, please see . In the beginning, _fdroidserver_ was the complete server-side setup that ran f-droid.org. Since then, the website and other parts have been split out into their own projects. The name for this suite of tooling has stayed _fdroidserver_ even though it no longer contains any proper server component. ## Installing There are many ways to install _fdroidserver_, including using a range of package managers. All of the options are documented on the website: https://f-droid.org/docs/Installing_the_Server_and_Repo_Tools ## Tests To run the full test suite: tests/run-tests To run the tests for individual Python modules, see the _.TestCase_ files, e.g.: tests/metadata.TestCase It is also possible to run individual tests: tests/metadata.TestCase MetadataTest.test_rewrite_yaml_special_build_params There is a growing test suite that has good coverage on a number of key parts of this code base. It does not yet cover all the code, and there are some parts where the technical debt makes it difficult to write unit tests. New tests should be standard Python _unittest_ test cases. Whenever possible, the old tests written in _bash_ in _tests/run-tests_ should be ported to Python. This test suite has built over time a bit haphazardly, so it is not as clean, organized, or complete as it could be. We welcome contributions. The goal is to move towards standard Python testing patterns and to expand the unit test coverage. Before rearchitecting any parts of it, be sure to [contact us](https://f-droid.org/about) to discuss the changes beforehand. ### Additional tests for different linux distributions These tests are also run on various configurations through GitLab CI. This is only enabled for `master@fdroid/fdroidserver` because it takes longer to complete than the regular CI tests. Most of the time you won't need to worry about them, but sometimes it might make sense to also run them for your merge request. In that case you need to remove [these lines from .gitlab-ci.yml](https://gitlab.com/fdroid/fdroidserver/-/blob/0124b9dde99f9cab19c034cbc7d8cc6005a99b48/.gitlab-ci.yml#L90-91) and push this to a new branch of your fork. Alternatively [run them locally](https://docs.gitlab.com/runner/commands/README.html#gitlab-runner-exec) like this: `gitlab-runner exec docker ubuntu_lts` ### Buildserver The tests for the whole build server setup are entirely separate because they require at least 200 GB of disk space, and 8 GB of RAM. These test scripts are in the root of the project, all starting with _jenkins-_ since they used to be run on https://jenkins.debian.net. ## Documentation The API documentation based on the docstrings gets automatically published [here](https://fdroid.gitlab.io/fdroidserver) on every commit on the `master` branch. It can be built locally via ```bash pip install -e .[docs] cd docs sphinx-apidoc -o ./source ../fdroidserver -M -e sphinx-autogen -o generated source/*.rst make html ``` To additionally lint the code call ```bash pydocstyle fdroidserver --count ``` When writing docstrings you should follow the [numpy style guide](https://numpydoc.readthedocs.io/en/latest/format.html). ## Translation Everything can be translated. See [Translation and Localization](https://f-droid.org/docs/Translation_and_Localization) for more info.
[![](https://hosted.weblate.org/widgets/f-droid/-/287x66-white.png)](https://hosted.weblate.org/engage/f-droid)
View translation status for all languages. [![](https://hosted.weblate.org/widgets/f-droid/-/fdroidserver/multi-auto.svg)](https://hosted.weblate.org/engage/f-droid/?utm_source=widget)
././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8843818 fdroidserver-2.3a1/buildserver/0000755000175000017500000000000014620351546015336 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/buildserver/Vagrantfile0000644000175000017500000000753614620351225017530 0ustar00hanshansrequire 'yaml' require 'pathname' require 'fileutils' configfile = { 'boot_timeout' => 600, 'cachedir' => File.join(ENV['HOME'], '.cache', 'fdroidserver'), 'cpus' => 1, 'debian_mirror' => 'https://deb.debian.org/debian/', 'hwvirtex' => 'on', 'memory' => 2048, 'vm_provider' => 'virtualbox', } srvpath = Pathname.new(File.dirname(__FILE__)).realpath configpath = File.join(srvpath, "/Vagrantfile.yaml") if File.exists? configpath c = YAML.load_file(configpath) if c and not c.empty? c.each do |k,v| configfile[k] = v end end else puts "Copying example file to #{configpath}" FileUtils.cp('../examples/Vagrantfile.yaml', configpath) end Vagrant.configure("2") do |config| if Vagrant.has_plugin?("vagrant-cachier") config.cache.scope = :box config.cache.auto_detect = false config.cache.enable :apt config.cache.enable :chef end config.vm.box = "debian/bookworm64" if not configfile.has_key? "vm_provider" or configfile["vm_provider"] == "virtualbox" # default to VirtualBox if not set config.vm.provider "virtualbox" do |v| v.customize ["modifyvm", :id, "--memory", configfile['memory']] v.customize ["modifyvm", :id, "--cpus", configfile['cpus']] v.customize ["modifyvm", :id, "--hwvirtex", configfile['hwvirtex']] end synced_folder_type = 'virtualbox' elsif configfile["vm_provider"] == "libvirt" # use KVM/QEMU if this is running in KVM/QEMU config.vm.provider :libvirt do |libvirt| libvirt.driver = configfile["hwvirtex"] == "on" ? "kvm" : "qemu" libvirt.host = "localhost" libvirt.uri = "qemu:///system" libvirt.cpus = configfile["cpus"] libvirt.memory = configfile["memory"] # Debian Vagrant image is only 20G, so allocate more libvirt.machine_virtual_size = 1024 if configfile.has_key? "libvirt_disk_bus" libvirt.disk_bus = configfile["libvirt_disk_bus"] end if configfile.has_key? "libvirt_nic_model_type" libvirt.nic_model_type = configfile["libvirt_nic_model_type"] end end if configfile.has_key? "synced_folder_type" synced_folder_type = configfile["synced_folder_type"] else synced_folder_type = '9p' end config.vm.synced_folder './', '/vagrant', type: synced_folder_type, SharedFoldersEnableSymlinksCreate: false else abort("No supported VM Provider found, set vm_provider in Vagrantfile.yaml!") end config.vm.boot_timeout = configfile['boot_timeout'] if configfile.has_key? "aptproxy" config.vm.provision :shell, path: "provision-apt-proxy", args: [configfile["aptproxy"]] end config.vm.synced_folder configfile["cachedir"], '/vagrant/cache', create: true, type: synced_folder_type # Make sure dir exists to mount to, since buildserver/ is # automatically mounted as /vagrant in the guest VM. This is more # necessary with 9p synced folders Dir.mkdir('cache') unless File.exists?('cache') # Root partition needs to be resized to the new allocated space config.vm.provision "shell", inline: <<-SHELL growpart -v -u auto /dev/vda 1 resize2fs /dev/vda1 SHELL config.vm.provision "shell", name: "setup-env-vars", path: "setup-env-vars", args: ["/opt/android-sdk"] config.vm.provision "shell", name: "apt-get-install", path: "provision-apt-get-install", args: [configfile['debian_mirror']] config.vm.provision "shell", name: "android-sdk", path: "provision-android-sdk" config.vm.provision "shell", name: "android-ndk", path: "provision-android-ndk", args: ["/opt/android-sdk/ndk"] config.vm.provision "shell", name: "gradle", path: "provision-gradle" config.vm.provision "shell", name: "disable-analytics", path: "provision-disable-analytics" config.vm.provision "shell", name: "buildserverid", path: "provision-buildserverid", args: [`git rev-parse HEAD`] end ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/buildserver/config.buildserver.yml0000644000175000017500000000010414620351225021640 0ustar00hanshanssdk_path: /opt/android-sdk gradle_version_dir: /opt/gradle/versions ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/buildserver/provision-android-ndk0000644000175000017500000000130714620351225021474 0ustar00hanshans#!/bin/bash # # $1 is the root dir to install the NDKs into # $2 and after are the NDK releases to install echo $0 set -e set -x NDK_BASE=$1 shift test -e $NDK_BASE || mkdir -p $NDK_BASE cd $NDK_BASE for version in $@; do if [ ! -e ${NDK_BASE}/${version} ]; then unzip /vagrant/cache/android-ndk-${version}-linux*.zip > /dev/null mv android-ndk-${version} \ `sed -En 's,^Pkg.Revision *= *(.+),\1,p' android-ndk-${version}/source.properties` fi done # allow gradle/etc to install missing NDK versions chgrp vagrant $NDK_BASE chmod g+w $NDK_BASE # ensure all users can read and execute the NDK chmod -R a+rX $NDK_BASE/ find $NDK_BASE/ -type f -executable -exec chmod a+x -- {} + ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/buildserver/provision-android-sdk0000644000175000017500000001070314620351225021501 0ustar00hanshans#!/bin/bash echo $0 set -e set -x if [ -z $ANDROID_HOME ]; then echo "ANDROID_HOME env var must be set!" exit 1 fi # disable the repositories of proprietary stuff disabled=" @version@=1 @disabled@https\://dl.google.com/android/repository/extras/intel/addon.xml=disabled @disabled@https\://dl.google.com/android/repository/glass/addon.xml=disabled @disabled@https\://dl.google.com/android/repository/sys-img/android/sys-img.xml=disabled @disabled@https\://dl.google.com/android/repository/sys-img/android-tv/sys-img.xml=disabled @disabled@https\://dl.google.com/android/repository/sys-img/android-wear/sys-img.xml=disabled @disabled@https\://dl.google.com/android/repository/sys-img/google_apis/sys-img.xml=disabled " test -d ${HOME}/.android || mkdir ${HOME}/.android # there are currently zero user repos echo 'count=0' > ${HOME}/.android/repositories.cfg for line in $disabled; do echo $line >> ${HOME}/.android/sites-settings.cfg done # Include old makebuildserver cache that is a Vagrant synced_folder # for sdkmanager to use. cachedir=$HOME/.cache/sdkmanager mkdir -p $cachedir pushd $cachedir for f in /vagrant/cache/*.zip; do test -e $f && ln -s $f done popd # TODO do not preinstall 'tools' or 'platform-tools' at all, app builds don't need them packages=" tools;25.2.5 platform-tools build-tools;19.1.0 build-tools;20.0.0 build-tools;21.1.2 build-tools;22.0.1 build-tools;23.0.1 build-tools;23.0.2 build-tools;23.0.3 build-tools;24.0.0 build-tools;24.0.1 build-tools;24.0.2 build-tools;24.0.3 build-tools;25.0.0 build-tools;25.0.1 build-tools;25.0.2 build-tools;25.0.3 build-tools;26.0.0 build-tools;26.0.1 build-tools;26.0.2 build-tools;26.0.3 build-tools;27.0.0 build-tools;27.0.1 build-tools;27.0.2 build-tools;27.0.3 build-tools;28.0.0 build-tools;28.0.1 build-tools;28.0.2 build-tools;28.0.3 build-tools;29.0.2 build-tools;29.0.3 build-tools;30.0.0 build-tools;30.0.1 build-tools;30.0.2 build-tools;30.0.3 build-tools;31.0.0 build-tools;32.0.0 build-tools;33.0.0 platforms;android-10 platforms;android-11 platforms;android-12 platforms;android-13 platforms;android-14 platforms;android-15 platforms;android-16 platforms;android-17 platforms;android-18 platforms;android-19 platforms;android-20 platforms;android-21 platforms;android-22 platforms;android-23 platforms;android-24 platforms;android-25 platforms;android-26 platforms;android-27 platforms;android-28 platforms;android-29 platforms;android-30 platforms;android-31 platforms;android-32 platforms;android-33 " if [ $# -gt 0 ]; then echo found args packages=$@ fi # temporary test of whether this script ran. It will change once # 'tools' is no longer installed by default. if [ ! -x $ANDROID_HOME/tools/bin/sdkmanager ]; then mkdir -p ${ANDROID_HOME}/ sdkmanager $packages fi # this hacked cache should not end up in the Vagrant box or Docker image rm -rf $cachedir mkdir -p $ANDROID_HOME/licenses/ cat << EOF > $ANDROID_HOME/licenses/android-sdk-license 8933bad161af4178b1185d1a37fbf41ea5269c55 d56f5187479451eabf01fb78af6dfcb131a6481e 24333f8a63b6825ea9c5514f83c2829b004d1fee EOF cat < $ANDROID_HOME/licenses/android-sdk-preview-license 84831b9409646a918e30573bab4c9c91346d8abd EOF cat < $ANDROID_HOME/licenses/android-sdk-preview-license-old 79120722343a6f314e0719f863036c702b0e6b2a 84831b9409646a918e30573bab4c9c91346d8abd EOF cat < $ANDROID_HOME/licenses/intel-android-extra-license d975f751698a77b662f1254ddbeed3901e976f5a EOF chmod a+X $(dirname $ANDROID_HOME/) chmod -R a+rX $ANDROID_HOME/ chgrp vagrant $ANDROID_HOME chmod g+w $ANDROID_HOME find $ANDROID_HOME/ -type f -executable -print0 | xargs -0 chmod a+x # allow gradle to install newer build-tools and platforms mkdir -p $ANDROID_HOME/{build-tools,platforms} chgrp vagrant $ANDROID_HOME/{build-tools,platforms} chmod g+w $ANDROID_HOME/{build-tools,platforms} # allow gradle/sdkmanager to install into the new m2repository test -d $ANDROID_HOME/extras/m2repository || mkdir -p $ANDROID_HOME/extras/m2repository find $ANDROID_HOME/extras/m2repository -type d | xargs chgrp vagrant find $ANDROID_HOME/extras/m2repository -type d | xargs chmod g+w # allow gradle/sdkmanager to install extras;android;m2repository test -d $ANDROID_HOME/extras/android || mkdir -p $ANDROID_HOME/extras/android find $ANDROID_HOME/extras/android -type d | xargs chgrp vagrant find $ANDROID_HOME/extras/android -type d | xargs chmod g+w ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/buildserver/provision-apt-get-install0000644000175000017500000000550714620351225022315 0ustar00hanshans#!/bin/bash echo $0 set -e set -x debian_mirror=$1 export DEBIAN_FRONTEND=noninteractive printf 'APT::Install-Recommends "0";\nAPT::Install-Suggests "0";\n' \ > /etc/apt/apt.conf.d/99no-install-recommends printf 'Acquire::Retries "20";\n' \ > /etc/apt/apt.conf.d/99acquire-retries cat < /etc/apt/apt.conf.d/99no-auto-updates APT::Periodic::Enable "0"; APT::Periodic::Update-Package-Lists "0"; APT::Periodic::Unattended-Upgrade "0"; EOF printf 'APT::Get::Assume-Yes "true";\n' \ > /etc/apt/apt.conf.d/99assumeyes cat < /etc/apt/apt.conf.d/99quiet Dpkg::Use-Pty "0"; quiet "1"; EOF cat < /etc/apt/apt.conf.d/99confdef Dpkg::Options { "--force-confdef"; }; EOF echo "man-db man-db/auto-update boolean false" | debconf-set-selections if echo $debian_mirror | grep '^https' 2>&1 > /dev/null; then apt-get update || apt-get update apt-get install ca-certificates fi cat << EOF > /etc/apt/sources.list deb ${debian_mirror} bookworm main deb https://security.debian.org/debian-security bookworm-security main deb ${debian_mirror} bookworm-updates main EOF echo "deb ${debian_mirror} bookworm-backports main" > /etc/apt/sources.list.d/backports.list apt-get update || apt-get update # purge things that might come from the base box, but we don't want # https://salsa.debian.org/cloud-team/debian-vagrant-images/-/tree/master/config_space/package_config # cat config_space/package_config/* | sort -u | grep -v '[A-Z#]' purge=" apt-listchanges apt-utils bash-completion bind9-* bsdextrautils bzip2 chrony cloud-utils cron cron-daemon-common dbus debconf-i18n debian-faq dmidecode doc-debian fdisk file groff-base inetutils-telnet krb5-locales less locales logrotate lsof manpages nano ncurses-term netcat-traditional pciutils reportbug rsyslog tasksel traceroute unattended-upgrades usrmerge vim-* wamerican wget whiptail xz-utils " # clean up files packages to be purged, then purge the packages rm -rf /var/run/dbus /var/log/unattended-upgrades apt-get purge $purge apt-get upgrade --download-only apt-get upgrade # again after upgrade in case of keyring changes apt-get update || apt-get update packages=" apksigner default-jdk-headless default-jre-headless curl dexdump fdroidserver git-svn gnupg mercurial patch python3-packaging rsync sdkmanager sudo unzip " apt-get install $packages --download-only apt-get install $packages # fdroidserver comes from git, it was installed just for dependencies apt-mark manual `apt-cache depends fdroidserver | sed -nE 's,^[| ]*Depends: ([a-z0-9 -]+),\1,p'` apt-get purge fdroidserver # clean up things that will become outdated anyway apt-get autoremove --purge apt-get clean rm -rf /var/lib/apt/lists/* highestjava=`update-java-alternatives --list | sort -n | tail -1 | cut -d ' ' -f 1` update-java-alternatives --set $highestjava ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/buildserver/provision-apt-proxy0000644000175000017500000000045214620351225021245 0ustar00hanshans#!/bin/bash echo $0 set -e rm -f /etc/apt/apt.conf.d/02proxy echo "Acquire::ftp::Proxy \"$1\";" >> /etc/apt/apt.conf.d/02proxy echo "Acquire::http::Proxy \"$1\";" >> /etc/apt/apt.conf.d/02proxy echo "Acquire::https::Proxy \"$1\";" >> /etc/apt/apt.conf.d/02proxy apt-get update || apt-get update ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/buildserver/provision-gradle0000644000175000017500000000266714620351225020552 0ustar00hanshans#!/bin/bash set -ex # version compare magic vergte() { printf '%s\n%s' "$1" "$2" | sort -C -V -r } test -e /opt/gradle/versions || mkdir -p /opt/gradle/versions cd /opt/gradle/versions glob="/vagrant/cache/gradle-*.zip" if compgen -G $glob; then # test if glob matches anything f=$(ls -1 --sort=version --group-directories-first $glob | tail -1) ver=`echo $f | sed 's,.*gradle-\([0-9][0-9.]*\).*\.zip,\1,'` # only use versions greater or equal 2.2.1 if vergte $ver 2.2.1 && [ ! -d /opt/gradle/versions/${ver} ]; then unzip -qq $f mv gradle-${ver} /opt/gradle/versions/${ver} fi fi chmod -R a+rX /opt/gradle test -e /opt/gradle/bin || mkdir -p /opt/gradle/bin ln -fs /home/vagrant/fdroidserver/gradlew-fdroid /opt/gradle/bin/gradle chown -h vagrant.vagrant /opt/gradle/bin/gradle chown vagrant.vagrant /opt/gradle/versions chmod 0755 /opt/gradle/versions GRADLE_HOME=/home/vagrant/.gradle test -d $GRADLE_HOME/ || mkdir $GRADLE_HOME/ cat < $GRADLE_HOME/gradle.properties # builds are not reused, so the daemon is a waste of time org.gradle.daemon=false # set network timeouts to 10 minutes # https://github.com/gradle/gradle/pull/3371/files systemProp.http.connectionTimeout=600000 systemProp.http.socketTimeout=600000 systemProp.org.gradle.internal.http.connectionTimeout=600000 systemProp.org.gradle.internal.http.socketTimeout=600000 EOF chown -R vagrant.vagrant $GRADLE_HOME/ chmod -R a+rX $GRADLE_HOME/ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/buildserver/setup-env-vars0000644000175000017500000000132314620351225020151 0ustar00hanshans#!/bin/sh # # sets up the environment vars needed by the build process set -e set -x bsenv=/etc/profile.d/bsenv.sh echo "# generated on "`date` > $bsenv echo export ANDROID_HOME=$1 >> $bsenv echo 'export PATH=$PATH:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools:/opt/gradle/bin' >> $bsenv echo "export DEBIAN_FRONTEND=noninteractive" >> $bsenv echo 'export home_vagrant=/home/vagrant' >> $bsenv echo 'export fdroidserver=$home_vagrant/fdroidserver' >> $bsenv echo 'export LC_ALL=C.UTF-8' >> $bsenv chmod 0644 $bsenv # make sure that SSH never hangs at a password or key prompt mkdir -p /etc/ssh/ssh_config.d/ cat << EOF >> /etc/ssh/ssh_config.d/fdroid Host * StrictHostKeyChecking yes BatchMode yes EOF ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8843818 fdroidserver-2.3a1/completion/0000755000175000017500000000000014620351546015161 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/completion/bash-completion0000644000175000017500000001411514620351225020164 0ustar00hanshans# fdroid(1) completion -*- shell-script -*- # # bash-completion - part of the FDroid server tools # # Copyright (C) 2013-2017 Hans-Christoph Steiner # Copyright (C) 2013, 2014 Daniel Martí # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . __fdroid_init() { COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" (( $# >= 1 )) && __complete_${1} } __get_appid() { files=( metadata/*.yml ) files=( ${files[@]#metadata/} ) files=${files[@]%.yml} echo "$files" } __package() { files="$(__get_appid)" COMPREPLY=( $( compgen -W "$files" -- $cur ) ) } __apk_package() { files=( ${1}/*.apk ) [ -f "${files[0]}" ] || return files=( ${files[@]#*/} ) files=${files[@]%_*} COMPREPLY=( $( compgen -W "$files" -- $cur ) ) } __apk_vercode() { local p=${cur:0:-1} files=( ${1}/${p}_*.apk ) [ -f "${files[0]}" ] || return files=( ${files[@]#*_} ) files=${files[@]%.apk} COMPREPLY=( $( compgen -P "${p}:" -W "$files" -- $cur ) ) } __vercode() { if [ $prev = ":" ]; then appid="${COMP_WORDS[COMP_CWORD-2]}" elif [ $cur = ":" ]; then appid=$prev cur="" fi versionCodes=`sed -En 's,^ +versionCode: +([0-9]+) *$,\1,p' metadata/${appid}.yml` COMPREPLY=( $( compgen -W "$versionCodes" -- $cur ) ) } __complete_options() { case "${cur}" in --*) COMPREPLY=( $( compgen -W "--help --version ${lopts}" -- $cur ) ) return 0;; *) COMPREPLY=( $( compgen -W "-h ${opts} --help --version ${lopts}" -- $cur ) ) return 0;; esac } __complete_build() { opts="-v -q -l -s -t -f -a" lopts="--verbose --quiet --latest --stop --test --server --reset-server --skip-scan --scan-binary --no-tarball --force --all --no-refresh" case "${prev}" in :) __vercode return 0;; esac case "${cur}" in -*) __complete_options return 0;; :) __vercode return 0;; *) __package return 0;; esac } __complete_gpgsign() { opts="-v -q" lopts="--verbose --quiet" __complete_options } __complete_install() { opts="-v -q" lopts="--verbose --quiet --all" case "${cur}" in -*) __complete_options return 0;; *:) __apk_vercode repo return 0;; *) __apk_package repo return 0;; esac } __complete_update() { opts="-c -v -q -i -I -e" lopts="--create-metadata --verbose --quiet --icons --pretty --clean --delete-unknown --nosign --rename-apks --use-date-from-apk" case "${prev}" in -e|--editor) _filedir return 0;; esac __complete_options } __complete_publish() { opts="-v -q" lopts="--verbose --quiet" case "${cur}" in -*) __complete_options return 0;; *:) __apk_vercode unsigned return 0;; *) __apk_package unsigned return 0;; esac } __complete_checkupdates() { opts="-v -q" lopts="--verbose --quiet --auto --autoonly --commit --allow-dirty" case "${cur}" in -*) __complete_options return 0;; *) __package return 0;; esac } __complete_import() { opts="-c -h -l -q -s -u -v -W" lopts="--categories --license --quiet --rev --subdir --url" case "${prev}" in -c|-l|-s|-u|--categories|--license|--quiet|--rev|--subdir|--url) return 0;; -W) COMPREPLY=( $( compgen -W "error warn ignore" -- $cur ) ) return 0;; esac __complete_options } __complete_readmeta() { opts="-v -q" lopts="--verbose --quiet" __complete_options } __complete_rewritemeta() { opts="-v -q -l" lopts="--verbose --quiet --list" case "${cur}" in -*) __complete_options return 0;; *) __package return 0;; esac } __complete_lint() { opts="-v -q -f" lopts="--verbose --quiet --force-yamllint --format" case "${cur}" in -*) __complete_options return 0;; *) __package return 0;; esac } __complete_scanner() { opts="-v -q" lopts="--verbose --quiet" case "${cur}" in -*) __complete_options return 0;; *:) __vercode return 0;; *) __package return 0;; esac } __complete_verify() { opts="-v -q -p" lopts="--verbose --quiet" case "${cur}" in -*) __complete_options return 0;; *:) __vercode return 0;; *) __package return 0;; esac } __complete_btlog() { opts="-u" lopts="--git-remote --git-repo --url" __complete_options } __complete_mirror() { opts="-v" lopts="--all --archive --build-logs --pgp-signatures --src-tarballs --output-dir" __complete_options } __complete_nightly() { opts="-v -q" lopts="--show-secret-var --archive-older" __complete_options } __complete_deploy() { opts="-i -v -q" lopts="--identity-file --local-copy-dir --sync-from-local-copy-dir --verbose --quiet --no-checksum --no-keep-git-mirror-archive" __complete_options } __complete_signatures() { opts="-v -q" lopts="--verbose --no-check-https" case "${cur}" in -*) __complete_options return 0;; esac _filedir 'apk' return 0 } __complete_signindex() { opts="-v -q" lopts="--verbose" __complete_options } __complete_init() { opts="-v -q -d" lopts="--verbose --quiet --distinguished-name --keystore --repo-keyalias --android-home --no-prompt" __complete_options } __cmds=" \ btlog \ build \ checkupdates \ deploy \ gpgsign \ import \ init \ install \ lint \ mirror \ nightly \ publish \ readmeta \ rewritemeta \ scanner \ signatures \ signindex \ update \ verify \ " for c in $__cmds; do eval "_fdroid_${c} () { local cur prev opts lopts __fdroid_init ${c} }" done _fdroid() { local cmd cmd=${COMP_WORDS[1]} [[ $__cmds == *\ $cmd\ * ]] && _fdroid_${cmd} || { (($COMP_CWORD == 1)) && COMPREPLY=( $( compgen -W "${__cmds}" -- $cmd ) ) } } complete -F _fdroid fdroid return 0 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8843818 fdroidserver-2.3a1/examples/0000755000175000017500000000000014620351546014626 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/examples/Vagrantfile.yaml0000644000175000017500000000354414620351225017754 0ustar00hanshans--- # You may want to alter these before running ./makebuildserver # In the process of setting up the build server, many gigs of files # are downloaded (Android SDK components, gradle, etc). These are # cached so that they are not redownloaded each time. By default, # these are stored in ~/.cache/fdroidserver # # cachedir: buildserver/cache # To specify which Debian mirror the build server VM should use, by # default it uses http.debian.net, which auto-detects which is the # best mirror to use. # # debian_mirror: https://debian.osuosl.org/debian/ # The amount of RAM the build server will have (default: 2048) # memory: 3584 # The number of CPUs the build server will have # cpus: 1 # Debian package proxy server - if you have one # aptproxy: http://192.168.0.19:8000 # If this is running on an older machine or on a virtualized system, # it can run a lot slower. If the provisioning fails with a warning # about the timeout, extend the timeout here. (default: 600 seconds) # # boot_timeout: 1200 # By default, this whole process uses VirtualBox as the provider, but # QEMU+KVM is also supported via the libvirt plugin to vagrant. If # this is run within a KVM guest, then libvirt's QEMU+KVM will be used # automatically. It can also be manually enabled by uncommenting # below: # # vm_provider: libvirt # By default libvirt uses 'virtio' for both network and disk drivers. # Some systems (eg. nesting VMware ESXi) do not support virtio. As a # workaround for such rare cases, this setting allows to configure # KVM/libvirt to emulate hardware rather than using virtio. # # libvirt_disk_bus: sata # libvirt_nic_model_type: rtl8139 # Sometimes, it is not possible to use the 9p synced folder type with # libvirt, like if running a KVM buildserver instance inside of a # VMware ESXi guest. In that case, using NFS or another method is # required. # # synced_folder_type: nfs ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/examples/config.yml0000644000175000017500000003575214620351225016624 0ustar00hanshans--- # Copy this file to config.yml, then amend the settings below according to # your system configuration. # Custom path to the Android SDK, defaults to $ANDROID_HOME # sdk_path: $ANDROID_HOME # Paths to installed versions of the Android NDK. This will be # automatically filled out from well known sources like # $ANDROID_HOME/ndk-bundle and $ANDROID_HOME/ndk/*. If a required # version is missing in the buildserver VM, it will be automatically # downloaded and installed into the standard $ANDROID_HOME/ndk/ # directory. Manually setting it here will override the auto-detected # values. The keys can either be the "release" (e.g. r21e) or the # "revision" (e.g. 21.4.7075529). # # ndk_paths: # r10e: $ANDROID_HOME/android-ndk-r10e # r17: "" # 21.4.7075529: ~/Android/Ndk # r22b: null # Directory to store downloaded tools in (i.e. gradle versions) # By default, these are stored in ~/.cache/fdroidserver # cachedir: cache # Specify paths to each major Java release that you want to support # java_paths: # 8: /usr/lib/jvm/java-8-openjdk # Command or path to binary for running Ant # ant: ant # Command or path to binary for running maven 3 # mvn3: mvn # Command or path to binary for running Gradle # Defaults to using an internal gradle wrapper (gradlew-fdroid). # gradle: gradle # Always scan the APKs produced by `fdroid build` for known non-free classes # scan_binary: true # Set the maximum age (in days) of an index that a client should accept from # this repo. Setting it to 0 or not setting it at all disables this # functionality. If you do set this to a non-zero value, you need to ensure # that your index is updated much more frequently than the specified interval. # The same policy is applied to the archive repo, if there is one. # repo_maxage: 0 # Canonical URL of the repositoy, needs to end in /repo. Is is used to identity # the repo in the client, as well. # repo_url: https://MyFirstFDroidRepo.org/fdroid/repo # repo_name: My First F-Droid Repo Demo # repo_description: >- # This is a repository of apps to be used with F-Droid. Applications # in this repository are either official binaries built by the # original application developers, or are binaries built from source # by the admin of f-droid.org using the tools on # https://gitlab.com/fdroid. # As above, but for the archive repo. # # archive_url: https://f-droid.org/archive # archive_name: My First F-Droid Archive Demo # archive_description: >- # The repository of older versions of packages from the main demo repository. # archive_older sets the number of versions kept in the main repo, with all # older ones going to the archive. Set it to 0, and there will be no archive # repository, and no need to define the other archive_ values. # # archive_older: 3 # The repo's icon defaults to a file called 'icon.png' in the 'icons' # folder for each section, e.g. repo/icons/icon.png and # archive/icons/icon.png. To use a different filename for the icons, # set the filename here. You must still copy it into place in # repo/icons/ and/or archive/icons/. # # repo_icon: myicon.png # archive_icon: myicon.png # This allows a specific kind of insecure APK to be included in the # 'repo' section. Since April 2017, APK signatures that use MD5 are # no longer considered valid, jarsigner and apksigner will return an # error when verifying. `fdroid update` will move APKs with these # disabled signatures to the archive. This option stops that # behavior, and lets those APKs stay part of 'repo'. # # allow_disabled_algorithms: true # Normally, all apps are collected into a single app repository, like on # https://f-droid.org. For certain situations, it is better to make a repo # that is made up of APKs only from a single app. For example, an automated # build server that publishes nightly builds. # per_app_repos: true # `fdroid update` will create a link to the current version of a given app. # This provides a static path to the current APK. To disable the creation of # this link, uncomment this: # make_current_version_link: false # By default, the "current version" link will be based on the "Name" of the # app from the metadata. You can change it to use a different field from the # metadata here: # current_version_name_source: packageName # Optionally, override home directory for gpg # gpghome: /home/fdroid/somewhere/else/.gnupg # The ID of a GPG key for making detached signatures for APKs. Optional. # gpgkey: 1DBA2E89 # The key (from the keystore defined below) to be used for signing the # repository itself. This is the same name you would give to keytool or # jarsigner using -alias. (Not needed in an unsigned repository). # repo_keyalias: fdroidrepo # Optionally, the public key for the key defined by repo_keyalias above can # be specified here. There is no need to do this, as the public key can and # will be retrieved from the keystore when needed. However, specifying it # manually can allow some processing to take place without access to the # keystore. # repo_pubkey: ... # The keystore to use for release keys when building. This needs to be # somewhere safe and secure, and backed up! The best way to manage these # sensitive keys is to use a "smartcard" (aka Hardware Security Module). To # configure F-Droid to use a smartcard, set the keystore file using the keyword # "NONE" (i.e. keystore: "NONE"). That makes Java find the keystore on the # smartcard based on 'smartcardoptions' below. # keystore: ~/.local/share/fdroidserver/keystore.jks # You should not need to change these at all, unless you have a very # customized setup for using smartcards in Java with keytool/jarsigner # smartcardoptions: | # -storetype PKCS11 -providerName SunPKCS11-OpenSC # -providerClass sun.security.pkcs11.SunPKCS11 # -providerArg opensc-fdroid.cfg # The password for the keystore (at least 6 characters). If this password is # different than the keypass below, it can be OK to store the password in this # file for real use. But in general, sensitive passwords should not be stored # in text files! # keystorepass: password1 # The password for keys - the same is used for each auto-generated key as well # as for the repository key. You should not normally store this password in a # file since it is a sensitive password. # keypass: password2 # The distinguished name used for all keys. # keydname: CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=California, C=US # Use this to override the auto-generated key aliases with specific ones # for particular applications. Normally, just leave it empty. # # keyaliases: # com.example.app: example # # You can also force an app to use the same key alias as another one, using # the @ prefix. # # keyaliases: # com.example.another.plugin: "@com.example.another" # The full path to the root of the repository. It must be specified in # rsync/ssh format for a remote host/path. This is used for syncing a locally # generated repo to the server that is it hosted on. It must end in the # standard public repo name of "/fdroid", but can be in up to three levels of # sub-directories (i.e. /var/www/packagerepos/fdroid). You can include # multiple servers to sync to by wrapping the whole thing in {} or [], and # including the serverwebroot strings in a comma-separated list. # # serverwebroot: user@example:/var/www/fdroid # serverwebroot: # - foo.com:/usr/share/nginx/www/fdroid # - bar.info:/var/www/fdroid # # There is a special mode to only deploy the index file: # # serverwebroot: # - url: 'me@b.az:/srv/fdroid' # indexOnly: true # When running fdroid processes on a remote server, it is possible to # publish extra information about the status. Each fdroid sub-command # can create repo/status/running.json when it starts, then a # repo/status/.json when it completes. The builds logs # and other processes will also get published, if they are running in # a buildserver VM. The build logs name scheme is: # .../repo/$APPID_$VERCODE.log.gz. These files are also pushed to all # servers configured in 'serverwebroot'. # # deploy_process_logs: true # The full URL to a git remote repository. You can include # multiple servers to mirror to by adding strings to a YAML list or map. # Servers listed here will also be automatically inserted in the mirrors list. # # servergitmirrors: https://github.com/user/repo # servergitmirrors: # - https://github.com/user/repo # - https://gitlab.com/user/repo # # servergitmirrors: # - url: https://github.com/user/repo # - url: https://gitlab.com/user/repo # indexOnly: true # Most git hosting services have hard size limits for each git repo. # `fdroid deploy` will delete the git history when the git mirror repo # approaches this limit to ensure that the repo will still fit when # pushed. GitHub recommends 1GB, gitlab.com recommends 10GB. # # git_mirror_size_limit: 10GB # Any mirrors of this repo, for example all of the servers declared in # serverwebroot and all the servers declared in servergitmirrors, # will automatically be used by the client. If one # mirror is not working, then the client will try another. If the # client has Tor enabled, then the client will prefer mirrors with # .onion addresses. This base URL will be used for both the main repo # and the archive, if it is enabled. So these URLs should end in the # 'fdroid' base of the F-Droid part of the web server like serverwebroot. # # mirrors: # - https://foo.bar/fdroid # - http://foobarfoobarfoobar.onion/fdroid # # Or additional metadata can also be included by adding key/value pairs: # # mirrors: # - url: https://foo.bar/fdroid # countryCode: BA # - url: http://foobarfoobarfoobar.onion/fdroid # # The list of mirrors can also be maintained in config/mirrors.yml, a # standalone YAML file in the optional configuration directory. In # that case, mirrors: should be removed from this file (config.yml). # optionally specify which identity file to use when using rsync or git over SSH # # identity_file: ~/.ssh/fdroid_id_rsa # If you are running the repo signing process on a completely offline machine, # which provides the best security, then you can specify a folder to sync the # repo to when running `fdroid deploy`. This is most likely going to # be a USB thumb drive, SD Card, or some other kind of removable media. Make # sure it is mounted before running `fdroid deploy`. Using the # standard folder called 'fdroid' as the specified folder is recommended, like # with serverwebroot. # # local_copy_dir: /media/MyUSBThumbDrive/fdroid # If you are using local_copy_dir on an offline build/signing server, once the # thumb drive has been plugged into the online machine, it will need to be # synced to the copy on the online machine. To make that happen # automatically, set sync_from_local_copy_dir to True: # # sync_from_local_copy_dir: true # To upload the repo to an Amazon S3 bucket using `fdroid server # update`. Warning, this deletes and recreates the whole fdroid/ # directory each time. This prefers s3cmd, but can also use # apache-libcloud. To customize how s3cmd interacts with the cloud # provider, create a 's3cfg' file next to this file (config.yml), and # those settings will be used instead of any 'aws' variable below. # Secrets can be fetched from environment variables to ensure that # they are not leaked as part of this file. # # awsbucket: myawsfdroid # awsaccesskeyid: SEE0CHAITHEIMAUR2USA # awssecretkey: {env: awssecretkey} # If you want to force 'fdroid server' to use a non-standard serverwebroot. # This will allow you to have 'serverwebroot' entries which do not end in # '/fdroid'. (Please note that some client features expect repository URLs # to end in '/fdroid/repo'.) # # nonstandardwebroot: false # If you want to upload the release APK file to androidobservatory.org # # androidobservatory: false # If you want to upload the release APK file to virustotal.com # You have to enter your profile apikey to enable the upload. # # virustotal_apikey: 9872987234982734 # # Or get it from an environment variable: # # virustotal_apikey: {env: virustotal_apikey} # Keep a log of all generated index files in a git repo to provide a # "binary transparency" log for anyone to check the history of the # binaries that are published. This is in the form of a "git remote", # which this machine where `fdroid update` is run has already been # configured to allow push access (e.g. ssh key, username/password, etc) # binary_transparency_remote: git@gitlab.com:fdroid/binary-transparency-log.git # If you want to keep the "added" and "last updated" dates for each # app and APK in your repo, enable this. The name comes from an old # system for tracking statistics that is no longer included. # update_stats: true # Set this to true to always use a build server. This saves specifying the # --server option on dedicated secure build server hosts. # build_server_always: true # Limit in number of characters that fields can take up # Only the fields listed here are supported, defaults shown # char_limits: # author: 256 # name: 50 # summary: 80 # description: 4000 # video: 256 # whatsNew: 500 # It is possible for the server operator to specify lists of apps that # must be installed or uninstalled on the client (aka "push installs). # If the user has opted in, or the device is already setup to respond # to these requests, then F-Droid will automatically install/uninstall # the packageNames listed. This is protected by the same signing key # as the app index metadata. # # install_list: # - at.bitfire.davdroid # - com.fsck.k9 # - us.replicant # # uninstall_list: # - com.facebook.orca # - com.android.vending # `fdroid lint` checks licenses in metadata against a built white list. By # default we will require license metadata to be present and only allow # licenses approved either by FSF or OSI. We're using the standardized SPDX # license IDs. (https://spdx.org/licenses/) # # We use `python3 -m spdx-license-list print --filter-fsf-or-osi` for # generating our default list. (https://pypi.org/project/spdx-license-list) # # You can override our default list of allowed licenes by setting this option. # Just supply a custom list of licene names you would like to allow. To disable # checking licenses by the linter, assign an empty value to lint_licenses. # # lint_licenses: # - Custom-License-A # - Another-License # `fdroid scanner` can scan for signatures from various sources. By default # it's configured to only use F-Droids official SUSS collection. We have # support for these special collections: # * 'exodus' - official exodus-privacy.org signatures # * 'etip' - exodus privacy investigation platfrom community contributed # signatures # * 'suss' - official F-Droid: Suspicious or Unwanted Software Signatures # You can also configure scanner to use custom collections of signatures here. # They have to follow the format specified in the SUSS readme. # (https://gitlab.com/fdroid/fdroid-suss/#cache-file-data-format) # # scanner_signature_sources: # - suss # - exodus # - https://example.com/signatures.json # The scanner can use signature sources from the internet. These are # cached locally. To force them to be refreshed from the network on # every run, set this to true: # # refresh_scanner: true ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/examples/fdroid_export_keystore_to_nitrokey.py0000644000175000017500000000433114620351225024416 0ustar00hanshans#!/usr/bin/env python3 # # an fdroid plugin for exporting a repo's keystore in standard PEM format import os from argparse import ArgumentParser from fdroidserver import common from fdroidserver.common import FDroidPopen from fdroidserver.exception import BuildException fdroid_summary = "export the repo's keystore file to a NitroKey HSM" def run(cmd, error): envs = {'LC_ALL': 'C.UTF-8', 'PIN': config['smartcard_pin'], 'FDROID_KEY_STORE_PASS': config['keystorepass'], 'FDROID_KEY_PASS': config['keypass']} p = FDroidPopen(cmd, envs=envs) if p.returncode != 0: raise BuildException(error, p.output) def main(): global config parser = ArgumentParser() common.setup_global_opts(parser) common.parse_args(parser) config = common.read_config() destkeystore = config['keystore'].replace('.jks', '.p12').replace('/', '_') exportkeystore = config['keystore'].replace('.jks', '.pem').replace('/', '_') if os.path.exists(destkeystore) or os.path.exists(exportkeystore): raise BuildException('%s exists!' % exportkeystore) run([config['keytool'], '-importkeystore', '-srckeystore', config['keystore'], '-srcalias', config['repo_keyalias'], '-srcstorepass:env', 'FDROID_KEY_STORE_PASS', '-srckeypass:env', 'FDROID_KEY_PASS', '-destkeystore', destkeystore, '-deststorepass:env', 'FDROID_KEY_STORE_PASS', '-deststoretype', 'PKCS12'], 'Failed to convert to PKCS12!') # run(['openssl', 'pkcs12', '-in', destkeystore, # '-passin', 'env:FDROID_KEY_STORE_PASS', '-nokeys', # '-out', exportkeystore, # '-passout', 'env:FDROID_KEY_STORE_PASS'], # 'Failed to convert to PEM!') run(['pkcs15-init', '--delete-objects', 'privkey,pubkey', '--id', '3', '--store-private-key', destkeystore, '--format', 'pkcs12', '--auth-id', '3', '--verify-pin', '--pin', 'env:PIN'], '') run(['pkcs15-init', '--delete-objects', 'privkey,pubkey', '--id', '2', '--store-private-key', destkeystore, '--format', 'pkcs12', '--auth-id', '3', '--verify-pin', '--pin', 'env:PIN'], '') if __name__ == "__main__": main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/examples/fdroid_exportkeystore.py0000644000175000017500000000372414620351225021636 0ustar00hanshans#!/usr/bin/env python3 # # an fdroid plugin for exporting a repo's keystore in standard PEM format import os from argparse import ArgumentParser from fdroidserver import common from fdroidserver.common import FDroidPopen from fdroidserver.exception import BuildException fdroid_summary = 'export the keystore in standard PEM format' def main(): parser = ArgumentParser() common.setup_global_opts(parser) common.parse_args(parser) config = common.read_config() env_vars = {'LC_ALL': 'C.UTF-8', 'FDROID_KEY_STORE_PASS': config['keystorepass'], 'FDROID_KEY_PASS': config['keypass']} destkeystore = config['keystore'].replace('.jks', '.p12').replace('/', '_') exportkeystore = config['keystore'].replace('.jks', '.pem').replace('/', '_') if os.path.exists(destkeystore) or os.path.exists(exportkeystore): raise BuildException('%s exists!' % exportkeystore) p = FDroidPopen([config['keytool'], '-importkeystore', '-srckeystore', config['keystore'], '-srcalias', config['repo_keyalias'], '-srcstorepass:env', 'FDROID_KEY_STORE_PASS', '-srckeypass:env', 'FDROID_KEY_PASS', '-destkeystore', destkeystore, '-deststoretype', 'PKCS12', '-deststorepass:env', 'FDROID_KEY_STORE_PASS', '-destkeypass:env', 'FDROID_KEY_PASS'], envs=env_vars) if p.returncode != 0: raise BuildException("Failed to convert to PKCS12!", p.output) p = FDroidPopen(['openssl', 'pkcs12', '-in', destkeystore, '-passin', 'env:FDROID_KEY_STORE_PASS', '-nokeys', '-out', exportkeystore, '-passout', 'env:FDROID_KEY_STORE_PASS'], envs=env_vars) if p.returncode != 0: raise BuildException("Failed to convert to PEM!", p.output) if __name__ == "__main__": main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/examples/fdroid_extract_repo_pubkey.py0000644000175000017500000000100514620351225022573 0ustar00hanshans#!/usr/bin/env python3 # # an fdroid plugin print the repo_pubkey from a repo's keystore # from argparse import ArgumentParser from fdroidserver import common, index fdroid_summary = 'export the keystore in standard PEM format' def main(): parser = ArgumentParser() common.setup_global_opts(parser) common.parse_args(parser) common.read_config() pubkey, repo_pubkey_fingerprint = index.extract_pubkey() print('repo_pubkey = "%s"' % pubkey.decode()) if __name__ == "__main__": main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/examples/fdroid_fetchsrclibs.py0000644000175000017500000000302714620351225021176 0ustar00hanshans#!/usr/bin/env python3 # # an fdroid plugin for setting up srclibs # # The 'fdroid build' gitlab-ci job uses --on-server, which does not # set up the srclibs. This plugin does the missing setup. import argparse import os import pprint from fdroidserver import _, common, metadata fdroid_summary = 'prepare the srclibs for `fdroid build --on-server`' def main(): parser = argparse.ArgumentParser(usage="%(prog)s [options] [APPID[:VERCODE] [APPID[:VERCODE] ...]]") common.setup_global_opts(parser) parser.add_argument("appid", nargs='*', help=_("applicationId with optional versionCode in the form APPID[:VERCODE]")) metadata.add_metadata_arguments(parser) options = common.parse_args(parser) pkgs = common.read_pkg_args(options.appid, True) allapps = metadata.read_metadata(pkgs) apps = common.read_app_args(options.appid, allapps, True) common.read_config() srclib_dir = os.path.join('build', 'srclib') os.makedirs(srclib_dir, exist_ok=True) srclibpaths = [] for appid, app in apps.items(): vcs, _ignored = common.setup_vcs(app) for build in app.get('Builds', []): vcs.gotorevision(build.commit, refresh=False) if build.submodules: vcs.initsubmodules() else: vcs.deinitsubmodules() for lib in build.srclibs: srclibpaths.append(common.getsrclib(lib, srclib_dir, prepare=False, build=build)) print('Set up srclibs:') pprint.pprint(srclibpaths) if __name__ == "__main__": main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/examples/fdroid_nitrokeyimport.py0000644000175000017500000000300514620351225021616 0ustar00hanshans#!/usr/bin/env python3 from argparse import ArgumentParser from fdroidserver import common from fdroidserver.common import FDroidPopen from fdroidserver.exception import BuildException fdroid_summary = 'import the local keystore into a SmartCard HSM' def main(): parser = ArgumentParser() common.setup_global_opts(parser) common.parse_args(parser) config = common.read_config() env_vars = { 'LC_ALL': 'C.UTF-8', 'FDROID_KEY_STORE_PASS': config['keystorepass'], 'FDROID_KEY_PASS': config['keypass'], 'SMARTCARD_PIN': str(config['smartcard_pin']), } p = FDroidPopen([config['keytool'], '-importkeystore', '-srcalias', config['repo_keyalias'], '-srckeystore', config['keystore'], '-srcstorepass:env', 'FDROID_KEY_STORE_PASS', '-srckeypass:env', 'FDROID_KEY_PASS', '-destalias', config['repo_keyalias'], '-destkeystore', 'NONE', '-deststoretype', 'PKCS11', '-providerName', 'SunPKCS11-OpenSC', '-providerClass', 'sun.security.pkcs11.SunPKCS11', '-providerArg', 'opensc-fdroid.cfg', '-deststorepass:env', 'SMARTCARD_PIN', '-J-Djava.security.debug=sunpkcs11'], envs=env_vars) if p.returncode != 0: raise BuildException("Failed to import into HSM!", p.output) if __name__ == "__main__": main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/examples/opensc-fdroid.cfg0000644000175000017500000000017314620351225020036 0ustar00hanshansname = OpenSC description = SunPKCS11 w/ OpenSC Smart card Framework library = /usr/lib/opensc-pkcs11.so slotListIndex = 1 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/examples/public-read-only-s3-bucket-policy.json0000644000175000017500000000035514620351225023757 0ustar00hanshans{ "Version":"2012-10-17", "Statement":[ {"Sid":"AddPerm", "Effect":"Allow", "Principal":"*", "Action":"s3:GetObject", "Resource":"arn:aws:s3:::examplebucket/fdroid/*" } ] } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/examples/template.yml0000644000175000017500000000036414620351225017161 0ustar00hanshansAuthorName: . WebSite: '' Bitcoin: null Litecoin: null Donate: null License: Unknown Categories: - Internet IssueTracker: '' SourceCode: '' Changelog: '' Name: . Summary: . Description: | . ArchivePolicy: 2 versions RequiresRoot: false ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.888382 fdroidserver-2.3a1/fdroidserver/0000755000175000017500000000000014620351546015506 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/__init__.py0000644000175000017500000000435414620351225017617 0ustar00hanshansimport gettext import glob import os import sys # support running straight from git and standard installs rootpaths = [ os.path.realpath(os.path.join(os.path.dirname(__file__), '..')), os.path.realpath( os.path.join(os.path.dirname(__file__), '..', '..', '..', '..', 'share') ), os.path.join(sys.prefix, 'share'), ] localedir = None for rootpath in rootpaths: if len(glob.glob(os.path.join(rootpath, 'locale', '*', 'LC_MESSAGES', 'fdroidserver.mo'))) > 0: localedir = os.path.join(rootpath, 'locale') break gettext.bindtextdomain('fdroidserver', localedir) gettext.textdomain('fdroidserver') _ = gettext.gettext from fdroidserver.exception import (FDroidException, MetaDataException, VerificationException) # NOQA: E402 FDroidException # NOQA: B101 MetaDataException # NOQA: B101 VerificationException # NOQA: B101 from fdroidserver.common import (verify_apk_signature, genkeystore as generate_keystore) # NOQA: E402 verify_apk_signature # NOQA: B101 generate_keystore # NOQA: B101 from fdroidserver.index import (download_repo_index, download_repo_index_v1, download_repo_index_v2, get_mirror_service_urls, make as make_index) # NOQA: E402 download_repo_index # NOQA: B101 download_repo_index_v1 # NOQA: B101 download_repo_index_v2 # NOQA: B101 get_mirror_service_urls # NOQA: B101 make_index # NOQA: B101 from fdroidserver.update import (process_apk, process_apks, scan_apk, scan_repo_files) # NOQA: E402 process_apk # NOQA: B101 process_apks # NOQA: B101 scan_apk # NOQA: B101 scan_repo_files # NOQA: B101 from fdroidserver.deploy import (update_awsbucket, update_servergitmirrors, update_serverwebroots, update_serverwebroot) # NOQA: E402 update_awsbucket # NOQA: B101 update_servergitmirrors # NOQA: B101 update_serverwebroots # NOQA: B101 update_serverwebroot # NOQA: B101 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/__main__.py0000755000175000017500000002135514620351225017603 0ustar00hanshans#!/usr/bin/env python3 # # fdroidserver/__main__.py - part of the FDroid server tools # Copyright (C) 2020 Michael Pöhn # Copyright (C) 2010-2015, Ciaran Gultnieks, ciaran@ciarang.com # Copyright (C) 2013-2014 Daniel Marti # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import re import sys import os import pkgutil import logging import importlib.metadata import git import fdroidserver.common import fdroidserver.metadata from fdroidserver import _ from argparse import ArgumentError from collections import OrderedDict COMMANDS = OrderedDict([ ("build", _("Build a package from source")), ("init", _("Quickly start a new repository")), ("publish", _("Sign and place packages in the repo")), ("gpgsign", _("Add PGP signatures using GnuPG for packages in repo")), ("update", _("Update repo information for new packages")), ("deploy", _("Interact with the repo HTTP server")), ("verify", _("Verify the integrity of downloaded packages")), ("checkupdates", _("Check for updates to applications")), ("import", _("Extract application metadata from a source repository")), ("install", _("Install built packages on devices")), ("readmeta", _("Read all the metadata files and exit")), ("rewritemeta", _("Rewrite all the metadata files")), ("lint", _("Warn about possible metadata errors")), ("scanner", _("Scan the source code of a package")), ("signindex", _("Sign indexes created using update --nosign")), ("btlog", _("Update the binary transparency log for a URL")), ("signatures", _("Extract signatures from APKs")), ("nightly", _("Set up an app build for a nightly build repo")), ("mirror", _("Download complete mirrors of small repos")), ]) def print_help(available_plugins=None): print(_("usage: ") + _("fdroid [] [-h|--help|--version|]")) print("") print(_("Valid commands are:")) for cmd, summary in COMMANDS.items(): print(" " + cmd + ' ' * (15 - len(cmd)) + summary) if available_plugins: print(_('commands from plugin modules:')) for command in sorted(available_plugins.keys()): print(' {:15}{}'.format(command, available_plugins[command]['summary'])) print("") def preparse_plugin(module_name, module_dir): """No summary. Simple regex based parsing for plugin scripts. So we don't have to import them when we just need the summary, but not plan on executing this particular plugin. """ if '.' in module_name: raise ValueError("No '.' allowed in fdroid plugin modules: '{}'" .format(module_name)) path = os.path.join(module_dir, module_name + '.py') if not os.path.isfile(path): path = os.path.join(module_dir, module_name, '__main__.py') if not os.path.isfile(path): raise ValueError("unable to find main plugin script " "for module '{n}' ('{d}')" .format(n=module_name, d=module_dir)) summary = None main = None with open(path, 'r', encoding='utf-8') as f: re_main = re.compile(r'^(\s*def\s+main\s*\(.*\)\s*:' r'|\s*main\s*=\s*lambda\s*:.+)$') re_summary = re.compile(r'^\s*fdroid_summary\s*=\s["\'](?P.+)["\']$') for line in f: m_summary = re_summary.match(line) if m_summary: summary = m_summary.group('text') if re_main.match(line): main = True if summary is None: raise NameError("could not find 'fdroid_summary' in: '{}' plugin" .format(module_name)) if main is None: raise NameError("could not find 'main' function in: '{}' plugin" .format(module_name)) return {'name': module_name, 'summary': summary} def find_plugins(): found_plugins = [{'name': x[1], 'dir': x[0].path} for x in pkgutil.iter_modules() if x[1].startswith('fdroid_')] plugin_infos = {} for plugin_def in found_plugins: command_name = plugin_def['name'][7:] try: plugin_infos[command_name] = preparse_plugin(plugin_def['name'], plugin_def['dir']) except Exception as e: # We need to keep module lookup fault tolerant because buggy # modules must not prevent fdroidserver from functioning if len(sys.argv) > 1 and sys.argv[1] == command_name: # only raise exeption when a user specifies the broken # plugin in explicitly in command line raise e return plugin_infos def main(): available_plugins = find_plugins() if len(sys.argv) <= 1: print_help(available_plugins=available_plugins) sys.exit(0) command = sys.argv[1] if command not in COMMANDS and command not in available_plugins: if command in ('-h', '--help'): print_help(available_plugins=available_plugins) sys.exit(0) elif command == 'server': print(_("""ERROR: The "server" subcommand has been removed, use "deploy"!""")) sys.exit(1) elif command == '--version': try: print(importlib.metadata.version("fdroidserver")) sys.exit(0) except importlib.metadata.PackageNotFoundError: pass try: print( git.repo.Repo( os.path.dirname(os.path.dirname(__file__)) ).git.describe(always=True, tags=True) ) sys.exit(0) except git.exc.InvalidGitRepositoryError: print(_('No version information could be found.')) sys.exit(1) else: print(_("Command '%s' not recognised.\n" % command)) print_help(available_plugins=available_plugins) sys.exit(1) verbose = any(s in sys.argv for s in ['-v', '--verbose']) quiet = any(s in sys.argv for s in ['-q', '--quiet']) # Helpful to differentiate warnings from errors even when on quiet logformat = '%(asctime)s %(levelname)s: %(message)s' loglevel = logging.INFO if verbose: loglevel = logging.DEBUG elif quiet: loglevel = logging.WARN logging.basicConfig(format=logformat, level=loglevel) if verbose and quiet: logging.critical(_("Conflicting arguments: '--verbose' and '--quiet' " "can not be specified at the same time.")) sys.exit(1) # Trick argparse into displaying the right usage when --help is used. sys.argv[0] += ' ' + command del sys.argv[1] if command in COMMANDS.keys(): # import is named import_subcommand internally b/c import is reserved by Python command = 'import_subcommand' if command == 'import' else command mod = __import__('fdroidserver.' + command, None, None, [command]) else: mod = __import__(available_plugins[command]['name'], None, None, [command]) system_encoding = sys.getdefaultencoding() if system_encoding is None or system_encoding.lower() not in ('utf-8', 'utf8'): logging.warning(_("Encoding is set to '{enc}' fdroid might run " "into encoding issues. Please set it to 'UTF-8' " "for best results.".format(enc=system_encoding))) try: mod.main() # These are ours, contain a proper message and are "expected" except (fdroidserver.common.FDroidException, fdroidserver.metadata.MetaDataException) as e: if verbose: raise else: logging.critical(str(e)) sys.exit(1) except ArgumentError as e: logging.critical(str(e)) sys.exit(1) except KeyboardInterrupt: print('') fdroidserver.common.force_exit(1) # These should only be unexpected crashes due to bugs in the code # str(e) often doesn't contain a reason, so just show the backtrace except Exception as e: logging.critical(_("Unknown exception found!")) raise e sys.exit(0) if __name__ == "__main__": main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/apksigcopier.py0000644000175000017500000011215114620351225020533 0ustar00hanshans#!/usr/bin/python3 # encoding: utf-8 # SPDX-FileCopyrightText: 2023 FC Stegerman # SPDX-License-Identifier: GPL-3.0-or-later # -- ; {{{1 # # File : apksigcopier # Maintainer : FC Stegerman # Date : 2023-02-08 # # Copyright : Copyright (C) 2023 FC Stegerman # Version : v1.1.1 # License : GPLv3+ # # -- ; }}}1 """ Copy/extract/patch android apk signatures & compare apks. apksigcopier is a tool for copying android APK signatures from a signed APK to an unsigned one (in order to verify reproducible builds). It can also be used to compare two APKs with different signatures; this requires apksigner. CLI === $ apksigcopier extract [OPTIONS] SIGNED_APK OUTPUT_DIR $ apksigcopier patch [OPTIONS] METADATA_DIR UNSIGNED_APK OUTPUT_APK $ apksigcopier copy [OPTIONS] SIGNED_APK UNSIGNED_APK OUTPUT_APK $ apksigcopier compare [OPTIONS] FIRST_APK SECOND_APK The following environment variables can be set to 1, yes, or true to override the default behaviour: * set APKSIGCOPIER_EXCLUDE_ALL_META=1 to exclude all metadata files * set APKSIGCOPIER_COPY_EXTRA_BYTES=1 to copy extra bytes after data (e.g. a v2 sig) * set APKSIGCOPIER_SKIP_REALIGNMENT=1 to skip realignment of ZIP entries API === >> from apksigcopier import do_extract, do_patch, do_copy, do_compare >> do_extract(signed_apk, output_dir, v1_only=NO) >> do_patch(metadata_dir, unsigned_apk, output_apk, v1_only=NO) >> do_copy(signed_apk, unsigned_apk, output_apk, v1_only=NO) >> do_compare(first_apk, second_apk, unsigned=False) You can use False, None, and True instead of NO, AUTO, and YES respectively. The following global variables (which default to False), can be set to override the default behaviour: * set exclude_all_meta=True to exclude all metadata files * set copy_extra_bytes=True to copy extra bytes after data (e.g. a v2 sig) * set skip_realignment=True to skip realignment of ZIP entries """ import glob import json import os import re import struct import sys import zipfile import zlib from collections import namedtuple from typing import Any, BinaryIO, Callable, Dict, Iterable, Iterator, Optional, Tuple, Union __version__ = "1.1.1" NAME = "apksigcopier" if sys.version_info >= (3, 8): from typing import Literal NoAutoYes = Literal["no", "auto", "yes"] else: NoAutoYes = str DateTime = Tuple[int, int, int, int, int, int] NoAutoYesBoolNone = Union[NoAutoYes, bool, None] ZipInfoDataPairs = Iterable[Tuple[zipfile.ZipInfo, bytes]] SIGBLOCK, SIGOFFSET = "APKSigningBlock", "APKSigningBlockOffset" NOAUTOYES: Tuple[NoAutoYes, NoAutoYes, NoAutoYes] = ("no", "auto", "yes") NO, AUTO, YES = NOAUTOYES APK_META = re.compile(r"^META-INF/([0-9A-Za-z_-]+\.(SF|RSA|DSA|EC)|MANIFEST\.MF)$") META_EXT: Tuple[str, ...] = ("SF", "RSA|DSA|EC", "MF") COPY_EXCLUDE: Tuple[str, ...] = ("META-INF/MANIFEST.MF",) DATETIMEZERO: DateTime = (1980, 0, 0, 0, 0, 0) ################################################################################ # # NB: these values are all from apksigner (the first element of each tuple, same # as APKZipInfo) or signflinger/zipflinger, except for external_attr w/ 0664 # permissions and flag_bits 0x08, added for completeness. # # NB: zipflinger changed from 0666 to 0644 in commit 895ba5fba6ab84617dd67e38f456a8f96aa37ff0 # # https://android.googlesource.com/platform/tools/apksig # src/main/java/com/android/apksig/internal/zip/{CentralDirectoryRecord,LocalFileRecord,ZipUtils}.java # https://android.googlesource.com/platform/tools/base # signflinger/src/com/android/signflinger/SignedApk.java # zipflinger/src/com/android/zipflinger/{CentralDirectoryRecord,LocalFileHeader,Source}.java # ################################################################################ VALID_ZIP_META = dict( compresslevel=(9, 1), # best compression, best speed create_system=(0, 3), # fat, unx create_version=(20, 0), # 2.0, 0.0 external_attr=(0, # N/A 0o100644 << 16, # regular file rw-r--r-- 0o100664 << 16, # regular file rw-rw-r-- 0o100666 << 16), # regular file rw-rw-rw- extract_version=(20, 0), # 2.0, 0.0 flag_bits=(0x800, 0, 0x08, 0x808), # 0x800 = utf8, 0x08 = data_descriptor ) ZipData = namedtuple("ZipData", ("cd_offset", "eocd_offset", "cd_and_eocd")) exclude_all_meta = False # exclude all metadata files in copy_apk() copy_extra_bytes = False # copy extra bytes after data in copy_apk() skip_realignment = False # skip realignment of ZIP entries in copy_apk() class APKSigCopierError(Exception): """Base class for errors.""" class APKSigningBlockError(APKSigCopierError): """Something wrong with the APK Signing Block.""" class NoAPKSigningBlock(APKSigningBlockError): """APK Signing Block Missing.""" class ZipError(APKSigCopierError): """Something wrong with ZIP file.""" # FIXME: is there a better alternative? class ReproducibleZipInfo(zipfile.ZipInfo): """Reproducible ZipInfo hack.""" _override: Dict[str, Any] = {} def __init__(self, zinfo: zipfile.ZipInfo, **override: Any) -> None: # pylint: disable=W0231 if override: self._override = {**self._override, **override} for k in self.__slots__: if hasattr(zinfo, k): setattr(self, k, getattr(zinfo, k)) def __getattribute__(self, name: str) -> Any: if name != "_override": try: return self._override[name] except KeyError: pass return object.__getattribute__(self, name) # See VALID_ZIP_META class APKZipInfo(ReproducibleZipInfo): """Reproducible ZipInfo for APK files.""" COMPRESSLEVEL = 9 _override = dict( compress_type=8, create_system=0, create_version=20, date_time=DATETIMEZERO, external_attr=0, extract_version=20, flag_bits=0x800, ) def noautoyes(value: NoAutoYesBoolNone) -> NoAutoYes: """ Turn False into NO, None into AUTO, and True into YES. >>> from apksigcopier import noautoyes, NO, AUTO, YES >>> noautoyes(False) == NO == noautoyes(NO) True >>> noautoyes(None) == AUTO == noautoyes(AUTO) True >>> noautoyes(True) == YES == noautoyes(YES) True """ if isinstance(value, str): if value not in NOAUTOYES: raise ValueError("expected NO, AUTO, or YES") return value try: return {False: NO, None: AUTO, True: YES}[value] except KeyError: raise ValueError("expected False, None, or True") # pylint: disable=W0707 def is_meta(filename: str) -> bool: """ Check whether filename is a JAR metadata file. Returns whether filename is a v1 (JAR) signature file (.SF), signature block file (.RSA, .DSA, or .EC), or manifest (MANIFEST.MF). See https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html >>> from apksigcopier import is_meta >>> is_meta("classes.dex") False >>> is_meta("META-INF/CERT.SF") True >>> is_meta("META-INF/CERT.RSA") True >>> is_meta("META-INF/MANIFEST.MF") True >>> is_meta("META-INF/OOPS") False """ return APK_META.fullmatch(filename) is not None def exclude_from_copying(filename: str) -> bool: """ Check whether to exclude a file during copy_apk(). Excludes filenames in COPY_EXCLUDE (i.e. MANIFEST.MF) by default; when exclude_all_meta is set to True instead, excludes all metadata files as matched by is_meta(). Directories are always excluded. >>> import apksigcopier >>> from apksigcopier import exclude_from_copying >>> exclude_from_copying("classes.dex") False >>> exclude_from_copying("foo/") True >>> exclude_from_copying("META-INF/") True >>> exclude_from_copying("META-INF/MANIFEST.MF") True >>> exclude_from_copying("META-INF/CERT.SF") False >>> exclude_from_copying("META-INF/OOPS") False >>> apksigcopier.exclude_all_meta = True >>> exclude_from_copying("classes.dex") False >>> exclude_from_copying("META-INF/") True >>> exclude_from_copying("META-INF/MANIFEST.MF") True >>> exclude_from_copying("META-INF/CERT.SF") True >>> exclude_from_copying("META-INF/OOPS") False """ return exclude_meta(filename) if exclude_all_meta else exclude_default(filename) def exclude_default(filename: str) -> bool: """ Like exclude_from_copying(). Excludes directories and filenames in COPY_EXCLUDE (i.e. MANIFEST.MF). """ return is_directory(filename) or filename in COPY_EXCLUDE def exclude_meta(filename: str) -> bool: """Like exclude_from_copying(); excludes directories and all metadata files.""" return is_directory(filename) or is_meta(filename) def is_directory(filename: str) -> bool: """ZIP entries with filenames that end with a '/' are directories.""" return filename.endswith("/") ################################################################################ # # There is usually a 132-byte virtual entry at the start of an APK signed with a # v1 signature by signflinger/zipflinger; almost certainly this is a default # manifest ZIP entry created at initialisation, deleted (from the CD but not # from the file) during v1 signing, and eventually replaced by a virtual entry. # # >>> (30 + len("META-INF/MANIFEST.MF") + # ... len("Manifest-Version: 1.0\r\n" # ... "Created-By: Android Gradle 7.1.3\r\n" # ... "Built-By: Signflinger\r\n\r\n")) # 132 # # NB: they could be a different size, depending on Created-By and Built-By. # # FIXME: could virtual entries occur elsewhere as well? # # https://android.googlesource.com/platform/tools/base # signflinger/src/com/android/signflinger/SignedApk.java # zipflinger/src/com/android/zipflinger/{LocalFileHeader,ZipArchive}.java # ################################################################################ def zipflinger_virtual_entry(size: int) -> bytes: """Create zipflinger virtual entry.""" if size < 30: raise ValueError("Minimum size for virtual entries is 30 bytes") return ( # header extract_version flag_bits b"\x50\x4b\x03\x04" b"\x00\x00" b"\x00\x00" # compress_type (1981,1,1,1,1,2) crc32 b"\x00\x00" b"\x21\x08\x21\x02" b"\x00\x00\x00\x00" # compress_size file_size filename length b"\x00\x00\x00\x00" b"\x00\x00\x00\x00" b"\x00\x00" ) + int.to_bytes(size - 30, 2, "little") + b"\x00" * (size - 30) def detect_zfe(apkfile: str) -> Optional[int]: """ Detect zipflinger virtual entry. Returns the size of the virtual entry if found, None otherwise. Raises ZipError if the size is less than 30 or greater than 4096, or the data isn't all zeroes. """ with open(apkfile, "rb") as fh: zfe_start = zipflinger_virtual_entry(30)[:28] # w/o len(extra) if fh.read(28) == zfe_start: zfe_size = 30 + int.from_bytes(fh.read(2), "little") if not (30 <= zfe_size <= 4096): raise ZipError("Unsupported virtual entry size") if not fh.read(zfe_size - 30) == b"\x00" * (zfe_size - 30): raise ZipError("Unsupported virtual entry data") return zfe_size return None ################################################################################ # # https://en.wikipedia.org/wiki/ZIP_(file_format) # https://source.android.com/docs/security/features/apksigning/v2#apk-signing-block-format # # ================================= # | Contents of ZIP entries | # ================================= # | APK Signing Block | # | ----------------------------- | # | | size (w/o this) uint64 LE | | # | | ... | | # | | size (again) uint64 LE | | # | | "APK Sig Block 42" (16B) | | # | ----------------------------- | # ================================= # | ZIP Central Directory | # ================================= # | ZIP End of Central Directory | # | ----------------------------- | # | | 0x06054b50 ( 4B) | | # | | ... (12B) | | # | | CD Offset ( 4B) | | # | | ... | | # | ----------------------------- | # ================================= # ################################################################################ # FIXME: makes certain assumptions and doesn't handle all valid ZIP files! # FIXME: support zip64? # FIXME: handle utf8 filenames w/o utf8 flag (as produced by zipflinger)? # https://android.googlesource.com/platform/tools/apksig # src/main/java/com/android/apksig/ApkSigner.java def copy_apk(unsigned_apk: str, output_apk: str, *, copy_extra: Optional[bool] = None, exclude: Optional[Callable[[str], bool]] = None, realign: Optional[bool] = None, zfe_size: Optional[int] = None) -> DateTime: """ Copy APK like apksigner would, excluding files matched by exclude_from_copying(). Adds a zipflinger virtual entry of zfe_size bytes if one is not already present and zfe_size is not None. Returns max date_time. The following global variables (which default to False), can be set to override the default behaviour: * set exclude_all_meta=True to exclude all metadata files * set copy_extra_bytes=True to copy extra bytes after data (e.g. a v2 sig) * set skip_realignment=True to skip realignment of ZIP entries The default behaviour can also be changed using the keyword-only arguments exclude, copy_extra, and realign; these take precedence over the global variables when not None. NB: exclude is a callable, not a bool; realign is the inverse of skip_realignment. >>> import apksigcopier, os, zipfile >>> apk = "test/apks/apks/golden-aligned-in.apk" >>> with zipfile.ZipFile(apk, "r") as zf: ... infos_in = zf.infolist() >>> with tempfile.TemporaryDirectory() as tmpdir: ... out = os.path.join(tmpdir, "out.apk") ... apksigcopier.copy_apk(apk, out) ... with zipfile.ZipFile(out, "r") as zf: ... infos_out = zf.infolist() (2017, 5, 15, 11, 28, 40) >>> for i in infos_in: ... print(i.filename) META-INF/ META-INF/MANIFEST.MF AndroidManifest.xml classes.dex temp.txt lib/armeabi/fake.so resources.arsc temp2.txt >>> for i in infos_out: ... print(i.filename) AndroidManifest.xml classes.dex temp.txt lib/armeabi/fake.so resources.arsc temp2.txt >>> infos_in[2] >>> infos_out[0] >>> repr(infos_in[2:]) == repr(infos_out) True """ if copy_extra is None: copy_extra = copy_extra_bytes if exclude is None: exclude = exclude_from_copying if realign is None: realign = not skip_realignment with zipfile.ZipFile(unsigned_apk, "r") as zf: infos = zf.infolist() zdata = zip_data(unsigned_apk) offsets = {} with open(unsigned_apk, "rb") as fhi, open(output_apk, "w+b") as fho: if zfe_size: zfe = zipflinger_virtual_entry(zfe_size) if fhi.read(zfe_size) != zfe: fho.write(zfe) fhi.seek(0) for info in sorted(infos, key=lambda info: info.header_offset): off_i = fhi.tell() if info.header_offset > off_i: # copy extra bytes fho.write(fhi.read(info.header_offset - off_i)) hdr = fhi.read(30) if hdr[:4] != b"\x50\x4b\x03\x04": raise ZipError("Expected local file header signature") n, m = struct.unpack(" bytes: align = 4096 if info.filename.endswith(".so") else 4 old_off = 30 + n + m + info.header_offset new_off = 30 + n + m + off_o old_xtr = hdr[30 + n:30 + n + m] new_xtr = b"" while len(old_xtr) >= 4: hdr_id, size = struct.unpack(" len(old_xtr) - 4: break if not (hdr_id == 0 and size == 0): if hdr_id == 0xd935: if size >= 2: align = int.from_bytes(old_xtr[4:6], "little") else: new_xtr += old_xtr[:size + 4] old_xtr = old_xtr[size + 4:] if old_off % align == 0 and new_off % align != 0: if pad_like_apksigner: pad = (align - (new_off - m + len(new_xtr) + 6) % align) % align xtr = new_xtr + struct.pack(" None: while size > 0: data = fhi.read(min(size, blocksize)) if not data: break size -= len(data) fho.write(data) if size != 0: raise ZipError("Unexpected EOF") def extract_meta(signed_apk: str) -> Iterator[Tuple[zipfile.ZipInfo, bytes]]: """ Extract v1 signature metadata files from signed APK. Yields (ZipInfo, data) pairs. >>> from apksigcopier import extract_meta >>> apk = "test/apks/apks/golden-aligned-v1v2v3-out.apk" >>> meta = tuple(extract_meta(apk)) >>> [ x.filename for x, _ in meta ] ['META-INF/RSA-2048.SF', 'META-INF/RSA-2048.RSA', 'META-INF/MANIFEST.MF'] >>> for line in meta[0][1].splitlines()[:4]: ... print(line.decode()) Signature-Version: 1.0 Created-By: 1.0 (Android) SHA-256-Digest-Manifest: hz7AxDJU9Namxoou/kc4Z2GVRS9anCGI+M52tbCsXT0= X-Android-APK-Signed: 2, 3 >>> for line in meta[2][1].splitlines()[:2]: ... print(line.decode()) Manifest-Version: 1.0 Created-By: 1.8.0_45-internal (Oracle Corporation) """ with zipfile.ZipFile(signed_apk, "r") as zf_sig: for info in zf_sig.infolist(): if is_meta(info.filename): yield info, zf_sig.read(info.filename) def extract_differences(signed_apk: str, extracted_meta: ZipInfoDataPairs) \ -> Optional[Dict[str, Any]]: """ Extract ZIP metadata differences from signed APK. >>> import apksigcopier as asc, pprint >>> apk = "test/apks/apks/debuggable-boolean.apk" >>> meta = tuple(asc.extract_meta(apk)) >>> [ x.filename for x, _ in meta ] ['META-INF/CERT.SF', 'META-INF/CERT.RSA', 'META-INF/MANIFEST.MF'] >>> diff = asc.extract_differences(apk, meta) >>> pprint.pprint(diff) {'files': {'META-INF/CERT.RSA': {'flag_bits': 2056}, 'META-INF/CERT.SF': {'flag_bits': 2056}, 'META-INF/MANIFEST.MF': {'flag_bits': 2056}}} >>> meta[2][0].extract_version = 42 >>> try: ... asc.extract_differences(apk, meta) ... except asc.ZipError as e: ... print(e) Unsupported extract_version >>> asc.validate_differences(diff) is None True >>> diff["files"]["META-INF/OOPS"] = {} >>> asc.validate_differences(diff) ".files key 'META-INF/OOPS' is not a metadata file" >>> del diff["files"]["META-INF/OOPS"] >>> diff["files"]["META-INF/CERT.RSA"]["compresslevel"] = 42 >>> asc.validate_differences(diff) ".files['META-INF/CERT.RSA'].compresslevel has an unexpected value" >>> diff["oops"] = 42 >>> asc.validate_differences(diff) 'contains unknown key(s)' """ differences: Dict[str, Any] = {} files = {} for info, data in extracted_meta: diffs = {} for k in VALID_ZIP_META: if k != "compresslevel": v = getattr(info, k) if v != APKZipInfo._override[k]: if v not in VALID_ZIP_META[k]: raise ZipError(f"Unsupported {k}") diffs[k] = v level = _get_compresslevel(signed_apk, info, data) if level != APKZipInfo.COMPRESSLEVEL: diffs["compresslevel"] = level if diffs: files[info.filename] = diffs if files: differences["files"] = files zfe_size = detect_zfe(signed_apk) if zfe_size: differences["zipflinger_virtual_entry"] = zfe_size return differences or None def validate_differences(differences: Dict[str, Any]) -> Optional[str]: """ Validate differences dict. Returns None if valid, error otherwise. """ if set(differences) - {"files", "zipflinger_virtual_entry"}: return "contains unknown key(s)" if "zipflinger_virtual_entry" in differences: if type(differences["zipflinger_virtual_entry"]) is not int: return ".zipflinger_virtual_entry is not an int" if not (30 <= differences["zipflinger_virtual_entry"] <= 4096): return ".zipflinger_virtual_entry is < 30 or > 4096" if "files" in differences: if not isinstance(differences["files"], dict): return ".files is not a dict" for name, info in differences["files"].items(): if not is_meta(name): return f".files key {name!r} is not a metadata file" if not isinstance(info, dict): return f".files[{name!r}] is not a dict" if set(info) - set(VALID_ZIP_META): return f".files[{name!r}] contains unknown key(s)" for k, v in info.items(): if v not in VALID_ZIP_META[k]: return f".files[{name!r}].{k} has an unexpected value" return None def _get_compresslevel(apkfile: str, info: zipfile.ZipInfo, data: bytes) -> int: if info.compress_type != 8: raise ZipError("Unsupported compress_type") crc = _get_compressed_crc(apkfile, info) for level in VALID_ZIP_META["compresslevel"]: comp = zlib.compressobj(level, 8, -15) if zlib.crc32(comp.compress(data) + comp.flush()) == crc: return level raise ZipError("Unsupported compresslevel") def _get_compressed_crc(apkfile: str, info: zipfile.ZipInfo) -> int: with open(apkfile, "rb") as fh: fh.seek(info.header_offset) hdr = fh.read(30) if hdr[:4] != b"\x50\x4b\x03\x04": raise ZipError("Expected local file header signature") n, m = struct.unpack(" None: """ Add v1 signature metadata to APK (removes v2 sig block, if any). >>> import apksigcopier as asc >>> unsigned_apk = "test/apks/apks/golden-aligned-in.apk" >>> signed_apk = "test/apks/apks/golden-aligned-v1v2v3-out.apk" >>> meta = tuple(asc.extract_meta(signed_apk)) >>> [ x.filename for x, _ in meta ] ['META-INF/RSA-2048.SF', 'META-INF/RSA-2048.RSA', 'META-INF/MANIFEST.MF'] >>> with zipfile.ZipFile(unsigned_apk, "r") as zf: ... infos_in = zf.infolist() >>> with tempfile.TemporaryDirectory() as tmpdir: ... out = os.path.join(tmpdir, "out.apk") ... asc.copy_apk(unsigned_apk, out) ... asc.patch_meta(meta, out) ... with zipfile.ZipFile(out, "r") as zf: ... infos_out = zf.infolist() (2017, 5, 15, 11, 28, 40) >>> for i in infos_in: ... print(i.filename) META-INF/ META-INF/MANIFEST.MF AndroidManifest.xml classes.dex temp.txt lib/armeabi/fake.so resources.arsc temp2.txt >>> for i in infos_out: ... print(i.filename) AndroidManifest.xml classes.dex temp.txt lib/armeabi/fake.so resources.arsc temp2.txt META-INF/RSA-2048.SF META-INF/RSA-2048.RSA META-INF/MANIFEST.MF """ with zipfile.ZipFile(output_apk, "r") as zf_out: for info in zf_out.infolist(): if is_meta(info.filename): raise ZipError("Unexpected metadata") with zipfile.ZipFile(output_apk, "a") as zf_out: for info, data in extracted_meta: if differences and "files" in differences: more = differences["files"].get(info.filename, {}).copy() else: more = {} level = more.pop("compresslevel", APKZipInfo.COMPRESSLEVEL) zinfo = APKZipInfo(info, date_time=date_time, **more) zf_out.writestr(zinfo, data, compresslevel=level) def extract_v2_sig(apkfile: str, expected: bool = True) -> Optional[Tuple[int, bytes]]: """ Extract APK Signing Block and offset from APK. When successful, returns (sb_offset, sig_block); otherwise raises NoAPKSigningBlock when expected is True, else returns None. >>> import apksigcopier as asc >>> apk = "test/apks/apks/golden-aligned-v1v2v3-out.apk" >>> sb_offset, sig_block = asc.extract_v2_sig(apk) >>> sb_offset 8192 >>> len(sig_block) 4096 >>> apk = "test/apks/apks/golden-aligned-in.apk" >>> try: ... asc.extract_v2_sig(apk) ... except asc.NoAPKSigningBlock as e: ... print(e) No APK Signing Block """ cd_offset = zip_data(apkfile).cd_offset with open(apkfile, "rb") as fh: fh.seek(cd_offset - 16) if fh.read(16) != b"APK Sig Block 42": if expected: raise NoAPKSigningBlock("No APK Signing Block") return None fh.seek(-24, os.SEEK_CUR) sb_size2 = int.from_bytes(fh.read(8), "little") fh.seek(-sb_size2 + 8, os.SEEK_CUR) sb_size1 = int.from_bytes(fh.read(8), "little") if sb_size1 != sb_size2: raise APKSigningBlockError("APK Signing Block sizes not equal") fh.seek(-8, os.SEEK_CUR) sb_offset = fh.tell() sig_block = fh.read(sb_size2 + 8) return sb_offset, sig_block # FIXME: OSError for APKs < 1024 bytes [wontfix] def zip_data(apkfile: str, count: int = 1024) -> ZipData: """ Extract central directory, EOCD, and offsets from ZIP. Returns ZipData. >>> import apksigcopier >>> apk = "test/apks/apks/golden-aligned-v1v2v3-out.apk" >>> data = apksigcopier.zip_data(apk) >>> data.cd_offset, data.eocd_offset (12288, 12843) >>> len(data.cd_and_eocd) 577 """ with open(apkfile, "rb") as fh: fh.seek(-count, os.SEEK_END) data = fh.read() pos = data.rfind(b"\x50\x4b\x05\x06") if pos == -1: raise ZipError("Expected end of central directory record (EOCD)") fh.seek(pos - len(data), os.SEEK_CUR) eocd_offset = fh.tell() fh.seek(16, os.SEEK_CUR) cd_offset = int.from_bytes(fh.read(4), "little") fh.seek(cd_offset) cd_and_eocd = fh.read() return ZipData(cd_offset, eocd_offset, cd_and_eocd) # FIXME: can we determine signed_sb_offset? def patch_v2_sig(extracted_v2_sig: Tuple[int, bytes], output_apk: str) -> None: """ Implant extracted v2/v3 signature into APK. >>> import apksigcopier as asc >>> unsigned_apk = "test/apks/apks/golden-aligned-in.apk" >>> signed_apk = "test/apks/apks/golden-aligned-v1v2v3-out.apk" >>> meta = tuple(asc.extract_meta(signed_apk)) >>> v2_sig = asc.extract_v2_sig(signed_apk) >>> with tempfile.TemporaryDirectory() as tmpdir: ... out = os.path.join(tmpdir, "out.apk") ... date_time = asc.copy_apk(unsigned_apk, out) ... asc.patch_meta(meta, out, date_time=date_time) ... asc.extract_v2_sig(out, expected=False) is None ... asc.patch_v2_sig(v2_sig, out) ... asc.extract_v2_sig(out) == v2_sig ... with open(signed_apk, "rb") as a, open(out, "rb") as b: ... a.read() == b.read() True True True """ signed_sb_offset, signed_sb = extracted_v2_sig data_out = zip_data(output_apk) if signed_sb_offset < data_out.cd_offset: raise APKSigningBlockError("APK Signing Block offset < central directory offset") padding = b"\x00" * (signed_sb_offset - data_out.cd_offset) offset = len(signed_sb) + len(padding) with open(output_apk, "r+b") as fh: fh.seek(data_out.cd_offset) fh.write(padding) fh.write(signed_sb) fh.write(data_out.cd_and_eocd) fh.seek(data_out.eocd_offset + offset + 16) fh.write(int.to_bytes(data_out.cd_offset + offset, 4, "little")) def patch_apk(extracted_meta: ZipInfoDataPairs, extracted_v2_sig: Optional[Tuple[int, bytes]], unsigned_apk: str, output_apk: str, *, differences: Optional[Dict[str, Any]] = None, exclude: Optional[Callable[[str], bool]] = None) -> None: """Patch extracted_meta + extracted_v2_sig (if not None) onto unsigned_apk and save as output_apk.""" if differences and "zipflinger_virtual_entry" in differences: zfe_size = differences["zipflinger_virtual_entry"] else: zfe_size = None date_time = copy_apk(unsigned_apk, output_apk, exclude=exclude, zfe_size=zfe_size) patch_meta(extracted_meta, output_apk, date_time=date_time, differences=differences) if extracted_v2_sig is not None: patch_v2_sig(extracted_v2_sig, output_apk) # FIXME: support multiple signers? def do_extract(signed_apk: str, output_dir: str, v1_only: NoAutoYesBoolNone = NO, *, ignore_differences: bool = False) -> None: """ Extract signatures from signed_apk and save in output_dir. The v1_only parameter controls whether the absence of a v1 signature is considered an error or not: * use v1_only=NO (or v1_only=False) to only accept (v1+)v2/v3 signatures; * use v1_only=AUTO (or v1_only=None) to automatically detect v2/v3 signatures; * use v1_only=YES (or v1_only=True) to ignore any v2/v3 signatures. """ v1_only = noautoyes(v1_only) extracted_meta = tuple(extract_meta(signed_apk)) if len(extracted_meta) not in (len(META_EXT), 0): raise APKSigCopierError("Unexpected or missing metadata files in signed_apk") for info, data in extracted_meta: name = os.path.basename(info.filename) with open(os.path.join(output_dir, name), "wb") as fh: fh.write(data) if v1_only == YES: if not extracted_meta: raise APKSigCopierError("Expected v1 signature") return expected = v1_only == NO extracted_v2_sig = extract_v2_sig(signed_apk, expected=expected) if extracted_v2_sig is None: if not extracted_meta: raise APKSigCopierError("Expected v1 and/or v2/v3 signature, found neither") return signed_sb_offset, signed_sb = extracted_v2_sig with open(os.path.join(output_dir, SIGOFFSET), "w") as fh: fh.write(str(signed_sb_offset) + "\n") with open(os.path.join(output_dir, SIGBLOCK), "wb") as fh: fh.write(signed_sb) if not ignore_differences: differences = extract_differences(signed_apk, extracted_meta) if differences: with open(os.path.join(output_dir, "differences.json"), "w") as fh: json.dump(differences, fh, sort_keys=True, indent=2) fh.write("\n") # FIXME: support multiple signers? def do_patch(metadata_dir: str, unsigned_apk: str, output_apk: str, v1_only: NoAutoYesBoolNone = NO, *, exclude: Optional[Callable[[str], bool]] = None, ignore_differences: bool = False) -> None: """ Patch signatures from metadata_dir onto unsigned_apk and save as output_apk. The v1_only parameter controls whether the absence of a v1 signature is considered an error or not: * use v1_only=NO (or v1_only=False) to only accept (v1+)v2/v3 signatures; * use v1_only=AUTO (or v1_only=None) to automatically detect v2/v3 signatures; * use v1_only=YES (or v1_only=True) to ignore any v2/v3 signatures. """ v1_only = noautoyes(v1_only) extracted_meta = [] differences = None for pat in META_EXT: files = [fn for ext in pat.split("|") for fn in glob.glob(os.path.join(metadata_dir, "*." + ext))] if len(files) != 1: continue info = zipfile.ZipInfo("META-INF/" + os.path.basename(files[0])) with open(files[0], "rb") as fh: extracted_meta.append((info, fh.read())) if len(extracted_meta) not in (len(META_EXT), 0): raise APKSigCopierError("Unexpected or missing files in metadata_dir") if v1_only == YES: extracted_v2_sig = None else: sigoffset_file = os.path.join(metadata_dir, SIGOFFSET) sigblock_file = os.path.join(metadata_dir, SIGBLOCK) if v1_only == AUTO and not os.path.exists(sigblock_file): extracted_v2_sig = None else: with open(sigoffset_file, "r") as fh: signed_sb_offset = int(fh.read()) with open(sigblock_file, "rb") as fh: signed_sb = fh.read() extracted_v2_sig = signed_sb_offset, signed_sb differences_file = os.path.join(metadata_dir, "differences.json") if not ignore_differences and os.path.exists(differences_file): with open(differences_file, "r") as fh: try: differences = json.load(fh) except json.JSONDecodeError as e: raise APKSigCopierError(f"Invalid differences.json: {e}") # pylint: disable=W0707 error = validate_differences(differences) if error: raise APKSigCopierError(f"Invalid differences.json: {error}") if not extracted_meta and extracted_v2_sig is None: raise APKSigCopierError("Expected v1 and/or v2/v3 signature, found neither") patch_apk(extracted_meta, extracted_v2_sig, unsigned_apk, output_apk, differences=differences, exclude=exclude) def do_copy(signed_apk: str, unsigned_apk: str, output_apk: str, v1_only: NoAutoYesBoolNone = NO, *, exclude: Optional[Callable[[str], bool]] = None, ignore_differences: bool = False) -> None: """ Copy signatures from signed_apk onto unsigned_apk and save as output_apk. The v1_only parameter controls whether the absence of a v1 signature is considered an error or not: * use v1_only=NO (or v1_only=False) to only accept (v1+)v2/v3 signatures; * use v1_only=AUTO (or v1_only=None) to automatically detect v2/v3 signatures; * use v1_only=YES (or v1_only=True) to ignore any v2/v3 signatures. """ v1_only = noautoyes(v1_only) extracted_meta = tuple(extract_meta(signed_apk)) differences = None if v1_only == YES: extracted_v2_sig = None else: extracted_v2_sig = extract_v2_sig(signed_apk, expected=v1_only == NO) if extracted_v2_sig is not None and not ignore_differences: differences = extract_differences(signed_apk, extracted_meta) patch_apk(extracted_meta, extracted_v2_sig, unsigned_apk, output_apk, differences=differences, exclude=exclude) # vim: set tw=80 sw=4 sts=4 et fdm=marker : ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.888382 fdroidserver-2.3a1/fdroidserver/asynchronousfilereader/0000755000175000017500000000000014620351546022264 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/asynchronousfilereader/__init__.py0000644000175000017500000000250614620351225024372 0ustar00hanshans"""Simple thread based asynchronous file reader for Python. AsynchronousFileReader ====================== see https://github.com/soxofaan/asynchronousfilereader MIT License Copyright (c) 2014 Stefaan Lippens """ __version__ = '0.2.1' import threading try: # Python 2 from Queue import Queue except ImportError: # Python 3 from queue import Queue class AsynchronousFileReader(threading.Thread): """Helper class to implement asynchronous reading of a file in a separate thread. Pushes read lines on a queue to be consumed in another thread. """ def __init__(self, fd, queue=None, autostart=True): self._fd = fd if queue is None: queue = Queue() self.queue = queue threading.Thread.__init__(self) if autostart: self.start() def run(self): """Read lines and put them on the queue (the body of the tread).""" while True: line = self._fd.readline() if not line: break self.queue.put(line) def eof(self): """Check whether there is no more content to expect.""" return not self.is_alive() and self.queue.empty() def readlines(self): """Get currently available lines.""" while not self.queue.empty(): yield self.queue.get() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/btlog.py0000755000175000017500000002314714620351225017173 0ustar00hanshans#!/usr/bin/env python3 """Update the binary transparency log for a URL.""" # # btlog.py - part of the FDroid server tools # Copyright (C) 2017, Hans-Christoph Steiner # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # This is for creating a binary transparency log in a git repo for any # F-Droid repo accessible via HTTP. It is meant to run very often, # even once a minute in a cronjob, so it uses HEAD requests and the # HTTP ETag to check if the file has changed. HEAD requests should # not count against the download counts. This pattern of a HEAD then # a GET is what fdroidclient uses to avoid ETags being abused as # cookies. This also uses the same HTTP User Agent as the F-Droid # client app so its not easy for the server to distinguish this from # the F-Droid client. import collections import defusedxml.minidom import git import glob import os import json import logging import requests import shutil import tempfile import zipfile from argparse import ArgumentParser from typing import Optional from . import _ from . import common from . import deploy from .exception import FDroidException def make_binary_transparency_log( repodirs: collections.abc.Iterable, btrepo: str = 'binary_transparency', url: Optional[str] = None, commit_title: str = 'fdroid update', ): """Log the indexes in a standalone git repo to serve as a "binary transparency" log. Parameters ---------- repodirs The directories of the F-Droid repository to generate the binary transparency log for. btrepo The path to the Git repository of the binary transparency log. url The URL of the F-Droid repository to generate the binary transparency log for. commit_title The commit title for commits in the binary transparency log Git repository. Notes ----- Also see https://www.eff.org/deeplinks/2014/02/open-letter-to-tech-companies . """ logging.info('Committing indexes to ' + btrepo) if os.path.exists(os.path.join(btrepo, '.git')): gitrepo = git.Repo(btrepo) else: if not os.path.exists(btrepo): os.mkdir(btrepo) gitrepo = git.Repo.init(btrepo, initial_branch=deploy.GIT_BRANCH) if not url: url = common.config['repo_url'].rstrip('/') with open(os.path.join(btrepo, 'README.md'), 'w') as fp: fp.write( """ # Binary Transparency Log for %s This is a log of the signed app index metadata. This is stored in a git repo, which serves as an imperfect append-only storage mechanism. People can then check that any file that they received from that F-Droid repository was a publicly released file. For more info on this idea: * https://wiki.mozilla.org/Security/Binary_Transparency """ % url[: url.rindex('/')] # strip '/repo' ) gitrepo.index.add(['README.md']) gitrepo.index.commit('add README') for repodir in repodirs: cpdir = os.path.join(btrepo, repodir) if not os.path.exists(cpdir): os.mkdir(cpdir) for f in ('index.xml', 'index-v1.json', 'index-v2.json', 'entry.json'): repof = os.path.join(repodir, f) if not os.path.exists(repof): continue dest = os.path.join(cpdir, f) if f.endswith('.xml'): doc = defusedxml.minidom.parse(repof) output = doc.toprettyxml(encoding='utf-8') with open(dest, 'wb') as f: f.write(output) elif f.endswith('.json'): with open(repof) as fp: output = json.load(fp, object_pairs_hook=collections.OrderedDict) with open(dest, 'w') as fp: json.dump(output, fp, indent=2) gitrepo.index.add([repof]) for f in ('index.jar', 'index-v1.jar', 'entry.jar'): repof = os.path.join(repodir, f) if not os.path.exists(repof): continue dest = os.path.join(cpdir, f) jarin = zipfile.ZipFile(repof, 'r') jarout = zipfile.ZipFile(dest, 'w') for info in jarin.infolist(): if info.filename.startswith('META-INF/'): jarout.writestr(info, jarin.read(info.filename)) jarout.close() jarin.close() gitrepo.index.add([repof]) output_files = [] for root, dirs, files in os.walk(repodir): for f in files: output_files.append(os.path.relpath(os.path.join(root, f), repodir)) output = collections.OrderedDict() for f in sorted(output_files): repofile = os.path.join(repodir, f) stat = os.stat(repofile) output[f] = ( stat.st_size, stat.st_ctime_ns, stat.st_mtime_ns, stat.st_mode, stat.st_uid, stat.st_gid, ) fslogfile = os.path.join(cpdir, 'filesystemlog.json') with open(fslogfile, 'w') as fp: json.dump(output, fp, indent=2) gitrepo.index.add([os.path.join(repodir, 'filesystemlog.json')]) for f in glob.glob(os.path.join(cpdir, '*.HTTP-headers.json')): gitrepo.index.add([os.path.join(repodir, os.path.basename(f))]) gitrepo.index.commit(commit_title) def main(): """Generate or update a binary transparency log for a F-Droid repository. The behaviour of this function is influenced by the configuration file as well as command line parameters. Raises ------ :exc:`~fdroidserver.exception.FDroidException` If the specified or default Git repository does not exist. """ parser = ArgumentParser() common.setup_global_opts(parser) parser.add_argument( "--git-repo", default=os.path.join(os.getcwd(), 'binary_transparency'), help=_("Path to the git repo to use as the log"), ) parser.add_argument( "-u", "--url", default='https://f-droid.org', help=_("The base URL for the repo to log (default: https://f-droid.org)"), ) parser.add_argument( "--git-remote", default=None, help=_("Push the log to this git remote repository"), ) options = common.parse_args(parser) if options.verbose: logging.getLogger("requests").setLevel(logging.INFO) logging.getLogger("urllib3").setLevel(logging.INFO) else: logging.getLogger("requests").setLevel(logging.WARNING) logging.getLogger("urllib3").setLevel(logging.WARNING) if not os.path.exists(options.git_repo): raise FDroidException( '"%s" does not exist! Create it, or use --git-repo' % options.git_repo ) session = requests.Session() new_files = False repodirs = ('repo', 'archive') tempdirbase = tempfile.mkdtemp(prefix='.fdroid-btlog-') for repodir in repodirs: # TODO read HTTP headers for etag from git repo tempdir = os.path.join(tempdirbase, repodir) os.makedirs(tempdir, exist_ok=True) gitrepodir = os.path.join(options.git_repo, repodir) os.makedirs(gitrepodir, exist_ok=True) for f in ( 'entry.jar', 'entry.json', 'index-v1.jar', 'index-v1.json', 'index-v2.json', 'index.jar', 'index.xml', ): dlfile = os.path.join(tempdir, f) dlurl = options.url + '/' + repodir + '/' + f http_headers_file = os.path.join(gitrepodir, f + '.HTTP-headers.json') headers = {'User-Agent': 'F-Droid 0.102.3'} etag = None if os.path.exists(http_headers_file): with open(http_headers_file) as fp: etag = json.load(fp)['ETag'] r = session.head(dlurl, headers=headers, allow_redirects=False) if r.status_code != 200: logging.debug( 'HTTP Response (%d), did not download %s' % (r.status_code, dlurl) ) continue if etag and etag == r.headers.get('ETag'): logging.debug('ETag matches, did not download ' + dlurl) continue r = session.get(dlurl, headers=headers, allow_redirects=False) if r.status_code == 200: with open(dlfile, 'wb') as f: for chunk in r: f.write(chunk) dump = dict() for k, v in r.headers.items(): dump[k] = v with open(http_headers_file, 'w') as fp: json.dump(dump, fp, indent=2, sort_keys=True) new_files = True if new_files: os.chdir(tempdirbase) make_binary_transparency_log( repodirs, options.git_repo, options.url, 'fdroid btlog' ) if options.git_remote: deploy.push_binary_transparency(options.git_repo, options.git_remote) shutil.rmtree(tempdirbase, ignore_errors=True) if __name__ == "__main__": main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/build.py0000644000175000017500000016701314620351225017161 0ustar00hanshans#!/usr/bin/env python3 """Build a package from source.""" # # build.py - part of the FDroid server tools # Copyright (C) 2010-2014, Ciaran Gultnieks, ciaran@ciarang.com # Copyright (C) 2013-2014 Daniel Martí # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import os import shutil import glob import subprocess import posixpath import re import tarfile import threading import traceback import time import requests import tempfile import argparse import logging from gettext import ngettext from pathlib import Path from . import _ from . import common from . import net from . import metadata from . import scanner from . import vmtools from .common import FDroidPopen from .exception import FDroidException, BuildException, VCSException try: import paramiko except ImportError: pass buildserverid = None ssh_channel = None # Note that 'force' here also implies test mode. def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): """Do a build on the builder vm. Parameters ---------- app The metadata of the app to build. build The build of the app to build. vcs The version control system controller object of the app. build_dir The local source-code checkout directory of the app. output_dir The target folder for the build result. log_dir The directory in the VM where the build logs are getting stored. force Don't refresh the already cloned repository and make the build stop on exceptions. Raises ------ :exc:`~fdroidserver.exception.BuildException` If Paramiko is not installed, a srclib directory or srclib metadata file is unexpectedly missing, the build process in the VM failed or output files of the build process are missing. :exc:`~fdroidserver.exception.FDroidException` If the Buildserver ID could not be obtained or copying a directory to the server failed. """ global buildserverid, ssh_channel try: paramiko except NameError as e: raise BuildException("Paramiko is required to use the buildserver") from e if options.verbose: logging.getLogger("paramiko").setLevel(logging.INFO) else: logging.getLogger("paramiko").setLevel(logging.WARN) sshinfo = vmtools.get_clean_builder('builder') output = None try: if not buildserverid: try: buildserverid = subprocess.check_output(['vagrant', 'ssh', '-c', 'cat /home/vagrant/buildserverid'], cwd='builder').strip().decode() logging.debug(_('Fetched buildserverid from VM: {buildserverid}') .format(buildserverid=buildserverid)) except Exception as e: if type(buildserverid) is not str or not re.match('^[0-9a-f]{40}$', buildserverid): logging.info(subprocess.check_output(['vagrant', 'status'], cwd="builder")) raise FDroidException("Could not obtain buildserverid from buldserver VM. " "(stored inside the buildserver VM at '/home/vagrant/buildserverid') " "Please reset your buildserver, the setup VM is broken.") from e # Open SSH connection... logging.info("Connecting to virtual machine...") sshs = paramiko.SSHClient() sshs.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # nosec B507 only connects to local VM sshs.connect(sshinfo['hostname'], username=sshinfo['user'], port=sshinfo['port'], timeout=300, look_for_keys=False, key_filename=sshinfo['idfile']) homedir = posixpath.join('/home', sshinfo['user']) # Get an SFTP connection... ftp = sshs.open_sftp() ftp.get_channel().settimeout(60) # Put all the necessary files in place... ftp.chdir(homedir) def send_dir(path): """Copy the contents of a directory to the server.""" logging.debug("rsyncing %s to %s" % (path, ftp.getcwd())) # TODO this should move to `vagrant rsync` from >= v1.5 try: subprocess.check_output(['rsync', '--recursive', '--perms', '--links', '--quiet', '--rsh=' + 'ssh -o StrictHostKeyChecking=no' + ' -o UserKnownHostsFile=/dev/null' + ' -o LogLevel=FATAL' + ' -o IdentitiesOnly=yes' + ' -o PasswordAuthentication=no' + ' -p ' + str(sshinfo['port']) + ' -i ' + sshinfo['idfile'], path, sshinfo['user'] + "@" + sshinfo['hostname'] + ":" + ftp.getcwd()], stderr=subprocess.STDOUT) except subprocess.CalledProcessError as e: raise FDroidException(str(e), e.output.decode()) from e logging.info("Preparing server for build...") serverpath = os.path.abspath(os.path.dirname(__file__)) ftp.mkdir('fdroidserver') ftp.chdir('fdroidserver') ftp.put(os.path.join(serverpath, '..', 'fdroid'), 'fdroid') ftp.put(os.path.join(serverpath, '..', 'gradlew-fdroid'), 'gradlew-fdroid') ftp.chmod('fdroid', 0o755) # nosec B103 permissions are appropriate ftp.chmod('gradlew-fdroid', 0o755) # nosec B103 permissions are appropriate send_dir(os.path.join(serverpath)) ftp.chdir(homedir) ftp.put(os.path.join(serverpath, '..', 'buildserver', 'config.buildserver.yml'), 'config.yml') ftp.chmod('config.yml', 0o600) # Copy over the ID (head commit hash) of the fdroidserver in use... with open(os.path.join(os.getcwd(), 'tmp', 'fdroidserverid'), 'wb') as fp: fp.write(subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=serverpath)) ftp.put('tmp/fdroidserverid', 'fdroidserverid') # Copy the metadata - just the file for this app... ftp.mkdir('metadata') ftp.mkdir('srclibs') ftp.chdir('metadata') ftp.put(app.metadatapath, os.path.basename(app.metadatapath)) # And patches if there are any... if os.path.exists(os.path.join('metadata', app.id)): send_dir(os.path.join('metadata', app.id)) ftp.chdir(homedir) # Create the build directory... ftp.mkdir('build') ftp.chdir('build') ftp.mkdir('extlib') ftp.mkdir('srclib') # Copy any extlibs that are required... if build.extlibs: ftp.chdir(posixpath.join(homedir, 'build', 'extlib')) for lib in build.extlibs: lib = lib.strip() libsrc = os.path.join('build/extlib', lib) if not os.path.exists(libsrc): raise BuildException("Missing extlib {0}".format(libsrc)) lp = lib.split('/') for d in lp[:-1]: if d not in ftp.listdir(): ftp.mkdir(d) ftp.chdir(d) ftp.put(libsrc, lp[-1]) for _ignored in lp[:-1]: ftp.chdir('..') # Copy any srclibs that are required... srclibpaths = [] if build.srclibs: for lib in build.srclibs: srclibpaths.append( common.getsrclib(lib, 'build/srclib', basepath=True, prepare=False)) # If one was used for the main source, add that too. basesrclib = vcs.getsrclib() if basesrclib: srclibpaths.append(basesrclib) for name, number, lib in srclibpaths: logging.info("Sending srclib '%s'" % lib) ftp.chdir(posixpath.join(homedir, 'build', 'srclib')) if not os.path.exists(lib): raise BuildException("Missing srclib directory '" + lib + "'") fv = '.fdroidvcs-' + name ftp.put(os.path.join('build/srclib', fv), fv) send_dir(lib) # Copy the metadata file too... ftp.chdir(posixpath.join(homedir, 'srclibs')) srclibsfile = os.path.join('srclibs', name + '.yml') if os.path.isfile(srclibsfile): ftp.put(srclibsfile, os.path.basename(srclibsfile)) else: raise BuildException(_('cannot find required srclibs: "{path}"') .format(path=srclibsfile)) # Copy the main app source code # (no need if it's a srclib) if (not basesrclib) and os.path.exists(build_dir): ftp.chdir(posixpath.join(homedir, 'build')) fv = '.fdroidvcs-' + app.id ftp.put(os.path.join('build', fv), fv) send_dir(build_dir) # Execute the build script... logging.info("Starting build...") ssh_channel = sshs.get_transport().open_session() ssh_channel.get_pty() cmdline = posixpath.join(homedir, 'fdroidserver', 'fdroid') cmdline += ' build --on-server' if force: cmdline += ' --force --test' if options.verbose: cmdline += ' --verbose' if options.refresh_scanner or config.get('refresh_scanner'): cmdline += ' --refresh-scanner' if options.skipscan: cmdline += ' --skip-scan' if options.notarball: cmdline += ' --no-tarball' if (options.scan_binary or config.get('scan_binary')) and not options.skipscan: cmdline += ' --scan-binary' cmdline += " %s:%s" % (app.id, build.versionCode) ssh_channel.exec_command('bash --login -c "' + cmdline + '"') # nosec B601 inputs are sanitized # Fetch build process output ... try: cmd_stdout = ssh_channel.makefile('rb', 1024) output = bytes() output += common.get_android_tools_version_log().encode() while not ssh_channel.exit_status_ready(): line = cmd_stdout.readline() if line: if options.verbose: logging.debug("buildserver > " + str(line, 'utf-8', 'replace').rstrip()) output += line else: time.sleep(0.05) for line in cmd_stdout.readlines(): if options.verbose: logging.debug("buildserver > " + str(line, 'utf-8', 'replace').rstrip()) output += line finally: cmd_stdout.close() # Check build process exit status ... logging.info("...getting exit status") returncode = ssh_channel.recv_exit_status() if returncode != 0: if timeout_event.is_set(): message = "Timeout exceeded! Build VM force-stopped for {0}:{1}" else: message = "Build.py failed on server for {0}:{1}" raise BuildException(message.format(app.id, build.versionName), str(output, 'utf-8', 'replace')) # Retreive logs... toolsversion_log = common.get_toolsversion_logname(app, build) try: ftp.chdir(posixpath.join(homedir, log_dir)) ftp.get(toolsversion_log, os.path.join(log_dir, toolsversion_log)) logging.debug('retrieved %s', toolsversion_log) except Exception as e: logging.warning('could not get %s from builder vm: %s' % (toolsversion_log, e)) # Retrieve the built files... logging.info("Retrieving build output...") if force: ftp.chdir(posixpath.join(homedir, 'tmp')) else: ftp.chdir(posixpath.join(homedir, 'unsigned')) apkfile = common.get_release_filename(app, build) tarball = common.getsrcname(app, build) try: ftp.get(apkfile, os.path.join(output_dir, apkfile)) if not options.notarball: ftp.get(tarball, os.path.join(output_dir, tarball)) except Exception as exc: raise BuildException( "Build failed for {0}:{1} - missing output files".format( app.id, build.versionName), str(output, 'utf-8', 'replace')) from exc ftp.close() finally: # Suspend the build server. vm = vmtools.get_build_vm('builder') logging.info('destroying buildserver after build') vm.destroy() # deploy logfile to repository web server if output: common.deploy_build_log_with_rsync(app.id, build.versionCode, output) else: logging.debug('skip publishing full build logs: ' 'no output present') def force_gradle_build_tools(build_dir, build_tools): """Manipulate build tools version used in top level gradle file. Parameters ---------- build_dir The directory to start looking for gradle files. build_tools The build tools version that should be forced to use. """ for root, dirs, files in os.walk(build_dir): for filename in files: if not filename.endswith('.gradle'): continue path = os.path.join(root, filename) if not os.path.isfile(path): continue logging.debug("Forcing build-tools %s in %s" % (build_tools, path)) common.regsub_file(r"""(\s*)buildToolsVersion([\s=]+).*""", r"""\1buildToolsVersion\2'%s'""" % build_tools, path) def transform_first_char(string, method): """Use method() on the first character of string.""" if len(string) == 0: return string if len(string) == 1: return method(string) return method(string[0]) + string[1:] def get_metadata_from_apk(app, build, apkfile): """Get the required metadata from the built APK. VersionName is allowed to be a blank string, i.e. '' Parameters ---------- app The app metadata used to build the APK. build The build that resulted in the APK. apkfile The path of the APK file. Returns ------- versionCode The versionCode from the APK or from the metadata is build.novcheck is set. versionName The versionName from the APK or from the metadata is build.novcheck is set. Raises ------ :exc:`~fdroidserver.exception.BuildException` If native code should have been built but was not packaged, no version information or no package ID could be found or there is a mismatch between the package ID in the metadata and the one found in the APK. """ appid, versionCode, versionName = common.get_apk_id(apkfile) native_code = common.get_native_code(apkfile) if build.buildjni and build.buildjni != ['no'] and not native_code: raise BuildException("Native code should have been built but none was packaged") if build.novcheck: versionCode = build.versionCode versionName = build.versionName if not versionCode or versionName is None: raise BuildException("Could not find version information in build in output") if not appid: raise BuildException("Could not find package ID in output") if appid != app.id: raise BuildException("Wrong package ID - build " + appid + " but expected " + app.id) return versionCode, versionName def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, extlib_dir, tmp_dir, force, onserver, refresh): """Do a build locally. Parameters ---------- app The metadata of the app to build. build The build of the app to build. vcs The version control system controller object of the app. build_dir The local source-code checkout directory of the app. output_dir The target folder for the build result. log_dir The directory in the VM where the build logs are getting stored. srclib_dir The path to the srclibs directory, usually 'build/srclib'. extlib_dir The path to the extlibs directory, usually 'build/extlib'. tmp_dir The temporary directory for building the source tarball. force Don't refresh the already cloned repository and make the build stop on exceptions. onserver Assume the build is happening inside the VM. refresh Enable fetching the latest refs from the VCS remote. Raises ------ :exc:`~fdroidserver.exception.BuildException` If running a `sudo` command failed, locking the root account failed, `sudo` couldn't be removed, cleaning the build environment failed, skipping the scanning has been requested but `scandelete` is present, errors occurred during scanning, running the `build` commands from the metadata failed, building native code failed, building with the specified build method failed, no output could be found with build method `maven`, more or less than one APK were found with build method `gradle`, less or more than one APKs match the `output` glob specified in the metadata, running a `postbuild` command specified in the metadata failed, the built APK is debuggable, the unsigned APK is not at the expected location, the APK does not contain the expected `versionName` and `versionCode` or undesired package names have been found in the APK. :exc:`~fdroidserver.exception.FDroidException` If no Android NDK version could be found and the build isn't run in a builder VM, the selected Android NDK is not a directory. """ ndk_path = build.ndk_path() if build.ndk or (build.buildjni and build.buildjni != ['no']): if not ndk_path: logging.warning("Android NDK version '%s' could not be found!" % build.ndk) logging.warning("Configured versions:") for k, v in config['ndk_paths'].items(): if k.endswith("_orig"): continue logging.warning(" %s: %s" % (k, v)) if onserver: common.auto_install_ndk(build) else: raise FDroidException() elif not os.path.isdir(ndk_path): logging.critical("Android NDK '%s' is not a directory!" % ndk_path) raise FDroidException() common.set_FDroidPopen_env(build) # create ..._toolsversion.log when running in builder vm if onserver: # before doing anything, run the sudo commands to setup the VM if build.sudo: logging.info("Running 'sudo' commands in %s" % os.getcwd()) p = FDroidPopen(['sudo', 'DEBIAN_FRONTEND=noninteractive', 'bash', '-e', '-u', '-o', 'pipefail', '-x', '-c', '; '.join(build.sudo)]) if p.returncode != 0: raise BuildException("Error running sudo command for %s:%s" % (app.id, build.versionName), p.output) p = FDroidPopen(['sudo', 'passwd', '--lock', 'root']) if p.returncode != 0: raise BuildException("Error locking root account for %s:%s" % (app.id, build.versionName), p.output) p = FDroidPopen(['sudo', 'SUDO_FORCE_REMOVE=yes', 'dpkg', '--purge', 'sudo']) if p.returncode != 0: raise BuildException("Error removing sudo for %s:%s" % (app.id, build.versionName), p.output) log_path = os.path.join(log_dir, common.get_toolsversion_logname(app, build)) with open(log_path, 'w') as f: f.write(common.get_android_tools_version_log()) else: if build.sudo: logging.warning('%s:%s runs this on the buildserver with sudo:\n\t%s\nThese commands were skipped because fdroid build is not running on a dedicated build server.' % (app.id, build.versionName, build.sudo)) # Prepare the source code... root_dir, srclibpaths = common.prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver, refresh) # We need to clean via the build tool in case the binary dirs are # different from the default ones p = None gradletasks = [] bmethod = build.build_method() if bmethod == 'maven': logging.info("Cleaning Maven project...") cmd = [config['mvn3'], 'clean', '-Dandroid.sdk.path=' + config['sdk_path']] if '@' in build.maven: maven_dir = os.path.join(root_dir, build.maven.split('@', 1)[1]) maven_dir = os.path.normpath(maven_dir) else: maven_dir = root_dir p = FDroidPopen(cmd, cwd=maven_dir) elif bmethod == 'gradle': logging.info("Cleaning Gradle project...") if build.preassemble: gradletasks += build.preassemble flavours = build.gradle if flavours == ['yes']: flavours = [] flavours_cmd = ''.join([transform_first_char(flav, str.upper) for flav in flavours]) gradletasks += ['assemble' + flavours_cmd + 'Release'] cmd = [config['gradle']] if build.gradleprops: cmd += ['-P' + kv for kv in build.gradleprops] cmd += ['clean'] p = FDroidPopen(cmd, cwd=root_dir, envs={"GRADLE_VERSION_DIR": config['gradle_version_dir'], "CACHEDIR": config['cachedir']}) elif bmethod == 'ant': logging.info("Cleaning Ant project...") p = FDroidPopen(['ant', 'clean'], cwd=root_dir) if p is not None and p.returncode != 0: raise BuildException("Error cleaning %s:%s" % (app.id, build.versionName), p.output) for root, dirs, files in os.walk(build_dir): def del_dirs(dl): for d in dl: shutil.rmtree(os.path.join(root, d), ignore_errors=True) def del_files(fl): for f in fl: if f in files: os.remove(os.path.join(root, f)) if any(f in files for f in ['build.gradle', 'build.gradle.kts', 'settings.gradle', 'settings.gradle.kts']): # Even when running clean, gradle stores task/artifact caches in # .gradle/ as binary files. To avoid overcomplicating the scanner, # manually delete them, just like `gradle clean` should have removed # the build/* dirs. del_dirs([os.path.join('build', 'android-profile'), os.path.join('build', 'generated'), os.path.join('build', 'intermediates'), os.path.join('build', 'outputs'), os.path.join('build', 'reports'), os.path.join('build', 'tmp'), os.path.join('buildSrc', 'build'), '.gradle']) del_files(['gradlew', 'gradlew.bat']) if 'pom.xml' in files: del_dirs(['target']) if any(f in files for f in ['ant.properties', 'project.properties', 'build.xml']): del_dirs(['bin', 'gen']) if 'jni' in dirs: del_dirs(['obj']) if options.skipscan: if build.scandelete: raise BuildException("Refusing to skip source scan since scandelete is present") else: # Scan before building... logging.info("Scanning source for common problems...") scanner.options = options # pass verbose through count = scanner.scan_source(build_dir, build) if count > 0: if force: logging.warning(ngettext('Scanner found {} problem', 'Scanner found {} problems', count).format(count)) else: raise BuildException(ngettext( "Can't build due to {} error while scanning", "Can't build due to {} errors while scanning", count).format(count)) if not options.notarball: # Build the source tarball right before we build the release... logging.info("Creating source tarball...") tarname = common.getsrcname(app, build) tarball = tarfile.open(os.path.join(tmp_dir, tarname), "w:gz") def tarexc(t): return None if any(t.name.endswith(s) for s in ['.svn', '.git', '.hg', '.bzr']) else t tarball.add(build_dir, tarname, filter=tarexc) tarball.close() # Run a build command if one is required... if build.build: logging.info("Running 'build' commands in %s" % root_dir) cmd = common.replace_config_vars("; ".join(build.build), build) # Substitute source library paths into commands... for name, number, libpath in srclibpaths: cmd = cmd.replace('$$' + name + '$$', os.path.join(os.getcwd(), libpath)) p = FDroidPopen(['bash', '-e', '-u', '-o', 'pipefail', '-x', '-c', cmd], cwd=root_dir) if p.returncode != 0: raise BuildException("Error running build command for %s:%s" % (app.id, build.versionName), p.output) # Build native stuff if required... if build.buildjni and build.buildjni != ['no']: logging.info("Building the native code") jni_components = build.buildjni if jni_components == ['yes']: jni_components = [''] cmd = [os.path.join(ndk_path, "ndk-build"), "-j1"] for d in jni_components: if d: logging.info("Building native code in '%s'" % d) else: logging.info("Building native code in the main project") manifest = os.path.join(root_dir, d, 'AndroidManifest.xml') if os.path.exists(manifest): # Read and write the whole AM.xml to fix newlines and avoid # the ndk r8c or later 'wordlist' errors. The outcome of this # under gnu/linux is the same as when using tools like # dos2unix, but the native python way is faster and will # work in non-unix systems. manifest_text = open(manifest, 'U').read() open(manifest, 'w').write(manifest_text) # In case the AM.xml read was big, free the memory del manifest_text p = FDroidPopen(cmd, cwd=os.path.join(root_dir, d)) if p.returncode != 0: raise BuildException("NDK build failed for %s:%s" % (app.id, build.versionName), p.output) p = None # Build the release... if bmethod == 'maven': logging.info("Building Maven project...") if '@' in build.maven: maven_dir = os.path.join(root_dir, build.maven.split('@', 1)[1]) else: maven_dir = root_dir mvncmd = [config['mvn3'], '-Dandroid.sdk.path=' + config['sdk_path'], '-Dmaven.jar.sign.skip=true', '-Dmaven.test.skip=true', '-Dandroid.sign.debug=false', '-Dandroid.release=true', 'package'] if build.target: target = build.target.split('-')[1] common.regsub_file(r'[0-9]*', r'%s' % target, os.path.join(root_dir, 'pom.xml')) if '@' in build.maven: common.regsub_file(r'[0-9]*', r'%s' % target, os.path.join(maven_dir, 'pom.xml')) p = FDroidPopen(mvncmd, cwd=maven_dir) bindir = os.path.join(root_dir, 'target') elif bmethod == 'gradle': logging.info("Building Gradle project...") cmd = [config['gradle']] if build.gradleprops: cmd += ['-P' + kv for kv in build.gradleprops] cmd += gradletasks p = FDroidPopen(cmd, cwd=root_dir, envs={"GRADLE_VERSION_DIR": config['gradle_version_dir'], "CACHEDIR": config['cachedir']}) elif bmethod == 'ant': logging.info("Building Ant project...") cmd = ['ant'] if build.antcommands: cmd += build.antcommands else: cmd += ['release'] p = FDroidPopen(cmd, cwd=root_dir) bindir = os.path.join(root_dir, 'bin') if os.path.isdir(os.path.join(build_dir, '.git')): import git commit_id = common.get_head_commit_id(git.repo.Repo(build_dir)) else: commit_id = build.commit if p is not None and p.returncode != 0: raise BuildException("Build failed for %s:%s@%s" % (app.id, build.versionName, commit_id), p.output) logging.info("Successfully built version {versionName} of {appid} from {commit_id}" .format(versionName=build.versionName, appid=app.id, commit_id=commit_id)) omethod = build.output_method() if omethod == 'maven': stdout_apk = '\n'.join([ line for line in p.output.splitlines() if any( a in line for a in ('.apk', '.ap_', '.jar'))]) m = re.match(r".*^\[INFO\] .*apkbuilder.*/([^/]*)\.apk", stdout_apk, re.S | re.M) if not m: m = re.match(r".*^\[INFO\] Creating additional unsigned apk file .*/([^/]+)\.apk[^l]", stdout_apk, re.S | re.M) if not m: m = re.match(r'.*^\[INFO\] [^$]*aapt \[package,[^$]*' + bindir + r'/([^/]+)\.ap[_k][,\]]', stdout_apk, re.S | re.M) if not m: m = re.match(r".*^\[INFO\] Building jar: .*/" + bindir + r"/(.+)\.jar", stdout_apk, re.S | re.M) if not m: raise BuildException('Failed to find output') src = m.group(1) src = os.path.join(bindir, src) + '.apk' elif omethod == 'gradle': src = None apk_dirs = [ # gradle plugin >= 3.0 os.path.join(root_dir, 'build', 'outputs', 'apk', 'release'), # gradle plugin < 3.0 and >= 0.11 os.path.join(root_dir, 'build', 'outputs', 'apk'), # really old path os.path.join(root_dir, 'build', 'apk'), ] # If we build with gradle flavours with gradle plugin >= 3.0 the APK will be in # a subdirectory corresponding to the flavour command used, but with different # capitalization. if flavours_cmd: apk_dirs.append(os.path.join(root_dir, 'build', 'outputs', 'apk', transform_first_char(flavours_cmd, str.lower), 'release')) for apks_dir in apk_dirs: for apkglob in ['*-release-unsigned.apk', '*-unsigned.apk', '*.apk']: apks = glob.glob(os.path.join(apks_dir, apkglob)) if len(apks) > 1: raise BuildException('More than one resulting apks found in %s' % apks_dir, '\n'.join(apks)) if len(apks) == 1: src = apks[0] break if src is not None: break if src is None: raise BuildException('Failed to find any output apks') elif omethod == 'ant': stdout_apk = '\n'.join([ line for line in p.output.splitlines() if '.apk' in line]) src = re.match(r".*^.*Creating (.+) for release.*$.*", stdout_apk, re.S | re.M).group(1) src = os.path.join(bindir, src) elif omethod == 'raw': output_path = common.replace_build_vars(build.output, build) globpath = os.path.join(root_dir, output_path) apks = glob.glob(globpath) if len(apks) > 1: raise BuildException('Multiple apks match %s' % globpath, '\n'.join(apks)) if len(apks) < 1: raise BuildException('No apks match %s' % globpath) src = os.path.normpath(apks[0]) # Run a postbuild command if one is required... if build.postbuild: logging.info(f"Running 'postbuild' commands in {root_dir}") cmd = common.replace_config_vars("; ".join(build.postbuild), build) # Substitute source library paths into commands... for name, number, libpath in srclibpaths: cmd = cmd.replace(f"$${name}$$", str(Path.cwd() / libpath)) cmd = cmd.replace('$$OUT$$', str(Path(src).resolve())) p = FDroidPopen(['bash', '-e', '-u', '-o', 'pipefail', '-x', '-c', cmd], cwd=root_dir) if p.returncode != 0: raise BuildException("Error running postbuild command for " f"{app.id}:{build.versionName}", p.output) # Make sure it's not debuggable... if common.is_debuggable_or_testOnly(src): raise BuildException( "%s: debuggable or testOnly set in AndroidManifest.xml" % src ) # By way of a sanity check, make sure the version and version # code in our new APK match what we expect... logging.debug("Checking " + src) if not os.path.exists(src): raise BuildException("Unsigned APK is not at expected location of " + src) if common.get_file_extension(src) == 'apk': vercode, version = get_metadata_from_apk(app, build, src) if version != build.versionName or vercode != build.versionCode: raise BuildException(("Unexpected version/version code in output;" " APK: '%s' / '%d', " " Expected: '%s' / '%d'") % (version, vercode, build.versionName, build.versionCode)) if (options.scan_binary or config.get('scan_binary')) and not options.skipscan: if scanner.scan_binary(src): raise BuildException("Found blocklisted packages in final apk!") # Copy the unsigned APK to our destination directory for further # processing (by publish.py)... dest = os.path.join( output_dir, common.get_release_filename( app, build, common.get_file_extension(src) ) ) shutil.copyfile(src, dest) # Move the source tarball into the output directory... if output_dir != tmp_dir and not options.notarball: shutil.move(os.path.join(tmp_dir, tarname), os.path.join(output_dir, tarname)) def trybuild(app, build, build_dir, output_dir, log_dir, also_check_dir, srclib_dir, extlib_dir, tmp_dir, repo_dir, vcs, test, server, force, onserver, refresh): """Build a particular version of an application, if it needs building. Parameters ---------- app The metadata of the app to build. build The build of the app to build. build_dir The local source-code checkout directory of the app. output_dir The directory where the build output will go. Usually this is the 'unsigned' directory. log_dir The directory in the VM where the build logs are getting stored. also_check_dir An additional location for checking if the build is necessary (usually the archive repo). srclib_dir The path to the srclibs directory, usually 'build/srclib'. extlib_dir The path to the extlibs directory, usually 'build/extlib'. tmp_dir The temporary directory for building the source tarball of the app to build. repo_dir The repo directory - used for checking if the build is necessary. vcs The version control system controller object of the app to build. test True if building in test mode, in which case the build will always happen, even if the output already exists. In test mode, the output directory should be a temporary location, not any of the real ones. server Use buildserver VM for building. force Build app regardless of disabled state or scanner errors. onserver Assume the build is happening inside the VM. refresh Enable fetching the latest refs from the VCS remote. Returns ------- status True if the build was done, False if it wasn't necessary. """ dest_file = common.get_release_filename(app, build) dest = os.path.join(output_dir, dest_file) dest_repo = os.path.join(repo_dir, dest_file) if not test: if os.path.exists(dest) or os.path.exists(dest_repo): return False if also_check_dir: dest_also = os.path.join(also_check_dir, dest_file) if os.path.exists(dest_also): return False if build.disable and not options.force: return False logging.info("Building version %s (%s) of %s" % ( build.versionName, build.versionCode, app.id)) if server: # When using server mode, still keep a local cache of the repo, by # grabbing the source now. vcs.gotorevision(build.commit, refresh) # Initialise submodules if required if build.submodules: vcs.initsubmodules() build_server(app, build, vcs, build_dir, output_dir, log_dir, force) else: build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, extlib_dir, tmp_dir, force, onserver, refresh) return True def force_halt_build(timeout): """Halt the currently running Vagrant VM, to be called from a Timer. Parameters ---------- timeout The timeout in seconds. """ logging.error(_('Force halting build after {0} sec timeout!').format(timeout)) timeout_event.set() if ssh_channel: ssh_channel.close() vm = vmtools.get_build_vm('builder') vm.destroy() def keep_when_not_allowed(): """Control if APKs signed by keys not in AllowedAPKSigningKeys are removed.""" return ( (options is not None and options.keep_when_not_allowed) or (config is not None and config.get('keep_when_not_allowed')) or common.default_config['keep_when_not_allowed'] ) def parse_commandline(): """Parse the command line. Returns ------- options The resulting options parsed from the command line arguments. parser The argument parser. """ parser = argparse.ArgumentParser(usage="%(prog)s [options] [APPID[:VERCODE] [APPID[:VERCODE] ...]]") common.setup_global_opts(parser) parser.add_argument("appid", nargs='*', help=_("application ID with optional versionCode in the form APPID[:VERCODE]")) parser.add_argument("-l", "--latest", action="store_true", default=False, help=_("Build only the latest version of each package")) parser.add_argument("-s", "--stop", action="store_true", default=False, help=_("Make the build stop on exceptions")) parser.add_argument("-t", "--test", action="store_true", default=False, help=_("Test mode - put output in the tmp directory only, and always build, even if the output already exists.")) parser.add_argument("--server", action="store_true", default=False, help=_("Use build server")) parser.add_argument("--reset-server", action="store_true", default=False, help=_("Reset and create a brand new build server, even if the existing one appears to be ok.")) # this option is internal API for telling fdroid that # it's running inside a buildserver vm. parser.add_argument("--on-server", dest="onserver", action="store_true", default=False, help=argparse.SUPPRESS) parser.add_argument("--skip-scan", dest="skipscan", action="store_true", default=False, help=_("Skip scanning the source code for binaries and other problems")) parser.add_argument("--scan-binary", action="store_true", default=False, help=_("Scan the resulting APK(s) for known non-free classes.")) parser.add_argument("--no-tarball", dest="notarball", action="store_true", default=False, help=_("Don't create a source tarball, useful when testing a build")) parser.add_argument("--no-refresh", dest="refresh", action="store_false", default=True, help=_("Don't refresh the repository, useful when testing a build with no internet connection")) parser.add_argument("-r", "--refresh-scanner", dest="refresh_scanner", action="store_true", default=False, help=_("Refresh and cache scanner rules and signatures from the network")) parser.add_argument("-f", "--force", action="store_true", default=False, help=_("Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode.")) parser.add_argument("-a", "--all", action="store_true", default=False, help=_("Build all applications available")) parser.add_argument("--keep-when-not-allowed", default=False, action="store_true", help=argparse.SUPPRESS) parser.add_argument("-w", "--wiki", default=False, action="store_true", help=argparse.SUPPRESS) metadata.add_metadata_arguments(parser) options = common.parse_args(parser) metadata.warnings_action = options.W # Force --stop with --on-server to get correct exit code if options.onserver: options.stop = True if options.force and not options.test: parser.error("option %s: Force is only allowed in test mode" % "force") return options, parser options = None config = None fdroidserverid = None start_timestamp = time.gmtime() status_output = None timeout_event = threading.Event() def main(): """Build a package from source. The behaviour of this function is influenced by the configuration file as well as command line parameters. Raises ------ :exc:`~fdroidserver.exception.FDroidException` If more than one local metadata file has been found, no app metadata has been found, there are no apps to process, downloading binaries for checking the reproducibility of a built binary failed, the built binary is different from supplied reference binary, the reference binary is signed with a different signing key than expected, a VCS error occured while building an app or a different error occured while building an app. """ global options, config, buildserverid, fdroidserverid options, parser = parse_commandline() # The defaults for .fdroid.* metadata that is included in a git repo are # different than for the standard metadata/ layout because expectations # are different. In this case, the most common user will be the app # developer working on the latest update of the app on their own machine. local_metadata_files = common.get_local_metadata_files() if len(local_metadata_files) == 1: # there is local metadata in an app's source config = dict(common.default_config) # `fdroid build` should build only the latest version by default since # most of the time the user will be building the most recent update if not options.all: options.latest = True elif len(local_metadata_files) > 1: raise FDroidException("Only one local metadata file allowed! Found: " + " ".join(local_metadata_files)) else: if not os.path.isdir('metadata') and len(local_metadata_files) == 0: raise FDroidException("No app metadata found, nothing to process!") if not options.appid and not options.all: parser.error("option %s: If you really want to build all the apps, use --all" % "all") config = common.read_config() if config['build_server_always']: options.server = True if options.reset_server and not options.server: parser.error("option %s: Using --reset-server without --server makes no sense" % "reset-server") log_dir = 'logs' if not os.path.isdir(log_dir): logging.info("Creating log directory") os.makedirs(log_dir) tmp_dir = 'tmp' if not os.path.isdir(tmp_dir): logging.info("Creating temporary directory") os.makedirs(tmp_dir) if options.test: output_dir = tmp_dir else: output_dir = 'unsigned' if not os.path.isdir(output_dir): logging.info("Creating output directory") os.makedirs(output_dir) binaries_dir = os.path.join(output_dir, 'binaries') if config['archive_older'] != 0: also_check_dir = 'archive' else: also_check_dir = None if options.onserver: status_output = dict() # HACK dummy placeholder else: status_output = common.setup_status_output(start_timestamp) repo_dir = 'repo' build_dir = 'build' if not os.path.isdir(build_dir): logging.info("Creating build directory") os.makedirs(build_dir) srclib_dir = os.path.join(build_dir, 'srclib') extlib_dir = os.path.join(build_dir, 'extlib') # Read all app and srclib metadata pkgs = common.read_pkg_args(options.appid, True) allapps = metadata.read_metadata(pkgs, sort_by_time=True) apps = common.read_app_args(options.appid, allapps, True) for appid, app in list(apps.items()): if (app.get('Disabled') and not options.force) or not app.get('RepoType') or not app.get('Builds', []): del apps[appid] if not apps: raise FDroidException("No apps to process.") # make sure enough open files are allowed to process everything try: import resource # not available on Windows soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE) if len(apps) > soft: try: soft = len(apps) * 2 if soft > hard: soft = hard resource.setrlimit(resource.RLIMIT_NOFILE, (soft, hard)) logging.debug(_('Set open file limit to {integer}') .format(integer=soft)) except (OSError, ValueError) as e: logging.warning(_('Setting open file limit failed: ') + str(e)) except ImportError: pass if options.latest: for app in apps.values(): for build in reversed(app.get('Builds', [])): if build.disable and not options.force: continue app['Builds'] = [build] break if not options.onserver: common.write_running_status_json(status_output) # Build applications... failed_builds = [] build_succeeded_ids = [] status_output['failedBuilds'] = failed_builds status_output['successfulBuildIds'] = build_succeeded_ids # Only build for 72 hours, then stop gracefully. endtime = time.time() + 72 * 60 * 60 max_build_time_reached = False for appid, app in apps.items(): first = True for build in app.get('Builds', []): if time.time() > endtime: max_build_time_reached = True break # Enable watchdog timer (2 hours by default). if build.timeout is None: timeout = 7200 else: timeout = build.timeout if options.server and timeout > 0: logging.debug(_('Setting {0} sec timeout for this build').format(timeout)) timer = threading.Timer(timeout, force_halt_build, [timeout]) timeout_event.clear() timer.start() else: timer = None tools_version_log = '' try: # For the first build of a particular app, we need to set up # the source repo. We can reuse it on subsequent builds, if # there are any. if first: vcs, build_dir = common.setup_vcs(app) first = False logging.debug("Checking %s:%s" % (appid, build.versionCode)) if trybuild(app, build, build_dir, output_dir, log_dir, also_check_dir, srclib_dir, extlib_dir, tmp_dir, repo_dir, vcs, options.test, options.server, options.force, options.onserver, options.refresh): toolslog = os.path.join(log_dir, common.get_toolsversion_logname(app, build)) if not options.onserver and os.path.exists(toolslog): with open(toolslog, 'r') as f: tools_version_log = ''.join(f.readlines()) os.remove(toolslog) if url := build.binary or app.Binaries: # This is an app where we build from source, and # verify the APK contents against a developer's # binary. We get that binary now, and save it # alongside our built one in the 'unsigend' # directory. if not os.path.isdir(binaries_dir): os.makedirs(binaries_dir) logging.info("Created directory for storing " "developer supplied reference " "binaries: '{path}'" .format(path=binaries_dir)) url = url.replace('%v', build.versionName) url = url.replace('%c', str(build.versionCode)) logging.info("...retrieving " + url) of = re.sub(r'\.apk$', '.binary.apk', common.get_release_filename(app, build)) of = os.path.join(binaries_dir, of) try: net.download_file(url, local_filename=of) except requests.exceptions.HTTPError as e: raise FDroidException( 'Downloading Binaries from %s failed.' % url) from e # Now we check whether the build can be verified to # match the supplied binary or not. Should the # comparison fail, we mark this build as a failure # and remove everything from the unsigend folder. with tempfile.TemporaryDirectory() as tmpdir: unsigned_apk = \ common.get_release_filename(app, build) unsigned_apk = \ os.path.join(output_dir, unsigned_apk) compare_result = \ common.verify_apks(of, unsigned_apk, tmpdir) if compare_result: if options.test: logging.warning(_('Keeping failed build "{apkfilename}"') .format(apkfilename=unsigned_apk)) else: logging.debug('removing %s', unsigned_apk) os.remove(unsigned_apk) logging.debug('removing %s', of) os.remove(of) compare_result = compare_result.split('\n') line_count = len(compare_result) compare_result = compare_result[:299] if line_count > len(compare_result): line_difference = \ line_count - len(compare_result) compare_result.append('%d more lines ...' % line_difference) compare_result = '\n'.join(compare_result) raise FDroidException('compared built binary ' 'to supplied reference ' 'binary but failed', compare_result) else: logging.info('compared built binary to ' 'supplied reference binary ' 'successfully') used_key = common.apk_signer_fingerprint(of) expected_keys = app['AllowedAPKSigningKeys'] if used_key is None: logging.warn(_('reference binary missing ' 'signature')) elif len(expected_keys) == 0: logging.warn(_('AllowedAPKSigningKeys missing ' 'but reference binary supplied')) elif used_key not in expected_keys: if options.test or keep_when_not_allowed(): logging.warning(_('Keeping failed build "{apkfilename}"') .format(apkfilename=unsigned_apk)) else: logging.debug('removing %s', unsigned_apk) os.remove(unsigned_apk) logging.debug('removing %s', of) os.remove(of) raise FDroidException('supplied reference ' 'binary signed with ' '{signer} instead of ' 'with {expected}'. format(signer=used_key, expected=expected_keys)) else: logging.info(_('supplied reference binary has ' 'allowed signer {signer}'). format(signer=used_key)) build_succeeded_ids.append([app['id'], build.versionCode]) if not options.onserver: common.write_running_status_json(status_output) except VCSException as vcse: reason = str(vcse).split('\n', 1)[0] if options.verbose else str(vcse) logging.error("VCS error while building app %s: %s" % ( appid, reason)) if options.stop: logging.debug("Error encountered, stopping by user request.") common.force_exit(1) failed_builds.append((appid, build.versionCode)) common.deploy_build_log_with_rsync( appid, build.versionCode, "".join(traceback.format_exc()) ) if not options.onserver: common.write_running_status_json(status_output) except FDroidException as e: tstamp = time.strftime("%Y-%m-%d %H:%M:%SZ", time.gmtime()) with open(os.path.join(log_dir, appid + '.log'), 'a+') as f: f.write('\n\n============================================================\n') f.write('versionCode: %s\nversionName: %s\ncommit: %s\n' % (build.versionCode, build.versionName, build.commit)) f.write('Build completed at ' + tstamp + '\n') f.write('\n' + tools_version_log + '\n') f.write(str(e)) logging.error("Could not build app %s: %s" % (appid, e)) if options.stop: logging.debug("Error encountered, stopping by user request.") common.force_exit(1) failed_builds.append((appid, build.versionCode)) common.deploy_build_log_with_rsync( appid, build.versionCode, "".join(traceback.format_exc()) ) if not options.onserver: common.write_running_status_json(status_output) except Exception: logging.error("Could not build app %s due to unknown error: %s" % ( appid, traceback.format_exc())) if options.stop: logging.debug("Error encountered, stopping by user request.") common.force_exit(1) failed_builds.append((appid, build.versionCode)) common.deploy_build_log_with_rsync( appid, build.versionCode, "".join(traceback.format_exc()) ) if not options.onserver: common.write_running_status_json(status_output) if timer: timer.cancel() # kill the watchdog timer if max_build_time_reached: status_output['maxBuildTimeReached'] = True logging.info("Stopping after global build timeout...") break for app in build_succeeded_ids: logging.info("success: %s" % app[0]) if not options.verbose: for fb in failed_builds: logging.info('Build for app {}:{} failed'.format(*fb)) logging.info(_("Finished")) if len(build_succeeded_ids) > 0: logging.info(ngettext("{} build succeeded", "{} builds succeeded", len(build_succeeded_ids)).format(len(build_succeeded_ids))) if len(failed_builds) > 0: logging.info(ngettext("{} build failed", "{} builds failed", len(failed_builds)).format(len(failed_builds))) if options.server: if os.cpu_count(): status_output['hostOsCpuCount'] = os.cpu_count() if os.path.isfile('/proc/meminfo') and os.access('/proc/meminfo', os.R_OK): with open('/proc/meminfo') as fp: for line in fp: m = re.search(r'MemTotal:\s*([0-9].*)', line) if m: status_output['hostProcMeminfoMemTotal'] = m.group(1) break buildserver_config = 'builder/Vagrantfile' if os.path.isfile(buildserver_config) and os.access(buildserver_config, os.R_OK): with open(buildserver_config) as configfile: for line in configfile: m = re.search(r'cpus\s*=\s*([0-9].*)', line) if m: status_output['guestVagrantVmCpus'] = m.group(1) m = re.search(r'memory\s*=\s*([0-9].*)', line) if m: status_output['guestVagrantVmMemory'] = m.group(1) if buildserverid: status_output['buildserver'] = {'commitId': buildserverid} if not options.onserver: common.write_status_json(status_output) # hack to ensure this exits, even is some threads are still running common.force_exit() if __name__ == "__main__": main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/checkupdates.py0000644000175000017500000006426014620351225020525 0ustar00hanshans#!/usr/bin/env python3 """Check for updates to applications.""" # # checkupdates.py - part of the FDroid server tools # Copyright (C) 2010-2015, Ciaran Gultnieks, ciaran@ciarang.com # Copyright (C) 2013-2014 Daniel Martí # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import os import re import urllib.request import urllib.error import time import subprocess import sys from argparse import ArgumentParser import traceback import logging import copy import urllib.parse from pathlib import Path from typing import Optional from . import _ from . import common from . import metadata from . import net from .exception import VCSException, NoSubmodulesException, FDroidException, MetaDataException def check_http(app: metadata.App) -> tuple[Optional[str], Optional[int]]: """Check for a new version by looking at a document retrieved via HTTP. The app's UpdateCheckData field is used to provide the information required. Parameters ---------- app The App instance to check for updates for. Returns ------- version The found versionName or None if the versionName should be ignored according to UpdateCheckIgnore. vercode The found versionCode or None if the versionCode should be ignored according to UpdateCheckIgnore. Raises ------ :exc:`~fdroidserver.exception.FDroidException` If UpdateCheckData is missing or is an invalid URL or if there is no match for the provided versionName or versionCode regex. """ if not app.UpdateCheckData: raise FDroidException('Missing Update Check Data') urlcode, codeex, urlver, verex = app.UpdateCheckData.split('|') parsed = urllib.parse.urlparse(urlcode) if not parsed.netloc or not parsed.scheme or parsed.scheme != 'https': raise FDroidException(_('UpdateCheckData has invalid URL: {url}').format(url=urlcode)) if urlver != '.': parsed = urllib.parse.urlparse(urlver) if not parsed.netloc or not parsed.scheme or parsed.scheme != 'https': raise FDroidException(_('UpdateCheckData has invalid URL: {url}').format(url=urlver)) logging.debug("...requesting {0}".format(urlcode)) req = urllib.request.Request(urlcode, None, headers=net.HEADERS) resp = urllib.request.urlopen(req, None, 20) # nosec B310 scheme is filtered above page = resp.read().decode('utf-8') m = re.search(codeex, page) if not m: raise FDroidException("No RE match for version code") vercode = common.version_code_string_to_int(m.group(1).strip()) if urlver != '.': logging.debug("...requesting {0}".format(urlver)) req = urllib.request.Request(urlver, None) resp = urllib.request.urlopen(req, None, 20) # nosec B310 scheme is filtered above page = resp.read().decode('utf-8') m = re.search(verex, page) if not m: raise FDroidException("No RE match for version") version = m.group(1) if app.UpdateCheckIgnore and re.search(app.UpdateCheckIgnore, version): logging.info("Version {version} for {appid} is ignored".format(version=version, appid=app.id)) return (None, None) return (version, vercode) def check_tags(app: metadata.App, pattern: str) -> tuple[str, int, str]: """Check for a new version by looking at the tags in the source repo. Whether this can be used reliably or not depends on the development procedures used by the project's developers. Use it with caution, because it's inappropriate for many projects. Parameters ---------- app The App instance to check for updates for. pattern The pattern a tag needs to match to be considered. Returns ------- versionName The highest found versionName. versionCode The highest found versionCode. ref The Git reference, commit hash or tag name, of the highest found versionName, versionCode. Raises ------ :exc:`~fdroidserver.exception.MetaDataException` If this function is not suitable for the RepoType of the app or information is missing to perform this type of check. :exc:`~fdroidserver.exception.FDroidException` If no matching tags or no information whatsoever could be found. """ if app.RepoType == 'srclib': build_dir = Path('build/srclib') / app.Repo repotype = common.getsrclibvcs(app.Repo) else: build_dir = Path('build') / app.id repotype = app.RepoType if repotype not in ('git', 'git-svn', 'hg', 'bzr'): raise MetaDataException(_('Tags update mode only works for git, hg, bzr and git-svn repositories currently')) if repotype == 'git-svn' and ';' not in app.Repo: raise MetaDataException(_('Tags update mode used in git-svn, but the repo was not set up with tags')) # Set up vcs interface and make sure we have the latest code... vcs = common.getvcs(app.RepoType, app.Repo, build_dir) vcs.gotorevision(None) last_build = get_last_build_from_app(app) try_init_submodules(app, last_build, vcs) htag = None hver = None hcode = 0 tags = [] if repotype == 'git': tags = vcs.latesttags() else: tags = vcs.gettags() if not tags: raise FDroidException(_('No tags found')) logging.debug("All tags: " + ','.join(tags)) if pattern: pat = re.compile(pattern) tags = [tag for tag in tags if pat.match(tag)] if not tags: raise FDroidException(_('No matching tags found')) logging.debug("Matching tags: " + ','.join(tags)) if len(tags) > 5 and repotype == 'git': tags = tags[:5] logging.debug("Latest tags: " + ','.join(tags)) for tag in tags: logging.debug("Check tag: '{0}'".format(tag)) vcs.gotorevision(tag) try_init_submodules(app, last_build, vcs) if app.UpdateCheckData: filecode, codeex, filever, verex = app.UpdateCheckData.split('|') if filecode: filecode = build_dir / filecode if not filecode.is_file(): logging.debug("UpdateCheckData file {0} not found in tag {1}".format(filecode, tag)) continue filecontent = filecode.read_text() else: filecontent = tag vercode = tag if codeex: m = re.search(codeex, filecontent) if not m: logging.debug(f"UpdateCheckData regex {codeex} for version code" f" has no match in tag {tag}") continue vercode = m.group(1).strip() if filever: if filever != '.': filever = build_dir / filever if filever.is_file(): filecontent = filever.read_text() else: logging.debug("UpdateCheckData file {0} not found in tag {1}".format(filever, tag)) else: filecontent = tag version = tag if verex: m = re.search(verex, filecontent) if not m: logging.debug(f"UpdateCheckData regex {verex} for version name" f" has no match in tag {tag}") continue version = m.group(1) logging.debug("UpdateCheckData found version {0} ({1})" .format(version, vercode)) vercode = common.version_code_string_to_int(vercode) if vercode > hcode: htag = tag hcode = vercode hver = version else: for subdir in possible_subdirs(app): root_dir = build_dir / subdir paths = common.manifest_paths(root_dir, last_build.gradle) version, vercode, _package = common.parse_androidmanifests(paths, app) if version in ('Unknown', 'Ignore'): version = tag if vercode: logging.debug("Manifest exists in subdir '{0}'. Found version {1} ({2})" .format(subdir, version, vercode)) if vercode > hcode: htag = tag hcode = vercode hver = version if hver: if htag != tags[0]: logging.warning( "{appid}: latest tag {tag} does not contain highest version {version}".format( appid=app.id, tag=tags[0], version=hver ) ) try: commit = vcs.getref(htag) if commit: return (hver, hcode, commit) except VCSException: pass return (hver, hcode, htag) raise FDroidException(_("Couldn't find any version information")) def check_repomanifest(app: metadata.App, branch: Optional[str] = None) -> tuple[str, int]: """Check for a new version by looking at the AndroidManifest.xml at the HEAD of the source repo. Whether this can be used reliably or not depends on the development procedures used by the project's developers. Use it with caution, because it's inappropriate for many projects. Parameters ---------- app The App instance to check for updates for. branch The VCS branch where to search for versionCode, versionName. Returns ------- versionName The highest found versionName. versionCode The highest found versionCode. Raises ------ :exc:`~fdroidserver.exception.FDroidException` If no package id or no version information could be found. """ if app.RepoType == 'srclib': build_dir = Path('build/srclib') / app.Repo repotype = common.getsrclibvcs(app.Repo) else: build_dir = Path('build') / app.id repotype = app.RepoType # Set up vcs interface and make sure we have the latest code... vcs = common.getvcs(app.RepoType, app.Repo, build_dir) if repotype == 'git': if branch: branch = 'origin/' + branch vcs.gotorevision(branch) elif repotype == 'git-svn': vcs.gotorevision(branch) elif repotype == 'hg': vcs.gotorevision(branch) elif repotype == 'bzr': vcs.gotorevision(None) last_build = get_last_build_from_app(app) try_init_submodules(app, last_build, vcs) hpak = None hver = None hcode = 0 for subdir in possible_subdirs(app): root_dir = build_dir / subdir paths = common.manifest_paths(root_dir, last_build.gradle) version, vercode, package = common.parse_androidmanifests(paths, app) if vercode: logging.debug("Manifest exists in subdir '{0}'. Found version {1} ({2})" .format(subdir, version, vercode)) if vercode > hcode: hpak = package hcode = vercode hver = version if not hpak: raise FDroidException(_("Couldn't find package ID")) if hver: return (hver, hcode) raise FDroidException(_("Couldn't find any version information")) def try_init_submodules(app: metadata.App, last_build: metadata.Build, vcs: common.vcs): """Try to init submodules if the last build entry uses them. They might have been removed from the app's repo in the meantime, so if we can't find any submodules we continue with the updates check. If there is any other error in initializing them then we stop the check. """ if last_build.submodules: try: vcs.initsubmodules() except NoSubmodulesException: logging.info("No submodules present for {}".format(_getappname(app))) except VCSException: logging.info("submodule broken for {}".format(_getappname(app))) def dirs_with_manifest(startdir: str): """Find directories containing a manifest file. Yield all directories under startdir that contain any of the manifest files, and thus are probably an Android project. Parameters ---------- startdir Directory to be walked down for search Yields ------ path : :class:`pathlib.Path` or None A directory that contains a manifest file of an Android project, None if no directory could be found """ for root, _dirs, files in os.walk(startdir): if any(m in files for m in [ 'AndroidManifest.xml', 'pom.xml', 'build.gradle', 'build.gradle.kts']): yield Path(root) def possible_subdirs(app: metadata.App): """Try to find a new subdir starting from the root build_dir. Yields said subdir relative to the build dir if found, None otherwise. Parameters ---------- app The app to check for subdirs Yields ------ subdir : :class:`pathlib.Path` or None A possible subdir, None if no subdir could be found """ if app.RepoType == 'srclib': build_dir = Path('build/srclib') / app.Repo else: build_dir = Path('build') / app.id last_build = get_last_build_from_app(app) for d in dirs_with_manifest(build_dir): m_paths = common.manifest_paths(d, last_build.gradle) package = common.parse_androidmanifests(m_paths, app)[2] if package is not None: subdir = d.relative_to(build_dir) logging.debug("Adding possible subdir %s" % subdir) yield subdir def _getappname(app: metadata.App) -> str: return common.get_app_display_name(app) def _getcvname(app: metadata.App) -> str: return '%s (%s)' % (app.CurrentVersion, app.CurrentVersionCode) def fetch_autoname(app: metadata.App, tag: str) -> Optional[str]: """Fetch AutoName. Get the to be displayed name of an app from the source code and adjust the App instance in case it is different name has been found. Parameters ---------- app The App instance to get the AutoName for. tag Tag to fetch AutoName at. Returns ------- commitmsg Commit message about the name change. None in case checking for the name is disabled, a VCSException occured or no name could be found. """ if not app.RepoType or app.UpdateCheckMode in ('None', 'Static') \ or app.UpdateCheckName == "Ignore": return None if app.RepoType == 'srclib': build_dir = Path('build/srclib') / app.Repo else: build_dir = Path('build') / app.id try: vcs = common.getvcs(app.RepoType, app.Repo, build_dir) vcs.gotorevision(tag) except VCSException: return None last_build = get_last_build_from_app(app) logging.debug("...fetch auto name from " + str(build_dir)) new_name = None for subdir in possible_subdirs(app): root_dir = build_dir / subdir new_name = common.fetch_real_name(root_dir, last_build.gradle) if new_name is not None: break commitmsg = None if new_name: logging.debug("...got autoname '" + new_name + "'") if new_name != app.AutoName: app.AutoName = new_name if not commitmsg: commitmsg = "Set autoname of {0}".format(_getappname(app)) else: logging.debug("...couldn't get autoname") return commitmsg def operate_vercode(operation: str, vercode: int) -> int: """Calculate a new versionCode from a mathematical operation. Parameters ---------- operation The operation to execute to get the new versionCode. vercode The versionCode for replacing "%c" in the operation. Returns ------- vercode The new versionCode obtained by executing the operation. Raises ------ :exc:`~fdroidserver.exception.MetaDataException` If the operation is invalid. """ if not common.VERCODE_OPERATION_RE.match(operation): raise MetaDataException(_('Invalid VercodeOperation: {field}') .format(field=operation)) oldvercode = vercode op = operation.replace("%c", str(oldvercode)) vercode = common.calculate_math_string(op) logging.debug("Applied vercode operation: %d -> %d" % (oldvercode, vercode)) return vercode def checkupdates_app(app: metadata.App, auto: bool, commit: bool = False) -> None: """Check for new versions and updated name of a single app. Also write back changes to the metadata file and create a Git commit if requested. Parameters ---------- app The app to check for updates for. Raises ------ :exc:`~fdroidserver.exception.MetaDataException` If the app has an invalid UpdateCheckMode or AutoUpdateMode. :exc:`~fdroidserver.exception.FDroidException` If no version information could be found, the current version is newer than the found version, auto-update was requested but an app has no CurrentVersionCode or (Git) commiting the changes failed. """ # If a change is made, commitmsg should be set to a description of it. # Only if this is set, changes will be written back to the metadata. commitmsg = None tag = None mode = app.UpdateCheckMode if mode.startswith('Tags'): pattern = mode[5:] if len(mode) > 4 else None (version, vercode, tag) = check_tags(app, pattern) elif mode == 'RepoManifest': (version, vercode) = check_repomanifest(app) elif mode.startswith('RepoManifest/'): tag = mode[13:] (version, vercode) = check_repomanifest(app, tag) elif mode == 'HTTP': (version, vercode) = check_http(app) elif mode in ('None', 'Static'): logging.debug('Checking disabled') return else: raise MetaDataException(_('Invalid UpdateCheckMode: {mode}').format(mode=mode)) if not version or not vercode: raise FDroidException(_('no version information found')) if app.VercodeOperation: vercodes = sorted([ operate_vercode(operation, vercode) for operation in app.VercodeOperation ]) else: vercodes = [vercode] updating = False if vercodes[-1] == app.CurrentVersionCode: logging.debug("...up to date") elif vercodes[-1] > app.CurrentVersionCode: logging.debug("...updating - old vercode={0}, new vercode={1}".format( app.CurrentVersionCode, vercodes[-1])) app.CurrentVersion = version app.CurrentVersionCode = vercodes[-1] updating = True else: raise FDroidException( _('current version is newer: old vercode={old}, new vercode={new}').format( old=app.CurrentVersionCode, new=vercodes[-1] ) ) commitmsg = fetch_autoname(app, tag) if updating: name = _getappname(app) ver = _getcvname(app) logging.info('...updating to version %s' % ver) commitmsg = 'Update CurrentVersion of %s to %s' % (name, ver) if auto: mode = app.AutoUpdateMode if not app.CurrentVersionCode: raise MetaDataException( _("Can't auto-update app with no CurrentVersionCode") ) elif mode in ('None', 'Static'): pass elif mode.startswith('Version'): pattern = mode[8:] suffix = '' if pattern.startswith('+'): try: suffix, pattern = pattern[1:].split(' ', 1) except ValueError as exc: raise MetaDataException("Invalid AutoUpdateMode: " + mode) from exc gotcur = False latest = None builds = app.get('Builds', []) if builds: latest = builds[-1] if latest.versionCode == app.CurrentVersionCode: gotcur = True elif latest.versionCode > app.CurrentVersionCode: raise FDroidException( _( 'latest build recipe is newer: ' 'old vercode={old}, new vercode={new}' ).format(old=latest.versionCode, new=app.CurrentVersionCode) ) if not gotcur: newbuilds = copy.deepcopy(builds[-len(vercodes):]) # These are either built-in or invalid in newer system versions bookworm_blocklist = [ 'apt-get install -y openjdk-11-jdk', 'apt-get install openjdk-11-jdk-headless', 'apt-get install -y openjdk-11-jdk-headless', 'apt-get install -t stretch-backports openjdk-11-jdk-headless openjdk-11-jre-headless', 'apt-get install -y -t stretch-backports openjdk-11-jdk-headless openjdk-11-jre-headless', 'apt-get install -y openjdk-17-jdk', 'apt-get install openjdk-17-jdk-headless', 'apt-get install -y openjdk-17-jdk-headless', 'update-alternatives --auto java', 'update-java-alternatives -a', ] for build in newbuilds: if "sudo" in build: if any("openjdk-11" in line for line in build["sudo"]) or any("openjdk-17" in line for line in build["sudo"]): build["sudo"] = [line for line in build["sudo"] if line not in bookworm_blocklist] if build["sudo"] == ['apt-get update']: build["sudo"] = '' for b, v in zip(newbuilds, vercodes): b.disable = False b.versionCode = v b.versionName = app.CurrentVersion + suffix.replace( '%c', str(v) ) logging.info("...auto-generating build for " + b.versionName) if tag: b.commit = tag else: commit = pattern.replace('%v', app.CurrentVersion) commit = commit.replace('%c', str(v)) b.commit = commit app['Builds'].extend(newbuilds) name = _getappname(app) ver = _getcvname(app) commitmsg = "Update %s to %s" % (name, ver) else: raise MetaDataException( _('Invalid AutoUpdateMode: {mode}').format(mode=mode) ) if commitmsg: metadata.write_metadata(app.metadatapath, app) if commit: logging.info("Commiting update for " + app.metadatapath) gitcmd = ["git", "commit", "-m", commitmsg] if 'auto_author' in config: gitcmd.extend(['--author', config['auto_author']]) gitcmd.extend(["--", app.metadatapath]) if subprocess.call(gitcmd) != 0: raise FDroidException("Git commit failed") def get_last_build_from_app(app: metadata.App) -> metadata.Build: """Get the last build entry of an app.""" if app.get('Builds'): return app['Builds'][-1] else: return metadata.Build() def status_update_json(processed: list, failed: dict) -> None: """Output a JSON file with metadata about this run.""" logging.debug(_('Outputting JSON')) output = common.setup_status_output(start_timestamp) if processed: output['processed'] = processed if failed: output['failed'] = failed common.write_status_json(output) config = None start_timestamp = time.gmtime() def main(): """Check for updates for one or more apps. The behaviour of this function is influenced by the configuration file as well as command line parameters. """ global config # Parse command line... parser = ArgumentParser() common.setup_global_opts(parser) parser.add_argument("appid", nargs='*', help=_("application ID of file to operate on")) parser.add_argument("--auto", action="store_true", default=False, help=_("Process auto-updates")) parser.add_argument("--autoonly", action="store_true", default=False, help=_("Only process apps with auto-updates")) parser.add_argument("--commit", action="store_true", default=False, help=_("Commit changes")) parser.add_argument("--allow-dirty", action="store_true", default=False, help=_("Run on git repo that has uncommitted changes")) metadata.add_metadata_arguments(parser) options = common.parse_args(parser) metadata.warnings_action = options.W config = common.read_config() if not options.allow_dirty: status = subprocess.check_output(['git', 'status', '--porcelain']) if status: logging.error(_('Build metadata git repo has uncommited changes!')) sys.exit(1) # Get all apps... allapps = metadata.read_metadata() apps = common.read_app_args(options.appid, allapps, False) processed = [] failed = dict() exit_code = 0 for appid, app in apps.items(): if options.autoonly and app.AutoUpdateMode in ('None', 'Static'): logging.debug(_("Nothing to do for {appid}.").format(appid=appid)) continue msg = _("Processing {appid}").format(appid=appid) logging.info(msg) try: checkupdates_app(app, options.auto, options.commit) processed.append(appid) except Exception as e: msg = _("...checkupdate failed for {appid} : {error}").format(appid=appid, error=e) logging.error(msg) logging.debug(traceback.format_exc()) failed[appid] = str(e) exit_code = 1 status_update_json(processed, failed) sys.exit(exit_code) if __name__ == "__main__": main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/common.py0000644000175000017500000052620114620351225017350 0ustar00hanshans#!/usr/bin/env python3 # # common.py - part of the FDroid server tools # # Copyright (C) 2010-2016, Ciaran Gultnieks, ciaran@ciarang.com # Copyright (C) 2013-2017, Daniel Martí # Copyright (C) 2013-2021, Hans-Christoph Steiner # Copyright (C) 2017-2018, Torsten Grote # Copyright (C) 2017, tobiasKaminsky # Copyright (C) 2017-2021, Michael Pöhn # Copyright (C) 2017,2021, mimi89999 # Copyright (C) 2019-2021, Jochen Sprickerhof # Copyright (C) 2021, Felix C. Stegerman # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # common.py is imported by all modules, so do not import third-party # libraries here as they will become a requirement for all commands. import difflib import git import glob import io import os import sys import re import ast import gzip import shutil import stat import subprocess import time import operator import logging import hashlib import socket import base64 import yaml import zipfile import tempfile import json from pathlib import Path import defusedxml.ElementTree as XMLElementTree from asn1crypto import cms from base64 import urlsafe_b64encode from binascii import hexlify from datetime import datetime, timedelta, timezone from queue import Queue from zipfile import ZipFile import fdroidserver.metadata import fdroidserver.lint from fdroidserver import _ from fdroidserver.exception import FDroidException, VCSException, NoSubmodulesException, \ BuildException, VerificationException, MetaDataException from .asynchronousfilereader import AsynchronousFileReader from .looseversion import LooseVersion from . import apksigcopier, common # The path to this fdroidserver distribution FDROID_PATH = os.path.realpath(os.path.join(os.path.dirname(__file__), '..')) # There needs to be a default, and this is the most common for software. DEFAULT_LOCALE = 'en-US' # this is the build-tools version, aapt has a separate version that # has to be manually set in test_aapt_version() MINIMUM_AAPT_BUILD_TOOLS_VERSION = '26.0.0' # 31.0.0 is the first version to support --v4-signing-enabled. # we only require 30.0.0 for now as that's the version in buster-backports, see also signindex.py # 26.0.2 is the first version recognizing md5 based signatures as valid again # (as does android, so we want that) MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION = '30.0.0' VERCODE_OPERATION_RE = re.compile(r'^([ 0-9/*+-]|%c)+$') # A signature block file with a .DSA, .RSA, or .EC extension SIGNATURE_BLOCK_FILE_REGEX = re.compile(r'^META-INF/.*\.(DSA|EC|RSA)$') APK_NAME_REGEX = re.compile(r'^([a-zA-Z][\w.]*)_(-?[0-9]+)_?([0-9a-f]{7})?\.apk') APK_ID_TRIPLET_REGEX = re.compile(r"^package: name='(\w[^']*)' versionCode='([^']+)' versionName='([^']*)'") STANDARD_FILE_NAME_REGEX = re.compile(r'^(\w[\w.]*)_(-?[0-9]+)\.\w+') FDROID_PACKAGE_NAME_REGEX = re.compile(r'''^[a-f0-9]+$''', re.IGNORECASE) STRICT_APPLICATION_ID_REGEX = re.compile(r'''(?:^[a-zA-Z]+(?:\d*[a-zA-Z_]*)*)(?:\.[a-zA-Z]+(?:\d*[a-zA-Z_]*)*)+$''') VALID_APPLICATION_ID_REGEX = re.compile(r'''(?:^[a-z_]+(?:\d*[a-zA-Z_]*)*)(?:\.[a-z_]+(?:\d*[a-zA-Z_]*)*)*$''', re.IGNORECASE) ANDROID_PLUGIN_REGEX = re.compile(r'''\s*(:?apply plugin:|id)\(?\s*['"](android|com\.android\.application)['"]\s*\)?''') SETTINGS_GRADLE_REGEX = re.compile(r'settings\.gradle(?:\.kts)?') GRADLE_SUBPROJECT_REGEX = re.compile(r'''['"]:?([^'"]+)['"]''') MAX_VERSION_CODE = 0x7fffffff # Java's Integer.MAX_VALUE (2147483647) XMLNS_ANDROID = '{http://schemas.android.com/apk/res/android}' # https://docs.gitlab.com/ee/user/gitlab_com/#gitlab-pages GITLAB_COM_PAGES_MAX_SIZE = 1000000000 # the names used for things that are configured per-repo ANTIFEATURES_CONFIG_NAME = 'antiFeatures' CATEGORIES_CONFIG_NAME = 'categories' CONFIG_CONFIG_NAME = 'config' MIRRORS_CONFIG_NAME = 'mirrors' RELEASECHANNELS_CONFIG_NAME = "releaseChannels" CONFIG_NAMES = ( ANTIFEATURES_CONFIG_NAME, CATEGORIES_CONFIG_NAME, CONFIG_CONFIG_NAME, MIRRORS_CONFIG_NAME, RELEASECHANNELS_CONFIG_NAME, ) config = None options = None env = None orig_path = None def get_default_cachedir(): """Get a cachedir, using appdirs for cross-platform, but works without. Once appdirs is installed everywhere, this function can be removed. """ appname = __name__.split('.')[0] try: import appdirs return appdirs.user_cache_dir(appname, 'F-Droid') except ImportError: return str(Path.home() / '.cache' / appname) # All paths in the config must be strings, never pathlib.Path instances default_config = { 'sdk_path': "$ANDROID_HOME", 'ndk_paths': {}, 'cachedir': get_default_cachedir(), 'java_paths': None, 'scan_binary': False, 'ant': "ant", 'mvn3': "mvn", 'gradle': os.path.join(FDROID_PATH, 'gradlew-fdroid'), 'sync_from_local_copy_dir': False, 'allow_disabled_algorithms': False, 'keep_when_not_allowed': False, 'per_app_repos': False, 'make_current_version_link': False, 'current_version_name_source': 'Name', 'deploy_process_logs': False, 'update_stats': False, 'repo_maxage': 0, 'build_server_always': False, 'keystore': 'keystore.p12', 'smartcardoptions': [], 'char_limits': { 'author': 256, 'name': 50, 'summary': 80, 'description': 4000, 'video': 256, 'whatsNew': 500, }, 'keyaliases': {}, 'repo_url': "https://MyFirstFDroidRepo.org/fdroid/repo", 'repo_name': "My First F-Droid Repo Demo", 'repo_icon': "icon.png", 'repo_description': _("""This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid."""), # type: ignore 'archive_name': 'My First F-Droid Archive Demo', 'archive_description': _('These are the apps that have been archived from the main repo.'), # type: ignore 'archive_older': 0, 'lint_licenses': fdroidserver.lint.APPROVED_LICENSES, # type: ignore 'git_mirror_size_limit': 10000000000, 'scanner_signature_sources': ['suss'], } def get_options(): """Return options as set up by parse_args(). This provides an easy way to get the global instance without having to think about very confusing import and submodule visibility. The code should be probably refactored so it does not need this. If each individual option value was always passed to functions as args, for example. https://docs.python.org/3/reference/import.html#submodules """ return fdroidserver.common.options def parse_args(parser): """Call parser.parse_args(), store result in module-level variable and return it. This is needed to set up the copy of the options instance in the fdroidserver.common module. A subcommand only needs to call this if it uses functions from fdroidserver.common that expect the "options" variable to be initialized. """ fdroidserver.common.options = parser.parse_args() return fdroidserver.common.options def setup_global_opts(parser): try: # the buildserver VM might not have PIL installed from PIL import PngImagePlugin logger = logging.getLogger(PngImagePlugin.__name__) logger.setLevel(logging.INFO) # tame the "STREAM" debug messages except ImportError: pass parser.add_argument("-v", "--verbose", action="store_true", default=False, help=_("Spew out even more information than normal")) parser.add_argument("-q", "--quiet", action="store_true", default=False, help=_("Restrict output to warnings and errors")) def set_console_logging(verbose=False): """Globally set logging to output nicely to the console.""" class _StdOutFilter(logging.Filter): def filter(self, record): return record.levelno < logging.ERROR if verbose: level = logging.DEBUG else: level = logging.ERROR stdout_handler = logging.StreamHandler(sys.stdout) stdout_handler.addFilter(_StdOutFilter()) stdout_handler.setFormatter(logging.Formatter('%(message)s')) stderr_handler = logging.StreamHandler(sys.stderr) stderr_handler.setLevel(logging.ERROR) stderr_handler.setFormatter(logging.Formatter(_('ERROR: %(message)s'))) logging.basicConfig( force=True, level=level, handlers=[stdout_handler, stderr_handler] ) def _add_java_paths_to_config(pathlist, thisconfig): def path_version_key(s): versionlist = [] for u in re.split('[^0-9]+', s): try: versionlist.append(int(u)) except ValueError: pass return versionlist for d in sorted(pathlist, key=path_version_key): if os.path.islink(d): continue j = os.path.basename(d) # the last one found will be the canonical one, so order appropriately for regex in [ r'^1\.([126-9][0-9]?)\.0\.jdk$', # OSX r'^jdk1\.([126-9][0-9]?)\.0_[0-9]+.jdk$', # OSX and Oracle tarball r'^jdk1\.([126-9][0-9]?)\.0_[0-9]+$', # Oracle Windows r'^jdk([126-9][0-9]?)-openjdk$', # Arch r'^java-([126-9][0-9]?)-openjdk$', # Arch r'^java-([126-9][0-9]?)-jdk$', # Arch (oracle) r'^java-1\.([126-9][0-9]?)\.0-.*$', # RedHat r'^java-([126-9][0-9]?)-oracle$', # Debian WebUpd8 r'^jdk-([126-9][0-9]?)-oracle-.*$', # Debian make-jpkg r'^java-([126-9][0-9]?)-openjdk-.*$', # Debian r'^oracle-jdk-bin-1\.([126-9][0-9]?).*$', # Gentoo (oracle) r'^icedtea-bin-([126-9][0-9]?).*$', # Gentoo (openjdk) ]: m = re.match(regex, j) if not m: continue for p in [d, os.path.join(d, 'Contents', 'Home')]: if os.path.exists(os.path.join(p, 'bin', 'javac')): thisconfig['java_paths'][m.group(1)] = p def fill_config_defaults(thisconfig): """Fill in the global config dict with relevant defaults. For config values that have a path that can be expanded, e.g. an env var or a ~/, this will store the original value using "_orig" appended to the key name so that if the config gets written out, it will preserve the original, unexpanded string. """ for k, v in default_config.items(): if k not in thisconfig: if isinstance(v, dict) or isinstance(v, list): thisconfig[k] = v.copy() else: thisconfig[k] = v # Expand paths (~users and $vars) def expand_path(path): if path is None: return None orig = path path = os.path.expanduser(path) path = os.path.expandvars(path) if orig == path: return None return path for k in ['sdk_path', 'ant', 'mvn3', 'gradle', 'keystore']: v = thisconfig[k] exp = expand_path(v) if exp is not None: thisconfig[k] = exp thisconfig[k + '_orig'] = v # find all installed JDKs for keytool, jarsigner, and JAVA[6-9]_HOME env vars if thisconfig['java_paths'] is None: thisconfig['java_paths'] = dict() pathlist = [] pathlist += glob.glob('/usr/lib/jvm/j*[126-9]*') pathlist += glob.glob('/usr/java/jdk1.[126-9]*') pathlist += glob.glob('/System/Library/Java/JavaVirtualMachines/1.[126-9][0-9]?.0.jdk') pathlist += glob.glob('/Library/Java/JavaVirtualMachines/*jdk*[0-9]*') pathlist += glob.glob('/opt/oracle-jdk-*1.[0-9]*') pathlist += glob.glob('/opt/icedtea-*[0-9]*') if os.getenv('JAVA_HOME') is not None: pathlist.append(os.getenv('JAVA_HOME')) if os.getenv('PROGRAMFILES') is not None: pathlist += glob.glob(os.path.join(os.getenv('PROGRAMFILES'), 'Java', 'jdk1.[126-9][0-9]?.*')) _add_java_paths_to_config(pathlist, thisconfig) for java_version in range(29, 6, -1): java_version = str(java_version) if java_version not in thisconfig['java_paths']: continue java_home = thisconfig['java_paths'][java_version] jarsigner = os.path.join(java_home, 'bin', 'jarsigner') if os.path.exists(jarsigner): thisconfig['jarsigner'] = jarsigner thisconfig['keytool'] = os.path.join(java_home, 'bin', 'keytool') break if 'jarsigner' not in thisconfig and shutil.which('jarsigner'): thisconfig['jarsigner'] = shutil.which('jarsigner') if 'keytool' not in thisconfig and shutil.which('keytool'): thisconfig['keytool'] = shutil.which('keytool') # enable apksigner by default so v2/v3 APK signatures validate find_apksigner(thisconfig) if not thisconfig.get('apksigner'): logging.warning(_('apksigner not found! Cannot sign or verify modern APKs')) if 'ipfs_cid' not in thisconfig and shutil.which('ipfs_cid'): thisconfig['ipfs_cid'] = shutil.which('ipfs_cid') if not thisconfig.get('ipfs_cid'): logging.debug(_("ipfs_cid not found, skipping CIDv1 generation")) for k in ['ndk_paths', 'java_paths']: d = thisconfig[k] for k2 in d.copy(): v = d[k2] exp = expand_path(v) if exp is not None: thisconfig[k][k2] = exp thisconfig[k][k2 + '_orig'] = v ndk_paths = thisconfig.get('ndk_paths', {}) ndk_bundle = os.path.join(thisconfig['sdk_path'], 'ndk-bundle') if os.path.exists(ndk_bundle): version = get_ndk_version(ndk_bundle) if version not in ndk_paths: ndk_paths[version] = ndk_bundle ndk_dir = os.path.join(thisconfig['sdk_path'], 'ndk') if os.path.exists(ndk_dir): for ndk in glob.glob(os.path.join(ndk_dir, '*')): version = get_ndk_version(ndk) if version not in ndk_paths: ndk_paths[version] = ndk if 'cachedir_scanner' not in thisconfig: thisconfig['cachedir_scanner'] = str(Path(thisconfig['cachedir']) / 'scanner') if 'gradle_version_dir' not in thisconfig: thisconfig['gradle_version_dir'] = str(Path(thisconfig['cachedir']) / 'gradle') def get_config(): """Get the initalized, singleton config instance. config and options are intertwined in read_config(), so they have to be here too. In the current ugly state of things, there are multiple potential instances of config and options in use: * global * module-level in the subcommand module (e.g. fdroidserver/build.py) * module-level in fdroidserver.common There are some insane parts of the code that are probably referring to multiple instances of these at different points. This can be super confusing and maddening. The current intermediate refactoring step is to move all subcommands to always get/set config and options via this function so that there is no longer a distinction between the global and module-level instances. Then there can be only one module-level instance in fdroidserver.common. """ global config if config is not None: return config read_config() # make sure these values are available in common.py even if they didn't # declare global in a scope common.config = config return config def regsub_file(pattern, repl, path): with open(path, 'rb') as f: text = f.read() text = re.sub(bytes(pattern, 'utf8'), bytes(repl, 'utf8'), text) with open(path, 'wb') as f: f.write(text) def config_type_check(path, data): if Path(path).name == 'mirrors.yml': expected_type = list else: expected_type = dict if expected_type == dict: if not isinstance(data, dict): msg = _('{path} is not "key: value" dict, but a {datatype}!') raise TypeError(msg.format(path=path, datatype=type(data).__name__)) elif not isinstance(data, expected_type): msg = _('{path} is not {expected_type}, but a {datatype}!') raise TypeError( msg.format( path=path, expected_type=expected_type.__name__, datatype=type(data).__name__, ) ) def read_config(): """Read the repository config. The config is read from config_file, which is in the current directory when any of the repo management commands are used. If there is a local metadata file in the git repo, then the config is not required, just use defaults. config.yml is the preferred form because no code is executed when reading it. config.py is deprecated and supported for backwards compatibility. config.yml requires ASCII or UTF-8 encoding because this code does not auto-detect the file's encoding. That is left up to the YAML library. YAML allows ASCII, UTF-8, UTF-16, and UTF-32 encodings. Since it is a good idea to manage config.yml (WITHOUT PASSWORDS!) in git, it makes sense to use a globally standard encoding. """ global config if config is not None: return config config = {} config_file = 'config.yml' old_config_file = 'config.py' if os.path.exists(config_file) and os.path.exists(old_config_file): logging.error(_("""Conflicting config files! Using {newfile}, ignoring {oldfile}!""") .format(oldfile=old_config_file, newfile=config_file)) if os.path.exists(config_file): logging.debug(_("Reading '{config_file}'").format(config_file=config_file)) with open(config_file, encoding='utf-8') as fp: config = yaml.safe_load(fp) if not config: config = {} config_type_check(config_file, config) elif os.path.exists(old_config_file): logging.warning(_("""{oldfile} is deprecated, use {newfile}""") .format(oldfile=old_config_file, newfile=config_file)) with io.open(old_config_file, "rb") as fp: code = compile(fp.read(), old_config_file, 'exec') exec(code, None, config) # nosec TODO automatically migrate for k in ('mirrors', 'install_list', 'uninstall_list', 'serverwebroot', 'servergitroot'): if k in config: if not type(config[k]) in (str, list, tuple): logging.warning( _("'{field}' will be in random order! Use () or [] brackets if order is important!") .format(field=k)) # smartcardoptions must be a list since its command line args for Popen smartcardoptions = config.get('smartcardoptions') if isinstance(smartcardoptions, str): sco_items = re.sub(r'\s+', r' ', config['smartcardoptions']).split(' ') config['smartcardoptions'] = [i.strip() for i in sco_items if i] elif not smartcardoptions and 'keystore' in config and config['keystore'] == 'NONE': # keystore='NONE' means use smartcard, these are required defaults config['smartcardoptions'] = ['-storetype', 'PKCS11', '-providerName', 'SunPKCS11-OpenSC', '-providerClass', 'sun.security.pkcs11.SunPKCS11', '-providerArg', 'opensc-fdroid.cfg'] if any(k in config for k in ["keystore", "keystorepass", "keypass"]): if os.path.exists(config_file): f = config_file elif os.path.exists(old_config_file): f = old_config_file st = os.stat(f) if st.st_mode & stat.S_IRWXG or st.st_mode & stat.S_IRWXO: logging.warning(_("unsafe permissions on '{config_file}' (should be 0600)!") .format(config_file=f)) fill_config_defaults(config) if 'serverwebroot' in config: roots = parse_mirrors_config(config['serverwebroot']) rootlist = [] for d in roots: # since this is used with rsync, where trailing slashes have # meaning, ensure there is always a trailing slash rootstr = d['url'] if rootstr[-1] != '/': rootstr += '/' d['url'] = rootstr.replace('//', '/') rootlist.append(d) config['serverwebroot'] = rootlist if 'servergitmirrors' in config: config['servergitmirrors'] = parse_mirrors_config(config['servergitmirrors']) limit = config['git_mirror_size_limit'] config['git_mirror_size_limit'] = parse_human_readable_size(limit) if 'repo_url' in config: if not config['repo_url'].endswith('/repo'): raise FDroidException(_('repo_url needs to end with /repo')) if 'archive_url' in config: if not config['archive_url'].endswith('/archive'): raise FDroidException(_('archive_url needs to end with /archive')) confignames_to_delete = set() for configname, dictvalue in config.items(): if configname == 'java_paths': new = dict() for k, v in dictvalue.items(): new[str(k)] = v config[configname] = new elif configname in ('ndk_paths', 'java_paths', 'char_limits', 'keyaliases'): continue elif isinstance(dictvalue, dict): for k, v in dictvalue.items(): if k == 'env': env = os.getenv(v) if env: config[configname] = env else: confignames_to_delete.add(configname) logging.error(_('Environment variable {var} from {configname} is not set!') .format(var=k, configname=configname)) else: confignames_to_delete.add(configname) logging.error(_('Unknown entry {key} in {configname}') .format(key=k, configname=configname)) for configname in confignames_to_delete: del config[configname] return config def parse_mirrors_config(mirrors): """Mirrors can be specified as a string, list of strings, or dictionary map.""" if isinstance(mirrors, str): return [{"url": mirrors}] elif all(isinstance(item, str) for item in mirrors): return [{'url': i} for i in mirrors] elif all(isinstance(item, dict) for item in mirrors): return mirrors else: raise TypeError(_('only accepts strings, lists, and tuples')) def file_entry(filename, hash_value=None): meta = {} meta["name"] = "/" + Path(filename).as_posix().split("/", 1)[1] meta["sha256"] = hash_value or sha256sum(filename) meta["size"] = os.stat(filename).st_size return meta def load_localized_config(name, repodir): """Load localized config files and put them into internal dict format. This will maintain the order as came from the data files, e.g YAML. The locale comes from unsorted paths on the filesystem, so that is separately sorted. """ ret = dict() found_config_file = False for f in Path().glob("config/**/{name}.yml".format(name=name)): found_config_file = True locale = f.parts[1] if len(f.parts) == 2: locale = DEFAULT_LOCALE with open(f, encoding="utf-8") as fp: elem = yaml.safe_load(fp) if not isinstance(elem, dict): msg = _('{path} is not "key: value" dict, but a {datatype}!') raise TypeError(msg.format(path=f, datatype=type(elem).__name__)) for afname, field_dict in elem.items(): if afname not in ret: ret[afname] = dict() for key, value in field_dict.items(): if key not in ret[afname]: ret[afname][key] = dict() if key == "icon": icons_dir = os.path.join(repodir, 'icons') if not os.path.exists(icons_dir): os.makedirs(icons_dir, exist_ok=True) shutil.copy(os.path.join("config", value), icons_dir) ret[afname][key][locale] = file_entry( os.path.join(icons_dir, value) ) else: ret[afname][key][locale] = value if not found_config_file: for f in Path().glob("config/*.yml"): if f.stem not in CONFIG_NAMES: msg = _('{path} is not a standard config file!').format(path=f) m = difflib.get_close_matches(f.stem, CONFIG_NAMES, 1) if m: msg += ' ' msg += _('Did you mean config/{name}.yml?').format(name=m[0]) logging.error(msg) for elem in ret.values(): for afname in elem: elem[afname] = {locale: v for locale, v in sorted(elem[afname].items())} return ret def parse_human_readable_size(size): units = { 'b': 1, 'kb': 1000, 'mb': 1000**2, 'gb': 1000**3, 'tb': 1000**4, 'kib': 1024, 'mib': 1024**2, 'gib': 1024**3, 'tib': 1024**4, } try: return int(float(size)) except (ValueError, TypeError) as exc: if type(size) != str: raise ValueError(_('Could not parse size "{size}", wrong type "{type}"') .format(size=size, type=type(size))) from exc s = size.lower().replace(' ', '') m = re.match(r'^(?P[0-9][0-9.]*) *(?P' + r'|'.join(units.keys()) + r')$', s) if not m: raise ValueError(_('Not a valid size definition: "{}"').format(size)) from exc return int(float(m.group("value")) * units[m.group("unit")]) def get_dir_size(path_or_str): """Get the total size of all files in the given directory.""" if isinstance(path_or_str, str): path_or_str = Path(path_or_str) return sum(f.stat().st_size for f in path_or_str.glob('**/*') if f.is_file()) def assert_config_keystore(config): """Check weather keystore is configured correctly and raise exception if not.""" nosigningkey = False if 'repo_keyalias' not in config: nosigningkey = True logging.critical(_("'repo_keyalias' not found in config.yml!")) if 'keystore' not in config: nosigningkey = True logging.critical(_("'keystore' not found in config.yml!")) elif config['keystore'] == 'NONE': if not config.get('smartcardoptions'): nosigningkey = True logging.critical(_("'keystore' is NONE and 'smartcardoptions' is blank!")) elif not os.path.exists(config['keystore']): nosigningkey = True logging.critical("'" + config['keystore'] + "' does not exist!") if 'keystorepass' not in config: nosigningkey = True logging.critical(_("'keystorepass' not found in config.yml!")) if 'keypass' not in config and config.get('keystore') != 'NONE': nosigningkey = True logging.critical(_("'keypass' not found in config.yml!")) if nosigningkey: raise FDroidException("This command requires a signing key, " + "you can create one using: fdroid update --create-key") def find_apksigner(config): """Search for the best version apksigner and adds it to the config. Returns the best version of apksigner following this algorithm: * use config['apksigner'] if set * try to find apksigner in path * find apksigner in build-tools starting from newest installed going down to MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION Returns ------- str path to apksigner or None if no version is found """ command = 'apksigner' if command in config: return tmp = find_command(command) if tmp is not None: config[command] = tmp return build_tools_path = os.path.join(config.get('sdk_path', ''), 'build-tools') if not os.path.isdir(build_tools_path): return for f in sorted(os.listdir(build_tools_path), reverse=True): if not os.path.isdir(os.path.join(build_tools_path, f)): continue try: if LooseVersion(f) < LooseVersion(MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION): logging.debug("Local Android SDK only has outdated apksigner versions") return except TypeError: continue if os.path.exists(os.path.join(build_tools_path, f, 'apksigner')): apksigner = os.path.join(build_tools_path, f, 'apksigner') logging.info("Using %s " % apksigner) config['apksigner'] = apksigner return def find_sdk_tools_cmd(cmd): """Find a working path to a tool from the Android SDK.""" tooldirs = [] if config is not None and 'sdk_path' in config and os.path.exists(config['sdk_path']): # try to find a working path to this command, in all the recent possible paths build_tools = os.path.join(config['sdk_path'], 'build-tools') if os.path.isdir(build_tools): for f in sorted(os.listdir(build_tools), reverse=True): if os.path.isdir(os.path.join(build_tools, f)): tooldirs.append(os.path.join(build_tools, f)) sdk_tools = os.path.join(config['sdk_path'], 'tools') if os.path.exists(sdk_tools): tooldirs.append(sdk_tools) tooldirs.append(os.path.join(sdk_tools, 'bin')) sdk_platform_tools = os.path.join(config['sdk_path'], 'platform-tools') if os.path.exists(sdk_platform_tools): tooldirs.append(sdk_platform_tools) sdk_build_tools = glob.glob(os.path.join(config['sdk_path'], 'build-tools', '*.*')) if sdk_build_tools: tooldirs.append(sorted(sdk_build_tools)[-1]) # use most recent version if os.path.exists('/usr/bin'): tooldirs.append('/usr/bin') for d in tooldirs: path = os.path.join(d, cmd) if not os.path.isfile(path): path += '.exe' if os.path.isfile(path): if cmd == 'aapt': test_aapt_version(path) return path # did not find the command, exit with error message test_sdk_exists(config) # ignore result so None is never returned raise FDroidException(_("Android SDK tool {cmd} not found!").format(cmd=cmd)) def test_aapt_version(aapt): """Check whether the version of aapt is new enough.""" output = subprocess.check_output([aapt, 'version'], universal_newlines=True) if output is None or output == '': logging.error(_("'{path}' failed to execute!").format(path=aapt)) else: m = re.match(r'.*v([0-9]+)\.([0-9]+)[.-]?([0-9.-]*)', output) if m: major = m.group(1) minor = m.group(2) bugfix = m.group(3) # the Debian package has the version string like "v0.2-23.0.2" too_old = False if '.' in bugfix: if LooseVersion(bugfix) < LooseVersion(MINIMUM_AAPT_BUILD_TOOLS_VERSION): too_old = True elif LooseVersion('.'.join((major, minor, bugfix))) < LooseVersion('0.2.4062713'): too_old = True if too_old: logging.warning(_("'{aapt}' is too old, fdroid requires build-tools-{version} or newer!") .format(aapt=aapt, version=MINIMUM_AAPT_BUILD_TOOLS_VERSION)) else: logging.warning(_('Unknown version of aapt, might cause problems: ') + output) def test_sdk_exists(thisconfig): if 'sdk_path' not in thisconfig: # check the 'apksigner' value in the config to see if its new enough f = thisconfig.get('apksigner', '') if os.path.isfile(f): sdk_path = os.path.dirname(os.path.dirname(os.path.dirname(f))) tmpconfig = {'sdk_path': sdk_path} find_apksigner(tmpconfig) if os.path.exists(tmpconfig.get('apksigner', '')): return True logging.error(_("'sdk_path' not set in config.yml!")) return False if thisconfig['sdk_path'] == default_config['sdk_path']: logging.error(_('No Android SDK found!')) logging.error(_('You can use ANDROID_HOME to set the path to your SDK, i.e.:')) logging.error('\texport ANDROID_HOME=/opt/android-sdk') return False if not os.path.exists(thisconfig['sdk_path']): logging.critical(_("Android SDK path '{path}' does not exist!") .format(path=thisconfig['sdk_path'])) return False if not os.path.isdir(thisconfig['sdk_path']): logging.critical(_("Android SDK path '{path}' is not a directory!") .format(path=thisconfig['sdk_path'])) return False find_apksigner(thisconfig) if not os.path.exists(thisconfig.get('apksigner', '')): return False return True def get_local_metadata_files(): """Get any metadata files local to an app's source repo. This tries to ignore anything that does not count as app metdata, including emacs cruft ending in ~ """ return glob.glob('.fdroid.[a-jl-z]*[a-rt-z]') def read_pkg_args(appid_versionCode_pairs, allow_vercodes=False): """No summary. Parameters ---------- appids arguments in the form of multiple appid:[vc] strings Returns ------- a dictionary with the set of vercodes specified for each package """ vercodes = {} if not appid_versionCode_pairs: return vercodes apk_regex = re.compile(r'_(\d+)\.apk$') for p in appid_versionCode_pairs: # Convert the apk name to a appid:versioncode pair p = apk_regex.sub(r':\1', p) if allow_vercodes and ':' in p: package, vercode = p.split(':') vercode = version_code_string_to_int(vercode) else: package, vercode = p, None if package not in vercodes: vercodes[package] = [vercode] if vercode else [] continue elif vercode and vercode not in vercodes[package]: vercodes[package] += [vercode] if vercode else [] return vercodes def get_metadata_files(vercodes): """ Build a list of metadata files and raise an exception for invalid appids. Parameters ---------- vercodes version codes as returned by read_pkg_args() Returns ------- List a list of corresponding metadata/*.yml files """ found_invalid = False metadatafiles = [] for appid in vercodes.keys(): f = Path('metadata') / ('%s.yml' % appid) if f.exists(): metadatafiles.append(f) else: found_invalid = True logging.critical(_("No such package: %s") % appid) if found_invalid: raise FDroidException(_("Found invalid appids in arguments")) return metadatafiles def read_app_args(appid_versionCode_pairs, allapps, allow_vercodes=False): """Build a list of App instances for processing. On top of what read_pkg_args does, this returns the whole app metadata, but limiting the builds list to the builds matching the appid_versionCode_pairs and vercodes specified. If no appid_versionCode_pairs are specified, then all App and Build instances are returned. """ vercodes = read_pkg_args(appid_versionCode_pairs, allow_vercodes) if not vercodes: return allapps apps = {} for appid, app in allapps.items(): if appid in vercodes: apps[appid] = app if len(apps) != len(vercodes): for p in vercodes: if p not in allapps: logging.critical(_("No such package: %s") % p) raise FDroidException(_("Found invalid appids in arguments")) if not apps: raise FDroidException(_("No packages specified")) error = False for appid, app in apps.items(): vc = vercodes[appid] if not vc: continue app['Builds'] = [b for b in app.get('Builds', []) if b.versionCode in vc] if len(app.get('Builds', [])) != len(vercodes[appid]): error = True allvcs = [b.versionCode for b in app.get('Builds', [])] for v in vercodes[appid]: if v not in allvcs: logging.critical(_("No such versionCode {versionCode} for app {appid}") .format(versionCode=v, appid=appid)) if error: raise FDroidException(_("Found invalid versionCodes for some apps")) return apps def get_extension(filename): """Get name and extension of filename, with extension always lower case.""" base, ext = os.path.splitext(filename) if not ext: return base, '' return base, ext.lower()[1:] publish_name_regex = re.compile(r"^(.+)_([0-9]+)\.(apk|zip)$") def publishednameinfo(filename): filename = os.path.basename(filename) m = publish_name_regex.match(filename) try: result = (m.group(1), int(m.group(2))) except AttributeError as exc: raise FDroidException(_("Invalid name for published file: %s") % filename) from exc return result apk_release_filename = re.compile(r'(?P[a-zA-Z0-9_\.]+)_(?P[0-9]+)\.apk') apk_release_filename_with_sigfp = re.compile(r'(?P[a-zA-Z0-9_\.]+)_(?P[0-9]+)_(?P[0-9a-f]{7})\.apk') def apk_parse_release_filename(apkname): """Parse the name of an APK file according the F-Droids APK naming scheme. WARNING: Returned values don't necessarily represent the APKs actual properties, the are just paresed from the file name. Returns ------- Tuple A triplet containing (appid, versionCode, signer), where appid should be the package name, versionCode should be the integer represion of the APKs version and signer should be the first 7 hex digists of the sha256 signing key fingerprint which was used to sign this APK. """ m = apk_release_filename_with_sigfp.match(apkname) if m: return m.group('appid'), int(m.group('vercode')), m.group('sigfp') m = apk_release_filename.match(apkname) if m: return m.group('appid'), int(m.group('vercode')), None return None, None, None def get_release_filename(app, build, extension=None): if extension: return "%s_%s.%s" % (app.id, build.versionCode, extension) if build.output and get_file_extension(build.output): return "%s_%s.%s" % (app.id, build.versionCode, get_file_extension(build.output)) else: return "%s_%s.apk" % (app.id, build.versionCode) def get_toolsversion_logname(app, build): return "%s_%s_toolsversion.log" % (app.id, build.versionCode) def getsrcname(app, build): return "%s_%s_src.tar.gz" % (app.id, build.versionCode) def get_build_dir(app): """Get the dir that this app will be built in.""" if app.RepoType == 'srclib': return Path('build/srclib') / app.Repo return Path('build') / app.id class Encoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, set): return sorted(obj) return super().default(obj) def setup_status_output(start_timestamp): """Create the common output dictionary for public status updates.""" output = { 'commandLine': sys.argv, 'startTimestamp': int(time.mktime(start_timestamp) * 1000), 'subcommand': sys.argv[0].split()[1], } if os.path.isdir('.git'): git_repo = git.repo.Repo(os.getcwd()) output['fdroiddata'] = { 'commitId': get_head_commit_id(git_repo), 'isDirty': git_repo.is_dirty(), 'modifiedFiles': git_repo.git().ls_files(modified=True).split(), 'untrackedFiles': git_repo.untracked_files, } fdroidserver_dir = os.path.dirname(sys.argv[0]) if os.path.isdir(os.path.join(fdroidserver_dir, '.git')): git_repo = git.repo.Repo(fdroidserver_dir) output['fdroidserver'] = { 'commitId': get_head_commit_id(git_repo), 'isDirty': git_repo.is_dirty(), 'modifiedFiles': git_repo.git().ls_files(modified=True).split(), 'untrackedFiles': git_repo.untracked_files, } etc_issue_net = '/etc/issue.net' if os.path.exists(etc_issue_net): with open(etc_issue_net) as fp: output[etc_issue_net] = fp.read(100).strip() write_running_status_json(output) return output def write_running_status_json(output): write_status_json(output, pretty=True, name='running') def write_status_json(output, pretty=False, name=None): """Write status out as JSON, and rsync it to the repo server.""" status_dir = os.path.join('repo', 'status') if not os.path.exists(status_dir): os.makedirs(status_dir) if not name: output['endTimestamp'] = int(datetime.now(timezone.utc).timestamp() * 1000) names = ['running', sys.argv[0].split()[1]] # fdroid subcommand else: names = [name] for fname in names: path = os.path.join(status_dir, fname + '.json') with open(path, "w", encoding="utf-8") as fp: if pretty: json.dump(output, fp, sort_keys=True, cls=Encoder, indent=2) else: json.dump(output, fp, sort_keys=True, cls=Encoder, separators=(',', ':')) rsync_status_file_to_repo(path, repo_subdir='status') def get_head_commit_id(git_repo): """Get git commit ID for HEAD as a str.""" try: return git_repo.head.commit.hexsha except ValueError: return "None" def setup_vcs(app): """Checkout code from VCS and return instance of vcs and the build dir.""" build_dir = get_build_dir(app) # Set up vcs interface and make sure we have the latest code... logging.debug("Getting {0} vcs interface for {1}" .format(app.RepoType, app.Repo)) if app.RepoType == 'git' and os.path.exists('.fdroid.yml'): remote = os.getcwd() else: remote = app.Repo vcs = getvcs(app.RepoType, remote, build_dir) return vcs, build_dir def getvcs(vcstype, remote, local): """Return a vcs instance based on the arguments. remote and local can be either a string or a pathlib.Path """ if vcstype == 'git': return vcs_git(remote, local) if vcstype == 'git-svn': return vcs_gitsvn(remote, local) if vcstype == 'hg': return vcs_hg(remote, local) if vcstype == 'bzr': return vcs_bzr(remote, local) if vcstype == 'srclib': if str(local) != os.path.join('build', 'srclib', str(remote)): raise VCSException("Error: srclib paths are hard-coded!") return getsrclib(remote, os.path.join('build', 'srclib'), raw=True) if vcstype == 'svn': raise VCSException("Deprecated vcs type 'svn' - please use 'git-svn' instead") raise VCSException("Invalid vcs type " + vcstype) def getsrclibvcs(name): if name not in fdroidserver.metadata.srclibs: raise VCSException("Missing srclib " + name) return fdroidserver.metadata.srclibs[name]['RepoType'] class vcs: def __init__(self, remote, local): # svn, git-svn and bzr may require auth self.username = None if self.repotype() in ('git-svn', 'bzr'): if '@' in remote: if self.repotype == 'git-svn': raise VCSException("Authentication is not supported for git-svn") self.username, remote = remote.split('@') if ':' not in self.username: raise VCSException(_("Password required with username")) self.username, self.password = self.username.split(':') self.remote = remote self.local = local self.clone_failed = False self.refreshed = False self.srclib = None def _gettags(self): raise NotImplementedError def repotype(self): return None def clientversion(self): versionstr = FDroidPopen(self.clientversioncmd()).output return versionstr[0:versionstr.find('\n')] def clientversioncmd(self): return None def gotorevision(self, rev, refresh=True): """Take the local repository to a clean version of the given revision. Take the local repository to a clean version of the given revision, which is specificed in the VCS's native format. Beforehand, the repository can be dirty, or even non-existent. If the repository does already exist locally, it will be updated from the origin, but only once in the lifetime of the vcs object. None is acceptable for 'rev' if you know you are cloning a clean copy of the repo - otherwise it must specify a valid revision. """ if self.clone_failed: raise VCSException(_("Downloading the repository already failed once, not trying again.")) # The .fdroidvcs-id file for a repo tells us what VCS type # and remote that directory was created from, allowing us to drop it # automatically if either of those things changes. fdpath = os.path.join(self.local, '..', '.fdroidvcs-' + os.path.basename(self.local)) fdpath = os.path.normpath(fdpath) cdata = self.repotype() + ' ' + self.remote writeback = True deleterepo = False if os.path.exists(self.local): if os.path.exists(fdpath): with open(fdpath, 'r') as f: fsdata = f.read().strip() if fsdata == cdata: writeback = False else: deleterepo = True logging.info("Repository details for %s changed - deleting" % ( self.local)) else: deleterepo = True logging.info("Repository details for %s missing - deleting" % ( self.local)) if deleterepo: shutil.rmtree(self.local) exc = None if not refresh: self.refreshed = True try: self.gotorevisionx(rev) except FDroidException as e: exc = e # If necessary, write the .fdroidvcs file. if writeback and not self.clone_failed: os.makedirs(os.path.dirname(fdpath), exist_ok=True) with open(fdpath, 'w+') as f: f.write(cdata) if exc is not None: raise exc def gotorevisionx(self, rev): # pylint: disable=unused-argument """No summary. Derived classes need to implement this. It's called once basic checking has been performed. """ raise VCSException("This VCS type doesn't define gotorevisionx") # Initialise and update submodules def initsubmodules(self): raise VCSException('Submodules not supported for this vcs type') # Deinitialise and update submodules def deinitsubmodules(self): pass # Get a list of all known tags def gettags(self): if not self._gettags: raise VCSException('gettags not supported for this vcs type') rtags = [] for tag in self._gettags(): if re.match('[-A-Za-z0-9_. /]+$', tag): rtags.append(tag) return rtags def latesttags(self): """Get a list of all the known tags, sorted from newest to oldest.""" raise VCSException('latesttags not supported for this vcs type') def getref(self, revname=None): """Get current commit reference (hash, revision, etc).""" raise VCSException('getref not supported for this vcs type') def getsrclib(self): """Return the srclib (name, path) used in setting up the current revision, or None.""" return self.srclib class vcs_git(vcs): def repotype(self): return 'git' def clientversioncmd(self): return ['git', '--version'] def git(self, args, envs=dict(), cwd=None, output=True): """Prevent git fetch/clone/submodule from hanging at the username/password prompt. While fetch/pull/clone respect the command line option flags, it seems that submodule commands do not. They do seem to follow whatever is in env vars, if the version of git is new enough. So we just throw the kitchen sink at it to see what sticks. Also, because of CVE-2017-1000117, block all SSH URLs. """ # # supported in git >= 2.3 git_config = [ '-c', 'core.askpass=/bin/true', '-c', 'core.sshCommand=/bin/false', '-c', 'url.https://.insteadOf=ssh://', ] for domain in ('bitbucket.org', 'github.com', 'gitlab.com', 'codeberg.org'): git_config.append('-c') git_config.append('url.https://u:p@' + domain + '/.insteadOf=git@' + domain + ':') git_config.append('-c') git_config.append('url.https://u:p@' + domain + '.insteadOf=git://' + domain) git_config.append('-c') git_config.append('url.https://u:p@' + domain + '.insteadOf=https://' + domain) envs.update({ 'GIT_TERMINAL_PROMPT': '0', 'GIT_ASKPASS': '/bin/true', 'SSH_ASKPASS': '/bin/true', 'GIT_SSH': '/bin/false', # for git < 2.3 }) return FDroidPopen(['git', ] + git_config + args, envs=envs, cwd=cwd, output=output) def checkrepo(self): """No summary. If the local directory exists, but is somehow not a git repository, git will traverse up the directory tree until it finds one that is (i.e. fdroidserver) and then we'll proceed to destroy it! This is called as a safety check. """ p = FDroidPopen(['git', 'rev-parse', '--show-toplevel'], cwd=self.local, output=False) result = p.output.rstrip() if Path(result) != Path(self.local).resolve(): raise VCSException('Repository mismatch') def gotorevisionx(self, rev): if not os.path.exists(self.local): # Brand new checkout p = self.git(['clone', '--', self.remote, str(self.local)]) if p.returncode != 0: self.clone_failed = True raise VCSException("Git clone failed", p.output) self.checkrepo() else: self.checkrepo() # Discard any working tree changes p = FDroidPopen(['git', 'submodule', 'foreach', '--recursive', 'git', 'reset', '--hard'], cwd=self.local, output=False) if p.returncode != 0: logging.debug("Git submodule reset failed (ignored) {output}".format(output=p.output)) p = FDroidPopen(['git', 'reset', '--hard'], cwd=self.local, output=False) if p.returncode != 0: raise VCSException(_("Git reset failed"), p.output) # Remove untracked files now, in case they're tracked in the target # revision (it happens!) p = FDroidPopen(['git', 'submodule', 'foreach', '--recursive', 'git', 'clean', '-dffx'], cwd=self.local, output=False) if p.returncode != 0: logging.debug("Git submodule cleanup failed (ignored) {output}".format(output=p.output)) p = FDroidPopen(['git', 'clean', '-dffx'], cwd=self.local, output=False) if p.returncode != 0: raise VCSException(_("Git clean failed"), p.output) if not self.refreshed: # Get latest commits and tags from remote p = self.git(['fetch', 'origin'], cwd=self.local) if p.returncode != 0: raise VCSException(_("Git fetch failed"), p.output) p = self.git(['remote', 'prune', 'origin'], output=False, cwd=self.local) if p.returncode != 0: raise VCSException(_("Git prune failed"), p.output) p = self.git(['fetch', '--prune', '--tags', '--force', 'origin'], output=False, cwd=self.local) if p.returncode != 0: raise VCSException(_("Git fetch failed"), p.output) # Recreate origin/HEAD as git clone would do it, in case it disappeared p = FDroidPopen(['git', 'remote', 'set-head', 'origin', '--auto'], cwd=self.local, output=False) if p.returncode != 0: lines = p.output.splitlines() if 'Multiple remote HEAD branches' not in lines[0]: logging.warning(_("Git remote set-head failed: \"%s\"") % p.output.strip()) else: branch = lines[1].split(' ')[-1] p2 = FDroidPopen(['git', 'remote', 'set-head', 'origin', '--', branch], cwd=self.local, output=False) if p2.returncode != 0: logging.warning(_("Git remote set-head failed: \"%s\"") % p.output.strip() + '\n' + p2.output.strip()) self.refreshed = True # origin/HEAD is the HEAD of the remote, e.g. the "default branch" on # a github repo. Most of the time this is the same as origin/master. rev = rev or 'origin/HEAD' p = FDroidPopen(['git', 'checkout', '-f', rev], cwd=self.local, output=False) if p.returncode != 0: raise VCSException(_("Git checkout of '%s' failed") % rev, p.output) # Get rid of any uncontrolled files left behind p = FDroidPopen(['git', 'clean', '-dffx'], cwd=self.local, output=False) if p.returncode != 0: raise VCSException(_("Git clean failed"), p.output) def initsubmodules(self): self.checkrepo() submfile = os.path.join(self.local, '.gitmodules') if not os.path.isfile(submfile): raise NoSubmodulesException(_("No git submodules available")) # fix submodules not accessible without an account and public key auth with open(submfile, 'r') as f: lines = f.readlines() with open(submfile, 'w') as f: for line in lines: for domain in ('bitbucket.org', 'github.com', 'gitlab.com'): line = re.sub('git@' + domain + ':', 'https://u:p@' + domain + '/', line) f.write(line) p = FDroidPopen(['git', 'submodule', 'sync'], cwd=self.local, output=False) if p.returncode != 0: raise VCSException(_("Git submodule sync failed"), p.output) p = self.git(['submodule', 'update', '--init', '--force', '--recursive'], cwd=self.local) if p.returncode != 0: raise VCSException(_("Git submodule update failed"), p.output) def deinitsubmodules(self): self.checkrepo() p = FDroidPopen(['git', 'submodule', 'deinit', '--all', '--force'], cwd=self.local, output=False) if p.returncode != 0: raise VCSException(_("Git submodule deinit failed"), p.output) def _gettags(self): self.checkrepo() p = FDroidPopen(['git', 'tag'], cwd=self.local, output=False) return p.output.splitlines() def latesttags(self): """Return a list of latest tags.""" self.checkrepo() return [tag.name for tag in sorted( git.Repo(self.local).tags, key=lambda t: t.commit.committed_date, reverse=True )] def getref(self, revname='HEAD'): self.checkrepo() repo = git.Repo(self.local) try: return repo.commit(revname).hexsha except git.BadName: return None class vcs_gitsvn(vcs): def repotype(self): return 'git-svn' def clientversioncmd(self): return ['git', 'svn', '--version'] def checkrepo(self): """No summary. If the local directory exists, but is somehow not a git repository, git will traverse up the directory tree until it finds one that is (i.e. fdroidserver) and then we'll proceed to destory it! This is called as a safety check. """ p = FDroidPopen(['git', 'rev-parse', '--show-toplevel'], cwd=self.local, output=False) result = p.output.rstrip() if Path(result) != Path(self.local).resolve(): raise VCSException('Repository mismatch') def git(self, args, envs=dict(), cwd=None, output=True): """Prevent git fetch/clone/submodule from hanging at the username/password prompt. AskPass is set to /bin/true to let the process try to connect without a username/password. The SSH command is set to /bin/false to block all SSH URLs (supported in git >= 2.3). This protects against CVE-2017-1000117. """ git_config = [ '-c', 'core.askpass=/bin/true', '-c', 'core.sshCommand=/bin/false', ] envs.update({ 'GIT_TERMINAL_PROMPT': '0', 'GIT_ASKPASS': '/bin/true', 'SSH_ASKPASS': '/bin/true', 'GIT_SSH': '/bin/false', # for git < 2.3 'SVN_SSH': '/bin/false', }) return FDroidPopen(['git', ] + git_config + args, envs=envs, cwd=cwd, output=output) def gotorevisionx(self, rev): if not os.path.exists(self.local): # Brand new checkout gitsvn_args = ['svn', 'clone'] remote = None if ';' in self.remote: remote_split = self.remote.split(';') for i in remote_split[1:]: if i.startswith('trunk='): gitsvn_args.extend(['-T', i[6:]]) elif i.startswith('tags='): gitsvn_args.extend(['-t', i[5:]]) elif i.startswith('branches='): gitsvn_args.extend(['-b', i[9:]]) remote = remote_split[0] else: remote = self.remote if not remote.startswith('https://'): raise VCSException(_('HTTPS must be used with Subversion URLs!')) # git-svn sucks at certificate validation, this throws useful errors: try: import requests r = requests.head(remote, timeout=300) r.raise_for_status() except Exception as e: raise VCSException('SVN certificate pre-validation failed: ' + str(e)) from e location = r.headers.get('location') if location and not location.startswith('https://'): raise VCSException(_('Invalid redirect to non-HTTPS: {before} -> {after} ') .format(before=remote, after=location)) gitsvn_args.extend(['--', remote, str(self.local)]) p = self.git(gitsvn_args) if p.returncode != 0: self.clone_failed = True raise VCSException(_('git svn clone failed'), p.output) self.checkrepo() else: self.checkrepo() # Discard any working tree changes p = self.git(['reset', '--hard'], cwd=self.local, output=False) if p.returncode != 0: raise VCSException("Git reset failed", p.output) # Remove untracked files now, in case they're tracked in the target # revision (it happens!) p = self.git(['clean', '-dffx'], cwd=self.local, output=False) if p.returncode != 0: raise VCSException("Git clean failed", p.output) if not self.refreshed: # Get new commits, branches and tags from repo p = self.git(['svn', 'fetch'], cwd=self.local, output=False) if p.returncode != 0: raise VCSException("Git svn fetch failed") p = self.git(['svn', 'rebase'], cwd=self.local, output=False) if p.returncode != 0: raise VCSException("Git svn rebase failed", p.output) self.refreshed = True rev = rev or 'master' if rev: nospaces_rev = rev.replace(' ', '%20') # Try finding a svn tag for treeish in ['origin/', '']: p = self.git(['checkout', treeish + 'tags/' + nospaces_rev], cwd=self.local, output=False) if p.returncode == 0: break if p.returncode != 0: # No tag found, normal svn rev translation # Translate svn rev into git format rev_split = rev.split('/') p = None for treeish in ['origin/', '']: if len(rev_split) > 1: treeish += rev_split[0] svn_rev = rev_split[1] else: # if no branch is specified, then assume trunk (i.e. 'master' branch): treeish += 'master' svn_rev = rev svn_rev = svn_rev if svn_rev[0] == 'r' else 'r' + svn_rev p = self.git(['svn', 'find-rev', '--before', svn_rev, treeish], cwd=self.local, output=False) git_rev = p.output.rstrip() if p.returncode == 0 and git_rev: break if p.returncode != 0 or not git_rev: # Try a plain git checkout as a last resort p = self.git(['checkout', rev], cwd=self.local, output=False) if p.returncode != 0: raise VCSException("No git treeish found and direct git checkout of '%s' failed" % rev, p.output) else: # Check out the git rev equivalent to the svn rev p = self.git(['checkout', git_rev], cwd=self.local, output=False) if p.returncode != 0: raise VCSException(_("Git checkout of '%s' failed") % rev, p.output) # Get rid of any uncontrolled files left behind p = self.git(['clean', '-dffx'], cwd=self.local, output=False) if p.returncode != 0: raise VCSException(_("Git clean failed"), p.output) def _gettags(self): self.checkrepo() for treeish in ['origin/', '']: d = os.path.join(self.local, '.git', 'svn', 'refs', 'remotes', treeish, 'tags') if os.path.isdir(d): return os.listdir(d) def getref(self, revname='HEAD'): self.checkrepo() p = FDroidPopen(['git', 'svn', 'find-rev', revname], cwd=self.local, output=False) if p.returncode != 0: return None return p.output.strip() class vcs_hg(vcs): def repotype(self): return 'hg' def clientversioncmd(self): return ['hg', '--version'] def gotorevisionx(self, rev): if not os.path.exists(self.local): p = FDroidPopen(['hg', 'clone', '--ssh', '/bin/false', '--', self.remote, str(self.local)], output=False) if p.returncode != 0: self.clone_failed = True raise VCSException("Hg clone failed", p.output) else: p = FDroidPopen(['hg', 'status', '-uS'], cwd=self.local, output=False) if p.returncode != 0: raise VCSException("Hg status failed", p.output) for line in p.output.splitlines(): if not line.startswith('? '): raise VCSException("Unexpected output from hg status -uS: " + line) FDroidPopen(['rm', '-rf', '--', line[2:]], cwd=self.local, output=False) if not self.refreshed: p = FDroidPopen(['hg', 'pull', '--ssh', '/bin/false'], cwd=self.local, output=False) if p.returncode != 0: raise VCSException("Hg pull failed", p.output) self.refreshed = True rev = rev or 'default' if not rev: return p = FDroidPopen(['hg', 'update', '-C', '--', rev], cwd=self.local, output=False) if p.returncode != 0: raise VCSException("Hg checkout of '%s' failed" % rev, p.output) p = FDroidPopen(['hg', 'purge', '--all'], cwd=self.local, output=False) # Also delete untracked files, we have to enable purge extension for that: if "'purge' is provided by the following extension" in p.output: with open(os.path.join(self.local, '.hg', 'hgrc'), "a") as myfile: myfile.write("\n[extensions]\nhgext.purge=\n") p = FDroidPopen(['hg', 'purge', '--all'], cwd=self.local, output=False) if p.returncode != 0: raise VCSException("HG purge failed", p.output) elif p.returncode != 0: raise VCSException("HG purge failed", p.output) def _gettags(self): p = FDroidPopen(['hg', 'tags', '-q'], cwd=self.local, output=False) return p.output.splitlines()[1:] class vcs_bzr(vcs): def repotype(self): return 'bzr' def clientversioncmd(self): return ['bzr', '--version'] def bzr(self, args, envs=dict(), cwd=None, output=True): """Prevent bzr from ever using SSH to avoid security vulns.""" envs.update({ 'BZR_SSH': 'false', }) return FDroidPopen(['bzr', ] + args, envs=envs, cwd=cwd, output=output) def gotorevisionx(self, rev): if not os.path.exists(self.local): p = self.bzr(['branch', self.remote, str(self.local)], output=False) if p.returncode != 0: self.clone_failed = True raise VCSException("Bzr branch failed", p.output) else: p = self.bzr(['clean-tree', '--force', '--unknown', '--ignored'], cwd=self.local, output=False) if p.returncode != 0: raise VCSException("Bzr revert failed", p.output) if not self.refreshed: p = self.bzr(['pull'], cwd=self.local, output=False) if p.returncode != 0: raise VCSException("Bzr update failed", p.output) self.refreshed = True revargs = list(['-r', rev] if rev else []) p = self.bzr(['revert'] + revargs, cwd=self.local, output=False) if p.returncode != 0: raise VCSException("Bzr revert of '%s' failed" % rev, p.output) def _gettags(self): p = self.bzr(['tags'], cwd=self.local, output=False) return [tag.split(' ')[0].strip() for tag in p.output.splitlines()] def unescape_string(string): if len(string) < 2: return string if string[0] == '"' and string[-1] == '"': return string[1:-1] return string.replace("\\'", "'") def retrieve_string(app_dir, string, xmlfiles=None): if string.startswith('@string/'): name = string[len('@string/'):] elif string.startswith('${'): return '' # Gradle variable else: return unescape_string(string) if xmlfiles is None: xmlfiles = [] for res_dir in [ os.path.join(app_dir, 'res'), os.path.join(app_dir, 'src', 'main', 'res'), ]: for root, dirs, files in os.walk(res_dir): if os.path.basename(root) == 'values': xmlfiles += [os.path.join(root, x) for x in files if x.endswith('.xml')] def element_content(element): if element.text is None: return "" s = XMLElementTree.tostring(element, encoding='utf-8', method='text') return s.decode('utf-8').strip() for path in sorted(xmlfiles): if not os.path.isfile(path): continue try: xml = parse_xml(path) except (XMLElementTree.ParseError, ValueError): logging.warning(_("Problem with xml at '{path}'").format(path=path)) continue element = xml.find('string[@name="' + name + '"]') if element is not None: content = element_content(element) return retrieve_string(app_dir, content, xmlfiles) return '' def retrieve_string_singleline(app_dir, string, xmlfiles=None): return retrieve_string(app_dir, string, xmlfiles).replace('\n', ' ').strip() def manifest_paths(app_dir, flavours): """Return list of existing files that will be used to find the highest vercode.""" possible_manifests = \ [Path(app_dir) / 'AndroidManifest.xml', Path(app_dir) / 'src/main/AndroidManifest.xml', Path(app_dir) / 'src/AndroidManifest.xml', Path(app_dir) / 'build.gradle', Path(app_dir) / 'build-extras.gradle', Path(app_dir) / 'build.gradle.kts'] for flavour in flavours: if flavour == 'yes': continue possible_manifests.append( Path(app_dir) / 'src' / flavour / 'AndroidManifest.xml') return [path for path in possible_manifests if path.is_file()] def fetch_real_name(app_dir, flavours): """Retrieve the package name. Returns the name, or None if not found.""" for path in manifest_paths(app_dir, flavours): if not path.suffix == '.xml' or not path.is_file(): continue logging.debug("fetch_real_name: Checking manifest at %s" % path) try: xml = parse_xml(path) except (XMLElementTree.ParseError, ValueError): logging.warning(_("Problem with xml at '{path}'").format(path=path)) continue app = xml.find('application') if app is None: continue if XMLNS_ANDROID + "label" not in app.attrib: continue label = app.attrib[XMLNS_ANDROID + "label"] result = retrieve_string_singleline(app_dir, label) if result: result = result.strip() return result return None def get_library_references(root_dir): libraries = [] proppath = os.path.join(root_dir, 'project.properties') if not os.path.isfile(proppath): return libraries with open(proppath, 'r', encoding='iso-8859-1') as f: for line in f: if not line.startswith('android.library.reference.'): continue path = line.split('=')[1].strip() relpath = os.path.join(root_dir, path) if not os.path.isdir(relpath): continue logging.debug("Found subproject at %s" % path) libraries.append(path) return libraries def ant_subprojects(root_dir): subprojects = get_library_references(root_dir) for subpath in subprojects: subrelpath = os.path.join(root_dir, subpath) for p in get_library_references(subrelpath): relp = os.path.normpath(os.path.join(subpath, p)) if relp not in subprojects: subprojects.insert(0, relp) return subprojects def remove_debuggable_flags(root_dir): # Remove forced debuggable flags logging.debug("Removing debuggable flags from %s" % root_dir) for root, dirs, files in os.walk(root_dir): if 'AndroidManifest.xml' in files and os.path.isfile(os.path.join(root, 'AndroidManifest.xml')): regsub_file(r'android:debuggable="[^"]*"', '', os.path.join(root, 'AndroidManifest.xml')) vcsearch_g = re.compile(r'''\b[Vv]ersionCode\s*=?\s*["'(]*([0-9][0-9_]*)["')]*''').search vnsearch_g = re.compile(r'''\b[Vv]ersionName\s*=?\s*\(?(["'])((?:(?=(\\?))\3.)*?)\1''').search vnssearch_g = re.compile(r'''\b[Vv]ersionNameSuffix\s*=?\s*(["'])((?:(?=(\\?))\3.)*?)\1''').search psearch_g = re.compile(r'''\b(packageName|applicationId|namespace)\s*=*\s*["']([^"']+)["']''').search fsearch_g = re.compile(r'''\b(applicationIdSuffix)\s*=*\s*["']([^"']+)["']''').search def app_matches_packagename(app, package): if not package: return False appid = app.UpdateCheckName or app.id if appid is None or appid == "Ignore": return True return appid == package def parse_androidmanifests(paths, app): """Extract some information from the AndroidManifest.xml at the given path. Returns (version, vercode, package), any or all of which might be None. All values returned are strings. Android Studio recommends "you use UTF-8 encoding whenever possible", so this code assumes the files use UTF-8. https://sites.google.com/a/android.com/tools/knownissues/encoding """ ignoreversions = app.UpdateCheckIgnore ignoresearch = re.compile(ignoreversions).search if ignoreversions else None if not paths: return (None, None, None) max_version = None max_vercode = None max_package = None def vnsearch(line): matches = vnsearch_g(line) if matches and not any( matches.group(2).startswith(s) for s in [ '${', # Gradle variable names '@string/', # Strings we could not resolve ] ): return matches.group(2) return None for path in paths: if not path.is_file(): continue logging.debug(_("Parsing manifest at '{path}'").format(path=path)) version = None vercode = None package = None flavours = None temp_app_id = None temp_version_name = None if len(app.get('Builds', [])) > 0 and 'gradle' in app['Builds'][-1] and app['Builds'][-1].gradle: flavours = app['Builds'][-1].gradle if path.suffix == '.gradle' or path.name.endswith('.gradle.kts'): with open(path, 'r', encoding='utf-8') as f: android_plugin_file = False inside_flavour_group = 0 inside_required_flavour = 0 for line in f: if gradle_comment.match(line): continue if "applicationId" in line and not temp_app_id: matches = psearch_g(line) if matches: temp_app_id = matches.group(2) if "versionName" in line and not temp_version_name: matches = vnsearch(line) if matches: temp_version_name = matches if inside_flavour_group > 0: if inside_required_flavour > 1: matches = psearch_g(line) if matches: s = matches.group(2) if app_matches_packagename(app, s): package = s else: # If build.gradle contains applicationIdSuffix add it to the end of package name matches = fsearch_g(line) if matches and temp_app_id: suffix = matches.group(2) temp_app_id = temp_app_id + suffix if app_matches_packagename(app, temp_app_id): package = temp_app_id matches = vnsearch(line) if matches: version = matches else: # If build.gradle contains applicationNameSuffix add it to the end of version name matches = vnssearch_g(line) if matches and temp_version_name: name_suffix = matches.group(2) version = temp_version_name + name_suffix matches = vcsearch_g(line) if matches: vercode = version_code_string_to_int(matches.group(1)) if inside_required_flavour > 0: if '{' in line: inside_required_flavour += 1 if '}' in line: inside_required_flavour -= 1 if inside_required_flavour == 1: inside_required_flavour -= 1 elif flavours: for flavour in flavours: if re.match(r'.*[\'"\s]{flavour}[\'"\s].*\{{.*'.format(flavour=flavour), line): inside_required_flavour = 2 break if re.match(r'.*[\'"\s]{flavour}[\'"\s].*'.format(flavour=flavour), line): inside_required_flavour = 1 break if '{' in line: inside_flavour_group += 1 if '}' in line: inside_flavour_group -= 1 else: if "productFlavors" in line: inside_flavour_group = 1 if not package: matches = psearch_g(line) if matches: s = matches.group(2) if app_matches_packagename(app, s): package = s if not version: matches = vnsearch(line) if matches: version = matches if not vercode: matches = vcsearch_g(line) if matches: vercode = version_code_string_to_int(matches.group(1)) if not android_plugin_file and ANDROID_PLUGIN_REGEX.match(line): android_plugin_file = True if android_plugin_file: if package: max_package = package if version: max_version = version if vercode: max_vercode = vercode if max_package and max_version and max_vercode: break else: try: xml = parse_xml(path) except (XMLElementTree.ParseError, ValueError): logging.warning(_("Problem with xml at '{path}'").format(path=path)) continue if "package" in xml.attrib: s = xml.attrib["package"] if app_matches_packagename(app, s): package = s if XMLNS_ANDROID + "versionName" in xml.attrib: version = xml.attrib[XMLNS_ANDROID + "versionName"] base_dir = os.path.dirname(path) version = retrieve_string_singleline(base_dir, version) if XMLNS_ANDROID + "versionCode" in xml.attrib: vercode = version_code_string_to_int( xml.attrib[XMLNS_ANDROID + "versionCode"]) # Remember package name, may be defined separately from version+vercode if package is None: package = max_package logging.debug("..got package={0}, version={1}, vercode={2}" .format(package, version, vercode)) # Always grab the package name and version name in case they are not # together with the highest version code if max_package is None and package is not None: max_package = package if max_version is None and version is not None: max_version = version if vercode is not None \ and (max_vercode is None or vercode > max_vercode): if version and (not ignoresearch or not ignoresearch(version)): if version is not None: max_version = version if vercode is not None: max_vercode = vercode if package is not None: max_package = package else: max_version = "Ignore" if max_version is None: max_version = "Unknown" if max_package: msg = _("Invalid application ID {appid}").format(appid=max_package) if not is_valid_package_name(max_package): raise FDroidException(msg) elif not is_strict_application_id(max_package): logging.warning(msg) return (max_version, max_vercode, max_package) def is_valid_package_name(name): """Check whether name is a valid fdroid package name. APKs and manually defined package names must use a valid Java Package Name. Automatically generated package names for non-APK files use the SHA-256 sum. """ return VALID_APPLICATION_ID_REGEX.match(name) is not None \ or FDROID_PACKAGE_NAME_REGEX.match(name) is not None def is_strict_application_id(name): """Check whether name is a valid Android Application ID. The Android ApplicationID is basically a Java Package Name, but with more restrictive naming rules: * It must have at least two segments (one or more dots). * Each segment must start with a letter. * All characters must be alphanumeric or an underscore [a-zA-Z0-9_]. References ---------- https://developer.android.com/studio/build/application-id """ return STRICT_APPLICATION_ID_REGEX.match(name) is not None \ and '.' in name def get_all_gradle_and_manifests(build_dir): paths = [] # TODO: Python3.6: Accepts a path-like object. for root, dirs, files in os.walk(str(build_dir)): for f in sorted(files): if f == 'AndroidManifest.xml' \ or f.endswith('.gradle') or f.endswith('.gradle.kts'): full = Path(root) / f paths.append(full) return paths def get_gradle_subdir(build_dir, paths): """Get the subdir where the gradle build is based.""" first_gradle_dir = None for path in paths: if not first_gradle_dir: first_gradle_dir = path.parent.relative_to(build_dir) if path.exists() and SETTINGS_GRADLE_REGEX.match(str(path.name)): for m in GRADLE_SUBPROJECT_REGEX.finditer(path.read_text(encoding='utf-8')): for f in (path.parent / m.group(1)).glob('build.gradle*'): with f.open(encoding='utf-8') as fp: for line in fp.readlines(): if ANDROID_PLUGIN_REGEX.match(line): return f.parent.relative_to(build_dir) if first_gradle_dir and first_gradle_dir != Path('.'): return first_gradle_dir return def parse_srclib_spec(spec): if type(spec) != str: raise MetaDataException(_("can not parse scrlib spec " "(not a string): '{}'") .format(spec)) tokens = spec.split('@', 1) if not tokens[0]: raise MetaDataException( _("could not parse srclib spec (no name specified): '{}'").format(spec) ) if len(tokens) < 2 or not tokens[1]: raise MetaDataException( _("could not parse srclib spec (no ref specified): '{}'").format(spec) ) name = tokens[0] ref = tokens[1] number = None subdir = None if ':' in name: number, name = name.split(':', 1) if '/' in name: name, subdir = name.split('/', 1) return (name, ref, number, subdir) def getsrclib(spec, srclib_dir, basepath=False, raw=False, prepare=True, preponly=False, refresh=True, build=None): """Get the specified source library. Return the path to it. Normally this is the path to be used when referencing it, which may be a subdirectory of the actual project. If you want the base directory of the project, pass 'basepath=True'. spec and srclib_dir are both strings, not pathlib.Path. """ number = None subdir = None if not isinstance(spec, str): spec = str(spec) if not isinstance(srclib_dir, str): spec = str(srclib_dir) if raw: name = spec ref = None else: name, ref, number, subdir = parse_srclib_spec(spec) if name not in fdroidserver.metadata.srclibs: raise VCSException('srclib ' + name + ' not found.') srclib = fdroidserver.metadata.srclibs[name] sdir = os.path.join(srclib_dir, name) if not preponly: vcs = getvcs(srclib["RepoType"], srclib["Repo"], sdir) vcs.srclib = (name, number, sdir) if ref: vcs.gotorevision(ref, refresh) if raw: return vcs libdir = None if subdir: libdir = os.path.join(sdir, subdir) elif srclib["Subdir"]: for subdir in srclib["Subdir"]: libdir_candidate = os.path.join(sdir, subdir) if os.path.exists(libdir_candidate): libdir = libdir_candidate break if libdir is None: libdir = sdir remove_signing_keys(sdir) remove_debuggable_flags(sdir) if prepare: if srclib["Prepare"]: cmd = replace_config_vars("; ".join(srclib["Prepare"]), build) p = FDroidPopen(['bash', '-e', '-u', '-o', 'pipefail', '-x', '-c', '--', cmd], cwd=libdir) if p.returncode != 0: raise BuildException("Error running prepare command for srclib %s" % name, p.output) if basepath: libdir = sdir return (name, number, libdir) gradle_version_regex = re.compile(r"[^/]*'com\.android\.tools\.build:gradle:([^\.]+\.[^\.]+).*'.*") def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver=False, refresh=True): """Prepare the source code for a particular build. Parameters ---------- vcs the appropriate vcs object for the application app the application details from the metadata build the build details from the metadata build_dir the path to the build directory, usually 'build/app.id' srclib_dir the path to the source libraries directory, usually 'build/srclib' extlib_dir the path to the external libraries directory, usually 'build/extlib' Returns ------- root is the root directory, which may be the same as 'build_dir' or may be a subdirectory of it. srclibpaths is information on the srclibs being used """ # Optionally, the actual app source can be in a subdirectory if build.subdir: root_dir = os.path.join(build_dir, build.subdir) else: root_dir = build_dir # Get a working copy of the right revision logging.info("Getting source for revision " + build.commit) vcs.gotorevision(build.commit, refresh) # Initialise submodules if required if build.submodules: logging.info(_("Initialising submodules")) vcs.initsubmodules() else: vcs.deinitsubmodules() # Check that a subdir (if we're using one) exists. This has to happen # after the checkout, since it might not exist elsewhere if not os.path.exists(root_dir): raise BuildException('Missing subdir ' + root_dir) # Run an init command if one is required if build.init: cmd = replace_config_vars("; ".join(build.init), build) logging.info("Running 'init' commands in %s" % root_dir) p = FDroidPopen(['bash', '-e', '-u', '-o', 'pipefail', '-x', '-c', '--', cmd], cwd=root_dir) if p.returncode != 0: raise BuildException("Error running init command for %s:%s" % (app.id, build.versionName), p.output) # Apply patches if any if build.patch: logging.info("Applying patches") for patch in build.patch: patch = patch.strip() logging.info("Applying " + patch) patch_path = os.path.join('metadata', app.id, patch) p = FDroidPopen(['patch', '-p1', '-i', os.path.abspath(patch_path)], cwd=build_dir) if p.returncode != 0: raise BuildException("Failed to apply patch %s" % patch_path) # Get required source libraries srclibpaths = [] if build.srclibs: logging.info("Collecting source libraries") for lib in build.srclibs: srclibpaths.append(getsrclib(lib, srclib_dir, preponly=onserver, refresh=refresh, build=build)) for name, number, libpath in srclibpaths: place_srclib(root_dir, int(number) if number else None, libpath) basesrclib = vcs.getsrclib() # If one was used for the main source, add that too. if basesrclib: srclibpaths.append(basesrclib) # Update the local.properties file localprops = [os.path.join(build_dir, 'local.properties')] if build.subdir: parts = build.subdir.split(os.sep) cur = build_dir for d in parts: cur = os.path.join(cur, d) localprops += [os.path.join(cur, 'local.properties')] for path in localprops: props = "" if os.path.isfile(path): logging.info("Updating local.properties file at %s" % path) with open(path, 'r', encoding='iso-8859-1') as f: props += f.read() props += '\n' else: logging.info("Creating local.properties file at %s" % path) # Fix old-fashioned 'sdk-location' by copying # from sdk.dir, if necessary if build.oldsdkloc: sdkloc = re.match(r".*^sdk.dir=(\S+)$.*", props, re.S | re.M).group(1) props += "sdk-location=%s\n" % sdkloc else: props += "sdk.dir=%s\n" % config['sdk_path'] props += "sdk-location=%s\n" % config['sdk_path'] ndk_path = build.ndk_path() # if for any reason the path isn't valid or the directory # doesn't exist, some versions of Gradle will error with a # cryptic message (even if the NDK is not even necessary). # https://gitlab.com/fdroid/fdroidserver/issues/171 if ndk_path and os.path.exists(ndk_path): # Add ndk location props += "ndk.dir=%s\n" % ndk_path props += "ndk-location=%s\n" % ndk_path # Add java.encoding if necessary if build.encoding: props += "java.encoding=%s\n" % build.encoding with open(path, 'w', encoding='iso-8859-1') as f: f.write(props) flavours = [] if build.build_method() == 'gradle': flavours = build.gradle if build.target: n = build.target.split('-')[1] build_gradle = os.path.join(root_dir, "build.gradle") build_gradle_kts = build_gradle + ".kts" if os.path.exists(build_gradle): gradlefile = build_gradle elif os.path.exists(build_gradle_kts): gradlefile = build_gradle_kts else: raise BuildException("No gradle file found") regsub_file(r'compileSdkVersion[ =]+[0-9]+', r'compileSdkVersion %s' % n, gradlefile) # Remove forced debuggable flags remove_debuggable_flags(root_dir) # Insert version code and number into the manifest if necessary if build.forceversion: logging.info("Changing the version name") for path in manifest_paths(root_dir, flavours): if not os.path.isfile(path): continue if path.suffix == '.xml': regsub_file(r'android:versionName="[^"]*"', r'android:versionName="%s"' % build.versionName, path) elif path.suffix == '.gradle': regsub_file(r"""(\s*)versionName[\s'"=]+.*""", r"""\1versionName '%s'""" % build.versionName, path) if build.forcevercode: logging.info("Changing the version code") for path in manifest_paths(root_dir, flavours): if not path.is_file(): continue if path.suffix == '.xml': regsub_file(r'android:versionCode="[^"]*"', r'android:versionCode="%s"' % build.versionCode, path) elif path.suffix == '.gradle': regsub_file(r'versionCode[ =]+[0-9]+', r'versionCode %s' % build.versionCode, path) # Delete unwanted files if build.rm: logging.info(_("Removing specified files")) for part in getpaths(build_dir, build.rm): dest = os.path.join(build_dir, part) logging.info("Removing {0}".format(part)) if os.path.lexists(dest): # rmtree can only handle directories that are not symlinks, so catch anything else if not os.path.isdir(dest) or os.path.islink(dest): os.remove(dest) else: shutil.rmtree(dest) else: logging.info("...but it didn't exist") remove_signing_keys(build_dir) # Add required external libraries if build.extlibs: logging.info("Collecting prebuilt libraries") libsdir = os.path.join(root_dir, 'libs') if not os.path.exists(libsdir): os.mkdir(libsdir) for lib in build.extlibs: lib = lib.strip() logging.info("...installing extlib {0}".format(lib)) libf = os.path.basename(lib) libsrc = os.path.join(extlib_dir, lib) if not os.path.exists(libsrc): raise BuildException("Missing extlib file {0}".format(libsrc)) shutil.copyfile(libsrc, os.path.join(libsdir, libf)) # Add extlibs to scanignore (this is relative to the build dir root, *sigh*) if build.subdir: scanignorepath = os.path.join(build.subdir, 'libs', libf) else: scanignorepath = os.path.join('libs', libf) if scanignorepath not in build.scanignore: build.scanignore.append(scanignorepath) # Run a pre-build command if one is required if build.prebuild: logging.info("Running 'prebuild' commands in %s" % root_dir) cmd = replace_config_vars("; ".join(build.prebuild), build) # Substitute source library paths into prebuild commands for name, number, libpath in srclibpaths: cmd = cmd.replace('$$' + name + '$$', os.path.join(os.getcwd(), libpath)) p = FDroidPopen(['bash', '-e', '-u', '-o', 'pipefail', '-x', '-c', '--', cmd], cwd=root_dir) if p.returncode != 0: raise BuildException("Error running prebuild command for %s:%s" % (app.id, build.versionName), p.output) # Generate (or update) the ant build file, build.xml... if build.build_method() == 'ant' and build.androidupdate != ['no']: parms = ['android', 'update', 'lib-project'] lparms = ['android', 'update', 'project'] if build.target: parms += ['-t', build.target] lparms += ['-t', build.target] if build.androidupdate: update_dirs = build.androidupdate else: update_dirs = ant_subprojects(root_dir) + ['.'] for d in update_dirs: subdir = os.path.join(root_dir, d) if d == '.': logging.debug("Updating main project") cmd = parms + ['-p', d] else: logging.debug("Updating subproject %s" % d) cmd = lparms + ['-p', d] p = SdkToolsPopen(cmd, cwd=root_dir) # Check to see whether an error was returned without a proper exit # code (this is the case for the 'no target set or target invalid' # error) if p.returncode != 0 or p.output.startswith("Error: "): raise BuildException("Failed to update project at %s" % d, p.output) # Clean update dirs via ant if d != '.': logging.info("Cleaning subproject %s" % d) p = FDroidPopen(['ant', 'clean'], cwd=subdir) return (root_dir, srclibpaths) def getpaths_map(build_dir, globpaths): """Extend via globbing the paths from a field and return them as a map from original path to resulting paths.""" paths = dict() not_found_paths = [] for p in globpaths: p = p.strip() full_path = os.path.join(build_dir, p) full_path = os.path.normpath(full_path) paths[p] = [r[len(str(build_dir)) + 1:] for r in glob.glob(full_path)] if not paths[p]: not_found_paths.append(p) if not_found_paths: raise FDroidException( "Some glob paths did not match any files/dirs:\n" + "\n".join(not_found_paths) ) return paths def getpaths(build_dir, globpaths): """Extend via globbing the paths from a field and return them as a set.""" paths_map = getpaths_map(build_dir, globpaths) paths = set() for k, v in paths_map.items(): for p in v: paths.add(p) return paths def natural_key(s): return [int(sp) if sp.isdigit() else sp for sp in re.split(r'(\d+)', s)] def check_system_clock(dt_obj, path): """Check if system clock is updated based on provided date. If an APK has files newer than the system time, suggest updating the system clock. This is useful for offline systems, used for signing, which do not have another source of clock sync info. It has to be more than 24 hours newer because ZIP/APK files do not store timezone info """ checkdt = dt_obj - timedelta(1) if datetime.today() < checkdt: logging.warning(_('System clock is older than date in {path}!').format(path=path) + '\n' + _('Set clock to that time using:') + '\n' + 'sudo date -s "' + str(dt_obj) + '"') class KnownApks: """Permanent store of existing APKs with the date they were added. This is currently the only way to permanently store the "updated" date of APKs. """ def __init__(self): """Load filename/date info about previously seen APKs. Since the appid and date strings both will never have spaces, this is parsed as a list from the end to allow the filename to have any combo of spaces. """ self.path = os.path.join('stats', 'known_apks.txt') self.apks = {} if os.path.isfile(self.path): with open(self.path, 'r', encoding='utf-8') as f: for line in f: t = line.rstrip().split(' ') if len(t) == 2: self.apks[t[0]] = (t[1], None) else: appid = t[-2] date = datetime.strptime(t[-1], '%Y-%m-%d') filename = line[0:line.rfind(appid) - 1] self.apks[filename] = (appid, date) check_system_clock(date, self.path) self.changed = False def writeifchanged(self): if not self.changed: return if not os.path.exists('stats'): os.mkdir('stats') lst = [] for apk, app in self.apks.items(): appid, added = app line = apk + ' ' + appid if added: line += ' ' + added.strftime('%Y-%m-%d') lst.append(line) with open(self.path, 'w') as f: for line in sorted(lst, key=natural_key): f.write(line + '\n') def recordapk(self, apkName, app, default_date=None): """ Record an APK (if it's new, otherwise does nothing). Returns ------- datetime the date it was added as a datetime instance. """ if apkName not in self.apks: if default_date is None: default_date = datetime.utcnow() self.apks[apkName] = (app, default_date) self.changed = True _ignored, added = self.apks[apkName] return added def getapp(self, apkname): """Look up information - given the 'apkname'. Returns (app id, date added/None). Or returns None for an unknown apk. """ if apkname in self.apks: return self.apks[apkname] return None def getlatest(self, num): """Get the most recent 'num' apps added to the repo, as a list of package ids with the most recent first.""" apps = {} for apk, app in self.apks.items(): appid, added = app if added: if appid in apps: if apps[appid] > added: apps[appid] = added else: apps[appid] = added sortedapps = sorted(apps.items(), key=operator.itemgetter(1))[-num:] lst = [app for app, _ignored in sortedapps] lst.reverse() return lst def get_file_extension(filename): """Get the normalized file extension, can be blank string but never None.""" if isinstance(filename, bytes): filename = filename.decode('utf-8') return os.path.splitext(filename)[1].lower()[1:] def _androguard_logging_level(level=logging.ERROR): """Tames androguard's default debug output. There should be no debug output when the functions are being used via the API. Otherwise, the output is controlled by the --verbose flag. To get coverage across the full range of androguard >= 3.3.5, this includes all known logger names that are relevant. So some of these names might not be present in the version of androguard currently in use. """ if options and options.verbose: level = logging.WARNING for name in ( 'androguard.apk', 'androguard.axml', 'androguard.core.api_specific_resources', 'androguard.core.apk', 'androguard.core.axml', ): logging.getLogger(name).setLevel(level) # some parts of androguard 4.x use loguru instead of logging try: from loguru import logger logger.remove() except ImportError: pass def get_androguard_APK(apkfile, skip_analysis=False): try: # these were moved in androguard 4.0 from androguard.core.apk import APK except ImportError: from androguard.core.bytecodes.apk import APK _androguard_logging_level() return APK(apkfile, skip_analysis=skip_analysis) def ensure_final_value(packageName, arsc, value): """Ensure incoming value is always the value, not the resid. androguard will sometimes return the Android "resId" aka Resource ID instead of the actual value. This checks whether the value is actually a resId, then performs the Android Resource lookup as needed. """ if value: returnValue = value if value[0] == '@': try: # can be a literal value or a resId res_id = int('0x' + value[1:], 16) res_id = arsc.get_id(packageName, res_id)[1] returnValue = arsc.get_string(packageName, res_id)[1] except (ValueError, TypeError): pass return returnValue return '' def is_debuggable_or_testOnly(apkfile): """Return True if the given file is an APK and is debuggable or testOnly. These two settings should never be enabled in release builds. This parses from the APK and nothing else to run fast, since it is run on every APK as part of update. Parameters ---------- apkfile full path to the APK to check """ if get_file_extension(apkfile) != 'apk': return False try: # these were moved in androguard 4.0 from androguard.core.axml import AXMLParser, format_value, START_TAG except ImportError: from androguard.core.bytecodes.axml import AXMLParser, format_value, START_TAG _androguard_logging_level() with ZipFile(apkfile) as apk: with apk.open('AndroidManifest.xml') as manifest: axml = AXMLParser(manifest.read()) while axml.is_valid(): _type = next(axml) if _type == START_TAG and axml.getName() == 'application': for i in range(0, axml.getAttributeCount()): name = axml.getAttributeName(i) if name in ('debuggable', 'testOnly'): _type = axml.getAttributeValueType(i) _data = axml.getAttributeValueData(i) value = format_value(_type, _data, lambda _: axml.getAttributeValue(i)) if value == 'true': return True else: return False break return False def get_apk_id(apkfile): """Extract identification information from APK. Androguard is preferred since it is more reliable and a lot faster. Occasionally, when androguard can't get the info from the APK, aapt still can. So aapt is also used as the final fallback method. Parameters ---------- apkfile path to an APK file. Returns ------- appid version code version name """ try: return get_apk_id_androguard(apkfile) except zipfile.BadZipFile as e: if config and 'aapt' in config: logging.error(apkfile + ': ' + str(e)) return get_apk_id_aapt(apkfile) else: raise e def get_apk_id_androguard(apkfile): """Read (appid, versionCode, versionName) from an APK. This first tries to do quick binary XML parsing to just get the values that are needed. It will fallback to full androguard parsing, which is slow, if it can't find the versionName value or versionName is set to a Android String Resource (e.g. an integer hex value that starts with @). This function is part of androguard as get_apkid(), so this vendored and modified to return versionCode as an integer. """ if not os.path.exists(apkfile): raise FDroidException(_("Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'") .format(apkfilename=apkfile)) try: # these were moved in androguard 4.0 from androguard.core.axml import AXMLParser, format_value, START_TAG, END_TAG, TEXT, END_DOCUMENT except ImportError: from androguard.core.bytecodes.axml import AXMLParser, format_value, START_TAG, END_TAG, TEXT, END_DOCUMENT _androguard_logging_level() appid = None versionCode = None versionName = None with zipfile.ZipFile(apkfile) as apk: with apk.open('AndroidManifest.xml') as manifest: axml = AXMLParser(manifest.read()) count = 0 while axml.is_valid(): _type = next(axml) count += 1 if _type == START_TAG: for i in range(0, axml.getAttributeCount()): name = axml.getAttributeName(i) _type = axml.getAttributeValueType(i) _data = axml.getAttributeValueData(i) value = format_value(_type, _data, lambda _: axml.getAttributeValue(i)) if appid is None and name == 'package': appid = value elif versionCode is None and name == 'versionCode': if value.startswith('0x'): versionCode = int(value, 16) else: versionCode = int(value) elif versionName is None and name == 'versionName': versionName = value if axml.getName() == 'manifest': break elif _type in (END_TAG, TEXT, END_DOCUMENT): raise RuntimeError('{path}: must be the first element in AndroidManifest.xml' .format(path=apkfile)) if not versionName or versionName[0] == '@': a = get_androguard_APK(apkfile) versionName = ensure_final_value(a.package, a.get_android_resources(), a.get_androidversion_name()) if not versionName: versionName = '' # versionName is expected to always be a str return appid, versionCode, versionName.strip('\0') def get_apk_id_aapt(apkfile): """Read (appid, versionCode, versionName) from an APK.""" p = SdkToolsPopen(['aapt', 'dump', 'badging', apkfile], output=False) m = APK_ID_TRIPLET_REGEX.match(p.output[0:p.output.index('\n')]) if m: return m.group(1), int(m.group(2)), m.group(3) raise FDroidException(_( "Reading packageName/versionCode/versionName failed," "APK invalid: '{apkfilename}'" ).format(apkfilename=apkfile)) def get_native_code(apkfile): """Aapt checks if there are architecture folders under the lib/ folder. We are simulating the same behaviour. """ arch_re = re.compile("^lib/(.*)/.*$") archset = set() with ZipFile(apkfile) as apk: for filename in apk.namelist(): m = arch_re.match(filename) if m: archset.add(m.group(1)) return sorted(list(archset)) class PopenResult: def __init__(self, returncode=None, output=None): self.returncode = returncode self.output = output def SdkToolsPopen(commands, cwd=None, output=True): cmd = commands[0] if cmd not in config: config[cmd] = find_sdk_tools_cmd(commands[0]) abscmd = config[cmd] if abscmd is None: raise FDroidException(_("Could not find '{command}' on your system").format(command=cmd)) if cmd == 'aapt': test_aapt_version(config['aapt']) return FDroidPopen([abscmd] + commands[1:], cwd=cwd, output=output) def FDroidPopenBytes(commands, cwd=None, envs=None, output=True, stderr_to_stdout=True): """ Run a command and capture the possibly huge output as bytes. Parameters ---------- commands command and argument list like in subprocess.Popen cwd optionally specifies a working directory envs a optional dictionary of environment variables and their values Returns ------- A PopenResult. """ global env if env is None: set_FDroidPopen_env() process_env = env.copy() if envs is not None and len(envs) > 0: process_env.update(envs) if cwd: cwd = os.path.normpath(cwd) logging.debug("Directory: %s" % cwd) logging.debug("> %s" % ' '.join(commands)) stderr_param = subprocess.STDOUT if stderr_to_stdout else subprocess.PIPE result = PopenResult() p = None try: p = subprocess.Popen(commands, cwd=cwd, shell=False, env=process_env, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=stderr_param) except OSError as e: raise BuildException("OSError while trying to execute " + ' '.join(commands) + ': ' + str(e)) from e # TODO are these AsynchronousFileReader threads always exiting? if not stderr_to_stdout and options.verbose: stderr_queue = Queue() stderr_reader = AsynchronousFileReader(p.stderr, stderr_queue) while not stderr_reader.eof(): while not stderr_queue.empty(): line = stderr_queue.get() sys.stderr.buffer.write(line) sys.stderr.flush() time.sleep(0.1) stdout_queue = Queue() stdout_reader = AsynchronousFileReader(p.stdout, stdout_queue) buf = io.BytesIO() # Check the queue for output (until there is no more to get) while not stdout_reader.eof(): while not stdout_queue.empty(): line = stdout_queue.get() if output and options.verbose: # Output directly to console sys.stderr.buffer.write(line) sys.stderr.flush() buf.write(line) time.sleep(0.1) result.returncode = p.wait() result.output = buf.getvalue() buf.close() # make sure all filestreams of the subprocess are closed for streamvar in ['stdin', 'stdout', 'stderr']: if hasattr(p, streamvar): stream = getattr(p, streamvar) if stream: stream.close() return result def FDroidPopen(commands, cwd=None, envs=None, output=True, stderr_to_stdout=True): """ Run a command and capture the possibly huge output as a str. Parameters ---------- commands command and argument list like in subprocess.Popen cwd optionally specifies a working directory envs a optional dictionary of environment variables and their values Returns ------- A PopenResult. """ result = FDroidPopenBytes(commands, cwd, envs, output, stderr_to_stdout) result.output = result.output.decode('utf-8', 'ignore') return result gradle_comment = re.compile(r'[ ]*//') gradle_signing_configs = re.compile(r'^[\t ]*signingConfigs[ \t]*{[ \t]*$') gradle_line_matches = [ re.compile(r'^[\t ]*signingConfig\s*[= ]\s*[^ ]*$'), re.compile(r'.*android\.signingConfigs\.[^{]*$'), re.compile(r'.*release\.signingConfig *= *'), ] def remove_signing_keys(build_dir): for root, dirs, files in os.walk(build_dir): gradlefile = None if 'build.gradle' in files: gradlefile = "build.gradle" elif 'build.gradle.kts' in files: gradlefile = "build.gradle.kts" if gradlefile: path = os.path.join(root, gradlefile) with open(path, "r") as o: lines = o.readlines() changed = False opened = 0 i = 0 with open(path, "w") as o: while i < len(lines): line = lines[i] i += 1 while line.endswith('\\\n'): line = line.rstrip('\\\n') + lines[i] i += 1 if gradle_comment.match(line): o.write(line) continue if opened > 0: opened += line.count('{') opened -= line.count('}') continue if gradle_signing_configs.match(line): changed = True opened += 1 continue if any(s.match(line) for s in gradle_line_matches): changed = True continue if opened == 0: o.write(line) if changed: logging.info("Cleaned %s of keysigning configs at %s" % (gradlefile, path)) for propfile in [ 'project.properties', 'build.properties', 'default.properties', 'ant.properties', ]: if propfile in files: path = os.path.join(root, propfile) with open(path, "r", encoding='iso-8859-1') as o: lines = o.readlines() changed = False with open(path, "w", encoding='iso-8859-1') as o: for line in lines: if any(line.startswith(s) for s in ('key.store', 'key.alias')): changed = True continue o.write(line) if changed: logging.info("Cleaned %s of keysigning configs at %s" % (propfile, path)) def set_FDroidPopen_env(build=None): """Set up the environment variables for the build environment. There is only a weak standard, the variables used by gradle, so also set up the most commonly used environment variables for SDK and NDK. Also, if there is no locale set, this will set the locale (e.g. LANG) to en_US.UTF-8. """ global env, orig_path if env is None: env = os.environ orig_path = env['PATH'] if config: if config.get('sdk_path'): for n in ['ANDROID_HOME', 'ANDROID_SDK', 'ANDROID_SDK_ROOT']: env[n] = config['sdk_path'] for k, v in config.get('java_paths', {}).items(): env['JAVA%s_HOME' % k] = v missinglocale = True for k, v in env.items(): if k == 'LANG' and v != 'C': missinglocale = False elif k == 'LC_ALL': missinglocale = False if missinglocale: env['LANG'] = 'en_US.UTF-8' if build is not None: path = build.ndk_path() paths = orig_path.split(os.pathsep) if path and path not in paths: paths = [path] + paths env['PATH'] = os.pathsep.join(paths) for n in ['ANDROID_NDK', 'NDK', 'ANDROID_NDK_HOME']: env[n] = build.ndk_path() def replace_build_vars(cmd, build): cmd = cmd.replace('$$COMMIT$$', build.commit) cmd = cmd.replace('$$VERSION$$', build.versionName) cmd = cmd.replace('$$VERCODE$$', str(build.versionCode)) return cmd def replace_config_vars(cmd, build): cmd = cmd.replace('$$SDK$$', config['sdk_path']) cmd = cmd.replace('$$NDK$$', build.ndk_path()) if build is not None: cmd = replace_build_vars(cmd, build) return cmd def place_srclib(root_dir, number, libpath): if not number: return relpath = os.path.relpath(libpath, root_dir) proppath = os.path.join(root_dir, 'project.properties') lines = [] if os.path.isfile(proppath): with open(proppath, "r", encoding='iso-8859-1') as o: lines = o.readlines() with open(proppath, "w", encoding='iso-8859-1') as o: placed = False for line in lines: if line.startswith('android.library.reference.%d=' % number): o.write('android.library.reference.%d=%s\n' % (number, relpath)) placed = True else: o.write(line) if not placed: o.write('android.library.reference.%d=%s\n' % (number, relpath)) APK_SIGNATURE_FILES = re.compile(r'META-INF/[0-9A-Za-z_\-]+\.(SF|RSA|DSA|EC)') def signer_fingerprint_short(cert_encoded): """Obtain shortened sha256 signing-key fingerprint for pkcs7 DER certficate. Extracts the first 7 hexadecimal digits of sha256 signing-key fingerprint for a given pkcs7 signature. Parameters ---------- cert_encoded Contents of an APK signing certificate. Returns ------- shortened signing-key fingerprint. """ return signer_fingerprint(cert_encoded)[:7] def signer_fingerprint(cert_encoded): """Return SHA-256 signer fingerprint for PKCS#7 DER-encoded signature. Parameters ---------- Contents of an APK signature. Returns ------- Standard SHA-256 signer fingerprint. """ return hashlib.sha256(cert_encoded).hexdigest() def get_first_signer_certificate(apkpath): """Get the first signing certificate from the APK, DER-encoded. JAR and APK Signatures allow for multiple signers, though it is rarely used, and this is poorly documented. So this method only fetches the first certificate, and errors out if there are more. Starting with targetSdkVersion 30, APK v2 Signatures are required. https://developer.android.com/about/versions/11/behavior-changes-11#minimum-signature-scheme When a APK v2+ signature is present, the JAR signature is not verified. The verifier parses the signers from the v2+ signature and does not seem to look at the JAR signature. https://source.android.com/docs/security/features/apksigning/v2#apk-signature-scheme-v2-block https://android.googlesource.com/platform/tools/apksig/+/refs/tags/android-13.0.0_r3/src/main/java/com/android/apksig/ApkVerifier.java#270 apksigner checks that the signers from all the APK signatures match: https://android.googlesource.com/platform/tools/apksig/+/refs/tags/android-13.0.0_r3/src/main/java/com/android/apksig/ApkVerifier.java#383 apksigner verifies each signer's signature block file .(RSA|DSA|EC) against the corresponding signature file .SF https://android.googlesource.com/platform/tools/apksig/+/refs/tags/android-13.0.0_r3/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeVerifier.java#280 NoOverwriteDict is a workaround for: https://github.com/androguard/androguard/issues/1030 Lots more discusion here: https://gitlab.com/fdroid/fdroidserver/-/issues/1128 """ class NoOverwriteDict(dict): def __setitem__(self, k, v): if k not in self: super().__setitem__(k, v) cert_encoded = None found_certs = [] apkobject = get_androguard_APK(apkpath) apkobject._v2_blocks = NoOverwriteDict() certs_v3 = apkobject.get_certificates_der_v3() if certs_v3: cert_v3 = certs_v3[0] found_certs.append(cert_v3) if not cert_encoded: logging.debug(_('Using APK Signature v3')) cert_encoded = cert_v3 certs_v2 = apkobject.get_certificates_der_v2() if certs_v2: cert_v2 = certs_v2[0] found_certs.append(cert_v2) if not cert_encoded: logging.debug(_('Using APK Signature v2')) cert_encoded = cert_v2 if get_min_sdk_version(apkobject) < 24 or ( not (certs_v3 or certs_v2) and get_effective_target_sdk_version(apkobject) < 30 ): with zipfile.ZipFile(apkpath, 'r') as apk: cert_files = [ n for n in apk.namelist() if SIGNATURE_BLOCK_FILE_REGEX.match(n) ] if len(cert_files) > 1: logging.error( _("Found multiple JAR Signature Block Files in {path}").format( path=apkpath ) ) return elif len(cert_files) == 1: signature_block_file = cert_files[0] signature_file = ( cert_files[0][: signature_block_file.rindex('.')] + '.SF' ) cert_v1 = get_certificate( apk.read(signature_block_file), apk.read(signature_file), ) found_certs.append(cert_v1) if not cert_encoded: logging.debug(_('Using JAR Signature')) cert_encoded = cert_v1 if not cert_encoded: logging.error(_("No signing certificates found in {path}").format(path=apkpath)) return if not all(cert == found_certs[0] for cert in found_certs): logging.error( _("APK signatures have different certificates in {path}:").format( path=apkpath ) ) return return cert_encoded def apk_signer_fingerprint(apk_path): """Get SHA-256 fingerprint string for the first signer from given APK. Parameters ---------- apk_path path to APK Returns ------- Standard SHA-256 signer fingerprint """ cert_encoded = get_first_signer_certificate(apk_path) if not cert_encoded: return None return signer_fingerprint(cert_encoded) def apk_signer_fingerprint_short(apk_path): """Get 7 hex digit SHA-256 fingerprint string for the first signer from given APK. Parameters ---------- apk_path path to APK Returns ------- first 7 chars of the standard SHA-256 signer fingerprint """ return apk_signer_fingerprint(apk_path)[:7] def metadata_get_sigdir(appid, vercode=None): """Get signature directory for app.""" if vercode: return os.path.join('metadata', appid, 'signatures', str(vercode)) else: return os.path.join('metadata', appid, 'signatures') def metadata_find_developer_signature(appid, vercode=None): """Try to find the developer signature for given appid. This picks the first signature file found in metadata an returns its signature. Returns ------- sha256 signing key fingerprint of the developer signing key. None in case no signature can not be found. """ # fetch list of dirs for all versions of signatures appversigdirs = [] if vercode: appversigdirs.append(metadata_get_sigdir(appid, vercode)) else: appsigdir = metadata_get_sigdir(appid) if os.path.isdir(appsigdir): numre = re.compile('[0-9]+') for ver in os.listdir(appsigdir): if numre.match(ver): appversigdir = os.path.join(appsigdir, ver) appversigdirs.append(appversigdir) for sigdir in appversigdirs: signature_block_files = ( glob.glob(os.path.join(sigdir, '*.DSA')) + glob.glob(os.path.join(sigdir, '*.EC')) + glob.glob(os.path.join(sigdir, '*.RSA')) ) if len(signature_block_files) > 1: raise FDroidException('ambiguous signatures, please make sure there is only one signature in \'{}\'. (The signature has to be the App maintainers signature for version of the APK.)'.format(sigdir)) for signature_block_file in signature_block_files: with open(signature_block_file, 'rb') as f: return signer_fingerprint(get_certificate(f.read())) return None def metadata_find_signing_files(appid, vercode): """Get a list of signed manifests and signatures. Parameters ---------- appid app id string vercode app version code Returns ------- List of 4-tuples for each signing key with following paths: (signature_file, signature_block_file, manifest, v2_files), where v2_files is either a (apk_signing_block_offset_file, apk_signing_block_file) pair or None References ---------- * https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html * https://source.android.com/security/apksigning/v2 * https://source.android.com/security/apksigning/v3 """ ret = [] sigdir = metadata_get_sigdir(appid, vercode) signature_block_files = ( glob.glob(os.path.join(sigdir, '*.DSA')) + glob.glob(os.path.join(sigdir, '*.EC')) + glob.glob(os.path.join(sigdir, '*.RSA')) ) signature_block_pat = re.compile(r'(\.DSA|\.EC|\.RSA)$') apk_signing_block = os.path.join(sigdir, "APKSigningBlock") apk_signing_block_offset = os.path.join(sigdir, "APKSigningBlockOffset") if os.path.isfile(apk_signing_block) and os.path.isfile(apk_signing_block_offset): v2_files = apk_signing_block, apk_signing_block_offset else: v2_files = None for signature_block_file in signature_block_files: signature_file = signature_block_pat.sub('.SF', signature_block_file) if os.path.isfile(signature_file): manifest = os.path.join(sigdir, 'MANIFEST.MF') if os.path.isfile(manifest): ret.append((signature_block_file, signature_file, manifest, v2_files)) return ret def metadata_find_developer_signing_files(appid, vercode): """Get developer signature files for specified app from metadata. Returns ------- List of 4-tuples for each signing key with following paths: (signature_file, signature_block_file, manifest, v2_files), where v2_files is either a (apk_signing_block_offset_file, apk_signing_block_file) pair or None """ allsigningfiles = metadata_find_signing_files(appid, vercode) if allsigningfiles and len(allsigningfiles) == 1: return allsigningfiles[0] else: return None class ClonedZipInfo(zipfile.ZipInfo): """Hack to allow fully cloning ZipInfo instances. The zipfile library has some bugs that prevent it from fully cloning ZipInfo entries. https://bugs.python.org/issue43547 """ def __init__(self, zinfo): super().__init__() self.original = zinfo for k in self.__slots__: try: setattr(self, k, getattr(zinfo, k)) except AttributeError: pass def __getattribute__(self, name): if name in ("date_time", "external_attr", "flag_bits"): return getattr(self.original, name) return object.__getattribute__(self, name) def apk_has_v1_signatures(apkfile): """Test whether an APK has v1 signature files.""" with ZipFile(apkfile, 'r') as apk: for info in apk.infolist(): if APK_SIGNATURE_FILES.match(info.filename): return True return False def apk_strip_v1_signatures(signed_apk, strip_manifest=False): """Remove signatures from APK. Parameters ---------- signed_apk path to APK file. strip_manifest when set to True also the manifest file will be removed from the APK. """ with tempfile.TemporaryDirectory() as tmpdir: tmp_apk = os.path.join(tmpdir, 'tmp.apk') shutil.move(signed_apk, tmp_apk) with ZipFile(tmp_apk, 'r') as in_apk: with ZipFile(signed_apk, 'w') as out_apk: for info in in_apk.infolist(): if not APK_SIGNATURE_FILES.match(info.filename): if strip_manifest: if info.filename != 'META-INF/MANIFEST.MF': buf = in_apk.read(info.filename) out_apk.writestr(ClonedZipInfo(info), buf) else: buf = in_apk.read(info.filename) out_apk.writestr(ClonedZipInfo(info), buf) def apk_implant_signatures(apkpath, outpath, manifest): """Implant a signature from metadata into an APK. Note: this changes there supplied APK in place. So copy it if you need the original to be preserved. Parameters ---------- apkpath location of the unsigned apk outpath location of the output apk References ---------- * https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html * https://source.android.com/security/apksigning/v2 * https://source.android.com/security/apksigning/v3 """ sigdir = os.path.dirname(manifest) # FIXME apksigcopier.do_patch(sigdir, apkpath, outpath, v1_only=None, exclude=apksigcopier.exclude_meta) def apk_extract_signatures(apkpath, outdir): """Extract a signature files from APK and puts them into target directory. Parameters ---------- apkpath location of the apk outdir older where the extracted signature files will be stored References ---------- * https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html * https://source.android.com/security/apksigning/v2 * https://source.android.com/security/apksigning/v3 """ apksigcopier.do_extract(apkpath, outdir, v1_only=None) def get_min_sdk_version(apk): """Wrap the androguard function to always return an integer. Fall back to 1 if we can't get a valid minsdk version. Parameters ---------- apk androguard APK object Returns ------- minSdkVersion: int """ try: return int(apk.get_min_sdk_version()) except TypeError: return 1 def get_effective_target_sdk_version(apk): """Wrap the androguard function to always return an integer. Parameters ---------- apk androguard APK object Returns ------- targetSdkVersion: int """ try: return int(apk.get_effective_target_sdk_version()) except TypeError: return get_min_sdk_version(apk) def get_apksigner_smartcardoptions(smartcardoptions): if '-providerName' in smartcardoptions.copy(): pos = smartcardoptions.index('-providerName') # remove -providerName and it's argument del smartcardoptions[pos] del smartcardoptions[pos] replacements = {'-storetype': '--ks-type', '-providerClass': '--provider-class', '-providerArg': '--provider-arg'} return [replacements.get(n, n) for n in smartcardoptions] def sign_apk(unsigned_path, signed_path, keyalias): """Sign an unsigned APK, then save to a new file, deleting the unsigned. NONE is a Java keyword used to configure smartcards as the keystore. Otherwise, the keystore is a local file. https://docs.oracle.com/javase/7/docs/technotes/guides/security/p11guide.html#KeyToolJarSigner When using smartcards, apksigner does not use the same options has Java/keytool/jarsigner (-providerName, -providerClass, -providerArg, -storetype). apksigner documents the options as --ks-provider-class and --ks-provider-arg. Those seem to be accepted but fail when actually making a signature with weird internal exceptions. We use the options that actually work. From: https://geoffreymetais.github.io/code/key-signing/#scripting """ if config['keystore'] == 'NONE': signing_args = get_apksigner_smartcardoptions(config['smartcardoptions']) else: signing_args = ['--key-pass', 'env:FDROID_KEY_PASS'] apksigner = config.get('apksigner', '') if not shutil.which(apksigner): raise BuildException(_("apksigner not found, it's required for signing!")) cmd = [apksigner, 'sign', '--ks', config['keystore'], '--ks-pass', 'env:FDROID_KEY_STORE_PASS'] cmd += signing_args cmd += ['--ks-key-alias', keyalias, '--in', unsigned_path, '--out', signed_path] p = FDroidPopen(cmd, envs={ 'FDROID_KEY_STORE_PASS': config['keystorepass'], 'FDROID_KEY_PASS': config.get('keypass', "")}) if p.returncode != 0: if os.path.exists(signed_path): os.remove(signed_path) raise BuildException(_("Failed to sign application"), p.output) os.remove(unsigned_path) def verify_apks(signed_apk, unsigned_apk, tmp_dir, v1_only=None): """Verify that two apks are the same. One of the inputs is signed, the other is unsigned. The signature metadata is transferred from the signed to the unsigned apk, and then apksigner is used to verify that the signature from the signed APK is also valid for the unsigned one. If the APK given as unsigned actually does have a signature, it will be stripped out and ignored. Parameters ---------- signed_apk Path to a signed APK file unsigned_apk Path to an unsigned APK file expected to match it tmp_dir Path to directory for temporary files v1_only True for v1-only signatures, False for v1 and v2 signatures, or None for autodetection Returns ------- None if the verification is successful, otherwise a string describing what went wrong. """ if not verify_apk_signature(signed_apk): logging.info('...NOT verified - {0}'.format(signed_apk)) return 'verification of signed APK failed' if not os.path.isfile(signed_apk): return 'can not verify: file does not exists: {}'.format(signed_apk) if not os.path.isfile(unsigned_apk): return 'can not verify: file does not exists: {}'.format(unsigned_apk) tmp_apk = os.path.join(tmp_dir, 'sigcp_' + os.path.basename(unsigned_apk)) try: apksigcopier.do_copy(signed_apk, unsigned_apk, tmp_apk, v1_only=v1_only, exclude=apksigcopier.exclude_meta) except apksigcopier.APKSigCopierError as e: logging.info('...NOT verified - {0}'.format(tmp_apk)) error = 'signature copying failed: {}'.format(str(e)) result = compare_apks(signed_apk, unsigned_apk, tmp_dir, os.path.dirname(unsigned_apk)) if result is not None: error += '\nComparing reference APK to unsigned APK...\n' + result return error if not verify_apk_signature(tmp_apk): logging.info('...NOT verified - {0}'.format(tmp_apk)) error = 'verification of APK with copied signature failed' result = compare_apks(signed_apk, tmp_apk, tmp_dir, os.path.dirname(unsigned_apk)) if result is not None: error += '\nComparing reference APK to APK with copied signature...\n' + result return error logging.info('...successfully verified') return None def verify_jar_signature(jar): """Verify the signature of a given JAR file. jarsigner is very shitty: unsigned JARs pass as "verified"! So this has to turn on -strict then check for result 4, since this does not expect the signature to be from a CA-signed certificate. Raises ------ VerificationException If the JAR's signature could not be verified. """ error = _('JAR signature failed to verify: {path}').format(path=jar) try: output = subprocess.check_output( [config['jarsigner'], '-strict', '-verify', jar], stderr=subprocess.STDOUT ) raise VerificationException(error + '\n' + output.decode('utf-8')) except subprocess.CalledProcessError as e: if e.returncode == 4: logging.debug(_('JAR signature verified: {path}').format(path=jar)) else: raise VerificationException(error + '\n' + e.output.decode('utf-8')) from e def verify_deprecated_jar_signature(jar): """Verify the signature of a given JAR file, allowing deprecated algorithms. index.jar (v0) and index-v1.jar are both signed by MD5/SHA1 by definition, so this method provides a way to verify those. Also, apksigner has different deprecation rules than jarsigner, so this is our current hack to try to represent the apksigner rules when executing jarsigner. jarsigner is very shitty: unsigned JARs pass as "verified"! So this has to turn on -strict then check for result 4, since this does not expect the signature to be from a CA-signed certificate. Also used to verify the signature on an archived APK, supporting deprecated algorithms. F-Droid aims to keep every single binary that it ever published. Therefore, it needs to be able to verify APK signatures that include deprecated/removed algorithms. For example, jarsigner treats an MD5 signature as unsigned. jarsigner passes unsigned APKs as "verified"! So this has to turn on -strict then check for result 4. Just to be safe, this never reuses the file, and locks down the file permissions while in use. That should prevent a bad actor from changing the settings during operation. Raises ------ VerificationException If the JAR's signature could not be verified. """ error = _('JAR signature failed to verify: {path}').format(path=jar) with tempfile.TemporaryDirectory() as tmpdir: java_security = os.path.join(tmpdir, 'java.security') with open(java_security, 'w') as fp: fp.write('jdk.jar.disabledAlgorithms=MD2, RSA keySize < 1024') os.chmod(java_security, 0o400) try: cmd = [ config['jarsigner'], '-J-Djava.security.properties=' + java_security, '-strict', '-verify', jar ] output = subprocess.check_output(cmd, stderr=subprocess.STDOUT) raise VerificationException(error + '\n' + output.decode('utf-8')) except subprocess.CalledProcessError as e: if e.returncode == 4: logging.debug(_('JAR signature verified: {path}').format(path=jar)) else: raise VerificationException(error + '\n' + e.output.decode('utf-8')) from e def verify_apk_signature(apk, min_sdk_version=None): """Verify the signature on an APK. Try to use apksigner whenever possible since jarsigner is very shitty: unsigned APKs pass as "verified"! Warning, this does not work on JARs with apksigner >= 0.7 (build-tools 26.0.1) Returns ------- Boolean whether the APK was verified """ if set_command_in_config('apksigner'): args = [config['apksigner'], 'verify'] if min_sdk_version: args += ['--min-sdk-version=' + min_sdk_version] if options.verbose: args += ['--verbose'] try: output = subprocess.check_output(args + [apk]) if options.verbose: logging.debug(apk + ': ' + output.decode('utf-8')) return True except subprocess.CalledProcessError as e: logging.error('\n' + apk + ': ' + e.output.decode('utf-8')) else: if not config.get('jarsigner_warning_displayed'): config['jarsigner_warning_displayed'] = True logging.warning(_("Using Java's jarsigner, not recommended for verifying APKs! Use apksigner")) try: verify_deprecated_jar_signature(apk) return True except Exception as e: logging.error(e) return False apk_badchars = re.compile('''[/ :;'"]''') def compare_apks(apk1, apk2, tmp_dir, log_dir=None): """Compare two apks. Returns ------- None if the APK content is the same (apart from the signing key), otherwise a string describing what's different, or what went wrong when trying to do the comparison. """ if not log_dir: log_dir = tmp_dir absapk1 = os.path.abspath(apk1) absapk2 = os.path.abspath(apk2) if set_command_in_config('diffoscope'): logfilename = os.path.join(log_dir, os.path.basename(absapk1)) htmlfile = logfilename + '.diffoscope.html' textfile = logfilename + '.diffoscope.txt' if subprocess.call([config['diffoscope'], '--max-report-size', '12345678', '--max-diff-block-lines', '128', '--html', htmlfile, '--text', textfile, absapk1, absapk2]) != 0: return "Failed to run diffoscope " + apk1 apk1dir = os.path.join(tmp_dir, apk_badchars.sub('_', apk1[0:-4])) # trim .apk apk2dir = os.path.join(tmp_dir, apk_badchars.sub('_', apk2[0:-4])) # trim .apk for d in [apk1dir, apk2dir]: if os.path.exists(d): shutil.rmtree(d) os.mkdir(d) os.mkdir(os.path.join(d, 'content')) # extract APK contents for comparision with ZipFile(absapk1, 'r') as f: f.extractall(path=os.path.join(apk1dir, 'content')) with ZipFile(absapk2, 'r') as f: f.extractall(path=os.path.join(apk2dir, 'content')) if set_command_in_config('apktool'): if subprocess.call([config['apktool'], 'd', absapk1, '--output', 'apktool'], cwd=apk1dir) != 0: return "Failed to run apktool " + apk1 if subprocess.call([config['apktool'], 'd', absapk2, '--output', 'apktool'], cwd=apk2dir) != 0: return "Failed to run apktool " + apk2 p = FDroidPopen(['diff', '-r', apk1dir, apk2dir], output=False) lines = p.output.splitlines() if len(lines) != 1 or 'META-INF' not in lines[0]: if set_command_in_config('meld'): p = FDroidPopen([config['meld'], apk1dir, apk2dir], output=False) return "Unexpected diff output:\n" + p.output # since everything verifies, delete the comparison to keep cruft down shutil.rmtree(apk1dir) shutil.rmtree(apk2dir) # If we get here, it seems like they're the same! return None def set_command_in_config(command): """Try to find specified command in the path, if it hasn't been manually set in config.yml. If found, it is added to the config dict. The return value says whether the command is available. """ if command in config: return True else: tmp = find_command(command) if tmp is not None: config[command] = tmp return True return False def find_command(command): """Find the full path of a command, or None if it can't be found in the PATH.""" def is_exe(fpath): return os.path.isfile(fpath) and os.access(fpath, os.X_OK) fpath, fname = os.path.split(command) if fpath: if is_exe(command): return command else: for path in os.environ["PATH"].split(os.pathsep): path = path.strip('"') exe_file = os.path.join(path, command) if is_exe(exe_file): return exe_file return None def genpassword(): """Generate a random password for when generating keys.""" h = hashlib.sha256() h.update(os.urandom(16)) # salt h.update(socket.getfqdn().encode('utf-8')) passwd = base64.b64encode(h.digest()).strip() return passwd.decode('utf-8') def genkeystore(localconfig): """Generate a new key with password provided in localconfig and add it to new keystore. Parameters ---------- localconfig Returns ------- hexed public key, public key fingerprint """ logging.info('Generating a new key in "' + localconfig['keystore'] + '"...') keystoredir = os.path.dirname(localconfig['keystore']) if keystoredir is None or keystoredir == '': keystoredir = os.path.join(os.getcwd(), keystoredir) if not os.path.exists(keystoredir): os.makedirs(keystoredir, mode=0o700) env_vars = {'LC_ALL': 'C.UTF-8', 'FDROID_KEY_STORE_PASS': localconfig['keystorepass'], 'FDROID_KEY_PASS': localconfig.get('keypass', "")} cmd = [config['keytool'], '-genkey', '-keystore', localconfig['keystore'], '-alias', localconfig['repo_keyalias'], '-keyalg', 'RSA', '-keysize', '4096', '-sigalg', 'SHA256withRSA', '-validity', '10000', '-storetype', 'pkcs12', '-storepass:env', 'FDROID_KEY_STORE_PASS', '-dname', localconfig['keydname'], '-J-Duser.language=en'] if localconfig['keystore'] == "NONE": cmd += localconfig['smartcardoptions'] else: cmd += '-keypass:env', 'FDROID_KEY_PASS' p = FDroidPopen(cmd, envs=env_vars) if p.returncode != 0: raise BuildException("Failed to generate key", p.output) if localconfig['keystore'] != "NONE": os.chmod(localconfig['keystore'], 0o0600) if not options.quiet: # now show the lovely key that was just generated p = FDroidPopen([config['keytool'], '-list', '-v', '-keystore', localconfig['keystore'], '-alias', localconfig['repo_keyalias'], '-storepass:env', 'FDROID_KEY_STORE_PASS', '-J-Duser.language=en'] + config['smartcardoptions'], envs=env_vars) logging.info(p.output.strip() + '\n\n') # get the public key p = FDroidPopenBytes([config['keytool'], '-exportcert', '-keystore', localconfig['keystore'], '-alias', localconfig['repo_keyalias'], '-storepass:env', 'FDROID_KEY_STORE_PASS'] + config['smartcardoptions'], envs=env_vars, output=False, stderr_to_stdout=False) if p.returncode != 0 or len(p.output) < 20: raise BuildException("Failed to get public key", p.output) pubkey = p.output fingerprint = get_cert_fingerprint(pubkey) return hexlify(pubkey), fingerprint def get_cert_fingerprint(pubkey): """Generate a certificate fingerprint the same way keytool does it (but with slightly different formatting).""" digest = hashlib.sha256(pubkey).digest() ret = [' '.join("%02X" % b for b in bytearray(digest))] return " ".join(ret) def get_certificate(signature_block_file, signature_file=None): """Extract a single DER certificate from JAR Signature's "Signature Block File". If there is more than one signer certificate, this exits with an error, unless the signature_file is provided. If that is set, it will return the certificate that matches the Signature File, for example, if there is a certificate chain, like TLS does. In the fdroidserver use cases, there should always be a single signer. But rarely, some APKs include certificate chains. This could be replaced by androguard's APK.get_certificate_der() provided the cert chain fix was merged there. Maybe in 4.1.2? https://github.com/androguard/androguard/pull/1038 https://docs.oracle.com/en/java/javase/21/docs/specs/man/jarsigner.html#the-signed-jar-file Parameters ---------- signature_block_file Bytes representing the PKCS#7 signer certificate and signature, as read directly out of the JAR/APK, e.g. CERT.RSA. signature_file Bytes representing the manifest signed by the Signature Block File, e.g. CERT.SF. If this is not given, the assumption is there will be only a single certificate in signature_block_file, otherwise it is an error. Returns ------- A binary representation of the certificate's public key, or None in case of error """ pkcs7obj = cms.ContentInfo.load(signature_block_file) certificates = pkcs7obj['content']['certificates'] if len(certificates) == 1: return certificates[0].chosen.dump() elif not signature_file: logging.error(_('Found multiple Signer Certificates!')) return certificate = get_jar_signer_certificate(pkcs7obj, signature_file) if certificate: return certificate.chosen.dump() def _find_matching_certificate(signer_info, certificate): """Find the certificates that matches signer_info using issuer and serial number. https://android.googlesource.com/platform/tools/apksig/+/refs/tags/android-13.0.0_r3/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeVerifier.java#590 https://android.googlesource.com/platform/tools/apksig/+/refs/tags/android-13.0.0_r3/src/main/java/com/android/apksig/internal/x509/Certificate.java#55 """ certificate_serial = certificate.chosen['tbs_certificate']['serial_number'] expected_issuer_serial = signer_info['sid'].chosen return ( expected_issuer_serial['issuer'] == certificate.chosen.issuer and expected_issuer_serial['serial_number'] == certificate_serial ) def get_jar_signer_certificate(pkcs7obj: cms.ContentInfo, signature_file: bytes): """Return the one certificate in a chain that actually signed the manifest. PKCS#7-signed data can include certificate chains for use cases where an Certificate Authority (CA) is used. Android does not validate the certificate chain on APK signatures, so neither does this. https://android.googlesource.com/platform/tools/apksig/+/refs/tags/android-13.0.0_r3/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeVerifier.java#512 Some useful fodder for understanding all this: https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html https://technotes.shemyak.com/posts/jar-signature-block-file-format/ https://docs.oracle.com/en/java/javase/21/docs/specs/man/jarsigner.html#the-signed-jar-file https://qistoph.blogspot.com/2012/01/manual-verify-pkcs7-signed-data-with.html """ import oscrypto.asymmetric import oscrypto.errors # Android attempts to verify all SignerInfos and then picks the first verified SignerInfo. first_verified_signer_info = None first_verified_signer_info_signing_certificate = None for signer_info in pkcs7obj['content']['signer_infos']: signature = signer_info['signature'].contents digest_algorithm = signer_info["digest_algorithm"]["algorithm"].native public_key = None for certificate in pkcs7obj['content']['certificates']: if _find_matching_certificate(signer_info, certificate): public_key = oscrypto.asymmetric.load_public_key(certificate.chosen.public_key) break if public_key is None: logging.info('No certificate found that matches signer info!') continue signature_algo = signer_info['signature_algorithm'].signature_algo if signature_algo == 'rsassa_pkcs1v15': # ASN.1 - 1.2.840.113549.1.1.1 verify_func = oscrypto.asymmetric.rsa_pkcs1v15_verify elif signature_algo == 'rsassa_pss': # ASN.1 - 1.2.840.113549.1.1.10 verify_func = oscrypto.asymmetric.rsa_pss_verify elif signature_algo == 'dsa': # ASN.1 - 1.2.840.10040.4.1 verify_func = oscrypto.asymmetric.dsa_verify elif signature_algo == 'ecdsa': # ASN.1 - 1.2.840.10045.4 verify_func = oscrypto.asymmetric.ecdsa_verify else: logging.error( 'Unknown signature algorithm %s:\n %s\n %s' % ( signature_algo, hexlify(certificate.chosen.sha256).decode(), certificate.chosen.subject.human_friendly, ), ) return try: verify_func(public_key, signature, signature_file, digest_algorithm) if not first_verified_signer_info: first_verified_signer_info = signer_info first_verified_signer_info_signing_certificate = certificate except oscrypto.errors.SignatureError as e: logging.error( '"%s", skipping:\n %s\n %s' % ( e, hexlify(certificate.chosen.sha256).decode(), certificate.chosen.subject.human_friendly), ) if first_verified_signer_info_signing_certificate: return first_verified_signer_info_signing_certificate def load_stats_fdroid_signing_key_fingerprints(): """Load signing-key fingerprints stored in file generated by fdroid publish. Returns ------- dict containing the signing-key fingerprints. """ jar_file = os.path.join('stats', 'publishsigkeys.jar') if not os.path.isfile(jar_file): return {} try: verify_deprecated_jar_signature(jar_file) except VerificationException as e: raise FDroidException("Signature validation of '{}' failed! " "Please run publish again to rebuild this file.".format(jar_file)) from e jar_sigkey = apk_signer_fingerprint(jar_file) repo_key_sig = config.get('repo_key_sha256') if repo_key_sig: if jar_sigkey != repo_key_sig: raise FDroidException("Signature key fingerprint of file '{}' does not match repo_key_sha256 in config.yml (found fingerprint: '{}')".format(jar_file, jar_sigkey)) else: logging.warning("repo_key_sha256 not in config.yml, setting it to the signature key fingerprint of '{}'".format(jar_file)) config['repo_key_sha256'] = jar_sigkey write_to_config(config, 'repo_key_sha256') with zipfile.ZipFile(jar_file, 'r') as f: return json.loads(str(f.read('publishsigkeys.json'), 'utf-8')) def write_to_config(thisconfig, key, value=None, config_file=None): """Write a key/value to the local config.yml or config.py. NOTE: only supports writing string variables. Parameters ---------- thisconfig config dictionary key variable name in config to be overwritten/added value optional value to be written, instead of fetched from 'thisconfig' dictionary. """ if value is None: origkey = key + '_orig' value = thisconfig[origkey] if origkey in thisconfig else thisconfig[key] if config_file: cfg = config_file elif os.path.exists('config.py') and not os.path.exists('config.yml'): cfg = 'config.py' else: cfg = 'config.yml' # load config file, create one if it doesn't exist if not os.path.exists(cfg): open(cfg, 'a').close() logging.info("Creating empty " + cfg) with open(cfg, 'r') as f: lines = f.readlines() # make sure the file ends with a carraige return if len(lines) > 0: if not lines[-1].endswith('\n'): lines[-1] += '\n' # regex for finding and replacing python string variable # definitions/initializations if cfg.endswith('.py'): pattern = re.compile(r'^[\s#]*' + key + r'\s*=\s*"[^"]*"') repl = key + ' = "' + value + '"' pattern2 = re.compile(r'^[\s#]*' + key + r"\s*=\s*'[^']*'") repl2 = key + " = '" + value + "'" else: # assume .yml as default pattern = re.compile(r'^[\s#]*' + key + r':.*') repl = yaml.dump({key: value}, default_flow_style=False) pattern2 = pattern repl2 = repl # If we replaced this line once, we make sure won't be a # second instance of this line for this key in the document. didRepl = False # edit config file with open(cfg, 'w') as f: for line in lines: if pattern.match(line) or pattern2.match(line): if not didRepl: line = pattern.sub(repl, line) line = pattern2.sub(repl2, line) f.write(line) didRepl = True else: f.write(line) if not didRepl: f.write('\n') f.write(repl) f.write('\n') def parse_xml(path): return XMLElementTree.parse(path).getroot() def string_is_integer(string): try: int(string, 0) return True except ValueError: try: int(string) return True except ValueError: return False def version_code_string_to_int(vercode): """Convert an version code string of any base into an int.""" # TODO: Python 3.6 allows underscores in numeric literals vercode = vercode.replace('_', '') try: return int(vercode, 0) except ValueError: return int(vercode) def get_app_display_name(app): """Get a human readable name for the app for logging and sorting. When trying to find a localized name, this first tries en-US since that his the historical language used for sorting. """ if app.get('Name'): return app['Name'] if app.get('localized'): localized = app['localized'].get(DEFAULT_LOCALE) if not localized: for v in app['localized'].values(): localized = v break if localized.get('name'): return localized['name'] return app.get('AutoName') or app['id'] def local_rsync(options, fromdir, todir): """Rsync method for local to local copying of things. This is an rsync wrapper with all the settings for safe use within the various fdroidserver use cases. This uses stricter rsync checking on all files since people using offline mode are already prioritizing security above ease and speed. """ rsyncargs = ['rsync', '--recursive', '--safe-links', '--times', '--perms', '--one-file-system', '--delete', '--chmod=Da+rx,Fa-x,a+r,u+w'] if not options.no_checksum: rsyncargs.append('--checksum') if options.verbose: rsyncargs += ['--verbose'] if options.quiet: rsyncargs += ['--quiet'] logging.debug(' '.join(rsyncargs + [fromdir, todir])) if subprocess.call(rsyncargs + [fromdir, todir]) != 0: raise FDroidException() def deploy_build_log_with_rsync(appid, vercode, log_content): """Upload build log of one individual app build to an fdroid repository. Parameters ---------- appid package name for dientifying to which app this log belongs. vercode version of the app to which this build belongs. log_content Content of the log which is about to be posted. Should be either a string or bytes. (bytes will be decoded as 'utf-8') """ if not log_content: logging.warning(_('skip deploying full build logs: log content is empty')) return if not os.path.exists('repo'): os.mkdir('repo') # gzip compress log file log_gz_path = os.path.join('repo', '{appid}_{versionCode}.log.gz'.format(appid=appid, versionCode=vercode)) with gzip.open(log_gz_path, 'wb') as f: if isinstance(log_content, str): f.write(bytes(log_content, 'utf-8')) else: f.write(log_content) rsync_status_file_to_repo(log_gz_path) def rsync_status_file_to_repo(path, repo_subdir=None): """Copy a build log or status JSON to the repo using rsync.""" if not config.get('deploy_process_logs', False): logging.debug(_('skip deploying full build logs: not enabled in config')) return for d in config.get('serverwebroot', []): webroot = d['url'] cmd = ['rsync', '--archive', '--delete-after', '--safe-links'] if options.verbose: cmd += ['--verbose'] if options.quiet: cmd += ['--quiet'] if 'identity_file' in config: cmd += ['-e', 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' + config['identity_file']] dest_path = os.path.join(webroot, "repo") if repo_subdir is not None: dest_path = os.path.join(dest_path, repo_subdir) if not dest_path.endswith('/'): dest_path += '/' # make sure rsync knows this is a directory cmd += [path, dest_path] retcode = subprocess.call(cmd) if retcode: logging.error(_('process log deploy {path} to {dest} failed!') .format(path=path, dest=webroot)) else: logging.debug(_('deployed process log {path} to {dest}') .format(path=path, dest=webroot)) def get_per_app_repos(): """Per-app repos are dirs named with the packageName of a single app.""" # Android packageNames are Java packages, they may contain uppercase or # lowercase letters ('A' through 'Z'), numbers, and underscores # ('_'). However, individual package name parts may only start with # letters. https://developer.android.com/guide/topics/manifest/manifest-element.html#package p = re.compile('^([a-zA-Z][a-zA-Z0-9_]*(\\.[a-zA-Z][a-zA-Z0-9_]*)*)?$') repos = [] for root, dirs, files in os.walk(os.getcwd()): for d in dirs: print('checking', root, 'for', d) if d in ('archive', 'metadata', 'repo', 'srclibs', 'tmp'): # standard parts of an fdroid repo, so never packageNames continue elif p.match(d) \ and os.path.exists(os.path.join(d, 'fdroid', 'repo', 'index.jar')): repos.append(d) break return repos def is_repo_file(filename, for_gpg_signing=False): """Whether the file in a repo is a build product to be delivered to users.""" if isinstance(filename, str): filename = filename.encode('utf-8', errors="surrogateescape") ignore_files = [ b'entry.jar', b'index-v1.jar', b'index.css', b'index.html', b'index.jar', b'index.png', b'index.xml', b'index_unsigned.jar', ] if not for_gpg_signing: ignore_files += [ b'altstore-index.json', b'entry.json', b'index-v1.json', b'index-v2.json', ] return ( os.path.isfile(filename) and not filename.endswith(b'.asc') and not filename.endswith(b'.sig') and not filename.endswith(b'.idsig') and not filename.endswith(b'.log.gz') and os.path.basename(filename) not in ignore_files ) def get_examples_dir(): """Return the dir where the fdroidserver example files are available.""" examplesdir = None tmp = os.path.dirname(sys.argv[0]) if os.path.basename(tmp) == 'bin': egg_links = glob.glob(os.path.join(tmp, '..', 'local/lib/python3.*/site-packages/fdroidserver.egg-link')) if egg_links: # installed from local git repo examplesdir = os.path.join(open(egg_links[0]).readline().rstrip(), 'examples') else: # try .egg layout examplesdir = os.path.dirname(os.path.dirname(__file__)) + '/share/doc/fdroidserver/examples' if not os.path.exists(examplesdir): # use UNIX layout examplesdir = os.path.dirname(tmp) + '/share/doc/fdroidserver/examples' else: # we're running straight out of the git repo prefix = os.path.normpath(os.path.join(os.path.dirname(__file__), '..')) examplesdir = prefix + '/examples' return examplesdir def get_android_tools_versions(): """Get a list of the versions of all installed Android SDK/NDK components.""" global config sdk_path = config['sdk_path'] if sdk_path[-1] != '/': sdk_path += '/' components = set() for ndk_path in config.get('ndk_paths', {}).values(): version = get_ndk_version(ndk_path) components.add((os.path.relpath(ndk_path, sdk_path), str(version))) pattern = re.compile(r'^Pkg.Revision *= *(.+)', re.MULTILINE) for root, dirs, files in os.walk(sdk_path): if 'source.properties' in files: source_properties = os.path.join(root, 'source.properties') with open(source_properties, 'r') as fp: m = pattern.search(fp.read()) if m: components.add((os.path.relpath(root, sdk_path), m.group(1))) return sorted(components) def get_android_tools_version_log(): """Get a list of the versions of all installed Android SDK/NDK components.""" log = '== Installed Android Tools ==\n\n' components = get_android_tools_versions() for name, version in sorted(components): log += '* ' + name + ' (' + version + ')\n' return log def calculate_math_string(expr): ops = { ast.Add: operator.add, ast.Mult: operator.mul, ast.Sub: operator.sub, ast.USub: operator.neg, ast.Pow: operator.pow, } def execute_ast(node): if isinstance(node, ast.Num): # return node.n elif isinstance(node, ast.BinOp): # return ops[type(node.op)](execute_ast(node.left), execute_ast(node.right)) elif isinstance(node, ast.UnaryOp): # e.g., -1 return ops[type(node.op)](ast.literal_eval(node.operand)) else: raise SyntaxError(node) try: if '#' in expr: raise SyntaxError('no comments allowed') return execute_ast(ast.parse(expr, mode='eval').body) except SyntaxError as exc: raise SyntaxError("could not parse expression '{expr}', " "only basic math operations are allowed (+, -, *)" .format(expr=expr)) from exc def force_exit(exitvalue=0): """Force exit when thread operations could block the exit. The build command has to use some threading stuff to handle the timeout and locks. This seems to prevent the command from exiting, unless this hack is used. """ sys.stdout.flush() sys.stderr.flush() os._exit(exitvalue) YAML_LINT_CONFIG = {'extends': 'default', 'rules': {'document-start': 'disable', 'line-length': 'disable', 'truthy': 'disable'}} def run_yamllint(path, indent=0): path = Path(path) try: import yamllint.config import yamllint.linter except ImportError: return '' result = [] with path.open('r', encoding='utf-8') as f: problems = yamllint.linter.run(f, yamllint.config.YamlLintConfig(json.dumps(YAML_LINT_CONFIG))) for problem in problems: result.append(' ' * indent + str(path) + ':' + str(problem.line) + ': ' + problem.message) return '\n'.join(result) def calculate_IPFS_cid(filename): """Calculate the IPFS CID of a file and add it to the index. uses ipfs_cid package at https://packages.debian.org/sid/ipfs-cid Returns CIDv1 of a file as per IPFS recommendation """ cmd = config and config.get('ipfs_cid') if not cmd: return file_cid = subprocess.run([cmd, filename], capture_output=True) if file_cid.returncode == 0: cid_output = file_cid.stdout.decode() cid_output_dict = json.loads(cid_output) return cid_output_dict['CIDv1'] def sha256sum(filename): """Calculate the sha256 of the given file.""" sha = hashlib.sha256() with open(filename, 'rb') as f: while True: t = f.read(16384) if len(t) == 0: break sha.update(t) return sha.hexdigest() def sha256base64(filename): """Calculate the sha256 of the given file as URL-safe base64.""" hasher = hashlib.sha256() with open(filename, 'rb') as f: while True: t = f.read(16384) if len(t) == 0: break hasher.update(t) return urlsafe_b64encode(hasher.digest()).decode() def get_ndk_version(ndk_path): """Get the version info from the metadata in the NDK package. Since r11, the info is nice and easy to find in sources.properties. Before, there was a kludgey format in RELEASE.txt. This is only needed for r10e. """ source_properties = os.path.join(ndk_path, 'source.properties') release_txt = os.path.join(ndk_path, 'RELEASE.TXT') if os.path.exists(source_properties): with open(source_properties) as fp: m = re.search(r'^Pkg.Revision *= *(.+)', fp.read(), flags=re.MULTILINE) if m: return m.group(1) elif os.path.exists(release_txt): with open(release_txt) as fp: return fp.read().split('-')[0] def auto_install_ndk(build): """Auto-install the NDK in the build, this assumes its in a buildserver guest VM. Download, verify, and install the NDK version as specified via the "ndk:" field in the build entry. As it uncompresses the zipball, this forces the permissions to work for all users, since this might uncompress as root and then be used from a different user. This needs to be able to install multiple versions of the NDK, since this is also used in CI builds, where multiple `fdroid build --onserver` calls can run in a single session. The production buildserver is reset between every build. The default ANDROID_SDK_ROOT base dir of /opt/android-sdk is hard-coded in buildserver/Vagrantfile. The $ANDROID_HOME/ndk subdir is where Android Studio will install the NDK into versioned subdirs. https://developer.android.com/studio/projects/configure-agp-ndk#agp_version_41 Also, r10e and older cannot be handled via this mechanism because they are packaged differently. """ import sdkmanager global config if build.get('disable'): return ndk = build.get('ndk') if not ndk: return if isinstance(ndk, str): sdkmanager.build_package_list(use_net=True) _install_ndk(ndk) elif isinstance(ndk, list): sdkmanager.build_package_list(use_net=True) for n in ndk: _install_ndk(n) else: raise BuildException(_('Invalid ndk: entry in build: "{ndk}"') .format(ndk=str(ndk))) def _install_ndk(ndk): """Install specified NDK if it is not already installed. Parameters ---------- ndk The NDK version to install, either in "release" form (r21e) or "revision" form (21.4.7075529). """ import sdkmanager sdk_path = config['sdk_path'] sdkmanager.install(f'ndk;{ndk}', sdk_path) for found in glob.glob(f'{sdk_path}/ndk/*'): version = get_ndk_version(found) if 'ndk_paths' not in config: config['ndk_paths'] = dict() config['ndk_paths'][ndk] = found config['ndk_paths'][version] = found logging.info( _('Set NDK {release} ({version}) up').format(release=ndk, version=version) ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/deploy.py0000644000175000017500000011162014620351225017347 0ustar00hanshans#!/usr/bin/env python3 # # deploy.py - part of the FDroid server tools # Copyright (C) 2010-15, Ciaran Gultnieks, ciaran@ciarang.com # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import sys import glob import hashlib import json import os import re import subprocess import time import urllib import yaml from argparse import ArgumentParser import logging import shutil from . import _ from . import common from . import index from .exception import FDroidException config = None start_timestamp = time.gmtime() GIT_BRANCH = 'master' BINARY_TRANSPARENCY_DIR = 'binary_transparency' AUTO_S3CFG = '.fdroid-deploy-s3cfg' USER_S3CFG = 's3cfg' REMOTE_HOSTNAME_REGEX = re.compile(r'\W*\w+\W+(\w+).*') INDEX_FILES = [ "entry.jar", "entry.json", "entry.json.asc", "index-v1.jar", "index-v1.json", "index-v1.json.asc", "index-v2.json", "index-v2.json.asc", "index.jar", "index.xml", ] def _get_index_excludes(repo_section): """Return the list of files to be synced last, since they finalize the deploy. The process of pushing all the new packages to the various services can take a while. So the index files should be updated last. That ensures that the package files are available when the client learns about them from the new index files. """ indexes = [ os.path.join(repo_section, 'altstore-index.json'), os.path.join(repo_section, 'entry.jar'), os.path.join(repo_section, 'entry.json'), os.path.join(repo_section, 'entry.json.asc'), os.path.join(repo_section, 'index-v1.jar'), os.path.join(repo_section, 'index-v1.json'), os.path.join(repo_section, 'index-v1.json.asc'), os.path.join(repo_section, 'index-v2.json'), os.path.join(repo_section, 'index-v2.json.asc'), os.path.join(repo_section, 'index.jar'), os.path.join(repo_section, 'index.xml'), ] index_excludes = [] for f in indexes: index_excludes.append('--exclude') index_excludes.append(f) return index_excludes def update_awsbucket(repo_section): """Upload the contents of the directory `repo_section` (including subdirectories) to the AWS S3 "bucket". The contents of that subdir of the bucket will first be deleted. Requires AWS credentials set in config.yml: awsaccesskeyid, awssecretkey """ logging.debug( f'''Syncing "{repo_section}" to Amazon S3 bucket "{config['awsbucket']}"''' ) if common.set_command_in_config('s3cmd'): update_awsbucket_s3cmd(repo_section) else: update_awsbucket_libcloud(repo_section) def update_awsbucket_s3cmd(repo_section): """Upload using the CLI tool s3cmd, which provides rsync-like sync. The upload is done in multiple passes to reduce the chance of interfering with an existing client-server interaction. In the first pass, only new files are uploaded. In the second pass, changed files are uploaded, overwriting what is on the server. On the third/last pass, the indexes are uploaded, and any removed files are deleted from the server. The last pass is the only pass to use a full MD5 checksum of all files to detect changes. """ logging.debug(_('Using s3cmd to sync with: {url}').format(url=config['awsbucket'])) if os.path.exists(USER_S3CFG): logging.info(_('Using "{path}" for configuring s3cmd.').format(path=USER_S3CFG)) configfilename = USER_S3CFG else: fd = os.open(AUTO_S3CFG, os.O_CREAT | os.O_TRUNC | os.O_WRONLY, 0o600) logging.debug( _('Creating "{path}" for configuring s3cmd.').format(path=AUTO_S3CFG) ) os.write(fd, '[default]\n'.encode('utf-8')) os.write( fd, ('access_key = ' + config['awsaccesskeyid'] + '\n').encode('utf-8') ) os.write(fd, ('secret_key = ' + config['awssecretkey'] + '\n').encode('utf-8')) os.close(fd) configfilename = AUTO_S3CFG s3bucketurl = 's3://' + config['awsbucket'] s3cmd = [config['s3cmd'], '--config=' + configfilename] if subprocess.call(s3cmd + ['info', s3bucketurl]) != 0: logging.warning(_('Creating new S3 bucket: {url}').format(url=s3bucketurl)) if subprocess.call(s3cmd + ['mb', s3bucketurl]) != 0: logging.error( _('Failed to create S3 bucket: {url}').format(url=s3bucketurl) ) raise FDroidException() s3cmd_sync = s3cmd + ['sync', '--acl-public'] options = common.get_options() if options and options.verbose: s3cmd_sync += ['--verbose'] if options and options.quiet: s3cmd_sync += ['--quiet'] s3url = s3bucketurl + '/fdroid/' logging.debug('s3cmd sync new files in ' + repo_section + ' to ' + s3url) logging.debug(_('Running first pass with MD5 checking disabled')) excludes = _get_index_excludes(repo_section) returncode = subprocess.call( s3cmd_sync + excludes + ['--no-check-md5', '--skip-existing', repo_section, s3url] ) if returncode != 0: raise FDroidException() logging.debug('s3cmd sync all files in ' + repo_section + ' to ' + s3url) returncode = subprocess.call( s3cmd_sync + excludes + ['--no-check-md5', repo_section, s3url] ) if returncode != 0: raise FDroidException() logging.debug( _('s3cmd sync indexes {path} to {url} and delete').format( path=repo_section, url=s3url ) ) s3cmd_sync.append('--delete-removed') s3cmd_sync.append('--delete-after') if options.no_checksum: s3cmd_sync.append('--no-check-md5') else: s3cmd_sync.append('--check-md5') if subprocess.call(s3cmd_sync + [repo_section, s3url]) != 0: raise FDroidException() def update_awsbucket_libcloud(repo_section): """No summary. Upload the contents of the directory `repo_section` (including subdirectories) to the AWS S3 "bucket". The contents of that subdir of the bucket will first be deleted. Requires AWS credentials set in config.yml: awsaccesskeyid, awssecretkey """ logging.debug( _('using Apache libcloud to sync with {url}').format(url=config['awsbucket']) ) import libcloud.security libcloud.security.VERIFY_SSL_CERT = True from libcloud.storage.types import Provider, ContainerDoesNotExistError from libcloud.storage.providers import get_driver if not config.get('awsaccesskeyid') or not config.get('awssecretkey'): raise FDroidException( _( 'To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!' ) ) awsbucket = config['awsbucket'] if os.path.exists(USER_S3CFG): raise FDroidException( _('"{path}" exists but s3cmd is not installed!').format(path=USER_S3CFG) ) cls = get_driver(Provider.S3) driver = cls(config['awsaccesskeyid'], config['awssecretkey']) try: container = driver.get_container(container_name=awsbucket) except ContainerDoesNotExistError: container = driver.create_container(container_name=awsbucket) logging.info(_('Created new container "{name}"').format(name=container.name)) upload_dir = 'fdroid/' + repo_section objs = dict() for obj in container.list_objects(): if obj.name.startswith(upload_dir + '/'): objs[obj.name] = obj for root, dirs, files in os.walk(os.path.join(os.getcwd(), repo_section)): for name in files: upload = False file_to_upload = os.path.join(root, name) object_name = 'fdroid/' + os.path.relpath(file_to_upload, os.getcwd()) if object_name not in objs: upload = True else: obj = objs.pop(object_name) if obj.size != os.path.getsize(file_to_upload): upload = True else: # if the sizes match, then compare by MD5 md5 = hashlib.md5() # nosec AWS uses MD5 with open(file_to_upload, 'rb') as f: while True: data = f.read(8192) if not data: break md5.update(data) if obj.hash != md5.hexdigest(): s3url = 's3://' + awsbucket + '/' + obj.name logging.info(' deleting ' + s3url) if not driver.delete_object(obj): logging.warning('Could not delete ' + s3url) upload = True if upload: logging.debug(' uploading "' + file_to_upload + '"...') extra = {'acl': 'public-read'} if file_to_upload.endswith('.sig'): extra['content_type'] = 'application/pgp-signature' elif file_to_upload.endswith('.asc'): extra['content_type'] = 'application/pgp-signature' path = os.path.relpath(file_to_upload) logging.info(f' uploading {path} to s3://{awsbucket}/{object_name}') with open(file_to_upload, 'rb') as iterator: obj = driver.upload_object_via_stream( iterator=iterator, container=container, object_name=object_name, extra=extra, ) # delete the remnants in the bucket, they do not exist locally while objs: object_name, obj = objs.popitem() s3url = 's3://' + awsbucket + '/' + object_name if object_name.startswith(upload_dir): logging.warning(' deleting ' + s3url) driver.delete_object(obj) else: logging.info(' skipping ' + s3url) def update_serverwebroot(serverwebroot, repo_section): """Deploy the index files to the serverwebroot using rsync. Upload the first time without the index files and delay the deletion as much as possible. That keeps the repo functional while this update is running. Then once it is complete, rerun the command again to upload the index files. Always using the same target with rsync allows for very strict settings on the receiving server, you can literally specify the one rsync command that is allowed to run in ~/.ssh/authorized_keys. (serverwebroot is guaranteed to have a trailing slash in common.py) It is possible to optionally use a checksum comparison for accurate comparisons on different filesystems, for example, FAT has a low resolution timestamp """ try: subprocess.run(['rsync', '--version'], capture_output=True, check=True) except Exception as e: raise FDroidException( _('rsync is missing or broken: {error}').format(error=e) ) from e rsyncargs = ['rsync', '--archive', '--delete-after', '--safe-links'] options = common.get_options() if not options or not options.no_checksum: rsyncargs.append('--checksum') if options and options.verbose: rsyncargs += ['--verbose'] if options and options.quiet: rsyncargs += ['--quiet'] if options and options.identity_file: rsyncargs += [ '-e', 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' + options.identity_file, ] elif config and config.get('identity_file'): rsyncargs += [ '-e', 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' + config['identity_file'], ] url = serverwebroot['url'] logging.info('rsyncing ' + repo_section + ' to ' + url) excludes = _get_index_excludes(repo_section) if subprocess.call(rsyncargs + excludes + [repo_section, url]) != 0: raise FDroidException() if subprocess.call(rsyncargs + [repo_section, url]) != 0: raise FDroidException() # upload "current version" symlinks if requested if config and config.get('make_current_version_link') and repo_section == 'repo': links_to_upload = [] for f in glob.glob('*.apk') + glob.glob('*.apk.asc') + glob.glob('*.apk.sig'): if os.path.islink(f): links_to_upload.append(f) if len(links_to_upload) > 0: if subprocess.call(rsyncargs + links_to_upload + [url]) != 0: raise FDroidException() def update_serverwebroots(serverwebroots, repo_section, standardwebroot=True): for d in serverwebroots: # this supports both an ssh host:path and just a path serverwebroot = d['url'] s = serverwebroot.rstrip('/').split(':') if len(s) == 1: fdroiddir = s[0] elif len(s) == 2: host, fdroiddir = s else: logging.error(_('Malformed serverwebroot line:') + ' ' + serverwebroot) sys.exit(1) repobase = os.path.basename(fdroiddir) if standardwebroot and repobase != 'fdroid': logging.error( _( 'serverwebroot: path does not end with "fdroid", perhaps you meant one of these:' ) + '\n\t' + serverwebroot.rstrip('/') + '/fdroid\n\t' + serverwebroot.rstrip('/').rstrip(repobase) + 'fdroid' ) sys.exit(1) update_serverwebroot(d, repo_section) def sync_from_localcopy(repo_section, local_copy_dir): """Sync the repo from "local copy dir" filesystem to this box. In setups that use offline signing, this is the last step that syncs the repo from the "local copy dir" e.g. a thumb drive to the repo on the local filesystem. That local repo is then used to push to all the servers that are configured. """ logging.info('Syncing from local_copy_dir to this repo.') # trailing slashes have a meaning in rsync which is not needed here, so # make sure both paths have exactly one trailing slash common.local_rsync( common.get_options(), os.path.join(local_copy_dir, repo_section).rstrip('/') + '/', repo_section.rstrip('/') + '/', ) offline_copy = os.path.join(local_copy_dir, BINARY_TRANSPARENCY_DIR) if os.path.exists(os.path.join(offline_copy, '.git')): online_copy = os.path.join(os.getcwd(), BINARY_TRANSPARENCY_DIR) push_binary_transparency(offline_copy, online_copy) def update_localcopy(repo_section, local_copy_dir): """Copy data from offline to the "local copy dir" filesystem. This updates the copy of this repo used to shuttle data from an offline signing machine to the online machine, e.g. on a thumb drive. """ # local_copy_dir is guaranteed to have a trailing slash in main() below common.local_rsync(common.get_options(), repo_section, local_copy_dir) offline_copy = os.path.join(os.getcwd(), BINARY_TRANSPARENCY_DIR) if os.path.isdir(os.path.join(offline_copy, '.git')): online_copy = os.path.join(local_copy_dir, BINARY_TRANSPARENCY_DIR) push_binary_transparency(offline_copy, online_copy) def _get_size(start_path='.'): """Get size of all files in a dir https://stackoverflow.com/a/1392549.""" total_size = 0 for root, dirs, files in os.walk(start_path): for f in files: fp = os.path.join(root, f) total_size += os.path.getsize(fp) return total_size def update_servergitmirrors(servergitmirrors, repo_section): """Update repo mirrors stored in git repos. This is a hack to use public git repos as F-Droid repos. It recreates the git repo from scratch each time, so that there is no history. That keeps the size of the git repo small. Services like GitHub or GitLab have a size limit of something like 1 gig. This git repo is only a git repo for the purpose of being hosted. For history, there is the archive section, and there is the binary transparency log. """ import git from clint.textui import progress if config.get('local_copy_dir') and not config.get('sync_from_local_copy_dir'): logging.debug( _('Offline machine, skipping git mirror generation until `fdroid deploy`') ) return options = common.get_options() # right now we support only 'repo' git-mirroring if repo_section == 'repo': git_mirror_path = 'git-mirror' dotgit = os.path.join(git_mirror_path, '.git') git_fdroiddir = os.path.join(git_mirror_path, 'fdroid') git_repodir = os.path.join(git_fdroiddir, repo_section) if not os.path.isdir(git_repodir): os.makedirs(git_repodir) # github/gitlab use bare git repos, so only count the .git folder # test: generate giant APKs by including AndroidManifest.xml and and large # file from /dev/urandom, then sign it. Then add those to the git repo. dotgit_size = _get_size(dotgit) dotgit_over_limit = dotgit_size > config['git_mirror_size_limit'] if os.path.isdir(dotgit) and dotgit_over_limit: logging.warning( _( 'Deleting git-mirror history, repo is too big ({size} max {limit})' ).format(size=dotgit_size, limit=config['git_mirror_size_limit']) ) shutil.rmtree(dotgit) if options.no_keep_git_mirror_archive and dotgit_over_limit: logging.warning( _('Deleting archive, repo is too big ({size} max {limit})').format( size=dotgit_size, limit=config['git_mirror_size_limit'] ) ) archive_path = os.path.join(git_mirror_path, 'fdroid', 'archive') shutil.rmtree(archive_path, ignore_errors=True) # rsync is very particular about trailing slashes common.local_rsync( options, repo_section.rstrip('/') + '/', git_repodir.rstrip('/') + '/' ) # use custom SSH command if identity_file specified ssh_cmd = 'ssh -oBatchMode=yes' if options.identity_file is not None: ssh_cmd += ' -oIdentitiesOnly=yes -i "%s"' % options.identity_file elif 'identity_file' in config: ssh_cmd += ' -oIdentitiesOnly=yes -i "%s"' % config['identity_file'] repo = git.Repo.init(git_mirror_path, initial_branch=GIT_BRANCH) enabled_remotes = [] for d in servergitmirrors: remote_url = d['url'] name = REMOTE_HOSTNAME_REGEX.sub(r'\1', remote_url) enabled_remotes.append(name) r = git.remote.Remote(repo, name) if r in repo.remotes: r = repo.remote(name) if 'set_url' in dir(r): # force remote URL if using GitPython 2.x r.set_url(remote_url) else: repo.create_remote(name, remote_url) logging.info('Mirroring to: ' + remote_url) # sadly index.add don't allow the --all parameter logging.debug('Adding all files to git mirror') repo.git.add(all=True) logging.debug('Committing all files into git mirror') repo.index.commit("fdroidserver git-mirror") if options.verbose: progressbar = progress.Bar() class MyProgressPrinter(git.RemoteProgress): def update(self, op_code, current, maximum=None, message=None): if isinstance(maximum, float): progressbar.show(current, maximum) progress = MyProgressPrinter() else: progress = None # only deploy to GitLab Artifacts if too big for GitLab Pages if common.get_dir_size(git_fdroiddir) <= common.GITLAB_COM_PAGES_MAX_SIZE: gitlab_ci_job_name = 'pages' else: gitlab_ci_job_name = 'GitLab Artifacts' logging.warning( _( 'Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!' ) % (common.GITLAB_COM_PAGES_MAX_SIZE / 1000000000) ) # push for every remote. This will overwrite the git history for remote in repo.remotes: if remote.name not in enabled_remotes: repo.delete_remote(remote) continue if remote.name == 'gitlab': logging.debug('Writing .gitlab-ci.yml to deploy to GitLab Pages') with open(os.path.join(git_mirror_path, ".gitlab-ci.yml"), "wt") as fp: yaml.dump( { gitlab_ci_job_name: { 'script': [ 'mkdir .public', 'cp -r * .public/', 'mv .public public', ], 'artifacts': {'paths': ['public']}, 'variables': {'GIT_DEPTH': 1}, } }, fp, default_flow_style=False, ) repo.git.add(all=True) repo.index.commit("fdroidserver git-mirror: Deploy to GitLab Pages") logging.debug(_('Pushing to {url}').format(url=remote.url)) with repo.git.custom_environment(GIT_SSH_COMMAND=ssh_cmd): pushinfos = remote.push( GIT_BRANCH, force=True, set_upstream=True, progress=progress ) for pushinfo in pushinfos: if pushinfo.flags & ( git.remote.PushInfo.ERROR | git.remote.PushInfo.REJECTED | git.remote.PushInfo.REMOTE_FAILURE | git.remote.PushInfo.REMOTE_REJECTED ): # Show potentially useful messages from git remote for line in progress.other_lines: if line.startswith('remote:'): logging.debug(line) raise FDroidException( '{url} push failed: {flags} {summary}'.format( url=remote.url, flags=pushinfo.flags, summary=pushinfo.summary, ) ) else: logging.debug(remote.url + ': ' + pushinfo.summary) if progress: progressbar.done() def upload_to_android_observatory(repo_section): import requests requests # stop unused import warning if common.get_options().verbose: logging.getLogger("requests").setLevel(logging.INFO) logging.getLogger("urllib3").setLevel(logging.INFO) else: logging.getLogger("requests").setLevel(logging.WARNING) logging.getLogger("urllib3").setLevel(logging.WARNING) if repo_section == 'repo': for f in sorted(glob.glob(os.path.join(repo_section, '*.apk'))): upload_apk_to_android_observatory(f) def upload_apk_to_android_observatory(path): # depend on requests and lxml only if users enable AO import requests from . import net from lxml.html import fromstring apkfilename = os.path.basename(path) r = requests.post( 'https://androidobservatory.org/', data={'q': common.sha256sum(path), 'searchby': 'hash'}, headers=net.HEADERS, timeout=300, ) if r.status_code == 200: # from now on XPath will be used to retrieve the message in the HTML # androidobservatory doesn't have a nice API to talk with # so we must scrape the page content tree = fromstring(r.text) href = None for element in tree.xpath("//html/body/div/div/table/tbody/tr/td/a"): a = element.attrib.get('href') if a: m = re.match(r'^/app/[0-9A-F]{40}$', a) if m: href = m.group() page = 'https://androidobservatory.org' if href: message = _('Found {apkfilename} at {url}').format( apkfilename=apkfilename, url=(page + href) ) logging.debug(message) return # upload the file with a post request logging.info( _('Uploading {apkfilename} to androidobservatory.org').format( apkfilename=apkfilename ) ) r = requests.post( 'https://androidobservatory.org/upload', files={'apk': (apkfilename, open(path, 'rb'))}, headers=net.HEADERS, allow_redirects=False, timeout=300, ) def upload_to_virustotal(repo_section, virustotal_apikey): import requests requests # stop unused import warning if repo_section == 'repo': if not os.path.exists('virustotal'): os.mkdir('virustotal') if os.path.exists(os.path.join(repo_section, 'index-v1.json')): with open(os.path.join(repo_section, 'index-v1.json')) as fp: data = json.load(fp) else: local_jar = os.path.join(repo_section, 'index-v1.jar') data, _ignored, _ignored = index.get_index_from_jar(local_jar) for packageName, packages in data['packages'].items(): for package in packages: upload_apk_to_virustotal(virustotal_apikey, **package) def upload_apk_to_virustotal( virustotal_apikey, packageName, apkName, hash, versionCode, **kwargs ): import requests logging.getLogger("urllib3").setLevel(logging.WARNING) logging.getLogger("requests").setLevel(logging.WARNING) outputfilename = os.path.join( 'virustotal', packageName + '_' + str(versionCode) + '_' + hash + '.json' ) if os.path.exists(outputfilename): logging.debug(apkName + ' results are in ' + outputfilename) return outputfilename repofilename = os.path.join('repo', apkName) logging.info('Checking if ' + repofilename + ' is on virustotal') headers = {"User-Agent": "F-Droid"} if 'headers' in kwargs: for k, v in kwargs['headers'].items(): headers[k] = v apikey = { 'apikey': virustotal_apikey, 'resource': hash, } needs_file_upload = False while True: report_url = ( 'https://www.virustotal.com/vtapi/v2/file/report?' + urllib.parse.urlencode(apikey) ) r = requests.get(report_url, headers=headers, timeout=300) if r.status_code == 200: response = r.json() if response['response_code'] == 0: needs_file_upload = True else: response['filename'] = apkName response['packageName'] = packageName response['versionCode'] = versionCode if kwargs.get('versionName'): response['versionName'] = kwargs.get('versionName') with open(outputfilename, 'w') as fp: json.dump(response, fp, indent=2, sort_keys=True) if response.get('positives', 0) > 0: logging.warning( _('{path} has been flagged by virustotal {count} times:').format( path=repofilename, count=response['positives'] ), +'\n\t' + response['permalink'], ) break if r.status_code == 204: logging.warning(_('virustotal.com is rate limiting, waiting to retry...')) time.sleep(30) # wait for public API rate limiting upload_url = None if needs_file_upload: manual_url = 'https://www.virustotal.com/' size = os.path.getsize(repofilename) if size > 200000000: # VirusTotal API 200MB hard limit logging.error( _('{path} more than 200MB, manually upload: {url}').format( path=repofilename, url=manual_url ) ) elif size > 32000000: # VirusTotal API requires fetching a URL to upload bigger files query_url = ( 'https://www.virustotal.com/vtapi/v2/file/scan/upload_url?' + urllib.parse.urlencode(apikey) ) r = requests.get(query_url, headers=headers, timeout=300) if r.status_code == 200: upload_url = r.json().get('upload_url') elif r.status_code == 403: logging.error( _( 'VirusTotal API key cannot upload files larger than 32MB, ' + 'use {url} to upload {path}.' ).format(path=repofilename, url=manual_url) ) else: r.raise_for_status() else: upload_url = 'https://www.virustotal.com/vtapi/v2/file/scan' if upload_url: logging.info( _('Uploading {apkfilename} to virustotal').format(apkfilename=repofilename) ) r = requests.post( upload_url, data=apikey, headers=headers, files={'file': (apkName, open(repofilename, 'rb'))}, timeout=300, ) logging.debug( _('If this upload fails, try manually uploading to {url}').format( url=manual_url ) ) r.raise_for_status() response = r.json() logging.info(response['verbose_msg'] + " " + response['permalink']) return outputfilename def push_binary_transparency(git_repo_path, git_remote): """Push the binary transparency git repo to the specifed remote. If the remote is a local directory, make sure it exists, and is a git repo. This is used to move this git repo from an offline machine onto a flash drive, then onto the online machine. Also, this pulls because pushing to a non-bare git repo is error prone. This is also used in offline signing setups, where it then also creates a "local copy dir" git repo that serves to shuttle the git data from the offline machine to the online machine. In that case, git_remote is a dir on the local file system, e.g. a thumb drive. """ import git logging.info(_('Pushing binary transparency log to {url}').format(url=git_remote)) if os.path.isdir(os.path.dirname(git_remote)): # from offline machine to thumbdrive remote_path = os.path.abspath(git_repo_path) if not os.path.isdir(os.path.join(git_remote, '.git')): os.makedirs(git_remote, exist_ok=True) thumbdriverepo = git.Repo.init(git_remote, initial_branch=GIT_BRANCH) local = thumbdriverepo.create_remote('local', remote_path) else: thumbdriverepo = git.Repo(git_remote) local = git.remote.Remote(thumbdriverepo, 'local') if local in thumbdriverepo.remotes: local = thumbdriverepo.remote('local') if 'set_url' in dir(local): # force remote URL if using GitPython 2.x local.set_url(remote_path) else: local = thumbdriverepo.create_remote('local', remote_path) local.pull(GIT_BRANCH) else: # from online machine to remote on a server on the internet gitrepo = git.Repo(git_repo_path) origin = git.remote.Remote(gitrepo, 'origin') if origin in gitrepo.remotes: origin = gitrepo.remote('origin') if 'set_url' in dir(origin): # added in GitPython 2.x origin.set_url(git_remote) else: origin = gitrepo.create_remote('origin', git_remote) for _i in range(3): try: origin.push(GIT_BRANCH) except git.GitCommandError as e: logging.error(e) continue break else: raise FDroidException(_("Pushing to remote server failed!")) def main(): global config parser = ArgumentParser() common.setup_global_opts(parser) parser.add_argument( "-i", "--identity-file", default=None, help=_("Specify an identity file to provide to SSH for rsyncing"), ) parser.add_argument( "--local-copy-dir", default=None, help=_("Specify a local folder to sync the repo to"), ) parser.add_argument( "--no-checksum", action="store_true", default=False, help=_("Don't use rsync checksums"), ) parser.add_argument( "--no-keep-git-mirror-archive", action="store_true", default=False, help=_("If a git mirror gets to big, allow the archive to be deleted"), ) options = common.parse_args(parser) config = common.read_config() if config.get('nonstandardwebroot') is True: standardwebroot = False else: standardwebroot = True if options.local_copy_dir is not None: local_copy_dir = options.local_copy_dir elif config.get('local_copy_dir'): local_copy_dir = config['local_copy_dir'] else: local_copy_dir = None if local_copy_dir is not None: fdroiddir = local_copy_dir.rstrip('/') if os.path.exists(fdroiddir) and not os.path.isdir(fdroiddir): logging.error(_('local_copy_dir must be directory, not a file!')) sys.exit(1) if not os.path.exists(os.path.dirname(fdroiddir)): logging.error( _('The root dir for local_copy_dir "{path}" does not exist!').format( path=os.path.dirname(fdroiddir) ) ) sys.exit(1) if not os.path.isabs(fdroiddir): logging.error(_('local_copy_dir must be an absolute path!')) sys.exit(1) repobase = os.path.basename(fdroiddir) if standardwebroot and repobase != 'fdroid': logging.error( _( 'local_copy_dir does not end with "fdroid", ' + 'perhaps you meant: "{path}"' ).format(path=fdroiddir + '/fdroid') ) sys.exit(1) if local_copy_dir[-1] != '/': local_copy_dir += '/' local_copy_dir = local_copy_dir.replace('//', '/') if not os.path.exists(fdroiddir): os.mkdir(fdroiddir) if ( not config.get('awsbucket') and not config.get('serverwebroot') and not config.get('servergitmirrors') and not config.get('androidobservatory') and not config.get('binary_transparency_remote') and not config.get('virustotal_apikey') and local_copy_dir is None ): logging.warning( _('No option set! Edit your config.yml to set at least one of these:') + '\nserverwebroot, servergitmirrors, local_copy_dir, awsbucket, ' + 'virustotal_apikey, androidobservatory, or binary_transparency_remote' ) sys.exit(1) repo_sections = ['repo'] if config['archive_older'] != 0: repo_sections.append('archive') if not os.path.exists('archive'): os.mkdir('archive') if config['per_app_repos']: repo_sections += common.get_per_app_repos() if os.path.isdir('unsigned') or ( local_copy_dir is not None and os.path.isdir(os.path.join(local_copy_dir, 'unsigned')) ): repo_sections.append('unsigned') for repo_section in repo_sections: if local_copy_dir is not None: if config['sync_from_local_copy_dir']: sync_from_localcopy(repo_section, local_copy_dir) else: update_localcopy(repo_section, local_copy_dir) if config.get('serverwebroot'): update_serverwebroots( config['serverwebroot'], repo_section, standardwebroot ) if config.get('servergitmirrors'): # update_servergitmirrors will take care of multiple mirrors so don't need a foreach update_servergitmirrors(config['servergitmirrors'], repo_section) if config.get('awsbucket'): update_awsbucket(repo_section) if config.get('androidobservatory'): upload_to_android_observatory(repo_section) if config.get('virustotal_apikey'): upload_to_virustotal(repo_section, config.get('virustotal_apikey')) binary_transparency_remote = config.get('binary_transparency_remote') if binary_transparency_remote: push_binary_transparency(BINARY_TRANSPARENCY_DIR, binary_transparency_remote) common.write_status_json(common.setup_status_output(start_timestamp)) sys.exit(0) if __name__ == "__main__": main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/exception.py0000644000175000017500000000226214620351225020052 0ustar00hanshansclass FDroidException(Exception): def __init__(self, value=None, detail=None): super().__init__() self.value = value self.detail = detail def shortened_detail(self): if len(self.detail) < 16000: return self.detail return '[...]\n' + self.detail[-16000:] def __str__(self): if self.value is None: ret = __name__ else: ret = str(self.value) if self.detail: ret += ( "\n==== detail begin ====\n%s\n==== detail end ====" % ''.join(self.detail).strip() ) return ret class MetaDataException(Exception): def __init__(self, value): super().__init__() self.value = value def __str__(self): return self.value class VCSException(FDroidException): pass class NoSubmodulesException(VCSException): pass class BuildException(FDroidException): pass class VerificationException(FDroidException): pass class ConfigurationException(FDroidException): def __init__(self, value=None, detail=None): super().__init__() self.value = value self.detail = detail ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/gpgsign.py0000644000175000017500000000550614620351225017516 0ustar00hanshans#!/usr/bin/env python3 # # gpgsign.py - part of the FDroid server tools # Copyright (C) 2014, Ciaran Gultnieks, ciaran@ciarang.com # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import os import glob from argparse import ArgumentParser import logging import time from . import _ from . import common from .common import FDroidPopen from .exception import FDroidException config = None start_timestamp = time.gmtime() def status_update_json(signed): """Output a JSON file with metadata about this run.""" logging.debug(_('Outputting JSON')) output = common.setup_status_output(start_timestamp) if signed: output['signed'] = signed common.write_status_json(output) def main(): global config # Parse command line... parser = ArgumentParser() common.setup_global_opts(parser) common.parse_args(parser) config = common.read_config() repodirs = ['repo'] if config['archive_older'] != 0: repodirs.append('archive') signed = [] for output_dir in repodirs: if not os.path.isdir(output_dir): raise FDroidException( _("Missing output directory") + " '" + output_dir + "'" ) # Process any apks that are waiting to be signed... for f in sorted(glob.glob(os.path.join(output_dir, '*.*'))): if not common.is_repo_file(f, for_gpg_signing=True): continue filename = os.path.basename(f) sigfilename = filename + ".asc" sigpath = os.path.join(output_dir, sigfilename) if not os.path.exists(sigpath): gpgargs = ['gpg', '-a', '--output', sigpath, '--detach-sig'] if 'gpghome' in config: gpgargs.extend(['--homedir', config['gpghome']]) if 'gpgkey' in config: gpgargs.extend(['--local-user', config['gpgkey']]) gpgargs.append(os.path.join(output_dir, filename)) p = FDroidPopen(gpgargs) if p.returncode != 0: raise FDroidException("Signing failed.") signed.append(filename) logging.info('Signed ' + filename) status_update_json(signed) if __name__ == "__main__": main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/import_subcommand.py0000644000175000017500000003472514620351225021607 0ustar00hanshans#!/usr/bin/env python3 """Extract application metadata from a source repository.""" # # import_subcommand.py - part of the FDroid server tools # Copyright (C) 2010-13, Ciaran Gultnieks, ciaran@ciarang.com # Copyright (C) 2013-2014 Daniel Martí # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import os import re import stat import urllib import git import json import shutil import sys import yaml from argparse import ArgumentParser import logging from pathlib import Path from typing import Optional try: from yaml import CSafeLoader as SafeLoader except ImportError: from yaml import SafeLoader from . import _ from . import common from . import metadata from .exception import FDroidException config = None def handle_retree_error_on_windows(function, path, excinfo): """Python can't remove a readonly file on Windows so chmod first.""" if function in (os.unlink, os.rmdir, os.remove) and excinfo[0] == PermissionError: os.chmod(path, stat.S_IWRITE) function(path) def clone_to_tmp_dir(app: metadata.App, rev=None) -> Path: """Clone the source repository of an app to a temporary directory for further processing. Parameters ---------- app The App instance to clone the source of. Returns ------- tmp_dir The (temporary) directory the apps source has been cloned into. """ tmp_dir = Path('tmp') tmp_dir.mkdir(exist_ok=True) tmp_dir = tmp_dir / 'importer' if tmp_dir.exists(): shutil.rmtree(str(tmp_dir), onerror=handle_retree_error_on_windows) vcs = common.getvcs(app.RepoType, app.Repo, tmp_dir) vcs.gotorevision(rev) return tmp_dir def getrepofrompage(url: str) -> tuple[Optional[str], str]: """Get the repo type and address from the given web page. The page is scanned in a rather naive manner for 'git clone xxxx', 'hg clone xxxx', etc, and when one of these is found it's assumed that's the information we want. Returns repotype, address, or None, reason Parameters ---------- url The url to look for repository information at. Returns ------- repotype_or_none The found repository type or None if an error occured. address_or_reason The address to the found repository or the reason if an error occured. """ if not url.startswith('http'): return (None, _('{url} does not start with "http"!'.format(url=url))) req = urllib.request.urlopen(url) # nosec B310 non-http URLs are filtered out if req.getcode() != 200: return (None, 'Unable to get ' + url + ' - return code ' + str(req.getcode())) page = req.read().decode(req.headers.get_content_charset()) # Works for BitBucket m = re.search('data-fetch-url="(.*)"', page) if m is not None: repo = m.group(1) if repo.endswith('.git'): return ('git', repo) return ('hg', repo) # Works for BitBucket (obsolete) index = page.find('hg clone') if index != -1: repotype = 'hg' repo = page[index + 9:] index = repo.find('<') if index == -1: return (None, _("Error while getting repo address")) repo = repo[:index] repo = repo.split('"')[0] return (repotype, repo) # Works for BitBucket (obsolete) index = page.find('git clone') if index != -1: repotype = 'git' repo = page[index + 10:] index = repo.find('<') if index == -1: return (None, _("Error while getting repo address")) repo = repo[:index] repo = repo.split('"')[0] return (repotype, repo) return (None, _("No information found.") + page) def get_app_from_url(url: str) -> metadata.App: """Guess basic app metadata from the URL. The URL must include a network hostname, unless it is an lp:, file:, or git/ssh URL. This throws ValueError on bad URLs to match urlparse(). Parameters ---------- url The URL to look to look for app metadata at. Returns ------- app App instance with the found metadata. Raises ------ :exc:`~fdroidserver.exception.FDroidException` If the VCS type could not be determined. :exc:`ValueError` If the URL is invalid. """ parsed = urllib.parse.urlparse(url) invalid_url = False if not parsed.scheme or not parsed.path: invalid_url = True app = metadata.App() app.Repo = url if url.startswith('git://') or url.startswith('git@'): app.RepoType = 'git' elif parsed.netloc == 'github.com': app.RepoType = 'git' app.SourceCode = url app.IssueTracker = url + '/issues' elif parsed.netloc in ('gitlab.com', 'framagit.org'): # git can be fussy with gitlab URLs unless they end in .git if url.endswith('.git'): url = url[:-4] app.Repo = url + '.git' app.RepoType = 'git' app.SourceCode = url app.IssueTracker = url + '/issues' elif parsed.netloc == 'notabug.org': if url.endswith('.git'): url = url[:-4] app.Repo = url + '.git' app.RepoType = 'git' app.SourceCode = url app.IssueTracker = url + '/issues' elif parsed.netloc == 'bitbucket.org': if url.endswith('/'): url = url[:-1] app.SourceCode = url + '/src' app.IssueTracker = url + '/issues' # Figure out the repo type and adddress... app.RepoType, app.Repo = getrepofrompage(url) elif parsed.netloc == 'codeberg.org': app.RepoType = 'git' app.SourceCode = url app.IssueTracker = url + '/issues' elif url.startswith('https://') and url.endswith('.git'): app.RepoType = 'git' if not parsed.netloc and parsed.scheme in ('git', 'http', 'https', 'ssh'): invalid_url = True if invalid_url: raise ValueError(_('"{url}" is not a valid URL!'.format(url=url))) if not app.RepoType: raise FDroidException("Unable to determine vcs type. " + app.Repo) return app def main(): """Extract app metadata and write it to a file. The behaviour of this function is influenced by the configuration file as well as command line parameters. Raises ------ :exc:`~fdroidserver.exception.FDroidException` If the repository already has local metadata, no URL is specified and the current directory is not a Git repository, no application ID could be found, no Gradle project could be found or there is already metadata for the found application ID. """ global config # Parse command line... parser = ArgumentParser() common.setup_global_opts(parser) parser.add_argument("-u", "--url", default=None, help=_("Project URL to import from.")) parser.add_argument("-s", "--subdir", default=None, help=_("Path to main Android project subdirectory, if not in root.")) parser.add_argument("-c", "--categories", default=None, help=_("Comma separated list of categories.")) parser.add_argument("-l", "--license", default=None, help=_("Overall license of the project.")) parser.add_argument("--omit-disable", action="store_true", default=False, help=_("Do not add 'disable:' to the generated build entries")) parser.add_argument("--rev", default=None, help=_("Allows a different revision (or git branch) to be specified for the initial import")) metadata.add_metadata_arguments(parser) options = common.parse_args(parser) metadata.warnings_action = options.W config = common.read_config() apps = metadata.read_metadata() app = None tmp_importer_dir = None local_metadata_files = common.get_local_metadata_files() if local_metadata_files: raise FDroidException(_("This repo already has local metadata: %s") % local_metadata_files[0]) build = metadata.Build() if options.url is None and Path('.git').is_dir(): app = metadata.App() app.AutoName = Path.cwd().name app.RepoType = 'git' if Path('build.gradle').exists() or Path('build.gradle.kts').exists(): build.gradle = ['yes'] git_repo = git.Repo(Path.cwd()) for remote in git.Remote.iter_items(git_repo): if remote.name == 'origin': url = git_repo.remotes.origin.url if url.startswith('https://git'): # github, gitlab app.SourceCode = url.rstrip('.git') app.Repo = url break write_local_file = True elif options.url: app = get_app_from_url(options.url) tmp_importer_dir = clone_to_tmp_dir(app, options.rev) git_repo = git.Repo(tmp_importer_dir) if not options.omit_disable: build.disable = 'Generated by `fdroid import` - check version fields and commitid' write_local_file = False else: raise FDroidException("Specify project url.") app.UpdateCheckMode = 'Tags' build.commit = common.get_head_commit_id(git_repo) # Extract some information... paths = common.get_all_gradle_and_manifests(tmp_importer_dir) subdir = common.get_gradle_subdir(tmp_importer_dir, paths) if paths: versionName, versionCode, appid = common.parse_androidmanifests(paths, app) if not appid: raise FDroidException(_("Couldn't find Application ID")) if not versionName: logging.warning(_('Could not find latest version name')) if not versionCode: logging.warning(_('Could not find latest version code')) else: raise FDroidException(_("No gradle project could be found. Specify --subdir?")) # Make sure it's actually new... if appid in apps: raise FDroidException(_('Package "{appid}" already exists').format(appid=appid)) # Create a build line... build.versionName = versionName or 'Unknown' build.versionCode = versionCode or 0 if options.subdir: build.subdir = options.subdir build.gradle = ['yes'] elif subdir: build.subdir = subdir.as_posix() build.gradle = ['yes'] else: # subdir might be None subdir = Path() if options.license: app.License = options.license if options.categories: app.Categories = options.categories.split(',') if (subdir / 'jni').exists(): build.buildjni = ['yes'] if (subdir / 'build.gradle').exists() or (subdir / 'build.gradle').exists(): build.gradle = ['yes'] package_json = tmp_importer_dir / 'package.json' # react-native pubspec_yaml = tmp_importer_dir / 'pubspec.yaml' # flutter if package_json.exists(): build.sudo = [ 'sysctl fs.inotify.max_user_watches=524288 || true', 'curl -Lo node.tar.gz https://nodejs.org/download/release/v19.3.0/node-v19.3.0-linux-x64.tar.gz', 'echo "b525028ae5bb71b5b32cb7fce903ccce261dbfef4c7dd0f3e0ffc27cd6fc0b3f node.tar.gz" | sha256sum -c -', 'tar xzf node.tar.gz --strip-components=1 -C /usr/local/', 'npm -g install yarn', ] build.init = ['npm install --build-from-source'] with package_json.open() as fp: data = json.load(fp) app.AutoName = data.get('name', app.AutoName) app.License = data.get('license', app.License) app.Description = data.get('description', app.Description) app.WebSite = data.get('homepage', app.WebSite) app_json = tmp_importer_dir / 'app.json' build.scanignore = ['android/build.gradle'] build.scandelete = ['node_modules'] if app_json.exists(): with app_json.open() as fp: data = json.load(fp) app.AutoName = data.get('name', app.AutoName) if pubspec_yaml.exists(): with pubspec_yaml.open() as fp: data = yaml.load(fp, Loader=SafeLoader) app.AutoName = data.get('name', app.AutoName) app.License = data.get('license', app.License) app.Description = data.get('description', app.Description) app.UpdateCheckData = 'pubspec.yaml|version:\\s.+\\+(\\d+)|.|version:\\s(.+)\\+' build.srclibs = ['flutter@stable'] build.output = 'build/app/outputs/flutter-apk/app-release.apk' build.subdir = None build.gradle = None build.prebuild = [ 'export PUB_CACHE=$(pwd)/.pub-cache', '$$flutter$$/bin/flutter config --no-analytics', '$$flutter$$/bin/flutter packages pub get', ] build.scandelete = [ '.pub-cache', ] build.build = [ 'export PUB_CACHE=$(pwd)/.pub-cache', '$$flutter$$/bin/flutter build apk', ] git_modules = tmp_importer_dir / '.gitmodules' if git_modules.exists(): build.submodules = True metadata.post_parse_yaml_metadata(app) app['Builds'].append(build) if write_local_file: metadata.write_metadata(Path('.fdroid.yml'), app) else: # Keep the repo directory to save bandwidth... Path('build').mkdir(exist_ok=True) build_dir = Path('build') / appid if build_dir.exists(): logging.warning(_('{path} already exists, ignoring import results!') .format(path=build_dir)) sys.exit(1) elif tmp_importer_dir: # For Windows: Close the repo or a git.exe instance holds handles to repo try: git_repo.close() except AttributeError: # Debian/stretch's version does not have close() pass shutil.move(tmp_importer_dir, build_dir) Path('build/.fdroidvcs-' + appid).write_text(app.RepoType + ' ' + app.Repo) metadatapath = Path('metadata') / (appid + '.yml') metadata.write_metadata(metadatapath, app) logging.info("Wrote " + str(metadatapath)) if __name__ == "__main__": main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/index.py0000644000175000017500000021036214620351225017165 0ustar00hanshans#!/usr/bin/env python3 # # update.py - part of the FDroid server tools # Copyright (C) 2017, Torsten Grote # Copyright (C) 2016, Blue Jay Wireless # Copyright (C) 2014-2016, Hans-Christoph Steiner # Copyright (C) 2010-2015, Ciaran Gultnieks # Copyright (C) 2013-2014, Daniel Martí # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import collections import hashlib import json import logging import os import re import ruamel.yaml import shutil import tempfile import urllib.parse import zipfile import calendar import qrcode from binascii import hexlify, unhexlify from datetime import datetime, timezone from pathlib import Path from xml.dom.minidom import Document from . import _ from . import common from . import metadata from . import net from . import signindex from fdroidserver.common import ANTIFEATURES_CONFIG_NAME, CATEGORIES_CONFIG_NAME, CONFIG_CONFIG_NAME, MIRRORS_CONFIG_NAME, RELEASECHANNELS_CONFIG_NAME, DEFAULT_LOCALE, FDroidPopen, FDroidPopenBytes, load_stats_fdroid_signing_key_fingerprints from fdroidserver.exception import FDroidException, VerificationException def make(apps, apks, repodir, archive): """Generate the repo index files. This requires properly initialized options and config objects. Parameters ---------- apps OrderedDict of apps to go into the index, each app should have at least one associated apk apks list of apks to go into the index repodir the repo directory archive True if this is the archive repo, False if it's the main one. """ from fdroidserver.update import METADATA_VERSION if not hasattr(common.options, 'nosign') or not common.options.nosign: common.assert_config_keystore(common.config) # Historically the index has been sorted by App Name, so we enforce this ordering here sortedids = sorted(apps, key=lambda appid: common.get_app_display_name(apps[appid]).upper()) sortedapps = collections.OrderedDict() for appid in sortedids: sortedapps[appid] = apps[appid] repodict = collections.OrderedDict() repodict['timestamp'] = datetime.utcnow().replace(tzinfo=timezone.utc) repodict['version'] = METADATA_VERSION if common.config['repo_maxage'] != 0: repodict['maxage'] = common.config['repo_maxage'] if archive: repodict['name'] = common.config['archive_name'] repodict['icon'] = common.config.get('archive_icon', common.default_config['repo_icon']) repodict['description'] = common.config['archive_description'] archive_url = common.config.get('archive_url', common.config['repo_url'][:-4] + 'archive') repodict['address'] = archive_url if 'archive_web_base_url' in common.config: repodict["webBaseUrl"] = common.config['archive_web_base_url'] repo_section = os.path.basename(urllib.parse.urlparse(archive_url).path) else: repodict['name'] = common.config['repo_name'] repodict['icon'] = common.config.get('repo_icon', common.default_config['repo_icon']) repodict['address'] = common.config['repo_url'] if 'repo_web_base_url' in common.config: repodict["webBaseUrl"] = common.config['repo_web_base_url'] repodict['description'] = common.config['repo_description'] repo_section = os.path.basename(urllib.parse.urlparse(common.config['repo_url']).path) add_mirrors_to_repodict(repo_section, repodict) requestsdict = collections.OrderedDict() for command in ('install', 'uninstall'): packageNames = [] key = command + '_list' if key in common.config: if isinstance(common.config[key], str): packageNames = [common.config[key]] elif all(isinstance(item, str) for item in common.config[key]): packageNames = common.config[key] else: raise TypeError(_('only accepts strings, lists, and tuples')) requestsdict[command] = packageNames fdroid_signing_key_fingerprints = load_stats_fdroid_signing_key_fingerprints() make_v0(sortedapps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fingerprints) make_v1(sortedapps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fingerprints) make_v2(sortedapps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fingerprints, archive) make_website(sortedapps, repodir, repodict) make_altstore( sortedapps, apks, common.config, repodir, pretty=common.options.pretty, ) def _should_file_be_generated(path, magic_string): if os.path.exists(path): with open(path) as f: # if the magic_string is not in the first line the file should be overwritten if magic_string not in f.readline(): return False return True def make_website(apps, repodir, repodict): _ignored, repo_pubkey_fingerprint = extract_pubkey() repo_pubkey_fingerprint_stripped = repo_pubkey_fingerprint.replace(" ", "") link = repodict["address"] link_fingerprinted = ('{link}?fingerprint={fingerprint}' .format(link=link, fingerprint=repo_pubkey_fingerprint_stripped)) # do not change this string, as it will break updates for files with older versions of this string autogenerate_comment = "auto-generated - fdroid index updates will overwrite this file" if not os.path.exists(repodir): os.makedirs(repodir) qrcode.make(link_fingerprinted).save(os.path.join(repodir, "index.png")) html_name = 'index.html' html_file = os.path.join(repodir, html_name) if _should_file_be_generated(html_file, autogenerate_comment): with open(html_file, 'w') as f: name = repodict["name"] description = repodict["description"] icon = repodict["icon"] f.write(""" {name}

{name}

QR: test {description}

Currently it serves {number_of_apps} apps. To add it to your F-Droid app, scan the QR code (click it to enlarge) or use this link:

{link}

If you would like to manually verify the fingerprint (SHA-256) of the repository signing key, here it is:
{fingerprint}

""".format(autogenerate_comment=autogenerate_comment, description=description, fingerprint=repo_pubkey_fingerprint, icon=icon, link=link, link_fingerprinted=link_fingerprinted, name=name, number_of_apps=str(len(apps)))) css_file = os.path.join(repodir, "index.css") if _should_file_be_generated(css_file, autogenerate_comment): with open(css_file, "w") as f: # this auto generated comment was not included via .format(), as python seems to have problems with css files in combination with .format() f.write("""/* auto-generated - fdroid index updates will overwrite this file */ BODY { font-family : Arial, Helvetica, Sans-Serif; color : #0000ee; background-color : #ffffff; } p { text-align : justify; } p.center { text-align : center; } TD { font-family : Arial, Helvetica, Sans-Serif; color : #0000ee; } body,td { font-size : 14px; } TH { font-family : Arial, Helvetica, Sans-Serif; color : #0000ee; background-color : #F5EAD4; } a:link { color : #bb0000; } a:visited { color : #ff0000; } .zitat { margin-left : 1cm; margin-right : 1cm; font-style : italic; } #intro { border-spacing : 1em; border : 1px solid gray; border-radius : 0.5em; box-shadow : 10px 10px 5px #888; margin : 1.5em; font-size : .9em; width : 600px; max-width : 90%; display : table; margin-left : auto; margin-right : auto; font-size : .8em; color : #555555; } #intro > p { margin-top : 0; } #intro p:last-child { margin-bottom : 0; } .last { border-bottom : 1px solid black; padding-bottom : .5em; text-align : center; } table { border-collapse : collapse; } h2 { text-align : center; } .perms { font-family : monospace; font-size : .8em; } .repoapplist { display : table; border-collapse : collapse; margin-left : auto; margin-right : auto; width : 600px; max-width : 90%; } .approw, appdetailrow { display : table-row; } .appdetailrow { display : flex; padding : .5em; } .appiconbig, .appdetailblock, .appdetailcell { display : table-cell } .appiconbig { vertical-align : middle; text-align : center; } .appdetailinner { width : 100%; } .applinkcell { text-align : center; float : right; width : 100%; margin-bottom : .1em; } .paddedlink { margin : 1em; } .approw { border-spacing : 1em; border : 1px solid gray; border-radius : 0.5em; padding : 0.5em; margin : 1.5em; } .appdetailinner .appdetailrow:first-child { background-color : #d5d5d5; } .appdetailinner .appdetailrow:first-child .appdetailcell { min-width : 33%; flex : 1 33%; text-align : center; } .appdetailinner .appdetailrow:first-child .appdetailcell:first-child { text-align : left; } .appdetailinner .appdetailrow:first-child .appdetailcell:last-child { float : none; text-align : right; } .minor-details { font-size : .8em; color : #555555; } .boldname { font-weight : bold; } #appcount { text-align : center; margin-bottom : .5em; } kbd { padding : 0.1em 0.6em; border : 1px solid #CCC; background-color : #F7F7F7; color : #333; box-shadow : 0px 1px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 2px #FFF inset; border-radius : 3px; display : inline-block; margin : 0px 0.1em; text-shadow : 0px 1px 0px #FFF; white-space : nowrap; } div.filterline, div.repoline { display : table; margin-left : auto; margin-right : auto; margin-bottom : 1em; vertical-align : middle; display : table; font-size : .8em; } .filterline form { display : table-row; } .filterline .filtercell { display : table-cell; vertical-align : middle; } fieldset { float : left; } fieldset select, fieldset input, #reposelect select, #reposelect input { font-size : .9em; } .pager { display : table; margin-left : auto; margin-right : auto; width : 600px; max-width : 90%; padding-top : .6em; } /* should correspond to .repoapplist */ .pagerrow { display : table-row; } .pagercell { display : table-cell; } .pagercell.left { text-align : left; padding-right : 1em; } .pagercell.middle { text-align : center; font-size : .9em; color : #555; } .pagercell.right { text-align : right; padding-left : 1em; } .anti { color : peru; } .antibold { color : crimson; } #footer { text-align : center; margin-top : 1em; font-size : 11px; color : #555; } #footer img { vertical-align : middle; } @media (max-width: 600px) { .repoapplist { display : block; } .appdetailinner, .appdetailrow { display : block; } .appdetailcell { display : block; float : left; line-height : 1.5em; } }""") def dict_diff(source, target): if not isinstance(target, dict) or not isinstance(source, dict): return target result = {key: None for key in source if key not in target} for key, value in target.items(): if key not in source: result[key] = value elif value != source[key]: result[key] = dict_diff(source[key], value) return result def convert_datetime(obj): if isinstance(obj, datetime): # Java prefers milliseconds # we also need to account for time zone/daylight saving time return int(calendar.timegm(obj.timetuple()) * 1000) return obj def package_metadata(app, repodir): meta = {} for element in ( "added", # "binaries", "Categories", "Changelog", "IssueTracker", "lastUpdated", "License", "SourceCode", "Translation", "WebSite", "featureGraphic", "promoGraphic", "tvBanner", "screenshots", "AuthorEmail", "AuthorName", "AuthorPhone", "AuthorWebSite", "Bitcoin", "FlattrID", "Liberapay", "Litecoin", "OpenCollective", ): if element in app and app[element]: element_new = element[:1].lower() + element[1:] meta[element_new] = convert_datetime(app[element]) for element in ( "Name", "Summary", "Description", "video", ): element_new = element[:1].lower() + element[1:] if element in app and app[element]: meta[element_new] = {DEFAULT_LOCALE: convert_datetime(app[element])} elif "localized" in app: localized = {k: v[element_new] for k, v in app["localized"].items() if element_new in v} if localized: meta[element_new] = localized if "name" not in meta and app["AutoName"]: meta["name"] = {DEFAULT_LOCALE: app["AutoName"]} # fdroidserver/metadata.py App default if meta["license"] == "Unknown": del meta["license"] if app["Donate"]: meta["donate"] = [app["Donate"]] # TODO handle different resolutions if app.get("icon"): icon_path = os.path.join(repodir, "icons", app["icon"]) meta["icon"] = {DEFAULT_LOCALE: common.file_entry(icon_path)} if "iconv2" in app: meta["icon"] = app["iconv2"] return meta def convert_version(version, app, repodir): """Convert the internal representation of Builds: into index-v2 versions. The diff algorithm of index-v2 uses null/None to mean a field to be removed, so this function handles any Nones that are in the metadata file. """ ver = {} if "added" in version: ver["added"] = convert_datetime(version["added"]) else: ver["added"] = 0 ver["file"] = { "name": "/{}".format(version["apkName"]), version["hashType"]: version["hash"], "size": version["size"], } ipfsCIDv1 = version.get("ipfsCIDv1") if ipfsCIDv1: ver["file"]["ipfsCIDv1"] = ipfsCIDv1 if "srcname" in version: ver["src"] = common.file_entry(os.path.join(repodir, version["srcname"])) if "obbMainFile" in version: ver["obbMainFile"] = common.file_entry( os.path.join(repodir, version["obbMainFile"]), version["obbMainFileSha256"], ) if "obbPatchFile" in version: ver["obbPatchFile"] = common.file_entry( os.path.join(repodir, version["obbPatchFile"]), version["obbPatchFileSha256"], ) ver["manifest"] = manifest = {} for element in ( "nativecode", "versionName", "maxSdkVersion", ): if element in version: manifest[element] = version[element] if "versionCode" in version: manifest["versionCode"] = version["versionCode"] if "features" in version and version["features"]: manifest["features"] = features = [] for feature in version["features"]: # TODO get version from manifest, default (0) is omitted # features.append({"name": feature, "version": 1}) features.append({"name": feature}) if "minSdkVersion" in version: manifest["usesSdk"] = {} manifest["usesSdk"]["minSdkVersion"] = version["minSdkVersion"] if "targetSdkVersion" in version: manifest["usesSdk"]["targetSdkVersion"] = version["targetSdkVersion"] else: # https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#target manifest["usesSdk"]["targetSdkVersion"] = manifest["usesSdk"]["minSdkVersion"] if "signer" in version: manifest["signer"] = {"sha256": [version["signer"]]} for element in ("uses-permission", "uses-permission-sdk-23"): en = element.replace("uses-permission", "usesPermission").replace("-sdk-23", "Sdk23") if element in version and version[element]: manifest[en] = [] for perm in version[element]: if perm[1]: manifest[en].append({"name": perm[0], "maxSdkVersion": perm[1]}) else: manifest[en].append({"name": perm[0]}) # index-v2 has only per-version antifeatures, not per package. antiFeatures = app.get('AntiFeatures', {}).copy() for name, descdict in version.get('antiFeatures', dict()).items(): antiFeatures[name] = descdict if antiFeatures: ver['antiFeatures'] = { k: dict(sorted(antiFeatures[k].items())) for k in sorted(antiFeatures) } if "versionCode" in version: if version["versionCode"] > app["CurrentVersionCode"]: ver[RELEASECHANNELS_CONFIG_NAME] = ["Beta"] builds = app.get("Builds", []) if len(builds) > 0 and version["versionCode"] == builds[-1]["versionCode"]: if "localized" in app: localized = {k: v["whatsNew"] for k, v in app["localized"].items() if "whatsNew" in v} if localized: ver["whatsNew"] = localized for build in builds: if build['versionCode'] == version['versionCode'] and "whatsNew" in build: ver["whatsNew"] = build["whatsNew"] break return ver def v2_repo(repodict, repodir, archive): repo = {} repo["name"] = {DEFAULT_LOCALE: repodict["name"]} repo["description"] = {DEFAULT_LOCALE: repodict["description"]} repo["icon"] = { DEFAULT_LOCALE: common.file_entry("%s/icons/%s" % (repodir, repodict["icon"])) } config = common.load_localized_config(CONFIG_CONFIG_NAME, repodir) if config: repo["name"] = config["archive" if archive else "repo"]["name"] repo["description"] = config["archive" if archive else "repo"]["description"] repo["icon"] = config["archive" if archive else "repo"]["icon"] repo["address"] = repodict["address"] if "mirrors" in repodict: repo["mirrors"] = repodict["mirrors"] if "webBaseUrl" in repodict: repo["webBaseUrl"] = repodict["webBaseUrl"] repo["timestamp"] = repodict["timestamp"] antiFeatures = common.load_localized_config(ANTIFEATURES_CONFIG_NAME, repodir) if antiFeatures: repo[ANTIFEATURES_CONFIG_NAME] = antiFeatures categories = common.load_localized_config(CATEGORIES_CONFIG_NAME, repodir) if categories: repo[CATEGORIES_CONFIG_NAME] = categories releaseChannels = common.load_localized_config(RELEASECHANNELS_CONFIG_NAME, repodir) if releaseChannels: repo[RELEASECHANNELS_CONFIG_NAME] = releaseChannels return repo def make_v2(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_fingerprints, archive): def _index_encoder_default(obj): if isinstance(obj, set): return sorted(list(obj)) if isinstance(obj, datetime): # Java prefers milliseconds # we also need to account for time zone/daylight saving time return int(calendar.timegm(obj.timetuple()) * 1000) if isinstance(obj, dict): d = collections.OrderedDict() for key in sorted(obj.keys()): d[key] = obj[key] return d raise TypeError(repr(obj) + " is not JSON serializable") output = collections.OrderedDict() output["repo"] = v2_repo(repodict, repodir, archive) if requestsdict and (requestsdict["install"] or requestsdict["uninstall"]): output["repo"]["requests"] = requestsdict # establish sort order of the index v1_sort_packages(packages, fdroid_signing_key_fingerprints) output_packages = collections.OrderedDict() output['packages'] = output_packages categories_used_by_apps = set() for package in packages: packageName = package['packageName'] if packageName not in apps: logging.info(_('Ignoring package without metadata: ') + package['apkName']) continue if not package.get('versionName'): app = apps[packageName] for build in app.get('Builds', []): if build['versionCode'] == package['versionCode']: versionName = build.get('versionName') logging.info(_('Overriding blank versionName in {apkfilename} from metadata: {version}') .format(apkfilename=package['apkName'], version=versionName)) package['versionName'] = versionName break if packageName in output_packages: packagelist = output_packages[packageName] else: packagelist = {} output_packages[packageName] = packagelist app = apps[packageName] categories_used_by_apps.update(app.get('Categories', [])) packagelist["metadata"] = package_metadata(app, repodir) if "signer" in package: packagelist["metadata"]["preferredSigner"] = package["signer"] packagelist["versions"] = {} packagelist["versions"][package["hash"]] = convert_version(package, apps[packageName], repodir) if categories_used_by_apps and not output['repo'].get(CATEGORIES_CONFIG_NAME): output['repo'][CATEGORIES_CONFIG_NAME] = dict() # include definitions for "auto-defined" categories, e.g. just used in app metadata for category in sorted(categories_used_by_apps): if category not in output['repo'][CATEGORIES_CONFIG_NAME]: output['repo'][CATEGORIES_CONFIG_NAME][category] = {"name": {DEFAULT_LOCALE: category}} # do not include defined categories if no apps use them for category in list(output['repo'].get(CATEGORIES_CONFIG_NAME, list())): if category not in categories_used_by_apps: del output['repo'][CATEGORIES_CONFIG_NAME][category] msg = _('Category "{category}" defined but not used for any apps!') logging.warning(msg.format(category=category)) entry = {} entry["timestamp"] = repodict["timestamp"] entry["version"] = repodict["version"] if "maxage" in repodict: entry["maxAge"] = repodict["maxage"] json_name = 'index-v2.json' index_file = os.path.join(repodir, json_name) with open(index_file, "w", encoding="utf-8") as fp: if common.options.pretty: json.dump(output, fp, default=_index_encoder_default, indent=2, ensure_ascii=False) else: json.dump(output, fp, default=_index_encoder_default, ensure_ascii=False) json_name = "tmp/{}_{}.json".format(repodir, convert_datetime(repodict["timestamp"])) with open(json_name, "w", encoding="utf-8") as fp: if common.options.pretty: json.dump(output, fp, default=_index_encoder_default, indent=2, ensure_ascii=False) else: json.dump(output, fp, default=_index_encoder_default, ensure_ascii=False) entry["index"] = common.file_entry(index_file) entry["index"]["numPackages"] = len(output.get("packages", [])) indexes = sorted(Path().glob("tmp/{}*.json".format(repodir)), key=lambda x: x.name) indexes.pop() # remove current index # remove older indexes while len(indexes) > 10: indexes.pop(0).unlink() indexes = [json.loads(Path(fn).read_text(encoding="utf-8")) for fn in indexes] for diff in Path().glob("{}/diff/*.json".format(repodir)): diff.unlink() entry["diffs"] = {} for old in indexes: diff_name = str(old["repo"]["timestamp"]) + ".json" diff_file = os.path.join(repodir, "diff", diff_name) diff = dict_diff(old, output) if not os.path.exists(os.path.join(repodir, "diff")): os.makedirs(os.path.join(repodir, "diff")) with open(diff_file, "w", encoding="utf-8") as fp: if common.options.pretty: json.dump(diff, fp, default=_index_encoder_default, indent=2, ensure_ascii=False) else: json.dump(diff, fp, default=_index_encoder_default, ensure_ascii=False) entry["diffs"][old["repo"]["timestamp"]] = common.file_entry(diff_file) entry["diffs"][old["repo"]["timestamp"]]["numPackages"] = len(diff.get("packages", [])) json_name = "entry.json" index_file = os.path.join(repodir, json_name) with open(index_file, "w", encoding="utf-8") as fp: if common.options.pretty: json.dump(entry, fp, default=_index_encoder_default, indent=2, ensure_ascii=False) else: json.dump(entry, fp, default=_index_encoder_default, ensure_ascii=False) if common.options.nosign: _copy_to_local_copy_dir(repodir, index_file) logging.debug(_('index-v2 must have a signature, use `fdroid signindex` to create it!')) else: signindex.config = common.config signindex.sign_index(repodir, json_name) def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_fingerprints): def _index_encoder_default(obj): if isinstance(obj, set): return sorted(list(obj)) if isinstance(obj, datetime): # Java prefers milliseconds # we also need to account for time zone/daylight saving time return int(calendar.timegm(obj.timetuple()) * 1000) if isinstance(obj, dict): d = collections.OrderedDict() for key in sorted(obj.keys()): d[key] = obj[key] return d raise TypeError(repr(obj) + " is not JSON serializable") output = collections.OrderedDict() output['repo'] = repodict.copy() output['requests'] = requestsdict # index-v1 only supports a list of URL strings for additional mirrors mirrors = [] for mirror in repodict.get('mirrors', []): url = mirror['url'] if url != repodict['address']: mirrors.append(mirror['url']) if mirrors: output['repo']['mirrors'] = mirrors # establish sort order of the index v1_sort_packages(packages, fdroid_signing_key_fingerprints) appslist = [] output['apps'] = appslist for packageName, app_dict in apps.items(): d = collections.OrderedDict() appslist.append(d) for k, v in sorted(app_dict.items()): if not v: continue if k in ('Builds', 'metadatapath', 'ArchivePolicy', 'AutoName', 'AutoUpdateMode', 'MaintainerNotes', 'Provides', 'Repo', 'RepoType', 'RequiresRoot', 'UpdateCheckData', 'UpdateCheckIgnore', 'UpdateCheckMode', 'UpdateCheckName', 'NoSourceSince', 'VercodeOperation', 'summary', 'description', 'promoGraphic', 'screenshots', 'whatsNew', 'featureGraphic', 'iconv2', 'tvBanner', ): continue # name things after the App class fields in fdroidclient if k == 'id': k = 'packageName' elif k == 'CurrentVersionCode': # TODO make SuggestedVersionCode the canonical name k = 'suggestedVersionCode' v = str(v) elif k == 'CurrentVersion': # TODO make SuggestedVersionName the canonical name k = 'suggestedVersionName' else: k = k[:1].lower() + k[1:] d[k] = v # establish sort order in lists, sets, and localized dicts for app_dict in output['apps']: localized = app_dict.get('localized') if localized: lordered = collections.OrderedDict() for lkey, lvalue in sorted(localized.items()): lordered[lkey] = collections.OrderedDict() for ikey, iname in sorted(lvalue.items()): lordered[lkey][ikey] = iname app_dict['localized'] = lordered # v1 uses a list of keys for Anti-Features antiFeatures = app_dict.get('antiFeatures', dict()).keys() if antiFeatures: app_dict['antiFeatures'] = sorted(set(antiFeatures)) output_packages = collections.OrderedDict() output['packages'] = output_packages for package in packages: packageName = package['packageName'] if packageName not in apps: logging.info(_('Ignoring package without metadata: ') + package['apkName']) continue if not package.get('versionName'): app = apps[packageName] for build in app.get('Builds', []): if build['versionCode'] == package['versionCode']: versionName = build.get('versionName') logging.info(_('Overriding blank versionName in {apkfilename} from metadata: {version}') .format(apkfilename=package['apkName'], version=versionName)) package['versionName'] = versionName break if packageName in output_packages: packagelist = output_packages[packageName] else: packagelist = [] output_packages[packageName] = packagelist d = collections.OrderedDict() packagelist.append(d) for k, v in sorted(package.items()): if not v: continue if k in ('icon', 'icons', 'icons_src', 'ipfsCIDv1', 'name'): continue if k == 'antiFeatures': d[k] = sorted(v.keys()) continue d[k] = v json_name = 'index-v1.json' index_file = os.path.join(repodir, json_name) with open(index_file, 'w') as fp: if common.options.pretty: json.dump(output, fp, default=_index_encoder_default, indent=2) else: json.dump(output, fp, default=_index_encoder_default) if common.options.nosign: _copy_to_local_copy_dir(repodir, index_file) logging.debug(_('index-v1 must have a signature, use `fdroid signindex` to create it!')) else: signindex.config = common.config signindex.sign_index(repodir, json_name) def _copy_to_local_copy_dir(repodir, f): local_copy_dir = common.config.get('local_copy_dir', '') if os.path.exists(local_copy_dir): destdir = os.path.join(local_copy_dir, repodir) if not os.path.exists(destdir): os.mkdir(destdir) shutil.copy2(f, destdir, follow_symlinks=False) elif local_copy_dir: raise FDroidException(_('"local_copy_dir" {path} does not exist!') .format(path=local_copy_dir)) def v1_sort_packages(packages, fdroid_signing_key_fingerprints): """Sort the supplied list to ensure a deterministic sort order for package entries in the index file. This sort-order also expresses installation preference to the clients. (First in this list = first to install) Parameters ---------- packages list of packages which need to be sorted before but into index file. """ GROUP_DEV_SIGNED = 1 GROUP_FDROID_SIGNED = 2 GROUP_OTHER_SIGNED = 3 def v1_sort_keys(package): packageName = package.get('packageName', None) signer = package.get('signer', None) dev_signer = common.metadata_find_developer_signature(packageName) group = GROUP_OTHER_SIGNED if dev_signer and dev_signer == signer: group = GROUP_DEV_SIGNED else: fdroid_signer = fdroid_signing_key_fingerprints.get(packageName, {}).get('signer') if fdroid_signer and fdroid_signer == signer: group = GROUP_FDROID_SIGNED versionCode = None if package.get('versionCode', None): versionCode = -package['versionCode'] return packageName, group, signer, versionCode packages.sort(key=v1_sort_keys) def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fingerprints): """Aka index.jar aka index.xml.""" doc = Document() def addElement(name, value, doc, parent): el = doc.createElement(name) el.appendChild(doc.createTextNode(value)) parent.appendChild(el) def addElementNonEmpty(name, value, doc, parent): if not value: return addElement(name, value, doc, parent) def addElementIfInApk(name, apk, key, doc, parent): if key not in apk: return value = str(apk[key]) addElement(name, value, doc, parent) def addElementCheckLocalized(name, app, key, doc, parent, default=''): """Fill in field from metadata or localized block. For name/summary/description, they can come only from the app source, or from a dir in fdroiddata. They can be entirely missing from the metadata file if there is localized versions. This will fetch those from the localized version if its not available in the metadata file. Attributes should be alpha-sorted, so they must be added in alpha- sort order. """ el = doc.createElement(name) value = app.get(key) lkey = key[:1].lower() + key[1:] localized = app.get('localized') if not value and localized: for lang in [DEFAULT_LOCALE] + [x for x in localized.keys()]: if not lang.startswith('en'): continue if lang in localized: value = localized[lang].get(lkey) if value: break if not value and localized and len(localized) > 1: lang = list(localized.keys())[0] value = localized[lang].get(lkey) if not value: value = default if not value and name == 'name' and app.get('AutoName'): value = app['AutoName'] el.appendChild(doc.createTextNode(value)) parent.appendChild(el) root = doc.createElement("fdroid") doc.appendChild(root) repoel = doc.createElement("repo") repoel.setAttribute("icon", repodict['icon']) if 'maxage' in repodict: repoel.setAttribute("maxage", str(repodict['maxage'])) repoel.setAttribute("name", repodict['name']) pubkey, repo_pubkey_fingerprint = extract_pubkey() repoel.setAttribute("pubkey", pubkey.decode('utf-8')) repoel.setAttribute("timestamp", '%d' % repodict['timestamp'].timestamp()) repoel.setAttribute("url", repodict['address']) repoel.setAttribute("version", str(repodict['version'])) addElement('description', repodict['description'], doc, repoel) # index v0 only supports a list of URL strings for additional mirrors for mirror in repodict.get('mirrors', []): url = mirror['url'] if url != repodict['address']: addElement('mirror', url, doc, repoel) root.appendChild(repoel) for command in ('install', 'uninstall'): for packageName in requestsdict[command]: element = doc.createElement(command) root.appendChild(element) element.setAttribute('packageName', packageName) for appid, app_dict in apps.items(): app = metadata.App(app_dict) if app.get('Disabled') is not None: continue # Get a list of the apks for this app... apklist = [] name_from_apk = None apksbyversion = collections.defaultdict(lambda: []) for apk in apks: if apk.get('versionCode') and apk.get('packageName') == appid: apksbyversion[apk['versionCode']].append(apk) if name_from_apk is None: name_from_apk = apk.get('name') for versionCode, apksforver in apksbyversion.items(): fdroid_signer = fdroid_signing_key_fingerprints.get(appid, {}).get('signer') fdroid_signed_apk = None name_match_apk = None for x in apksforver: if fdroid_signer and x.get('signer', None) == fdroid_signer: fdroid_signed_apk = x if common.apk_release_filename.match(x.get('apkName', '')): name_match_apk = x # choose which of the available versions is most # suiteable for index v0 if fdroid_signed_apk: apklist.append(fdroid_signed_apk) elif name_match_apk: apklist.append(name_match_apk) else: apklist.append(apksforver[0]) if len(apklist) == 0: continue apel = doc.createElement("application") apel.setAttribute("id", app.id) root.appendChild(apel) addElement('id', app.id, doc, apel) if app.added: addElement('added', app.added.strftime('%Y-%m-%d'), doc, apel) if app.lastUpdated: addElement('lastupdated', app.lastUpdated.strftime('%Y-%m-%d'), doc, apel) addElementCheckLocalized('name', app, 'Name', doc, apel, name_from_apk) addElementCheckLocalized('summary', app, 'Summary', doc, apel) if app.icon: addElement('icon', app.icon, doc, apel) addElementCheckLocalized('desc', app, 'Description', doc, apel, 'No description available') addElement('license', app.License, doc, apel) if app.Categories: addElement('categories', ','.join(app.Categories), doc, apel) # We put the first (primary) category in LAST, which will have # the desired effect of making clients that only understand one # category see that one. addElement('category', app.Categories[0], doc, apel) addElement('web', app.WebSite, doc, apel) addElement('source', app.SourceCode, doc, apel) addElement('tracker', app.IssueTracker, doc, apel) addElementNonEmpty('changelog', app.Changelog, doc, apel) addElementNonEmpty('author', app.AuthorName, doc, apel) addElementNonEmpty('email', app.AuthorEmail, doc, apel) addElementNonEmpty('donate', app.Donate, doc, apel) addElementNonEmpty('bitcoin', app.Bitcoin, doc, apel) addElementNonEmpty('litecoin', app.Litecoin, doc, apel) addElementNonEmpty('flattr', app.FlattrID, doc, apel) addElementNonEmpty('openCollective', app.OpenCollective, doc, apel) # These elements actually refer to the current version (i.e. which # one is recommended. They are historically mis-named, and need # changing, but stay like this for now to support existing clients. addElement('marketversion', app.CurrentVersion, doc, apel) addElement('marketvercode', str(app.CurrentVersionCode), doc, apel) if app.Provides: pv = app.Provides.split(',') addElementNonEmpty('provides', ','.join(pv), doc, apel) if app.RequiresRoot: addElement('requirements', 'root', doc, apel) # Sort the APK list into version order, just so the web site # doesn't have to do any work by default... apklist = sorted(apklist, key=lambda apk: apk['versionCode'], reverse=True) antiFeatures = list(app.AntiFeatures) if 'antiFeatures' in apklist[0]: antiFeatures.extend(apklist[0]['antiFeatures']) if antiFeatures: afout = sorted(set(antiFeatures)) addElementNonEmpty('antifeatures', ','.join(afout), doc, apel) # Check for duplicates - they will make the client unhappy... for i in range(len(apklist) - 1): first = apklist[i] second = apklist[i + 1] if first['versionCode'] == second['versionCode'] \ and first['sig'] == second['sig']: if first['hash'] == second['hash']: raise FDroidException('"{0}/{1}" and "{0}/{2}" are exact duplicates!'.format( repodir, first['apkName'], second['apkName'])) else: raise FDroidException('duplicates: "{0}/{1}" - "{0}/{2}"'.format( repodir, first['apkName'], second['apkName'])) current_version_code = 0 current_version_file = None for apk in apklist: file_extension = common.get_file_extension(apk['apkName']) # find the APK for the "Current Version" if current_version_code < app.CurrentVersionCode: current_version_file = apk['apkName'] if current_version_code < apk['versionCode']: current_version_code = apk['versionCode'] apkel = doc.createElement("package") apel.appendChild(apkel) versionName = apk.get('versionName') if not versionName: for build in app.get('Builds', []): if ( build['versionCode'] == apk['versionCode'] and 'versionName' in build ): versionName = build['versionName'] break if versionName: addElement('version', versionName, doc, apkel) addElement('versioncode', str(apk['versionCode']), doc, apkel) addElement('apkname', apk['apkName'], doc, apkel) addElementIfInApk('srcname', apk, 'srcname', doc, apkel) hashel = doc.createElement("hash") hashel.setAttribute('type', 'sha256') hashel.appendChild(doc.createTextNode(apk['hash'])) apkel.appendChild(hashel) addElement('size', str(apk['size']), doc, apkel) addElementIfInApk('sdkver', apk, 'minSdkVersion', doc, apkel) addElementIfInApk('targetSdkVersion', apk, 'targetSdkVersion', doc, apkel) addElementIfInApk('maxsdkver', apk, 'maxSdkVersion', doc, apkel) addElementIfInApk('obbMainFile', apk, 'obbMainFile', doc, apkel) addElementIfInApk('obbMainFileSha256', apk, 'obbMainFileSha256', doc, apkel) addElementIfInApk('obbPatchFile', apk, 'obbPatchFile', doc, apkel) addElementIfInApk('obbPatchFileSha256', apk, 'obbPatchFileSha256', doc, apkel) if 'added' in apk: addElement('added', apk['added'].strftime('%Y-%m-%d'), doc, apkel) if file_extension == 'apk': # sig is required for APKs, but only APKs addElement('sig', apk['sig'], doc, apkel) old_permissions = set() sorted_permissions = sorted(apk['uses-permission']) for perm in sorted_permissions: perm_name = perm[0] if perm_name.startswith("android.permission."): perm_name = perm_name[19:] old_permissions.add(perm_name) addElementNonEmpty('permissions', ','.join(sorted(old_permissions)), doc, apkel) for permission in sorted_permissions: permel = doc.createElement('uses-permission') if permission[1] is not None: permel.setAttribute('maxSdkVersion', '%d' % permission[1]) apkel.appendChild(permel) permel.setAttribute('name', permission[0]) for permission_sdk_23 in sorted(apk['uses-permission-sdk-23']): permel = doc.createElement('uses-permission-sdk-23') if permission_sdk_23[1] is not None: permel.setAttribute('maxSdkVersion', '%d' % permission_sdk_23[1]) apkel.appendChild(permel) permel.setAttribute('name', permission_sdk_23[0]) if 'nativecode' in apk: addElement('nativecode', ','.join(sorted(apk['nativecode'])), doc, apkel) addElementNonEmpty('features', ','.join(sorted(apk['features'])), doc, apkel) if current_version_file is not None \ and common.config['make_current_version_link'] \ and repodir == 'repo': # only create these namefield = common.config['current_version_name_source'] name = app.get(namefield) if not name and namefield == 'Name': name = app.get('localized', {}).get(DEFAULT_LOCALE, {}).get('name') if not name: name = app.id sanitized_name = re.sub(b'''[ '"&%?+=/]''', b'', str(name).encode('utf-8')) apklinkname = sanitized_name + os.path.splitext(current_version_file)[1].encode('utf-8') current_version_path = os.path.join(repodir, current_version_file).encode('utf-8', 'surrogateescape') if os.path.islink(apklinkname): os.remove(apklinkname) os.symlink(current_version_path, apklinkname) # also symlink gpg signature, if it exists for extension in (b'.asc', b'.sig'): sigfile_path = current_version_path + extension if os.path.exists(sigfile_path): siglinkname = apklinkname + extension if os.path.islink(siglinkname): os.remove(siglinkname) os.symlink(sigfile_path, siglinkname) if common.options.pretty: output = doc.toprettyxml(encoding='utf-8') else: output = doc.toxml(encoding='utf-8') with open(os.path.join(repodir, 'index.xml'), 'wb') as f: f.write(output) if 'repo_keyalias' in common.config \ or (common.options.nosign and 'repo_pubkey' in common.config): if common.options.nosign: logging.info(_("Creating unsigned index in preparation for signing")) else: logging.info(_("Creating signed index with this key (SHA256):")) logging.info("%s" % repo_pubkey_fingerprint) # Create a jar of the index... jar_output = 'index_unsigned.jar' if common.options.nosign else 'index.jar' p = FDroidPopen(['jar', 'cf', jar_output, 'index.xml'], cwd=repodir) if p.returncode != 0: raise FDroidException("Failed to create {0}".format(jar_output)) # Sign the index... signed = os.path.join(repodir, 'index.jar') if common.options.nosign: _copy_to_local_copy_dir(repodir, os.path.join(repodir, jar_output)) # Remove old signed index if not signing if os.path.exists(signed): os.remove(signed) else: signindex.config = common.config signindex.sign_jar(signed, use_old_algs=True) # Copy the repo icon into the repo directory... icon_dir = os.path.join(repodir, 'icons') repo_icon = common.config.get('repo_icon', common.default_config['repo_icon']) iconfilename = os.path.join(icon_dir, os.path.basename(repo_icon)) if os.path.exists(repo_icon): shutil.copyfile(common.config['repo_icon'], iconfilename) else: logging.warning(_('repo_icon "repo/icons/%s" does not exist, generating placeholder.') % repo_icon) os.makedirs(os.path.dirname(iconfilename), exist_ok=True) try: qrcode.make(common.config['repo_url']).save(iconfilename) except Exception: exampleicon = os.path.join(common.get_examples_dir(), common.default_config['repo_icon']) shutil.copy(exampleicon, iconfilename) def extract_pubkey(): """Extract and return the repository's public key from the keystore. Returns ------- public key in hex repository fingerprint """ if 'repo_pubkey' in common.config: pubkey = unhexlify(common.config['repo_pubkey']) elif 'keystorepass' in common.config: env_vars = {'LC_ALL': 'C.UTF-8', 'FDROID_KEY_STORE_PASS': common.config['keystorepass']} p = FDroidPopenBytes([common.config['keytool'], '-exportcert', '-alias', common.config['repo_keyalias'], '-keystore', common.config['keystore'], '-storepass:env', 'FDROID_KEY_STORE_PASS'] + list(common.config['smartcardoptions']), envs=env_vars, output=False, stderr_to_stdout=False) if p.returncode != 0 or len(p.output) < 20: msg = "Failed to get repo pubkey!" if common.config['keystore'] == 'NONE': msg += ' Is your crypto smartcard plugged in?' raise FDroidException(msg) pubkey = p.output else: raise FDroidException(_('Neither "repo_pubkey" nor "keystorepass" set in config.yml')) repo_pubkey_fingerprint = common.get_cert_fingerprint(pubkey) return hexlify(pubkey), repo_pubkey_fingerprint def add_mirrors_to_repodict(repo_section, repodict): """Convert config into final dict of mirror metadata for the repo. Internally and in index-v2, mirrors is a list of dicts, but it can be specified in the config as a string or list of strings. Also, index v0 and v1 use a list of URL strings as the data structure. The first entry is traditionally the primary mirror and canonical URL. 'mirrors' should not be present in the index if there is only the canonical URL, and no other mirrors. The metadata items for each mirror entry are sorted by key to ensure minimum diffs in the index files. """ mirrors_config = common.config.get('mirrors', []) if type(mirrors_config) not in (list, tuple): mirrors_config = [mirrors_config] mirrors_yml = Path(f'config/{MIRRORS_CONFIG_NAME}.yml') if mirrors_yml.exists(): if mirrors_config: raise FDroidException( _('mirrors set twice, in config.yml and {path}!').format( path=mirrors_yml ) ) with mirrors_yml.open() as fp: mirrors_config = ruamel.yaml.YAML(typ='safe').load(fp) if not isinstance(mirrors_config, list): msg = _('{path} is not list, but a {datatype}!') raise TypeError( msg.format(path=mirrors_yml, datatype=type(mirrors_config).__name__) ) if type(mirrors_config) not in (list, tuple, set): msg = 'In config.yml, mirrors: is not list, but a {datatype}!' raise TypeError(msg.format(datatype=type(mirrors_config).__name__)) mirrorcheckfailed = False mirrors = [] urls = set() for mirror in mirrors_config: if isinstance(mirror, str): mirror = {'url': mirror} elif not isinstance(mirror, dict): logging.error( _('Bad entry type "{mirrortype}" in mirrors config: {mirror}').format( mirrortype=type(mirror), mirror=mirror ) ) mirrorcheckfailed = True continue config_url = mirror['url'] base = os.path.basename(urllib.parse.urlparse(config_url).path.rstrip('/')) if common.config.get('nonstandardwebroot') is not True and base != 'fdroid': logging.error(_("mirror '%s' does not end with 'fdroid'!") % config_url) mirrorcheckfailed = True # must end with / or urljoin strips a whole path segment if config_url.endswith('/'): mirror['url'] = urllib.parse.urljoin(config_url, repo_section) else: mirror['url'] = urllib.parse.urljoin(config_url + '/', repo_section) mirrors.append(mirror) if mirror['url'] in urls: mirrorcheckfailed = True logging.error( _('Duplicate entry "%s" in mirrors config!') % mirror['url'] ) urls.add(mirror['url']) for mirror in common.config.get('servergitmirrors', []): for url in get_mirror_service_urls(mirror): mirrors.append({'url': url + '/' + repo_section}) if mirrorcheckfailed: raise FDroidException(_("Malformed repository mirrors.")) if not mirrors: return repodict['mirrors'] = [] canonical_url = repodict['address'] found_primary = False for mirror in mirrors: if canonical_url == mirror['url']: found_primary = True mirror['isPrimary'] = True sortedmirror = dict() for k in sorted(mirror.keys()): sortedmirror[k] = mirror[k] repodict['mirrors'].insert(0, sortedmirror) else: repodict['mirrors'].append(mirror) if repodict['mirrors'] and not found_primary: repodict['mirrors'].insert(0, {'isPrimary': True, 'url': repodict['address']}) def get_mirror_service_urls(mirror): """Get direct URLs from git service for use by fdroidclient. Via 'servergitmirrors', fdroidserver can create and push a mirror to certain well known git services like GitLab or GitHub. This will always use the 'master' branch since that is the default branch in git. The files are then accessible via alternate URLs, where they are served in their raw format via a CDN rather than from git. Both of the GitLab URLs will work with F-Droid, but only the GitLab Pages will work in the browser This is because the "raw" URLs are not served with the correct mime types, so any index.html which is put in the repo will not be rendered. Putting an index.html file in the repo root is a common way for to make information about the repo available to end user. """ url = mirror['url'] if url.startswith('git@'): url = re.sub(r'^git@([^:]+):(.+)', r'https://\1/\2', url) segments = url.split("/") if segments[4].endswith('.git'): segments[4] = segments[4][:-4] hostname = segments[2] user = segments[3] repo = segments[4] branch = "master" folder = "fdroid" urls = [] if hostname == "github.com": # Github-like RAW segments "https://raw.githubusercontent.com/user/repo/branch/folder" segments[2] = "raw.githubusercontent.com" segments.extend([branch, folder]) urls.append('/'.join(segments)) elif hostname == "gitlab.com": git_mirror_path = os.path.join('git-mirror', folder) if common.get_dir_size(git_mirror_path) <= common.GITLAB_COM_PAGES_MAX_SIZE: # Gitlab-like Pages segments "https://user.gitlab.io/repo/folder" gitlab_pages = ["https:", "", user + ".gitlab.io", repo, folder] urls.append('/'.join(gitlab_pages)) else: logging.warning( _( 'Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!' ) % (common.GITLAB_COM_PAGES_MAX_SIZE / 1000000000) ) # GitLab Raw "https://gitlab.com/user/repo/-/raw/branch/folder" gitlab_raw = segments + ['-', 'raw', branch, folder] urls.append('/'.join(gitlab_raw)) # GitLab Artifacts "https://user.gitlab.io/-/repo/-/jobs/job_id/artifacts/public/folder" job_id = os.getenv('CI_JOB_ID') try: int(job_id) gitlab_artifacts = [ "https:", "", user + ".gitlab.io", '-', repo, '-', 'jobs', job_id, 'artifacts', 'public', folder, ] urls.append('/'.join(gitlab_artifacts)) except (TypeError, ValueError): pass # no Job ID to use, ignore return urls def download_repo_index(url_str, etag=None, verify_fingerprint=True, timeout=600): """Download and verifies index v1 file, then returns its data. Use the versioned functions to be sure you are getting the expected data format. """ return download_repo_index_v1(url_str, etag, verify_fingerprint, timeout) def download_repo_index_v1(url_str, etag=None, verify_fingerprint=True, timeout=600): """Download and verifies index v1 file, then returns its data. Downloads the repository index from the given :param url_str and verifies the repository's fingerprint if :param verify_fingerprint is not False. Raises ------ VerificationException() if the repository could not be verified Returns ------- A tuple consisting of: - The index in JSON v1 format or None if the index did not change - The new eTag as returned by the HTTP request """ url = urllib.parse.urlsplit(url_str) fingerprint = None if verify_fingerprint: query = urllib.parse.parse_qs(url.query) if 'fingerprint' not in query: raise VerificationException(_("No fingerprint in URL.")) fingerprint = query['fingerprint'][0] if url.path.endswith('/index-v1.jar'): path = url.path[:-13].rstrip('/') else: path = url.path.rstrip('/') url = urllib.parse.SplitResult(url.scheme, url.netloc, path + '/index-v1.jar', '', '') download, new_etag = net.http_get(url.geturl(), etag, timeout) if download is None: return None, new_etag with tempfile.NamedTemporaryFile() as fp: fp.write(download) fp.flush() index, public_key, public_key_fingerprint = get_index_from_jar( fp.name, fingerprint, allow_deprecated=True ) index["repo"]["pubkey"] = hexlify(public_key).decode() index["repo"]["fingerprint"] = public_key_fingerprint index["apps"] = [metadata.App(app) for app in index["apps"]] return index, new_etag def download_repo_index_v2(url_str, etag=None, verify_fingerprint=True, timeout=600): """Download and verifies index v2 file, then returns its data. Downloads the repository index from the given :param url_str and verifies the repository's fingerprint if :param verify_fingerprint is not False. In order to verify the data, the fingerprint must be provided as part of the URL. Raises ------ VerificationException() if the repository could not be verified Returns ------- A tuple consisting of: - The index in JSON v2 format or None if the index did not change - The new eTag as returned by the HTTP request """ url = urllib.parse.urlsplit(url_str) fingerprint = None if verify_fingerprint: query = urllib.parse.parse_qs(url.query) if 'fingerprint' not in query: raise VerificationException(_("No fingerprint in URL.")) fingerprint = query['fingerprint'][0] if url.path.endswith('/entry.jar') or url.path.endswith('/index-v2.json'): path = url.path.rsplit('/', 1)[0] else: path = url.path.rstrip('/') url = urllib.parse.SplitResult(url.scheme, url.netloc, path + '/entry.jar', '', '') download, new_etag = net.http_get(url.geturl(), etag, timeout) if download is None: return None, new_etag # jarsigner is used to verify the JAR, it requires a file for input with tempfile.TemporaryDirectory() as dirname: with (Path(dirname) / 'entry.jar').open('wb') as fp: fp.write(download) fp.flush() entry, public_key, fingerprint = get_index_from_jar(fp.name, fingerprint) name = entry['index']['name'] sha256 = entry['index']['sha256'] url = urllib.parse.SplitResult(url.scheme, url.netloc, path + name, '', '') index, _ignored = net.http_get(url.geturl(), None, timeout) if sha256 != hashlib.sha256(index).hexdigest(): raise VerificationException( _("SHA-256 of {url} does not match entry!").format(url=url) ) return json.loads(index), new_etag def get_index_from_jar(jarfile, fingerprint=None, allow_deprecated=False): """Return the data, public key and fingerprint from an index JAR with one JSON file. The F-Droid index files always contain a single data file and a JAR Signature. Since index-v1, the data file is always JSON. That single data file is named the same as the JAR file. Parameters ---------- fingerprint is the SHA-256 fingerprint of signing key. Only hex digits count, all other chars will can be discarded. Raises ------ VerificationException() if the repository could not be verified """ logging.debug(_('Verifying index signature:')) if allow_deprecated: common.verify_deprecated_jar_signature(jarfile) else: common.verify_jar_signature(jarfile) with zipfile.ZipFile(jarfile) as jar: public_key, public_key_fingerprint = get_public_key_from_jar(jar) if fingerprint is not None: fingerprint = re.sub(r'[^0-9A-F]', r'', fingerprint.upper()) if fingerprint != public_key_fingerprint: raise VerificationException( _("The repository's fingerprint does not match.") ) for f in jar.namelist(): if not f.startswith('META-INF/'): jsonfile = f break data = json.loads(jar.read(jsonfile)) return data, public_key, public_key_fingerprint def get_public_key_from_jar(jar): """Get the public key and its fingerprint from a JAR file. Raises ------ VerificationException() if the JAR was not signed exactly once Parameters ---------- jar a zipfile.ZipFile object Returns ------- the public key from the jar and its fingerprint """ # extract certificate from jar certs = [n for n in jar.namelist() if common.SIGNATURE_BLOCK_FILE_REGEX.match(n)] if len(certs) < 1: raise VerificationException(_("Found no signing certificates for repository.")) if len(certs) > 1: raise VerificationException(_("Found multiple signing certificates for repository.")) # extract public key from certificate public_key = common.get_certificate(jar.read(certs[0])) public_key_fingerprint = common.get_cert_fingerprint(public_key).replace(' ', '') return public_key, public_key_fingerprint def make_altstore(apps, apks, config, repodir, pretty=False): """Assemble altstore-index.json for iOS (.ipa) apps. builds index files based on: https://faq.altstore.io/distribute-your-apps/make-a-source https://faq.altstore.io/distribute-your-apps/updating-apps """ if not any(Path(repodir).glob('*.ipa')): # no IPA files present in repo, nothing to do here, exiting early return indent = 2 if pretty else None # for now alt-store support is english only for lang in ['en']: # prepare minimal altstore index idx = { 'name': config['repo_name'], "apps": [], "news": [], } # add optional values if available # idx["subtitle"] F-Droid doesn't have a corresponding value if config.get("repo_description"): idx['description'] = config['repo_description'] if (Path(repodir) / 'icons' / config['repo_icon']).exists(): idx['iconURL'] = f"{config['repo_url']}/icons/{config['repo_icon']}" # idx["headerURL"] F-Droid doesn't have a corresponding value # idx["website"] F-Droid doesn't have a corresponding value # idx["patreonURL"] F-Droid doesn't have a corresponding value # idx["tintColor"] F-Droid doesn't have a corresponding value # idx["featuredApps"] = [] maybe mappable to F-Droids what's new? # assemble "apps" for packageName, app in apps.items(): app_name = app.get("Name") or app.get("AutoName") icon_url = "{}{}".format( config['repo_url'], app.get('iconv2', {}).get(DEFAULT_LOCALE, {}).get('name', ''), ) screenshot_urls = [ "{}{}".format(config["repo_url"], s["name"]) for s in app.get("screenshots", {}) .get("phone", {}) .get(DEFAULT_LOCALE, {}) ] a = { "name": app_name, 'bundleIdentifier': packageName, 'developerName': app.get("AuthorName") or f"{app_name} team", 'iconURL': icon_url, "localizedDescription": "", 'appPermissions': { "entitlements": set(), "privacy": {}, }, 'versions': [], } if app.get('summary'): a['subtitle'] = app['summary'] # a["tintColor"] F-Droid doesn't have a corresponding value # a["category"] F-Droid doesn't have a corresponding value # a['patreon'] F-Droid doesn't have a corresponding value a["screenshots"] = screenshot_urls # populate 'versions' for apk in apks: last4 = apk.get('apkName', '').lower()[-4:] if apk['packageName'] == packageName and last4 == '.ipa': v = { "version": apk["versionName"], "date": apk["added"].isoformat(), "downloadURL": f"{config['repo_url']}/{apk['apkName']}", "size": apk['size'], } # v['localizedDescription'] maybe what's new text? v["minOSVersion"] = apk["ipa_MinimumOSVersion"] v["maxOSVersion"] = apk["ipa_DTPlatformVersion"] # writing this spot here has the effect that always the # permissions of the latest processed permissions list used a['appPermissions']['privacy'] = apk['ipa_permissions'] a['appPermissions']['entitlements'] = list(apk['ipa_entitlements']) a['versions'].append(v) if len(a['versions']) > 0: idx['apps'].append(a) with open(Path(repodir) / 'altstore-index.json', "w", encoding="utf-8") as f: json.dump(idx, f, indent=indent) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/init.py0000644000175000017500000002667314620351225017033 0ustar00hanshans#!/usr/bin/env python3 # # init.py - part of the FDroid server tools # Copyright (C) 2010-2013, Ciaran Gultnieks, ciaran@ciarang.com # Copyright (C) 2013-2014 Daniel Martí # Copyright (C) 2013 Hans-Christoph Steiner # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import glob import os import re import shutil import socket import sys from argparse import ArgumentParser import logging from . import _ from . import common from .exception import FDroidException config = {} def disable_in_config(key, value): """Write a key/value to the local config.yml, then comment it out.""" import yaml with open('config.yml') as f: data = f.read() pattern = r'\n[\s#]*' + key + r':.*' repl = '\n#' + yaml.dump({key: value}, default_flow_style=False) data = re.sub(pattern, repl, data) with open('config.yml', 'w') as f: f.writelines(data) def main(): global config # Parse command line... parser = ArgumentParser() common.setup_global_opts(parser) parser.add_argument( "-d", "--distinguished-name", default=None, help=_("X.509 'Distinguished Name' used when generating keys"), ) parser.add_argument( "--keystore", default=None, help=_("Path to the keystore for the repo signing key"), ) parser.add_argument( "--repo-keyalias", default=None, help=_("Alias of the repo signing key in the keystore"), ) parser.add_argument( "--android-home", default=None, help=_("Path to the Android SDK (sometimes set in ANDROID_HOME)"), ) parser.add_argument( "--no-prompt", action="store_true", default=False, help=_("Do not prompt for Android SDK path, just fail"), ) options = common.parse_args(parser) common.set_console_logging(options.verbose) fdroiddir = os.getcwd() test_config = dict() examplesdir = common.get_examples_dir() common.fill_config_defaults(test_config) # track down where the Android SDK is, the default is to use the path set # in ANDROID_HOME if that exists, otherwise None if options.android_home is not None: test_config['sdk_path'] = options.android_home elif not common.test_sdk_exists(test_config): # if neither --android-home nor the default sdk_path # exist, prompt the user using platform-specific default # and if the user leaves it blank, ignore and move on. default_sdk_path = '' if sys.platform in ('win32', 'cygwin'): p = os.path.join( os.getenv('USERPROFILE'), 'AppData', 'Local', 'Android', 'android-sdk' ) elif sys.platform == 'darwin': # on OSX, Homebrew is common and has an easy path to detect p = '/usr/local/opt/android-sdk' elif os.path.isdir('/usr/lib/android-sdk'): # if the Debian packages are installed, suggest them p = '/usr/lib/android-sdk' else: p = '/opt/android-sdk' if os.path.exists(p): default_sdk_path = p test_config['sdk_path'] = default_sdk_path if not common.test_sdk_exists(test_config): del test_config['sdk_path'] while not options.no_prompt: try: s = input( _('Enter the path to the Android SDK (%s) here:\n> ') % default_sdk_path ) except KeyboardInterrupt: print('') sys.exit(1) if re.match(r'^\s*$', s) is not None: test_config['sdk_path'] = default_sdk_path else: test_config['sdk_path'] = s if common.test_sdk_exists(test_config): break default_sdk_path = '' if test_config.get('sdk_path') and not common.test_sdk_exists(test_config): raise FDroidException( _("Android SDK not found at {path}!").format(path=test_config['sdk_path']) ) if not os.path.exists('config.yml') and not os.path.exists('config.py'): # 'metadata' and 'tmp' are created in fdroid if not os.path.exists('repo'): os.mkdir('repo') example_config_yml = os.path.join(examplesdir, 'config.yml') if os.path.exists(example_config_yml): shutil.copyfile(example_config_yml, 'config.yml') else: from pkg_resources import get_distribution versionstr = get_distribution('fdroidserver').version if not versionstr: versionstr = 'master' with open('config.yml', 'w') as fp: fp.write('# see https://gitlab.com/fdroid/fdroidserver/blob/') fp.write(versionstr) fp.write('/examples/config.yml\n') os.chmod('config.yml', 0o0600) # If android_home is None, test_config['sdk_path'] will be used and # "$ANDROID_HOME" may be used if the env var is set up correctly. # If android_home is not None, the path given from the command line # will be directly written in the config. if 'sdk_path' in test_config: common.write_to_config(test_config, 'sdk_path', options.android_home) else: logging.warning( 'Looks like this is already an F-Droid repo, cowardly refusing to overwrite it...' ) logging.info('Try running `fdroid init` in an empty directory.') raise FDroidException('Repository already exists.') # now that we have a local config.yml, read configuration... config = common.read_config() # the NDK is optional and there may be multiple versions of it, so it's # left for the user to configure # find or generate the keystore for the repo signing key. First try the # path written in the default config.yml. Then check if the user has # specified a path from the command line, which will trump all others. # Otherwise, create ~/.local/share/fdroidserver and stick it in there. If # keystore is set to NONE, that means that Java will look for keys in a # Hardware Security Module aka Smartcard. keystore = config['keystore'] if options.keystore: keystore = os.path.abspath(options.keystore) if options.keystore == 'NONE': keystore = options.keystore else: keystore = os.path.abspath(options.keystore) if not os.path.exists(keystore): logging.info( '"' + keystore + '" does not exist, creating a new keystore there.' ) common.write_to_config(test_config, 'keystore', keystore) repo_keyalias = None keydname = None if options.repo_keyalias: repo_keyalias = options.repo_keyalias common.write_to_config(test_config, 'repo_keyalias', repo_keyalias) if options.distinguished_name: keydname = options.distinguished_name common.write_to_config(test_config, 'keydname', keydname) if keystore == 'NONE': # we're using a smartcard common.write_to_config( test_config, 'repo_keyalias', '1' ) # seems to be the default disable_in_config('keypass', 'never used with smartcard') common.write_to_config( test_config, 'smartcardoptions', ( '-storetype PKCS11 ' + '-providerClass sun.security.pkcs11.SunPKCS11 ' + '-providerArg opensc-fdroid.cfg' ), ) # find opensc-pkcs11.so if not os.path.exists('opensc-fdroid.cfg'): if os.path.exists('/usr/lib/opensc-pkcs11.so'): opensc_so = '/usr/lib/opensc-pkcs11.so' elif os.path.exists('/usr/lib64/opensc-pkcs11.so'): opensc_so = '/usr/lib64/opensc-pkcs11.so' else: files = glob.glob( '/usr/lib/' + os.uname()[4] + '-*-gnu/opensc-pkcs11.so' ) if len(files) > 0: opensc_so = files[0] else: opensc_so = '/usr/lib/opensc-pkcs11.so' logging.warning( 'No OpenSC PKCS#11 module found, ' + 'install OpenSC then edit "opensc-fdroid.cfg"!' ) with open('opensc-fdroid.cfg', 'w') as f: f.write('name = OpenSC\nlibrary = ') f.write(opensc_so) f.write('\n') logging.info( "Repo setup using a smartcard HSM. Please edit keystorepass and repo_keyalias in config.yml." ) logging.info( "If you want to generate a new repo signing key in the HSM you can do that with 'fdroid update " "--create-key'." ) elif os.path.exists(keystore): to_set = ['keystorepass', 'keypass', 'repo_keyalias', 'keydname'] if repo_keyalias: to_set.remove('repo_keyalias') if keydname: to_set.remove('keydname') logging.warning( '\n' + _('Using existing keystore "{path}"').format(path=keystore) + '\n' + _('Now set these in config.yml:') + ' ' + ', '.join(to_set) + '\n' ) else: password = common.genpassword() c = dict(test_config) c['keystorepass'] = password c['keypass'] = password c['repo_keyalias'] = repo_keyalias or socket.getfqdn() c['keydname'] = 'CN=' + c['repo_keyalias'] + ', OU=F-Droid' common.write_to_config(test_config, 'keystorepass', password) common.write_to_config(test_config, 'keypass', password) common.write_to_config(test_config, 'repo_keyalias', c['repo_keyalias']) common.write_to_config(test_config, 'keydname', c['keydname']) common.genkeystore(c) msg = '\n' msg += _('Built repo based in "%s" with this config:') % fdroiddir msg += '\n\n Android SDK:\t\t\t' + config['sdk_path'] msg += '\n ' + _('Keystore for signing key:\t') + keystore if repo_keyalias is not None: msg += '\n Alias for key in store:\t' + repo_keyalias msg += '\n\n' msg += ( _( """To complete the setup, add your APKs to "%s" then run "fdroid update -c; fdroid update". You might also want to edit "config.yml" to set the URL, repo name, and more. You should also set up a signing key (a temporary one might have been automatically generated). For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo and https://f-droid.org/docs/Signing_Process""" ) % os.path.join(fdroiddir, 'repo') ) if not options.quiet: # normally, INFO is only shown with --verbose, but show this unless --quiet logger = logging.getLogger() logger.setLevel(logging.INFO) logger.info(msg) logging.shutdown() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/install.py0000644000175000017500000001116614620351225017525 0ustar00hanshans#!/usr/bin/env python3 # # install.py - part of the FDroid server tools # Copyright (C) 2013, Ciaran Gultnieks, ciaran@ciarang.com # Copyright (C) 2013-2014 Daniel Martí # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import sys import os import glob from argparse import ArgumentParser import logging from . import _ from . import common from .common import SdkToolsPopen from .exception import FDroidException config = None def devices(): p = SdkToolsPopen(['adb', "devices"]) if p.returncode != 0: raise FDroidException("An error occured when finding devices: %s" % p.output) lines = [line for line in p.output.splitlines() if not line.startswith('* ')] if len(lines) < 3: return [] lines = lines[1:-1] return [line.split()[0] for line in lines] def main(): global config # Parse command line... parser = ArgumentParser( usage="%(prog)s [options] [APPID[:VERCODE] [APPID[:VERCODE] ...]]" ) common.setup_global_opts(parser) parser.add_argument( "appid", nargs='*', help=_("application ID with optional versionCode in the form APPID[:VERCODE]"), ) parser.add_argument( "-a", "--all", action="store_true", default=False, help=_("Install all signed applications available"), ) options = common.parse_args(parser) common.set_console_logging(options.verbose) if not options.appid and not options.all: parser.error( _("option %s: If you really want to install all the signed apps, use --all") % "all" ) config = common.read_config() output_dir = 'repo' if not os.path.isdir(output_dir): logging.info(_("No signed output directory - nothing to do")) sys.exit(0) if options.appid: vercodes = common.read_pkg_args(options.appid, True) common.get_metadata_files(vercodes) # only check appids apks = {appid: None for appid in vercodes} # Get the signed APK with the highest vercode for apkfile in sorted(glob.glob(os.path.join(output_dir, '*.apk'))): try: appid, vercode = common.publishednameinfo(apkfile) except FDroidException: continue if appid not in apks: continue if vercodes[appid] and vercode not in vercodes[appid]: continue apks[appid] = apkfile for appid, apk in apks.items(): if not apk: raise FDroidException(_("No signed APK available for %s") % appid) else: apks = { common.publishednameinfo(apkfile)[0]: apkfile for apkfile in sorted(glob.glob(os.path.join(output_dir, '*.apk'))) } for appid, apk in apks.items(): # Get device list each time to avoid device not found errors devs = devices() if not devs: raise FDroidException(_("No attached devices found")) logging.info(_("Installing %s...") % apk) for dev in devs: logging.info( _("Installing '{apkfilename}' on {dev}...").format( apkfilename=apk, dev=dev ) ) p = SdkToolsPopen(['adb', "-s", dev, "install", apk]) fail = "" for line in p.output.splitlines(): if line.startswith("Failure"): fail = line[9:-1] if not fail: continue if fail == "INSTALL_FAILED_ALREADY_EXISTS": logging.warning( _('"{apkfilename}" is already installed on {dev}.').format( apkfilename=apk, dev=dev ) ) else: raise FDroidException( _("Failed to install '{apkfilename}' on {dev}: {error}").format( apkfilename=apk, dev=dev, error=fail ) ) logging.info('\n' + _('Finished')) if __name__ == "__main__": main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/lint.py0000644000175000017500000010314714620351225017026 0ustar00hanshans#!/usr/bin/env python3 # # lint.py - part of the FDroid server tool # Copyright (C) 2013-2014 Daniel Martí # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 th # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public Licen # along with this program. If not, see . from argparse import ArgumentParser import difflib import re import sys import platform import ruamel.yaml import urllib.parse from pathlib import Path from . import _ from . import common from . import metadata from . import rewritemeta config = None def enforce_https(domain): return ( re.compile( r'^http://([^/]*\.)?' + re.escape(domain) + r'(/.*)?', re.IGNORECASE ), domain + " URLs should always use https://", ) https_enforcings = [ enforce_https('github.com'), enforce_https('gitlab.com'), enforce_https('bitbucket.org'), enforce_https('apache.org'), enforce_https('google.com'), enforce_https('git.code.sf.net'), enforce_https('svn.code.sf.net'), enforce_https('anongit.kde.org'), enforce_https('savannah.nongnu.org'), enforce_https('git.savannah.nongnu.org'), enforce_https('download.savannah.nongnu.org'), enforce_https('savannah.gnu.org'), enforce_https('git.savannah.gnu.org'), enforce_https('download.savannah.gnu.org'), enforce_https('github.io'), enforce_https('gitlab.io'), enforce_https('githubusercontent.com'), ] def forbid_shortener(domain): return ( re.compile(r'https?://[^/]*' + re.escape(domain) + r'/.*'), _("URL shorteners should not be used"), ) http_url_shorteners = [ forbid_shortener('1url.com'), forbid_shortener('adf.ly'), forbid_shortener('bc.vc'), forbid_shortener('bit.do'), forbid_shortener('bit.ly'), forbid_shortener('bitly.com'), forbid_shortener('budurl.com'), forbid_shortener('buzurl.com'), forbid_shortener('cli.gs'), forbid_shortener('cur.lv'), forbid_shortener('cutt.us'), forbid_shortener('db.tt'), forbid_shortener('filoops.info'), forbid_shortener('goo.gl'), forbid_shortener('is.gd'), forbid_shortener('ity.im'), forbid_shortener('j.mp'), forbid_shortener('l.gg'), forbid_shortener('lnkd.in'), forbid_shortener('moourl.com'), forbid_shortener('ow.ly'), forbid_shortener('para.pt'), forbid_shortener('po.st'), forbid_shortener('q.gs'), forbid_shortener('qr.ae'), forbid_shortener('qr.net'), forbid_shortener('rdlnk.com'), forbid_shortener('scrnch.me'), forbid_shortener('short.nr'), forbid_shortener('sn.im'), forbid_shortener('snipurl.com'), forbid_shortener('su.pr'), forbid_shortener('t.co'), forbid_shortener('tiny.cc'), forbid_shortener('tinyarrows.com'), forbid_shortener('tinyurl.com'), forbid_shortener('tr.im'), forbid_shortener('tweez.me'), forbid_shortener('twitthis.com'), forbid_shortener('twurl.nl'), forbid_shortener('tyn.ee'), forbid_shortener('u.bb'), forbid_shortener('u.to'), forbid_shortener('ur1.ca'), forbid_shortener('urlof.site'), forbid_shortener('v.gd'), forbid_shortener('vzturl.com'), forbid_shortener('x.co'), forbid_shortener('xrl.us'), forbid_shortener('yourls.org'), forbid_shortener('zip.net'), forbid_shortener('✩.ws'), forbid_shortener('➡.ws'), ] http_checks = ( https_enforcings + http_url_shorteners + [ ( re.compile(r'^(?!https?://)[^/]+'), _("URL must start with https:// or http://"), ), ( re.compile(r'^https://(github|gitlab)\.com(/[^/]+){2,3}\.git'), _("Appending .git is not necessary"), ), ( re.compile( r'^https://[^/]*(github|gitlab|bitbucket|rawgit|githubusercontent)\.[a-zA-Z]+/([^/]+/){2,3}(master|main)/' ), _( "Use /HEAD instead of /master or /main to point at a file in the default branch" ), ), ] ) regex_checks = { 'WebSite': http_checks, 'SourceCode': http_checks, 'Repo': https_enforcings, 'UpdateCheckMode': https_enforcings, 'IssueTracker': http_checks + [ (re.compile(r'.*github\.com/[^/]+/[^/]+/*$'), _("/issues is missing")), (re.compile(r'.*gitlab\.com/[^/]+/[^/]+/*$'), _("/issues is missing")), ], 'Donate': http_checks + [ ( re.compile(r'.*flattr\.com'), _("Flattr donation methods belong in the FlattrID: field"), ), ( re.compile(r'.*liberapay\.com'), _("Liberapay donation methods belong in the Liberapay: field"), ), ( re.compile(r'.*opencollective\.com'), _("OpenCollective donation methods belong in the OpenCollective: field"), ), ], 'Changelog': http_checks, 'Author Name': [ (re.compile(r'^\s'), _("Unnecessary leading space")), (re.compile(r'.*\s$'), _("Unnecessary trailing space")), ], 'Summary': [ ( re.compile(r'.*\b(free software|open source)\b.*', re.IGNORECASE), _("No need to specify that the app is Free Software"), ), ( re.compile( r'.*((your|for).*android|android.*(app|device|client|port|version))', re.IGNORECASE, ), _("No need to specify that the app is for Android"), ), (re.compile(r'.*[a-z0-9][.!?]( |$)'), _("Punctuation should be avoided")), (re.compile(r'^\s'), _("Unnecessary leading space")), (re.compile(r'.*\s$'), _("Unnecessary trailing space")), ], 'Description': https_enforcings + http_url_shorteners + [ (re.compile(r'\s*[*#][^ .]'), _("Invalid bulleted list")), ( re.compile(r'https://f-droid.org/[a-z][a-z](_[A-Za-z]{2,4})?/'), _("Locale included in f-droid.org URL"), ), (re.compile(r'^\s'), _("Unnecessary leading space")), (re.compile(r'.*\s$'), _("Unnecessary trailing space")), ( re.compile( r'.*<(applet|base|body|button|embed|form|head|html|iframe|img|input|link|object|picture|script|source|style|svg|video).*', re.IGNORECASE, ), _("Forbidden HTML tags"), ), ( re.compile(r""".*\s+src=["']javascript:.*"""), _("Javascript in HTML src attributes"), ), ], } locale_pattern = re.compile(r"[a-z]{2,3}(-([A-Z][a-zA-Z]+|\d+|[a-z]+))*") versioncode_check_pattern = re.compile(r"(\\d|\[(0-9|\\d)_?(a-fA-F)?])[+]") ANTIFEATURES_KEYS = None ANTIFEATURES_PATTERN = None CATEGORIES_KEYS = list() def load_antiFeatures_config(): """Lazy loading, since it might read a lot of files.""" global ANTIFEATURES_KEYS, ANTIFEATURES_PATTERN k = common.ANTIFEATURES_CONFIG_NAME if not ANTIFEATURES_KEYS or k not in common.config: common.config[k] = common.load_localized_config(k, 'repo') ANTIFEATURES_KEYS = sorted(common.config[k].keys()) ANTIFEATURES_PATTERN = ','.join(ANTIFEATURES_KEYS) def load_categories_config(): """Lazy loading, since it might read a lot of files.""" global CATEGORIES_KEYS k = common.CATEGORIES_CONFIG_NAME if not CATEGORIES_KEYS: if config and k in config: CATEGORIES_KEYS = config[k] else: config[k] = common.load_localized_config(k, 'repo') CATEGORIES_KEYS = list(config[k].keys()) def check_regexes(app): for f, checks in regex_checks.items(): for m, r in checks: v = app.get(f) t = metadata.fieldtype(f) if t == metadata.TYPE_MULTILINE: for line in v.splitlines(): if m.match(line): yield "%s at line '%s': %s" % (f, line, r) else: if v is None: continue if m.match(v): yield "%s '%s': %s" % (f, v, r) def get_lastbuild(builds): lowest_vercode = -1 lastbuild = None for build in builds: if not build.disable: vercode = build.versionCode if lowest_vercode == -1 or vercode < lowest_vercode: lowest_vercode = vercode if not lastbuild or build.versionCode > lastbuild.versionCode: lastbuild = build return lastbuild def check_update_check_data_url(app): # noqa: D403 """UpdateCheckData must have a valid HTTPS URL to protect checkupdates runs.""" if app.UpdateCheckData and app.UpdateCheckMode == 'HTTP': urlcode, codeex, urlver, verex = app.UpdateCheckData.split('|') for url in (urlcode, urlver): if url != '.': parsed = urllib.parse.urlparse(url) if not parsed.scheme or not parsed.netloc: yield _('UpdateCheckData not a valid URL: {url}').format(url=url) if parsed.scheme != 'https': yield _('UpdateCheckData must use HTTPS URL: {url}').format(url=url) def check_update_check_data_int(app): # noqa: D403 """UpdateCheckData regex must match integers.""" if app.UpdateCheckData: urlcode, codeex, urlver, verex = app.UpdateCheckData.split('|') # codeex can be empty as well if codeex and not versioncode_check_pattern.search(codeex): yield _( f'UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}' ) def check_vercode_operation(app): if not app.VercodeOperation: return invalid_ops = [] for op in app.VercodeOperation: if not common.VERCODE_OPERATION_RE.match(op): invalid_ops += op if invalid_ops: yield _('Invalid VercodeOperation: {invalid_ops}').format( invalid_ops=invalid_ops ) def check_ucm_tags(app): lastbuild = get_lastbuild(app.get('Builds', [])) if ( lastbuild is not None and lastbuild.commit and app.UpdateCheckMode == 'RepoManifest' and not lastbuild.commit.startswith('unknown') and lastbuild.versionCode == app.CurrentVersionCode and not lastbuild.forcevercode and any(s in lastbuild.commit for s in '.,_-/') ): yield _( "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" ).format(commit=lastbuild.commit, ucm=app.UpdateCheckMode) def check_char_limits(app): limits = config['char_limits'] if len(app.Summary) > limits['summary']: yield _("Summary of length {length} is over the {limit} char limit").format( length=len(app.Summary), limit=limits['summary'] ) if len(app.Description) > limits['description']: yield _("Description of length {length} is over the {limit} char limit").format( length=len(app.Description), limit=limits['description'] ) def check_old_links(app): usual_sites = [ 'github.com', 'gitlab.com', 'bitbucket.org', ] old_sites = [ 'gitorious.org', 'code.google.com', ] if any(s in app.Repo for s in usual_sites): for f in ['WebSite', 'SourceCode', 'IssueTracker', 'Changelog']: v = app.get(f) if any(s in v for s in old_sites): yield _("App is in '{repo}' but has a link to {url}").format( repo=app.Repo, url=v ) def check_useless_fields(app): if app.UpdateCheckName == app.id: yield _("UpdateCheckName is set to the known application ID, it can be removed") filling_ucms = re.compile(r'^(Tags.*|RepoManifest.*)') def check_checkupdates_ran(app): if filling_ucms.match(app.UpdateCheckMode): if not app.AutoName and not app.CurrentVersion and app.CurrentVersionCode == 0: yield _( "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." ) def check_empty_fields(app): if not app.Categories: yield _("Categories are not set") def check_categories(app): """App uses 'Categories' key and parsed config uses 'categories' key.""" for categ in app.Categories: if categ not in CATEGORIES_KEYS: yield _("Categories '%s' is not valid" % categ) def check_duplicates(app): links_seen = set() for f in ['Source Code', 'Web Site', 'Issue Tracker', 'Changelog']: v = app.get(f) if not v: continue v = v.lower() if v in links_seen: yield _("Duplicate link in '{field}': {url}").format(field=f, url=v) else: links_seen.add(v) name = common.get_app_display_name(app) if app.Summary and name: if app.Summary.lower() == name.lower(): yield _("Summary '%s' is just the app's name") % app.Summary if app.Summary and app.Description and len(app.Description) == 1: if app.Summary.lower() == app.Description[0].lower(): yield _("Description '%s' is just the app's summary") % app.Summary seenlines = set() for line in app.Description.splitlines(): if len(line) < 1: continue if line in seenlines: yield _("Description has a duplicate line") seenlines.add(line) desc_url = re.compile(r'(^|[^[])\[([^ ]+)( |\]|$)') def check_mediawiki_links(app): wholedesc = ' '.join(app.Description) for um in desc_url.finditer(wholedesc): url = um.group(1) for m, r in http_checks: if m.match(url): yield _("URL {url} in Description: {error}").format(url=url, error=r) def check_builds(app): supported_flags = set(metadata.build_flags) # needed for YAML and JSON for build in app.get('Builds', []): if build.disable: if build.disable.startswith('Generated by import.py'): yield _( "Build generated by `fdroid import` - remove disable line once ready" ) continue for s in ['master', 'main', 'origin', 'HEAD', 'default', 'trunk']: if build.commit and build.commit.startswith(s): yield _( "Branch '{branch}' used as commit in build '{versionName}'" ).format(branch=s, versionName=build.versionName) for srclib in build.srclibs: if '@' in srclib: ref = srclib.split('@')[1].split('/')[0] if ref.startswith(s): yield _( "Branch '{branch}' used as commit in srclib '{srclib}'" ).format(branch=s, srclib=srclib) else: yield ( _('srclibs missing name and/or @') + ' (srclibs: ' + srclib + ')' ) for key in build.keys(): if key not in supported_flags: yield _('%s is not an accepted build field') % key def check_files_dir(app): dir_path = Path('metadata') / app.id if not dir_path.is_dir(): return files = set() for path in dir_path.iterdir(): name = path.name if not ( path.is_file() or name == 'signatures' or locale_pattern.fullmatch(name) ): yield _("Found non-file at %s") % path continue files.add(name) used = { 'signatures', } for build in app.get('Builds', []): for fname in build.patch: if fname not in files: yield _("Unknown file '{filename}' in build '{versionName}'").format( filename=fname, versionName=build.versionName ) else: used.add(fname) for name in files.difference(used): if locale_pattern.fullmatch(name): continue yield _("Unused file at %s") % (dir_path / name) def check_format(app): if common.options.format and not rewritemeta.proper_format(app): yield _("Run rewritemeta to fix formatting") def check_license_tag(app): """Ensure all license tags contain only valid/approved values.""" if config['lint_licenses'] is None: return if app.License not in config['lint_licenses']: if config['lint_licenses'] == APPROVED_LICENSES: yield _( 'Unexpected license tag "{}"! Only use FSF or OSI ' 'approved tags from https://spdx.org/license-list' ).format(app.License) else: yield _( 'Unexpected license tag "{}"! Only use license tags ' 'configured in your config file' ).format(app.License) def check_extlib_dir(apps): dir_path = Path('build/extlib') extlib_files = set() for path in dir_path.glob('**/*'): if path.is_file(): extlib_files.add(path.relative_to(dir_path)) used = set() for app in apps: for build in app.get('Builds', []): for path in build.extlibs: path = Path(path) if path not in extlib_files: yield _( "{appid}: Unknown extlib {path} in build '{versionName}'" ).format(appid=app.id, path=path, versionName=build.versionName) else: used.add(path) for path in extlib_files.difference(used): if path.name not in [ '.gitignore', 'source.txt', 'origin.txt', 'md5.txt', 'LICENSE', 'LICENSE.txt', 'COPYING', 'COPYING.txt', 'NOTICE', 'NOTICE.txt', ]: yield _("Unused extlib at %s") % (dir_path / path) def check_app_field_types(app): """Check the fields have valid data types.""" for field in app.keys(): v = app.get(field) t = metadata.fieldtype(field) if v is None: continue elif field == 'Builds': if not isinstance(v, list): yield ( _( "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" ).format( appid=app.id, field=field, type='list', fieldtype=v.__class__.__name__, ) ) elif t == metadata.TYPE_LIST and not isinstance(v, list): yield ( _( "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" ).format( appid=app.id, field=field, type='list', fieldtype=v.__class__.__name__, ) ) elif t == metadata.TYPE_STRING and not type(v) in (str, bool, dict): yield ( _( "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" ).format( appid=app.id, field=field, type='str', fieldtype=v.__class__.__name__, ) ) elif t == metadata.TYPE_STRINGMAP and not isinstance(v, dict): yield ( _( "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" ).format( appid=app.id, field=field, type='dict', fieldtype=v.__class__.__name__, ) ) elif t == metadata.TYPE_INT and not isinstance(v, int): yield ( _( "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" ).format( appid=app.id, field=field, type='int', fieldtype=v.__class__.__name__, ) ) def check_antiFeatures(app): """Check the Anti-Features keys match those declared in the config.""" pattern = ANTIFEATURES_PATTERN msg = _("'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}") field = 'AntiFeatures' # App entries use capitalized CamelCase for value in app.get(field, []): if value not in ANTIFEATURES_KEYS: yield msg.format(value=value, field=field, appid=app.id, pattern=pattern) field = 'antifeatures' # Build entries use all lowercase for build in app.get('Builds', []): build_antiFeatures = build.get(field, []) for value in build_antiFeatures: if value not in ANTIFEATURES_KEYS: yield msg.format( value=value, field=field, appid=app.id, pattern=pattern ) def check_for_unsupported_metadata_files(basedir=""): """Check whether any non-metadata files are in metadata/.""" basedir = Path(basedir) global config if not (basedir / 'metadata').exists(): return False return_value = False for f in (basedir / 'metadata').iterdir(): if f.is_dir(): if not Path(str(f) + '.yml').exists(): print(_('"%s/" has no matching metadata file!') % f) return_value = True elif f.suffix == '.yml': packageName = f.stem if not common.is_valid_package_name(packageName): print( '"' + packageName + '" is an invalid package name!\n' + 'https://developer.android.com/studio/build/application-id' ) return_value = True else: print( _( '"{path}" is not a supported file format (use: metadata/*.yml)' ).format(path=f.relative_to(basedir)) ) return_value = True return return_value def check_current_version_code(app): """Check that the CurrentVersionCode is currently available.""" if app.get('ArchivePolicy') == 0: return cv = app.get('CurrentVersionCode') if cv is not None and cv == 0: return builds = app.get('Builds') active_builds = 0 min_versionCode = None if builds: for build in builds: vc = build['versionCode'] if min_versionCode is None or min_versionCode > vc: min_versionCode = vc if not build.get('disable'): active_builds += 1 if cv == build['versionCode']: break if active_builds == 0: return # all builds are disabled if cv is not None and cv < min_versionCode: yield ( _( 'CurrentVersionCode {cv} is less than oldest build entry {versionCode}' ).format(cv=cv, versionCode=min_versionCode) ) def check_updates_expected(app): """Check if update checking makes sense.""" if (app.get('NoSourceSince') or app.get('ArchivePolicy') == 0) and not all( app.get(key, 'None') == 'None' for key in ('AutoUpdateMode', 'UpdateCheckMode') ): yield _( 'App has NoSourceSince or ArchivePolicy "0 versions" or 0 but AutoUpdateMode or UpdateCheckMode are not None' ) def check_updates_ucm_http_aum_pattern(app): # noqa: D403 """AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern.""" if app.UpdateCheckMode == "HTTP" and app.AutoUpdateMode == "Version": yield _("AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern.") def check_certificate_pinned_binaries(app): keys = app.get('AllowedAPKSigningKeys') known_keys = common.config.get('apk_signing_key_block_list', []) if keys: if known_keys: for key in keys: if key in known_keys: yield _('Known debug key is used in AllowedAPKSigningKeys: ') + key return if app.get('Binaries') is not None: yield _( 'App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate.' ) return builds = app.get('Builds') if builds is None: return for build in builds: if build.get('binary') is not None: yield _( 'App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate.' ) return def lint_config(arg): path = Path(arg) passed = True yamllintresult = common.run_yamllint(path) if yamllintresult: print(yamllintresult) passed = False with path.open() as fp: data = ruamel.yaml.YAML(typ='safe').load(fp) common.config_type_check(arg, data) if path.name == 'mirrors.yml': import pycountry valid_country_codes = [c.alpha_2 for c in pycountry.countries] for mirror in data: code = mirror.get('countryCode') if code and code not in valid_country_codes: passed = False msg = _( '{path}: "{code}" is not a valid ISO_3166-1 alpha-2 country code!' ).format(path=str(path), code=code) if code.upper() in valid_country_codes: m = [code.upper()] else: m = difflib.get_close_matches( code.upper(), valid_country_codes, 2, 0.5 ) if m: msg += ' ' msg += _('Did you mean {code}?').format(code=', '.join(sorted(m))) print(msg) return passed def main(): global config # Parse command line... parser = ArgumentParser() common.setup_global_opts(parser) parser.add_argument( "-f", "--format", action="store_true", default=False, help=_("Also warn about formatting issues, like rewritemeta -l"), ) parser.add_argument( '--force-yamllint', action="store_true", default=False, help=_( "When linting the entire repository yamllint is disabled by default. " "This option forces yamllint regardless." ), ) parser.add_argument( "appid", nargs='*', help=_("application ID of file to operate on") ) metadata.add_metadata_arguments(parser) options = common.parse_args(parser) metadata.warnings_action = options.W config = common.read_config() load_antiFeatures_config() load_categories_config() if options.force_yamllint: import yamllint # throw error if it is not installed yamllint # make pyflakes ignore this paths = list() for arg in options.appid: if ( arg == 'config.yml' or Path(arg).parent.name == 'config' or Path(arg).parent.parent.name == 'config' # localized ): paths.append(arg) failed = 0 if paths: for path in paths: options.appid.remove(path) if not lint_config(path): failed += 1 # an empty list of appids means check all apps, avoid that if files were given if not options.appid: sys.exit(failed) if not lint_metadata(options): failed += 1 if failed: sys.exit(failed) def lint_metadata(options): # Get all apps... allapps = metadata.read_metadata(options.appid) apps = common.read_app_args(options.appid, allapps, False) anywarns = check_for_unsupported_metadata_files() apps_check_funcs = [] if not options.appid: # otherwise it finds tons of unused extlibs apps_check_funcs.append(check_extlib_dir) for check_func in apps_check_funcs: for warn in check_func(apps.values()): anywarns = True print(warn) for appid, app in apps.items(): if app.Disabled: continue # only run yamllint when linting individual apps. if options.appid or options.force_yamllint: # run yamllint on app metadata ymlpath = Path('metadata') / (appid + '.yml') if ymlpath.is_file(): yamllintresult = common.run_yamllint(ymlpath) if yamllintresult: print(yamllintresult) # run yamllint on srclib metadata srclibs = set() for build in app.get('Builds', []): for srclib in build.srclibs: name, _ref, _number, _subdir = common.parse_srclib_spec(srclib) srclibs.add(name + '.yml') for srclib in srclibs: srclibpath = Path('srclibs') / srclib if srclibpath.is_file(): if platform.system() == 'Windows': # Handle symlink on Windows symlink = srclibpath.read_text() if symlink in srclibs: continue elif (srclibpath.parent / symlink).is_file(): srclibpath = srclibpath.parent / symlink yamllintresult = common.run_yamllint(srclibpath) if yamllintresult: print(yamllintresult) app_check_funcs = [ check_app_field_types, check_antiFeatures, check_regexes, check_update_check_data_url, check_update_check_data_int, check_vercode_operation, check_ucm_tags, check_char_limits, check_old_links, check_checkupdates_ran, check_useless_fields, check_empty_fields, check_categories, check_duplicates, check_mediawiki_links, check_builds, check_files_dir, check_format, check_license_tag, check_current_version_code, check_updates_expected, check_updates_ucm_http_aum_pattern, check_certificate_pinned_binaries, ] for check_func in app_check_funcs: for warn in check_func(app): anywarns = True print("%s: %s" % (appid, warn)) return not anywarns # A compiled, public domain list of official SPDX license tags. generated # using: `python3 -m spdx_license_list print --filter-fsf-or-osi` Only contains # licenes approved by either FSF to be free/libre software or OSI to be open # source APPROVED_LICENSES = [ '0BSD', 'AAL', 'AFL-1.1', 'AFL-1.2', 'AFL-2.0', 'AFL-2.1', 'AFL-3.0', 'AGPL-3.0-only', 'AGPL-3.0-or-later', 'APL-1.0', 'APSL-1.0', 'APSL-1.1', 'APSL-1.2', 'APSL-2.0', 'Apache-1.0', 'Apache-1.1', 'Apache-2.0', 'Artistic-1.0', 'Artistic-1.0-Perl', 'Artistic-1.0-cl8', 'Artistic-2.0', 'BSD-1-Clause', 'BSD-2-Clause', 'BSD-2-Clause-Patent', 'BSD-3-Clause', 'BSD-3-Clause-Clear', 'BSD-3-Clause-LBNL', 'BSD-4-Clause', 'BSL-1.0', 'BitTorrent-1.1', 'CAL-1.0', 'CAL-1.0-Combined-Work-Exception', 'CATOSL-1.1', 'CC-BY-4.0', 'CC-BY-SA-4.0', 'CC0-1.0', 'CDDL-1.0', 'CECILL-2.0', 'CECILL-2.1', 'CECILL-B', 'CECILL-C', 'CNRI-Python', 'CPAL-1.0', 'CPL-1.0', 'CUA-OPL-1.0', 'ClArtistic', 'Condor-1.1', 'ECL-1.0', 'ECL-2.0', 'EFL-1.0', 'EFL-2.0', 'EPL-1.0', 'EPL-2.0', 'EUDatagrid', 'EUPL-1.1', 'EUPL-1.2', 'Entessa', 'FSFAP', 'FTL', 'Fair', 'Frameworx-1.0', 'GFDL-1.1-only', 'GFDL-1.1-or-later', 'GFDL-1.2-only', 'GFDL-1.2-or-later', 'GFDL-1.3-only', 'GFDL-1.3-or-later', 'GPL-2.0-only', 'GPL-2.0-or-later', 'GPL-3.0-only', 'GPL-3.0-or-later', 'HPND', 'IJG', 'IPA', 'IPL-1.0', 'ISC', 'Imlib2', 'Intel', 'LGPL-2.0-only', 'LGPL-2.0-or-later', 'LGPL-2.1-only', 'LGPL-2.1-or-later', 'LGPL-3.0-only', 'LGPL-3.0-or-later', 'LPL-1.0', 'LPL-1.02', 'LPPL-1.2', 'LPPL-1.3a', 'LPPL-1.3c', 'LiLiQ-P-1.1', 'LiLiQ-R-1.1', 'LiLiQ-Rplus-1.1', 'MIT', 'MIT-0', 'MPL-1.0', 'MPL-1.1', 'MPL-2.0', 'MPL-2.0-no-copyleft-exception', 'MS-PL', 'MS-RL', 'MirOS', 'Motosoto', 'MulanPSL-2.0', 'Multics', 'NASA-1.3', 'NCSA', 'NGPL', 'NOSL', 'NPL-1.0', 'NPL-1.1', 'NPOSL-3.0', 'NTP', 'Naumen', 'Nokia', 'OCLC-2.0', 'ODbL-1.0', 'OFL-1.0', 'OFL-1.1', 'OFL-1.1-RFN', 'OFL-1.1-no-RFN', 'OGTSL', 'OLDAP-2.3', 'OLDAP-2.7', 'OLDAP-2.8', 'OSET-PL-2.1', 'OSL-1.0', 'OSL-1.1', 'OSL-2.0', 'OSL-2.1', 'OSL-3.0', 'OpenSSL', 'PHP-3.0', 'PHP-3.01', 'PostgreSQL', 'Python-2.0', 'QPL-1.0', 'RPL-1.1', 'RPL-1.5', 'RPSL-1.0', 'RSCPL', 'Ruby', 'SGI-B-2.0', 'SISSL', 'SMLNJ', 'SPL-1.0', 'SimPL-2.0', 'Sleepycat', 'UCL-1.0', 'UPL-1.0', 'Unicode-DFS-2016', 'Unlicense', 'VSL-1.0', 'Vim', 'W3C', 'WTFPL', 'Watcom-1.0', 'X11', 'XFree86-1.1', 'Xnet', 'YPL-1.1', 'ZPL-2.0', 'ZPL-2.1', 'Zend-2.0', 'Zimbra-1.3', 'Zlib', 'gnuplot', 'iMatix', 'xinetd', ] # an F-Droid addition, until we can enforce a better option APPROVED_LICENSES.append("PublicDomain") if __name__ == "__main__": main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/looseversion.py0000644000175000017500000002753314620351225020613 0ustar00hanshans# PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 # -------------------------------------------- # # 1. This LICENSE AGREEMENT is between the Python Software Foundation # ("PSF"), and the Individual or Organization ("Licensee") accessing and # otherwise using this software ("Python") in source or binary form and # its associated documentation. # # 2. Subject to the terms and conditions of this License Agreement, PSF hereby # grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, # analyze, test, perform and/or display publicly, prepare derivative works, # distribute, and otherwise use Python alone or in any derivative version, # provided, however, that PSF's License Agreement and PSF's notice of copyright, # i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Python Software Foundation; # All Rights Reserved" are retained in Python alone or in any derivative version # prepared by Licensee. # # 3. In the event Licensee prepares a derivative work that is based on # or incorporates Python or any part thereof, and wants to make # the derivative work available to others as provided herein, then # Licensee hereby agrees to include in any such work a brief summary of # the changes made to Python. # # 4. PSF is making Python available to Licensee on an "AS IS" # basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR # IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND # DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS # FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT # INFRINGE ANY THIRD PARTY RIGHTS. # # 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON # FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS # A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, # OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. # # 6. This License Agreement will automatically terminate upon a material # breach of its terms and conditions. # # 7. Nothing in this License Agreement shall be deemed to create any # relationship of agency, partnership, or joint venture between PSF and # Licensee. This License Agreement does not grant permission to use PSF # trademarks or trade name in a trademark sense to endorse or promote # products or services of Licensee, or any third party. # # 8. By copying, installing or otherwise using Python, Licensee # agrees to be bound by the terms and conditions of this License # Agreement. # # SPDX-License-Identifier: Python-2.0 # # downloaded from: # https://github.com/effigies/looseversion/blob/e1a5a176a92dc6825deda4205c1be6d05e9ed352/src/looseversion/__init__.py """Provides classes to represent module version numbers (one class for each style of version numbering). There are currently two such classes implemented: StrictVersion and LooseVersion. Every version number class implements the following interface: * the 'parse' method takes a string and parses it to some internal representation; if the string is an invalid version number, 'parse' raises a ValueError exception * the class constructor takes an optional string argument which, if supplied, is passed to 'parse' * __str__ reconstructs the string that was passed to 'parse' (or an equivalent string -- ie. one that will generate an equivalent version number instance) * __repr__ generates Python code to recreate the version number instance * _cmp compares the current instance with either another instance of the same class or a string (which will be parsed to an instance of the same class, thus must follow the same rules) """ import re import sys __license__ = "Python License 2.0" # The rules according to Greg Stein: # 1) a version number has 1 or more numbers separated by a period or by # sequences of letters. If only periods, then these are compared # left-to-right to determine an ordering. # 2) sequences of letters are part of the tuple for comparison and are # compared lexicographically # 3) recognize the numeric components may have leading zeroes # # The LooseVersion class below implements these rules: a version number # string is split up into a tuple of integer and string components, and # comparison is a simple tuple comparison. This means that version # numbers behave in a predictable and obvious way, but a way that might # not necessarily be how people *want* version numbers to behave. There # wouldn't be a problem if people could stick to purely numeric version # numbers: just split on period and compare the numbers as tuples. # However, people insist on putting letters into their version numbers; # the most common purpose seems to be: # - indicating a "pre-release" version # ('alpha', 'beta', 'a', 'b', 'pre', 'p') # - indicating a post-release patch ('p', 'pl', 'patch') # but of course this can't cover all version number schemes, and there's # no way to know what a programmer means without asking him. # # The problem is what to do with letters (and other non-numeric # characters) in a version number. The current implementation does the # obvious and predictable thing: keep them as strings and compare # lexically within a tuple comparison. This has the desired effect if # an appended letter sequence implies something "post-release": # eg. "0.99" < "0.99pl14" < "1.0", and "5.001" < "5.001m" < "5.002". # # However, if letters in a version number imply a pre-release version, # the "obvious" thing isn't correct. Eg. you would expect that # "1.5.1" < "1.5.2a2" < "1.5.2", but under the tuple/lexical comparison # implemented here, this just isn't so. # # Two possible solutions come to mind. The first is to tie the # comparison algorithm to a particular set of semantic rules, as has # been done in the StrictVersion class above. This works great as long # as everyone can go along with bondage and discipline. Hopefully a # (large) subset of Python module programmers will agree that the # particular flavour of bondage and discipline provided by StrictVersion # provides enough benefit to be worth using, and will submit their # version numbering scheme to its domination. The free-thinking # anarchists in the lot will never give in, though, and something needs # to be done to accommodate them. # # Perhaps a "moderately strict" version class could be implemented that # lets almost anything slide (syntactically), and makes some heuristic # assumptions about non-digits in version number strings. This could # sink into special-case-hell, though; if I was as talented and # idiosyncratic as Larry Wall, I'd go ahead and implement a class that # somehow knows that "1.2.1" < "1.2.2a2" < "1.2.2" < "1.2.2pl3", and is # just as happy dealing with things like "2g6" and "1.13++". I don't # think I'm smart enough to do it right though. # # In any case, I've coded the test suite for this module (see # ../test/test_version.py) specifically to fail on things like comparing # "1.2a2" and "1.2". That's not because the *code* is doing anything # wrong, it's because the simple, obvious design doesn't match my # complicated, hairy expectations for real-world version numbers. It # would be a snap to fix the test suite to say, "Yep, LooseVersion does # the Right Thing" (ie. the code matches the conception). But I'd rather # have a conception that matches common notions about version numbers. if sys.version_info >= (3,): class _Py2Int(int): """Integer object that compares < any string""" def __gt__(self, other): if isinstance(other, str): return False return super().__gt__(other) def __lt__(self, other): if isinstance(other, str): return True return super().__lt__(other) else: _Py2Int = int class LooseVersion(object): """Version numbering for anarchists and software realists. Implements the standard interface for version number classes as described above. A version number consists of a series of numbers, separated by either periods or strings of letters. When comparing version numbers, the numeric components will be compared numerically, and the alphabetic components lexically. The following are all valid version numbers, in no particular order: 1.5.1 1.5.2b2 161 3.10a 8.02 3.4j 1996.07.12 3.2.pl0 3.1.1.6 2g6 11g 0.960923 2.2beta29 1.13++ 5.5.kw 2.0b1pl0 In fact, there is no such thing as an invalid version number under this scheme; the rules for comparison are simple and predictable, but may not always give the results you want (for some definition of "want"). """ component_re = re.compile(r"(\d+ | [a-z]+ | \.)", re.VERBOSE) def __init__(self, vstring=None): if vstring: self.parse(vstring) def __eq__(self, other): c = self._cmp(other) if c is NotImplemented: return NotImplemented return c == 0 def __lt__(self, other): c = self._cmp(other) if c is NotImplemented: return NotImplemented return c < 0 def __le__(self, other): c = self._cmp(other) if c is NotImplemented: return NotImplemented return c <= 0 def __gt__(self, other): c = self._cmp(other) if c is NotImplemented: return NotImplemented return c > 0 def __ge__(self, other): c = self._cmp(other) if c is NotImplemented: return NotImplemented return c >= 0 def parse(self, vstring): # I've given up on thinking I can reconstruct the version string # from the parsed tuple -- so I just store the string here for # use by __str__ self.vstring = vstring components = [x for x in self.component_re.split(vstring) if x and x != "."] for i, obj in enumerate(components): try: components[i] = int(obj) except ValueError: pass self.version = components def __str__(self): return self.vstring def __repr__(self): return "LooseVersion ('%s')" % str(self) def _cmp(self, other): other = self._coerce(other) if other is NotImplemented: return NotImplemented if self.version == other.version: return 0 if self.version < other.version: return -1 if self.version > other.version: return 1 return NotImplemented @classmethod def _coerce(cls, other): if isinstance(other, cls): return other elif isinstance(other, str): return cls(other) elif "distutils" in sys.modules: # Using this check to avoid importing distutils and suppressing the warning try: from distutils.version import LooseVersion as deprecated except ImportError: return NotImplemented if isinstance(other, deprecated): return cls(str(other)) return NotImplemented class LooseVersion2(LooseVersion): """LooseVersion variant that restores Python 2 semantics In Python 2, comparing LooseVersions where paired components could be string and int always resulted in the string being "greater". In Python 3, this produced a TypeError. """ def parse(self, vstring): # I've given up on thinking I can reconstruct the version string # from the parsed tuple -- so I just store the string here for # use by __str__ self.vstring = vstring components = [x for x in self.component_re.split(vstring) if x and x != "."] for i, obj in enumerate(components): try: components[i] = _Py2Int(obj) except ValueError: pass self.version = components ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/metadata.py0000644000175000017500000012132014620351225017631 0ustar00hanshans#!/usr/bin/env python3 # # metadata.py - part of the FDroid server tools # Copyright (C) 2013, Ciaran Gultnieks, ciaran@ciarang.com # Copyright (C) 2013-2014 Daniel Martí # Copyright (C) 2017-2018 Michael Pöhn # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import git from pathlib import Path import math import platform import os import re import logging import ruamel.yaml from collections import OrderedDict from . import common from . import _ from .exception import MetaDataException srclibs = None warnings_action = None # validates usernames based on a loose collection of rules from GitHub, GitLab, # Liberapay and issuehunt. This is mostly to block abuse. VALID_USERNAME_REGEX = re.compile(r'^[a-z\d](?:[a-z\d/._-]){0,38}$', re.IGNORECASE) def _warn_or_exception(value, cause=None): """Output warning or Exception depending on -W.""" if warnings_action == 'ignore': pass elif warnings_action == 'error': if cause: raise MetaDataException(value) from cause else: raise MetaDataException(value) else: logging.warning(value) yaml_app_field_order = [ 'Disabled', 'AntiFeatures', 'Categories', 'License', 'AuthorName', 'AuthorEmail', 'AuthorWebSite', 'WebSite', 'SourceCode', 'IssueTracker', 'Translation', 'Changelog', 'Donate', 'FlattrID', 'Liberapay', 'OpenCollective', 'Bitcoin', 'Litecoin', '\n', 'Name', 'AutoName', 'Summary', 'Description', '\n', 'RequiresRoot', '\n', 'RepoType', 'Repo', 'Binaries', '\n', 'Builds', '\n', 'AllowedAPKSigningKeys', '\n', 'MaintainerNotes', '\n', 'ArchivePolicy', 'AutoUpdateMode', 'UpdateCheckMode', 'UpdateCheckIgnore', 'VercodeOperation', 'UpdateCheckName', 'UpdateCheckData', 'CurrentVersion', 'CurrentVersionCode', '\n', 'NoSourceSince', ] yaml_app_fields = [x for x in yaml_app_field_order if x != '\n'] class App(dict): def __init__(self, copydict=None): if copydict: super().__init__(copydict) return super().__init__() self.Disabled = None self.AntiFeatures = dict() self.Provides = None self.Categories = [] self.License = 'Unknown' self.AuthorName = None self.AuthorEmail = None self.AuthorWebSite = None self.WebSite = '' self.SourceCode = '' self.IssueTracker = '' self.Translation = '' self.Changelog = '' self.Donate = None self.FlattrID = None self.Liberapay = None self.OpenCollective = None self.Bitcoin = None self.Litecoin = None self.Name = None self.AutoName = '' self.Summary = '' self.Description = '' self.RequiresRoot = False self.RepoType = '' self.Repo = '' self.Binaries = None self.AllowedAPKSigningKeys = [] self.MaintainerNotes = '' self.ArchivePolicy = None self.AutoUpdateMode = 'None' self.UpdateCheckMode = 'None' self.UpdateCheckIgnore = None self.VercodeOperation = [] self.UpdateCheckName = None self.UpdateCheckData = None self.CurrentVersion = '' self.CurrentVersionCode = None self.NoSourceSince = '' self.id = None self.metadatapath = None self.Builds = [] self.added = None self.lastUpdated = None def __getattr__(self, name): if name in self: return self[name] else: raise AttributeError("No such attribute: " + name) def __setattr__(self, name, value): self[name] = value def __delattr__(self, name): if name in self: del self[name] else: raise AttributeError("No such attribute: " + name) TYPE_STRING = 2 TYPE_BOOL = 3 TYPE_LIST = 4 TYPE_SCRIPT = 5 TYPE_MULTILINE = 6 TYPE_BUILD = 7 TYPE_INT = 8 TYPE_STRINGMAP = 9 fieldtypes = { 'Description': TYPE_MULTILINE, 'MaintainerNotes': TYPE_MULTILINE, 'Categories': TYPE_LIST, 'AntiFeatures': TYPE_STRINGMAP, 'RequiresRoot': TYPE_BOOL, 'AllowedAPKSigningKeys': TYPE_LIST, 'Builds': TYPE_BUILD, 'VercodeOperation': TYPE_LIST, 'CurrentVersionCode': TYPE_INT, 'ArchivePolicy': TYPE_INT, } def fieldtype(name): name = name.replace(' ', '') if name in fieldtypes: return fieldtypes[name] return TYPE_STRING # In the order in which they are laid out on files build_flags = [ 'versionName', 'versionCode', 'disable', 'commit', 'timeout', 'subdir', 'submodules', 'sudo', 'init', 'patch', 'gradle', 'maven', 'output', 'binary', 'srclibs', 'oldsdkloc', 'encoding', 'forceversion', 'forcevercode', 'rm', 'extlibs', 'prebuild', 'androidupdate', 'target', 'scanignore', 'scandelete', 'build', 'buildjni', 'ndk', 'preassemble', 'gradleprops', 'antcommands', 'postbuild', 'novcheck', 'antifeatures', ] class Build(dict): def __init__(self, copydict=None): super().__init__() self.disable = '' self.commit = None self.timeout = None self.subdir = None self.submodules = False self.sudo = '' self.init = '' self.patch = [] self.gradle = [] self.maven = None self.output = None self.binary = None self.srclibs = [] self.oldsdkloc = False self.encoding = None self.forceversion = False self.forcevercode = False self.rm = [] self.extlibs = [] self.prebuild = '' self.androidupdate = [] self.target = None self.scanignore = [] self.scandelete = [] self.build = '' self.buildjni = [] self.ndk = None self.preassemble = [] self.gradleprops = [] self.antcommands = [] self.postbuild = '' self.novcheck = False self.antifeatures = dict() if copydict: super().__init__(copydict) return def __getattr__(self, name): if name in self: return self[name] else: raise AttributeError("No such attribute: " + name) def __setattr__(self, name, value): self[name] = value def __delattr__(self, name): if name in self: del self[name] else: raise AttributeError("No such attribute: " + name) @classmethod def to_yaml(cls, representer, node): return representer.represent_dict(node) def build_method(self): for f in ['maven', 'gradle']: if self.get(f): return f if self.output: return 'raw' return 'ant' # like build_method, but prioritize output= def output_method(self): if self.output: return 'raw' for f in ['maven', 'gradle']: if self.get(f): return f return 'ant' def ndk_path(self) -> str: """Return the path string of the first configured NDK or an empty string.""" ndk = self.ndk if isinstance(ndk, list): ndk = self.ndk[0] path = common.config['ndk_paths'].get(ndk) if path and not isinstance(path, str): raise TypeError('NDK path is not string') if path: return path for vsn, path in common.config['ndk_paths'].items(): if not vsn.endswith("_orig") and path and os.path.basename(path) == ndk: return path return '' flagtypes = { 'versionCode': TYPE_INT, 'extlibs': TYPE_LIST, 'srclibs': TYPE_LIST, 'patch': TYPE_LIST, 'rm': TYPE_LIST, 'buildjni': TYPE_LIST, 'preassemble': TYPE_LIST, 'androidupdate': TYPE_LIST, 'scanignore': TYPE_LIST, 'scandelete': TYPE_LIST, 'gradle': TYPE_LIST, 'antcommands': TYPE_LIST, 'gradleprops': TYPE_LIST, 'sudo': TYPE_SCRIPT, 'init': TYPE_SCRIPT, 'prebuild': TYPE_SCRIPT, 'build': TYPE_SCRIPT, 'postbuild': TYPE_SCRIPT, 'submodules': TYPE_BOOL, 'oldsdkloc': TYPE_BOOL, 'forceversion': TYPE_BOOL, 'forcevercode': TYPE_BOOL, 'novcheck': TYPE_BOOL, 'antifeatures': TYPE_STRINGMAP, 'timeout': TYPE_INT, } def flagtype(name): if name in flagtypes: return flagtypes[name] return TYPE_STRING class FieldValidator: """Designate App metadata field types and checks that it matches. 'name' - The long name of the field type 'matching' - List of possible values or regex expression 'sep' - Separator to use if value may be a list 'fields' - Metadata fields (Field:Value) of this type """ def __init__(self, name, matching, fields): self.name = name self.matching = matching self.compiled = re.compile(matching) self.fields = fields def check(self, v, appid): if not v: return if type(v) == list: values = v else: values = [v] for v in values: if not self.compiled.match(v): _warn_or_exception( _( "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" ).format( value=v, field=self.name, appid=appid, pattern=self.matching ) ) # Generic value types valuetypes = { FieldValidator("Flattr ID", r'^[0-9a-z]+$', ['FlattrID']), FieldValidator("Liberapay", VALID_USERNAME_REGEX, ['Liberapay']), FieldValidator("Open Collective", VALID_USERNAME_REGEX, ['OpenCollective']), FieldValidator("HTTP link", r'^http[s]?://', ["WebSite", "SourceCode", "IssueTracker", "Translation", "Changelog", "Donate"]), FieldValidator("Email", r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$', ["AuthorEmail"]), FieldValidator("Bitcoin address", r'^(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,39}$', ["Bitcoin"]), FieldValidator("Litecoin address", r'^([LM3][a-km-zA-HJ-NP-Z1-9]{26,33}|ltc1[a-z0-9]{39})$', ["Litecoin"]), FieldValidator("Repo Type", r'^(git|git-svn|svn|hg|bzr|srclib)$', ["RepoType"]), FieldValidator("Binaries", r'^http[s]?://', ["Binaries"]), FieldValidator("AllowedAPKSigningKeys", r'^[a-fA-F0-9]{64}$', ["AllowedAPKSigningKeys"]), FieldValidator("Auto Update Mode", r"^(Version.*|None)$", ["AutoUpdateMode"]), FieldValidator("Update Check Mode", r"^(Tags|Tags .+|RepoManifest|RepoManifest/.+|HTTP|Static|None)$", ["UpdateCheckMode"]) } # Check an app's metadata information for integrity errors def check_metadata(app): for v in valuetypes: for k in v.fields: v.check(app[k], app.id) def parse_yaml_srclib(metadatapath): thisinfo = {'RepoType': '', 'Repo': '', 'Subdir': None, 'Prepare': None} if not metadatapath.exists(): _warn_or_exception( _("Invalid scrlib metadata: '{file}' does not exist").format( file=metadatapath ) ) return thisinfo with metadatapath.open("r", encoding="utf-8") as f: try: yaml = ruamel.yaml.YAML(typ='safe') data = yaml.load(f) if type(data) is not dict: if platform.system() == 'Windows': # Handle symlink on Windows symlink = metadatapath.parent / metadatapath.read_text(encoding='utf-8') if symlink.is_file(): with symlink.open("r", encoding="utf-8") as s: data = yaml.load(s) if type(data) is not dict: raise ruamel.yaml.YAMLError( _('{file} is blank or corrupt!').format(file=metadatapath) ) except ruamel.yaml.YAMLError as e: _warn_or_exception(_("Invalid srclib metadata: could not " "parse '{file}'") .format(file=metadatapath) + '\n' + common.run_yamllint(metadatapath, indent=4), cause=e) return thisinfo for key in data: if key not in thisinfo: _warn_or_exception( _("Invalid srclib metadata: unknown key '{key}' in '{file}'").format( key=key, file=metadatapath ) ) return thisinfo else: if key == 'Subdir': if isinstance(data[key], str): thisinfo[key] = data[key].split(',') elif isinstance(data[key], list): thisinfo[key] = data[key] elif data[key] is None: thisinfo[key] = [''] elif key == 'Prepare' or flagtype(key) == TYPE_SCRIPT: if isinstance(data[key], list): thisinfo[key] = data[key] else: thisinfo[key] = [data[key]] if data[key] else [] else: thisinfo[key] = str(data[key] or '') return thisinfo def read_srclibs(): """Read all srclib metadata. The information read will be accessible as metadata.srclibs, which is a dictionary, keyed on srclib name, with the values each being a dictionary in the same format as that returned by the parse_yaml_srclib function. A MetaDataException is raised if there are any problems with the srclib metadata. """ global srclibs # They were already loaded if srclibs is not None: return srclibs = {} srcdir = Path('srclibs') srcdir.mkdir(exist_ok=True) for metadatapath in sorted(srcdir.glob('*.yml')): srclibs[metadatapath.stem] = parse_yaml_srclib(metadatapath) def read_metadata(appids={}, sort_by_time=False): """Return a list of App instances sorted newest first. This reads all of the metadata files in a 'data' repository, then builds a list of App instances from those files. The list is sorted based on creation time, newest first. Most of the time, the newer files are the most interesting. appids is a dict with appids a keys and versionCodes as values. """ # Always read the srclibs before the apps, since they can use a srlib as # their source repository. read_srclibs() apps = OrderedDict() for basedir in ('metadata', 'tmp'): Path(basedir).mkdir(exist_ok=True) if appids: vercodes = common.read_pkg_args(appids) metadatafiles = common.get_metadata_files(vercodes) else: metadatafiles = list(Path('metadata').glob('*.yml')) + list( Path('.').glob('.fdroid.yml') ) if sort_by_time: entries = ((path.stat().st_mtime, path) for path in metadatafiles) metadatafiles = [] for _ignored, path in sorted(entries, reverse=True): metadatafiles.append(path) else: # most things want the index alpha sorted for stability metadatafiles = sorted(metadatafiles) for metadatapath in metadatafiles: appid = metadatapath.stem if appid != '.fdroid' and not common.is_valid_package_name(appid): _warn_or_exception( _("{appid} from {path} is not a valid Java Package Name!").format( appid=appid, path=metadatapath ) ) if appid in apps: _warn_or_exception( _("Found multiple metadata files for {appid}").format(appid=appid) ) app = parse_metadata(metadatapath) check_metadata(app) apps[app.id] = app return apps def parse_metadata(metadatapath): """Parse metadata file, also checking the source repo for .fdroid.yml. This function finds the relevant files, gets them parsed, converts dicts into App and Build instances, and combines the results into a single App instance. If this is a metadata file from fdroiddata, it will first load the source repo type and URL from fdroiddata, then read .fdroid.yml if it exists, then include the rest of the metadata as specified in fdroiddata, so that fdroiddata has precedence over the metadata in the source code. .fdroid.yml is embedded in the app's source repo, so it is "user-generated". That means that it can have weird things in it that need to be removed so they don't break the overall process, e.g. if the upstream developer includes some broken field, it can be overridden in the metadata file. Parameters ---------- metadatapath The file path to read. The "Application ID" aka "Package Name" for the application comes from this filename. Raises ------ FDroidException when there are syntax errors. Returns ------- Returns a dictionary containing all the details of the application. There are two major kinds of information in the dictionary. Keys beginning with capital letters correspond directory to identically named keys in the metadata file. Keys beginning with lower case letters are generated in one way or another, and are not found verbatim in the metadata. """ metadatapath = Path(metadatapath) app = App() app.metadatapath = metadatapath.as_posix() if metadatapath.suffix == '.yml': with metadatapath.open('r', encoding='utf-8') as mf: app.update(parse_yaml_metadata(mf)) else: _warn_or_exception( _('Unknown metadata format: {path} (use: *.yml)').format(path=metadatapath) ) if metadatapath.stem != '.fdroid': app.id = metadatapath.stem parse_localized_antifeatures(app) if metadatapath.name != '.fdroid.yml' and app.Repo: build_dir = common.get_build_dir(app) metadata_in_repo = build_dir / '.fdroid.yml' if metadata_in_repo.is_file(): try: commit_id = common.get_head_commit_id(git.Repo(build_dir)) logging.debug( _('Including metadata from %s@%s') % (metadata_in_repo, commit_id) ) # See https://github.com/PyCQA/pylint/issues/2856 . # pylint: disable-next=no-member except git.exc.InvalidGitRepositoryError: logging.debug( _('Including metadata from {path}').format(path=metadata_in_repo) ) app_in_repo = parse_metadata(metadata_in_repo) for k, v in app_in_repo.items(): if k not in app: app[k] = v builds = [] for build in app.get('Builds', []): builds.append(Build(build)) if builds: app['Builds'] = builds # if only .fdroid.yml was found, then this finds the appid if not app.id: if app.get('Builds'): build = app['Builds'][-1] if build.subdir: root_dir = Path(build.subdir) else: root_dir = Path('.') paths = common.manifest_paths(root_dir, build.gradle) _ignored, _ignored, app.id = common.parse_androidmanifests(paths, app) return app def parse_yaml_metadata(mf): """Parse the .yml file and post-process it. This function handles parsing a metadata YAML file and converting all the various data types into a consistent internal representation. The results are meant to update an existing App instance or used as a plain dict. Clean metadata .yml files can be used directly, but in order to make a better user experience for people editing .yml files, there is post processing. That makes the parsing perform something like Strict YAML. """ try: yaml = ruamel.yaml.YAML(typ='safe') yamldata = yaml.load(mf) except ruamel.yaml.YAMLError as e: _warn_or_exception( _("could not parse '{path}'").format(path=mf.name) + '\n' + common.run_yamllint(mf.name, indent=4), cause=e, ) if yamldata is None or yamldata == '': yamldata = dict() if not isinstance(yamldata, dict): _warn_or_exception( _("'{path}' has invalid format, it should be a dictionary!").format( path=mf.name ) ) logging.error(_('Using blank dictionary instead of contents of {path}!').format( path=mf.name) ) yamldata = dict() deprecated_in_yaml = ['Provides'] for field in tuple(yamldata.keys()): if field not in yaml_app_fields + deprecated_in_yaml: msg = _("Unrecognised app field '{fieldname}' in '{path}'").format( fieldname=field, path=mf.name ) if Path(mf.name).name == '.fdroid.yml': logging.error(msg) del yamldata[field] else: _warn_or_exception(msg) for deprecated_field in deprecated_in_yaml: if deprecated_field in yamldata: del yamldata[deprecated_field] logging.warning( _( "Ignoring '{field}' in '{metapath}' " "metadata because it is deprecated." ).format(field=deprecated_field, metapath=mf.name) ) msg = _("Unrecognised build flag '{build_flag}' in '{path}'") for build in yamldata.get('Builds', []): for build_flag in build: if build_flag not in build_flags: _warn_or_exception(msg.format(build_flag=build_flag, path=mf.name)) post_parse_yaml_metadata(yamldata) return yamldata def parse_localized_antifeatures(app): """Read in localized Anti-Features files from the filesystem. To support easy integration with Weblate and other translation systems, there is a special type of metadata that can be maintained in a Fastlane-style directory layout, where each field is represented by a text file on directories that specified which app it belongs to, which locale, etc. This function reads those in and puts them into the internal dict, to be merged with any related data that came from the metadata.yml file. This needs to be run after parse_yaml_metadata() since that normalizes the data structure. Also, these values are lower priority than what comes from the metadata file. So this should not overwrite anything parse_yaml_metadata() puts into the App instance. metadata///antifeatures/_.txt metadata///antifeatures/.txt └── metadata/ └── / ├── en-US/ │ └── antifeatures/ │ ├── 123_Ads.txt -> "includes ad lib" │ ├── 123_Tracking.txt -> "standard suspects" │ └── NoSourceSince.txt -> "it vanished" │ └── zh-CN/ └── antifeatures/ └── 123_Ads.txt -> "包括广告库" Gets parsed into the metadata data structure: AntiFeatures: NoSourceSince: en-US: it vanished Builds: - versionCode: 123 antifeatures: Ads: en-US: includes ad lib zh-CN: 包括广告库 Tracking: en-US: standard suspects """ app_dir = Path('metadata', app['id']) if not app_dir.is_dir(): return af_dup_msg = _('Duplicate Anti-Feature declaration at {path} was ignored!') if app.get('AntiFeatures'): app_has_AntiFeatures = True else: app_has_AntiFeatures = False has_versionCode = re.compile(r'^-?[0-9]+_.*') has_antifeatures_from_app = set() for build in app.get('Builds', []): antifeatures = build.get('antifeatures') if antifeatures: has_antifeatures_from_app.add(build['versionCode']) for f in sorted(app_dir.glob('*/antifeatures/*.txt')): path = f.as_posix() left = path.index('/', 9) # 9 is length of "metadata/" right = path.index('/', left + 1) locale = path[left + 1 : right] description = f.read_text() if has_versionCode.match(f.stem): i = f.stem.index('_') versionCode = int(f.stem[:i]) antifeature = f.stem[i + 1 :] if versionCode in has_antifeatures_from_app: logging.error(af_dup_msg.format(path=f)) continue if 'Builds' not in app: app['Builds'] = [] found = False for build in app['Builds']: # loop though builds again, there might be duplicate versionCodes if versionCode == build['versionCode']: found = True if 'antifeatures' not in build: build['antifeatures'] = dict() if antifeature not in build['antifeatures']: build['antifeatures'][antifeature] = dict() build['antifeatures'][antifeature][locale] = description if not found: app['Builds'].append( { 'versionCode': versionCode, 'antifeatures': { antifeature: {locale: description}, }, } ) elif app_has_AntiFeatures: logging.error(af_dup_msg.format(path=f)) continue else: if 'AntiFeatures' not in app: app['AntiFeatures'] = dict() if f.stem not in app['AntiFeatures']: app['AntiFeatures'][f.stem] = dict() app['AntiFeatures'][f.stem][locale] = f.read_text() def _normalize_type_int(k, v): """Normalize anything that can be reliably converted to an integer.""" if isinstance(v, int) and not isinstance(v, bool): return v if v is None: return None if isinstance(v, str): try: return int(v) except ValueError: pass msg = _('{build_flag} must be an integer, found: {value}') _warn_or_exception(msg.format(build_flag=k, value=v)) def _normalize_type_string(v): """Normalize any data to TYPE_STRING. YAML 1.2's booleans are all lowercase. Things like versionName are strings, but without quotes can be numbers. Like "versionName: 1.0" would be a YAML float, but should be a string. SHA-256 values are string values, but YAML 1.2 can interpret some unquoted values as decimal ints. This converts those to a string if they are over 50 digits. In the wild, the longest 0 padding on a SHA-256 key fingerprint I found was 8 zeros. """ if isinstance(v, bool): if v: return 'true' return 'false' if isinstance(v, float): # YAML 1.2 values for NaN, Inf, and -Inf if math.isnan(v): return '.nan' if math.isinf(v): if v > 0: return '.inf' return '-.inf' if v and isinstance(v, int): if math.log10(v) > 50: # only if the int has this many digits return '%064d' % v return str(v) def _normalize_type_stringmap(k, v): """Normalize any data to TYPE_STRINGMAP. The internal representation of this format is a dict of dicts, where the outer dict's keys are things like tag names of Anti-Features, the inner dict's keys are locales, and the ultimate values are human readable text. Metadata entries like AntiFeatures: can be written in many forms, including a simple one-entry string, a list of strings, a dict with keys and descriptions as values, or a dict with localization. Returns ------- A dictionary with string keys, where each value is either a string message or a dict with locale keys and string message values. """ if v is None: return dict() if isinstance(v, str) or isinstance(v, int) or isinstance(v, float): return {_normalize_type_string(v): dict()} if isinstance(v, list) or isinstance(v, tuple) or isinstance(v, set): retdict = dict() for i in v: if isinstance(i, dict): # transitional format if len(i) != 1: _warn_or_exception( _( "'{value}' is not a valid {field}, should be {pattern}" ).format(field=k, value=v, pattern='key: value') ) afname = _normalize_type_string(next(iter(i))) desc = _normalize_type_string(next(iter(i.values()))) retdict[afname] = {common.DEFAULT_LOCALE: desc} else: retdict[_normalize_type_string(i)] = {} return retdict retdict = dict() for af, afdict in v.items(): key = _normalize_type_string(af) if afdict: if isinstance(afdict, dict): retdict[key] = afdict else: retdict[key] = {common.DEFAULT_LOCALE: _normalize_type_string(afdict)} else: retdict[key] = dict() return retdict def _normalize_type_list(k, v): """Normalize any data to TYPE_LIST, which is always a list of strings.""" if isinstance(v, dict): msg = _('{build_flag} must be list or string, found: {value}') _warn_or_exception(msg.format(build_flag=k, value=v)) elif type(v) not in (list, tuple, set): v = [v] return [_normalize_type_string(i) for i in v] def post_parse_yaml_metadata(yamldata): """Convert human-readable metadata data structures into consistent data structures. "Be conservative in what is written out, be liberal in what is parsed." https://en.wikipedia.org/wiki/Robustness_principle This also handles conversions that make metadata YAML behave something like StrictYAML. Specifically, a field should have a fixed value type, regardless of YAML 1.2's type auto-detection. TODO: None values should probably be treated as the string 'null', since YAML 1.2 uses that for nulls """ for k, v in yamldata.items(): _fieldtype = fieldtype(k) if _fieldtype == TYPE_LIST: if v or v == 0: yamldata[k] = _normalize_type_list(k, v) elif _fieldtype == TYPE_INT: # ArchivePolicy used to require " versions" in the value. if k == 'ArchivePolicy' and isinstance(v, str): v = v.split(' ', maxsplit=1)[0] v = _normalize_type_int(k, v) if v or v == 0: yamldata[k] = v elif _fieldtype == TYPE_STRING: if v or v == 0: yamldata[k] = _normalize_type_string(v) elif _fieldtype == TYPE_STRINGMAP: if v or v == 0: # TODO probably want just `if v:` yamldata[k] = _normalize_type_stringmap(k, v) elif _fieldtype == TYPE_BOOL: yamldata[k] = bool(v) else: if type(v) in (float, int): yamldata[k] = str(v) builds = [] for build in yamldata.get('Builds', []): for k, v in build.items(): if v is None: continue _flagtype = flagtype(k) if _flagtype == TYPE_STRING: if v or v == 0: build[k] = _normalize_type_string(v) elif _flagtype == TYPE_INT: v = _normalize_type_int(k, v) if v or v == 0: build[k] = v elif _flagtype in (TYPE_LIST, TYPE_SCRIPT): if v or v == 0: build[k] = _normalize_type_list(k, v) elif _flagtype == TYPE_STRINGMAP: if v or v == 0: build[k] = _normalize_type_stringmap(k, v) elif _flagtype == TYPE_BOOL: build[k] = bool(v) builds.append(build) if builds: yamldata['Builds'] = sorted(builds, key=lambda build: build['versionCode']) no_source_since = yamldata.get("NoSourceSince") # do not overwrite the description if it is there if no_source_since and not yamldata.get('AntiFeatures', {}).get('NoSourceSince'): if 'AntiFeatures' not in yamldata: yamldata['AntiFeatures'] = dict() yamldata['AntiFeatures']['NoSourceSince'] = { common.DEFAULT_LOCALE: no_source_since } def _format_multiline(value): """TYPE_MULTILINE with newlines in them are saved as YAML literal strings.""" if '\n' in value: return ruamel.yaml.scalarstring.preserve_literal(str(value)) return str(value) def _format_list(value): """TYPE_LIST should not contain null values.""" return [v for v in value if v] def _format_script(value): """TYPE_SCRIPT with one value are converted to YAML string values.""" value = [v for v in value if v] if len(value) == 1: return value[0] return value def _format_stringmap(appid, field, stringmap, versionCode=None): """Format TYPE_STRINGMAP taking into account localized files in the metadata dir. If there are any localized versions on the filesystem already, then move them all there. Otherwise, keep them in the .yml file. The directory for the localized files that is named after the field is all lower case, following the convention set by Fastlane metadata, and used by fdroidserver. """ app_dir = Path('metadata', appid) try: next(app_dir.glob('*/%s/*.txt' % field.lower())) files = [] overwrites = [] for name, descdict in stringmap.items(): for locale, desc in descdict.items(): outdir = app_dir / locale / field.lower() if versionCode: filename = '%d_%s.txt' % (versionCode, name) else: filename = '%s.txt' % name outfile = outdir / filename files.append(str(outfile)) if outfile.exists(): if desc != outfile.read_text(): overwrites.append(str(outfile)) else: if not outfile.parent.exists(): outfile.parent.mkdir(parents=True) outfile.write_text(desc) if overwrites: _warn_or_exception( _( 'Conflicting "{field}" definitions between .yml and localized files:' ).format(field=field) + '\n' + '\n'.join(sorted(overwrites)) ) logging.warning( _('Moving Anti-Features declarations to localized files:') + '\n' + '\n'.join(sorted(files)) ) return except StopIteration: pass make_list = True outlist = [] for name in sorted(stringmap): outlist.append(name) descdict = stringmap.get(name) if descdict and any(descdict.values()): make_list = False break if make_list: return sorted(outlist, key=str.lower) return stringmap def _del_duplicated_NoSourceSince(app): # noqa: D403 NoSourceSince is the word. """NoSourceSince gets auto-added to AntiFeatures, but can also be manually added.""" key = 'NoSourceSince' if key in app: no_source_since = app.get(key) af_no_source_since = app.get('AntiFeatures', dict()).get(key) if af_no_source_since == {common.DEFAULT_LOCALE: no_source_since}: del app['AntiFeatures'][key] def _builds_to_yaml(app): """Reformat Builds: flags for output to YAML 1.2. This will strip any flag/value that is not set or is empty. TYPE_BOOL fields are removed when they are false. 0 is valid value, it should not be stripped, so there are special cases to handle that. """ builds = ruamel.yaml.comments.CommentedSeq() for build in app.get('Builds', []): b = ruamel.yaml.comments.CommentedMap() for field in build_flags: v = build.get(field) if v is None or v is False or v == '' or v == dict() or v == list(): continue _flagtype = flagtype(field) if _flagtype == TYPE_MULTILINE: v = _format_multiline(v) elif _flagtype == TYPE_LIST: v = _format_list(v) elif _flagtype == TYPE_SCRIPT: v = _format_script(v) elif _flagtype == TYPE_STRINGMAP: v = _format_stringmap(app['id'], field, v, build['versionCode']) if v or v == 0: b[field] = v builds.append(b) # insert extra empty lines between build entries for i in range(1, len(builds)): builds.yaml_set_comment_before_after_key(i, 'bogus') builds.ca.items[i][1][-1].value = '\n' return builds def _app_to_yaml(app): cm = ruamel.yaml.comments.CommentedMap() insert_newline = False for field in yaml_app_field_order: if field == '\n': # next iteration will need to insert a newline insert_newline = True else: value = app.get(field) if value or field in ('Builds', 'ArchivePolicy'): _fieldtype = fieldtype(field) if field == 'Builds': if app.get('Builds'): cm.update({field: _builds_to_yaml(app)}) elif field == 'Categories': cm[field] = sorted(value, key=str.lower) elif field == 'AntiFeatures': v = _format_stringmap(app['id'], field, value) if v: cm[field] = v elif field == 'AllowedAPKSigningKeys': value = [str(i).lower() for i in value] if len(value) == 1: cm[field] = value[0] else: cm[field] = value elif field == 'ArchivePolicy': if value is None: continue cm[field] = value elif _fieldtype == TYPE_MULTILINE: v = _format_multiline(value) if v: cm[field] = v elif _fieldtype == TYPE_SCRIPT: v = _format_script(value) if v: cm[field] = v else: if value: cm[field] = value if insert_newline: # we need to prepend a newline in front of this field insert_newline = False # inserting empty lines is not supported so we add a # bogus comment and over-write its value cm.yaml_set_comment_before_after_key(field, 'bogus') cm.ca.items[field][1][-1].value = '\n' return cm def write_yaml(mf, app): """Write metadata in yaml format. Parameters ---------- mf active file discriptor for writing app app metadata to written to the yaml file """ _del_duplicated_NoSourceSince(app) yaml_app = _app_to_yaml(app) yaml = ruamel.yaml.YAML() yaml.indent(mapping=2, sequence=4, offset=2) yaml.dump(yaml_app, stream=mf) def write_metadata(metadatapath, app): metadatapath = Path(metadatapath) if metadatapath.suffix == '.yml': with metadatapath.open('w') as mf: return write_yaml(mf, app) _warn_or_exception(_('Unknown metadata format: %s') % metadatapath) def add_metadata_arguments(parser): """Add common command line flags related to metadata processing.""" parser.add_argument( "-W", choices=['error', 'warn', 'ignore'], default='error', help=_("force metadata errors (default) to be warnings, or to be ignored."), ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/mirror.py0000644000175000017500000002177114620351225017374 0ustar00hanshans#!/usr/bin/env python3 import ipaddress import logging import os import posixpath import socket import subprocess import sys from argparse import ArgumentParser import urllib.parse from . import _ from . import common from . import index from . import update def _run_wget(path, urls, verbose=False): if verbose: verbose = '--verbose' else: verbose = '--no-verbose' if not urls: return logging.debug(_('Running wget in {path}').format(path=path)) cwd = os.getcwd() os.makedirs(path, exist_ok=True) os.chdir(path) urls_file = '.fdroid-mirror-wget-input-file' with open(urls_file, 'w') as fp: for url in urls: fp.write(url.split('?')[0] + '\n') # wget puts query string in the filename subprocess.call( [ 'wget', verbose, '--continue', '--user-agent="fdroid mirror"', '--input-file=' + urls_file, ] ) os.remove(urls_file) os.chdir(cwd) # leave the working env the way we found it def main(): parser = ArgumentParser() common.setup_global_opts(parser) parser.add_argument( "url", nargs='?', help=_( 'Base URL to mirror, can include the index signing key ' + 'using the query string: ?fingerprint=' ), ) parser.add_argument( "--all", action='store_true', default=False, help=_("Mirror the full repo and archive, all file types."), ) parser.add_argument( "--archive", action='store_true', default=False, help=_("Also mirror the full archive section"), ) parser.add_argument( "--build-logs", action='store_true', default=False, help=_("Include the build logs in the mirror"), ) parser.add_argument( "--pgp-signatures", action='store_true', default=False, help=_("Include the PGP signature .asc files in the mirror"), ) parser.add_argument( "--src-tarballs", action='store_true', default=False, help=_("Include the source tarballs in the mirror"), ) parser.add_argument( "--output-dir", default=None, help=_("The directory to write the mirror to") ) options = common.parse_args(parser) common.set_console_logging(options.verbose) if options.all: options.archive = True options.build_logs = True options.pgp_signatures = True options.src_tarballs = True if options.url is None: logging.error(_('A URL is required as an argument!') + '\n') parser.print_help() sys.exit(1) scheme, hostname, path, params, query, fragment = urllib.parse.urlparse(options.url) fingerprint = urllib.parse.parse_qs(query).get('fingerprint') def _append_to_url_path(*args): """Append the list of path components to URL, keeping the rest the same.""" newpath = posixpath.join(path, *args) return urllib.parse.urlunparse( (scheme, hostname, newpath, params, query, fragment) ) if fingerprint: config = common.read_config() if not ('jarsigner' in config or 'apksigner' in config): logging.error( _('Java JDK not found! Install in standard location or set java_paths!') ) sys.exit(1) def _get_index(section, etag=None): url = _append_to_url_path(section) data, etag = index.download_repo_index(url, etag=etag) return data, etag, _append_to_url_path(section, 'index-v1.jar') else: def _get_index(section, etag=None): import io import json import zipfile from . import net url = _append_to_url_path(section, 'index-v1.jar') content, etag = net.http_get(url) with zipfile.ZipFile(io.BytesIO(content)) as zip: jsoncontents = zip.open('index-v1.json').read() data = json.loads(jsoncontents.decode('utf-8')) return data, etag, None # no verified index file to return ip = None try: ip = ipaddress.ip_address(hostname) except ValueError: pass if hostname == 'f-droid.org' or ( ip is not None and hostname in socket.gethostbyname_ex('f-droid.org')[2] ): logging.error( _( 'This command should never be used to mirror f-droid.org! ' 'A full copy requires more than 600GB.' ) ) sys.exit(1) path = path.rstrip('/') if path.endswith('repo') or path.endswith('archive'): logging.warning( _('Do not include "{path}" in URL!').format(path=path.split('/')[-1]) ) elif not path.endswith('fdroid'): logging.warning( _('{url} does not end with "fdroid", check the URL path!').format( url=options.url ) ) icondirs = ['icons'] for density in update.screen_densities: icondirs.append('icons-' + density) if options.output_dir: basedir = options.output_dir else: basedir = os.path.join(os.getcwd(), hostname, path.strip('/')) os.makedirs(basedir, exist_ok=True) if options.archive: sections = ('repo', 'archive') else: sections = ('repo',) for section in sections: sectiondir = os.path.join(basedir, section) urls = [] data, etag, index_url = _get_index(section) if index_url: urls.append(index_url) os.makedirs(sectiondir, exist_ok=True) os.chdir(sectiondir) for icondir in icondirs: os.makedirs(os.path.join(sectiondir, icondir), exist_ok=True) for packageName, packageList in data['packages'].items(): for package in packageList: to_fetch = [] keys = ['apkName'] if options.src_tarballs: keys.append('srcname') for k in keys: if k in package: to_fetch.append(package[k]) elif k == 'apkName': logging.error( _('{appid} is missing {name}').format( appid=package['packageName'], name=k ) ) for f in to_fetch: if not os.path.exists(f) or ( f.endswith('.apk') and os.path.getsize(f) != package['size'] ): urls.append(_append_to_url_path(section, f)) if options.pgp_signatures: urls.append(_append_to_url_path(section, f + '.asc')) if options.build_logs and f.endswith('.apk'): urls.append( _append_to_url_path(section, f[:-4] + '.log.gz') ) _run_wget(sectiondir, urls, options.verbose) for app in data['apps']: localized = app.get('localized') if localized: for locale, d in localized.items(): urls = [] components = (section, app['packageName'], locale) for k in update.GRAPHIC_NAMES: f = d.get(k) if f: filepath_tuple = components + (f,) urls.append(_append_to_url_path(*filepath_tuple)) _run_wget(os.path.join(basedir, *components), urls, options.verbose) for k in update.SCREENSHOT_DIRS: urls = [] filelist = d.get(k) if filelist: components = (section, app['packageName'], locale, k) for f in filelist: filepath_tuple = components + (f,) urls.append(_append_to_url_path(*filepath_tuple)) _run_wget( os.path.join(basedir, *components), urls, options.verbose, ) urls = dict() for app in data['apps']: if 'icon' not in app: logging.error( _('no "icon" in {appid}').format(appid=app['packageName']) ) continue icon = app['icon'] for icondir in icondirs: url = _append_to_url_path(section, icondir, icon) if icondir not in urls: urls[icondir] = [] urls[icondir].append(url) for icondir in icondirs: if icondir in urls: _run_wget( os.path.join(basedir, section, icondir), urls[icondir], options.verbose, ) if __name__ == "__main__": main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/net.py0000644000175000017500000000764214620351225016651 0ustar00hanshans#!/usr/bin/env python3 # # net.py - part of the FDroid server tools # Copyright (C) 2015 Hans-Christoph Steiner # Copyright (C) 2022 FC Stegerman # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import logging import os import requests import time import urllib from requests.adapters import HTTPAdapter, Retry from requests.exceptions import ChunkedEncodingError HEADERS = {'User-Agent': 'F-Droid'} def download_file(url, local_filename=None, dldir='tmp', retries=3, backoff_factor=0.1): """Try hard to download the file, including retrying on failures. This has two retry cycles, one inside of the requests session, the other provided by this function. The requests retry logic applies to failed DNS lookups, socket connections and connection timeouts, never to requests where data has made it to the server. This handles ChunkedEncodingError during transfer in its own retry loop. This can result in more retries than are specified in the retries parameter. """ filename = urllib.parse.urlparse(url).path.split('/')[-1] if local_filename is None: local_filename = os.path.join(dldir, filename) for i in range(retries + 1): if retries: max_retries = Retry(total=retries - i, backoff_factor=backoff_factor) adapter = HTTPAdapter(max_retries=max_retries) session = requests.Session() session.mount('http://', adapter) session.mount('https://', adapter) else: session = requests # the stream=True parameter keeps memory usage low r = session.get( url, stream=True, allow_redirects=True, headers=HEADERS, timeout=300 ) r.raise_for_status() try: with open(local_filename, 'wb') as f: for chunk in r.iter_content(chunk_size=1024): if chunk: # filter out keep-alive new chunks f.write(chunk) f.flush() return local_filename except ChunkedEncodingError as err: if i == retries: raise err logging.warning('Download interrupted, retrying...') time.sleep(backoff_factor * 2**i) raise ValueError("retries must be >= 0") def http_get(url, etag=None, timeout=600): """Download the content from the given URL by making a GET request. If an ETag is given, it will do a HEAD request first, to see if the content changed. Parameters ---------- url The URL to download from. etag The last ETag to be used for the request (optional). Returns ------- A tuple consisting of: - The raw content that was downloaded or None if it did not change - The new eTag as returned by the HTTP request """ # TODO disable TLS Session IDs and TLS Session Tickets # (plain text cookie visible to anyone who can see the network traffic) if etag: r = requests.head(url, headers=HEADERS, timeout=timeout) r.raise_for_status() if 'ETag' in r.headers and etag == r.headers['ETag']: return None, etag r = requests.get(url, headers=HEADERS, timeout=timeout) r.raise_for_status() new_etag = None if 'ETag' in r.headers: new_etag = r.headers['ETag'] return r.content, new_etag ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/nightly.py0000644000175000017500000005126714620351225017543 0ustar00hanshans#!/usr/bin/env python3 """Set up an app build for a nightly build repo.""" # # nightly.py - part of the FDroid server tools # Copyright (C) 2017 Hans-Christoph Steiner # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import base64 import datetime import git import hashlib import logging import os import paramiko import platform import shutil import ssl import subprocess import sys import tempfile import yaml from urllib.parse import urlparse from argparse import ArgumentParser from typing import Optional from . import _ from . import common from .exception import VCSException # hard coded defaults for Android ~/.android/debug.keystore files # https://developers.google.com/android/guides/client-auth KEYSTORE_FILE = os.path.join(os.getenv('HOME'), '.android', 'debug.keystore') PASSWORD = 'android' # nosec B105 standard hardcoded password for debug keystores KEY_ALIAS = 'androiddebugkey' DISTINGUISHED_NAME = 'CN=Android Debug,O=Android,C=US' # standard suffix for naming fdroid git repos NIGHTLY = '-nightly' def _get_keystore_secret_var(keystore: str) -> str: """Get keystore secret as base64. Parameters ---------- keystore The path of the keystore. Returns ------- base64_secret The keystore secret as base64 string. """ with open(keystore, 'rb') as fp: return base64.standard_b64encode(fp.read()).decode('ascii') def _ssh_key_from_debug_keystore(keystore: Optional[str] = None) -> str: """Convert a debug keystore to an SSH private key. This leaves the original keystore file in place. Parameters ---------- keystore The keystore to convert to a SSH private key. Returns ------- key_path The SSH private key file path in the temporary directory. """ if keystore is None: # set this here so it can be overridden in the tests # TODO convert this to a class to get rid of this nonsense keystore = KEYSTORE_FILE tmp_dir = tempfile.mkdtemp(prefix='.') privkey = os.path.join(tmp_dir, '.privkey') key_pem = os.path.join(tmp_dir, '.key.pem') p12 = os.path.join(tmp_dir, '.keystore.p12') _config = dict() common.fill_config_defaults(_config) subprocess.check_call( [ _config['keytool'], '-importkeystore', '-srckeystore', keystore, '-srcalias', KEY_ALIAS, '-srcstorepass', PASSWORD, '-srckeypass', PASSWORD, '-destkeystore', p12, '-destalias', KEY_ALIAS, '-deststorepass', PASSWORD, '-destkeypass', PASSWORD, '-deststoretype', 'PKCS12', ], env={'LC_ALL': 'C.UTF-8'}, ) subprocess.check_call( [ 'openssl', 'pkcs12', '-in', p12, '-out', key_pem, '-passin', 'pass:' + PASSWORD, '-passout', 'pass:' + PASSWORD, ], env={'LC_ALL': 'C.UTF-8'}, ) # OpenSSL 3.0 changed the default output format from PKCS#1 to # PKCS#8, which paramiko does not support. # https://www.openssl.org/docs/man3.0/man1/openssl-rsa.html#traditional # https://github.com/paramiko/paramiko/issues/1015 openssl_rsa_cmd = ['openssl', 'rsa'] if ssl.OPENSSL_VERSION_INFO[0] >= 3: openssl_rsa_cmd += ['-traditional'] subprocess.check_call( openssl_rsa_cmd + [ '-in', key_pem, '-out', privkey, '-passin', 'pass:' + PASSWORD, ], env={'LC_ALL': 'C.UTF-8'}, ) os.remove(key_pem) os.remove(p12) os.chmod(privkey, 0o600) # os.umask() should cover this, but just in case rsakey = paramiko.RSAKey.from_private_key_file(privkey) fingerprint = ( base64.b64encode(hashlib.sha256(rsakey.asbytes()).digest()) .decode('ascii') .rstrip('=') ) ssh_private_key_file = os.path.join( tmp_dir, 'debug_keystore_' + fingerprint.replace('/', '_') + '_id_rsa' ) shutil.move(privkey, ssh_private_key_file) pub = rsakey.get_name() + ' ' + rsakey.get_base64() + ' ' + ssh_private_key_file with open(ssh_private_key_file + '.pub', 'w') as fp: fp.write(pub) logging.info(_('\nSSH public key to be used as deploy key:') + '\n' + pub) return ssh_private_key_file def get_repo_base_url(clone_url: str, repo_git_base: str, force_type: Optional[str] = None) -> str: """Generate the base URL for the F-Droid repository. Parameters ---------- clone_url The URL to clone the Git repository. repo_git_base The project path of the Git repository at the Git forge. force_type The Git forge of the project. Returns ------- repo_base_url The base URL of the F-Droid repository. """ if force_type is None: force_type = urlparse(clone_url).netloc if force_type == 'gitlab.com': return clone_url + '/-/raw/master/fdroid' if force_type == 'github.com': return 'https://raw.githubusercontent.com/%s/master/fdroid' % repo_git_base print(_('ERROR: unsupported git host "%s", patches welcome!') % force_type) sys.exit(1) def main(): """Deploy to F-Droid repository or generate SSH private key from keystore. The behaviour of this function is influenced by the configuration file as well as command line parameters. Raises ------ :exc:`~fdroidserver.exception.VCSException` If the nightly Git repository could not be cloned during an attempt to deploy. """ parser = ArgumentParser() common.setup_global_opts(parser) parser.add_argument( "--keystore", default=KEYSTORE_FILE, help=_("Specify which debug keystore file to use."), ) parser.add_argument( "--show-secret-var", action="store_true", default=False, help=_("Print the secret variable to the terminal for easy copy/paste"), ) parser.add_argument( "--keep-private-keys", action="store_true", default=False, help=_("Do not remove the private keys generated from the keystore"), ) parser.add_argument( "--no-deploy", action="store_true", default=False, help=_("Do not deploy the new files to the repo"), ) parser.add_argument( "--file", default='app/build/outputs/apk/*.apk', help=_('The file to be included in the repo (path or glob)'), ) parser.add_argument( "--no-checksum", action="store_true", default=False, help=_("Don't use rsync checksums"), ) archive_older_unset = -1 parser.add_argument( "--archive-older", type=int, default=archive_older_unset, help=_("Set maximum releases in repo before older ones are archived"), ) # TODO add --with-btlog options = common.parse_args(parser) # force a tighter umask since this writes private key material umask = os.umask(0o077) if 'CI' in os.environ: v = os.getenv('DEBUG_KEYSTORE') debug_keystore = None if v: debug_keystore = base64.b64decode(v) if not debug_keystore: logging.error(_('DEBUG_KEYSTORE is not set or the value is incomplete')) sys.exit(1) os.makedirs(os.path.dirname(KEYSTORE_FILE), exist_ok=True) if os.path.exists(KEYSTORE_FILE): logging.warning(_('overwriting existing {path}').format(path=KEYSTORE_FILE)) with open(KEYSTORE_FILE, 'wb') as fp: fp.write(debug_keystore) repo_basedir = os.path.join(os.getcwd(), 'fdroid') repodir = os.path.join(repo_basedir, 'repo') cibase = os.getcwd() os.makedirs(repodir, exist_ok=True) # the 'master' branch is hardcoded in fdroidserver/deploy.py if 'CI_PROJECT_PATH' in os.environ and 'CI_PROJECT_URL' in os.environ: # we are in GitLab CI repo_git_base = os.getenv('CI_PROJECT_PATH') + NIGHTLY clone_url = os.getenv('CI_PROJECT_URL') + NIGHTLY repo_base = get_repo_base_url(clone_url, repo_git_base, force_type='gitlab.com') servergitmirror = 'git@' + urlparse(clone_url).netloc + ':' + repo_git_base deploy_key_url = clone_url + '/-/settings/repository#js-deploy-keys-settings' git_user_name = os.getenv('GITLAB_USER_NAME') git_user_email = os.getenv('GITLAB_USER_EMAIL') elif 'TRAVIS_REPO_SLUG' in os.environ: # we are in Travis CI repo_git_base = os.getenv('TRAVIS_REPO_SLUG') + NIGHTLY clone_url = 'https://github.com/' + repo_git_base repo_base = get_repo_base_url(clone_url, repo_git_base, force_type='github.com') servergitmirror = 'git@github.com:' + repo_git_base deploy_key_url = ('https://github.com/' + repo_git_base + '/settings/keys' + '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys') git_user_name = repo_git_base git_user_email = os.getenv('USER') + '@' + platform.node() elif ( 'CIRCLE_REPOSITORY_URL' in os.environ and 'CIRCLE_PROJECT_USERNAME' in os.environ and 'CIRCLE_PROJECT_REPONAME' in os.environ ): # we are in Circle CI repo_git_base = (os.getenv('CIRCLE_PROJECT_USERNAME') + '/' + os.getenv('CIRCLE_PROJECT_REPONAME') + NIGHTLY) clone_url = os.getenv('CIRCLE_REPOSITORY_URL') + NIGHTLY repo_base = get_repo_base_url(clone_url, repo_git_base, force_type='github.com') servergitmirror = 'git@' + urlparse(clone_url).netloc + ':' + repo_git_base deploy_key_url = ('https://github.com/' + repo_git_base + '/settings/keys' + '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys') git_user_name = os.getenv('CIRCLE_USERNAME') git_user_email = git_user_name + '@' + platform.node() elif 'GITHUB_ACTIONS' in os.environ: # we are in Github actions repo_git_base = (os.getenv('GITHUB_REPOSITORY') + NIGHTLY) clone_url = (os.getenv('GITHUB_SERVER_URL') + '/' + repo_git_base) repo_base = get_repo_base_url(clone_url, repo_git_base, force_type='github.com') servergitmirror = 'git@' + urlparse(clone_url).netloc + ':' + repo_git_base deploy_key_url = ('https://github.com/' + repo_git_base + '/settings/keys' + '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys') git_user_name = os.getenv('GITHUB_ACTOR') git_user_email = git_user_name + '@' + platform.node() else: print(_('ERROR: unsupported CI type, patches welcome!')) sys.exit(1) repo_url = repo_base + '/repo' git_mirror_path = os.path.join(repo_basedir, 'git-mirror') git_mirror_fdroiddir = os.path.join(git_mirror_path, 'fdroid') git_mirror_repodir = os.path.join(git_mirror_fdroiddir, 'repo') git_mirror_metadatadir = os.path.join(git_mirror_fdroiddir, 'metadata') git_mirror_statsdir = os.path.join(git_mirror_fdroiddir, 'stats') if not os.path.isdir(git_mirror_repodir): logging.debug(_('cloning {url}').format(url=clone_url)) vcs = common.getvcs('git', clone_url, git_mirror_path) p = vcs.git(['clone', '--', vcs.remote, str(vcs.local)]) if p.returncode != 0: print('WARNING: only public git repos are supported!') raise VCSException('git clone %s failed:' % clone_url, p.output) if not os.path.isdir(git_mirror_repodir): os.makedirs(git_mirror_repodir, mode=0o755) mirror_git_repo = git.Repo.init(git_mirror_path) writer = mirror_git_repo.config_writer() writer.set_value('user', 'name', git_user_name) writer.set_value('user', 'email', git_user_email) writer.release() for remote in mirror_git_repo.remotes: mirror_git_repo.delete_remote(remote) readme_path = os.path.join(git_mirror_path, 'README.md') readme = ''' # {repo_git_base} This is an app repository for nightly versions. You can use it with the [F-Droid](https://f-droid.org/) Android app. [![{repo_url}]({repo_url}/icons/icon.png)](https://fdroid.link/#{repo_url}) Last updated: {date}'''.format(repo_git_base=repo_git_base, repo_url=repo_url, date=datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S UTC')) with open(readme_path, 'w') as fp: fp.write(readme) mirror_git_repo.git.add(all=True) mirror_git_repo.index.commit("update README") mirror_git_repo.git.add(all=True) mirror_git_repo.index.commit("update repo/website icon") os.chdir(repo_basedir) if os.path.isdir(git_mirror_repodir): common.local_rsync(options, git_mirror_repodir + '/', 'repo/') if os.path.isdir(git_mirror_metadatadir): common.local_rsync(options, git_mirror_metadatadir + '/', 'metadata/') if os.path.isdir(git_mirror_statsdir): common.local_rsync(options, git_mirror_statsdir + '/', 'stats/') ssh_private_key_file = _ssh_key_from_debug_keystore() # this is needed for GitPython to find the SSH key ssh_dir = os.path.join(os.getenv('HOME'), '.ssh') os.makedirs(ssh_dir, exist_ok=True) ssh_config = os.path.join(ssh_dir, 'config') logging.debug(_('adding IdentityFile to {path}').format(path=ssh_config)) with open(ssh_config, 'a') as fp: fp.write('\n\nHost *\n\tIdentityFile %s\n' % ssh_private_key_file) if options.archive_older == archive_older_unset: fdroid_size = common.get_dir_size(git_mirror_fdroiddir) max_size = common.GITLAB_COM_PAGES_MAX_SIZE if fdroid_size < max_size: options.archive_older = 20 else: options.archive_older = 3 print( 'WARNING: repo is %s over the GitLab Pages limit (%s)' % (fdroid_size - max_size, max_size) ) print('Setting --archive-older to 3') config = { 'identity_file': ssh_private_key_file, 'repo_name': repo_git_base, 'repo_url': repo_url, 'repo_description': 'Nightly builds from %s' % git_user_email, 'archive_name': repo_git_base + ' archive', 'archive_url': repo_base + '/archive', 'archive_description': 'Old nightly builds that have been archived.', 'archive_older': options.archive_older, 'servergitmirrors': [{"url": servergitmirror}], 'keystore': KEYSTORE_FILE, 'repo_keyalias': KEY_ALIAS, 'keystorepass': PASSWORD, 'keypass': PASSWORD, 'keydname': DISTINGUISHED_NAME, 'make_current_version_link': False, 'update_stats': True, } with open('config.yml', 'w') as fp: yaml.dump(config, fp, default_flow_style=False) os.chmod('config.yml', 0o600) config = common.read_config() common.assert_config_keystore(config) for root, dirs, files in os.walk(cibase): for d in dirs: if d == '.git' or d == '.gradle' or (d == 'fdroid' and root == cibase): dirs.remove(d) for f in files: if f.endswith('-debug.apk'): apkfilename = os.path.join(root, f) logging.debug( _('Stripping mystery signature from {apkfilename}').format( apkfilename=apkfilename ) ) destapk = os.path.join(repodir, os.path.basename(f)) os.chmod(apkfilename, 0o644) logging.debug( _( 'Resigning {apkfilename} with provided debug.keystore' ).format(apkfilename=os.path.basename(apkfilename)) ) common.sign_apk(apkfilename, destapk, KEY_ALIAS) if options.verbose: logging.debug(_('attempting bare SSH connection to test deploy key:')) try: subprocess.check_call( [ 'ssh', '-Tvi', ssh_private_key_file, '-oIdentitiesOnly=yes', '-oStrictHostKeyChecking=no', servergitmirror.split(':')[0], ] ) except subprocess.CalledProcessError: pass app_url = clone_url[: -len(NIGHTLY)] template = dict() template['AuthorName'] = clone_url.split('/')[4] template['AuthorWebSite'] = '/'.join(clone_url.split('/')[:4]) template['Categories'] = ['nightly'] template['SourceCode'] = app_url template['IssueTracker'] = app_url + '/issues' template['Summary'] = 'Nightly build of ' + urlparse(app_url).path[1:] template['Description'] = template['Summary'] with open('template.yml', 'w') as fp: yaml.dump(template, fp) subprocess.check_call( ['fdroid', 'update', '--rename-apks', '--create-metadata', '--verbose'], cwd=repo_basedir, ) common.local_rsync( options, repo_basedir + '/metadata/', git_mirror_metadatadir + '/' ) common.local_rsync(options, repo_basedir + '/stats/', git_mirror_statsdir + '/') mirror_git_repo.git.add(all=True) mirror_git_repo.index.commit("update app metadata") if not options.no_deploy: try: cmd = ['fdroid', 'deploy', '--verbose', '--no-keep-git-mirror-archive'] subprocess.check_call(cmd, cwd=repo_basedir) except subprocess.CalledProcessError: logging.error( _('cannot publish update, did you set the deploy key?') + '\n' + deploy_key_url ) sys.exit(1) if not options.keep_private_keys: os.remove(KEYSTORE_FILE) if shutil.rmtree.avoids_symlink_attacks: shutil.rmtree(os.path.dirname(ssh_private_key_file)) else: if not os.path.isfile(options.keystore): androiddir = os.path.dirname(options.keystore) if not os.path.exists(androiddir): os.mkdir(androiddir) logging.info(_('created {path}').format(path=androiddir)) logging.error(_('{path} does not exist! Create it by running:').format(path=options.keystore) + '\n keytool -genkey -v -keystore ' + options.keystore + ' -storepass android \\' + '\n -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000 \\' + '\n -dname "CN=Android Debug,O=Android,C=US"') sys.exit(1) ssh_dir = os.path.join(os.getenv('HOME'), '.ssh') privkey = _ssh_key_from_debug_keystore(options.keystore) if os.path.exists(ssh_dir): ssh_private_key_file = os.path.join(ssh_dir, os.path.basename(privkey)) shutil.move(privkey, ssh_private_key_file) shutil.move(privkey + '.pub', ssh_private_key_file + '.pub') if shutil.rmtree.avoids_symlink_attacks: shutil.rmtree(os.path.dirname(privkey)) if options.show_secret_var: debug_keystore = _get_keystore_secret_var(options.keystore) print( _('\n{path} encoded for the DEBUG_KEYSTORE secret variable:').format( path=options.keystore ) ) print(debug_keystore) os.umask(umask) if __name__ == "__main__": main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/publish.py0000644000175000017500000004175714620351225017536 0ustar00hanshans#!/usr/bin/env python3 # # publish.py - part of the FDroid server tools # Copyright (C) 2010-13, Ciaran Gultnieks, ciaran@ciarang.com # Copyright (C) 2013-2014 Daniel Martí # Copyright (C) 2021 Felix C. Stegerman # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . """Sign APKs using keys or via reproducible builds signature copying. This command takes unsigned APKs and signs them. It looks for unsigned APKs in the unsigned/ directory and puts successfully signed APKs into the repo/ directory. The default is to run in a kind of batch mode, where it will only quit on certain kinds of errors. It mostly reports success by moving an APK from unsigned/ to repo/ """ import sys import os import re import shutil import glob import hashlib from argparse import ArgumentParser from collections import OrderedDict import logging from gettext import ngettext import json import time import zipfile from . import _ from . import common from . import metadata from .common import FDroidPopen from .exception import BuildException, FDroidException config = None start_timestamp = time.gmtime() def publish_source_tarball(apkfilename, unsigned_dir, output_dir): """Move the source tarball into the output directory...""" tarfilename = apkfilename[:-4] + '_src.tar.gz' tarfile = os.path.join(unsigned_dir, tarfilename) if os.path.exists(tarfile): shutil.move(tarfile, os.path.join(output_dir, tarfilename)) logging.debug('...published %s', tarfilename) else: logging.debug('...no source tarball for %s', apkfilename) def key_alias(appid): """No summary. Get the alias which F-Droid uses to indentify the singing key for this App in F-Droids keystore. """ if config and 'keyaliases' in config and appid in config['keyaliases']: # For this particular app, the key alias is overridden... keyalias = config['keyaliases'][appid] if keyalias.startswith('@'): m = hashlib.md5() # nosec just used to generate a keyalias m.update(keyalias[1:].encode('utf-8')) keyalias = m.hexdigest()[:8] return keyalias else: m = hashlib.md5() # nosec just used to generate a keyalias m.update(appid.encode('utf-8')) return m.hexdigest()[:8] def read_fingerprints_from_keystore(): """Obtain a dictionary containing all singning-key fingerprints which are managed by F-Droid, grouped by appid.""" env_vars = {'LC_ALL': 'C.UTF-8', 'FDROID_KEY_STORE_PASS': config['keystorepass']} cmd = [ config['keytool'], '-list', '-v', '-keystore', config['keystore'], '-storepass:env', 'FDROID_KEY_STORE_PASS', ] if config['keystore'] == 'NONE': cmd += config['smartcardoptions'] p = FDroidPopen(cmd, envs=env_vars, output=False) if p.returncode != 0: raise FDroidException('could not read keystore {}'.format(config['keystore'])) realias = re.compile('Alias name: (?P.+)' + os.linesep) resha256 = re.compile(r'\s+SHA256: (?P[:0-9A-F]{95})' + os.linesep) fps = {} for block in p.output.split(('*' * 43) + os.linesep + '*' * 43): s_alias = realias.search(block) s_sha256 = resha256.search(block) if s_alias and s_sha256: sigfp = s_sha256.group('sha256').replace(':', '').lower() fps[s_alias.group('alias')] = sigfp return fps def sign_sig_key_fingerprint_list(jar_file): """Sign the list of app-signing key fingerprints. This is used primaryily by fdroid update to determine which APKs where built and signed by F-Droid and which ones were manually added by users. """ cmd = [config['jarsigner']] cmd += '-keystore', config['keystore'] cmd += '-storepass:env', 'FDROID_KEY_STORE_PASS' cmd += '-digestalg', 'SHA1' cmd += '-sigalg', 'SHA1withRSA' cmd += jar_file, config['repo_keyalias'] if config['keystore'] == 'NONE': cmd += config['smartcardoptions'] else: # smardcards never use -keypass cmd += '-keypass:env', 'FDROID_KEY_PASS' env_vars = { 'FDROID_KEY_STORE_PASS': config['keystorepass'], 'FDROID_KEY_PASS': config.get('keypass', ""), } p = common.FDroidPopen(cmd, envs=env_vars) if p.returncode != 0: raise FDroidException("Failed to sign '{}'!".format(jar_file)) def store_stats_fdroid_signing_key_fingerprints(appids, indent=None): """Store list of all signing-key fingerprints for given appids to HD. This list will later on be needed by fdroid update. """ if not os.path.exists('stats'): os.makedirs('stats') data = OrderedDict() fps = read_fingerprints_from_keystore() for appid in sorted(appids): alias = key_alias(appid) if alias in fps: data[appid] = {'signer': fps[key_alias(appid)]} jar_file = os.path.join('stats', 'publishsigkeys.jar') with zipfile.ZipFile(jar_file, 'w', zipfile.ZIP_DEFLATED) as jar: jar.writestr('publishsigkeys.json', json.dumps(data, indent=indent)) sign_sig_key_fingerprint_list(jar_file) def status_update_json(generatedKeys, signedApks): """Output a JSON file with metadata about this run.""" logging.debug(_('Outputting JSON')) output = common.setup_status_output(start_timestamp) output['apksigner'] = shutil.which(config.get('apksigner', '')) output['jarsigner'] = shutil.which(config.get('jarsigner', '')) output['keytool'] = shutil.which(config.get('keytool', '')) if generatedKeys: output['generatedKeys'] = generatedKeys if signedApks: output['signedApks'] = signedApks common.write_status_json(output) def check_for_key_collisions(allapps): """Make sure there's no collision in keyaliases from apps. It was suggested at https://dev.guardianproject.info/projects/bazaar/wiki/FDroid_Audit that a package could be crafted, such that it would use the same signing key as an existing app. While it may be theoretically possible for such a colliding package ID to be generated, it seems virtually impossible that the colliding ID would be something that would be a) a valid package ID, and b) a sane-looking ID that would make its way into the repo. Nonetheless, to be sure, before publishing we check that there are no collisions, and refuse to do any publishing if that's the case. Parameters ---------- allapps a dict of all apps to process Returns ------- a list of all aliases corresponding to allapps """ allaliases = [] for appid in allapps: m = hashlib.md5() # nosec just used to generate a keyalias m.update(appid.encode('utf-8')) keyalias = m.hexdigest()[:8] if keyalias in allaliases: logging.error(_("There is a keyalias collision - publishing halted")) sys.exit(1) allaliases.append(keyalias) return allaliases def create_key_if_not_existing(keyalias): """Ensure a signing key with the given keyalias exists. Returns ------- boolean True if a new key was created, False otherwise """ # See if we already have a key for this application, and # if not generate one... env_vars = { 'LC_ALL': 'C.UTF-8', 'FDROID_KEY_STORE_PASS': config['keystorepass'], 'FDROID_KEY_PASS': config.get('keypass', ""), } cmd = [ config['keytool'], '-list', '-alias', keyalias, '-keystore', config['keystore'], '-storepass:env', 'FDROID_KEY_STORE_PASS', ] if config['keystore'] == 'NONE': cmd += config['smartcardoptions'] p = FDroidPopen(cmd, envs=env_vars) if p.returncode != 0: logging.info("Key does not exist - generating...") cmd = [ config['keytool'], '-genkey', '-keystore', config['keystore'], '-alias', keyalias, '-keyalg', 'RSA', '-keysize', '2048', '-validity', '10000', '-storepass:env', 'FDROID_KEY_STORE_PASS', '-dname', config['keydname'], ] if config['keystore'] == 'NONE': cmd += config['smartcardoptions'] else: cmd += '-keypass:env', 'FDROID_KEY_PASS' p = FDroidPopen(cmd, envs=env_vars) if p.returncode != 0: raise BuildException("Failed to generate key", p.output) return True else: return False def main(): global config # Parse command line... parser = ArgumentParser( usage="%(prog)s [options] " "[APPID[:VERCODE] [APPID[:VERCODE] ...]]" ) common.setup_global_opts(parser) parser.add_argument( "-e", "--error-on-failed", action="store_true", default=False, help=_("When signing or verifying fails, exit with an error code."), ) parser.add_argument( "appid", nargs='*', help=_("application ID with optional versionCode in the form APPID[:VERCODE]"), ) metadata.add_metadata_arguments(parser) options = common.parse_args(parser) metadata.warnings_action = options.W config = common.read_config() if not ('jarsigner' in config and 'keytool' in config): logging.critical( _('Java JDK not found! Install in standard location or set java_paths!') ) sys.exit(1) common.assert_config_keystore(config) log_dir = 'logs' if not os.path.isdir(log_dir): logging.info(_("Creating log directory")) os.makedirs(log_dir) tmp_dir = 'tmp' if not os.path.isdir(tmp_dir): logging.info(_("Creating temporary directory")) os.makedirs(tmp_dir) output_dir = 'repo' if not os.path.isdir(output_dir): logging.info(_("Creating output directory")) os.makedirs(output_dir) unsigned_dir = 'unsigned' if not os.path.isdir(unsigned_dir): logging.warning(_("No unsigned directory - nothing to do")) sys.exit(1) binaries_dir = os.path.join(unsigned_dir, 'binaries') if not config['keystore'] == "NONE" and not os.path.exists(config['keystore']): logging.error("Config error - missing '{0}'".format(config['keystore'])) sys.exit(1) allapps = metadata.read_metadata() vercodes = common.read_pkg_args(options.appid, True) common.get_metadata_files(vercodes) # only check appids signed_apks = dict() generated_keys = dict() allaliases = check_for_key_collisions(allapps) logging.info( ngettext( '{0} app, {1} key aliases', '{0} apps, {1} key aliases', len(allapps) ).format(len(allapps), len(allaliases)) ) failed = 0 # Process any APKs or ZIPs that are waiting to be signed... for apkfile in sorted( glob.glob(os.path.join(unsigned_dir, '*.apk')) + glob.glob(os.path.join(unsigned_dir, '*.zip')) ): appid, vercode = common.publishednameinfo(apkfile) apkfilename = os.path.basename(apkfile) if vercodes and appid not in vercodes: continue if appid in vercodes and vercodes[appid]: if vercode not in vercodes[appid]: continue logging.info(_("Processing {apkfilename}").format(apkfilename=apkfile)) # There ought to be valid metadata for this app, otherwise why are we # trying to publish it? if appid not in allapps: logging.error( "Unexpected {0} found in unsigned directory".format(apkfilename) ) sys.exit(1) app = allapps[appid] build = None for b in app.get("Builds", ()): if b.get("versionCode") == vercode: build = b if app.Binaries or (build and build.binary): # It's an app where we build from source, and verify the apk # contents against a developer's binary, and then publish their # version if everything checks out. # The binary should already have been retrieved during the build # process. srcapk = re.sub(r'\.apk$', '.binary.apk', apkfile) srcapk = srcapk.replace(unsigned_dir, binaries_dir) if not os.path.isfile(srcapk): logging.error("...reference binary missing - publish skipped: " "'{refpath}'".format(refpath=srcapk)) failed += 1 else: # Compare our unsigned one with the downloaded one... compare_result = common.verify_apks(srcapk, apkfile, tmp_dir) if compare_result: logging.error("...verification failed - publish skipped : " "{result}".format(result=compare_result)) failed += 1 else: # Success! So move the downloaded file to the repo, and remove # our built version. shutil.move(srcapk, os.path.join(output_dir, apkfilename)) os.remove(apkfile) publish_source_tarball(apkfilename, unsigned_dir, output_dir) logging.info('Published ' + apkfilename) elif apkfile.endswith('.zip'): # OTA ZIPs built by fdroid do not need to be signed by jarsigner, # just to be moved into place in the repo shutil.move(apkfile, os.path.join(output_dir, apkfilename)) publish_source_tarball(apkfilename, unsigned_dir, output_dir) logging.info('Published ' + apkfilename) else: # It's a 'normal' app, i.e. we sign and publish it... skipsigning = False # First we handle signatures for this app from local metadata signingfiles = common.metadata_find_developer_signing_files(appid, vercode) if signingfiles: # There's a signature of the app developer present in our # metadata. This means we're going to prepare both a locally # signed APK and a version signed with the developers key. signature_file, _ignored, manifest, v2_files = signingfiles with open(signature_file, 'rb') as f: devfp = common.signer_fingerprint_short( common.get_certificate(f.read()) ) devsigned = '{}_{}_{}.apk'.format(appid, vercode, devfp) devsignedtmp = os.path.join(tmp_dir, devsigned) common.apk_implant_signatures(apkfile, devsignedtmp, manifest=manifest) if common.verify_apk_signature(devsignedtmp): shutil.move(devsignedtmp, os.path.join(output_dir, devsigned)) else: os.remove(devsignedtmp) logging.error('...verification failed - skipping: %s', devsigned) skipsigning = True failed += 1 # Now we sign with the F-Droid key. if not skipsigning: keyalias = key_alias(appid) logging.info("Key alias: " + keyalias) if create_key_if_not_existing(keyalias): generated_keys[appid] = keyalias signed_apk_path = os.path.join(output_dir, apkfilename) if os.path.exists(signed_apk_path): raise BuildException("Refusing to sign '{0}' file exists in both " "{1} and {2} folder.".format(apkfilename, unsigned_dir, output_dir)) # Sign the application... common.sign_apk(apkfile, signed_apk_path, keyalias) if appid not in signed_apks: signed_apks[appid] = [] signed_apks[appid].append({"keyalias": keyalias, "filename": apkfile}) publish_source_tarball(apkfilename, unsigned_dir, output_dir) logging.info('Published ' + apkfilename) store_stats_fdroid_signing_key_fingerprints(allapps.keys()) status_update_json(generated_keys, signed_apks) logging.info('published list signing-key fingerprints') if failed: logging.error(_('%d APKs failed to be signed or verified!') % failed) if options.error_on_failed: sys.exit(failed) if __name__ == "__main__": main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/readmeta.py0000644000175000017500000000220614620351225017634 0ustar00hanshans#!/usr/bin/env python3 # # readmeta.py - part of the FDroid server tools # Copyright (C) 2014 Daniel Martí # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from argparse import ArgumentParser from . import common from . import metadata def main(): parser = ArgumentParser() common.setup_global_opts(parser) metadata.add_metadata_arguments(parser) options = parser.parse_args() metadata.warnings_action = options.W common.read_config() metadata.read_metadata() if __name__ == "__main__": main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/rewritemeta.py0000644000175000017500000000703214620351225020404 0ustar00hanshans#!/usr/bin/env python3 # # rewritemeta.py - part of the FDroid server tools # This cleans up the original .yml metadata file format. # Copyright (C) 2010-12, Ciaran Gultnieks, ciaran@ciarang.com # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from argparse import ArgumentParser import logging import io import tempfile import shutil from pathlib import Path from . import _ from . import common from . import metadata config = None def proper_format(app): s = io.StringIO() # TODO: currently reading entire file again, should reuse first # read in metadata.py cur_content = Path(app.metadatapath).read_text(encoding='utf-8') if Path(app.metadatapath).suffix == '.yml': metadata.write_yaml(s, app) content = s.getvalue() s.close() return content == cur_content def remove_blank_flags_from_builds(builds): """Remove unset entries from Builds so they are not written out.""" if not builds: return list() newbuilds = list() for build in builds: new = dict() for k in metadata.build_flags: v = build.get(k) # 0 is valid value, it should not be stripped if v is None or v is False or v == '' or v == dict() or v == list(): continue new[k] = v newbuilds.append(new) return newbuilds def main(): global config parser = ArgumentParser() common.setup_global_opts(parser) parser.add_argument( "-l", "--list", action="store_true", default=False, help=_("List files that would be reformatted (dry run)"), ) parser.add_argument( "appid", nargs='*', help=_("application ID of file to operate on") ) metadata.add_metadata_arguments(parser) options = common.parse_args(parser) metadata.warnings_action = options.W config = common.read_config() # Get all apps... allapps = metadata.read_metadata(options.appid) apps = common.read_app_args(options.appid, allapps, False) for appid, app in apps.items(): path = Path(app.metadatapath) if path.suffix == '.yml': logging.info(_("Rewriting '{appid}'").format(appid=appid)) else: logging.warning(_('Cannot rewrite "{path}"').format(path=path)) continue if options.list: if not proper_format(app): print(path) continue # TODO these should be moved to metadata.write_yaml() builds = remove_blank_flags_from_builds(app.get('Builds')) if builds: app['Builds'] = builds # rewrite to temporary file before overwriting existing # file in case there's a bug in write_metadata with tempfile.TemporaryDirectory() as tmpdir: tmp_path = Path(tmpdir) / path.name metadata.write_metadata(tmp_path, app) shutil.move(tmp_path, path) logging.debug(_("Finished")) if __name__ == "__main__": main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/scanner.py0000644000175000017500000013136214620351225017511 0ustar00hanshans#!/usr/bin/env python3 # # scanner.py - part of the FDroid server tools # Copyright (C) 2010-13, Ciaran Gultnieks, ciaran@ciarang.com # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import os import re import sys import json import imghdr import logging import zipfile import itertools import traceback import urllib.parse import urllib.request from argparse import ArgumentParser from tempfile import TemporaryDirectory from pathlib import Path from datetime import datetime, timedelta from dataclasses import dataclass, field, fields from enum import IntEnum from . import _ from . import common from . import metadata from .exception import BuildException, VCSException, ConfigurationException from . import scanner @dataclass class MessageStore: infos: list = field(default_factory=list) warnings: list = field(default_factory=list) errors: list = field(default_factory=list) MAVEN_URL_REGEX = re.compile(r"""\smaven\s*(?:{.*?(?:setUrl|url)|\(\s*(?:url)?)\s*=?\s*(?:uri|URI|Uri\.create)?\(?\s*["']?([^\s"']+)["']?[^})]*[)}]""", re.DOTALL) SCANNER_CACHE_VERSION = 1 class ExitCode(IntEnum): NONFREE_CODE = 1 def get_gradle_compile_commands(build): compileCommands = ['compile', 'provided', 'apk', 'implementation', 'classpath', 'api', 'compileOnly', 'runtimeOnly'] buildTypes = ['', 'release'] flavors = [''] if build.gradle and build.gradle != ['yes']: flavors += build.gradle commands = [''.join(c) for c in itertools.product(flavors, buildTypes, compileCommands)] return [re.compile(r'\s*' + c, re.IGNORECASE) for c in commands] def get_embedded_classes(apkfile, depth=0): """ Get the list of Java classes embedded into all DEX files. :return: set of Java classes names as string """ if depth > 10: # zipbomb protection return {_('Max recursion depth in ZIP file reached: %s') % apkfile} archive_regex = re.compile(r'.*\.(aab|aar|apk|apks|jar|war|xapk|zip)$') class_regex = re.compile(r'classes.*\.dex') classes = set() try: with TemporaryDirectory() as tmp_dir, zipfile.ZipFile(apkfile, 'r') as apk_zip: for info in apk_zip.infolist(): # apk files can contain apk files, again with apk_zip.open(info) as apk_fp: if zipfile.is_zipfile(apk_fp): classes = classes.union(get_embedded_classes(apk_fp, depth + 1)) if not archive_regex.search(info.filename): classes.add( 'ZIP file without proper file extension: %s' % info.filename ) continue with apk_zip.open(info.filename) as fp: file_magic = fp.read(3) if file_magic == b'dex': if not class_regex.search(info.filename): classes.add('DEX file with fake name: %s' % info.filename) apk_zip.extract(info, tmp_dir) run = common.SdkToolsPopen( ["dexdump", '{}/{}'.format(tmp_dir, info.filename)], output=False, ) classes = classes.union(set(re.findall(r'[A-Z]+((?:\w+\/)+\w+)', run.output))) except zipfile.BadZipFile as ex: return {_('Problem with ZIP file: %s, error %s') % (apkfile, ex)} return classes def _datetime_now(): """Get datetime.now(), using this funciton allows mocking it for testing.""" return datetime.utcnow() def _scanner_cachedir(): """Get `Path` to fdroidserver cache dir.""" cfg = common.get_config() if not cfg: raise ConfigurationException('config not initialized') if "cachedir_scanner" not in cfg: raise ConfigurationException("could not load 'cachedir_scanner' from config") cachedir = Path(cfg["cachedir_scanner"]) cachedir.mkdir(exist_ok=True, parents=True) return cachedir class SignatureDataMalformedException(Exception): pass class SignatureDataOutdatedException(Exception): pass class SignatureDataCacheMissException(Exception): pass class SignatureDataNoDefaultsException(Exception): pass class SignatureDataVersionMismatchException(Exception): pass class SignatureDataController: def __init__(self, name, filename, url): self.name = name self.filename = filename self.url = url # by default we assume cache is valid indefinitely self.cache_duration = timedelta(days=999999) self.data = {} def check_data_version(self): if self.data.get("version") != SCANNER_CACHE_VERSION: raise SignatureDataVersionMismatchException() def check_last_updated(self): """ Check if the last_updated value is ok and raise an exception if expired or inaccessible. :raises SignatureDataMalformedException: when timestamp value is inaccessible or not parse-able :raises SignatureDataOutdatedException: when timestamp is older then `self.cache_duration` """ last_updated = self.data.get("last_updated", None) if last_updated: try: last_updated = datetime.fromtimestamp(last_updated) except ValueError as e: raise SignatureDataMalformedException() from e except TypeError as e: raise SignatureDataMalformedException() from e delta = (last_updated + self.cache_duration) - scanner._datetime_now() if delta > timedelta(seconds=0): logging.debug(_('next {name} cache update due in {time}').format( name=self.filename, time=delta )) else: raise SignatureDataOutdatedException() def fetch(self): try: self.fetch_signatures_from_web() self.write_to_cache() except Exception as e: raise Exception(_("downloading scanner signatures from '{}' failed").format(self.url)) from e def load(self): try: try: self.load_from_cache() self.verify_data() self.check_last_updated() except SignatureDataCacheMissException: self.load_from_defaults() except (SignatureDataOutdatedException, SignatureDataNoDefaultsException): self.fetch_signatures_from_web() self.write_to_cache() except (SignatureDataMalformedException, SignatureDataVersionMismatchException) as e: logging.critical(_("scanner cache is malformed! You can clear it with: '{clear}'").format( clear='rm -r {}'.format(common.get_config()['cachedir_scanner']) )) raise e def load_from_defaults(self): raise SignatureDataNoDefaultsException() def load_from_cache(self): sig_file = scanner._scanner_cachedir() / self.filename if not sig_file.exists(): raise SignatureDataCacheMissException() with open(sig_file) as f: self.set_data(json.load(f)) def write_to_cache(self): sig_file = scanner._scanner_cachedir() / self.filename with open(sig_file, "w", encoding="utf-8") as f: json.dump(self.data, f, indent=2) logging.debug("write '{}' to cache".format(self.filename)) def verify_data(self): """ Clean and validate `self.data`. Right now this function does just a basic key sanitation. """ self.check_data_version() valid_keys = ['timestamp', 'last_updated', 'version', 'signatures', 'cache_duration'] for k in list(self.data.keys()): if k not in valid_keys: del self.data[k] def set_data(self, new_data): self.data = new_data if 'cache_duration' in new_data: self.cache_duration = timedelta(seconds=new_data['cache_duration']) def fetch_signatures_from_web(self): if not self.url.startswith("https://"): raise Exception(_("can't open non-https url: '{};".format(self.url))) logging.debug(_("downloading '{}'").format(self.url)) with urllib.request.urlopen(self.url) as f: # nosec B310 scheme filtered above self.set_data(json.load(f)) self.data['last_updated'] = scanner._datetime_now().timestamp() class ExodusSignatureDataController(SignatureDataController): def __init__(self): super().__init__('Exodus signatures', 'exodus.json', 'https://reports.exodus-privacy.eu.org/api/trackers') self.cache_duration = timedelta(days=1) # refresh exodus cache after one day self.has_trackers_json_key = True def fetch_signatures_from_web(self): logging.debug(_("downloading '{}'").format(self.url)) data = { "signatures": {}, "timestamp": scanner._datetime_now().timestamp(), "last_updated": scanner._datetime_now().timestamp(), "version": SCANNER_CACHE_VERSION, } if not self.url.startswith("https://"): raise Exception(_("can't open non-https url: '{};".format(self.url))) with urllib.request.urlopen(self.url) as f: # nosec B310 scheme filtered above trackerlist = json.load(f) if self.has_trackers_json_key: trackerlist = trackerlist["trackers"].values() for tracker in trackerlist: if tracker.get('code_signature'): data["signatures"][tracker["name"]] = { "name": tracker["name"], "warn_code_signatures": [tracker["code_signature"]], # exodus also provides network signatures, unused atm. # "network_signatures": [tracker["network_signature"]], "AntiFeatures": ["Tracking"], # TODO "license": "NonFree" # We assume all trackers in exodus # are non-free, although free # trackers like piwik, acra, # etc. might be listed by exodus # too. } self.set_data(data) class EtipSignatureDataController(ExodusSignatureDataController): def __init__(self): super().__init__() self.name = 'ETIP signatures' self.filename = 'etip.json' self.url = 'https://etip.exodus-privacy.eu.org/api/trackers/?format=json' self.has_trackers_json_key = False class SUSSDataController(SignatureDataController): def __init__(self): super().__init__( 'SUSS', 'suss.json', 'https://fdroid.gitlab.io/fdroid-suss/suss.json' ) def load_from_defaults(self): self.set_data(json.loads(SUSS_DEFAULT)) class ScannerTool: def __init__(self): # we could add support for loading additional signature source # definitions from config.yml here self.scanner_data_lookup() options = common.get_options() options_refresh_scanner = options and options.refresh_scanner if options_refresh_scanner or common.get_config().get('refresh_scanner'): self.refresh() self.load() self.compile_regexes() def scanner_data_lookup(self): sigsources = common.get_config().get('scanner_signature_sources', []) logging.debug( "scanner is configured to use signature data from: '{}'" .format("', '".join(sigsources)) ) self.sdcs = [] for i, source_url in enumerate(sigsources): if source_url.lower() == 'suss': self.sdcs.append(SUSSDataController()) elif source_url.lower() == 'exodus': self.sdcs.append(ExodusSignatureDataController()) elif source_url.lower() == 'etip': self.sdcs.append(EtipSignatureDataController()) else: u = urllib.parse.urlparse(source_url) if u.scheme != 'https' or u.path == "": raise ConfigurationException( "Invalid 'scanner_signature_sources' configuration: '{}'. " "Has to be a valid HTTPS-URL or match a predefined " "constants: 'suss', 'exodus'".format(source_url) ) self.sdcs.append(SignatureDataController( source_url, '{}_{}'.format(i, os.path.basename(u.path)), source_url, )) def load(self): for sdc in self.sdcs: sdc.load() def compile_regexes(self): self.regexs = { 'err_code_signatures': {}, 'err_gradle_signatures': {}, 'warn_code_signatures': {}, 'warn_gradle_signatures': {}, } for sdc in self.sdcs: for signame, sigdef in sdc.data.get('signatures', {}).items(): for sig in sigdef.get('code_signatures', []): self.regexs['err_code_signatures'][sig] = re.compile('.*' + sig, re.IGNORECASE) for sig in sigdef.get('gradle_signatures', []): self.regexs['err_gradle_signatures'][sig] = re.compile('.*' + sig, re.IGNORECASE) for sig in sigdef.get('warn_code_signatures', []): self.regexs['warn_code_signatures'][sig] = re.compile('.*' + sig, re.IGNORECASE) for sig in sigdef.get('warn_gradle_signatures', []): self.regexs['warn_gradle_signatures'][sig] = re.compile('.*' + sig, re.IGNORECASE) def refresh(self): for sdc in self.sdcs: sdc.fetch_signatures_from_web() sdc.write_to_cache() def add(self, new_controller: SignatureDataController): self.sdcs.append(new_controller) self.compile_regexes() # TODO: change this from singleton instance to dependency injection # use `_get_tool()` instead of accessing this directly _SCANNER_TOOL = None def _get_tool(): """ Lazy loading function for getting a ScannerTool instance. ScannerTool initialization need to access `common.config` values. Those are only available after initialization through `common.read_config()`. So this factory assumes config was called at an erlier point in time. """ if not scanner._SCANNER_TOOL: scanner._SCANNER_TOOL = ScannerTool() return scanner._SCANNER_TOOL def scan_binary(apkfile): """Scan output of dexdump for known non-free classes.""" logging.info(_('Scanning APK with dexdump for known non-free classes.')) result = get_embedded_classes(apkfile) problems, warnings = 0, 0 for classname in result: for suspect, regexp in _get_tool().regexs['warn_code_signatures'].items(): if regexp.match(classname): logging.debug("Warning: found class '%s'" % classname) warnings += 1 for suspect, regexp in _get_tool().regexs['err_code_signatures'].items(): if regexp.match(classname): logging.debug("Problem: found class '%s'" % classname) problems += 1 if warnings: logging.warning(_("Found {count} warnings in {filename}").format(count=warnings, filename=apkfile)) if problems: logging.critical(_("Found {count} problems in {filename}").format(count=problems, filename=apkfile)) return problems def scan_source(build_dir, build=metadata.Build(), json_per_build=None): """Scan the source code in the given directory (and all subdirectories). Returns ------- the number of fatal problems encountered. """ count = 0 if not json_per_build: json_per_build = MessageStore() def suspects_found(s): for n, r in _get_tool().regexs['err_gradle_signatures'].items(): if r.match(s): yield n allowed_repos = [re.compile(r'^https://' + re.escape(repo) + r'/*') for repo in [ 'repo1.maven.org/maven2', # mavenCentral() 'jcenter.bintray.com', # jcenter() 'jitpack.io', 'www.jitpack.io', 'repo.maven.apache.org/maven2', 'oss.jfrog.org/artifactory/oss-snapshot-local', 'oss.sonatype.org/content/repositories/snapshots', 'oss.sonatype.org/content/repositories/releases', 'oss.sonatype.org/content/groups/public', 'oss.sonatype.org/service/local/staging/deploy/maven2', 's01.oss.sonatype.org/content/repositories/snapshots', 's01.oss.sonatype.org/content/repositories/releases', 's01.oss.sonatype.org/content/groups/public', 's01.oss.sonatype.org/service/local/staging/deploy/maven2', 'clojars.org/repo', # Clojure free software libs 'repo.clojars.org', # Clojure free software libs 's3.amazonaws.com/repo.commonsware.com', # CommonsWare 'plugins.gradle.org/m2', # Gradle plugin repo 'maven.google.com', # Google Maven Repo, https://developer.android.com/studio/build/dependencies.html#google-maven ] ] + [re.compile(r'^file://' + re.escape(repo) + r'/*') for repo in [ '/usr/share/maven-repo', # local repo on Debian installs ] ] scanignore = common.getpaths_map(build_dir, build.scanignore) scandelete = common.getpaths_map(build_dir, build.scandelete) scanignore_worked = set() scandelete_worked = set() def toignore(path_in_build_dir): for k, paths in scanignore.items(): for p in paths: if path_in_build_dir.startswith(p): scanignore_worked.add(k) return True return False def todelete(path_in_build_dir): for k, paths in scandelete.items(): for p in paths: if path_in_build_dir.startswith(p): scandelete_worked.add(k) return True return False def ignoreproblem(what, path_in_build_dir, json_per_build): """No summary. Parameters ---------- what: string describing the problem, will be printed in log messages path_in_build_dir path to the file relative to `build`-dir Returns ------- 0 as we explicitly ignore the file, so don't count an error """ msg = ('Ignoring %s at %s' % (what, path_in_build_dir)) logging.info(msg) if json_per_build is not None: json_per_build.infos.append([msg, path_in_build_dir]) return 0 def removeproblem(what, path_in_build_dir, filepath, json_per_build): """No summary. Parameters ---------- what: string describing the problem, will be printed in log messages path_in_build_dir path to the file relative to `build`-dir filepath Path (relative to our current path) to the file Returns ------- 0 as we deleted the offending file """ msg = ('Removing %s at %s' % (what, path_in_build_dir)) logging.info(msg) if json_per_build is not None: json_per_build.infos.append([msg, path_in_build_dir]) try: os.remove(filepath) except FileNotFoundError: # File is already gone, nothing to do. # This can happen if we find multiple problems in one file that is setup for scandelete # I.e. build.gradle files containig multiple unknown maven repos. pass return 0 def warnproblem(what, path_in_build_dir, json_per_build): """No summary. Parameters ---------- what: string describing the problem, will be printed in log messages path_in_build_dir path to the file relative to `build`-dir Returns ------- 0, as warnings don't count as errors """ if toignore(path_in_build_dir): return 0 logging.warning('Found %s at %s' % (what, path_in_build_dir)) if json_per_build is not None: json_per_build.warnings.append([what, path_in_build_dir]) return 0 def handleproblem(what, path_in_build_dir, filepath, json_per_build): """Dispatches to problem handlers (ignore, delete, warn). Or returns 1 for increasing the error count. Parameters ---------- what: string describing the problem, will be printed in log messages path_in_build_dir path to the file relative to `build`-dir filepath Path (relative to our current path) to the file Returns ------- 0 if the problem was ignored/deleted/is only a warning, 1 otherwise """ options = common.get_options() if toignore(path_in_build_dir): return ignoreproblem(what, path_in_build_dir, json_per_build) if todelete(path_in_build_dir): return removeproblem(what, path_in_build_dir, filepath, json_per_build) if 'src/test' in path_in_build_dir or '/test/' in path_in_build_dir: return warnproblem(what, path_in_build_dir, json_per_build) if options and 'json' in vars(options) and options.json: json_per_build.errors.append([what, path_in_build_dir]) if options and (options.verbose or not ('json' in vars(options) and options.json)): logging.error('Found %s at %s' % (what, path_in_build_dir)) return 1 def is_executable(path): return os.path.exists(path) and os.access(path, os.X_OK) textchars = bytearray({7, 8, 9, 10, 12, 13, 27} | set(range(0x20, 0x100)) - {0x7f}) def is_binary(path): d = None with open(path, 'rb') as f: d = f.read(1024) return bool(d.translate(None, textchars)) # False positives patterns for files that are binary and executable. safe_paths = [re.compile(r) for r in [ r".*/drawable[^/]*/.*\.png$", # png drawables r".*/mipmap[^/]*/.*\.png$", # png mipmaps ] ] def is_image_file(path): if imghdr.what(path) is not None: return True def safe_path(path_in_build_dir): for sp in safe_paths: if sp.match(path_in_build_dir): return True return False gradle_compile_commands = get_gradle_compile_commands(build) def is_used_by_gradle(line): return any(command.match(line) for command in gradle_compile_commands) # Iterate through all files in the source code for root, dirs, files in os.walk(build_dir, topdown=True): # It's topdown, so checking the basename is enough for ignoredir in ('.hg', '.git', '.svn', '.bzr'): if ignoredir in dirs: dirs.remove(ignoredir) for curfile in files: if curfile in ['.DS_Store']: continue # Path (relative) to the file filepath = os.path.join(root, curfile) if os.path.islink(filepath): continue path_in_build_dir = os.path.relpath(filepath, build_dir) if curfile in ('gradle-wrapper.jar', 'gradlew', 'gradlew.bat'): removeproblem(curfile, path_in_build_dir, filepath, json_per_build) elif curfile.endswith('.apk'): removeproblem( _('Android APK file'), path_in_build_dir, filepath, json_per_build ) elif curfile.endswith('.a'): count += handleproblem( _('static library'), path_in_build_dir, filepath, json_per_build ) elif curfile.endswith('.aar'): count += handleproblem( _('Android AAR library'), path_in_build_dir, filepath, json_per_build, ) elif curfile.endswith('.class'): count += handleproblem( _('Java compiled class'), path_in_build_dir, filepath, json_per_build, ) elif curfile.endswith('.dex'): count += handleproblem( _('Android DEX code'), path_in_build_dir, filepath, json_per_build ) elif curfile.endswith('.gz') or curfile.endswith('.tgz'): count += handleproblem( _('gzip file archive'), path_in_build_dir, filepath, json_per_build ) # We use a regular expression here to also match versioned shared objects like .so.0.0.0 elif re.match(r'.*\.so(\..+)*$', curfile): count += handleproblem( _('shared library'), path_in_build_dir, filepath, json_per_build ) elif curfile.endswith('.zip'): count += handleproblem( _('ZIP file archive'), path_in_build_dir, filepath, json_per_build ) elif curfile.endswith('.jar'): for name in suspects_found(curfile): count += handleproblem( 'usual suspect \'%s\'' % name, path_in_build_dir, filepath, json_per_build, ) count += handleproblem( _('Java JAR file'), path_in_build_dir, filepath, json_per_build ) elif curfile.endswith('.java'): if not os.path.isfile(filepath): continue with open(filepath, 'r', errors='replace') as f: for line in f: if 'DexClassLoader' in line: count += handleproblem( 'DexClassLoader', path_in_build_dir, filepath, json_per_build, ) break elif curfile.endswith('.gradle') or curfile.endswith('.gradle.kts'): if not os.path.isfile(filepath): continue with open(filepath, 'r', errors='replace') as f: lines = f.readlines() for i, line in enumerate(lines): if is_used_by_gradle(line): for name in suspects_found(line): count += handleproblem( "usual suspect \'%s\'" % (name), path_in_build_dir, filepath, json_per_build, ) noncomment_lines = [line for line in lines if not common.gradle_comment.match(line)] no_comments = re.sub(r'/\*.*?\*/', '', ''.join(noncomment_lines), flags=re.DOTALL) for url in MAVEN_URL_REGEX.findall(no_comments): if not any(r.match(url) for r in allowed_repos): count += handleproblem( 'unknown maven repo \'%s\'' % url, path_in_build_dir, filepath, json_per_build, ) elif os.path.splitext(path_in_build_dir)[1] in ['', '.bin', '.out', '.exe']: if is_binary(filepath): count += handleproblem( 'binary', path_in_build_dir, filepath, json_per_build ) elif is_executable(filepath): if is_binary(filepath) and not (safe_path(path_in_build_dir) or is_image_file(filepath)): warnproblem( _('executable binary, possibly code'), path_in_build_dir, json_per_build, ) for p in scanignore: if p not in scanignore_worked: logging.error(_('Unused scanignore path: %s') % p) count += 1 for p in scandelete: if p not in scandelete_worked: logging.error(_('Unused scandelete path: %s') % p) count += 1 return count def main(): parser = ArgumentParser( usage="%(prog)s [options] [(APPID[:VERCODE] | path/to.apk) ...]" ) common.setup_global_opts(parser) parser.add_argument("appid", nargs='*', help=_("application ID with optional versionCode in the form APPID[:VERCODE]")) parser.add_argument("-f", "--force", action="store_true", default=False, help=_("Force scan of disabled apps and builds.")) parser.add_argument("--json", action="store_true", default=False, help=_("Output JSON to stdout.")) parser.add_argument("-r", "--refresh", dest="refresh_scanner", action="store_true", default=False, help=_("fetch the latest version of signatures from the web")) parser.add_argument("-e", "--exit-code", action="store_true", default=False, help=_("Exit with a non-zero code if problems were found")) metadata.add_metadata_arguments(parser) options = common.parse_args(parser) metadata.warnings_action = options.W json_output = dict() if options.json: if options.verbose: logging.basicConfig(stream=sys.stderr, level=logging.DEBUG) else: logging.getLogger().setLevel(logging.ERROR) # initialize/load configuration values common.get_config() probcount = 0 appids = [] for apk in options.appid: if os.path.isfile(apk): count = scanner.scan_binary(apk) if count > 0: logging.warning( _('Scanner found {count} problems in {apk}').format( count=count, apk=apk ) ) probcount += count else: appids.append(apk) if not appids: if options.exit_code and probcount > 0: sys.exit(ExitCode.NONFREE_CODE) if options.refresh_scanner: _get_tool() return # Read all app and srclib metadata allapps = metadata.read_metadata() apps = common.read_app_args(appids, allapps, True) build_dir = 'build' if not os.path.isdir(build_dir): logging.info("Creating build directory") os.makedirs(build_dir) srclib_dir = os.path.join(build_dir, 'srclib') extlib_dir = os.path.join(build_dir, 'extlib') for appid, app in apps.items(): json_per_appid = dict() if app.Disabled and not options.force: logging.info(_("Skipping {appid}: disabled").format(appid=appid)) json_per_appid['disabled'] = MessageStore().infos.append( 'Skipping: disabled' ) continue try: if app.RepoType == 'srclib': build_dir = os.path.join('build', 'srclib', app.Repo) else: build_dir = os.path.join('build', appid) if app.get('Builds'): logging.info(_("Processing {appid}").format(appid=appid)) # Set up vcs interface and make sure we have the latest code... vcs = common.getvcs(app.RepoType, app.Repo, build_dir) else: logging.info(_("{appid}: no builds specified, running on current source state") .format(appid=appid)) json_per_build = MessageStore() json_per_appid['current-source-state'] = json_per_build count = scan_source(build_dir, json_per_build=json_per_build) if count > 0: logging.warning(_('Scanner found {count} problems in {appid}:') .format(count=count, appid=appid)) probcount += count app['Builds'] = [] for build in app.get('Builds', []): json_per_build = MessageStore() json_per_appid[build.versionCode] = json_per_build if build.disable and not options.force: logging.info("...skipping version %s - %s" % ( build.versionName, build.get('disable', build.commit[1:]))) continue logging.info("...scanning version " + build.versionName) # Prepare the source code... common.prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, False) count = scan_source(build_dir, build, json_per_build=json_per_build) if count > 0: logging.warning(_('Scanner found {count} problems in {appid}:{versionCode}:') .format(count=count, appid=appid, versionCode=build.versionCode)) probcount += count except BuildException as be: logging.warning('Could not scan app %s due to BuildException: %s' % ( appid, be)) probcount += 1 except VCSException as vcse: logging.warning('VCS error while scanning app %s: %s' % (appid, vcse)) probcount += 1 except Exception: logging.warning('Could not scan app %s due to unknown error: %s' % ( appid, traceback.format_exc())) probcount += 1 for k, v in json_per_appid.items(): if len(v.errors) or len(v.warnings) or len(v.infos): json_output[appid] = { k: dict((field.name, getattr(v, field.name)) for field in fields(v)) for k, v in json_per_appid.items() } break logging.info(_("Finished")) if options.json: print(json.dumps(json_output)) else: print(_("%d problems found") % probcount) if __name__ == "__main__": main() SUSS_DEFAULT = r'''{ "cache_duration": 86400, "signatures": { "com.android.billingclient": { "code_signatures": [ "com/android/billingclient" ], "gradle_signatures": [ "com.android.billingclient", "com.google.androidbrowserhelper:billing", "com.anjlab.android.iab.v3:library", "com.github.penn5:donations", "me.proton.core:payment-iap" ], "license": "NonFree" }, "com.bugsense": { "code_signatures": [ "com/bugsense" ], "gradle_signatures": [ "com.bugsense" ], "license": "NonFree" }, "com.cloudrail": { "code_signature": [ "com/cloudrail" ], "gradle_signatures": [ "com.cloudrail" ], "license": "NonFree" }, "com.crashlytics.sdk.android": { "code_signatures": [ "com/crashlytics" ], "gradle_signatures": [ "crashlytics" ], "license": "NonFree" }, "com.crittercism": { "code_signatures": [ "com/crittercism" ], "gradle_signatures": [ "com.crittercism" ], "license": "NonFree" }, "com.facebook.android": { "code_signatures": [ "com/facebook" ], "gradle_signatures": [ "com.facebook.android" ], "license": "NonFree" }, "com.flurry.android": { "code_signature": [ "com/flurry" ], "gradle_signatures": [ "com.flurry.android" ], "license": "NonFree" }, "com.github.junrar": { "code_signatures": [ "com/github/junrar" ], "gradle_signatures": [ "com.github.junrar:junrar" ], "license": "NonFree" }, "com.github.omicronapps.7-Zip-JBinding-4Android": { "gradle_signatures": [ "com.github.omicronapps:7-Zip-JBinding-4Android" ], "license": "NonFree", "name": "7-Zip-JBinding-4Android" }, "com.google.ads": { "code_signatures": [ "com/google/ads" ], "gradle_signatures": [ "com.google.ads", "com.google.android.exoplayer:extension-ima", "androidx.media3:media3-exoplayer-ima" ], "license": "NonFree" }, "com.google.android.gms": { "code_signatures": [ "com/google/android/gms" ], "gradle_signatures": [ "com.google.android.gms", "androidx.core:core-google-shortcuts", "androidx.media3:media3-cast", "androidx.media3:media3-datasource-cronet", "androidx.work:work-gcm", "com.google.android.exoplayer:extension-cast", "com.google.android.exoplayer:extension-cronet", "com.evernote:android-job", "com.cloudinary:cloudinary-android.*:2\\.[12]\\.", "com.pierfrancescosoffritti.androidyoutubeplayer:chromecast-sender", "com.yayandroid:locationmanager", "play-services", "xyz.belvi.mobilevision:barcodescanner" ], "license": "NonFree" }, "com.google.android.libraries": { "code_signatures": [ "com/google/android/libraries" ], "gradle_signatures": [ "com.google.android.libraries" ], "license": "NonFree" }, "com.google.android.play": { "anti_features": [ "NonFreeDep", "NonFreeNet" ], "code_signatures": [ "com/google/android/play/core" ], "documentation": [ "https://developer.android.com/guide/playcore" ], "gradle_signatures": [ "com.google.android.play:app-update", "com.google.android.play:asset-delivery", "com.google.android.play:core.*", "com.google.android.play:feature-delivery", "com.google.android.play:review", "androidx.navigation:navigation-dynamic-features", "com.github.SanojPunchihewa:InAppUpdater" ], "license": "NonFree", "name": "Google Play Core" }, "com.google.mlkit": { "code_signatures": [ "com/google/mlkit" ], "gradle_signatures": [ "com.google.mlkit" ], "license": "NonFree" }, "com.heyzap": { "code_signatures": [ "com/heyzap" ], "license": "NonFree" }, "com.hypertrack": { "code_signatures": [ "com/hypertrack/(?!:hyperlog)" ], "gradle_signatures": [ "com.hypertrack(?!:hyperlog)" ], "gradle_signatures_negative_examples": [ "com.hypertrack:hyperlog" ], "license": "NonFree" }, "com.mapbox": { "MaintainerNotes": "It seems that all libs in https://github.com/mapbox/mapbox-java is fully FOSS\nsince 3.0.0.\n", "gradle_signatures": [ "com\\.mapbox(?!\\.mapboxsdk:mapbox-sdk-(services|geojson|turf):([3-5]))" ], "gradle_signatures_negative_examples": [ "com.mapbox.mapboxsdk:mapbox-sdk-services:5.0.0", "com.github.johan12345:mapbox-events-android:a21c324501", "implementation(\"com.github.johan12345.AnyMaps:anymaps-mapbox:$anyMapsVersion\")" ], "gradle_signatures_positive_examples": [ "com.mapbox.mapboxsdk:mapbox-android-plugin-annotation-v7:0.6.0", "com.mapbox.mapboxsdk:mapbox-android-plugin-annotation-v8:0.7.0", "com.mapbox.mapboxsdk:mapbox-android-plugin-localization-v7:0.7.0", "com.mapbox.mapboxsdk:mapbox-android-plugin-locationlayer:0.4.0", "com.mapbox.mapboxsdk:mapbox-android-plugin-markerview-v8:0.3.0", "com.mapbox.mapboxsdk:mapbox-android-plugin-places-v8:0.9.0", "com.mapbox.mapboxsdk:mapbox-android-plugin-scalebar-v8:0.2.0", "com.mapbox.mapboxsdk:mapbox-android-sdk:7.3.0" ], "license": "NonFree" }, "com.onesignal": { "code_signatures": [ "com/onesignal" ], "gradle_signatures": [ "com.onesignal:OneSignal" ], "license": "NonFree" }, "com.paypal.sdk": { "code_signatures": [ "com/paypal" ], "gradle_signatures": [ "com.paypal.sdk" ], "license": "NonFree" }, "com.tencent.bugly": { "code_signatures": [ "com/tencent/bugly" ], "gradle_signatures": [ "com.tencent.bugly" ], "license": "NonFree" }, "com.umeng.umsdk": { "code_signatures": [ "com/umeng/umsdk" ], "gradle_signatures": [ "com.umeng.umsdk" ], "license": "NonFree" }, "com.yandex.android": { "code_signatures": [ "com/yandex/android/(?!:authsdk)" ], "gradle_signatures": [ "com\\.yandex\\.android(?!:authsdk)" ], "gradle_signatures_negative_examples": [ "com.yandex.android:authsdk" ], "license": "NonFree" }, "firebase": { "code_signatures": [ "com/google/firebase" ], "documentation": [ "https://www.firebase.com" ], "gradle_signatures": [ "com(\\.google)?\\.firebase[.:](?!firebase-jobdispatcher|geofire-java)", "com.microsoft.appcenter:appcenter-push" ], "gradle_signatures_negative_examples": [ " compile 'com.firebase:firebase-jobdispatcher:0.8.4'", "implementation 'com.firebase:geofire-java:3.0.0'", " compile 'com.firebaseui:firebase-ui-auth:3.1.3'", "com.firebaseui:firebase-ui-database", "com.firebaseui:firebase-ui-storage", "com.github.axet:android-firebase-fake", "com.github.b3er.rxfirebase:firebase-database", "com.github.b3er.rxfirebase:firebase-database-kotlin", "com.segment.analytics.android.integrations:firebase" ], "gradle_signatures_positive_examples": [ "\tcompile 'com.google.firebase:firebase-crash:11.0.8'", "\tcompile 'com.google.firebase:firebase-core:11.0.8'", "com.firebase:firebase-client-android:2.5.2", "com.google.firebase.crashlytics", "com.google.firebase.firebase-perf", "com.google.firebase:firebase-ads", "com.google.firebase:firebase-analytics", "com.google.firebase:firebase-appindexing", "com.google.firebase:firebase-auth", "com.google.firebase:firebase-config", "com.google.firebase:firebase-core", "com.google.firebase:firebase-crash", "com.google.firebase:firebase-crashlytics", "com.google.firebase:firebase-database", "com.google.firebase:firebase-dynamic-links", "com.google.firebase:firebase-firestore", "com.google.firebase:firebase-inappmessaging", "com.google.firebase:firebase-inappmessaging-display", "com.google.firebase:firebase-messaging", "com.google.firebase:firebase-ml-natural-language", "com.google.firebase:firebase-ml-natural-language-smart-reply-model", "com.google.firebase:firebase-ml-vision", "com.google.firebase:firebase-perf", "com.google.firebase:firebase-plugins", "com.google.firebase:firebase-storage" ], "license": "NonFree", "name": "Firebase" }, "google-maps": { "anti_features": [ "NonFreeDep", "NonFreeNet" ], "api_key_ids": [ "com\\.google\\.android\\.geo\\.API_KEY", "com\\.google\\.android\\.maps\\.v2\\.API_KEY" ], "license": "NonFree", "name": "Google Maps" }, "io.github.sinaweibosdk": { "code_signatures": [ "com/sina" ], "gradle_signatures": [ "io.github.sinaweibosdk" ], "license": "NonFree" }, "io.objectbox": { "Name": "ObjectBox Database", "code_signatures": [ "io/objectbox" ], "gradle_signatures": [ "io.objectbox:objectbox-gradle-plugin" ], "license": "NonFree" }, "me.pushy": { "code_signatures": [ "me/pushy" ], "gradle_signatures": [ "me.pushy" ], "license": "NonFree" }, "org.mariuszgromada.math": { "documentation": [ "https://mathparser.org" ], "gradle_signatures": [ "org.mariuszgromada.math:MathParser.org-mXparser" ], "license": "NonFree", "name": "mXparser" } }, "timestamp": 1706002241.887412, "version": 1, "last_updated": 1706171656.496258 }''' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/signatures.py0000644000175000017500000000752214620351225020244 0ustar00hanshans#!/usr/bin/env python3 # # Copyright (C) 2017, Michael Poehn # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from argparse import ArgumentParser import re import os import sys import logging from . import _ from . import common from . import net from .exception import FDroidException def extract_signature(apkpath): if not os.path.exists(apkpath): raise FDroidException("file APK does not exists '{}'".format(apkpath)) if not common.verify_apk_signature(apkpath): raise FDroidException("no valid signature in '{}'".format(apkpath)) logging.debug('signature okay: %s', apkpath) appid, vercode, _ignored = common.get_apk_id(apkpath) sigdir = common.metadata_get_sigdir(appid, vercode) if not os.path.exists(sigdir): os.makedirs(sigdir) common.apk_extract_signatures(apkpath, sigdir) return sigdir def extract(options): # Create tmp dir if missing… tmp_dir = 'tmp' if not os.path.exists(tmp_dir): os.mkdir(tmp_dir) if not options.APK or len(options.APK) <= 0: logging.critical(_('no APK supplied')) sys.exit(1) # iterate over supplied APKs downlaod and extract them… httpre = re.compile(r'https?:\/\/') for apk in options.APK: try: if os.path.isfile(apk): sigdir = extract_signature(apk) logging.info( _("Fetched signatures for '{apkfilename}' -> '{sigdir}'").format( apkfilename=apk, sigdir=sigdir ) ) elif httpre.match(apk): if apk.startswith('https') or options.no_check_https: try: tmp_apk = os.path.join(tmp_dir, 'signed.apk') net.download_file(apk, tmp_apk) sigdir = extract_signature(tmp_apk) logging.info( _( "Fetched signatures for '{apkfilename}' -> '{sigdir}'" ).format(apkfilename=apk, sigdir=sigdir) ) finally: if tmp_apk and os.path.exists(tmp_apk): os.remove(tmp_apk) else: logging.warning( _( 'refuse downloading via insecure HTTP connection ' '(use HTTPS or specify --no-https-check): {apkfilename}' ).format(apkfilename=apk) ) except FDroidException as e: logging.warning( _("Failed fetching signatures for '{apkfilename}': {error}").format( apkfilename=apk, error=e ) ) if e.detail: logging.debug(e.detail) def main(): parser = ArgumentParser() common.setup_global_opts(parser) parser.add_argument( "APK", nargs='*', help=_("signed APK, either a file-path or HTTPS URL.") ) parser.add_argument("--no-check-https", action="store_true", default=False) options = common.parse_args(parser) common.set_console_logging(options.verbose) common.read_config() extract(options) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/signindex.py0000644000175000017500000001776314620351225020060 0ustar00hanshans#!/usr/bin/env python3 # # gpgsign.py - part of the FDroid server tools # Copyright (C) 2015, Ciaran Gultnieks, ciaran@ciarang.com # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import json import os import time import zipfile from argparse import ArgumentParser import logging from . import _ from . import common from . import metadata from .exception import FDroidException config = None start_timestamp = time.gmtime() def sign_jar(jar, use_old_algs=False): """Sign a JAR file with the best available algorithm. The current signing method uses apksigner to sign the JAR so that it will automatically select algorithms that are compatible with Android SDK 23, which added the most recent algorithms: https://developer.android.com/reference/java/security/Signature This signing method uses then inherits the default signing algothim settings, since Java and Android both maintain those. That helps avoid a repeat of being stuck on an old signing algorithm. That means specifically that this call to apksigner does not specify any of the algorithms. The old indexes must be signed by SHA1withRSA otherwise they will no longer be compatible with old Androids. This method requires a properly initialized config object. """ if use_old_algs: # This does use old hashing algorithms, i.e. SHA1, but that's not # broken yet for file verification. This could be set to SHA256, # but then Android < 4.3 would not be able to verify it. # https://code.google.com/p/android/issues/detail?id=38321 args = [ config['jarsigner'], '-keystore', config['keystore'], '-storepass:env', 'FDROID_KEY_STORE_PASS', '-digestalg', 'SHA1', '-sigalg', 'SHA1withRSA', jar, config['repo_keyalias'], ] if config['keystore'] == 'NONE': args += config['smartcardoptions'] else: # smardcards never use -keypass args += ['-keypass:env', 'FDROID_KEY_PASS'] else: # https://developer.android.com/studio/command-line/apksigner args = [ config['apksigner'], 'sign', '--min-sdk-version', '23', # enable all current algorithms '--max-sdk-version', '24', # avoid future incompatible algorithms # disable all APK signature types, only use JAR sigs aka v1 '--v1-signing-enabled', 'true', '--v2-signing-enabled', 'false', '--v3-signing-enabled', 'false', '--v4-signing-enabled', 'false', '--ks', config['keystore'], '--ks-pass', 'env:FDROID_KEY_STORE_PASS', '--ks-key-alias', config['repo_keyalias'], ] if config['keystore'] == 'NONE': args += common.get_apksigner_smartcardoptions(config['smartcardoptions']) else: # smardcards never use --key-pass args += ['--key-pass', 'env:FDROID_KEY_PASS'] args += [jar] env_vars = { 'FDROID_KEY_STORE_PASS': config['keystorepass'], 'FDROID_KEY_PASS': config.get('keypass', ""), } p = common.FDroidPopen(args, envs=env_vars) if not use_old_algs and p.returncode != 0: # workaround for apksigner v30 on f-droid.org publish server v4 = args.index("--v4-signing-enabled") del args[v4 + 1] del args[v4] p = common.FDroidPopen(args, envs=env_vars) if p.returncode != 0: raise FDroidException("Failed to sign %s: %s" % (jar, p.output)) def sign_index(repodir, json_name): """Sign data file like entry.json to make a signed JAR like entry.jar. The data file like index-v1.json means that there is unsigned data. That file is then stuck into a jar and signed by the signing process. This is a bit different than sign_jar, which is used for index.jar: that creates index.xml then puts that in a index_unsigned.jar, then that file is signed. This also checks to make sure that the JSON files are intact before signing them. Broken JSON files should never be signed, so taking some extra time and failing hard is the preferred option. This signing process can happen on an entirely separate machine and file tree, so this ensures that nothing got broken during transfer. """ json_file = os.path.join(repodir, json_name) with open(json_file, encoding="utf-8") as fp: data = json.load(fp) if json_name == 'entry.json': index_file = os.path.join(repodir, data['index']['name'].lstrip('/')) sha256 = common.sha256sum(index_file) if sha256 != data['index']['sha256']: raise FDroidException( _('%s has bad SHA-256: %s') % (index_file, sha256) ) with open(index_file) as fp: index = json.load(fp) if not isinstance(index, dict): raise FDroidException(_('%s did not produce a dict!') % index_file) elif json_name == 'index-v1.json': [metadata.App(app) for app in data["apps"]] name, ext = common.get_extension(json_name) jar_file = os.path.join(repodir, name + '.jar') with zipfile.ZipFile(jar_file, 'w', zipfile.ZIP_DEFLATED) as jar: jar.write(json_file, json_name) if json_name in ('index.xml', 'index-v1.json'): sign_jar(jar_file, use_old_algs=True) else: sign_jar(jar_file) def status_update_json(signed): """Output a JSON file with metadata about this run.""" logging.debug(_('Outputting JSON')) output = common.setup_status_output(start_timestamp) if signed: output['signed'] = signed common.write_status_json(output) def main(): global config parser = ArgumentParser() common.setup_global_opts(parser) common.parse_args(parser) config = common.read_config() if 'jarsigner' not in config: raise FDroidException( _( 'Java jarsigner not found! Install in standard location or set java_paths!' ) ) repodirs = ['repo'] if config['archive_older'] != 0: repodirs.append('archive') signed = [] for output_dir in repodirs: if not os.path.isdir(output_dir): raise FDroidException("Missing output directory '" + output_dir + "'") unsigned = os.path.join(output_dir, 'index_unsigned.jar') if os.path.exists(unsigned): sign_jar(unsigned) index_jar = os.path.join(output_dir, 'index.jar') os.rename(unsigned, index_jar) logging.info('Signed index in ' + output_dir) signed.append(index_jar) json_name = 'index-v1.json' index_file = os.path.join(output_dir, json_name) if os.path.exists(index_file): sign_index(output_dir, json_name) logging.info('Signed ' + index_file) signed.append(index_file) json_name = 'entry.json' index_file = os.path.join(output_dir, json_name) if os.path.exists(index_file): sign_index(output_dir, json_name) logging.info('Signed ' + index_file) signed.append(index_file) if not signed: logging.info(_("Nothing to do")) status_update_json(signed) if __name__ == "__main__": main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/tail.py0000644000175000017500000000634314620351225017011 0ustar00hanshans#!/usr/bin/env python """Python-Tail - Unix tail follow implementation in Python. python-tail can be used to monitor changes to a file. Example ------- >>> import tail >>> >>> # Create a tail instance >>> t = tail.Tail('file-to-be-followed') >>> >>> # Register a callback function to be called when a new line is found in the followed file. >>> # If no callback function is registerd, new lines would be printed to standard out. >>> t.register_callback(callback_function) >>> >>> # Follow the file with 5 seconds as sleep time between iterations. >>> # If sleep time is not provided 1 second is used as the default time. >>> t.follow(s=5) """ # Author - Kasun Herath # Source - https://github.com/kasun/python-tail # modified by Hans-Christoph Steiner to add the # background thread and support reading multiple lines per read cycle import os import sys import time import threading class Tail(object): """Represents a tail command.""" def __init__(self, tailed_file): """Initialize a Tail instance. Check for file validity, assigns callback function to standard out. Parameters ---------- tailed_file File to be followed. """ self.check_file_validity(tailed_file) self.tailed_file = tailed_file self.callback = sys.stdout.write self.t_stop = threading.Event() def start(self, s=1): """Start tailing a file in a background thread. Parameters ---------- s Number of seconds to wait between each iteration; Defaults to 3. """ t = threading.Thread(target=self.follow, args=(s,)) t.start() def stop(self): """Stop a background tail.""" self.t_stop.set() def follow(self, s=1): """Do a tail follow. If a callback function is registered it is called with every new line. Else printed to standard out. Parameters ---------- s Number of seconds to wait between each iteration; Defaults to 1. """ with open(self.tailed_file) as file_: # Go to the end of file file_.seek(0, 2) while not self.t_stop.is_set(): curr_position = file_.tell() lines = file_.readlines() if len(lines) == 0: file_.seek(curr_position) else: for line in lines: self.callback(line) time.sleep(s) def register_callback(self, func): """Override default callback function to provided function.""" self.callback = func def check_file_validity(self, file_): """Check whether the a given file exists, readable and is a file.""" if not os.access(file_, os.F_OK): raise TailError("File '%s' does not exist" % (file_)) if not os.access(file_, os.R_OK): raise TailError("File '%s' not readable" % (file_)) if os.path.isdir(file_): raise TailError("File '%s' is a directory" % (file_)) class TailError(Exception): def __init__(self, msg): super().__init__() self.message = msg def __str__(self): return self.message ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/update.py0000644000175000017500000033357314620351225017352 0ustar00hanshans#!/usr/bin/env python3 # # update.py - part of the FDroid server tools # Copyright (C) 2016, Blue Jay Wireless # Copyright (C) 2014-2016, Hans-Christoph Steiner # Copyright (C) 2010-2015, Ciaran Gultnieks # Copyright (C) 2013-2014, Daniel Martí # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import argparse import sys import os import shutil import glob import logging import re import socket import warnings import zipfile import hashlib import json import time import yaml import copy import asn1crypto.cms import defusedxml.ElementTree as ElementTree from datetime import datetime, timezone from argparse import ArgumentParser from pathlib import Path try: from yaml import CSafeLoader as SafeLoader except ImportError: from yaml import SafeLoader import collections from binascii import hexlify from . import _ from . import common from . import metadata from .common import DEFAULT_LOCALE from .exception import BuildException, FDroidException, VerificationException import fdroidserver.index from PIL import Image, PngImagePlugin if hasattr(Image, 'DecompressionBombWarning'): warnings.simplefilter('error', Image.DecompressionBombWarning) Image.MAX_IMAGE_PIXELS = 0xffffff # 4096x4096 METADATA_VERSION = 20002 # less than the valid range of versionCode, i.e. Java's Integer.MIN_VALUE UNSET_VERSION_CODE = -0x100000000 APK_NAME_PAT = re.compile(r".*\Wname='([a-zA-Z0-9._]*)'.*") APK_VERCODE_PAT = re.compile(".*versionCode='([0-9]*)'.*") APK_VERNAME_PAT = re.compile(".*versionName='([^']*)'.*") APK_LABEL_ICON_PAT = re.compile(r".*\s+label='(.*)'\s+icon='(.*?)'") APK_SDK_VERSION_PAT = re.compile(".*'([0-9]*)'.*") APK_PERMISSION_PAT = re.compile(r".*name='([^']*)'(?:.*maxSdkVersion='([^']*)')?.*") APK_FEATURE_PAT = re.compile(".*name='([^']*)'.*") screen_densities = ['65534', '640', '480', '320', '240', '160', '120'] # resolutions must end with 'dpi' screen_resolutions = { "xxxhdpi": '640', "xxhdpi": '480', "xhdpi": '320', "hdpi": '240', "mdpi": '160', "ldpi": '120', "tvdpi": '213', "undefineddpi": '-1', "anydpi": '65534', "nodpi": '65535' } all_screen_densities = ['0'] + screen_densities UsesPermission = collections.namedtuple('UsesPermission', ['name', 'maxSdkVersion']) UsesPermissionSdk23 = collections.namedtuple('UsesPermissionSdk23', ['name', 'maxSdkVersion']) ALLOWED_EXTENSIONS = ('png', 'jpg', 'jpeg') GRAPHIC_NAMES = ('featureGraphic', 'icon', 'promoGraphic', 'tvBanner') SCREENSHOT_DIRS = ('phoneScreenshots', 'sevenInchScreenshots', 'tenInchScreenshots', 'tvScreenshots', 'wearScreenshots') BLANK_PNG_INFO = PngImagePlugin.PngInfo() def dpi_to_px(density): return (int(density) * 48) / 160 def px_to_dpi(px): return (int(px) * 160) / 48 def get_icon_dir(repodir, density): if density in ('0', '65534'): return os.path.join(repodir, "icons") else: return os.path.join(repodir, "icons-%s" % density) def get_icon_dirs(repodir): for density in screen_densities: yield get_icon_dir(repodir, density) def get_all_icon_dirs(repodir): for density in all_screen_densities: yield get_icon_dir(repodir, density) def disabled_algorithms_allowed(): return ((options is not None and options.allow_disabled_algorithms) or (config is not None and config['allow_disabled_algorithms']) or common.default_config['allow_disabled_algorithms']) def status_update_json(apps, apks): """Output a JSON file with metadata about this `fdroid update` run. Parameters ---------- apps fully populated list of all applications apks all to be published apks """ logging.debug(_('Outputting JSON')) output = common.setup_status_output(start_timestamp) output['antiFeatures'] = dict() output['disabled'] = [] output['archivePolicy0'] = [] output['failedBuilds'] = dict() output['noPackages'] = [] output['needsUpdate'] = [] output['noUpdateCheck'] = [] output['apksigner'] = shutil.which(config.get('apksigner', '')) output['jarsigner'] = shutil.which(config.get('jarsigner', '')) output['keytool'] = shutil.which(config.get('keytool', '')) for appid in apps: app = apps[appid] for af in app.get('AntiFeatures', dict()): antiFeatures = output['antiFeatures'] # JSON camelCase if af not in antiFeatures: antiFeatures[af] = dict() if 'apps' not in antiFeatures[af]: antiFeatures[af]['apps'] = set() antiFeatures[af]['apps'].add(appid) apklist = [] gotcurrentver = False for apk in apks: if apk['packageName'] == appid: if apk['versionCode'] == app.get('CurrentVersionCode'): gotcurrentver = True apklist.append(apk) validapks = 0 if app.get('Disabled'): output['disabled'].append(appid) elif app.get("ArchivePolicy") == 0: output['archivePolicy0'].append(appid) else: for build in app.get('Builds', []): if not build.get('disable'): builtit = False for apk in apklist: if apk['versionCode'] == build.versionCode: builtit = True validapks += 1 break if not builtit: failedBuilds = output['failedBuilds'] if appid not in failedBuilds: failedBuilds[appid] = [] failedBuilds[appid].append(build.versionCode) if validapks == 0: output['noPackages'].append(appid) if not gotcurrentver: output['needsUpdate'].append(appid) if app.get('UpdateCheckMode') == 'None': output['noUpdateCheck'].append(appid) common.write_status_json(output, options.pretty) def delete_disabled_builds(apps, apkcache, repodirs): """Delete disabled build outputs. Parameters ---------- apps list of all applications, as per metadata.read_metadata apkcache current apk cache information repodirs the repo directories to process """ for appid, app in apps.items(): for build in app.get('Builds', []): if not build.disable: continue apkfilename = common.get_release_filename(app, build) iconfilename = "%s.%s.png" % ( appid, build.versionCode) for repodir in repodirs: files = [ os.path.join(repodir, apkfilename), os.path.join(repodir, apkfilename + '.asc'), os.path.join(repodir, apkfilename[:-4] + "_src.tar.gz"), ] for density in all_screen_densities: repo_dir = get_icon_dir(repodir, density) files.append(os.path.join(repo_dir, iconfilename)) for f in files: if os.path.exists(f): logging.info("Deleting disabled build output " + f) os.remove(f) if apkfilename in apkcache: del apkcache[apkfilename] def resize_icon(iconpath, density): if not os.path.isfile(iconpath): return fp = None try: fp = open(iconpath, 'rb') im = Image.open(fp) size = dpi_to_px(density) if any(length > size for length in im.size): oldsize = im.size im.thumbnail((size, size), Image.LANCZOS) logging.debug("%s was too large at %s - new size is %s" % ( iconpath, oldsize, im.size)) im.save(iconpath, "PNG", optimize=True, pnginfo=BLANK_PNG_INFO, icc_profile=None) except Exception as e: logging.error(_("Failed resizing {path}: {error}".format(path=iconpath, error=e))) finally: if fp: fp.close() def resize_all_icons(repodirs): """Resize all icons that exceed the max size. Parameters ---------- repodirs the repo directories to process """ for repodir in repodirs: for density in screen_densities: icon_dir = get_icon_dir(repodir, density) icon_glob = os.path.join(icon_dir, '*.png') for iconpath in glob.glob(icon_glob): resize_icon(iconpath, density) def getsig(apkpath): """Get the unique ID for the signing certificate of an APK. This uses a strange algorithm that was devised at the very beginning of F-Droid. Since it is only used for checking signature compatibility, it does not matter much that it uses MD5. To get the same MD5 has that fdroidclient gets, we encode the .RSA certificate in a specific format and pass it hex-encoded to the md5 digest algorithm. This is not the same as the standard X.509 certificate fingerprint. Parameters ---------- apkpath path to the apk Returns ------- A string containing the md5 of the signature of the apk or None if an error occurred. """ cert_encoded = common.get_first_signer_certificate(apkpath) if not cert_encoded: return None return hashlib.md5(hexlify(cert_encoded)).hexdigest() # nosec just used as ID for signing key def get_cache_file(): return os.path.join('tmp', 'apkcache.json') def get_cache(): """Get the cached dict of the APK index. Gather information about all the apk files in the repo directory, using cached data if possible. Some of the index operations take a long time, like calculating the SHA-256 and verifying the APK signature. The cache is invalidated if the metadata version is different, or the 'allow_disabled_algorithms' config/option is different. In those cases, there is no easy way to know what has changed from the cache, so just rerun the whole thing. Returns ------- apkcache """ apkcachefile = get_cache_file() ada = disabled_algorithms_allowed() if options is not None and not options.clean and os.path.exists(apkcachefile): with open(apkcachefile) as fp: apkcache = json.load(fp, object_pairs_hook=collections.OrderedDict) if apkcache.get("METADATA_VERSION") != METADATA_VERSION \ or apkcache.get('allow_disabled_algorithms') != ada: apkcache = collections.OrderedDict() else: apkcache = collections.OrderedDict() apkcache["METADATA_VERSION"] = METADATA_VERSION apkcache['allow_disabled_algorithms'] = ada for k, v in apkcache.items(): if not isinstance(v, dict): continue if 'antiFeatures' in v: if not isinstance(v['antiFeatures'], dict): v['antiFeatures'] = {k: {} for k in sorted(v['antiFeatures'])} if 'added' in v: v['added'] = datetime.fromtimestamp(v['added']) return apkcache def write_cache(apkcache): class Encoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, set): return list(obj) elif isinstance(obj, datetime): return obj.timestamp() return super().default(obj) apkcachefile = get_cache_file() cache_path = os.path.dirname(apkcachefile) if not os.path.exists(cache_path): os.makedirs(cache_path) for k, v in apkcache.items(): if isinstance(k, bytes): print('BYTES: ' + str(k) + ' ' + str(v)) with open(apkcachefile, 'w') as fp: json.dump(apkcache, fp, cls=Encoder, indent=2) def get_icon_bytes(apkzip, iconsrc): """ZIP has no official encoding, UTF-* and CP437 are defacto.""" try: return apkzip.read(iconsrc) except KeyError: return apkzip.read(iconsrc.encode('utf-8').decode('cp437')) def has_known_vulnerability(filename): """Check for known vulnerabilities in the APK. Checks OpenSSL .so files in the APK to see if they are a known vulnerable version. Google also enforces this: https://support.google.com/faqs/answer/6376725?hl=en Checks whether there are more than one classes.dex or AndroidManifest.xml files, which is invalid and an essential part of the "Master Key" attack. http://www.saurik.com/id/17 Janus is similar to Master Key but is perhaps easier to scan for. https://www.guardsquare.com/en/blog/new-android-vulnerability-allows-attackers-modify-apps-without-affecting-their-signatures """ found_vuln = '' # statically load this pattern if not hasattr(has_known_vulnerability, "pattern"): has_known_vulnerability.pattern = re.compile(b'.*OpenSSL ([01][0-9a-z.-]+)') with open(filename.encode(), 'rb') as fp: first4 = fp.read(4) if first4 != b'\x50\x4b\x03\x04': raise FDroidException(_('{path} has bad file signature "{pattern}", possible Janus exploit!') .format(path=filename, pattern=first4.decode().replace('\n', ' ')) + '\n' + 'https://www.guardsquare.com/en/blog/new-android-vulnerability-allows-attackers-modify-apps-without-affecting-their-signatures') files_in_apk = set() with zipfile.ZipFile(filename) as zf: for name in zf.namelist(): if name.endswith('.so') and ('libcrypto' in name or 'libssl' in name): lib = zf.open(name) while True: chunk = lib.read(4096) if chunk == b'': break m = has_known_vulnerability.pattern.search(chunk) if m: version = m.group(1).decode('ascii') if (version.startswith('1.0.1') and len(version) > 5 and version[5] >= 'r') \ or (version.startswith('1.0.2') and len(version) > 5 and version[5] >= 'f') \ or re.match(r'[1-9]\.[1-9]\.[0-9].*', version): logging.debug(_('"{path}" contains recent {name} ({version})') .format(path=filename, name=name, version=version)) else: msg = '"{path}" contains outdated {name} ({version})' logging.warning( _(msg).format(path=filename, name=name, version=version) ) found_vuln += msg.format( path=filename, name=name, version=version ) found_vuln += '\n' break elif name == 'AndroidManifest.xml' or name == 'classes.dex' or name.endswith('.so'): if name in files_in_apk: msg = '{apkfilename} has multiple {name} files, looks like Master Key exploit!' logging.warning( _(msg).format(apkfilename=filename, name=name) ) found_vuln += msg.format(apkfilename=filename, name=name) found_vuln += '\n' files_in_apk.add(name) return found_vuln def insert_obbs(repodir, apps, apks): """Scan the .obb files in a given repo directory and adds them to the relevant APK instances. OBB files have versionCodes like APK files, and they are loosely associated. If there is an OBB file present, then any APK with the same or higher versionCode will use that OBB file. There are two OBB types: main and patch, each APK can only have only have one of each. https://developer.android.com/google/play/expansion-files.html Parameters ---------- repodir repo directory to scan apps list of current, valid apps apks current information on all APKs """ def obbWarnDelete(f, msg): logging.warning(msg + ' ' + f) if options.delete_unknown: logging.error(_("Deleting unknown file: {path}").format(path=f)) os.remove(f) obbs = [] java_Integer_MIN_VALUE = -pow(2, 31) currentPackageNames = apps.keys() for f in glob.glob(os.path.join(repodir, '*.obb')): obbfile = os.path.basename(f) # obbfile looks like: [main|patch]...obb chunks = obbfile.split('.') if chunks[0] != 'main' and chunks[0] != 'patch': obbWarnDelete(f, _('OBB filename must start with "main." or "patch.":')) continue if not re.match(r'^-?[0-9]+$', chunks[1]): obbWarnDelete(f, _('The OBB version code must come after "{name}.":') .format(name=chunks[0])) continue versionCode = int(chunks[1]) packagename = ".".join(chunks[2:-1]) highestVersionCode = java_Integer_MIN_VALUE if packagename not in currentPackageNames: obbWarnDelete(f, _("OBB's packagename does not match a supported APK:")) continue for apk in apks: if packagename == apk['packageName'] and apk['versionCode'] > highestVersionCode: highestVersionCode = apk['versionCode'] if versionCode > highestVersionCode: obbWarnDelete(f, _( 'OBB file has newer versionCode({integer}) than any APK:' ).format(integer=versionCode)) continue obbsha256 = common.sha256sum(f) obbs.append((packagename, versionCode, obbfile, obbsha256)) for apk in apks: for (packagename, versionCode, obbfile, obbsha256) in sorted(obbs, reverse=True): if versionCode <= apk['versionCode'] and packagename == apk['packageName']: if obbfile.startswith('main.') and 'obbMainFile' not in apk: apk['obbMainFile'] = obbfile apk['obbMainFileSha256'] = obbsha256 elif obbfile.startswith('patch.') and 'obbPatchFile' not in apk: apk['obbPatchFile'] = obbfile apk['obbPatchFileSha256'] = obbsha256 if 'obbMainFile' in apk and 'obbPatchFile' in apk: break VERSION_STRING_RE = re.compile(r'^([0-9]+)\.([0-9]+)\.([0-9]+)$') def version_string_to_int(version): """ Convert sermver version designation to version code. Approximately convert a [Major].[Minor].[Patch] version string consisting of numeric characters (0-9) and periods to a number. The exponents are chosen such that it still fits in the 64bit JSON/Android range. """ m = VERSION_STRING_RE.match(version) if not m: raise ValueError(f"invalid version string '{version}'") major = int(m.group(1)) minor = int(m.group(2)) patch = int(m.group(3)) return major * 10**12 + minor * 10**6 + patch # iOS app permissions, source: # https://developer.apple.com/documentation/bundleresources/information_property_list/protected_resources IPA_PERMISSIONS = [ "NSBluetoothAlwaysUsageDescription", "NSBluetoothPeripheralUsageDescription", "NSCalendarsFullAccessUsageDescription", "NSCalendarsWriteOnlyAccessUsageDescription", "NSRemindersFullAccessUsageDescription", "NSCameraUsageDescription", "NSMicrophoneUsageDescription", "NSContactsUsageDescription", "NSFaceIDUsageDescription", "NSDesktopFolderUsageDescription", "NSDocumentsFolderUsageDescription", "NSDownloadsFolderUsageDescription", "NSNetworkVolumesUsageDescription", "NSNetworkVolumesUsageDescription", "NSRemovableVolumesUsageDescription", "NSRemovableVolumesUsageDescription", "NSFileProviderDomainUsageDescription", "NSGKFriendListUsageDescription", "NSHealthClinicalHealthRecordsShareUsageDescription", "NSHealthShareUsageDescription", "NSHealthUpdateUsageDescription", "NSHomeKitUsageDescription", "NSLocationAlwaysAndWhenInUseUsageDescription", "NSLocationUsageDescription", "NSLocationWhenInUseUsageDescription", "NSLocationAlwaysUsageDescription", "NSAppleMusicUsageDescription", "NSMotionUsageDescription", "NSFallDetectionUsageDescription", "NSLocalNetworkUsageDescription", "NSNearbyInteractionUsageDescription", "NSNearbyInteractionAllowOnceUsageDescription", "NFCReaderUsageDescription", "NSPhotoLibraryAddUsageDescription", "NSPhotoLibraryUsageDescription", "NSAppDataUsageDescription", "NSUserTrackingUsageDescription", "NSAppleEventsUsageDescription", "NSSystemAdministrationUsageDescription", "NSSensorKitUsageDescription", "NSSiriUsageDescription", "NSSpeechRecognitionUsageDescription", "NSVideoSubscriberAccountUsageDescription", "NSWorldSensingUsageDescription", "NSHandsTrackingUsageDescription", "NSIdentityUsageDescription", "NSCalendarsUsageDescription", "NSRemindersUsageDescription", ] def parse_ipa(ipa_path, file_size, sha256): import biplist ipa = { "apkName": os.path.basename(ipa_path), "hash": sha256, "hashType": "sha256", "size": file_size, "ipa_entitlements": set(), "ipa_permissions": {}, } with zipfile.ZipFile(ipa_path) as ipa_zip: for info in ipa_zip.infolist(): if re.match("Payload/[^/]*.app/Info.plist", info.filename): with ipa_zip.open(info) as plist_file: plist = biplist.readPlist(plist_file) ipa["name"] = plist['CFBundleName'] ipa["packageName"] = plist["CFBundleIdentifier"] # https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleshortversionstring ipa["versionCode"] = version_string_to_int(plist["CFBundleShortVersionString"]) ipa["versionName"] = plist["CFBundleShortVersionString"] ipa["ipa_MinimumOSVersion"] = plist['MinimumOSVersion'] ipa["ipa_DTPlatformVersion"] = plist['DTPlatformVersion'] for ipap in IPA_PERMISSIONS: if ipap in plist: ipa["ipa_permissions"][ipap] = str(plist[ipap]) if info.filename.endswith("/embedded.mobileprovision"): print("parsing", info.filename) with ipa_zip.open(info) as mopro_file: mopro_content_info = asn1crypto.cms.ContentInfo.load( mopro_file.read() ) mopro_payload_info = mopro_content_info['content'] mopro_payload = mopro_payload_info['encap_content_info'][ 'content' ].native mopro = biplist.readPlistFromString(mopro_payload) # https://faq.altstore.io/distribute-your-apps/make-a-source#entitlements-array-of-strings for entitlement in mopro.get('Entitlements', {}).keys(): if entitlement not in [ "com.app.developer.team-identifier", 'application-identifier' ]: ipa["ipa_entitlements"].add(entitlement) return ipa def scan_repo_for_ipas(apkcache, repodir, knownapks): """Scan for IPA files in a given repo directory. Parameters ---------- apkcache cache dictionary containting cached file infos from previous runs repodir repo directory to scan knownapks list of all known files, as per metadata.read_metadata Returns ------- ipas list of file infos for ipa files in ./repo folder cachechanged ture if new ipa files were found and added to `apkcache` """ cachechanged = False ipas = [] for ipa_path in glob.glob(os.path.join(repodir, '*.ipa')): ipa_name = os.path.basename(ipa_path) file_size = os.stat(ipa_path).st_size if file_size == 0: raise FDroidException(_('{path} is zero size!').format(path=ipa_path)) sha256 = common.sha256sum(ipa_path) ipa = apkcache.get(ipa_name, {}) if ipa.get('hash') != sha256: ipa = fdroidserver.update.parse_ipa(ipa_path, file_size, sha256) apkcache[ipa_name] = ipa cachechanged = True added = knownapks.recordapk(ipa_name, ipa['packageName']) if added: ipa['added'] = added ipas.append(ipa) return ipas, cachechanged def translate_per_build_anti_features(apps, apks): """Grab the anti-features list from the build metadata. For most Anti-Features, they are really most applicable per-APK, not for an app. An app can fix a vulnerability, add/remove tracking, etc. This reads the 'antifeatures' list from the Build entries in the fdroiddata metadata file, then transforms it into the 'antiFeatures' list of unique items for the index. The field key is all lower case in the metadata file to match the rest of the Build fields. It is 'antiFeatures' camel case in the implementation, index, and fdroidclient since it is translated from the build 'antifeatures' field, not directly included. """ antiFeatures = dict() for packageName, app in apps.items(): d = dict() for build in app.get('Builds', []): afl = build.get('antifeatures') if afl: d[build.versionCode] = afl if len(d) > 0: antiFeatures[packageName] = d for apk in apks: d = antiFeatures.get(apk['packageName']) if d: afl = d.get(apk['versionCode']) if afl: apk['antiFeatures'].update(afl) # TODO def _get_localized_dict(app, locale): """Get the dict to add localized store metadata to.""" if 'localized' not in app: app['localized'] = collections.OrderedDict() if locale not in app['localized']: app['localized'][locale] = collections.OrderedDict() return app['localized'][locale] def _set_localized_text_entry(app, locale, key, f, versionCode=None): """Read a fastlane/triple-t metadata file and add an entry to the app. This reads more than the limit, in case there is leading or trailing whitespace to be stripped """ try: limit = config['char_limits'][key] if not versionCode: localized = _get_localized_dict(app, locale) with open(f, errors='replace') as fp: text = fp.read(limit * 2) if versionCode: for build in app["Builds"]: if build["versionCode"] == versionCode: if "whatsNew" not in build: build["whatsNew"] = collections.OrderedDict() build["whatsNew"][locale] = text[:limit] return if len(text) > 0: if key in ('name', 'summary', 'video'): # hardcoded as a single line localized[key] = text.strip('\n')[:limit] else: localized[key] = text[:limit] except Exception as e: logging.error(_('{path}: {error}').format(path=f, error=str(e))) def _set_author_entry(app, key, f): """Read a fastlane/triple-t author file and add the entry to the app. This reads more than the limit, in case there is leading or trailing whitespace to be stripped """ try: limit = config['char_limits']['author'] with open(f, errors='replace') as fp: text = fp.read(limit * 2) if len(text) > 0: app[key] = text.strip()[:limit] except Exception as e: logging.error(_('{path}: {error}').format(path=f, error=str(e))) def _strip_and_copy_image(in_file, outpath): """Remove any metadata from image and copy it to new path. Sadly, image metadata like EXIF can be used to exploit devices. It is not used at all in the F-Droid ecosystem, so its much safer just to remove it entirely. This uses size+mtime to check for a new file since this process actually modifies the resulting file to strip out the EXIF. outpath can be path to either a file or dir. The dir that outpath refers to must exist before calling this. Potential source of Python code to strip JPEGs without dependencies: http://www.fetidcascade.com/public/minimal_exif_writer.py """ logging.debug('copying ' + in_file + ' ' + outpath) if not os.path.exists(in_file): if os.path.islink(in_file): logging.warning(_("Broken symlink: {path}").format(path=in_file)) else: logging.warning(_("File disappeared while processing it: {path}").format(path=in_file)) return if os.path.isdir(outpath): out_file = os.path.join(outpath, os.path.basename(in_file)) else: out_file = outpath if os.path.exists(out_file): in_stat = os.stat(in_file) out_stat = os.stat(out_file) if in_stat.st_size == out_stat.st_size \ and in_stat.st_mtime == out_stat.st_mtime: return extension = common.get_extension(in_file)[1] if extension == 'png': try: with open(in_file, 'rb') as fp: in_image = Image.open(fp) in_image.save(out_file, "PNG", optimize=True, pnginfo=BLANK_PNG_INFO, icc_profile=None) except Exception as e: logging.error(_("Failed copying {path}: {error}".format(path=in_file, error=e))) return elif extension in ('jpg', 'jpeg'): try: with open(in_file, 'rb') as fp: in_image = Image.open(fp) data = list(in_image.getdata()) out_image = Image.new(in_image.mode, in_image.size) out_image.putdata(data) out_image.save(out_file, "JPEG", optimize=True) except Exception as e: logging.error(_("Failed copying {path}: {error}".format(path=in_file, error=e))) return else: raise FDroidException(_('Unsupported file type "{extension}" for repo graphic') .format(extension=extension)) stat_result = os.stat(in_file) os.utime(out_file, times=(stat_result.st_atime, stat_result.st_mtime)) def _get_base_hash_extension(f): """Split a graphic/screenshot filename into base, sha256, and extension.""" base, extension = common.get_extension(f) sha256_index = base.find('_') if sha256_index > 0: return base[:sha256_index], base[sha256_index + 1:], extension return base, None, extension def sanitize_funding_yml_entry(entry): """FUNDING.yml comes from upstream repos, entries must be sanitized.""" if type(entry) not in (bytes, int, float, list, str): return if isinstance(entry, bytes): entry = entry.decode() elif isinstance(entry, list): if entry: entry = entry[0] else: return try: entry = str(entry) except (TypeError, ValueError): return if len(entry) > 2048: logging.warning(_('Ignoring FUNDING.yml entry longer than 2048: %s') % entry[:2048]) return if '\n' in entry: return return entry.strip() def sanitize_funding_yml_name(name): """Sanitize usernames that come from FUNDING.yml.""" entry = sanitize_funding_yml_entry(name) if entry: m = metadata.VALID_USERNAME_REGEX.match(entry) if m: return m.group() return def insert_funding_yml_donation_links(apps): """Include donation links from FUNDING.yml in app's source repo. GitHub made a standard file format for declaring donation links. This parses that format from upstream repos to include in metadata here. GitHub supports mostly proprietary services, so this logic adds proprietary services only as Donate: links. FUNDING.yml can be either in the root of the project, or in the ".github" subdir. https://help.github.com/en/articles/displaying-a-sponsor-button-in-your-repository#about-funding-files """ if not os.path.isdir('build'): return # nothing to do for packageName, app in apps.items(): sourcedir = os.path.join('build', packageName) if not os.path.isdir(sourcedir): continue for f in ([os.path.join(sourcedir, 'FUNDING.yml'), ] + glob.glob(os.path.join(sourcedir, '.github', 'FUNDING.yml'))): if not os.path.isfile(f): continue data = None try: with open(f) as fp: data = yaml.load(fp, Loader=SafeLoader) except yaml.YAMLError as e: logging.error(_('Found bad funding file "{path}" for "{name}":') .format(path=f, name=packageName)) logging.error(e) if not data or type(data) != dict: continue if not app.get('Liberapay') and 'liberapay' in data: s = sanitize_funding_yml_name(data['liberapay']) if s: app['Liberapay'] = s if not app.get('OpenCollective') and 'open_collective' in data: s = sanitize_funding_yml_name(data['open_collective']) if s: app['OpenCollective'] = s if not app.get('Donate'): if 'liberapay' in data: del data['liberapay'] if 'open_collective' in data: del data['open_collective'] # this tuple provides a preference ordering for k in ( 'custom', 'github', 'patreon', 'community_bridge', 'ko_fi', 'issuehunt', 'buy_me_a_coffee' ): v = data.get(k) if not v: continue if k == 'custom': s = sanitize_funding_yml_entry(v) if s: app['Donate'] = s break elif k in ('community_bridge', 'lfx_crowdfunding'): s = sanitize_funding_yml_name(v) if s: app['Donate'] = 'https://crowdfunding.lfx.linuxfoundation.org/projects/' + s break elif k == 'github': s = sanitize_funding_yml_name(v) if s: app['Donate'] = 'https://github.com/sponsors/' + s break elif k == 'issuehunt': s = sanitize_funding_yml_name(v) if s: app['Donate'] = 'https://issuehunt.io/r/' + s break elif k == 'ko_fi': s = sanitize_funding_yml_name(v) if s: app['Donate'] = 'https://ko-fi.com/' + s break elif k == 'patreon': s = sanitize_funding_yml_name(v) if s: app['Donate'] = 'https://patreon.com/' + s break elif k == 'buy_me_a_coffee': s = sanitize_funding_yml_name(v) if s: app['Donate'] = 'https://www.buymeacoffee.com/' + s break elif k == 'polar': s = sanitize_funding_yml_name(v) if s: app['Donate'] = 'https://polar.sh/' + s break def copy_triple_t_store_metadata(apps): """Include store metadata from the app's source repo. The Triple-T Gradle Play Publisher is a plugin that has a standard file layout for all of the metadata and graphics that the Google Play Store accepts. Since F-Droid has the git repo, it can just pluck those files directly. This method reads any text files into the app dict, then copies any graphics into the fdroid repo directory structure. This needs to be run before insert_localized_app_metadata() so that the graphics files that are copied into the fdroid repo get properly indexed. https://github.com/Triple-T/gradle-play-publisher/blob/1.2.2/README.md#uploading-images https://github.com/Triple-T/gradle-play-publisher/blob/1.2.2/README.md#play-store-metadata https://github.com/Triple-T/gradle-play-publisher/blob/2.1.0/README.md#publishing-listings """ if not os.path.isdir('build'): return # nothing to do tt_graphic_names = ('feature-graphic', 'icon', 'promo-graphic', 'tv-banner') tt_screenshot_dirs = ('phone-screenshots', 'tablet-screenshots', 'large-tablet-screenshots', 'tv-screenshots', 'wear-screenshots') setting_gradle_pattern = re.compile(r"""\s*include\s+["']:([^"']+)["'](?:,[\n\s]*["']:([^"']+)["'])*""") for packageName, app in apps.items(): builds = app.get('Builds', []) gradle_subdirs = set() if builds and builds[-1].subdir: for flavor in builds[-1].gradle: if flavor not in ('yes', 'no', True, False): p = os.path.join('build', packageName, builds[-1].subdir, 'src', flavor, 'play') if os.path.exists(p): gradle_subdirs.add(p) if not gradle_subdirs: gradle_subdirs.update(glob.glob(os.path.join('build', packageName, builds[-1].subdir, 'src', '*', 'play'))) if not gradle_subdirs: gradle_subdirs.update(glob.glob(os.path.join('build', packageName, builds[-1].subdir, '*', 'src', '*', 'play'))) if not gradle_subdirs: sg_list = sorted(glob.glob(os.path.join('build', packageName, 'settings.gradle*'))) if sg_list: settings_gradle = sg_list[0] with open(settings_gradle, encoding='utf-8') as fp: data = fp.read() for matches in setting_gradle_pattern.findall(data): for m in matches: if m: gradle_path = m.replace(':', '/') p = os.path.join('build', packageName, gradle_path, 'src', 'main', 'play') if os.path.exists(p): gradle_subdirs.add(p) flavors = builds[-1].gradle if builds else [] for flavor in flavors: if flavor not in ('yes', 'no', True, False): p = os.path.join('build', packageName, gradle_path, 'src', flavor, 'play') if os.path.exists(p): gradle_subdirs.add(p) if not gradle_subdirs: gradle_subdirs.update(glob.glob(os.path.join('build', packageName, '*', 'src', '*', 'play'))) if not gradle_subdirs: # Flutter-style android subdir gradle_subdirs.update(glob.glob(os.path.join('build', packageName, 'android', 'app', 'src', '*', 'play'))) for d in sorted(gradle_subdirs): logging.debug('Triple-T Gradle Play Publisher: ' + d) for root, dirs, files in os.walk(d): segments = root.split('/') if segments[-2] == 'listings' or segments[-2] == 'release-notes': locale = segments[-1] else: locale = segments[-2] for f in files: if f in ('fulldescription', 'full-description.txt'): _set_localized_text_entry(app, locale, 'description', os.path.join(root, f)) elif f in ('shortdescription', 'short-description.txt'): _set_localized_text_entry(app, locale, 'summary', os.path.join(root, f)) elif f in ('title', 'title.txt'): _set_localized_text_entry(app, locale, 'name', os.path.join(root, f)) elif f in ('video', 'video-url.txt'): _set_localized_text_entry(app, locale, 'video', os.path.join(root, f)) elif f == 'whatsnew': _set_localized_text_entry(app, segments[-1], 'whatsNew', os.path.join(root, f)) elif f == 'default.txt' and segments[-2] == 'release-notes': _set_localized_text_entry(app, locale, 'whatsNew', os.path.join(root, f)) elif f in ('contactEmail', 'contact-email.txt'): _set_author_entry(app, 'authorEmail', os.path.join(root, f)) elif f in ('contactPhone', 'contact-phone.txt'): _set_author_entry(app, 'authorPhone', os.path.join(root, f)) elif f in ('contactWebsite', 'contact-website.txt'): _set_author_entry(app, 'authorWebSite', os.path.join(root, f)) else: base, extension = common.get_extension(f) dirname = os.path.basename(root) if extension in ALLOWED_EXTENSIONS \ and (dirname in GRAPHIC_NAMES or dirname in tt_graphic_names or dirname in SCREENSHOT_DIRS or dirname in tt_screenshot_dirs): repofilename = os.path.basename(f) if segments[-2] == 'listing': locale = segments[-3] elif segments[-4] == 'listings': # v2.x locale = segments[-3] if dirname in tt_graphic_names: repofilename = GRAPHIC_NAMES[tt_graphic_names.index(dirname)] repofilename += '.' + extension dirname = '' else: dirname = SCREENSHOT_DIRS[tt_screenshot_dirs.index(dirname)] else: locale = segments[-2] destdir = os.path.join('repo', packageName, locale, dirname) os.makedirs(destdir, mode=0o755, exist_ok=True) sourcefile = os.path.join(root, f) destfile = os.path.join(destdir, repofilename) _strip_and_copy_image(sourcefile, destfile) def insert_localized_app_metadata(apps): """Scan standard locations for graphics and localized text. Scans for localized description files, changelogs, store graphics, and screenshots and adds them to the app metadata. Each app's source repo root checked out at /build/ is scanned at the following standard locations for these files... metadata// fastlane/metadata/android// src//fastlane/metadata/android// ...as well as the /metadata// directory. If it finds them, they will be added to the dict of all packages, with the versions in the /metadata/ folder taking precedence over the what is in the app's source repo. The is the locale of the files supplied in that directory, using the IETF RFC5646 format (e.g. en, en-US, ast, etc). For each directory, this script searches for the following files in the directory structure as supplied by fastlane. See https://github.com/fastlane/fastlane/blob/2.28.7/supply/README.md#images-and-screenshots See also our documentation page: https://f-droid.org/en/docs/All_About_Descriptions_Graphics_and_Screenshots/#in-the-apps-build-metadata-in-an-fdroiddata-collection """ sourcedirs = glob.glob(os.path.join('build', '[A-Za-z]*', 'src', '[A-Za-z]*', 'fastlane', 'metadata', 'android', '[a-z][a-z]*')) sourcedirs += glob.glob(os.path.join('build', '[A-Za-z]*', 'fastlane', 'metadata', 'android', '[a-z][a-z]*')) sourcedirs += glob.glob(os.path.join('build', '[A-Za-z]*', 'metadata', '[a-z][a-z]*')) sourcedirs += glob.glob(os.path.join('metadata', '[A-Za-z]*', '[a-z][a-z]*')) for srcd in sorted(sourcedirs): if not os.path.isdir(srcd): continue for root, dirs, files in os.walk(srcd): segments = root.split('/') packageName = segments[1] if packageName not in apps: logging.debug(packageName + ' does not have app metadata, skipping l18n scan.') continue locale = segments[-1] destdir = os.path.join('repo', packageName, locale) # flavours specified in build receipt build_flavours = "" if ( apps[packageName] and len(apps[packageName].get('Builds', [])) > 0 and 'gradle' in apps[packageName]['Builds'][-1] ): build_flavours = apps[packageName]['Builds'][-1]['gradle'] if len(segments) >= 5 and segments[4] == "fastlane" and segments[3] not in build_flavours: logging.debug("ignoring due to wrong flavour") continue for f in files: if f in ('description.txt', 'full_description.txt'): _set_localized_text_entry(apps[packageName], locale, 'description', os.path.join(root, f)) continue elif f in ('summary.txt', 'short_description.txt'): _set_localized_text_entry(apps[packageName], locale, 'summary', os.path.join(root, f)) continue elif f in ('name.txt', 'title.txt'): _set_localized_text_entry(apps[packageName], locale, 'name', os.path.join(root, f)) continue elif f == 'video.txt': _set_localized_text_entry(apps[packageName], locale, 'video', os.path.join(root, f)) continue elif f == str(apps[packageName]['CurrentVersionCode']) + '.txt': locale = segments[-2] _set_localized_text_entry(apps[packageName], locale, 'whatsNew', os.path.join(root, f)) elif f == 'default.txt': # use "default.txt" changelog entry as fallback. locale = segments[-2] localized = _get_localized_dict(apps[packageName], locale) if not localized.get('whatsNew', ''): _set_localized_text_entry(apps[packageName], locale, 'whatsNew', os.path.join(root, f)) base, extension = common.get_extension(f) if extension == 'txt': try: versionCode = int(base) locale = segments[-2] if versionCode in [ a["versionCode"] for a in apps[packageName]["Builds"] ]: _set_localized_text_entry( apps[packageName], locale, 'whatsNew', os.path.join(root, f), versionCode, ) continue except ValueError: pass if locale == 'images': locale = segments[-2] destdir = os.path.join('repo', packageName, locale) if base in GRAPHIC_NAMES and extension in ALLOWED_EXTENSIONS: os.makedirs(destdir, mode=0o755, exist_ok=True) _strip_and_copy_image(os.path.join(root, f), destdir) dst = os.path.join(destdir, f) if os.path.isfile(dst): if base == "icon": base = "iconv2" if base not in apps[packageName] or not isinstance(apps[packageName][base], collections.OrderedDict): apps[packageName][base] = collections.OrderedDict() apps[packageName][base][locale] = common.file_entry(dst) # copy screenshots from local source code checkout into wellknown # location in repo directory for d in dirs: if d in SCREENSHOT_DIRS: if locale == 'images': locale = segments[-2] destdir = os.path.join('repo', packageName, locale) for f in glob.glob(os.path.join(root, d, '*.*')): _ignored, extension = common.get_extension(f) if extension in ALLOWED_EXTENSIONS: screenshotdestdir = os.path.join(destdir, d) os.makedirs(screenshotdestdir, mode=0o755, exist_ok=True) _strip_and_copy_image(f, screenshotdestdir) def ingest_screenshots_from_repo_dir(apps): repodirs = sorted(glob.glob(os.path.join('repo', '[A-Za-z]*', '[a-z][a-z]*'))) for d in repodirs: if not os.path.isdir(d): continue for f in sorted(glob.glob(os.path.join(d, '*.*')) + glob.glob(os.path.join(d, '*Screenshots', '*.*'))): if not os.path.isfile(f): continue segments = f.split('/') packageName = segments[1] locale = segments[2] screenshotdir = segments[3] filename = os.path.basename(f) base, sha256, extension = _get_base_hash_extension(filename) if packageName not in apps: logging.warning(_('Found "{path}" graphic without metadata for app "{name}"!') .format(path=filename, name=packageName)) continue graphics = _get_localized_dict(apps[packageName], locale) if extension not in ALLOWED_EXTENSIONS: logging.warning(_('Only PNG and JPEG are supported for graphics, found: {path}').format(path=f)) elif base in GRAPHIC_NAMES: # there can only be zero or one of these per locale basename = base + '.' + extension basepath = os.path.join(os.path.dirname(f), basename) if sha256: if not os.path.samefile(f, basepath): os.unlink(f) else: sha256 = common.sha256base64(f) filename = base + '_' + sha256 + '.' + extension index_file = os.path.join(os.path.dirname(f), filename) if not os.path.exists(index_file): os.link(f, index_file, follow_symlinks=False) graphics[base] = filename if base == "icon": base = "iconv2" if base not in apps[packageName] or not isinstance(apps[packageName][base], collections.OrderedDict): apps[packageName][base] = collections.OrderedDict() apps[packageName][base][locale] = common.file_entry(index_file) elif screenshotdir in SCREENSHOT_DIRS: # there can any number of these per locale logging.debug(_('adding to {name}: {path}').format(name=screenshotdir, path=f)) if screenshotdir not in graphics: graphics[screenshotdir] = [] graphics[screenshotdir].append(filename) newKey = screenshotdir.replace("Screenshots", "") if "screenshots" not in apps[packageName]: apps[packageName]["screenshots"] = collections.OrderedDict() if newKey not in apps[packageName]["screenshots"]: apps[packageName]["screenshots"][newKey] = collections.OrderedDict() if locale not in apps[packageName]["screenshots"][newKey]: apps[packageName]["screenshots"][newKey][locale] = [] apps[packageName]["screenshots"][newKey][locale].append(common.file_entry(f)) else: logging.warning(_('Unsupported graphics file found: {path}').format(path=f)) LANG_CODE = re.compile(r'^[a-z]{2}([-_][A-Z][a-zA-Z]{1,3})?$') FASTLANE_IOS_MAP = { "name.txt": 'name', "subtitle.txt": 'summary', "description.txt": 'description', } def parse_ios_screenshot_name(path): """ Infer type and categorization info from screenshot file name. This is not really an exact algorithm, it's based on filenames observed in the wild. """ s = path.stem.split('@') if len(s) >= 2: if "iphone" in s[0].lower(): return ("phoneScreenshots", s[0].strip(), ('@'.join(s[1:])).split('-')[0].strip()) elif "ipad" in s[0].lower(): return ("tenInchScreenshots", s[0].strip(), ('@'.join(s[1:])).split('-')[0].strip()) else: fragments = path.stem.lower().split("_") device = "unknown" os = "unknown" screenshot_type = "phoneScreenshots" for f in fragments: if "iphone" in f: device = f continue if "ipad" in f: screenshot_type = "tenInchScreenshots" device = f if "ios" in f: os = f return (screenshot_type, device, os) return ("phoneScreenshots", 'unknown', 'unknown') def discover_ios_screenshots(fastlane_dir): """Traverse git checkouts in build dir, search for fastlane-screenshots and put findings into a dict.""" fastlane_screenshot_dir = fastlane_dir / 'screenshots' screenshots = {} if fastlane_screenshot_dir.is_dir(): for lang_sdir in fastlane_screenshot_dir.iterdir(): locale = lang_sdir.name m = LANG_CODE.match(locale) if m: screenshots[locale] = {} fifo_idevice = {} fifo_ios = {} for screenshot in lang_sdir.iterdir(): if screenshot.suffix[1:] in ALLOWED_EXTENSIONS: screenshot_type, idevice_name, ios_name = parse_ios_screenshot_name(screenshot) # since there is no easy mapping here, we're just # resorting to fifo here, so ieg. if there's 2 # screenshots categorized for more than one # iPhone/iOS combinations we just remember the # first combination, use them as screenshots in # F-Droid and ignore all other screenshots, for # this screenshot type if not fifo_idevice.get(screenshot_type): fifo_idevice[screenshot_type] = idevice_name fifo_ios[screenshot_type] = ios_name if fifo_idevice[screenshot_type] == idevice_name and fifo_ios[screenshot_type] == ios_name: if screenshot_type not in screenshots[locale]: screenshots[locale][screenshot_type] = [] screenshots[locale][screenshot_type].append(screenshot) # sort all found screenshots alphanumerically for locale, translated_screenshots in screenshots.items(): for device in translated_screenshots.keys(): translated_screenshots[device].sort() return screenshots def copy_ios_screenshots_to_repo(screenshots, package_name): for locale, translated_screenshots in screenshots.items(): for device, translated_device_screenshots in translated_screenshots.items(): dest_dir = Path('repo') / package_name / locale / device dest_dir.mkdir(mode=0o755, parents=True, exist_ok=True) for path in translated_device_screenshots: dest = dest_dir / (path.name.replace(" ", "_").replace("\t", "_")) fdroidserver.update._strip_and_copy_image(str(path), str(dest)) def insert_localized_ios_app_metadata(apps_with_packages): if not any(Path('repo').glob('*.ipa')): # no IPA files present in repo, nothing to do here, exiting early return for package_name, app in apps_with_packages.items(): if not any(Path('repo').glob(f'{package_name}*.ipa')): # couldn't find any IPA files for this package_name # so we don't have to look for fastlane data continue fastlane_dir = Path('build', package_name, 'fastlane') fastlane_meta_dir = (fastlane_dir / "metadata") if fastlane_meta_dir.is_dir(): for lang_dir in fastlane_meta_dir.iterdir(): locale = lang_dir.name m = LANG_CODE.match(locale) if m: for metadata_file in (lang_dir).iterdir(): key = FASTLANE_IOS_MAP.get(metadata_file.name) if key: fdroidserver.update._set_localized_text_entry( app, locale, key, metadata_file ) screenshots = fdroidserver.update.discover_ios_screenshots(fastlane_dir) fdroidserver.update.copy_ios_screenshots_to_repo(screenshots, package_name) # lookup icons, copy them and put them into app icon_path = _get_ipa_icon(Path('build') / package_name) icon_dest = Path('repo') / package_name / 'icon.png' # for now just assume png icon_stat = os.stat(icon_path) app['iconv2'] = { DEFAULT_LOCALE: { 'name': str(icon_dest).lstrip('repo'), 'sha256': common.sha256sum(icon_dest), 'size': icon_stat.st_size, } } if not icon_dest.exists(): icon_dest.parent.mkdir(parents=True, exist_ok=True) shutil.copy(icon_path, icon_dest) def scan_repo_files(apkcache, repodir, knownapks, use_date_from_file=False): """Scan a repo for all files with an extension except APK/OBB/IPA. This allows putting all kinds of files into repostories. E.g. Media Files, Zip archives, ... Parameters ---------- apkcache current cached info about all repo files repodir repo directory to scan knownapks list of all known files, as per metadata.read_metadata use_date_from_file use date from file (instead of current date) for newly added files """ cachechanged = False repo_files = [] repodir = repodir.encode() for name in os.listdir(repodir): # skip files based on file extensions, that are handled elsewhere file_extension = common.get_file_extension(name) if file_extension in ('apk', 'obb', 'ipa'): continue # skip source tarballs generated by fdroidserver filename = os.path.join(repodir, name) name_utf8 = name.decode() if filename.endswith(b'_src.tar.gz'): logging.debug(_('skipping source tarball: {path}') .format(path=filename.decode())) continue # skip all other files generated by fdroidserver if not common.is_repo_file(filename): continue stat = os.stat(filename) if stat.st_size == 0: raise FDroidException(_('{path} is zero size!') .format(path=filename)) # load file infos from cache if not stale shasum = common.sha256sum(filename) usecache = False if name_utf8 in apkcache: repo_file = apkcache[name_utf8] if repo_file.get('hash') == shasum: logging.debug(_("Reading {apkfilename} from cache") .format(apkfilename=name_utf8)) usecache = True else: logging.debug(_("Ignoring stale cache data for {apkfilename}") .format(apkfilename=name_utf8)) # scan file if info wasn't in cache if not usecache: logging.debug(_("Processing {apkfilename}").format(apkfilename=name_utf8)) repo_file = collections.OrderedDict() repo_file['name'] = os.path.splitext(name_utf8)[0] # TODO rename apkname globally to something more generic repo_file['apkName'] = name_utf8 repo_file['hash'] = shasum repo_file['hashType'] = 'sha256' repo_file['ipfsCIDv1'] = common.calculate_IPFS_cid(name_utf8) repo_file['versionCode'] = 0 repo_file['versionName'] = shasum[0:7] # the static ID is the SHA256 unless it is set in the metadata repo_file['packageName'] = shasum m = common.STANDARD_FILE_NAME_REGEX.match(name_utf8) if m: repo_file['packageName'] = m.group(1) repo_file['versionCode'] = int(m.group(2)) srcfilename = name + b'_src.tar.gz' if os.path.exists(os.path.join(repodir, srcfilename)): repo_file['srcname'] = srcfilename.decode() repo_file['size'] = stat.st_size apkcache[name_utf8] = repo_file cachechanged = True if use_date_from_file: timestamp = stat.st_ctime default_date_param = datetime.fromtimestamp(timestamp, tz=timezone.utc) else: default_date_param = None # Record in knownapks, getting the added date at the same time.. added = knownapks.recordapk(repo_file['apkName'], repo_file['packageName'], default_date=default_date_param) if added: repo_file['added'] = added repo_files.append(repo_file) return repo_files, cachechanged def scan_apk(apk_file, require_signature=True): """Scan an APK file and returns dictionary with metadata of the APK. Attention: This does *not* verify that the APK signature is correct. Parameters ---------- apk_file The (ideally absolute) path to the APK file require_signature Raise an exception is there is no valid signature. Default to True. Raises ------ BuildException Returns ------- A dict containing APK metadata """ apk = { 'hash': common.sha256sum(apk_file), 'hashType': 'sha256', 'uses-permission': [], 'uses-permission-sdk-23': [], 'features': [], 'icons_src': {}, 'icons': {}, 'antiFeatures': {}, } ipfsCIDv1 = common.calculate_IPFS_cid(apk_file) if ipfsCIDv1: apk['ipfsCIDv1'] = ipfsCIDv1 scan_apk_androguard(apk, apk_file) if not common.is_valid_package_name(apk['packageName']): raise BuildException(_("{appid} from {path} is not a valid Java Package Name!") .format(appid=apk['packageName'], path=apk_file)) elif not common.is_strict_application_id(apk['packageName']): logging.warning(_("{appid} from {path} is not a valid Android application ID!") .format(appid=apk['packageName'], path=apk_file)) # Get the signature, or rather the signing key fingerprints logging.debug('Getting signature of {0}'.format(os.path.basename(apk_file))) apk['sig'] = getsig(apk_file) if require_signature: if not apk['sig']: raise BuildException(_("Failed to get APK signing key fingerprint")) apk['signer'] = common.apk_signer_fingerprint( os.path.join(os.getcwd(), apk_file) ) if not apk.get('signer'): raise BuildException(_("Failed to get APK signing key fingerprint")) # Get size of the APK apk['size'] = os.path.getsize(apk_file) if 'minSdkVersion' not in apk: logging.warning(_("No minimum SDK version found in {0}, using default (3).").format(apk_file)) apk['minSdkVersion'] = 3 # aapt defaults to 3 as the min # Check for known vulnerabilities hkv = has_known_vulnerability(apk_file) if hkv: apk['antiFeatures']['KnownVuln'] = {DEFAULT_LOCALE: hkv} return apk def _get_apk_icons_src(apkfile, icon_name): """Extract the paths to the app icon in all available densities. The folder name is normally generated by the Android Tools, but there is nothing that prevents people from using whatever DPI names they make up. Android will just ignore them, so we should too. """ icons_src = dict() density_re = re.compile(r'^res/(.*)/{}\.png$'.format(icon_name)) with zipfile.ZipFile(apkfile) as zf: for filename in zf.namelist(): m = density_re.match(filename) if m: folder = m.group(1).split('-') try: density = screen_resolutions[folder[1]] except Exception: density = '160' icons_src[density] = m.group(0) if icons_src.get('-1') is None and '160' in icons_src: icons_src['-1'] = icons_src['160'] return icons_src def _get_ipa_icon(src_dir): """Search source directory of an IPA project for the app icon.""" # parse app icon name from project config file src_dir = Path(src_dir) prj = next(src_dir.glob("**/project.pbxproj"), None) if not prj or not prj.exists(): return icon_name = _parse_from_pbxproj(prj, 'ASSETCATALOG_COMPILER_APPICON_NAME') if not icon_name: return icon_dir = next(src_dir.glob(f'**/{icon_name}.appiconset'), None) if not icon_dir: return with open(icon_dir / "Contents.json") as f: cntnt = json.load(f) fname = None fsize = 0 for image in cntnt['images']: s = float(image.get("size", "0x0").split("x")[0]) if image.get('scale') == "1x" and s > fsize and s <= 128: fname = image['filename'] fsize = s return str(icon_dir / fname) def _parse_from_pbxproj(pbxproj_path, key): """Parse values from apple project files. This is a naive regex based parser. Should this proofe to unreliable we might want to consider using a dedicated pbxproj parser: https://pypi.org/project/pbxproj/ e.g. when looking for key 'ASSETCATALOG_COMPILER_APPICON_NAME' This function will extract 'MyIcon' from if the provided file contains this line: ASSETCATALOG_COMPILER_APPICON_NAME = MyIcon; returns None if parsing for that value didn't yield anything """ r = re.compile(f"\\s*{key}\\s*=\\s*(?P[a-zA-Z0-9-_]+)\\s*;\\s*") with open(pbxproj_path, 'r', encoding='utf-8') as f: for line in f.readlines(): m = r.match(line) if m: return m.group("value") return None def _sanitize_sdk_version(value): """Sanitize the raw values from androguard to handle bad values. minSdkVersion/targetSdkVersion/maxSdkVersion must be integers, but that doesn't stop devs from doing strange things like setting them using Android XML strings. This method makes the Androguard output match the output from `aapt dump badging`: bad values are ignored. https://gitlab.com/souch/SMSbypass/blob/v0.9/app/src/main/AndroidManifest.xml#L29 https://gitlab.com/souch/SMSbypass/blob/v0.9/app/src/main/res/values/strings.xml#L27 """ try: sdk_version = int(value) if sdk_version > 0: return sdk_version except (TypeError, ValueError): pass return None def scan_apk_androguard(apk, apkfile): try: apkobject = common.get_androguard_APK(apkfile) if apkobject.is_valid_APK(): arsc = apkobject.get_android_resources() else: if options.delete_unknown: if os.path.exists(apkfile): logging.error(_("Failed to get APK information, deleting {path}") .format(path=apkfile)) os.remove(apkfile) else: logging.error(_("Could not find {path} to remove it") .format(path=apkfile)) else: logging.error(_("Failed to get APK information, skipping {path}") .format(path=apkfile)) raise BuildException(_("Invalid APK")) except (FileNotFoundError, ValueError, zipfile.BadZipFile) as e: logging.error(_("Could not open APK {path} for analysis: ").format(path=apkfile) + str(e)) raise BuildException(_("Invalid APK")) from e apk['packageName'] = apkobject.get_package() xml = apkobject.get_android_manifest_xml() androidmanifest_xml = apkobject.xml['AndroidManifest.xml'] if len(xml.nsmap) > 0: # one of them surely will be the Android one, or its corrupt xmlns = common.XMLNS_ANDROID else: # strange but sometimes the namespace is blank. This seems to # only happen with the Bromite/Chromium APKs xmlns = '{}' vcstr = androidmanifest_xml.get(xmlns + 'versionCode') if vcstr.startswith('0x'): apk['versionCode'] = int(vcstr, 16) else: apk['versionCode'] = int(vcstr) apk['name'] = apkobject.get_app_name() apk['versionName'] = common.ensure_final_value(apk['packageName'], arsc, androidmanifest_xml.get(xmlns + 'versionName')) minSdkVersion = _sanitize_sdk_version(apkobject.get_min_sdk_version()) if minSdkVersion is not None: apk['minSdkVersion'] = minSdkVersion targetSdkVersion = _sanitize_sdk_version(apkobject.get_target_sdk_version()) if targetSdkVersion is not None: apk['targetSdkVersion'] = targetSdkVersion maxSdkVersion = _sanitize_sdk_version(apkobject.get_max_sdk_version()) if maxSdkVersion is not None: apk['maxSdkVersion'] = maxSdkVersion icon_id_str = apkobject.get_attribute_value("application", "icon") if icon_id_str: try: icon_id = int(icon_id_str.replace("@", "0x"), 16) resource_id = arsc.get_id(apk['packageName'], icon_id) if resource_id: icon_name = arsc.get_id(apk['packageName'], icon_id)[1] else: # don't use 'anydpi' aka 0xFFFE aka 65534 since it is XML icon_name = os.path.splitext(os.path.basename(apkobject.get_app_icon(max_dpi=65534 - 1)))[0] apk['icons_src'] = _get_apk_icons_src(apkfile, icon_name) except Exception as e: logging.error("Cannot fetch icon from %s: %s" % (apkfile, str(e))) arch_re = re.compile("^lib/(.*)/.*$") arch = set([arch_re.match(file).group(1) for file in apkobject.get_files() if arch_re.match(file)]) if len(arch) >= 1: apk['nativecode'] = [] apk['nativecode'].extend(sorted(list(arch))) for item in xml.findall('uses-permission'): name = item.attrib.get(xmlns + 'name') if not name: logging.debug( _('Ignoring bad element in manifest: %s') % ElementTree.tostring(item).decode() ) continue maxSdkVersion = item.attrib.get(xmlns + 'maxSdkVersion') maxSdkVersion = int(maxSdkVersion) if maxSdkVersion else None permission = UsesPermission(str(name), maxSdkVersion) apk['uses-permission'].append(permission) for name, maxSdkVersion in apkobject.get_uses_implied_permission_list(): permission = UsesPermission( name, maxSdkVersion ) apk['uses-permission'].append(permission) for item in xml.findall('uses-permission-sdk-23'): name = item.attrib.get(xmlns + 'name') if not name: logging.debug( _('Ignoring bad element in manifest: %s') % ElementTree.tostring(item).decode() ) continue maxSdkVersion = item.attrib.get(xmlns + 'maxSdkVersion') maxSdkVersion = int(maxSdkVersion) if maxSdkVersion else None permission_sdk_23 = UsesPermissionSdk23(str(name), maxSdkVersion) apk['uses-permission-sdk-23'].append(permission_sdk_23) for item in xml.findall('uses-feature'): feature = str(item.attrib.get(xmlns + 'name', '')) if not feature: logging.debug( _('Ignoring bad element in manifest: %s') % ElementTree.tostring(item).decode() ) continue if feature not in ( 'android.hardware.screen.portrait', 'android.hardware.screen.landscape', ): if feature.startswith("android.feature."): feature = feature[16:] required = item.attrib.get(xmlns + 'required') if required is None or required == 'true': apk['features'].append(feature) def process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk=False, allow_disabled_algorithms=False, archive_bad_sig=False, apps=None): """Process the apk with the given filename in the given repo directory. This also extracts the icons. Parameters ---------- apkcache current apk cache information apkfilename the filename of the apk to scan repodir repo directory to scan knownapks known apks info use_date_from_apk use date from APK (instead of current date) for newly added APKs allow_disabled_algorithms allow APKs with valid signatures that include disabled algorithms in the signature (e.g. MD5) archive_bad_sig move APKs with a bad signature to the archive Returns ------- (skip, apk, cachechanged) where skip is a boolean indicating whether to skip this apk, apk is the scanned apk information, and cachechanged is True if the apkcache got changed. """ apk = {} apkfile = os.path.join(repodir, apkfilename) cachechanged = False usecache = False if apkfilename in apkcache: apk = apkcache[apkfilename] if apk.get('hash') == common.sha256sum(apkfile): logging.debug(_("Reading {apkfilename} from cache") .format(apkfilename=apkfilename)) usecache = True else: logging.debug(_("Ignoring stale cache data for {apkfilename}") .format(apkfilename=apkfilename)) if not usecache: logging.debug(_("Processing {apkfilename}").format(apkfilename=apkfilename)) try: apk = scan_apk(apkfile) except BuildException: logging.warning(_("Skipping '{apkfilename}' with invalid signature!") .format(apkfilename=apkfilename)) return True, None, False if apps: if apk['packageName'] in apps: for build in apps[apk['packageName']].get('Builds', []): if build['versionCode'] == apk['versionCode'] and build['disable']: return True, None, False # Check for debuggable apks... if common.is_debuggable_or_testOnly(apkfile): logging.warning( "%s: debuggable or testOnly set in AndroidManifest.xml" % apkfile ) if options.rename_apks: n = apk['packageName'] + '_' + str(apk['versionCode']) + '.apk' std_short_name = os.path.join(repodir, n) if apkfile != std_short_name: if os.path.exists(std_short_name): std_long_name = std_short_name.replace('.apk', '_' + apk['sig'][:7] + '.apk') if apkfile != std_long_name: if os.path.exists(std_long_name): dupdir = os.path.join('duplicates', repodir) if not os.path.isdir(dupdir): os.makedirs(dupdir, exist_ok=True) dupfile = os.path.join('duplicates', std_long_name) logging.warning('Moving duplicate ' + std_long_name + ' to ' + dupfile) os.rename(apkfile, dupfile) return True, None, False else: os.rename(apkfile, std_long_name) apkfile = std_long_name else: os.rename(apkfile, std_short_name) apkfile = std_short_name apkfilename = apkfile[len(repodir) + 1:] apk['apkName'] = apkfilename srcfilename = apkfilename[:-4] + "_src.tar.gz" if os.path.exists(os.path.join(repodir, srcfilename)): apk['srcname'] = srcfilename # verify the jar signature is correct, allow deprecated # algorithms only if the APK is in the archive. skipapk = False if not common.verify_apk_signature(apkfile): if repodir == 'archive' or allow_disabled_algorithms: try: common.verify_deprecated_jar_signature(apkfile) apk['antiFeatures'].update(['KnownVuln', 'DisabledAlgorithm']) # TODO except VerificationException: skipapk = True else: skipapk = True if skipapk: if archive_bad_sig: logging.warning(_('Archiving {apkfilename} with invalid signature!') .format(apkfilename=apkfilename)) move_apk_between_sections(repodir, 'archive', apk) else: logging.warning(_('Skipping {apkfilename} with invalid signature!') .format(apkfilename=apkfilename)) return True, None, False apkzip = zipfile.ZipFile(apkfile, 'r') manifest = apkzip.getinfo('AndroidManifest.xml') # 1980-0-0 means zeroed out, any other invalid date should trigger a warning if (1980, 0, 0) != manifest.date_time[0:3]: try: common.check_system_clock(datetime(*manifest.date_time), apkfilename) except ValueError as e: logging.warning(_("{apkfilename}'s AndroidManifest.xml has a bad date: ") .format(apkfilename=apkfile) + str(e)) # extract icons from APK zip file iconfilename = "%s.%s.png" % (apk['packageName'], apk['versionCode']) try: empty_densities = extract_apk_icons(iconfilename, apk, apkzip, repodir) finally: apkzip.close() # ensure that APK zip file gets closed # resize existing icons for densities missing in the APK fill_missing_icon_densities(empty_densities, iconfilename, apk, repodir) if use_date_from_apk: default_date_param = datetime.fromtimestamp(os.stat(apkfile).st_mtime) else: default_date_param = None # Record in known apks, getting the added date at the same time.. added = knownapks.recordapk(apk['apkName'], apk['packageName'], default_date=default_date_param) if added: apk['added'] = added apkcache[apkfilename] = apk cachechanged = True return False, apk, cachechanged def process_apks(apkcache, repodir, knownapks, use_date_from_apk=False, apps=None): """Process the apks in the given repo directory. This also extracts the icons. Parameters ---------- apkcache current apk cache information repodir repo directory to scan knownapks b known apks info use_date_from_apk use date from APK (instead of current date) for newly added APKs Returns ------- (apks, cachechanged) where apks is a list of apk information, and cachechanged is True if the apkcache got changed. """ cachechanged = False for icon_dir in get_all_icon_dirs(repodir): if os.path.exists(icon_dir): if options is not None and options.clean: shutil.rmtree(icon_dir) os.makedirs(icon_dir) else: os.makedirs(icon_dir) apks = [] for apkfile in sorted(glob.glob(os.path.join(repodir, '*.apk'))): apkfilename = apkfile[len(repodir) + 1:] ada = disabled_algorithms_allowed() (skip, apk, cachethis) = process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk, ada, True, apps) if skip: continue apks.append(apk) cachechanged = cachechanged or cachethis return apks, cachechanged def extract_apk_icons(icon_filename, apk, apkzip, repo_dir): """Extract PNG icons from an APK with the supported pixel densities. Extracts icons from the given APK zip in various densities, saves them into given repo directory and stores their names in the APK metadata dictionary. If the icon is an XML icon, then this tries to find PNG icon that can replace it. Parameters ---------- icon_filename A string representing the icon's file name apk A populated dictionary containing APK metadata. Needs to have 'icons_src' key apkzip An opened zipfile.ZipFile of the APK file repo_dir The directory of the APK's repository Returns ------- A list of icon densities that are missing """ res_name_re = re.compile(r'res/(drawable|mipmap)-(x*[hlm]dpi|anydpi).*/(.*)_[0-9]+dp.(png|xml)') pngs = dict() for f in apkzip.namelist(): m = res_name_re.match(f) if m and m.group(4) == 'png': density = screen_resolutions[m.group(2)] pngs[m.group(3) + '/' + density] = m.group(0) empty_densities = [] for density in screen_densities: if density not in apk['icons_src']: empty_densities.append(density) continue icon_src = apk['icons_src'][density] icon_dir = get_icon_dir(repo_dir, density) icon_dest = os.path.join(icon_dir, icon_filename) # Extract the icon files per density if icon_src.endswith('.xml'): m = res_name_re.match(icon_src) if m: name = pngs.get(m.group(3) + '/' + str(density)) if name: icon_src = name if icon_src.endswith('.xml'): empty_densities.append(density) continue try: with open(icon_dest, 'wb') as f: f.write(get_icon_bytes(apkzip, icon_src)) apk['icons'][density] = icon_filename except (zipfile.BadZipFile, ValueError, KeyError) as e: logging.warning("Error retrieving icon file: %s %s", icon_dest, e) del apk['icons_src'][density] empty_densities.append(density) # '-1' here is a remnant of the parsing of aapt output, meaning "no DPI specified" if '-1' in apk['icons_src'] and not apk['icons_src']['-1'].endswith('.xml'): icon_src = apk['icons_src']['-1'] icon_path = os.path.join(get_icon_dir(repo_dir, '0'), icon_filename) with open(icon_path, 'wb') as f: f.write(get_icon_bytes(apkzip, icon_src)) im = None try: im = Image.open(icon_path) dpi = px_to_dpi(im.size[0]) for density in screen_densities: if density in apk['icons']: break if density == screen_densities[-1] or dpi >= int(density): apk['icons'][density] = icon_filename shutil.move(icon_path, os.path.join(get_icon_dir(repo_dir, density), icon_filename)) empty_densities.remove(density) break except Exception as e: logging.warning(_("Failed reading {path}: {error}") .format(path=icon_path, error=e)) finally: if im and hasattr(im, 'close'): im.close() if apk['icons']: apk['icon'] = icon_filename return empty_densities def fill_missing_icon_densities(empty_densities, icon_filename, apk, repo_dir): """Resize existing PNG icons for densities missing in the APK to ensure all densities are available. Parameters ---------- empty_densities: A list of icon densities that are missing icon_filename: A string representing the icon's file name apk: A populated dictionary containing APK metadata. Needs to have 'icons' key repo_dir: The directory of the APK's repository """ # First try resizing down to not lose quality last_density = None for density in screen_densities: if density == '65534': # not possible to generate 'anydpi' from other densities continue if density not in empty_densities: last_density = density continue if last_density is None: continue logging.debug("Density %s not available, resizing down from %s", density, last_density) last_icon_path = os.path.join(get_icon_dir(repo_dir, last_density), icon_filename) icon_path = os.path.join(get_icon_dir(repo_dir, density), icon_filename) fp = None try: fp = open(last_icon_path, 'rb') im = Image.open(fp) size = dpi_to_px(density) im.thumbnail((size, size), Image.LANCZOS) im.save(icon_path, "PNG", optimize=True, pnginfo=BLANK_PNG_INFO, icc_profile=None) empty_densities.remove(density) except Exception as e: logging.warning("Invalid image file at %s: %s", last_icon_path, e) finally: if fp: fp.close() # Then just copy from the highest resolution available last_density = None for density in reversed(screen_densities): if density not in empty_densities: last_density = density continue if last_density is None: continue shutil.copyfile( os.path.join(get_icon_dir(repo_dir, last_density), icon_filename), os.path.join(get_icon_dir(repo_dir, density), icon_filename) ) empty_densities.remove(density) for density in screen_densities: icon_dir = get_icon_dir(repo_dir, density) icon_dest = os.path.join(icon_dir, icon_filename) resize_icon(icon_dest, density) # Copy from icons-mdpi to icons since mdpi is the baseline density baseline = os.path.join(get_icon_dir(repo_dir, '160'), icon_filename) if os.path.isfile(baseline): apk['icons']['0'] = icon_filename shutil.copyfile(baseline, os.path.join(get_icon_dir(repo_dir, '0'), icon_filename)) def apply_info_from_latest_apk(apps, apks): """No summary. Some information from the apks needs to be applied up to the application level. When doing this, we use the info from the most recent version's apk. We deal with figuring out when the app was added and last updated at the same time. """ for appid, app in apps.items(): bestver = UNSET_VERSION_CODE for apk in apks: if apk['packageName'] == appid: if apk['versionCode'] > bestver: bestver = apk['versionCode'] bestapk = apk if not app['added']: logging.debug("Don't know when " + appid + " was added") if not app['lastUpdated']: logging.debug("Don't know when " + appid + " was last updated") if bestver == UNSET_VERSION_CODE: app['icon'] = None logging.debug("Application " + appid + " has no packages") else: app.icon = bestapk['icon'] if 'icon' in bestapk else None if app.get('CurrentVersionCode') is None: app['CurrentVersionCode'] = bestver def archive_old_apks(apps, apks, archapks, repodir, archivedir, defaultkeepversions): def filter_apk_list_sorted(apk_list): apkList = [] currentVersionApk = None for apk in apk_list: if apk['packageName'] == appid: if app.get('CurrentVersionCode') is not None: if apk['versionCode'] == app['CurrentVersionCode']: currentVersionApk = apk continue apkList.append(apk) # Sort the apk list by version code. First is highest/newest. sorted_list = sorted(apkList, key=lambda apk: apk['versionCode'], reverse=True) if currentVersionApk: # Insert apk which corresponds to currentVersion at the front sorted_list.insert(0, currentVersionApk) return sorted_list for appid, app in apps.items(): if app.get('ArchivePolicy') is not None: keepversions = app['ArchivePolicy'] else: keepversions = defaultkeepversions if app.get('VercodeOperation'): keepversions *= len(app['VercodeOperation']) if common.metadata_find_developer_signing_files(appid, app['CurrentVersionCode']): keepversions *= 2 logging.debug(_("Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}") .format(appid=appid, integer=len(apks), keep=keepversions, arch=len(archapks))) all_app_apks = filter_apk_list_sorted(apks + archapks) # determine which apks to keep in repo keep = [] for apk in all_app_apks: if len(keep) == keepversions: break if 'antiFeatures' not in apk: # TODO keep.append(apk) elif 'DisabledAlgorithm' not in apk['antiFeatures'] or disabled_algorithms_allowed(): keep.append(apk) # actually move apks to the target section for apk in all_app_apks: if apk in apks and apk not in keep: apks.remove(apk) archapks.append(apk) move_apk_between_sections(repodir, archivedir, apk) elif apk in archapks and apk in keep: archapks.remove(apk) apks.append(apk) move_apk_between_sections(archivedir, repodir, apk) def move_apk_between_sections(from_dir, to_dir, apk): """Move an APK from repo to archive or vice versa.""" def _move_file(from_dir, to_dir, filename, ignore_missing): from_path = os.path.join(from_dir, filename) if ignore_missing and not os.path.exists(from_path): return to_path = os.path.join(to_dir, filename) if not os.path.exists(to_dir): os.mkdir(to_dir) shutil.move(from_path, to_path) if from_dir == to_dir: return logging.info("Moving %s from %s to %s" % (apk['apkName'], from_dir, to_dir)) _move_file(from_dir, to_dir, apk['apkName'], False) _move_file(from_dir, to_dir, apk['apkName'] + '.asc', True) _move_file(from_dir, to_dir, apk['apkName'] + '.idsig', True) _move_file(from_dir, to_dir, apk['apkName'][:-4] + '.log.gz', True) for density in all_screen_densities: from_icon_dir = get_icon_dir(from_dir, density) to_icon_dir = get_icon_dir(to_dir, density) if density not in apk.get('icons', []): continue _move_file(from_icon_dir, to_icon_dir, apk['icons'][density], True) if 'srcname' in apk: _move_file(from_dir, to_dir, apk['srcname'], False) _move_file(from_dir, to_dir, apk['srcname'] + '.asc', True) def add_apks_to_per_app_repos(repodir, apks): apks_per_app = dict() for apk in apks: apk['per_app_dir'] = os.path.join(apk['packageName'], 'fdroid') apk['per_app_repo'] = os.path.join(apk['per_app_dir'], 'repo') apk['per_app_icons'] = os.path.join(apk['per_app_repo'], 'icons') apks_per_app[apk['packageName']] = apk if not os.path.exists(apk['per_app_icons']): logging.info(_('Adding new repo for only {name}').format(name=apk['packageName'])) os.makedirs(apk['per_app_icons']) apkpath = os.path.join(repodir, apk['apkName']) shutil.copy(apkpath, apk['per_app_repo']) apksigpath = apkpath + '.sig' if os.path.exists(apksigpath): shutil.copy(apksigpath, apk['per_app_repo']) apkascpath = apkpath + '.asc' if os.path.exists(apkascpath): shutil.copy(apkascpath, apk['per_app_repo']) def create_metadata_from_template(apk): """Create a new metadata file using internal or external template. Generate warnings for apk's with no metadata (or create skeleton metadata files, if requested on the command line). Though the template file is YAML, this uses neither pyyaml nor ruamel.yaml since those impose things on the metadata file made from the template: field sort order, empty field value, formatting, etc. """ if os.path.exists('template.yml'): with open('template.yml') as f: metatxt = f.read() if 'name' in apk and apk['name'] != '': metatxt = re.sub(r'''^(((Auto)?Name|Summary):)[ '"\.]*$''', r'\1 ' + apk['name'], metatxt, flags=re.IGNORECASE | re.MULTILINE) else: logging.warning(_('{appid} does not have a name! Using application ID instead.') .format(appid=apk['packageName'])) metatxt = re.sub(r'^(((Auto)?Name|Summary):).*$', r'\1 ' + apk['packageName'], metatxt, flags=re.IGNORECASE | re.MULTILINE) # make sure unset string values will be interpreted as blank strings str_fields = [x for x in metadata.yaml_app_fields if metadata.fieldtype(x) == metadata.TYPE_STRING] metatxt = re.sub(r'^(' + '|'.join(str_fields) + '):\\s*$', r"\1: ''", metatxt, flags=re.MULTILINE) with open(os.path.join('metadata', apk['packageName'] + '.yml'), 'w') as f: f.write(metatxt) else: app = dict() app['Categories'] = [os.path.basename(os.getcwd())] # include some blanks as part of the template app['AuthorName'] = '' app['Summary'] = '' app['WebSite'] = '' app['IssueTracker'] = '' app['SourceCode'] = '' app['CurrentVersionCode'] = 2147483647 # Java's Integer.MAX_VALUE if 'name' in apk and apk['name'] != '': app['Name'] = apk['name'] else: logging.warning(_('{appid} does not have a name! Using application ID instead.') .format(appid=apk['packageName'])) app['Name'] = apk['packageName'] with open(os.path.join('metadata', apk['packageName'] + '.yml'), 'w') as f: yaml.dump(app, f, default_flow_style=False) logging.info(_("Generated skeleton metadata for {appid}").format(appid=apk['packageName'])) def read_added_date_from_all_apks(apps, apks): """No summary. Added dates come from the stats/known_apks.txt file but are read when scanning apks and thus need to be applied form apk level to app level for _all_ apps and not only from non-archived ones TODO: read the added dates directly from known_apks.txt instead of going through apks that way it also works for for repos that don't keep an archive of apks. """ for appid, app in apps.items(): for apk in apks: if apk['packageName'] == appid: if 'added' in apk: if not app.get('added') or apk['added'] < app['added']: app['added'] = apk['added'] if not app.get('lastUpdated') or apk['added'] > app['lastUpdated']: app['lastUpdated'] = apk['added'] def insert_missing_app_names_from_apks(apps, apks): """Use app name from APK if it is not set in the metadata. Name -> localized -> from APK The name from the APK is set as the default name for the app if there is no other default set, e.g. app['Name'] or app['localized'][DEFAULT_LOCALE]['name']. The default is defined in the F-Droid ecosystem as the locale of last resort, as in the one that should always be present. en-US is used since it is the locale of the source strings. This should only be used for index v0 and v1. Later versions of the index should be sorted by Application ID, since it is guaranteed to always be there. Before, the index was stored by the app name (aka ) to save the website from having to sort the entries. That is no longer relevant since the website switched from Wordpress to Jekyll. """ for appid, app in apps.items(): if app.get('Name') is not None: continue if app.get('localized', {}).get(DEFAULT_LOCALE, {}).get('name') is not None: continue bestver = UNSET_VERSION_CODE for apk in apks: if apk['packageName'] == appid: if apk.get('name') and apk['versionCode'] > bestver: bestver = apk['versionCode'] bestapk = apk if bestver != UNSET_VERSION_CODE: if 'localized' not in app: app['localized'] = {} if DEFAULT_LOCALE not in app['localized']: app['localized'][DEFAULT_LOCALE] = {} app['localized'][DEFAULT_LOCALE]['name'] = bestapk.get('name') def get_apps_with_packages(apps, apks): """Return a deepcopy of that subset apps that actually has any associated packages. Skips disabled apps.""" appsWithPackages = collections.OrderedDict() for packageName in apps: app = apps[packageName] if app['Disabled']: continue # only include apps with packages for apk in apks: if apk['packageName'] == packageName: newapp = copy.copy(app) appsWithPackages[packageName] = newapp break return appsWithPackages def get_apks_without_allowed_signatures(app, apk): """Check the APK or package has been signed by one of the allowed signing certificates. The fingerprint of the signing certificate is the standard X.509 SHA-256 fingerprint as a hex string. It can be fetched from an APK using: apksigner verify --print-certs my.apk | grep SHA-256 Parameters ---------- app The app which declares the AllowedSigningKey apk The APK to check """ if not app or not apk: return allowed_signer_keys = app.get('AllowedAPKSigningKeys', []) if not allowed_signer_keys: return if apk['signer'] not in allowed_signer_keys: return apk['apkName'] def prepare_apps(apps, apks, repodir): """Encapsulate all necessary preparation steps before we can build an index out of apps and apks. Parameters ---------- apps All apps as read from metadata apks list of apks that belong into repo, this gets modified in place repodir the target repository directory, metadata files will be copied here Returns ------- the relevant subset of apps (as a deepcopy) """ apps_with_packages = get_apps_with_packages(apps, apks) apply_info_from_latest_apk(apps_with_packages, apks) insert_funding_yml_donation_links(apps) # This is only currently done for /repo because doing it for the archive # will take a lot of time and bloat the archive mirrors and index if repodir == 'repo': copy_triple_t_store_metadata(apps_with_packages) insert_obbs(repodir, apps_with_packages, apks) translate_per_build_anti_features(apps_with_packages, apks) if repodir == 'repo': insert_localized_app_metadata(apps_with_packages) insert_localized_ios_app_metadata(apps_with_packages) ingest_screenshots_from_repo_dir(apps_with_packages) insert_missing_app_names_from_apks(apps_with_packages, apks) return apps_with_packages config = None options = None start_timestamp = time.gmtime() def main(): global config, options # Parse command line... parser = ArgumentParser() common.setup_global_opts(parser) parser.add_argument("--create-key", action="store_true", default=False, help=_("Add a repo signing key to an unsigned repo")) parser.add_argument("-c", "--create-metadata", action="store_true", default=False, help=_("Add skeleton metadata files for APKs that are missing them")) parser.add_argument("--delete-unknown", action="store_true", default=False, help=_("Delete APKs and/or OBBs without metadata from the repo")) parser.add_argument("-I", "--icons", action="store_true", default=False, help=_("Resize all the icons exceeding the max pixel size and exit")) parser.add_argument("-w", "--wiki", default=False, action="store_true", help=argparse.SUPPRESS) parser.add_argument("--pretty", action="store_true", default=False, help=_("Produce human-readable XML/JSON for index files")) parser.add_argument("--clean", action="store_true", default=False, help=_("Clean update - don't uses caches, reprocess all APKs")) parser.add_argument("--nosign", action="store_true", default=False, help=_("When configured for signed indexes, create only unsigned indexes at this stage")) parser.add_argument("--use-date-from-apk", action="store_true", default=False, help=_("Use date from APK instead of current time for newly added APKs")) parser.add_argument("--rename-apks", action="store_true", default=False, help=_("Rename APK files that do not match package.name_123.apk")) parser.add_argument("--allow-disabled-algorithms", action="store_true", default=False, help=_("Include APKs that are signed with disabled algorithms like MD5")) metadata.add_metadata_arguments(parser) options = common.parse_args(parser) metadata.warnings_action = options.W config = common.read_config() common.setup_status_output(start_timestamp) if not (('jarsigner' in config or 'apksigner' in config) and 'keytool' in config): raise FDroidException(_('Java JDK not found! Install in standard location or set java_paths!')) repodirs = ['repo'] if config['archive_older'] != 0: repodirs.append('archive') if not os.path.exists('archive'): os.mkdir('archive') if options.icons: resize_all_icons(repodirs) sys.exit(0) if options.rename_apks: options.clean = True # check that icons exist now, rather than fail at the end of `fdroid update` for k in ['repo_icon', 'archive_icon']: if k in config: if not os.path.exists(config[k]): logging.warning(_('{name} "{section}/icons/{path}" does not exist! Check "config.yml".') .format(name=k, section=k.split('_')[0], path=config[k])) # if the user asks to create a keystore, do it now, reusing whatever it can if options.create_key: if os.path.exists(config['keystore']): logging.critical(_("Cowardily refusing to overwrite existing signing key setup!")) logging.critical("\t'" + config['keystore'] + "'") sys.exit(1) if 'repo_keyalias' not in config: config['repo_keyalias'] = socket.getfqdn() common.write_to_config(config, 'repo_keyalias', config['repo_keyalias']) if 'keydname' not in config: config['keydname'] = 'CN=' + config['repo_keyalias'] + ', OU=F-Droid' common.write_to_config(config, 'keydname', config['keydname']) if 'keystore' not in config: config['keystore'] = common.default_config['keystore'] common.write_to_config(config, 'keystore', config['keystore']) password = common.genpassword() if 'keystorepass' not in config: config['keystorepass'] = password common.write_to_config(config, 'keystorepass', config['keystorepass']) if 'keypass' not in config and not config['keystore'] == "NONE": config['keypass'] = password common.write_to_config(config, 'keypass', config['keypass']) common.genkeystore(config) # Get all apps... apps = metadata.read_metadata() # Read known apks data (will be updated and written back when we've finished) knownapks = common.KnownApks() # Get APK cache apkcache = get_cache() # Delete builds for disabled apps delete_disabled_builds(apps, apkcache, repodirs) # Scan all apks in the main repo apks, cachechanged = process_apks(apkcache, repodirs[0], knownapks, options.use_date_from_apk, apps) files, fcachechanged = scan_repo_files(apkcache, repodirs[0], knownapks, options.use_date_from_apk) cachechanged = cachechanged or fcachechanged apks += files ipas, icachechanged = scan_repo_for_ipas(apkcache, repodirs[0], knownapks) cachechanged = cachechanged or icachechanged apks += ipas appid_has_apks = set() appid_has_repo_files = set() remove_apks = [] for apk in apks: to_remove = get_apks_without_allowed_signatures(apps.get(apk['packageName']), apk) if to_remove: remove_apks.append(apk) logging.warning( _('"{path}" is signed by a key that is not allowed:').format( path=to_remove ) + '\n' + apk['signer'] ) if options.delete_unknown: for d in repodirs: path = Path(d) / to_remove if path.exists(): logging.warning(_('Removing {path}"').format(path=path)) path.unlink() if apk['apkName'].endswith('.apk'): appid_has_apks.add(apk['packageName']) else: appid_has_repo_files.add(apk['packageName']) if apk['packageName'] not in apps: if options.create_metadata: create_metadata_from_template(apk) apps = metadata.read_metadata() else: msg = _("{apkfilename} ({appid}) has no metadata!") \ .format(apkfilename=apk['apkName'], appid=apk['packageName']) if options.delete_unknown: logging.warning(msg + '\n\t' + _("deleting: repo/{apkfilename}") .format(apkfilename=apk['apkName'])) rmf = os.path.join(repodirs[0], apk['apkName']) if not os.path.exists(rmf): logging.error(_("Could not find {path} to remove it").format(path=rmf)) else: os.remove(rmf) else: logging.warning(msg + '\n\t' + _('Use `fdroid update -c` to create it.')) for apk in remove_apks: apks.remove(apk) mismatch_errors = '' for appid in appid_has_apks: if appid in appid_has_repo_files: appid_files = ', '.join(glob.glob(os.path.join('repo', appid + '_[0-9]*.*'))) mismatch_errors += (_('{appid} has both APKs and files: {files}') .format(appid=appid, files=appid_files)) + '\n' if mismatch_errors: raise FDroidException(mismatch_errors) # Scan the archive repo for apks as well if len(repodirs) > 1: archapks, cc = process_apks(apkcache, repodirs[1], knownapks, options.use_date_from_apk, apps) if cc: cachechanged = True else: archapks = [] if cachechanged: write_cache(apkcache) # The added date currently comes from the oldest apk which might be in the archive. # So we need this populated at app level before continuing with only processing /repo # or /archive read_added_date_from_all_apks(apps, apks + archapks) if len(repodirs) > 1: archive_old_apks(apps, apks, archapks, repodirs[0], repodirs[1], config['archive_older']) archived_apps = prepare_apps(apps, archapks, repodirs[1]) fdroidserver.index.make(archived_apps, archapks, repodirs[1], True) repoapps = prepare_apps(apps, apks, repodirs[0]) # APKs are placed into multiple repos based on the app package, providing # per-app subscription feeds for nightly builds and things like it if config['per_app_repos']: add_apks_to_per_app_repos(repodirs[0], apks) for appid, app in apps.items(): repodir = os.path.join(appid, 'fdroid', 'repo') app_dict = dict() app_dict[appid] = app if os.path.isdir(repodir): fdroidserver.index.make(app_dict, apks, repodir, False) else: logging.info(_('Skipping index generation for {appid}').format(appid=appid)) return # Make the index for the main repo... fdroidserver.index.make(repoapps, apks, repodirs[0], False) git_remote = config.get('binary_transparency_remote') if git_remote or os.path.isdir(os.path.join('binary_transparency', '.git')): from . import btlog btlog.make_binary_transparency_log(repodirs) if config['update_stats']: # Update known apks info... knownapks.writeifchanged() status_update_json(apps, apks + archapks) logging.info(_("Finished")) if __name__ == "__main__": main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/verify.py0000644000175000017500000002044314620351225017361 0ustar00hanshans#!/usr/bin/env python3 # # verify.py - part of the FDroid server tools # Copyright (C) 2013, Ciaran Gultnieks, ciaran@ciarang.com # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import sys import os import glob import json import logging import requests from argparse import ArgumentParser from collections import OrderedDict from . import _ from . import common from . import net from .exception import FDroidException config = None def _add_diffoscope_info(d): """Add diffoscope setup metadata to provided dict under 'diffoscope' key. The imports are broken out at stages since various versions of diffoscope support various parts of these. """ try: import diffoscope d['diffoscope'] = dict() d['diffoscope']['VERSION'] = diffoscope.VERSION from diffoscope.comparators import ComparatorManager ComparatorManager().reload() from diffoscope.tools import tool_check_installed, tool_required external_tools = sorted(tool_required.all) external_tools = [ tool for tool in external_tools if not tool_check_installed(tool) ] d['diffoscope']['External-Tools-Required'] = external_tools from diffoscope.tools import OS_NAMES, get_current_os from diffoscope.external_tools import EXTERNAL_TOOLS current_os = get_current_os() os_list = [current_os] if (current_os in OS_NAMES) else iter(OS_NAMES) for os_ in os_list: tools = set() for x in external_tools: try: tools.add(EXTERNAL_TOOLS[x][os_]) except KeyError: pass tools = sorted(tools) d['diffoscope']['Available-in-{}-packages'.format(OS_NAMES[os_])] = tools from diffoscope.tools import python_module_missing as pmm d['diffoscope']['Missing-Python-Modules'] = sorted(pmm.modules) except ImportError: pass def write_json_report(url, remote_apk, unsigned_apk, compare_result): """Write out the results of the verify run to JSON. This builds up reports on the repeated runs of `fdroid verify` on a set of apps. It uses the timestamps on the compared files to ensure that there is only one report per file, even when run repeatedly. The output is run through JSON to normalize things like tuples vs lists. """ jsonfile = unsigned_apk + '.json' if os.path.exists(jsonfile): with open(jsonfile) as fp: data = json.load(fp, object_pairs_hook=OrderedDict) else: data = OrderedDict() output = dict() _add_diffoscope_info(output) output['url'] = url for key, filename in (('local', unsigned_apk), ('remote', remote_apk)): d = dict() output[key] = d d['file'] = filename d['sha256'] = common.sha256sum(filename) d['timestamp'] = os.stat(filename).st_ctime d['packageName'], d['versionCode'], d['versionName'] = common.get_apk_id( filename ) if compare_result: output['verified'] = False output['result'] = compare_result else: output['verified'] = True # str makes better dict keys than float data[str(output['local']['timestamp'])] = output with open(jsonfile, 'w') as fp: json.dump(data, fp, sort_keys=True) if output['verified']: jsonfile = 'unsigned/verified.json' if os.path.exists(jsonfile): with open(jsonfile) as fp: data = json.load(fp) else: data = OrderedDict() data['packages'] = OrderedDict() packageName = output['local']['packageName'] if packageName not in data['packages']: data['packages'][packageName] = [] found = False output_dump = json.dumps(output, sort_keys=True) for p in data['packages'][packageName]: if output_dump == json.dumps(p, sort_keys=True): found = True break if not found: data['packages'][packageName].insert(0, json.loads(output_dump)) with open(jsonfile, 'w') as fp: json.dump(data, fp, cls=common.Encoder, sort_keys=True) def main(): global config # Parse command line... parser = ArgumentParser( usage="%(prog)s [options] [APPID[:VERCODE] [APPID[:VERCODE] ...]]" ) common.setup_global_opts(parser) parser.add_argument( "appid", nargs='*', help=_("application ID with optional versionCode in the form APPID[:VERCODE]"), ) parser.add_argument( "--reuse-remote-apk", action="store_true", default=False, help=_("Verify against locally cached copy rather than redownloading."), ) parser.add_argument( "--output-json", action="store_true", default=False, help=_("Output JSON report to file named after APK."), ) options = common.parse_args(parser) config = common.read_config() tmp_dir = 'tmp' if not os.path.isdir(tmp_dir): logging.info(_("Creating temporary directory")) os.makedirs(tmp_dir) unsigned_dir = 'unsigned' if not os.path.isdir(unsigned_dir): logging.error(_("No unsigned directory - nothing to do")) sys.exit(0) processed = set() verified = 0 notverified = 0 vercodes = common.read_pkg_args(options.appid, True) for apkfile in sorted(glob.glob(os.path.join(unsigned_dir, '*.apk'))): apkfilename = os.path.basename(apkfile) url = 'https://f-droid.org/repo/' + apkfilename appid, vercode = common.publishednameinfo(apkfile) if vercodes and appid not in vercodes: continue if vercodes[appid] and vercode not in vercodes[appid]: continue processed.add(appid) try: logging.info("Processing {apkfilename}".format(apkfilename=apkfilename)) remote_apk = os.path.join(tmp_dir, apkfilename) if not options.reuse_remote_apk or not os.path.exists(remote_apk): if os.path.exists(remote_apk): os.remove(remote_apk) logging.info("...retrieving " + url) try: net.download_file(url, dldir=tmp_dir) except requests.exceptions.HTTPError: try: net.download_file( url.replace('/repo', '/archive'), dldir=tmp_dir ) except requests.exceptions.HTTPError as e: raise FDroidException( _('Downloading {url} failed. {error}').format( url=url, error=e ) ) from e unsigned_apk = os.path.join(unsigned_dir, apkfilename) compare_result = common.verify_apks(remote_apk, unsigned_apk, tmp_dir) if options.output_json: write_json_report(url, remote_apk, unsigned_apk, compare_result) if compare_result: raise FDroidException(compare_result) logging.info("...successfully verified") verified += 1 except FDroidException as e: logging.info("...NOT verified - {0}".format(e)) notverified += 1 for appid in options.appid: package = appid.split(":")[0] if package not in processed: logging.critical(_("No APK for package: %s") % package) notverified += 1 if verified > 0: logging.info("{0} successfully verified".format(verified)) if notverified > 0: logging.info("{0} NOT verified".format(notverified)) sys.exit(notverified) if __name__ == "__main__": main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/fdroidserver/vmtools.py0000644000175000017500000003741414620351225017566 0ustar00hanshans#!/usr/bin/env python3 # # vmtools.py - part of the FDroid server tools # Copyright (C) 2017 Michael Poehn # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from os.path import isdir, isfile, basename, abspath, expanduser import os import json import shutil import subprocess import textwrap import logging from .common import FDroidException import threading lock = threading.Lock() def get_clean_builder(serverdir): if not os.path.isdir(serverdir): if os.path.islink(serverdir): os.unlink(serverdir) logging.info("buildserver path does not exists, creating %s", serverdir) os.makedirs(serverdir) vagrantfile = os.path.join(serverdir, 'Vagrantfile') if not os.path.isfile(vagrantfile): with open(vagrantfile, 'w') as f: f.write( textwrap.dedent( """\ # generated file, do not change. Vagrant.configure("2") do |config| config.vm.box = "buildserver" config.vm.synced_folder ".", "/vagrant", disabled: true end """ ) ) vm = get_build_vm(serverdir) logging.info('destroying buildserver before build') vm.destroy() logging.info('starting buildserver') vm.up() try: sshinfo = vm.sshinfo() except FDroidBuildVmException: # workaround because libvirt sometimes likes to forget # about ssh connection info even thou the vm is running vm.halt() vm.up() sshinfo = vm.sshinfo() return sshinfo def _check_call(cmd, cwd=None): logging.debug(' '.join(cmd)) return subprocess.check_call(cmd, shell=False, cwd=cwd) def _check_output(cmd, cwd=None): logging.debug(' '.join(cmd)) return subprocess.check_output(cmd, shell=False, cwd=cwd) def get_build_vm(srvdir, provider=None): """No summary. Factory function for getting FDroidBuildVm instances. This function tries to figure out what hypervisor should be used and creates an object for controlling a build VM. Parameters ---------- srvdir path to a directory which contains a Vagrantfile provider optionally this parameter allows specifiying an specific vagrant provider. Returns ------- FDroidBuildVm instance. """ abssrvdir = abspath(srvdir) # use supplied provider if provider: if provider == 'libvirt': logging.debug('build vm provider \'libvirt\' selected') return LibvirtBuildVm(abssrvdir) elif provider == 'virtualbox': logging.debug('build vm provider \'virtualbox\' selected') return VirtualboxBuildVm(abssrvdir) else: logging.warning('build vm provider not supported: \'%s\'', provider) # try guessing provider from installed software kvm_installed = shutil.which('kvm') is not None kvm_installed |= shutil.which('qemu') is not None kvm_installed |= shutil.which('qemu-kvm') is not None vbox_installed = shutil.which('VBoxHeadless') is not None if kvm_installed and vbox_installed: logging.debug('both kvm and vbox are installed.') elif kvm_installed: logging.debug( 'libvirt is the sole installed and supported vagrant provider, selecting \'libvirt\'' ) return LibvirtBuildVm(abssrvdir) elif vbox_installed: logging.debug( 'virtualbox is the sole installed and supported vagrant provider, selecting \'virtualbox\'' ) return VirtualboxBuildVm(abssrvdir) else: logging.debug( 'could not confirm that either virtualbox or kvm/libvirt are installed' ) # try guessing provider from .../srvdir/.vagrant internals vagrant_libvirt_path = os.path.join( abssrvdir, '.vagrant', 'machines', 'default', 'libvirt' ) has_libvirt_machine = ( isdir(vagrant_libvirt_path) and len(os.listdir(vagrant_libvirt_path)) > 0 ) vagrant_virtualbox_path = os.path.join( abssrvdir, '.vagrant', 'machines', 'default', 'virtualbox' ) has_vbox_machine = ( isdir(vagrant_virtualbox_path) and len(os.listdir(vagrant_virtualbox_path)) > 0 ) if has_libvirt_machine and has_vbox_machine: logging.info( 'build vm provider lookup found virtualbox and libvirt, defaulting to \'virtualbox\'' ) return VirtualboxBuildVm(abssrvdir) elif has_libvirt_machine: logging.debug('build vm provider lookup found \'libvirt\'') return LibvirtBuildVm(abssrvdir) elif has_vbox_machine: logging.debug('build vm provider lookup found \'virtualbox\'') return VirtualboxBuildVm(abssrvdir) # try guessing provider from available buildserver boxes available_boxes = [] import vagrant boxes = vagrant.Vagrant().box_list() for box in boxes: if box.name == "buildserver": available_boxes.append(box.provider) if "libvirt" in available_boxes and "virtualbox" in available_boxes: logging.info( 'basebox lookup found virtualbox and libvirt boxes, defaulting to \'virtualbox\'' ) return VirtualboxBuildVm(abssrvdir) elif "libvirt" in available_boxes: logging.info('\'libvirt\' buildserver box available, using that') return LibvirtBuildVm(abssrvdir) elif "virtualbox" in available_boxes: logging.info('\'virtualbox\' buildserver box available, using that') return VirtualboxBuildVm(abssrvdir) else: logging.error('No available \'buildserver\' box. Cannot proceed') os._exit(1) class FDroidBuildVmException(FDroidException): pass class FDroidBuildVm: """Abstract base class for working with FDroids build-servers. Use the factory method `fdroidserver.vmtools.get_build_vm()` for getting correct instances of this class. This is intended to be a hypervisor independent, fault tolerant wrapper around the vagrant functions we use. """ def __init__(self, srvdir, provider=None): """Create new server class.""" self.provider = provider self.srvdir = srvdir self.srvname = basename(srvdir) + '_default' self.vgrntfile = os.path.join(srvdir, 'Vagrantfile') self.srvuuid = self._vagrant_fetch_uuid() if not isdir(srvdir): raise FDroidBuildVmException( "Can not init vagrant, directory %s not present" % (srvdir) ) if not isfile(self.vgrntfile): raise FDroidBuildVmException( "Can not init vagrant, '%s' not present" % (self.vgrntfile) ) import vagrant self.vgrnt = vagrant.Vagrant( root=srvdir, out_cm=vagrant.stdout_cm, err_cm=vagrant.stdout_cm ) def up(self, provision=True): global lock with lock: try: self.vgrnt.up(provision=provision, provider=self.provider) self.srvuuid = self._vagrant_fetch_uuid() except subprocess.CalledProcessError as e: statusline = "" try: # try to get some additional info about the vagrant vm status = self.vgrnt.status() if len(status) > 0: statusline = "VM status: name={n}, state={s}, provider={p}"\ .format(n=status[0].name, s=status[0].state, p=status[0].provider) except subprocess.CalledProcessError: pass raise FDroidBuildVmException(value="could not bring up vm '{vmname}'" .format(vmname=self.srvname), detail="{err}\n{statline}" .format(err=str(e), statline=statusline) ) from e def suspend(self): global lock with lock: logging.info('suspending buildserver') try: self.vgrnt.suspend() except subprocess.CalledProcessError as e: raise FDroidBuildVmException("could not suspend vm '%s'" % self.srvname) from e def halt(self): global lock with lock: self.vgrnt.halt(force=True) def destroy(self): """Remove every trace of this VM from the system. This includes deleting: * hypervisor specific definitions * vagrant state informations (eg. `.vagrant` folder) * images related to this vm """ logging.info("destroying vm '%s'", self.srvname) try: self.vgrnt.destroy() logging.debug('vagrant destroy completed') except subprocess.CalledProcessError as e: logging.exception('vagrant destroy failed: %s', e) vgrntdir = os.path.join(self.srvdir, '.vagrant') try: shutil.rmtree(vgrntdir) logging.debug('deleted vagrant dir: %s', vgrntdir) except Exception as e: logging.debug("could not delete vagrant dir: %s, %s", vgrntdir, e) try: _check_call(['vagrant', 'global-status', '--prune']) except subprocess.CalledProcessError as e: logging.debug('pruning global vagrant status failed: %s', e) def vagrant_uuid_okay(self): """Having an uuid means that vagrant up has run successfully.""" if self.srvuuid is None: return False return True def _vagrant_file_name(self, name): return name.replace('/', '-VAGRANTSLASH-') def _vagrant_fetch_uuid(self): if isfile(os.path.join(self.srvdir, '.vagrant')): # Vagrant 1.0 - it's a json file... with open(os.path.join(self.srvdir, '.vagrant')) as f: id = json.load(f)['active']['default'] logging.debug('vm uuid: %s', id) return id elif isfile(os.path.join(self.srvdir, '.vagrant', 'machines', 'default', self.provider, 'id')): # Vagrant 1.2 (and maybe 1.1?) it's a directory tree... with open(os.path.join(self.srvdir, '.vagrant', 'machines', 'default', self.provider, 'id')) as f: id = f.read() logging.debug('vm uuid: %s', id) return id else: logging.debug('vm uuid is None') return None def box_add(self, boxname, boxfile, force=True): """Add vagrant box to vagrant. Parameters ---------- boxname name assigned to local deployment of box boxfile path to box file force overwrite existing box image (default: True) """ boxfile = abspath(boxfile) if not isfile(boxfile): raise FDroidBuildVmException( 'supplied boxfile \'%s\' does not exist' % boxfile ) self.vgrnt.box_add(boxname, abspath(boxfile), force=force) def box_remove(self, boxname): try: _check_call(['vagrant', 'box', 'remove', '--all', '--force', boxname]) except subprocess.CalledProcessError as e: logging.debug('tried removing box %s, but is did not exist: %s', boxname, e) boxpath = os.path.join( expanduser('~'), '.vagrant', self._vagrant_file_name(boxname) ) if isdir(boxpath): logging.info( "attempting to remove box '%s' by deleting: %s", boxname, boxpath ) shutil.rmtree(boxpath) def sshinfo(self): """Get ssh connection info for a vagrant VM. Returns ------- A dictionary containing 'hostname', 'port', 'user' and 'idfile' """ import paramiko try: sshconfig_path = os.path.join(self.srvdir, 'sshconfig') with open(sshconfig_path, 'wb') as fp: fp.write(_check_output(['vagrant', 'ssh-config'], cwd=self.srvdir)) vagranthost = 'default' # Host in ssh config file sshconfig = paramiko.SSHConfig() with open(sshconfig_path, 'r') as f: sshconfig.parse(f) sshconfig = sshconfig.lookup(vagranthost) idfile = sshconfig['identityfile'] if isinstance(idfile, list): idfile = idfile[0] elif idfile.startswith('"') and idfile.endswith('"'): idfile = idfile[1:-1] return { 'hostname': sshconfig['hostname'], 'port': int(sshconfig['port']), 'user': sshconfig['user'], 'idfile': idfile, } except subprocess.CalledProcessError as e: raise FDroidBuildVmException("Error getting ssh config") from e class LibvirtBuildVm(FDroidBuildVm): def __init__(self, srvdir): super().__init__(srvdir, 'libvirt') import libvirt try: self.conn = libvirt.open('qemu:///system') except libvirt.libvirtError as e: raise FDroidBuildVmException('could not connect to libvirtd: %s' % (e)) from e def destroy(self): super().destroy() # resorting to virsh instead of libvirt python bindings, because # this is way more easy and therefore fault tolerant. # (eg. lookupByName only works on running VMs) try: _check_call(('virsh', '-c', 'qemu:///system', 'destroy', self.srvname)) except subprocess.CalledProcessError as e: logging.info("could not force libvirt domain '%s' off: %s", self.srvname, e) try: # libvirt python bindings do not support all flags required # for undefining domains correctly. _check_call(('virsh', '-c', 'qemu:///system', 'undefine', self.srvname, '--nvram', '--managed-save', '--remove-all-storage', '--snapshots-metadata')) except subprocess.CalledProcessError as e: logging.info("could not undefine libvirt domain '%s': %s", self.srvname, e) def box_add(self, boxname, boxfile, force=True): boximg = '%s_vagrant_box_image_0.img' % (boxname) if force: try: _check_call(['virsh', '-c', 'qemu:///system', 'vol-delete', '--pool', 'default', boximg]) logging.debug("removed old box image '%s'" "from libvirt storeage pool", boximg) except subprocess.CalledProcessError as e: logging.debug("tried removing old box image '%s'," "file was not present in first place", boximg, exc_info=e) super().box_add(boxname, boxfile, force) def box_remove(self, boxname): super().box_remove(boxname) try: _check_call(['virsh', '-c', 'qemu:///system', 'vol-delete', '--pool', 'default', '%s_vagrant_box_image_0.img' % (boxname)]) except subprocess.CalledProcessError as e: logging.debug("tried removing '%s', file was not present in first place", boxname, exc_info=e) class VirtualboxBuildVm(FDroidBuildVm): def __init__(self, srvdir): super().__init__(srvdir, 'virtualbox') ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.888382 fdroidserver-2.3a1/fdroidserver.egg-info/0000755000175000017500000000000014620351546017200 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589989.0 fdroidserver-2.3a1/fdroidserver.egg-info/PKG-INFO0000644000175000017500000001233614620351545020301 0ustar00hanshansMetadata-Version: 2.1 Name: fdroidserver Version: 2.3a1 Summary: F-Droid Server Tools Home-page: https://f-droid.org Author: The F-Droid Project Author-email: team@f-droid.org License: AGPL-3.0 Classifier: Development Status :: 4 - Beta Classifier: Intended Audience :: Developers Classifier: Intended Audience :: Information Technology Classifier: Intended Audience :: System Administrators Classifier: Intended Audience :: Telecommunications Industry Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+) Classifier: Operating System :: POSIX Classifier: Operating System :: MacOS :: MacOS X Classifier: Operating System :: Unix Classifier: Topic :: Utilities Requires-Python: >=3.9 Description-Content-Type: text/markdown Provides-Extra: docs Provides-Extra: optional Provides-Extra: test License-File: LICENSE

# F-Droid Server ### Tools for maintaining an F-Droid repository system.
--- ## What is F-Droid Server? _fdroidserver_ is a suite of tools to publish and work with collections of Android apps (APK files) and other kinds of packages. It is used to maintain the [f-droid.org application repository](https://f-droid.org/packages). These same tools can be used to create additional or alternative repositories for publishing, or to assist in creating, testing and submitting metadata to the f-droid.org repository, also known as [_fdroiddata_](https://gitlab.com/fdroid/fdroiddata). For documentation, please see . In the beginning, _fdroidserver_ was the complete server-side setup that ran f-droid.org. Since then, the website and other parts have been split out into their own projects. The name for this suite of tooling has stayed _fdroidserver_ even though it no longer contains any proper server component. ## Installing There are many ways to install _fdroidserver_, including using a range of package managers. All of the options are documented on the website: https://f-droid.org/docs/Installing_the_Server_and_Repo_Tools ## Tests To run the full test suite: tests/run-tests To run the tests for individual Python modules, see the _.TestCase_ files, e.g.: tests/metadata.TestCase It is also possible to run individual tests: tests/metadata.TestCase MetadataTest.test_rewrite_yaml_special_build_params There is a growing test suite that has good coverage on a number of key parts of this code base. It does not yet cover all the code, and there are some parts where the technical debt makes it difficult to write unit tests. New tests should be standard Python _unittest_ test cases. Whenever possible, the old tests written in _bash_ in _tests/run-tests_ should be ported to Python. This test suite has built over time a bit haphazardly, so it is not as clean, organized, or complete as it could be. We welcome contributions. The goal is to move towards standard Python testing patterns and to expand the unit test coverage. Before rearchitecting any parts of it, be sure to [contact us](https://f-droid.org/about) to discuss the changes beforehand. ### Additional tests for different linux distributions These tests are also run on various configurations through GitLab CI. This is only enabled for `master@fdroid/fdroidserver` because it takes longer to complete than the regular CI tests. Most of the time you won't need to worry about them, but sometimes it might make sense to also run them for your merge request. In that case you need to remove [these lines from .gitlab-ci.yml](https://gitlab.com/fdroid/fdroidserver/-/blob/0124b9dde99f9cab19c034cbc7d8cc6005a99b48/.gitlab-ci.yml#L90-91) and push this to a new branch of your fork. Alternatively [run them locally](https://docs.gitlab.com/runner/commands/README.html#gitlab-runner-exec) like this: `gitlab-runner exec docker ubuntu_lts` ### Buildserver The tests for the whole build server setup are entirely separate because they require at least 200 GB of disk space, and 8 GB of RAM. These test scripts are in the root of the project, all starting with _jenkins-_ since they used to be run on https://jenkins.debian.net. ## Documentation The API documentation based on the docstrings gets automatically published [here](https://fdroid.gitlab.io/fdroidserver) on every commit on the `master` branch. It can be built locally via ```bash pip install -e .[docs] cd docs sphinx-apidoc -o ./source ../fdroidserver -M -e sphinx-autogen -o generated source/*.rst make html ``` To additionally lint the code call ```bash pydocstyle fdroidserver --count ``` When writing docstrings you should follow the [numpy style guide](https://numpydoc.readthedocs.io/en/latest/format.html). ## Translation Everything can be translated. See [Translation and Localization](https://f-droid.org/docs/Translation_and_Localization) for more info.
[![](https://hosted.weblate.org/widgets/f-droid/-/287x66-white.png)](https://hosted.weblate.org/engage/f-droid)
View translation status for all languages. [![](https://hosted.weblate.org/widgets/f-droid/-/fdroidserver/multi-auto.svg)](https://hosted.weblate.org/engage/f-droid/?utm_source=widget)
././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589989.0 fdroidserver-2.3a1/fdroidserver.egg-info/SOURCES.txt0000644000175000017500000015561014620351545021073 0ustar00hanshansCHANGELOG.md LICENSE MANIFEST.in README.md gradlew-fdroid makebuildserver pyproject.toml setup.cfg setup.py buildserver/Vagrantfile buildserver/config.buildserver.yml buildserver/provision-android-ndk buildserver/provision-android-sdk buildserver/provision-apt-get-install buildserver/provision-apt-proxy buildserver/provision-gradle buildserver/setup-env-vars completion/bash-completion examples/Vagrantfile.yaml examples/config.yml examples/fdroid_export_keystore_to_nitrokey.py examples/fdroid_exportkeystore.py examples/fdroid_extract_repo_pubkey.py examples/fdroid_fetchsrclibs.py examples/fdroid_nitrokeyimport.py examples/opensc-fdroid.cfg examples/public-read-only-s3-bucket-policy.json examples/template.yml fdroidserver/__init__.py fdroidserver/__main__.py fdroidserver/apksigcopier.py fdroidserver/btlog.py fdroidserver/build.py fdroidserver/checkupdates.py fdroidserver/common.py fdroidserver/deploy.py fdroidserver/exception.py fdroidserver/gpgsign.py fdroidserver/import_subcommand.py fdroidserver/index.py fdroidserver/init.py fdroidserver/install.py fdroidserver/lint.py fdroidserver/looseversion.py fdroidserver/metadata.py fdroidserver/mirror.py fdroidserver/net.py fdroidserver/nightly.py fdroidserver/publish.py fdroidserver/readmeta.py fdroidserver/rewritemeta.py fdroidserver/scanner.py fdroidserver/signatures.py fdroidserver/signindex.py fdroidserver/tail.py fdroidserver/update.py fdroidserver/verify.py fdroidserver/vmtools.py fdroidserver.egg-info/PKG-INFO fdroidserver.egg-info/SOURCES.txt fdroidserver.egg-info/dependency_links.txt fdroidserver.egg-info/entry_points.txt fdroidserver.egg-info/requires.txt fdroidserver.egg-info/top_level.txt fdroidserver/asynchronousfilereader/__init__.py locale/bo/LC_MESSAGES/fdroidserver.po locale/cs/LC_MESSAGES/fdroidserver.po locale/de/LC_MESSAGES/fdroidserver.po locale/es/LC_MESSAGES/fdroidserver.po locale/fr/LC_MESSAGES/fdroidserver.po locale/hu/LC_MESSAGES/fdroidserver.po locale/it/LC_MESSAGES/fdroidserver.po locale/ko/LC_MESSAGES/fdroidserver.po locale/nb_NO/LC_MESSAGES/fdroidserver.po locale/pl/LC_MESSAGES/fdroidserver.po locale/pt/LC_MESSAGES/fdroidserver.po locale/pt_BR/LC_MESSAGES/fdroidserver.po locale/pt_PT/LC_MESSAGES/fdroidserver.po locale/ro/LC_MESSAGES/fdroidserver.po locale/ru/LC_MESSAGES/fdroidserver.po locale/sq/LC_MESSAGES/fdroidserver.po locale/tr/LC_MESSAGES/fdroidserver.po locale/uk/LC_MESSAGES/fdroidserver.po locale/zh_Hans/LC_MESSAGES/fdroidserver.po locale/zh_Hant/LC_MESSAGES/fdroidserver.po tests/IsMD5Disabled.java tests/Norway_bouvet_europe_2.obf.zip tests/SANAPPSI.RSA tests/SANAPPSI.SF tests/SpeedoMeterApp.main_1.apk tests/aosp_testkey_debug.keystore tests/apk.embedded_1.apk tests/bad-unicode-πÇÇ现代通用字-български-عربي1.apk tests/build.TestCase tests/check-fdroid-apk tests/checkupdates.TestCase tests/com.fake.IpaApp_1000000000001.ipa tests/common.TestCase tests/config.py tests/corrupt-featureGraphic.png tests/deploy.TestCase tests/dummy-keystore.jks tests/dump_internal_metadata_format.py tests/exception.TestCase tests/funding-usernames.yaml tests/gradle-maven-blocks.yaml tests/gradle-release-checksums.py tests/import_subcommand.TestCase tests/index.TestCase tests/init.TestCase tests/install.TestCase tests/issue-1128-min-sdk-30-poc.apk tests/issue-1128-poc1.apk tests/issue-1128-poc2.apk tests/issue-1128-poc3a.apk tests/issue-1128-poc3b.apk tests/janus.apk tests/key-tricks.py tests/keystore.jks tests/lint.TestCase tests/main.TestCase tests/metadata.TestCase tests/minimal_targetsdk_30_unsigned.apk tests/nightly.TestCase tests/no_targetsdk_minsdk1_unsigned.apk tests/no_targetsdk_minsdk30_unsigned.apk tests/openssl-version-check-test.py tests/org.bitbucket.tickytacky.mirrormirror_1.apk tests/org.bitbucket.tickytacky.mirrormirror_2.apk tests/org.bitbucket.tickytacky.mirrormirror_3.apk tests/org.bitbucket.tickytacky.mirrormirror_4.apk tests/org.dyndns.fules.ck_20.apk tests/org.sajeg.fallingblocks_3.apk tests/publish.TestCase tests/rewritemeta.TestCase tests/run-tests tests/scanner.TestCase tests/signatures.TestCase tests/signindex.TestCase tests/test-gradlew-fdroid tests/testcommon.py tests/update.TestCase tests/urzip-badcert.apk tests/urzip-badsig.apk tests/urzip-release-unsigned.apk tests/urzip-release.apk tests/urzip.apk tests/v2.only.sig_2.apk tests/vcs.TestCase tests/build-tools/generate.sh tests/build-tools/17.0.0/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/17.0.0/aapt-output-com.politedroid_3.txt tests/build-tools/17.0.0/aapt-output-com.politedroid_4.txt tests/build-tools/17.0.0/aapt-output-com.politedroid_5.txt tests/build-tools/17.0.0/aapt-output-com.politedroid_6.txt tests/build-tools/17.0.0/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/17.0.0/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/17.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/17.0.0/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/17.0.0/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/17.0.0/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/17.0.0/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/17.0.0/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/17.0.0/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/17.0.0/aapt-output-souch.smsbypass_9.txt tests/build-tools/18.1.1/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/18.1.1/aapt-output-com.politedroid_3.txt tests/build-tools/18.1.1/aapt-output-com.politedroid_4.txt tests/build-tools/18.1.1/aapt-output-com.politedroid_5.txt tests/build-tools/18.1.1/aapt-output-com.politedroid_6.txt tests/build-tools/18.1.1/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/18.1.1/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/18.1.1/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/18.1.1/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/18.1.1/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/18.1.1/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/18.1.1/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/18.1.1/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/18.1.1/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/18.1.1/aapt-output-souch.smsbypass_9.txt tests/build-tools/19.0.0/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/19.0.0/aapt-output-com.politedroid_3.txt tests/build-tools/19.0.0/aapt-output-com.politedroid_4.txt tests/build-tools/19.0.0/aapt-output-com.politedroid_5.txt tests/build-tools/19.0.0/aapt-output-com.politedroid_6.txt tests/build-tools/19.0.0/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/19.0.0/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/19.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/19.0.0/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/19.0.0/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/19.0.0/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/19.0.0/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/19.0.0/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/19.0.0/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/19.0.0/aapt-output-souch.smsbypass_9.txt tests/build-tools/19.1.0/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/19.1.0/aapt-output-com.politedroid_3.txt tests/build-tools/19.1.0/aapt-output-com.politedroid_4.txt tests/build-tools/19.1.0/aapt-output-com.politedroid_5.txt tests/build-tools/19.1.0/aapt-output-com.politedroid_6.txt tests/build-tools/19.1.0/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/19.1.0/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/19.1.0/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/19.1.0/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/19.1.0/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/19.1.0/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/19.1.0/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/19.1.0/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/19.1.0/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/19.1.0/aapt-output-souch.smsbypass_9.txt tests/build-tools/20.0.0/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/20.0.0/aapt-output-com.politedroid_3.txt tests/build-tools/20.0.0/aapt-output-com.politedroid_4.txt tests/build-tools/20.0.0/aapt-output-com.politedroid_5.txt tests/build-tools/20.0.0/aapt-output-com.politedroid_6.txt tests/build-tools/20.0.0/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/20.0.0/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/20.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/20.0.0/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/20.0.0/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/20.0.0/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/20.0.0/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/20.0.0/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/20.0.0/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/20.0.0/aapt-output-souch.smsbypass_9.txt tests/build-tools/21.1.1/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/21.1.1/aapt-output-com.politedroid_3.txt tests/build-tools/21.1.1/aapt-output-com.politedroid_4.txt tests/build-tools/21.1.1/aapt-output-com.politedroid_5.txt tests/build-tools/21.1.1/aapt-output-com.politedroid_6.txt tests/build-tools/21.1.1/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/21.1.1/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/21.1.1/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/21.1.1/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/21.1.1/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/21.1.1/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/21.1.1/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/21.1.1/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/21.1.1/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/21.1.1/aapt-output-souch.smsbypass_9.txt tests/build-tools/21.1.2/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/21.1.2/aapt-output-com.politedroid_3.txt tests/build-tools/21.1.2/aapt-output-com.politedroid_4.txt tests/build-tools/21.1.2/aapt-output-com.politedroid_5.txt tests/build-tools/21.1.2/aapt-output-com.politedroid_6.txt tests/build-tools/21.1.2/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/21.1.2/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/21.1.2/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/21.1.2/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/21.1.2/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/21.1.2/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/21.1.2/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/21.1.2/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/21.1.2/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/21.1.2/aapt-output-souch.smsbypass_9.txt tests/build-tools/22.0.0/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/22.0.0/aapt-output-com.politedroid_3.txt tests/build-tools/22.0.0/aapt-output-com.politedroid_4.txt tests/build-tools/22.0.0/aapt-output-com.politedroid_5.txt tests/build-tools/22.0.0/aapt-output-com.politedroid_6.txt tests/build-tools/22.0.0/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/22.0.0/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/22.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/22.0.0/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/22.0.0/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/22.0.0/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/22.0.0/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/22.0.0/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/22.0.0/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/22.0.0/aapt-output-souch.smsbypass_9.txt tests/build-tools/22.0.1/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/22.0.1/aapt-output-com.politedroid_3.txt tests/build-tools/22.0.1/aapt-output-com.politedroid_4.txt tests/build-tools/22.0.1/aapt-output-com.politedroid_5.txt tests/build-tools/22.0.1/aapt-output-com.politedroid_6.txt tests/build-tools/22.0.1/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/22.0.1/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/22.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/22.0.1/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/22.0.1/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/22.0.1/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/22.0.1/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/22.0.1/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/22.0.1/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/22.0.1/aapt-output-souch.smsbypass_9.txt tests/build-tools/23.0.0/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/23.0.0/aapt-output-com.politedroid_3.txt tests/build-tools/23.0.0/aapt-output-com.politedroid_4.txt tests/build-tools/23.0.0/aapt-output-com.politedroid_5.txt tests/build-tools/23.0.0/aapt-output-com.politedroid_6.txt tests/build-tools/23.0.0/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/23.0.0/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/23.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/23.0.0/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/23.0.0/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/23.0.0/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/23.0.0/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/23.0.0/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/23.0.0/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/23.0.0/aapt-output-souch.smsbypass_9.txt tests/build-tools/23.0.1/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/23.0.1/aapt-output-com.politedroid_3.txt tests/build-tools/23.0.1/aapt-output-com.politedroid_4.txt tests/build-tools/23.0.1/aapt-output-com.politedroid_5.txt tests/build-tools/23.0.1/aapt-output-com.politedroid_6.txt tests/build-tools/23.0.1/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/23.0.1/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/23.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/23.0.1/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/23.0.1/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/23.0.1/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/23.0.1/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/23.0.1/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/23.0.1/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/23.0.1/aapt-output-souch.smsbypass_9.txt tests/build-tools/23.0.2/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/23.0.2/aapt-output-com.politedroid_3.txt tests/build-tools/23.0.2/aapt-output-com.politedroid_4.txt tests/build-tools/23.0.2/aapt-output-com.politedroid_5.txt tests/build-tools/23.0.2/aapt-output-com.politedroid_6.txt tests/build-tools/23.0.2/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/23.0.2/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/23.0.2/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/23.0.2/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/23.0.2/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/23.0.2/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/23.0.2/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/23.0.2/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/23.0.2/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/23.0.2/aapt-output-souch.smsbypass_9.txt tests/build-tools/23.0.3/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/23.0.3/aapt-output-com.politedroid_3.txt tests/build-tools/23.0.3/aapt-output-com.politedroid_4.txt tests/build-tools/23.0.3/aapt-output-com.politedroid_5.txt tests/build-tools/23.0.3/aapt-output-com.politedroid_6.txt tests/build-tools/23.0.3/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/23.0.3/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/23.0.3/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/23.0.3/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/23.0.3/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/23.0.3/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/23.0.3/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/23.0.3/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/23.0.3/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/23.0.3/aapt-output-souch.smsbypass_9.txt tests/build-tools/24.0.0/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/24.0.0/aapt-output-com.politedroid_3.txt tests/build-tools/24.0.0/aapt-output-com.politedroid_4.txt tests/build-tools/24.0.0/aapt-output-com.politedroid_5.txt tests/build-tools/24.0.0/aapt-output-com.politedroid_6.txt tests/build-tools/24.0.0/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/24.0.0/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/24.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/24.0.0/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/24.0.0/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/24.0.0/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/24.0.0/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/24.0.0/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/24.0.0/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/24.0.0/aapt-output-souch.smsbypass_9.txt tests/build-tools/24.0.1/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/24.0.1/aapt-output-com.politedroid_3.txt tests/build-tools/24.0.1/aapt-output-com.politedroid_4.txt tests/build-tools/24.0.1/aapt-output-com.politedroid_5.txt tests/build-tools/24.0.1/aapt-output-com.politedroid_6.txt tests/build-tools/24.0.1/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/24.0.1/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/24.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/24.0.1/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/24.0.1/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/24.0.1/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/24.0.1/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/24.0.1/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/24.0.1/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/24.0.1/aapt-output-souch.smsbypass_9.txt tests/build-tools/24.0.2/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/24.0.2/aapt-output-com.politedroid_3.txt tests/build-tools/24.0.2/aapt-output-com.politedroid_4.txt tests/build-tools/24.0.2/aapt-output-com.politedroid_5.txt tests/build-tools/24.0.2/aapt-output-com.politedroid_6.txt tests/build-tools/24.0.2/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/24.0.2/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/24.0.2/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/24.0.2/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/24.0.2/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/24.0.2/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/24.0.2/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/24.0.2/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/24.0.2/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/24.0.2/aapt-output-souch.smsbypass_9.txt tests/build-tools/24.0.3/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/24.0.3/aapt-output-com.politedroid_3.txt tests/build-tools/24.0.3/aapt-output-com.politedroid_4.txt tests/build-tools/24.0.3/aapt-output-com.politedroid_5.txt tests/build-tools/24.0.3/aapt-output-com.politedroid_6.txt tests/build-tools/24.0.3/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/24.0.3/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/24.0.3/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/24.0.3/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/24.0.3/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/24.0.3/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/24.0.3/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/24.0.3/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/24.0.3/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/24.0.3/aapt-output-souch.smsbypass_9.txt tests/build-tools/25.0.0/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/25.0.0/aapt-output-com.politedroid_3.txt tests/build-tools/25.0.0/aapt-output-com.politedroid_4.txt tests/build-tools/25.0.0/aapt-output-com.politedroid_5.txt tests/build-tools/25.0.0/aapt-output-com.politedroid_6.txt tests/build-tools/25.0.0/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/25.0.0/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/25.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/25.0.0/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/25.0.0/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/25.0.0/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/25.0.0/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/25.0.0/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/25.0.0/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/25.0.0/aapt-output-souch.smsbypass_9.txt tests/build-tools/25.0.1/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/25.0.1/aapt-output-com.politedroid_3.txt tests/build-tools/25.0.1/aapt-output-com.politedroid_4.txt tests/build-tools/25.0.1/aapt-output-com.politedroid_5.txt tests/build-tools/25.0.1/aapt-output-com.politedroid_6.txt tests/build-tools/25.0.1/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/25.0.1/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/25.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/25.0.1/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/25.0.1/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/25.0.1/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/25.0.1/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/25.0.1/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/25.0.1/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/25.0.1/aapt-output-souch.smsbypass_9.txt tests/build-tools/25.0.2/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/25.0.2/aapt-output-com.politedroid_3.txt tests/build-tools/25.0.2/aapt-output-com.politedroid_4.txt tests/build-tools/25.0.2/aapt-output-com.politedroid_5.txt tests/build-tools/25.0.2/aapt-output-com.politedroid_6.txt tests/build-tools/25.0.2/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/25.0.2/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/25.0.2/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/25.0.2/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/25.0.2/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/25.0.2/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/25.0.2/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/25.0.2/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/25.0.2/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/25.0.2/aapt-output-souch.smsbypass_9.txt tests/build-tools/25.0.3/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/25.0.3/aapt-output-com.politedroid_3.txt tests/build-tools/25.0.3/aapt-output-com.politedroid_4.txt tests/build-tools/25.0.3/aapt-output-com.politedroid_5.txt tests/build-tools/25.0.3/aapt-output-com.politedroid_6.txt tests/build-tools/25.0.3/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/25.0.3/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/25.0.3/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/25.0.3/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/25.0.3/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/25.0.3/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/25.0.3/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/25.0.3/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/25.0.3/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/25.0.3/aapt-output-souch.smsbypass_9.txt tests/build-tools/26.0.0/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/26.0.0/aapt-output-com.politedroid_3.txt tests/build-tools/26.0.0/aapt-output-com.politedroid_4.txt tests/build-tools/26.0.0/aapt-output-com.politedroid_5.txt tests/build-tools/26.0.0/aapt-output-com.politedroid_6.txt tests/build-tools/26.0.0/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/26.0.0/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/26.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/26.0.0/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/26.0.0/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/26.0.0/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/26.0.0/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/26.0.0/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/26.0.0/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/26.0.0/aapt-output-souch.smsbypass_9.txt tests/build-tools/26.0.1/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/26.0.1/aapt-output-com.politedroid_3.txt tests/build-tools/26.0.1/aapt-output-com.politedroid_4.txt tests/build-tools/26.0.1/aapt-output-com.politedroid_5.txt tests/build-tools/26.0.1/aapt-output-com.politedroid_6.txt tests/build-tools/26.0.1/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/26.0.1/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/26.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/26.0.1/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/26.0.1/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/26.0.1/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/26.0.1/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/26.0.1/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/26.0.1/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/26.0.1/aapt-output-souch.smsbypass_9.txt tests/build-tools/26.0.2/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/26.0.2/aapt-output-com.politedroid_3.txt tests/build-tools/26.0.2/aapt-output-com.politedroid_4.txt tests/build-tools/26.0.2/aapt-output-com.politedroid_5.txt tests/build-tools/26.0.2/aapt-output-com.politedroid_6.txt tests/build-tools/26.0.2/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/26.0.2/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/26.0.2/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/26.0.2/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/26.0.2/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/26.0.2/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/26.0.2/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/26.0.2/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/26.0.2/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/26.0.2/aapt-output-souch.smsbypass_9.txt tests/build-tools/26.0.3/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/26.0.3/aapt-output-com.politedroid_3.txt tests/build-tools/26.0.3/aapt-output-com.politedroid_4.txt tests/build-tools/26.0.3/aapt-output-com.politedroid_5.txt tests/build-tools/26.0.3/aapt-output-com.politedroid_6.txt tests/build-tools/26.0.3/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/26.0.3/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/26.0.3/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/26.0.3/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/26.0.3/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/26.0.3/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/26.0.3/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/26.0.3/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/26.0.3/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/26.0.3/aapt-output-souch.smsbypass_9.txt tests/build-tools/27.0.0/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/27.0.0/aapt-output-com.politedroid_3.txt tests/build-tools/27.0.0/aapt-output-com.politedroid_4.txt tests/build-tools/27.0.0/aapt-output-com.politedroid_5.txt tests/build-tools/27.0.0/aapt-output-com.politedroid_6.txt tests/build-tools/27.0.0/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/27.0.0/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/27.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/27.0.0/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/27.0.0/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/27.0.0/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/27.0.0/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/27.0.0/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/27.0.0/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/27.0.0/aapt-output-souch.smsbypass_9.txt tests/build-tools/27.0.1/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/27.0.1/aapt-output-com.politedroid_3.txt tests/build-tools/27.0.1/aapt-output-com.politedroid_4.txt tests/build-tools/27.0.1/aapt-output-com.politedroid_5.txt tests/build-tools/27.0.1/aapt-output-com.politedroid_6.txt tests/build-tools/27.0.1/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/27.0.1/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/27.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/27.0.1/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/27.0.1/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/27.0.1/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/27.0.1/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/27.0.1/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/27.0.1/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/27.0.1/aapt-output-souch.smsbypass_9.txt tests/build-tools/27.0.2/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/27.0.2/aapt-output-com.politedroid_3.txt tests/build-tools/27.0.2/aapt-output-com.politedroid_4.txt tests/build-tools/27.0.2/aapt-output-com.politedroid_5.txt tests/build-tools/27.0.2/aapt-output-com.politedroid_6.txt tests/build-tools/27.0.2/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/27.0.2/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/27.0.2/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/27.0.2/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/27.0.2/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/27.0.2/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/27.0.2/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/27.0.2/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/27.0.2/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/27.0.2/aapt-output-souch.smsbypass_9.txt tests/build-tools/27.0.3/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/27.0.3/aapt-output-com.politedroid_3.txt tests/build-tools/27.0.3/aapt-output-com.politedroid_4.txt tests/build-tools/27.0.3/aapt-output-com.politedroid_5.txt tests/build-tools/27.0.3/aapt-output-com.politedroid_6.txt tests/build-tools/27.0.3/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/27.0.3/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/27.0.3/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/27.0.3/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/27.0.3/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/27.0.3/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/27.0.3/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/27.0.3/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/27.0.3/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/27.0.3/aapt-output-souch.smsbypass_9.txt tests/build-tools/28.0.0/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/28.0.0/aapt-output-com.politedroid_3.txt tests/build-tools/28.0.0/aapt-output-com.politedroid_4.txt tests/build-tools/28.0.0/aapt-output-com.politedroid_5.txt tests/build-tools/28.0.0/aapt-output-com.politedroid_6.txt tests/build-tools/28.0.0/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/28.0.0/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/28.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/28.0.0/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/28.0.0/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/28.0.0/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/28.0.0/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/28.0.0/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/28.0.0/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/28.0.0/aapt-output-souch.smsbypass_9.txt tests/build-tools/28.0.1/aapt-output-com.moez.QKSMS_182.txt tests/build-tools/28.0.1/aapt-output-com.politedroid_3.txt tests/build-tools/28.0.1/aapt-output-com.politedroid_4.txt tests/build-tools/28.0.1/aapt-output-com.politedroid_5.txt tests/build-tools/28.0.1/aapt-output-com.politedroid_6.txt tests/build-tools/28.0.1/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/28.0.1/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/28.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/28.0.1/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/28.0.1/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/28.0.1/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/28.0.1/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/28.0.1/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/28.0.1/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/28.0.1/aapt-output-souch.smsbypass_9.txt tests/build-tools/28.0.2/aapt-output-com.politedroid_3.txt tests/build-tools/28.0.2/aapt-output-com.politedroid_4.txt tests/build-tools/28.0.2/aapt-output-com.politedroid_5.txt tests/build-tools/28.0.2/aapt-output-com.politedroid_6.txt tests/build-tools/28.0.2/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/28.0.2/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/28.0.2/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/28.0.2/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/28.0.2/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/28.0.2/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/28.0.2/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/28.0.2/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/28.0.2/aapt-output-org.droidtr.keyboard_34.txt tests/build-tools/28.0.2/aapt-output-souch.smsbypass_9.txt tests/build-tools/28.0.3/aapt-output-com.example.test.helloworld_1.txt tests/build-tools/28.0.3/aapt-output-com.politedroid_3.txt tests/build-tools/28.0.3/aapt-output-com.politedroid_4.txt tests/build-tools/28.0.3/aapt-output-com.politedroid_5.txt tests/build-tools/28.0.3/aapt-output-com.politedroid_6.txt tests/build-tools/28.0.3/aapt-output-duplicate.permisssions_9999999.txt tests/build-tools/28.0.3/aapt-output-info.guardianproject.urzip_100.txt tests/build-tools/28.0.3/aapt-output-info.zwanenburg.caffeinetile_4.txt tests/build-tools/28.0.3/aapt-output-no.min.target.sdk_987.txt tests/build-tools/28.0.3/aapt-output-obb.main.oldversion_1444412523.txt tests/build-tools/28.0.3/aapt-output-obb.main.twoversions_1101613.txt tests/build-tools/28.0.3/aapt-output-obb.main.twoversions_1101615.txt tests/build-tools/28.0.3/aapt-output-obb.main.twoversions_1101617.txt tests/build-tools/28.0.3/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/28.0.3/aapt-output-souch.smsbypass_9.txt tests/config/antiFeatures.yml tests/config/categories.yml tests/config/ic_antifeature_ads.xml tests/config/ic_antifeature_disabledalgorithm.xml tests/config/ic_antifeature_knownvuln.xml tests/config/ic_antifeature_nonfreeadd.xml tests/config/ic_antifeature_nonfreeassets.xml tests/config/ic_antifeature_nonfreedep.xml tests/config/ic_antifeature_nonfreenet.xml tests/config/ic_antifeature_nosourcesince.xml tests/config/ic_antifeature_nsfw.xml tests/config/ic_antifeature_tracking.xml tests/config/ic_antifeature_upstreamnonfree.xml tests/config/de/antiFeatures.yml tests/config/fa/antiFeatures.yml tests/config/ro/antiFeatures.yml tests/config/zh-rCN/antiFeatures.yml tests/extra/manual-vmtools-test.py tests/get_android_tools_versions/android-ndk-r10e/RELEASE.TXT tests/get_android_tools_versions/android-sdk/ndk-bundle/package.xml tests/get_android_tools_versions/android-sdk/ndk-bundle/source.properties tests/get_android_tools_versions/android-sdk/ndk/11.2.2725575/source.properties tests/get_android_tools_versions/android-sdk/ndk/17.2.4988734/source.properties tests/get_android_tools_versions/android-sdk/ndk/21.3.6528147/source.properties tests/get_android_tools_versions/android-sdk/patcher/v4/source.properties tests/get_android_tools_versions/android-sdk/platforms/android-30/source.properties tests/get_android_tools_versions/android-sdk/skiaparser/1/source.properties tests/get_android_tools_versions/android-sdk/tools/source.properties tests/gnupghome/pubring.gpg tests/gnupghome/random_seed tests/gnupghome/secring.gpg tests/gnupghome/trustdb.gpg tests/metadata/app.with.special.build.params.yml tests/metadata/com.politedroid.yml tests/metadata/duplicate.permisssions.yml tests/metadata/fake.ota.update.yml tests/metadata/info.guardianproject.checkey.yml tests/metadata/info.guardianproject.urzip.yml tests/metadata/info.zwanenburg.caffeinetile.yml tests/metadata/no.min.target.sdk.yml tests/metadata/obb.main.oldversion.yml tests/metadata/obb.main.twoversions.yml tests/metadata/obb.mainpatch.current.yml tests/metadata/org.adaway.yml tests/metadata/org.fdroid.ci.test.app.yml tests/metadata/org.fdroid.fdroid.yml tests/metadata/org.smssecure.smssecure.yml tests/metadata/org.videolan.vlc.yml tests/metadata/raw.template.yml tests/metadata/souch.smsbypass.yml tests/metadata-rewrite-yml/app.with.special.build.params.yml tests/metadata-rewrite-yml/fake.ota.update.yml tests/metadata-rewrite-yml/org.fdroid.fdroid.yml tests/metadata/apk/info.guardianproject.urzip.yaml tests/metadata/apk/org.dyndns.fules.ck.yaml tests/metadata/app.with.special.build.params/en-US/antifeatures/50_Ads.txt tests/metadata/app.with.special.build.params/en-US/antifeatures/50_Tracking.txt tests/metadata/app.with.special.build.params/en-US/antifeatures/Ads.txt tests/metadata/app.with.special.build.params/en-US/antifeatures/NoSourceSince.txt tests/metadata/app.with.special.build.params/zh-CN/antifeatures/49_Tracking.txt tests/metadata/app.with.special.build.params/zh-CN/antifeatures/50_Ads.txt tests/metadata/dump/app.with.special.build.params.yaml tests/metadata/dump/com.politedroid.yaml tests/metadata/dump/org.adaway.yaml tests/metadata/dump/org.smssecure.smssecure.yaml tests/metadata/dump/org.videolan.vlc.yaml tests/metadata/info.guardianproject.checkey/en-US/description.txt tests/metadata/info.guardianproject.checkey/en-US/name.txt tests/metadata/info.guardianproject.checkey/en-US/summary.txt tests/metadata/info.guardianproject.checkey/en-US/phoneScreenshots/checkey-phone.png tests/metadata/info.guardianproject.checkey/en-US/phoneScreenshots/checkey.png tests/metadata/info.guardianproject.checkey/ja-JP/name.txt tests/metadata/info.guardianproject.urzip/en-US/full_description.txt tests/metadata/info.guardianproject.urzip/en-US/short_description.txt tests/metadata/info.guardianproject.urzip/en-US/title.txt tests/metadata/info.guardianproject.urzip/en-US/video.txt tests/metadata/info.guardianproject.urzip/en-US/changelogs/100.txt tests/metadata/info.guardianproject.urzip/en-US/changelogs/default.txt tests/metadata/info.guardianproject.urzip/en-US/images/featureGraphic.png tests/metadata/info.guardianproject.urzip/en-US/images/icon.png tests/metadata/org.smssecure.smssecure/signatures/134/28969C09.RSA tests/metadata/org.smssecure.smssecure/signatures/134/28969C09.SF tests/metadata/org.smssecure.smssecure/signatures/134/MANIFEST.MF tests/metadata/org.smssecure.smssecure/signatures/135/28969C09.RSA tests/metadata/org.smssecure.smssecure/signatures/135/28969C09.SF tests/metadata/org.smssecure.smssecure/signatures/135/MANIFEST.MF tests/repo/com.example.test.helloworld_1.apk tests/repo/com.politedroid_3.apk tests/repo/com.politedroid_4.apk tests/repo/com.politedroid_5.apk tests/repo/com.politedroid_6.apk tests/repo/duplicate.permisssions_9999999.apk tests/repo/entry.json tests/repo/fake.ota.update_1234.zip tests/repo/index-v1.json tests/repo/index-v2.json tests/repo/index.xml tests/repo/info.zwanenburg.caffeinetile_4.apk tests/repo/main.1101613.obb.main.twoversions.obb tests/repo/main.1101615.obb.main.twoversions.obb tests/repo/main.1434483388.obb.main.oldversion.obb tests/repo/main.1619.obb.mainpatch.current.obb tests/repo/no.min.target.sdk_987.apk tests/repo/obb.main.oldversion_1444412523.apk tests/repo/obb.main.twoversions_1101613.apk tests/repo/obb.main.twoversions_1101615.apk tests/repo/obb.main.twoversions_1101617.apk tests/repo/obb.main.twoversions_1101617_src.tar.gz tests/repo/obb.mainpatch.current_1619.apk tests/repo/obb.mainpatch.current_1619_another-release-key.apk tests/repo/patch.1619.obb.mainpatch.current.obb tests/repo/souch.smsbypass_9.apk tests/repo/urzip-; Рахма́, [rɐxˈmanʲɪnəf] سيرجي_رخمانينوف 谢·.apk tests/repo/v1.v2.sig_1020.apk tests/repo/obb.mainpatch.current/en-US/featureGraphic.png tests/repo/obb.mainpatch.current/en-US/icon.png tests/repo/obb.mainpatch.current/en-US/phoneScreenshots/screenshot-main.png tests/repo/obb.mainpatch.current/en-US/sevenInchScreenshots/screenshot-tablet-main.png tests/repo/org.videolan.vlc/en-US/icon.png tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot10.png tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot12.png tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot15.png tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot18.png tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot20.png tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot22.png tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot4.png tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot7.png tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot9.png tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot0.png tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot1.png tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot11.png tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot13.png tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot14.png tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot16.png tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot17.png tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot19.png tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot2.png tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot21.png tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot23.png tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot3.png tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot5.png tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot6.png tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot8.png tests/signindex/guardianproject-v1.jar tests/signindex/guardianproject.jar tests/signindex/testy.jar tests/signindex/unsigned.jar tests/source-files/Zillode/syncthing-silk/build.gradle tests/source-files/at.bitfire.davdroid/build.gradle tests/source-files/cn.wildfirechat.chat/build.gradle tests/source-files/cn.wildfirechat.chat/settings.gradle tests/source-files/cn.wildfirechat.chat/avenginekit/build.gradle tests/source-files/cn.wildfirechat.chat/chat/build.gradle tests/source-files/cn.wildfirechat.chat/client/build.gradle tests/source-files/cn.wildfirechat.chat/client/src/main/AndroidManifest.xml tests/source-files/cn.wildfirechat.chat/emojilibrary/build.gradle tests/source-files/cn.wildfirechat.chat/gradle/build_libraries.gradle tests/source-files/cn.wildfirechat.chat/imagepicker/build.gradle tests/source-files/cn.wildfirechat.chat/mars-core-release/build.gradle tests/source-files/cn.wildfirechat.chat/push/build.gradle tests/source-files/com.anpmech.launcher/build.gradle tests/source-files/com.anpmech.launcher/settings.gradle tests/source-files/com.anpmech.launcher/app/build.gradle tests/source-files/com.anpmech.launcher/app/src/main/AndroidManifest.xml tests/source-files/com.github.jameshnsears.quoteunquote/build.gradle tests/source-files/com.integreight.onesheeld/build.gradle tests/source-files/com.integreight.onesheeld/settings.gradle tests/source-files/com.integreight.onesheeld/gradle/wrapper/gradle-wrapper.properties tests/source-files/com.integreight.onesheeld/localeapi/build.gradle tests/source-files/com.integreight.onesheeld/localeapi/src/main/AndroidManifest.xml tests/source-files/com.integreight.onesheeld/oneSheeld/build.gradle tests/source-files/com.integreight.onesheeld/oneSheeld/src/main/AndroidManifest.xml tests/source-files/com.integreight.onesheeld/pagerIndicator/build.gradle tests/source-files/com.integreight.onesheeld/pagerIndicator/src/main/AndroidManifest.xml tests/source-files/com.integreight.onesheeld/pullToRefreshlibrary/build.gradle tests/source-files/com.integreight.onesheeld/pullToRefreshlibrary/src/main/AndroidManifest.xml tests/source-files/com.integreight.onesheeld/quickReturnHeader/build.gradle tests/source-files/com.integreight.onesheeld/quickReturnHeader/src/main/AndroidManifest.xml tests/source-files/com.jens.automation2/build.gradle tests/source-files/com.jens.automation2/app/build.gradle tests/source-files/com.kunzisoft.testcase/build.gradle tests/source-files/com.nextcloud.client/build.gradle tests/source-files/com.nextcloud.client.dev/src/generic/fastlane/metadata/android/en-US/full_description.txt tests/source-files/com.nextcloud.client.dev/src/generic/fastlane/metadata/android/en-US/short_description.txt tests/source-files/com.nextcloud.client.dev/src/generic/fastlane/metadata/android/en-US/title.txt tests/source-files/com.nextcloud.client.dev/src/versionDev/fastlane/metadata/android/en-US/full_description.txt tests/source-files/com.nextcloud.client.dev/src/versionDev/fastlane/metadata/android/en-US/short_description.txt tests/source-files/com.nextcloud.client.dev/src/versionDev/fastlane/metadata/android/en-US/title.txt tests/source-files/com.nextcloud.client/src/generic/fastlane/metadata/android/en-US/full_description.txt tests/source-files/com.nextcloud.client/src/generic/fastlane/metadata/android/en-US/short_description.txt tests/source-files/com.nextcloud.client/src/generic/fastlane/metadata/android/en-US/title.txt tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata/android/en-US/full_description.txt tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata/android/en-US/short_description.txt tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata/android/en-US/title.txt tests/source-files/com.seafile.seadroid2/app/build.gradle tests/source-files/com.ubergeek42.WeechatAndroid/app/build.gradle.kts tests/source-files/com.ubergeek42.WeechatAndroid/app/src/main/res/values/strings.xml tests/source-files/de.varengold.activeTAN/build.gradle tests/source-files/dev.patrickgold.florisboard/app/build.gradle.kts tests/source-files/eu.siacs.conversations/build.gradle tests/source-files/eu.siacs.conversations/metadata/en-US/name.txt tests/source-files/fdroid/fdroidclient/AndroidManifest.xml tests/source-files/fdroid/fdroidclient/build.gradle tests/source-files/firebase-allowlisted/build.gradle tests/source-files/firebase-allowlisted/app/build.gradle tests/source-files/firebase-suspect/build.gradle tests/source-files/firebase-suspect/app/build.gradle tests/source-files/info.guardianproject.ripple/build.gradle tests/source-files/open-keychain/open-keychain/build.gradle tests/source-files/open-keychain/open-keychain/OpenKeychain/build.gradle tests/source-files/org.mozilla.rocket/app/build.gradle tests/source-files/org.noise_planet.noisecapture/settings.gradle tests/source-files/org.noise_planet.noisecapture/app/build.gradle tests/source-files/org.noise_planet.noisecapture/sosfilter/build.gradle tests/source-files/org.tasks/build.gradle tests/source-files/org.tasks/build.gradle.kts tests/source-files/org.tasks/settings.gradle.kts tests/source-files/org.tasks/app/build.gradle.kts tests/source-files/org.tasks/buildSrc/build.gradle.kts tests/source-files/osmandapp/osmand/build.gradle tests/source-files/osmandapp/osmand/gradle/wrapper/gradle-wrapper.properties tests/source-files/realm/react-native/android/build.gradle tests/source-files/se.manyver/app.json tests/source-files/se.manyver/index.android.js tests/source-files/se.manyver/package.json tests/source-files/se.manyver/react-native.config.js tests/source-files/se.manyver/android/build.gradle tests/source-files/se.manyver/android/gradle.properties tests/source-files/se.manyver/android/settings.gradle tests/source-files/se.manyver/android/app/build.gradle tests/source-files/se.manyver/android/gradle/wrapper/gradle-wrapper.properties tests/source-files/ut.ewh.audiometrytest/build.gradle tests/source-files/ut.ewh.audiometrytest/settings.gradle tests/source-files/ut.ewh.audiometrytest/app/build.gradle tests/source-files/ut.ewh.audiometrytest/app/src/main/AndroidManifest.xml tests/source-files/yuriykulikov/AlarmClock/gradle/wrapper/gradle-wrapper.properties tests/stats/known_apks.txt tests/triple-t-2/build/org.piwigo.android/build.gradle tests/triple-t-2/build/org.piwigo.android/settings.gradle tests/triple-t-2/build/org.piwigo.android/app/.gitignore tests/triple-t-2/build/org.piwigo.android/app/build.gradle tests/triple-t-2/build/org.piwigo.android/app/src/debug/res/values/constants.xml tests/triple-t-2/build/org.piwigo.android/app/src/debug/res/values/strings.xml tests/triple-t-2/build/org.piwigo.android/app/src/main/java/org/piwigo/PiwigoApplication.java tests/triple-t-2/build/org.piwigo.android/app/src/main/play/contact-email.txt tests/triple-t-2/build/org.piwigo.android/app/src/main/play/contact-website.txt tests/triple-t-2/build/org.piwigo.android/app/src/main/play/default-language.txt tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/de-DE/full-description.txt tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/de-DE/short-description.txt tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/de-DE/title.txt tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/full-description.txt tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/short-description.txt tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/title.txt tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphics/feature-graphic/piwigo-full.png tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphics/icon/piwigo-icon.png tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphics/phone-screenshots/01_Login.jpg tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphics/phone-screenshots/02_Albums.jpg tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphics/phone-screenshots/03_Photos.jpg tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphics/phone-screenshots/04_Albums_horizontal.jpg tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphics/phone-screenshots/05_Menu.jpg tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphics/tablet-screenshots/01_Login.png tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/fr-FR/full-description.txt tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/fr-FR/short-description.txt tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/fr-FR/title.txt tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/kn-IN/full-description.txt tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/kn-IN/short-description.txt tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/kn-IN/title.txt tests/triple-t-2/build/org.piwigo.android/app/src/main/play/release-notes/de-DE/default.txt tests/triple-t-2/build/org.piwigo.android/app/src/main/play/release-notes/en-US/default.txt tests/triple-t-2/build/org.piwigo.android/app/src/main/play/release-notes/fr-FR/default.txt tests/triple-t-2/build/org.piwigo.android/app/src/main/play/release-notes/kn-IN/default.txt tests/triple-t-2/metadata/org.piwigo.android.yml tests/triple-t-anysoftkeyboard/build/com.anysoftkeyboard.languagepack.dutch/settings.gradle tests/triple-t-anysoftkeyboard/build/com.anysoftkeyboard.languagepack.dutch/addons/languages/dutch/apk/src/main/play/listings/en-US/title.txt tests/triple-t-anysoftkeyboard/build/com.anysoftkeyboard.languagepack.dutch/ime/app/src/main/play/listings/en-US/title.txt tests/triple-t-anysoftkeyboard/build/com.menny.android.anysoftkeyboard/settings.gradle tests/triple-t-anysoftkeyboard/build/com.menny.android.anysoftkeyboard/addons/languages/dutch/apk/src/main/play/listings/en-US/title.txt tests/triple-t-anysoftkeyboard/build/com.menny.android.anysoftkeyboard/ime/app/src/main/play/listings/en-US/title.txt tests/triple-t-anysoftkeyboard/metadata/com.anysoftkeyboard.languagepack.dutch.yml tests/triple-t-anysoftkeyboard/metadata/com.menny.android.anysoftkeyboard.yml tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/contact-website.txt tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/full-description.txt tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/short-description.txt tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/title.txt tests/triple-t-flutter/metadata/fr.emersion.goguma.yml tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/settings.gradle tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/verifier/src/main/play/listings/en-US/title.txt tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/wallet/src/main/play/listings/en-US/title.txt tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/settings.gradle tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/verifier/src/main/play/listings/en-US/title.txt tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/wallet/src/main/play/listings/en-US/title.txt tests/triple-t-multiple/metadata/ch.admin.bag.covidcertificate.verifier.yml tests/triple-t-multiple/metadata/ch.admin.bag.covidcertificate.wallet.yml tests/valid-package-names/RandomPackageNames.java tests/valid-package-names/random-package-names tests/valid-package-names/test.py././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589989.0 fdroidserver-2.3a1/fdroidserver.egg-info/dependency_links.txt0000644000175000017500000000000114620351545023245 0ustar00hanshans ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589989.0 fdroidserver-2.3a1/fdroidserver.egg-info/entry_points.txt0000644000175000017500000000006614620351545022477 0ustar00hanshans[console_scripts] fdroid = fdroidserver.__main__:main ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589989.0 fdroidserver-2.3a1/fdroidserver.egg-info/requires.txt0000644000175000017500000000053514620351545021602 0ustar00hanshansGitPython Pillow PyYAML androguard>=3.3.5 apache-libcloud>=0.14.1 appdirs asn1crypto clint defusedxml oscrypto paramiko python-vagrant qrcode requests!=2.11.0,!=2.12.2,!=2.18.0,>=2.5.2 ruamel.yaml<0.17.22,>=0.15 sdkmanager>=0.6.4 yamllint [docs] numpydoc pydata_sphinx_theme pydocstyle sphinx [optional] biplist pycountry [test] html5print pyjks ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589989.0 fdroidserver-2.3a1/fdroidserver.egg-info/top_level.txt0000644000175000017500000000001514620351545021725 0ustar00hanshansfdroidserver ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/gradlew-fdroid0000755000175000017500000004411014620351225015622 0ustar00hanshans#!/bin/bash bindir="$(dirname $0)" basedir="$(dirname $bindir)" # Check if GRADLE_VERSION_DIR/CACHEDIR is set from environment if [ -z "$GRADLE_VERSION_DIR" ]; then gradle_version_dir="${basedir}/versions" else gradle_version_dir="$GRADLE_VERSION_DIR" fi BUILDSERVER_CACHEDIR=/vagrant/cache if [ -n "$CACHEDIR" ]; then cachedir="$CACHEDIR" elif [ -d $BUILDSERVER_CACHEDIR ]; then cachedir=$BUILDSERVER_CACHEDIR fi args=("$@") run_gradle() { if [ ! -d "${gradle_version_dir}/${v_found}" ]; then download_gradle ${v_found} fi # shellcheck disable=SC2145 echo "Running ${gradle_version_dir}/${v_found}/bin/gradle ${args[@]}" "${gradle_version_dir}/${v_found}/bin/gradle" "${args[@]}" exit $? } download_gradle() { URL="https://downloads.gradle.org/distributions/gradle-${1}-bin.zip" shasum=$(get_sha $1) if [ $? != 0 ]; then echo "No hash for gradle version $1! Exiting..." exit 1 fi if [ -n "${cachedir}" ] && [ -e "${cachedir}/gradle-$1-bin.zip" ]; then echo "Using cached ${cachedir}/gradle-$1-bin.zip ..." gradle_zip="${cachedir}/gradle-$1-bin.zip" else echo "Downloading missing gradle version $1" echo cachedir $cachedir if [[ -n "${cachedir}" && ! -d "${cachedir}" ]]; then mkdir -p "${cachedir}" fi if [[ -n "${cachedir}" && -d "${cachedir}" && -w "${cachedir}" ]]; then tmpdir="${cachedir}" else tmpdir=$(mktemp -d) fi curl -o "${tmpdir}/gradle-$1-bin.zip" --silent --fail --show-error --location --retry 3 --retry-all-errors "${URL}" gradle_zip="${tmpdir}/gradle-$1-bin.zip" fi echo "${shasum} ${gradle_zip}" | sha256sum -c - if [ $? != 0 ]; then echo "gradle download checksum mismatch! Exiting..." exit 1 fi mkdir -p "${gradle_version_dir}/" unzip -q -d "${gradle_version_dir}" "${gradle_zip}" mv "${gradle_version_dir}/gradle-$1" "${gradle_version_dir}/${v_found}" } get_sha() { case $1 in '0.7') echo '4e354fcb0d5c0b0e7789cd6ee900456edaf993f6dd890c4a1c217d90d2a6a6ad' ;; '0.8') echo '940e623ea98e40ea9ad398770a6ebb91a61c0869d394dda81aa86b0f4f0025e7' ;; '0.9') echo '994e46d4b467254a0f25ce92b602618331b9b3ac8b32a094fd84ff0e0ceec135' ;; '0.9.1') echo '5d48cba95db031ec109ae9ab60561e960b6507046036e8191aa78572ec27e2a5' ;; '0.9.2') echo 'f94d7642348c558fc05ab5fd6fb947fb1ed8fed5931ddb73dd04fb0de22d669b' ;; '1.0') echo '894bca0360a7e2040815096788f118a2dd106ff6694221b274efb9c32bce0384' ;; '1.1') echo '552c1fc9f3a1b9668b79cc447370f0263e664ffb6d5c6e1c21e77ce0c8a20d4c' ;; '1.2') echo 'eb53da3704d24cabb7565f34a3bf16bcd863c4b0c139917606fb15d4f27c7bdf' ;; '1.3') echo 'ada68561efbb9f1cae0f9063974cbde15c180351a2f92bc2f1106e39ddcae5ba' ;; '1.4') echo 'cd99e85fbcd0ae8b99e81c9992a2f10cceb7b5f009c3720ef3a0078f4f92e94e' ;; '1.5') echo 'a5511a0659caa47d9d74fd2844c9da43157d2f78e63a0223c6289d88f5aaecbe' ;; '1.6') echo 'de3e89d2113923dcc2e0def62d69be0947ceac910abd38b75ec333230183fac4' ;; '1.7') echo '360c97d51621b5a1ecf66748c718594e5f790ae4fbc1499543e0c006033c9d30' ;; '1.8') echo 'a342bbfa15fd18e2482287da4959588f45a41b60910970a16e6d97959aea5703' ;; '1.9') echo '097ddc2bcbc9da2bb08cbf6bf8079585e35ad088bafd42e8716bc96405db98e9' ;; '1.10') echo '6e6db4fc595f27ceda059d23693b6f6848583950606112b37dfd0e97a0a0a4fe' ;; '1.11') echo '07e235df824964f0e19e73ea2327ce345c44bcd06d44a0123d29ab287fc34091' ;; '1.12') echo '8734b13a401f4311ee418173ed6ca8662d2b0a535be8ff2a43ecb1c13cd406ea' ;; '2.0') echo 'a1eb880c8755333c4d33c4351b269bebe517002532d3142c0b6164c9e8c081c3' ;; '2.1') echo '3eee4f9ea2ab0221b89f8e4747a96d4554d00ae46d8d633f11cfda60988bf878' ;; '2.2') echo '91e5655fe11ef414449f218c4fa2985b3a49b7903c57556da109c84fa26e1dfb' ;; '2.2.1') echo '420aa50738299327b611c10b8304b749e8d3a579407ee9e755b15921d95ff418' ;; '2.3') echo '010dd9f31849abc3d5644e282943b1c1c355f8e2635c5789833979ce590a3774' ;; '2.4') echo 'c4eaecc621a81f567ded1aede4a5ddb281cc02a03a6a87c4f5502add8fc2f16f' ;; '2.5') echo '3f953e0cb14bb3f9ebbe11946e84071547bf5dfd575d90cfe9cc4e788da38555' ;; '2.6') echo '18a98c560af231dfa0d3f8e0802c20103ae986f12428bb0a6f5396e8f14e9c83' ;; '2.7') echo 'cde43b90945b5304c43ee36e58aab4cc6fb3a3d5f9bd9449bb1709a68371cb06' ;; '2.8') echo 'a88db9c2f104defdaa8011c58cf6cda6c114298ae3695ecfb8beb30da3a903cb' ;; '2.9') echo 'c9159ec4362284c0a38d73237e224deae6139cbde0db4f0f44e1c7691dd3de2f' ;; '2.10') echo '66406247f745fc6f05ab382d3f8d3e120c339f34ef54b86f6dc5f6efc18fbb13' ;; '2.11') echo '8d7437082356c9fd6309a4479c8db307673965546daea445c6c72759cd6b1ed6' ;; '2.12') echo 'e77064981906cd0476ff1e0de3e6fef747bd18e140960f1915cca8ff6c33ab5c' ;; '2.13') echo '0f665ec6a5a67865faf7ba0d825afb19c26705ea0597cec80dd191b0f2cbb664' ;; '2.14') echo '993b4f33b652c689e9721917d8e021cab6bbd3eae81b39ab2fd46fdb19a928d5' ;; '2.14.1') echo 'cfc61eda71f2d12a572822644ce13d2919407595c2aec3e3566d2aab6f97ef39' ;; '3.0') echo '39c906941a474444afbddc38144ed44166825acb0a57b0551dddb04bbf157f80' ;; '3.1') echo 'c7de3442432253525902f7e8d7eac8b5fd6ce1623f96d76916af6d0e383010fc' ;; '3.2') echo '5321b36837226dc0377047a328f12010f42c7bf88ee4a3b1cee0c11040082935' ;; '3.2.1') echo '9843a3654d3e57dce54db06d05f18b664b95c22bf90c6becccb61fc63ce60689' ;; '3.3') echo 'c58650c278d8cf0696cab65108ae3c8d95eea9c1938e0eb8b997095d5ca9a292' ;; '3.4') echo '72d0cd4dcdd5e3be165eb7cd7bbd25cf8968baf400323d9ab1bba622c3f72205' ;; '3.4.1') echo 'db1db193d479cc1202be843f17e4526660cfb0b21b57d62f3a87f88c878af9b2' ;; '3.5') echo '0b7450798c190ff76b9f9a3d02e18b33d94553f708ebc08ebe09bdf99111d110' ;; '3.5.1') echo '8dce35f52d4c7b4a4946df73aa2830e76ba7148850753d8b5e94c5dc325ceef8' ;; '4.0') echo '56bd2dde29ba2a93903c557da1745cafd72cdd8b6b0b83c05a40ed7896b79dfe' ;; '4.0.1') echo 'd717e46200d1359893f891dab047fdab98784143ac76861b53c50dbd03b44fd4' ;; '4.0.2') echo '79ac421342bd11f6a4f404e0988baa9c1f5fabf07e3c6fa65b0c15c1c31dda22' ;; '4.1') echo 'd55dfa9cfb5a3da86a1c9e75bb0b9507f9a8c8c100793ccec7beb6e259f9ed43' ;; '4.2') echo '515dd63d32e55a9c05667809c5e40a947529de3054444ad274b3b75af5582eae' ;; '4.2.1') echo 'b551cc04f2ca51c78dd14edb060621f0e5439bdfafa6fd167032a09ac708fbc0' ;; '4.3') echo '8dcbf44eef92575b475dcb1ce12b5f19d38dc79e84c662670248dc8b8247654c' ;; '4.3.1') echo '15ebe098ce0392a2d06d252bff24143cc88c4e963346582c8d88814758d93ac7' ;; '4.4') echo 'fa4873ae2c7f5e8c02ec6948ba95848cedced6134772a0169718eadcb39e0a2f' ;; '4.4.1') echo 'e7cf7d1853dfc30c1c44f571d3919eeeedef002823b66b6a988d27e919686389' ;; '4.5') echo '03f2a43a314ff0fb843a85ef68078e06d181c4549c1e5fb983f289382b59b5e3' ;; '4.5.1') echo '3e2ea0d8b96605b7c528768f646e0975bd9822f06df1f04a64fd279b1a17805e' ;; '4.6') echo '98bd5fd2b30e070517e03c51cbb32beee3e2ee1a84003a5a5d748996d4b1b915' ;; '4.7') echo 'fca5087dc8b50c64655c000989635664a73b11b9bd3703c7d6cabd31b7dcdb04' ;; '4.8') echo 'f3e29692a8faa94eb0b02ebf36fa263a642b3ae8694ef806c45c345b8683f1ba' ;; '4.8.1') echo 'af334d994b5e69e439ab55b5d2b7d086da5ea6763d78054f49f147b06370ed71' ;; '4.9') echo 'e66e69dce8173dd2004b39ba93586a184628bc6c28461bc771d6835f7f9b0d28' ;; '4.10') echo '248cfd92104ce12c5431ddb8309cf713fe58de8e330c63176543320022f59f18' ;; '4.10.1') echo 'e53ce3a01cf016b5d294eef20977ad4e3c13e761ac1e475f1ffad4c6141a92bd' ;; '4.10.2') echo 'b49c6da1b2cb67a0caf6c7480630b51c70a11ca2016ff2f555eaeda863143a29' ;; '4.10.3') echo '8626cbf206b4e201ade7b87779090690447054bc93f052954c78480fa6ed186e' ;; '5.0') echo '6157ac9f3410bc63644625b3b3e9e96c963afd7910ae0697792db57813ee79a6' ;; '5.1') echo '7506638a380092a0406364c79d6c87d03d23017fc25a5770379d1ce23c3fcd4d' ;; '5.1.1') echo '4953323605c5d7b89e97d0dc7779e275bccedefcdac090aec123375eae0cc798' ;; '5.2') echo 'ff322863250159595e93b5a4d17a6f0d21c59a1a0497c1e1cf1d53826485503f' ;; '5.2.1') echo '748c33ff8d216736723be4037085b8dc342c6a0f309081acf682c9803e407357' ;; '5.3') echo 'bed2bdd3955be5a09ca7e0201e9d131f194f7f6c466e1795a733733ccfb09f25' ;; '5.3.1') echo '1c59a17a054e9c82f0dd881871c9646e943ec4c71dd52ebc6137d17f82337436' ;; '5.4') echo 'c8c17574245ecee9ed7fe4f6b593b696d1692d1adbfef425bef9b333e3a0e8de' ;; '5.4.1') echo '7bdbad1e4f54f13c8a78abc00c26d44dd8709d4aedb704d913fb1bb78ac025dc' ;; '5.5') echo '8d78b2ed63e7f07ad169c1186d119761c4773e681f332cfe1901045b1b0141bc' ;; '5.5.1') echo '222a03fcf2fcaf3691767ce9549f78ebd4a77e73f9e23a396899fb70b420cd00' ;; '5.6') echo '15c02ef5dd3631ec02ac52e8725703e0285d9a7eecbf4e5939aa9e924604d01d' ;; '5.6.1') echo '0986244820e4a35d32d91df2ec4b768b5ba5d6c8246753794f85159f9963ec12' ;; '5.6.2') echo '32fce6628848f799b0ad3205ae8db67d0d828c10ffe62b748a7c0d9f4a5d9ee0' ;; '5.6.3') echo '60a6d8f687e3e7a4bc901cc6bc3db190efae0f02f0cc697e323e0f9336f224a3' ;; '5.6.4') echo '1f3067073041bc44554d0efe5d402a33bc3d3c93cc39ab684f308586d732a80d' ;; '6.0') echo '5a3578b9f0bb162f5e08cf119f447dfb8fa950cedebb4d2a977e912a11a74b91' ;; '6.0.1') echo 'd364b7098b9f2e58579a3603dc0a12a1991353ac58ed339316e6762b21efba44' ;; '6.1') echo 'd0c43d14e1c70a48b82442f435d06186351a2d290d72afd5b8866f15e6d7038a' ;; '6.1.1') echo '9d94e6e4a28ad328072ef6e56bce79a810494ae756751fdcedffdeaf27c093b1' ;; '6.2') echo 'b93a5f30d01195ec201e240f029c8b42d59c24086b8d1864112c83558e23cf8a' ;; '6.2.1') echo 'a68ca7ba57f3404c3f6fc1f70a02d3a7d78652e6b46bbfaff83fc9a17168c279' ;; '6.2.2') echo '0f6ba231b986276d8221d7a870b4d98e0df76e6daf1f42e7c0baec5032fb7d17' ;; '6.3') echo '038794feef1f4745c6347107b6726279d1c824f3fc634b60f86ace1e9fbd1768' ;; '6.4') echo 'b888659f637887e759749f6226ddfcb1cb04f828c58c41279de73c463fdbacc9' ;; '6.4.1') echo 'e58cdff0cee6d9b422dcd08ebeb3177bc44eaa09bd9a2e838ff74c408fe1cbcd' ;; '6.5') echo '23e7d37e9bb4f8dabb8a3ea7fdee9dd0428b9b1a71d298aefd65b11dccea220f' ;; '6.5.1') echo '50a7d30529fa939721fe9268a0205142f3f2302bcac5fb45b27a3902e58db54a' ;; '6.6') echo 'e6f83508f0970452f56197f610d13c5f593baaf43c0e3c6a571e5967be754025' ;; '6.6.1') echo '7873ed5287f47ca03549ab8dcb6dc877ac7f0e3d7b1eb12685161d10080910ac' ;; '6.7') echo '8ad57759019a9233dc7dc4d1a530cefe109dc122000d57f7e623f8cf4ba9dfc4' ;; '6.7.1') echo '3239b5ed86c3838a37d983ac100573f64c1f3fd8e1eb6c89fa5f9529b5ec091d' ;; '6.8') echo 'e2774e6fb77c43657decde25542dea710aafd78c4022d19b196e7e78d79d8c6c' ;; '6.8.1') echo 'fd591a34af7385730970399f473afabdb8b28d57fd97d6625c388d090039d6fd' ;; '6.8.2') echo '8de6efc274ab52332a9c820366dd5cf5fc9d35ec7078fd70c8ec6913431ee610' ;; '6.8.3') echo '7faa7198769f872826c8ef4f1450f839ec27f0b4d5d1e51bade63667cbccd205' ;; '6.9') echo '765442b8069c6bee2ea70713861c027587591c6b1df2c857a23361512560894e' ;; '6.9.1') echo '8c12154228a502b784f451179846e518733cf856efc7d45b2e6691012977b2fe' ;; '6.9.2') echo '8b356fd8702d5ffa2e066ed0be45a023a779bba4dd1a68fd11bc2a6bdc981e8f' ;; '6.9.3') echo 'dcf350b8ae1aa192fc299aed6efc77b43825d4fedb224c94118ae7faf5fb035d' ;; '6.9.4') echo '3e240228538de9f18772a574e99a0ba959e83d6ef351014381acd9631781389a' ;; '7.0') echo 'eb8b89184261025b0430f5b2233701ff1377f96da1ef5e278af6ae8bac5cc305' ;; '7.0.1') echo 'dccda8aa069563c8ba2f6cdfd0777df0e34a5b4d15138ca8b9757e94f4e8a8cb' ;; '7.0.2') echo '0e46229820205440b48a5501122002842b82886e76af35f0f3a069243dca4b3c' ;; '7.1') echo '2debee19271e1b82c6e41137d78e44e6e841035230a1a169ca47fd3fb09ed87b' ;; '7.1.1') echo 'bf8b869948901d422e9bb7d1fa61da6a6e19411baa7ad6ee929073df85d6365d' ;; '7.2') echo 'f581709a9c35e9cb92e16f585d2c4bc99b2b1a5f85d2badbd3dc6bff59e1e6dd' ;; '7.3') echo 'de8f52ad49bdc759164f72439a3bf56ddb1589c4cde802d3cec7d6ad0e0ee410' ;; '7.3.1') echo '9afb3ca688fc12c761a0e9e4321e4d24e977a4a8916c8a768b1fe05ddb4d6b66' ;; '7.3.2') echo '23b89f8eac363f5f4b8336e0530c7295c55b728a9caa5268fdd4a532610d5392' ;; '7.3.3') echo 'b586e04868a22fd817c8971330fec37e298f3242eb85c374181b12d637f80302' ;; '7.4') echo '8cc27038d5dbd815759851ba53e70cf62e481b87494cc97cfd97982ada5ba634' ;; '7.4.1') echo 'e5444a57cda4a95f90b0c9446a9e1b47d3d7f69057765bfb54bd4f482542d548' ;; '7.4.2') echo '29e49b10984e585d8118b7d0bc452f944e386458df27371b49b4ac1dec4b7fda' ;; '7.5') echo 'cb87f222c5585bd46838ad4db78463a5c5f3d336e5e2b98dc7c0c586527351c2' ;; '7.5.1') echo 'f6b8596b10cce501591e92f229816aa4046424f3b24d771751b06779d58c8ec4' ;; '7.6') echo '7ba68c54029790ab444b39d7e293d3236b2632631fb5f2e012bb28b4ff669e4b' ;; '7.6.1') echo '6147605a23b4eff6c334927a86ff3508cb5d6722cd624c97ded4c2e8640f1f87' ;; '7.6.2') echo 'a01b6587e15fe7ed120a0ee299c25982a1eee045abd6a9dd5e216b2f628ef9ac' ;; '7.6.3') echo '740c2e472ee4326c33bf75a5c9f5cd1e69ecf3f9b580f6e236c86d1f3d98cfac' ;; '7.6.4') echo 'bed1da33cca0f557ab13691c77f38bb67388119e4794d113e051039b80af9bb1' ;; '8.0') echo '4159b938ec734a8388ce03f52aa8f3c7ed0d31f5438622545de4f83a89b79788' ;; '8.0.1') echo '1b6b558be93f29438d3df94b7dfee02e794b94d9aca4611a92cdb79b6b88e909' ;; '8.0.2') echo 'ff7bf6a86f09b9b2c40bb8f48b25fc19cf2b2664fd1d220cd7ab833ec758d0d7' ;; '8.1') echo 'a62c5f99585dd9e1f95dab7b9415a0e698fa9dd1e6c38537faa81ac078f4d23e' ;; '8.1.1') echo 'e111cb9948407e26351227dabce49822fb88c37ee72f1d1582a69c68af2e702f' ;; '8.2') echo '38f66cd6eef217b4c35855bb11ea4e9fbc53594ccccb5fb82dfd317ef8c2c5a3' ;; '8.2.1') echo '03ec176d388f2aa99defcadc3ac6adf8dd2bce5145a129659537c0874dea5ad1' ;; '8.3') echo '591855b517fc635b9e04de1d05d5e76ada3f89f5fc76f87978d1b245b4f69225' ;; '8.4') echo '3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae' ;; '8.5') echo '9d926787066a081739e8200858338b4a69e837c3a821a33aca9db09dd4a41026' ;; '8.6') echo '9631d53cf3e74bfa726893aee1f8994fee4e060c401335946dba2156f440f24c' ;; '8.7') echo '544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d' ;; *) exit 1 esac } contains() { local e for e in $2; do [[ $e == $1 ]] && return 0; done return 1 } # key-value pairs of what gradle version (value) each gradle plugin version # (key) should accept. plugin versions are actually prefixes and catch sub- # versions as well. Pairs are taken from: # https://developer.android.com/studio/releases/gradle-plugin#updating-gradle d_gradle_plugin_ver_k=(8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0) d_plugin_min_gradle_v=(8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about plugin_v=(8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} # Earliest file takes priority # Last key takes priority if there are duplicates (matching java.util.Properties) for f in {.,..}/gradle/wrapper/gradle-wrapper.properties; do [[ -f $f ]] || continue while IFS='' read -r line || [ -n "$line" ]; do line=$(printf "$line" | tr -d '\r') # strip Windows linefeeds if [[ $line == 'distributionUrl='* ]]; then wrapper_ver=${line#*/gradle-} wrapper_ver=${wrapper_ver%-*.zip} fi done < $f [[ -n $wrapper_ver ]] && break done if [[ -n $wrapper_ver ]]; then v_found=$wrapper_ver echo "Found $v_found via distributionUrl" run_gradle fi # Earliest takes priority for f in {.,..}/build.gradle{,.kts}; do [[ -f $f ]] || continue while IFS='' read -r line || [ -n "$line" ]; do line=$(printf "$line" | tr -d '\r') # strip Windows linefeeds if [[ -z "$plugin_pver" && $line == *'com.android.tools.build:gradle:'* ]]; then plugin_pver=${line#*[\'\"]com.android.tools.build:gradle:} plugin_pver=${plugin_pver%[\'\"]*} elif [[ -z "$wrapper_ver" && $line == *'gradleVersion = '* ]]; then wrapper_ver=${line#*gradleVersion*=*[\'\"]} wrapper_ver=${wrapper_ver%[\'\"]*} fi done < $f done if [[ -n $wrapper_ver ]]; then v_found=$wrapper_ver echo "Found $v_found via gradleVersion" run_gradle fi if [[ -n $plugin_pver ]]; then i=0 match=false for k in "${d_gradle_plugin_ver_k[@]}"; do if [[ $plugin_pver == ${k}* ]]; then plugin_ver=${d_plugin_min_gradle_v[$i]} match=true break fi let i++ done if $match; then v_found=$plugin_ver echo "Found $v_found via gradle plugin version $k" fi fi # Find the highest version available for v in ${plugin_v[*]}; do if contains $v "${v_all[*]}"; then v_def=$v break fi done if [[ -z $v_found ]]; then echo "No suitable gradle version found - defaulting to $v_def" v_found=$v_def fi run_gradle ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/locale/0000755000175000017500000000000014620351546014247 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/locale/bo/0000755000175000017500000000000014620351546014647 5ustar00hanshans././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.888382 fdroidserver-2.3a1/locale/bo/LC_MESSAGES/0000755000175000017500000000000014620351546016434 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/locale/bo/LC_MESSAGES/fdroidserver.po0000644000175000017500000033100614620351225021467 0ustar00hanshans# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # Hans-Christoph Steiner , 2020, 2021, 2022, 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tibetan \n" "Language: bo\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py #, fuzzy msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" "\n" "SSHདམངས་ཀྱི་ལྡེ་མིག་དེ་ཕྱོགས་སྐྱོད་ལྡ་ེམིག་ལ་བེད་སྤྱོད་བྱེད།:" #: ../fdroidserver/nightly.py #, python-brace-format msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" "\n" "{path} DEBUG_KEYSTOREགསང་རྟགས་ཀྱི་ཆེད་དུ་ཨང་སྒྲིག:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" འདི་དང་མཐུན་པའི་རྒྱབ་ལྗོངས་ཡིག་ཆ་མིན་འདུག!" #: ../fdroidserver/index.py #, fuzzy, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" msgstr "dir གྱི་རྩ་བ་ for local_copy_dir \"{path}\" མིན་འདུག!" #: ../fdroidserver/install.py #, fuzzy, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "'{apkfilename}' འདི་{dev}.ནང་སྔོན་ཚོད་ནས་སྒྲིག་བཅུག་བྱས་ཟིན།." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" msgstr "\"{path}\"དུས་ཚོད་ཡོལ་ཟིན་པའི་{name} ({version})ཚུད་ཡོད།" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" msgstr "\"{path}\" ཉེ་ཆར་{name} ({version})རྣམས་ཚུད་ཡོད།" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" msgstr[0] "%(option)s གདམ་ཀ་དགོས་ %(number)d རྩོད་པ།" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: ནོར་སྐྱོན: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" msgstr "%d དཀའ་རྙོག་ཐོན་སོང་།" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "%prog [options]" msgstr "%prog [གདམ་ཀ།]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" msgstr "%r 1 བྱེད་ལས་མིན་འདུག" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" msgstr "" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" msgstr "" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" msgstr "%s 1འདི་ཁས་ལེན་ཐུབ་པའི་བཟོ་སྐྲུན་རྭ་བ་མ་རེད།" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" msgstr "%sགདམ་ཀ་ནུས་མེད་རེད་འདུག" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' འདི་config.yml ནང་རྙེད་མ་སོང་།!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "'keystore' འདི་ config.yml ནང་རྙེད་མ་སོང་།!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' འདི་ config.yml ནང་རྙེད་མ་སོང་།!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' འདི་ config.yml ནང་རྙེད་མ་སོང་།!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'དགསོ་མཁོ།' ནི་གནས་སྟངས་འདི་ལ་ཁུངས་ལྡན་གྱི་རྩོད་པ་རེད་མིན་འདུག" #: ../fdroidserver/common.py #, fuzzy msgid "'sdk_path' not set in config.yml!" msgstr "'sdk_path' འདི་ 'config.yml' ནང་སྒྲིག་ཐུབ་མ་སོང་།!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" msgstr "'{field}1' ནི་གོ་རིམ་ངེས་མེད།! བེད་སྤྱོད། () ཡང་ན། [] གོ་རིམ་གལ་ཆེན་པོའི་རིགས་ལ་གུག་རྟགས་ནང་བཅུག!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" msgstr "'{path}1' ལག་བསྟར་ཐུབ་མ་སོང་།!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' ཁུངས་ལྡན་རེད་མིན་འདུག{field} འདི་ནང་ {appid}. Regex འགྲོ་ལུགས་: {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" msgstr "...{appid} གྱི་ཆེད་དུ་གསར་བསྒྱུར་འཚོལ་མི་ཐུབ།་: {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() ངོས་འཛིན་ཐུབ་མེད།" #: ../fdroidserver/lint.py msgid "/issues is missing" msgstr "/གནས་དོན་བོར་བརླག་སོང་འདུག" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" msgstr "" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "PGP གྱི་མིང་རྟགས་དེ་རེ་པོ་ཐུམ་སྒྲིལ་ནང་GnuPG ཁ་སྣོན་བྱས་ནས་རེ་པོ་ནང་ལ་བཅུག" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" msgstr "མིང་རྟགས་མི་བཀོད་པའི་རེ་པོ་ནང་ལ་རེ་པོ་མིང་རྟགས་ལྡེ་མིག་འདི་ཁ་སྣོན་བྱེད།" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" msgstr "APKsནང་ལ་ཡིག་ཚགས་ཀྱི་རྒྱབ་ལྗོངས་ལོ་རྒྱུས་ཁ་སྣོན་བྱེད།" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" msgstr "{name}ཁོ་ནའི་ཆེད་དུ་རེ་པོ་གསར་པ་ཁ་སྣོན།" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" msgstr "ལྡེ་མིག་གསོག་ཉར་ཁང་ནང་རེ་པོ་མིང་རྟགས་ལྡེ་མིག་བཀོད་པའི་གསང་མིང་།" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" msgstr "" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "ཐོག་མའི་ནང་འདྲེན་བྱེད་པའི་སྐབས་གསལ་པོའི་ཐོག་ནས་སྐྱར་སྦྱོང་(ཡང་ན་གིཊ་ཡན་ལག་)མི་འདྲ་བ་རྣམས་ལ་ཆོག་མཆན་སྤྲོད།" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" msgstr "" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" msgstr "མ་ཟད་བཀོད་སྒྲིག་བྱས་པའི་གནད་དོན་རྣམས་ལ་ཉེན་བརྡ་སྟོན། དཔེར་ན་rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" msgstr "" #: ../fdroidserver/scanner.py msgid "Android APK file" msgstr "" #: ../fdroidserver/scanner.py msgid "Android DEX code" msgstr "" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" msgstr "ཨེན་ཀྲོཌ་SDK ཐབས་ལམ་ '{path}'མིན་འདུག!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" msgstr "ཨེན་ཀྲོཌSDKཐབས་ལམ་ '{path}1' ཡིག་ཆ་གསོག་ཉར་རེད་མིན་འདུག!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" msgstr "" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" msgstr "མཉེན་ཆས་འདི་'{repo}1ནང་འདུག འོན་ཀྱང་སྦྲེལ་མཐུད་དེ་ {url}2ཡོད།" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Appending .git ངེས་པར་དགོས་ཀྱི་མེད།" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" msgstr "མཛོད་ཁང་{apkfilename} ལ་ཁུངས་ལྡན་མིན་པའི་མིང་རྟགས་!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" msgstr "" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" msgstr "ཡན་ལག '{branch}1' བཟོ་སྐྲུན་ནང་བེད་སྤྱོད་བྱས་རྒྱུ་ཁས་ལེན་ཡོད།'{versionName}2'" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" msgstr "ཡན་ལག '{branch}1'' srclib ནང་བེད་སྤྱོད་བྱེད་རྒྱུ་ཁས་ལེན་ཡོད་།'{srclib}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" msgstr "" #: ../fdroidserver/__main__.py msgid "Build a package from source" msgstr "འབྱུང་ཁུངས་ནས་ཐུམ་སྒྲིལ་བཟོས་འདུག" #: ../fdroidserver/build.py msgid "Build all applications available" msgstr "མཉེན་ཆས་ཡོད་བཞིན་པ་ཆ་ཚང་ལ་ཐོན་སྐྱེད་བཟོས།" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" msgstr "བཟོ་སྐྲུན་འདི་ཐོན་སྐྱེད་བྱེད་མཁན་ 'ཨེཕ་རོཌ་ནང་འདྲེན།' -གལ་སྲིད་གྲ་སྒྲིག་ཟིན་ན་ནུས་མེད་ཀྱི་རིམ་པ་དེ་མེད་པ་བཟོས།" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" msgstr "" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" msgstr "ཐུམ་སྒྲིལ་རེ་རེ་ལ་ཁོ་ནར་བཟོས་པའི་ཐོན་རིམ་གསར་ཤོས།" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" msgstr "རེ་པོ་བཟོ་སྐྲུན་གཞི་རྩ་ \"%s\" སྒྲིག་བཀོད་འདི་དང་མཉམ་དུ་ཡོད།:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" msgstr "" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "ཚགས་རྒྱབ་པའི་སྐབས་སུ་ནོར་སྐྱོན་ {} ཤོར་བས་བཟོ་སྐྲུན་བྱེད་ཐུབ་མེད།" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" msgstr "" #: ../fdroidserver/lint.py #, fuzzy, python-format msgid "Categories '%s' is not valid" msgstr "སྡེ་ཚན་'%s' ཁུངས་ལྡན་མ་རེད།" #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "སྡེ་ཚན་རྣམས་སྒྲིག་མེད།" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "མཉེན་ཆས་རྣམས་གསར་བསྒྱུར་བྱས་མིན་གཟིགས་ཞིབ་གནང་དང་།" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "མཛོད་ཁང་ཚོད་ལྟའི་ཆེད་དུ།{appid} - APKs:{integer},ཐོན་རིམ་ཉར་ཚགས།:{keep},archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "གསར་བསྒྱུར་གཙང་བཟོ།-ཡིག་ཆ་གསོག་ཉར་བེད་སྤྱོ་མ་བྱེད། APKs ཚང་མ་སྐྱར་སྤྱོད་བྱེད།" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "སྡེ་ཚན་སོ་སོའི་ཐོ་གཞུང་ལ་བར་མཚམས་རེ་འཇོག།." #: ../fdroidserver/__main__.py #, python-format msgid "Command '%s' not recognised.\n" msgstr "བཀའ་ཁྱབ་ '%s 1'ངོས་འཛིན་ཐུབ་མ་སོང་།\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" msgstr "བསྒྱུར་བ་གཏོང་བར་མོས་མཐུན་ཡོད།" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" msgstr "" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "ཁྱེད་རང་གི་མ་ལག་སྒང་ལ་'{command}1' རྙེད་མ་སོང་།" #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Could not find latest version code" msgstr "ཐོན་རིམ་གསར་གསར་ཤོས་ཀྱི་ཨང་རྟགས་འདི་འདི་རྙེད་མ་སོང་།" #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Could not find latest version name" msgstr "ཐོན་རིམ་གསར་ཤོས་འདིའི་མིང་རྙེད་མ་སོང་།" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" msgstr "{path}མེད་པ་བཟོས་པ་ལ་རྙེད་མ་སོང་།" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Couldn't find Application ID" msgstr "ཐུམ་སྒྲིལ་ངོས་འཛིན་རྙེད་སོན་བྱུང་མ་སོང་།" #: ../fdroidserver/checkupdates.py #, fuzzy msgid "Couldn't find any version information" msgstr "ཐོན་རིམ་གསར་ཤོས་འདིའི་མིང་རྙེད་མ་སོང་།" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "ཐུམ་སྒྲིལ་ངོས་འཛིན་རྙེད་སོན་བྱུང་མ་སོང་།" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" msgstr "མིང་རྟགས་ལྡེ་མིག་སྒྲིག་བཀོད་ལ་སྐྱར་བྲིས་བྱེད་མི་བདེ་བ།!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" msgstr "དྲྭ་སྣོད་གསར་པ་བཟོས་\"{name}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "ཉིན་ཐོ་ཕྱོགས་དེབ་བཟོ་བཞིན་པ།" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" msgstr "S3 སྣོད་གསར་པ་བཟོ་བཞིན་པ།:{url}" #: ../fdroidserver/publish.py msgid "Creating output directory" msgstr "ཐོན་སྐྱེད་ཕྱོགས་དེབ་བཟོ་བཞིན་པ།" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" msgstr "ལྡེ་མིག་འདི་(SHA256)དང་མཉམ་དུ་མིང་རྟགས་ཕྱོགས་སྟོན་བཟོ་བཞིན་པ།:" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" msgstr "གནས་སྐབས་ཕྱོགས་དེབ་བཟོ་བཞིན་པ།" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" msgstr "མིང་རྟགས་གྲ་སྒྲིག་གི་ཆེད་དུ་མིང་རྟགས་མ་བཀོད་པའི་ཕྱོགས་སྟོན་བཟོ་བཞིན་པ།" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" msgstr "" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" msgstr "DEBUG_KEYSTORE སྒྲིག་བཀོད་བྱེད་མིན་འདུག ཡང་ན་ཚད་ལོངས་མིན་འདུག" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" msgstr "APKs དང/ཡང་ནOBBs གཉིས་ལ་རེ་པོ་ནས་འགྲེལ་ཡིག་ཚགས་ཀྱི་རྒྱབ་ལྗོངས་ལོ་རྒྱུས་མེད་པ་རྣམས་སུབས།" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" msgstr "ངོས་འཛིན་མི་ཐུབ་པའི་ཡིག་ཆ་རྣམས་སུབས་བཞིན་པ།: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" msgstr "འགྲེལ་བཤད་'%s 1' ནི་མཉེན་ཆས་མདོར་བསྡུས་ཤིག་རེད།" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" msgstr "འགྲེལ་བཤད་འདི་ལ་རིམ་པ་རྫུན་མ་ཡོད།" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" msgstr "འགྲེལ་བཤད་འདི་ལ་ཐོ་གཞུང་ཡོད། (%s 1) འོན་ཀྱང་འདི་ལ་ཚགས་རྒྱབ་མིན་འདུག(*)གྲངས་ཀྱང་མེད། (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" msgstr "རིང་ཐུང་གི་འགྲེལ་བཤད་ {length} {limit} ལས་བརྒལ་འདུག char limit" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" msgstr "" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" msgstr "" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" msgstr "དེ་མ་ཐག་ཏུ་ཨེན་ཀྲོཌ་SDK གྱི་ལམ་མ་སྟོན། ད་ལྟ་བྱེད་ཐུབ་མ་སོང་།" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" msgstr "" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" msgstr "ཊར་བོལ་གྱི་འབྱུང་ཁུངས་མ་བཟོས། འདིས་ཐོན་སྐྱེད་ཚོད་ལྟ་བྱེད་པ་ལ་ཕན་ཐོགས།" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" msgstr "མཛོད་ཁང་སྐྱར་སོས་མ་བྱེད། དྲྭ་རྒྱ་མེད་པའི་སྐབས་ལ་ཐོན་སྐྱེད་ཚོད་ལྟ་བྱེད་པར་ཕན་ཐོགས་ཡོང་།" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" msgstr "rsync ཡིག་ཚགས་བརྟག་དཔྱད་ཀྱི་གསོག་ཉར་ཁང་འདི་བེད་སྤྱོད་མ་བྱེད།" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" msgstr "" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "མཛོད་ཁང་ཕབ་ལེན་ཐེངས་གཅིག་བྱས་པ་འདི་ཐུབ་མ་སོང་། ཡང་སྐྱར་ཐབས་ཤེས་བྱེད་ཀྱི་མིན་།." #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" msgstr "{url} ཕབ་ལེན་ཐུབ་མ་སོང་།{error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" msgstr "" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" msgstr "'{field}'ནང་གི་ངོ་བཤུས་སྦྲེལ་མཐུད།: {url}" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ནོར་འཁྲུལ།: རྒྱབ་སྐྱོར་མེད་པའི་CI རྣམ་གྲངས་དང་ལྷན་པ་རྒྱབ་ནའང་འགྲིག་གི་ཡོད།!" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." msgstr "" #: ../fdroidserver/init.py #, python-format msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" "ཨེན་ཀྲོཌ་SDKགྱི་ལམ་འདིར་ཡོད་པས་ནང་འཛུལ་བྱེད། (%s) :\n" "> " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" msgstr "" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "རེ་པོ་ཁ་བྱང་ལེན་སྐབས་ནོར་སྐྱོན།" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" msgstr "" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "APKs ནས་མིང་རྟགས་ཕྱིར་སྟོན་བྱེད།" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "Failed copying {path}: {error}" msgstr "ཀློག་མི་ཐུབ།{path}: {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" msgstr "'{apkfilename}'གྱི་ཆེད་དུ་འཚོལ་བཞིན་པའི་མིང་རྟགས་རྙེད་མ་སོང་།: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" msgstr "ཀློག་མི་ཐུབ།{path}: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" msgstr "ཆེ་ཆུང་སྐྱར་སྒྲིག་ཐུབ་མ་སོང་། {path}: {error}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" msgstr "S3 དྲྭ་སྣོད་བཟོས་ཐུབ་མ་སོང་། :{url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" msgstr "APK གནས་ཚུལ་རག་གི་མིན་འདུག {path}སུབ་བཞིན་པ།" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" msgstr "APK གནས་ཚུལ་རག་གི་མིན་འདུག {path}མཆོང་།" #: ../fdroidserver/update.py #, fuzzy msgid "Failed to get APK signing key fingerprint" msgstr "APKནང་གསལ་བའི་གནས་ཚུལ་རྣམས་ལེན་ཐུབ་མ་སོང་།" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" msgstr "སྒྲིག་བཅུག་བྱེད་མ་སོང་། '{apkfilename}' སྒང་ལ་ {dev}: {error}" #: ../fdroidserver/common.py msgid "Failed to sign application" msgstr "མཉེན་ཆས་མིང་རྟགས་བཀོད་མིན་འདུག" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" msgstr "" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" msgstr "'{apkfilename}' ཆེད་དུ་མིང་རྟགས་འཚོལ་བཞིན་པ།་> '{sigdir}'" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" msgstr "" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py #: ../fdroidserver/update.py msgid "Finished" msgstr "ཚར་སོང་།" #: ../fdroidserver/lint.py #, fuzzy msgid "Flattr donation methods belong in the FlattrID: field" msgstr "Flattr ཞལ་འདེབས་ཐབས་ལམ་འདི་བཞིན་FlattrID flag ལ་ཐོབ་ཀྱི་ཡོད་།" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." msgstr "ནུས་མེད་མཉེན་ཆས་ལ་ཐོན་སྐྱེད་ཆེད་དུ་མངགས་ཏེ་བཟོས། འདི་འཚག་རྒྱབ་ཀྱི་དཀའ་ངལ་ཡོད་མིན་ལ་མ་ལྟོས་པར་མུ་མཐུད་དུ་འགྲོ་ཐུབ། འདི་ཚོད་ལྟའི་ཚུལ་ཁ་ོནར་ཆོག་མཆན་སྤྲད།." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" msgstr "" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" msgstr "\"{name}\" བརྐོད་རིས་མེད་པའི་མཉེས་ཆས་ཀྱི་རྒྱབ་ལྗོངས་ཡིག་ཆ་\"{path}\"རྙེད་སོང་།!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" msgstr "རྩོད་པའི་ནང་ཁུངས་ལྡན་མིན་པའི་appids རྙེད་འདུག" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "མཉེན་ཆས་ཁ་ཤས་ཀྱི་ཁུངས་ལྡན་མིན་པའི་ཐོན་རིམ་ཨང་རྟགས་རྙེད་འདུག" #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" msgstr "{path}ནང་ལ་སྣ་མང་མིང་རྟགས་ཆོག་མཆན་ལག་ཁྱེར་རྙེད་སོང་།" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" msgstr "རྒྱབ་ལྗོངས་ཡིག་ཚགས་སྣ་མང་{appid}ནང་ཐོན།" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." msgstr "མཛོད་ཁང་ཆེད་དུ་་མིང་རྟགས་བཀོད་པའི་ལག་ཁྱེར་མང་པོ་རྙེད་འདུག." #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." msgstr "མཛོད་ཁང་ཆེད་དུ་མིང་རྟགས་བཀོད་པའི་ལག་ཁྱེར་རྙེད་མ་སོང་།." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" msgstr "འདི་ལ་%s 1 ཡིག་ཆ་མིན་པ་རྙེད་སོང་།" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" msgstr "{url} ནང་ལ་ {apkfilename}ཤུས་བཞིན་པ།" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} problems in {filename}" msgstr "" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" msgstr "{appid}ཆེད་དུ་རྒྱབ་ལྗོངས་ཡིག་ཚགས་བཟོས།" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" msgstr "གིཊ་ཕྱིར་འཐེན་'%s 1' ཐུབ་མ་སོང་།" #: ../fdroidserver/common.py msgid "Git clean failed" msgstr "གིཊ་གཙང་བཟོ་ཐུབ་མ་སོང་།" #: ../fdroidserver/common.py msgid "Git fetch failed" msgstr "གིཊ་འཚོལ་ཐུབ་མ་སོང་།" #: ../fdroidserver/common.py #, fuzzy msgid "Git prune failed" msgstr "གིཊ་སྐྱར་སྒྲིག་ཐུབ་མ་སོང་།" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "གིཊ་སྐྱར་སྒྲིག་ཐུབ་མ་སོང་།" #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "གིཊ་རྒྱ་ཁྱོན་མཉམ་བསྲེ་ཐུབ་མ་སོང་།" #: ../fdroidserver/common.py msgid "Git submodule update failed" msgstr "གིཊ་ཡན་ལག་རྒྱ་ཁྱོན་གསར་བསྒྱུར་ཐུབ་མ་སོང་།" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" msgstr "" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." msgstr "" #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" msgstr "" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "རྒྱབ་ལྗོངས་ཡིག་ཆ་མེད་པའི་ཐུམ་སྒྲིལ་ཡ་ལན་མ་བྱས། " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" msgstr "{apkfilename}ཡིག་ཆ་སྦས་ཁུང་རྙིང་པ་ལ་ཡ་ལན་མ་བྱས་" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" msgstr "MD5ལྟ་བུའི་མཚན་རྟགས་ཡོད་པའི་APKs ནང་ཚུད།" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" msgstr "" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" msgstr "" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" msgstr "" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" msgstr "" #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "ཐོག་མིའི་ཡན་ལག་རྒྱ་ཁྱོན།" #: ../fdroidserver/install.py msgid "Install all signed applications available" msgstr "ཡོད་བཞིན་པའི་མིང་རྟགས་བཀོད་པའི་མཉེན་ཆས་ཆ་ཚང་འགྲིག་བཅུག་བྱེད།" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" msgstr "ཡོ་བྱད་སྒང་གི་ཐུམ་སྒྲིལ་བཟོས་པ་རྣམས་འགྲིག་བཅུག་བྱེད།" #: ../fdroidserver/install.py #, fuzzy, python-format msgid "Installing %s..." msgstr "སྒྲིག་བཅུག་བྱེད་བཞིན་པ།%s 1…" #: ../fdroidserver/install.py #, fuzzy, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." msgstr "'{apkfilename}' སྒྲིག་བཅུག་བྱེད་བཞིན་པ{dev}གྱི་སྒང་ལ་…" #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" msgstr "རེ་པོ་HTTP ཞབས་ཞུ་འཕྲུལ་ཆས་དང་ཐུགས་ཕྲད།" #: ../fdroidserver/update.py msgid "Invalid APK" msgstr "ཁུངས་ལྡན་མིན་པའི་APK" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Invalid application ID {appid}" msgstr "ལས་ཀ་བྱེད་བཞིན་པ།{appid}" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" msgstr "ཁུངས་ལྡན་མིན་པའི་boolean '%s 1'" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "ཚད་ལྡན་མིན་པའི་ཚགས་ཀྱི་ཐོ་གཞུང་།" #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" msgstr "པར་སྐྲུན་ཡིག་ཆའི་ཆེད་དུ་ཁུངས་ལྡན་མིན་པའིན་མིང་།: %s 1" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" msgstr "" #: ../fdroidserver/scanner.py msgid "Java JAR file" msgstr "" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" msgstr "Java JDK རྙེད་མ་སོང་།! ཚད་ལྡན་གྱི་ས་གནས་ནང་སྒྲིག་བཅུག་བྱེད་པའམ་ཡང་ན་java_paths སྒྲིག!" #: ../fdroidserver/scanner.py msgid "Java compiled class" msgstr "" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" msgstr "Java jarsigner རྙེད་མ་སོང་། !ཚད་ལྡན་གྱི་ས་གནས་ནང་སྒྲིག་བཅུག་བྱེད་པའམ་ཡང་ན་java_paths སྒྲིག!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" msgstr "" #: ../fdroidserver/build.py #, fuzzy, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" msgstr "ཐུམ་སྒྲིལ་གྱི་མིང་ཀློག་བཞིནཔ།/ཐོན་རིམ་ཨང་རྟགས་/ཐོན་རིམ་གྱི་མིང་བདེ་སྤྱོད་མེད། APK ཁུངས་ལྡན་མིན།: '{apkfilename}'" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "མིང་རྟགས་བཀོད་པའི་ལྡེ་མིག་ཆེད་དུ་སྟོན་པའི་ལྡེ་མིག་གསོག་ཉར་ཁང་གི་ལམ།\t" #: ../fdroidserver/lint.py #, fuzzy, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" msgstr "ཁས་ལེན་བྱས་པའི་བེད་སྤྱོད་ཐ་མ་ '{commit}' སྦྱར་བ་འདྲ་པོ་འདུག, འོན་ཀྱང་གསར་བསྒྱུར་ཡོད་མེད་འཚོལ་བྱེད་ནི།'{ucm}'" #: ../fdroidserver/lint.py #, fuzzy msgid "Liberapay donation methods belong in the Liberapay: field" msgstr "Flattr ཞལ་འདེབས་ཐབས་ལམ་འདི་བཞིན་FlattrID flag ལ་ཐོབ་ཀྱི་ཡོད་།" #: ../fdroidserver/rewritemeta.py #, fuzzy msgid "List files that would be reformatted (dry run)" msgstr "སྐྱར་དུ་བཀོད་སྒྲིག་བྱེད་དགོས་པའི་ཡག་ཆ་རྣམས་ཀྱི་ཐོ་གཞུང་།" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" msgstr "དམིགས་བསལ་གྱི་གནས་སྐབས་ལ་ཐོན་སྐྱེད་དེ་བཀག་ཆོག" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." msgstr "བཟོ་ལྟ་མེད་པའི་མཛོད་ཁང་ཤེལ་སྒོ་རྣམས།." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" msgstr "བཟོ་ལྟ་ཤོར་བའི་ serverwebroot line:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" msgstr "" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" #: ../fdroidserver/gpgsign.py msgid "Missing output directory" msgstr "ཕྱོགས་དེབ་ཐོན་སྐྱེད་བོར་བརླག" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" msgstr "" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" #: ../fdroidserver/verify.py #, fuzzy, python-format msgid "No APK for package: %s" msgstr "ཐུམ་སྒྲིལ་དེ་འདྲ་མིན་འདུག: %s 1" #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "ཨེན་ཀྲོཌ་ SDK རྙེད་མ་སོང་།!" #: ../fdroidserver/install.py msgid "No attached devices found" msgstr "ཟུར་སྣོན་ཡོ་བྱད་རྙེད་མ་སོང་།" #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "URL ནང་ལག་མཐིལ་པར་ཤུས་རྙེད་མ་སོང་།." #: ../fdroidserver/common.py msgid "No git submodules available" msgstr "གིཊ་ཡན་ལག་རྒྱ་ཁྱོན་མིན་འདུག" #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "No gradle project could be found. Specify --subdir?" msgstr "ཨེན་ཀྲོཌ་དང་ཡང་ན་ཀི་བི་ལས་འཆར་གང་ཡང་རྙེད་ས་མ་རེད། དམིགས་སྟོན་བྱེད་--subdir?" #: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "གནས་ཚུལ་རྙེད་མ་སོང་།." #: ../fdroidserver/checkupdates.py #, fuzzy msgid "No matching tags found" msgstr "གནས་ཚུལ་རྙེད་མ་སོང་།" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." msgstr "" #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "མཉེས་ཆས་འདི་རིན་མེད་མཉེན་ཆས་ཡིན་པ་དམིགས་སྟོན་བྱེད་དགོས་དོན་མེད་།" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" msgstr "མཉེན་ཆས་འདི་ཨེན་ཀྲོཌ་ཆེད་དུ་ཡིན་པ་དམིགས་སྟོན་བྱེད་དགོས་དོན་མེད།" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "གདམ་ཀ་མེད་པ་སྒྲིག།! ཁྱེད་རང་གི་config.yml འདིའི་ནང་ནས་མ་མཐའ་ཡིན་ཡང་གང་རུང་ཞིག་རྩོམ་སྒྲིག་བྱེད་:" #: ../fdroidserver/common.py msgid "No packages specified" msgstr "ཐུམ་སྒྲིལ་དམིགས་སྟོན་བྱེད་མེད།" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" msgstr "%s 1ཆེད་དུ་མིང་རྟགས་བཀོད་པའི་ APK མེད།" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" msgstr "མིང་རྟགས་མ་བཀོད་པའི་ཕྱོགས་དེབ་ཐོན་སྐྱེད། -བྱ་རྒྱུ་གང་ཡང་མེད།" #: ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" msgstr "{path}མིང་རྟགས་བཀོད་པའི་ཆོག་མཆན་ལག་ཁྱེར་འདིའི་ནང་རྙེད་མ་སོང་།" #: ../fdroidserver/common.py #, python-format msgid "No such package: %s" msgstr "ཐུམ་སྒྲིལ་དེ་འདྲ་མིན་འདུག: %s 1" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" msgstr "ཐོན་རིམ་ཨང་རྟགས་དེ་འདྲ་མིན་འདུག {versionCode} མཉེན་ཆས་ཆེད་དུ།{appid}" #: ../fdroidserver/checkupdates.py #, fuzzy msgid "No tags found" msgstr "ཟུར་སྣོན་ཡོ་བྱད་རྙེད་མ་སོང་།" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" msgstr "མིང་རྟགས་མ་བཀོད་པའི་ཕྱོགས་དེབ་མིན་འདུག-བྱ་རྒྱུ་གང་ཡང་མེད།" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" #: ../fdroidserver/signindex.py msgid "Nothing to do" msgstr "བྱ་རྒྱུ་གང་ཡང་མེད་།" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." msgstr "{appid} ཆེད་དུ་བྱ་རྒྱུ་གང་ཡང་མེད་།." #: ../fdroidserver/init.py msgid "Now set these in config.yml:" msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" msgstr "OBB ཡིག་ཆ་ལ་ཐོན་རིམ་ཨང་རྟགས་གསར་པ་ཡོད་རེད་། ({integer}) APK གཞན།:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" msgstr "OBB ཡིག་ཆའི་མིང་ངེས་པར་དུ་\"གཙོ་བོ་\" ཡང་ན \"ལྷན་པ་.\"མཉམ་དུ་འགོ་བཙུགས:" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" msgstr "OBB's ཐུམ་སྒྲིལ་མིང་འདིས་APK རྒྱབ་སྐྱོར་ཡོད་པ་དང་མཐུན་གྱི་མིན་འདུག:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "PNG དང་ JPEG ཁོ་ན་བརྐོས་རིས་རྒྱབ་སྐྱོར་རྙེད་སོང་། :{path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "མཉེས་ཆས་གསོག་ཉར་ཁང་དང་མི་འདྲ་པ་ཡོད་པ་ཁོ་ནར་པར་ཤུས་བྱེད།" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "མཉེན་ཆས་ཁོ་ནར་རང་འགུལ་གསར་བསྒྱུར་བྱེད།" #: ../fdroidserver/lint.py #, fuzzy msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Flattr ཞལ་འདེབས་ཐབས་ལམ་འདི་བཞིན་FlattrID flag ལ་ཐོབ་ཀྱི་ཡོད་།" #: /usr/lib/python3.11/optparse.py msgid "Options" msgstr "གདམ་ཀ།" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." msgstr "" #: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py #: ../fdroidserver/publish.py ../fdroidserver/signindex.py #: ../fdroidserver/update.py msgid "Outputting JSON" msgstr "" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "ལས་འཆར་འདིའི་ཁྱོན་ཡོངས་ཀྱི་ཆོག་མཆན་ལག་ཁྱེར།." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" msgstr "'{path}'འདིའི་ནང་དབྱེ་མཚམས་མངོན་གྱི་འདུག" #: ../fdroidserver/common.py msgid "Password required with username" msgstr "སྤྱོད་མིང་དང་མཉམ་དུ་གསང་ཨང་དགོས།" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "གལ་སྲིད་ཆོག་མཆན་ཨ་མའི་ནང་ལ་མེད་ན། ལམ་གྱི་གཙོ་བོ་འདི་ཨེན་ཀྲོཌ་ལས་འཆར་གྱི་ཕྱོགས་དེབ་ཡན་ལག་སྟོན་ཡོད།." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" msgstr "ཨེན་ཀྲོཌ་SDK ཀྱི་ལམ། (སྐབས་རེ་ཨེན་ཀྲོཌ_ཁྱིམ་དུ་སྒྲིག་ཡོད།)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" msgstr "གིཊ་རེ་པོའི་ཆེད་དུ་བདེ་སྤྱོད་བྱས་པའི་ཐོ་གཞུང་གི་ལམ།" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" msgstr "རེ་པོ་མིང་རྟགས་བཀོད་པའི་ལྡེ་མིག་ཆེད་དུ་སྟོན་པའི་ལྡེ་མིག་གསོག་ཉར་ཁང་གི་ལམ།" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "ས་ཚིགས་ཀྱི་གསང་ཁྱབ་ངོ་བཤུས་དང་/སྦྱར་བ་སྟབས་བདེ་ཡོང་བའི་ཆེད་དུ་འདྲ་བཤུས་" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" msgstr "'{path}'ལ་xml མཉམ་དུ་སྐྱོན་འདུག" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" msgstr "རང་འགུལ་གྱི་གསར་བསྒྱུར་རྣམས་བྱེད།" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" msgstr "ལས་ཀ་བྱེད་བཞིན་པ་{apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" msgstr "ལས་ཀ་བྱེད་བཞིན་པ།{appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" msgstr "མིས་ཀློག་ཐུབ་པའི་XML/JSON ཕྱོགས་སྟོན་གྱི་ཡིག་ཆ་བཟོས།" #: ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "URL ལས་འཆར་ནང་འདྲེན།." #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" msgstr "ཡི་གེའི་བར་རྟགས་རིགས་ངེས་པར་མེད་པ་དགོས་།" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" msgstr "ཐོ་གཞུད་འདི་གིཊ་ཐག་རིང་གི་མཛོད་ཁང་ནང་འབུད་རྒྱག་གཏོང་།" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing binary transparency log to {url}" msgstr "{url}ཆེད་དུ་ཨང་གྲངས་ཀྱི་ཐོ་གཞུང་གསར་བསྒྱུར།" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" msgstr "{url}ཕྱོགས་ལ་འབུད་རྒྱབ་རྒྱོབ།" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" msgstr "མཛོད་ཁང་གསར་པ་ཞིག་མྱུར་དུ་འགོ་བཙུགས།" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" msgstr "ཡིག་ཚགས་ཀྱི་རྒྱབ་ལྗོངས་ལོ་རྒྱུས་ཀློག་ནས་ཕྱིར་ཐོན།" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" msgstr "ཀློག་བཞིན་པ་། '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" msgstr "ཐུམ་སྒྲིལ་གྱི་མིང་ཀློག་བཞིནཔ།/ཐོན་རིམ་ཨང་རྟགས་/ཐོན་རིམ་གྱི་མིང་བདེ་སྤྱོད་མེད། APK ཁུངས་ལྡན་མིན།: '{apkfilename}'" #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" msgstr "ཐུམ་སྒྲིལ་གྱི་མིང་ཀློག་བཞིནཔ།/ཐོན་རིམ་ཨང་རྟགས་/ཐོན་རིམ་གྱི་མིང་བདེ་སྤྱོད་མེད། APK ཁུངས་ལྡན་མིན།: '{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" msgstr "སྦས་ཁུང་ནས་ {apkfilename}ཀློག་བཞིན་པ།" #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "དམིགས་སྟོན་བྱས་པའི་ཡིག་ཆ་རྣམས་མེད་པ་བཟོ་བཞིན་པ།" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" msgstr "" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "package.name_123.apk དང་མི་འདྲ་བའི་APK ཡིག་ཆ་དེ་ཚོར་མིང་སྐྱར་ཏུ་བཏགས།" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" msgstr "" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." msgstr "ཡོད་བཞིན་པའི་ཞབས་ཞུ་འཕྲུལ་ཆས་འདི་ལ་སྐྱོན་མེད་པ་ཡིན་རུང་། ཐོན་སྐྱེད་ཞབས་ཞུ་འཕྲུལ་ཆས་གསར་པ་ཞིག་སྐྱར་སྒྲིག་དང་བཟོས།." #: ../fdroidserver/nightly.py #, fuzzy, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" msgstr "{apkfilename} མཆོང་རྒྱབ་མཉམ་དུ་ཁུངས་ལྡན་མིན་པའི་མིང་རྟགས།" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" msgstr "པར་གྱི་རྒྱུ་ཆེ་ཆུང་ཚད་ལས་བརྒལ་ན་ཚད་གཞི་ཡང་སྐྱར་འགྱུར་བ་བཏང་ནས་ཕྱིར་ཐོན།" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" msgstr "ཡིག་ཚགས་ལ་ཉེན་བརྡ་དང་སྐྱོན་ཅན་རྣམས་དམ་བསྒྲགས་བྱེད།" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "ཡིག་ཚགས་ཀྱི་རྒྱབ་ལྗོངས་ལོ་རྒྱུས་ཚང་མ་སྐྱར་ཟིན།" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" msgstr "སྐྱར་བྲིས། '{appid}'" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" msgstr "" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "བཀོད་སྒྲིག་འདི་ག་རང་ལ་སྐྱར་བྲིས་བྱེད།" #: ../fdroidserver/deploy.py msgid "Running first pass with MD5 checking disabled" msgstr "MD5 ཚོད་ལྟ་བེད་སྤྱོད་མེད་པ་དང་མཉམ་དུ་ཐེངས་དང་པོ་འཁོར་སྐྱོད་བྱེད་བཞིན་པ།" #: ../fdroidserver/mirror.py #, fuzzy, python-brace-format msgid "Running wget in {path}" msgstr "སྐྱར་བྲིས་ཡོད་།{path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" msgstr "" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" msgstr "ཐུམ་སྒྲིལ་བྱས་པའི་འབྱུང་ཁུངས་ཨང་རྟགས་འཚག་རྒྱབ" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {apk}" msgstr "" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" msgstr "" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" msgstr "" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "འཚག་རྒྱབ་ལ་སྐྱོན་རྙེད་པ།" #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" msgstr "" #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" msgstr "" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" msgstr "" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" msgstr "མཚན་མོའི་རེ་པོ་བཟོ་སྐྲུན་ཆེད་དུ་སྒྲིག་བཀོད་བྱས་པའི་མཉེན་ཆས་བཟོ་སྐྲུན།" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " msgstr "" #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" msgstr "" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "མིང་རྟགས་བཀོད་ནས་ཐུམ་སྒྲིལ་རྣམས་རེ་པོ་ནང་བཞག" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" msgstr "གསར་བསྒྱུར་བེད་སྤྱོད་བྱས་ཏེ་བཟོས་པའི་མིང་རྟགས་བརྡ་སྟོན། --མིང་རྟགས་མེད།" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" msgstr "འབྱུང་ཁུངས་ཨ་རྟགས་དང་དཀའ་ངལ་གཞན་རྣམས་འཚག་རྒྱབ་མ་དགོས་པར་མཆོང་།" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "'{apkfilename}'མཆོང་ནས་ཁུངས་ལྡན་མ་ཡིན་པའི་མིང་རྟགས་དང་མཉམ་དུ།!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" msgstr "{appid}གྱི་ཆེད་དུ་མཆོང་བའི་མི་རབས་ཀྱི་ཕྱོགས་སྟོན།" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" msgstr "{apkfilename} མཆོང་རྒྱབ་མཉམ་དུ་ཁུངས་ལྡན་མིན་པའི་མིང་རྟགས།!" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" msgstr "མཆོང་བཞིན་པ་ {appid}: བེད་མེད།" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" msgstr "བསྟི་གནས་ཀྱི་ཡིག་ཁུག་གཅིག་ཁ་ཕྱེས་ནས་རེ་པོ་འདི་ལ་མཉམ་བསྲེས།" #: ../fdroidserver/deploy.py msgid "Specify an identity file to provide to SSH for rsyncing" msgstr "rsync གྱི་ཆེད་དུ་SSH འདི་ངོ་ཐག་ཆོད་པའི་ཡིག་ཆ་ཞིག་དམིགས་སུ་བཀར་ནས་སྟེར།" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." msgstr "" #: ../fdroidserver/common.py msgid "Spew out even more information than normal" msgstr "ནམ་རྒྱུན་ལས་ཀྱང་མང་བའི་གནས་ཚུལ་ཕྱིར་སྟོན།" #: ../fdroidserver/nightly.py #, fuzzy, python-brace-format msgid "Stripping mystery signature from {apkfilename}" msgstr "{apkfilename}ཡིག་ཆ་སྦས་ཁུང་རྙིང་པ་ལ་ཡ་ལན་མ་བྱས་" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" msgstr "སྙིང་བསྔུས་ '%s 1' ནི་མཉེན་ཆས་ཀྱི་མིང་ཞིག་རེད་།" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" msgstr "སྙིང་བསྔུས་ཀྱི་རིང་ཐུང་། {length} charཚད་{limit} ལས་བརྒལ་འདུག" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" msgstr "" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" msgstr "" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "ཚོད་ལྟའི་ཚུལ་-གལ་སྲིད་ཡིག་ཚགས་འདི་སྔོན་ཚོད་ནས་ཡོད་ནའང་། ཡིག་ཚགས་འདི་སྐབས་ཕྲལ་གྱི་ཕྱོགས་དེབ་ཁོ་ནའི་ནང་ལ་བླུགས་པ་དང་རྟག་ཏུ་ཐོན་སྐྱེད་བཟོས།." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" msgstr "OBB ཐོན་རིམ་ཨང་རྟགས་འདི་ངེས་པར་དུ་ \"{name}\"གྱི་རྗེས་སུ་་བྱུང་བ་རེད་།:" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" msgstr "གཞི་རྩའི་URL དེ་རེ་པོ་ཡི་ཐོ་གཞུང་བཀོད་པའི་ཆེད་དུ་(སོར་བཞག: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" msgstr "" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" msgstr "(path or glob)རེ་པོ་ནང་ཚུད་པའི་ཡིག་ཆ།" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." msgstr "མཛོད་ཁང་གི་མཛུབ་མཐིལ་དང་མཐུན་གྱི་མིན་འདུག." #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" msgstr "dir གྱི་རྩ་བ་ for local_copy_dir \"{path}\" མིན་འདུག!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" msgstr "ལྡེ་མིག་གཞན་ལ་སྐྱོན་ཆ་འདུག། -པར་སྐྲུན་བཀག" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." msgstr "" #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" #: ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "རེ་པོ་འདི་ལ་སྔོན་ཚོད་ནས་ས་གནས་ཀྱི་རྒྱབ་ལྗོངས་ཡིག་ཆ་འདུག: %s 1" #: ../fdroidserver/init.py #, python-format msgid "" "To complete the setup, add your APKs to \"%s\"\n" "then run \"fdroid update -c; fdroid update\". You might also want to edit\n" "\"config.yml\" to set the URL, repo name, and more. You should also set up\n" "a signing key (a temporary one might have been automatically generated).\n" "\n" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "awsbucket, awssecretkey དང་། awsaccesskeyid བེད་སྤྱོད་བྱེད་པའི་ཆེད་དུ་ config.yml ནང་དུ་ངེས་པར་དུ་སྒྲིག་དགོས།!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" msgstr "URL ཐུང་དུ་གཏོང་མཁན་ངེས་པར་དུ་བེད་སྤྱོད་བྱེད།" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" msgstr "URL {url} ནང་འགྲེལ་བཤད་རྒྱབ་པ་: {error}" #: ../fdroidserver/lint.py #, fuzzy msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" msgstr "ཁུངས་ལྡན་མིན་པའི་ཆོག་མཆན་ལག་ཁྱེར་སྦྱར་ \"%s 1\"! https://spdx.org/license-list ཁོ་ན་ནས་ཡིན་པ་སྦྱར་ཏེ་བེད་སྤྱོད་བྱེད་།" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" msgstr "" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "ཆ་རྒྱུས་མེད་པའི་དམིགས་བསལ་ཞིག་རྙེད་སོང་།!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" msgstr "ངོས་འཛིན་མི་ཐུབ་པའི་ཡིག་ཆ། '{filename}' བཟོ་སྐྲུན་གྱི་ནང་། '{versionName}'" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" msgstr "ངོས་འཛིན་མ་བྱས་པའི་རྒྱབ་ལྗོངས་ཡིག་ཆའི་སྒྲིག་བཀོད།:%s 1" #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" msgstr "ངོས་འཛིན་མི་ཐུབ་པའི་རྒྱབ་ལྗོངས་ཡིག་ཆའི་སྒྲིག་བཀོད། : {path}" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " msgstr "aapt གྱི་ངོས་འཛིན་མ་ཐུབ་པའི་ཐོན་རིམ། དཀའ་ངལ་ཕྲད་སྲིད་པ།: " #: ../fdroidserver/lint.py msgid "Unnecessary leading space" msgstr "དགོས་མེད་ཀྱི་སྣེ་ཁྲིད་བར་མཚམས།" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" msgstr "དགོས་མེད་ཀྱི་རྫེས་ཤུལ་བར་མཚམས།" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" msgstr "རྒྱབ་སྐྱོར་མེད་པའི་བརྐོས་རིས་ཡིག་ཆ་རྙེད་སོང་།: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" msgstr "བེད་སྤྱོད་མེད་པའི་ extlib at %s 1" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" msgstr "%s 1 དེ་ལ་བེད་སྤྱོད་མེད་པའི་ཡིག་ཆ།" #: ../fdroidserver/scanner.py #, fuzzy, python-format msgid "Unused scandelete path: %s" msgstr "%s 1 དེ་ལ་བེད་སྤྱོད་མེད་པའི་ཡིག་ཆ།" #: ../fdroidserver/scanner.py #, fuzzy, python-format msgid "Unused scanignore path: %s" msgstr "%s 1 དེ་ལ་བེད་སྤྱོད་མེད་པའི་ཡིག་ཆ།" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" msgstr "" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "ཐུམ་སྒྲིལ་གསར་པའི་ཆེད་དུ་རེ་པོ་གནས་ཚུལ་གསར་བསྒྱུར་བྱེད།" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" msgstr "URLཆེད་དུ་ཨང་གྲངས་ཀྱི་ཐོ་གཞུང་གསར་བསྒྱུར།" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py #, fuzzy msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "མཉེན་ཆས་ཁ་བྱང་ནང་ལ་གསར་བསྒྱུར་འཚོལ་བའི་མིང་སྒྲིག་ཚར་འདུག -འདི་སུབས་ཆོག་གི་རེད།" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" msgstr "" #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format msgid "Uploading {apkfilename} to virustotal" msgstr "སྦས་ཁུང་ནས་ {apkfilename}ཀློག་བཞིན་པ།" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "Usage" msgstr "བེད་སྤྱོད།" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "Usage: %s\n" msgstr "བེད་སྤྱོད།:%s 1\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "བེད་སྤྱོད།/HEAD གྱི་ཚབ་ཏུ།/ སོར་བཞག་ཡན་ལག་ནང་དུ་ཡོད་པའི་དོན་ཚན་ཨ་མ།" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "`fdroid update -c`བེད་སྤྱོད་བྱས་ནས་འདི་བཟོས།." #: ../fdroidserver/build.py msgid "Use build server" msgstr "ཐོན་སྐྱེད་ཞབས་ཞུ་འཕྲུལ་ཆས་བེད་སྤྱོད་བྱེད།" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" msgstr "APK རང་གི་ཚེས་གྲངས་དེ་བེད་སྤྱོད་བྱས་པ་ལས་ཁ་སྣོན་བྱས་པའི་ APKs གསར་པའི་དུས་ཚོས་བེད་སྤྱོད་མ་བྱེད།" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." msgstr "" #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" #: ../fdroidserver/common.py msgid "Using APK Signature v3" msgstr "" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Using androguard from \"{path}\"" msgstr "སྐྱར་བྲིས་ཡོད་།{path}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" msgstr "" #: ../fdroidserver/init.py #, fuzzy, python-brace-format msgid "Using existing keystore \"{path}\"" msgstr "སྐྱར་བྲིས་ཡོད་།{path}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" msgstr "s3cmd བེད་སྤྱོད་བྱས་ནས་: {url}1དང་མཉམ་དུ་sync" #: ../fdroidserver/__main__.py msgid "Valid commands are:" msgstr "ཁུངས་ལྡན་གྱི་བཀའ་ཁྱབ་ནི།:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." msgstr "" #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" msgstr "ཕབ་ལེན་བྱས་པའི་ཐུམ་སྒྲིལ་གྱི་སྤུས་ཚད་ར་སྤྲོད།" #: ../fdroidserver/index.py msgid "Verifying index signature:" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "ཡིག་ཚགས་ཀྱི་རྒྱབ་ལྗོངས་ལོ་རྒྱུས་སྐྱོན་སྲིད་པ་རྣམས་པ་ཉེན་བརྡ་གཏོང་།" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "བརྡ་སྟོན་པའི་མིང་རྟགས་དེ་སྒྲིག་བཀོད་བྱས་ཚར་ན། གནས་སྐབས་མིང་རྟགས་མ་བཀོད་པའི་བརྡ་སྟོན་རྣམས་བཟོས།" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'ཁྱད་པར་ཅན་གྱི་མིང་' ལྡེ་མིག་བཟོས་པའི་སྐབས་ལ་བེད་སྤྱོད་བྱེད།" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" msgstr "ཁྱེད་རང་གིས་ཨེན་ཀྲོཌ་མདུན་ངོས་བེད་སྤྱོད་བྱས་ནས་ཁྱེད་རང་གི་SDKའགྲོ་ལམ་སྒྲིག་བཀོད་བྱེད། དེ་ནི།:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" msgstr "{path}ལ་ངོས་འཛིན་ཡིག་ཆ་ཁ་སྣོན་བྱེད་བཞིན་པ།" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" msgstr "{name}ལ་ཁ་སྣོན་བྱེད།: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "གསལ་ཁ་མེད་པའི་གདམ་ཀ: %(option)s མཐུན་མི་སོང་།%(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "གསལ་ཁ་མེད་པའི་གདམ་ཀ:%s 1 (%s 2?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py #, fuzzy msgid "application ID of file to operate on" msgstr "མཉེས་ཆས་ཁ་བྱང་རྒྱུད་གསར་བསྒྱར་ཡོད་མིན་ལྟོས།" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py #, fuzzy msgid "application ID with optional versionCode in the form APPID[:VERCODE]" msgstr "མཉེན་ཆས་ཀྱི་ངོ་བོ་དང་མཉམ་དུ་གདམ་ཀ་ཅན་གྱི་ཐོན་རིམ་ཨང་རྟགས་APPID[:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "རྩོད་པ།\"-\" འགྲོ་ལུགས་འདི་དང་མཉམ་དུ། %r 1" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" msgstr "" #: ../fdroidserver/nightly.py #, fuzzy msgid "attempting bare SSH connection to test deploy key:" msgstr "ཕྱོགས་སྐྱོད་ལྡེ་མིག་ཚོད་ལྟ་ལ་bare ssh མཐུད་ཀ་་རྒྱབ་བཞིན་པ།:" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "ཁ་ཕྱེས་ཐུབ་མ་སོང་།'%(filename)s': %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" msgstr "" #: ../fdroidserver/build.py #, fuzzy, python-brace-format msgid "cannot find required srclibs: \"{path}\"" msgstr "{path}!གྱི་ཆེད་དུ་ཐུམ་སྒྲིལ་གྱི་མིང་རྙེད་མ་སོང་།" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "subparser རྩོད་པ་དུ་མ་ཡོད་ཐབས་མེད།" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "བྱ་བ་ཟླ་སྒྲིལ་བཏང་ཐུབ་མ་སོང་། - སྡེ་ཚན་གཉིས་ཀྱི་མིང་ལ་%r 1" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" msgstr "པར་སྐྲུན་གསར་བསྒྱུར་བྱེད་མི་ཐུབ། ཁྱེད་ཀྱིས་ཕྱོགས་སྐྱོད་ལྡེ་མིག་སྒྲིག་བཀོད་བྱེད་ཡོད་དམ།?" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" msgstr "འདྲ་བཟོས་{url}" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" msgstr "མགོ་རྙོག" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "ཚིག་སྒྲུབ་ཀྱི་གདམ་ཀའི་རྙོག་ཕྲ།: %s 1" #: /usr/lib/python3.11/argparse.py #, fuzzy, python-format msgid "conflicting subparser alias: %s" msgstr "ཚིག་སྒྲུབ་ཀྱི་གདམ་ཀའི་རྙོག་ཕྲ།: %s 1" #: /usr/lib/python3.11/argparse.py #, fuzzy, python-format msgid "conflicting subparser: %s" msgstr "ཚིག་སྒྲུབ་ཀྱི་གདམ་ཀའི་རྙོག་ཕྲ།: %s 1" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" msgstr "" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" msgstr "སུབ་བཞིན་པ།:རེ་པོ་/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest= ནི་གདམ་ཀ་འདི་འདྲ་ལ་%r 1དགོས་པ་ཡོད།" #: ../fdroidserver/scanner.py msgid "downloading '{}'" msgstr "" #: ../fdroidserver/scanner.py #, fuzzy msgid "downloading scanner signatures from '{}' failed" msgstr "{apkfilename}ཡིག་ཆ་སྦས་ཁུང་རྙིང་པ་ལ་ཡ་ལན་མ་བྱས་" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "ཚོད་དཔག་བྱེད་པའི་%s 1 རྩོད་པ་" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "མ་མཐའ་ཡིན་ནའང་རེ་བ་བྱེད་པའི་རྩོད་པ།" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "རེ་བ་བྱས་པའི་རྩོད་པ་ཆེ་ཤེོས་གཅིག" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "རེ་བ་བྱས་པའི་རྩོད་པ་གཅིག" #: ../fdroidserver/__main__.py #, fuzzy msgid "fdroid [] [-h|--help|--version|]" msgstr "བེད་སྤྱོད་: ཨེཕ་རོཌ་ [-h|-རོགས་པ་|--ཐོན་རིམ་] []" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" msgstr "" #: /usr/lib/python3.11/optparse.py msgid "floating-point" msgstr "གཡེང་ཚེག" #: ../fdroidserver/metadata.py #, fuzzy msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "སྐྱོན་ཤོར་བ་ལ་ཉེན་བརྡ་ངེས་པར་དུ་གཏོང་དགོས་པ་དང་། ཡང་ན་ཡ་མ་བྱེད།." #: ../fdroidserver/common.py #, fuzzy msgid "git svn clone failed" msgstr "གིཊ་གཙང་བཟོ་ཐུབ་མ་སོང་།" #: ../fdroidserver/scanner.py msgid "gzip file archive" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "དངོས་སུ་རྩོད་པ་པ་ལ་ཡ་ལན་མེད། %r 1" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 ངེས་པར་དུ་མིང་རྟགས་དགོས། བེད་སྤྱོད་`fdroid signindex`འདི་བཟོས་པ་རེད།!" #: ../fdroidserver/index.py #, fuzzy msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 ངེས་པར་དུ་མིང་རྟགས་དགོས། བེད་སྤྱོད་`fdroid signindex`འདི་བཟོས་པ་རེད།!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" msgstr "གོང་བུ།" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "ཁུངས་ལྡན་མིན་པ་ %(type)s value: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "ཁུངས་ལྡན་མིན་པའི་གདམ་ཀ: %(value)r (དེ་ནས་གདམ་ཀ་%(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "ཁུངས་ལྡན་མིན་པའི་རྙོག་ཕྲ།_resolution value: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "ཁུངས་ལྡན་མིན་པའི་ཚིག་སྒྲུབ་གདམ་ཀ། %(option)r: ཁྱད་ཆོས་དང་མཉམ་དུ་འགོ་བཙུགས། %(prefix_chars)r" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "local_copy_dir \"fdroid\"གིས་མཇུག་སྐྱོང་མིན་འདུག་ : \"{path}1\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" msgstr "local_copy_dir ནི་ངེས་པར་དུ་མཐའ་མའི་འགྲོ་ལམ་དེ་ཆགས་ཡོད།!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" msgstr "local_copy_dir ངེས་པར་ཕྱོགས་དེབ་ཡིན་དགོས། ཡིག་ཆ་མ་རེད།!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" msgstr "མེ་ལོང་། '%s 1' 'fdroid'དང་མཉམ་དུ་མཇུག་སྐྱོང་མི་ཐུབ།!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "ནང་ཕན་ཚུན་རྩོད་པ་དེ་གདམ་ཀ་ཅན་ངེས་པར་དུ་བཞག་དགོས་།" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" msgstr "" #: ../fdroidserver/mirror.py #, fuzzy, python-brace-format msgid "no \"icon\" in {appid}" msgstr "ལས་ཀ་བྱེད་བཞིན་པ།{appid}" #: ../fdroidserver/signatures.py msgid "no APK supplied" msgstr "APK མཁོ་སྤྲོད་མིན་འདུག" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" msgstr "གདམ་ཀ་དེ་འདྲ་མིན་འདུག: %s" #: ../fdroidserver/__main__.py msgid "no version info found!" msgstr "ཆ་རྒྱུས་མེད་པའི་དམིགས་བསལ་ཞིག་རྙེད་སོང་།!" #: ../fdroidserver/checkupdates.py #, fuzzy msgid "no version information found" msgstr "ཆ་རྒྱུས་མེད་པའི་དམིགས་བསལ་ཞིག་རྙེད་སོང་།" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "རྩོད་པ་དང་མཉམ་དུ་ཆོག་མཆན་མེད། %s 1" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "རྩོད་པ་གཅིག་དགོས་ཀྱི་ཡོད། %s 1" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" msgstr "ཚིག་སྒྲུབ་དང་ཐོ་གཞུང་། ཡིག་ཚགས་ཁོ་ན་ངོས་ལེན་བྱེད།" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "གདམ་ཀ %s 1: གལ་ཏེ་ཁྱེད་ཀྱིས་མིང་རྟགས་བཀོད་པའི་མཉེན་ཆས་རིགས་ཚང་མ་ངེས་པར་དུ་སྒྲིག་བཅུག་བྱེད་འདོད་ཡོད་། བེད་སྤྱོད་ --ཚང་མ།" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "གདམ་ཀ %s 1: ཁུངས་ལྡན་མིན་པ་ %s 2 རིན་ཐང་།: %r 3" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "གདམ་ཀ %s 1: ཁུངས་ལྡན་མིན་པའི་གདམ་ཀ: %r 2 (choose from %s 3)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" msgstr "གདམ་ཀ། '%s 1'ངོས་འཛིན་ཐུབ་མ་སོང་།" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" msgstr "གདམ་ཀ། -%s 1 རྩོད་དགོས།" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "གདམ་ཀ། --%s 1གང་བྱས་ཀྱང་རྩོད་པ་མེད།" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "གདམ་ཀ་--%s ཐུན་མོང་མ་ཡིན་པའི་སྔོན་འཇུག་མ་རེད།" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" msgstr "གདམ་ཀ།--%s 1 ངོས་འཛིན་ཐུབ་མ་སོང་།" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s requires argument" msgstr "གདམ་ཀ། --%s རྩོད་དགོས།" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "གདམ་ཀ་ཅན་གྱི་རྩོད་པ།" #: /usr/lib/python3.11/argparse.py #, fuzzy msgid "options" msgstr "གདམ་ཀ།" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" msgstr "སྐྱར་བྲིས་ཡོད་།{path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "གནས་སྟངས་ལ་གཞིགས་པའི་རྩོད་པ།" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" msgstr "" #: ../fdroidserver/build.py msgid "reference binary missing signature" msgstr "" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" msgstr "བདེ་ཆགས་མེད་པའི་HTTPMམཐུད་ཀ་རྒྱུད་དེ་ཕབ་བཤུས་ངོས་ལེན་མེད། (HTTPS བེད་སྤྱོད་དང་ཡང་ན་དམིགས་སྟོན་། --no-https-check){apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." msgstr "" #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" msgstr "" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sync ཕྱོགས་སྟོན།{path}1 དེ་ནས {url} དང་སུབས།" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" msgstr "ལས་རིམ་རྣམ་གཞག་གི་ཐོན་རིམ་ཨང་གྲངས་སྟོན་ནས་ཕྱིར་ཐོན་བྱེད།" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" msgstr "རོགས་པ་བྱེད་པའི་འཕྲིན་ཐུང་སྟོན་ནས་ཕྱིར་ཐོན།" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." msgstr "APK མིང་རྟགས་, ཡིག་ཆའི་འགྲོ་ལམ་མམ་ཡང་ན། HTTPS URL." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" msgstr "" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" msgstr "tarballའབྱུང་ཁུངས་མཆོང་རྒྱག་རྒྱབ་བཞིན་པ།:{path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" msgstr "" #: ../fdroidserver/scanner.py msgid "static library" msgstr "" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "གཤམ་གྱི་རྩོད་པ་དེ་དག་དགོས།:%s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "རེ་བ་མེད་པའི་གདམ་ཀ་ཅན་གྱི་ཚིག་སྒྲུབ།:%s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "ངོས་འཛིན་མི་ཐུབ་པའི་ parser %(parser_name)r (གདམ་ཀ།: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "ངོས་འཛིན་མི་ཐུབ་པའི་རྩོད་པ།: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "'{config_file}' སྒང་གི་བདེ་ཆགས་མེད་པའི་ཆོག་མཆན་ (ངེས་པར་དུ། 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "བེད་སྤྱོད།: " #: ../fdroidserver/deploy.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" msgstr "Apache libcloud བེད་སྤྱོད་བྱས་པའི་ཐོག་ {url}1དང་མཉམ་དུ་ཟླ་སྒྲིལ་གཏོང་།" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" msgstr[0] "{0} མཉེས་ཆས་, {1} key aliases" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) ལ་རྒྱབ་ལྗོངས་ཡིག་ཆ་མིན་འདུག!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} ལ་མིང་ཡོད་མ་རེད། !དེའི་ཚབ་ལ་ཐུམ་སྒྲིལ་མིང་བེད་སྤྱོད་བྱེད།." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" msgstr "" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" msgstr "" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" msgstr "{appid}1: ངོས་འཛིན་མི་ཐུབ་པའི་ extlib {path}2 བཟོ་སྐྲུན་ནང་ལ '{versionName}3'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be list or string, found: {value}" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" msgstr "" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" msgstr "{path} ལ་ཆེ་ཆུང་མེད།!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" msgstr "" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{path}: {error}" msgstr "ཀློག་མི་ཐུབ།{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" msgstr[0] "{} བཟོ་སྐྲུན་བྱེད་མི་ཐུབ།" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} བཟོ་སྐྲུན་ལེགས་སྒྲུབ།" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/locale/cs/0000755000175000017500000000000014620351546014654 5ustar00hanshans././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.888382 fdroidserver-2.3a1/locale/cs/LC_MESSAGES/0000755000175000017500000000000014620351546016441 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/locale/cs/LC_MESSAGES/fdroidserver.po0000644000175000017500000027155114620351225021504 0ustar00hanshans# SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # mondstern , 2021. # Petr Novák , 2021. # Fjuro , 2022. # Filip Klopec , 2022. # Fjuro , 2022, 2023. # Daniel Hejduk , 2023. # Fjuro , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2024-04-23 10:07+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" "X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" "\n" "Veřejný klíč SSH, který se použijte jako klíč pro nasazení:" #: ../fdroidserver/nightly.py #, python-brace-format msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" "\n" "{path} zakódováno pro tajnou proměnnou DEBUG_KEYSTORE:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" nemá žádný odpovídající soubor metadat!" #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" msgstr "\"local_copy_dir\" {path} neexistuje!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "aplikace \"{apkfilename}\" je již nainstalována na {dev}." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" msgstr "\"{path}\" obsahuje zastaralý název {name} ({version})" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" msgstr "\"{path}\" obsahuje nedávné {name} ({version})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" msgstr "\"{path}\" existuje, ale s3cmd není nainstalován!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" msgstr "\"{path}\" není podporovaný formát souboru (použijte: metadata/*.yml)" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "\"{path}\" je podepsáno klíčem, který není povolen:" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" není platná adresa URL!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" msgstr[0] "možnost %(option)s vyžaduje %(number)d argument" msgstr[1] "možnost %(option)s vyžaduje %(number)d argumenty" msgstr[2] "možnost %(option)s vyžaduje %(number)d argumentů" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: chyba: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" msgstr "nalezeno %d problémů" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "%prog [options]" msgstr "%prog [možnosti]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" msgstr "%r není možné volat" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" msgstr "%s nevytvořil dict!" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" msgstr "%s má špatný kód SHA-256: %s" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" msgstr "%s není akceptované pole sestavení" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" msgstr "možnost %s nepřebírá hodnotu" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' nebyl nalezen v souboru config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' je NONE a 'smartcardoptions' je prázdný!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "'keystore' nebyl nalezen v souboru config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' nebyl nalezen v souboru config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' nebyl nalezen v config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'povinné' je Neplatný argument pro pozicials" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" msgstr "'sdk_path' není nastaven v souboru config.yml!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' je příliš starý, fdroid vyžaduje build-tools-{version} nebo novější!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" msgstr "'{field}' bude v náhodném pořadí! Pokud je pořadí důležité, použijte závorky () nebo []!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" msgstr "'{path}' nepodařilo se provést!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' má neplatný formát, měl by to být slovník!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' není platný {field} v {appid}. Vzor regulárního výrazu: {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' není platný {field}, měl by to být {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" msgstr "...kontrola selhala pro {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() není definováno" #: ../fdroidserver/lint.py msgid "/issues is missing" msgstr "/issues chybí" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" msgstr "Jako argument je vyžadována adresa URL!" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Přidejte podpisy PGP pomocí GnuPG pro balíčky v repo" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" msgstr "Přidejte podpisový klíč repo k nepodepsanému repo" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" msgstr "Přidání souborů metadat kostry pro soubory APK, které chybí" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" msgstr "Přidání nového repozitáře pouze pro {name}" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" msgstr "Alias podepisovacího klíče repozitáře v keystore" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" msgstr "Chybí AllowedAPKSigningKeys, ale byl dodán referenční binární soubor" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Umožňuje zadat jinou revizi (nebo větev gitu) pro počáteční import" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" msgstr "Také zrcadlit celou sekci archivu" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" msgstr "Také varovat před problémy s formátování, jako rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" msgstr "Knihovna AAR pro Android" #: ../fdroidserver/scanner.py msgid "Android APK file" msgstr "Soubor APK pro Android" #: ../fdroidserver/scanner.py msgid "Android DEX code" msgstr "Kód Android DEX" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" msgstr "Android SDK nebylo nalezeno v {path}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" msgstr "Android SDK s cestou '{path}' neexistuje!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" msgstr "Cesta Android SDK '{path}' není adresář!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" msgstr "Nástroj Android SDK {cmd} nenalezen!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "Aplikace má binární soubory, ale nemá odpovídající AllowedAPKSigningKeys pro připnutí certifikátu." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Aplikace má NoSourceSince nebo ArchivePolicy \"0 versions\", ale AutoUpdateMode nebo UpdateCheckMode nejsou None" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" msgstr "Aplikace je v repozitáři '{repo}' ale má odkaz na {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "Verze aplikace má binární soubor, ale nemá odpovídající AllowedAPKSigningKeys pro připnutí certifikátu." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Přidání .git není nutné" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" msgstr "Archivování {apkfilename} s neplatným podpisem!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode s UpdateCheckMode: HTTP musí mít vzor." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" msgstr "Nesprávný typ záznamu \"{mirrortype}\" v konfiguraci zrcadel: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "Základní adresa URL pro zrcadlení, může obsahovat klíč pro podepisování indexu pomocí řetězce dotazu: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" msgstr "Větev '{branch}' použitá jako revize v sestavení '{versionName}'" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" msgstr "Větev '{branch}' použitá jako revize v srclib '{srclib}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" msgstr "Rozbitý symlink: {path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" msgstr "Sestavit balíček ze zdroje" #: ../fdroidserver/build.py msgid "Build all applications available" msgstr "Sestavit všechny dostupné aplikace" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" msgstr "Sestavení vygenerováno pomocí `fdroid import` - odeberte řádek se zakázáním po dokončení" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" msgstr "Git repozitář s metadaty sestavení má neodeslané změny!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" msgstr "Sestavit pouze nejnovější verzi každého balíčku" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" msgstr "Sestaven repozitář založený v „%s“ s touto konfigurací:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" msgstr "Nelze automaticky aktualizovat aplikaci bez CurrentVersionCode" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "Nelze sestavit kvůli {} chybě při skenování" msgstr[1] "Nelze sestavit kvůli {} chybám při skenování" msgstr[2] "Nelze sestavit kvůli {} chybám při skenování" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" msgstr "Nelze přepsat „{path}“" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "Kategorie „%s“ není platná" #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "Kategorie nejsou nastavené" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Zkontrolujte aktualizace aplikací" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Kontrola archivace u {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Čistá aktualizace - nepoužívat mezipaměti, znovu zpracovat všechny soubory APK" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Seznam kategorií oddělený čárkami." #: ../fdroidserver/__main__.py #, python-format msgid "Command '%s' not recognised.\n" msgstr "Příkaz '%s' nebyl rozpoznán.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" msgstr "Odeslat změny" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" msgstr "Konfliktní definice \"{field}\" mezi soubory .yml a lokalizovanými soubory:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Konfliktní argumenty: '--verbose' a '--quiet' nelze zadat současně." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" msgstr "Konfliktní konfigurační soubory! Používám {newfile}, ignoruji {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "Ve vašem systému se nepodařilo najít příkaz '{command}'" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Nepodařilo se najít kód poslední verze" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Nepodařilo se najít název poslední verze" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" msgstr "Nepodařilo se nalézt {path} k odstranění" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " msgstr "Nepodařilo se otevřít APK {path} pro analýzu: " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Nepodařilo se zpracovat velikost „{size}“, nesprávný typ „{type}“" #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Nedaří se nalézt ID aplikace" #: ../fdroidserver/checkupdates.py msgid "Couldn't find any version information" msgstr "Nepodařilo se najít žádné informace o verzi" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "Nedaří se nalézt identif. balíčku" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" msgstr "Zbaběle odmítám přepsat existující nastavení podpisového klíče!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" msgstr "Vytvořen nový kontejner „{name}“" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Vytváření „{path}“ pro konfiguraci s3cmd." #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Vytváření adresáře protokolů" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" msgstr "Vytváření nového bucketu S3: {url}" #: ../fdroidserver/publish.py msgid "Creating output directory" msgstr "Vytváření výstupního adresáře" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" msgstr "Vytváření podepsaného indexu s tímto klíčem (SHA256):" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" msgstr "Vytváření dočasné složky" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" msgstr "Vytváření nepodepsaného indexu v rámci přípravy na podpis" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" msgstr "CurrentVersionCode {cv} je menší než nejstarší položka sestavení {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" msgstr "DEBUG_KEYSTORE není nastaven nebo je hodnota neúplná" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" msgstr "Odstraňte soubory APK a/nebo OBB bez metadat z úložiště" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" msgstr "Mazání archivu, repozitář je příliš velký ({size} max {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" msgstr "Mazání historie git-mirroru, repozitář je příliš velký ({size} max {limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" msgstr "Mazání neznámého souboru: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" msgstr "Popis ‚%s‘ je pouze souhrn aplikace" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" msgstr "Popis má duplicitní řádek" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" msgstr "Popis má seznam (%s) ale není opatřen odrážkami (*) ani očíslován (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" msgstr "Popis délky {length} přesahuje limit {limit} znaků" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Nepřidávat ‚disable:‘ k vygenerovaným položkám sestavení" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" msgstr "Nevydávat nové soubory do repozitáře" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" msgstr "V URL neuvádějte „{path}“!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" msgstr "Nevyžadovat cestu Android SDK, prostě selhat" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" msgstr "Nemazat soukromé klíče vygenerované z keystore" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" msgstr "Nevytvářet zdrojový tarball, užitečné při testování sestavení" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" msgstr "Neobnovovat repozitář, užitečné při testování bez připojení k internetu" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" msgstr "Nepoužívat kontrolní součty rsync" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Stáhnout kompletní mirrory malých repozitářů" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" msgstr "Stahování %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Stahování repozitáře již jednou selhalo, nezkouším to znovu." #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" msgstr "Stahování {url} selhalo. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" msgstr "Duplicitní prohlášení Anti-Vlastností na adrese {path} bylo ignorováno!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" msgstr "Duplicitní záznam \"%s\" v konfiguraci zrcadel!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" msgstr "Duplicitní odkaz v '{field}': {url}" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "CHYBA: Podpříkaz „server“ byl odebrán, použijte „deploy“!" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" "CHYBA: tento příkaz by nikdy neměl být použit k zrcadlení f-droid.org!\n" "Celý mirror f-droid.org vyžaduje více než 200GB." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "CHYBA: nepodporovaný typ CI, opravy vítány!" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "CHYBA: nepodporovaný git host \"%s\", opravy vítány!" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." msgstr "Kódování je nastaveno na ‚{enc}‘ fdroid může mít problémy s kódováním. Pro dosažení nejlepších výsledků jej prosím nastavte na ‚UTF-8‘." #: ../fdroidserver/init.py #, python-format msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" "Zadejte cestu k Android SDK (%s) zde:\n" "> " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" msgstr "Proměnná prostředí {var} z {configname} není nastavena!" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Chyba při získávání adresy repozitáře" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" msgstr "Ukončit s nenulovým kódem při nalezení problémů" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Extrahovat metadata aplikace ze zdrojového repozitáře" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Extrahovat podpisy ze souborů APK" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" msgstr "Chyba při kopírování {path}: {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" msgstr "Chyba při načítání podpisů pro ‚{apkfilename}‘: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" msgstr "Chyba při čtení {path}: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" msgstr "Chyba při změně velikosti {path}: {error}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" msgstr "Nepodařilo se vytvořit bucket S3: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" msgstr "Nepodařilo se získat informace o APK, mazání {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" msgstr "Nepodařilo se získat informace o APK, přeskakování {path}" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" msgstr "Nepodařilo se získat otisk podpisového klíče APK" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" msgstr "Nepodařilo se nainstalovat ‚{apkfilename}‘ na {dev}: {error}" #: ../fdroidserver/common.py msgid "Failed to sign application" msgstr "Nepodařilo se podepsat aplikaci" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" msgstr "Načteno buildserverid z VM: {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" msgstr "Načteny podpisy pro ‚{apkfilename}‘ -> ‚{sigdir}‘" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" msgstr "Soubor zmizel při jeho zpracování: {path}" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py #: ../fdroidserver/update.py msgid "Finished" msgstr "Dokončeno" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" msgstr "Metody darování Flattr patří do pole „FlattrID:“" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Zakázané značky HTML" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." msgstr "Vynutí sestavení zakázaných aplikací a pokračuje bez ohledu na problémy se skenováním. Povoleno pouze v testovacím režimu." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" msgstr "Vynutit zastavení sestavování po uplynutí časového limitu {0} sekund!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." msgstr "Vynutit kontrolu zakázaných aplikací a sestavení." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" msgstr "Nalezena grafika „{path}“ bez metadat u aplikace „{name}“!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "Nalezeno špatné financování souboru „{path}“ pro „{name}“:" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" msgstr "V argumentech nalezena neplatná id aplikací" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "U některých aplikací nalezeny neplatné versionCodes" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" msgstr "V {path} nalezeno několik podpisových bloků JAR" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" msgstr "Nalezeno několik souborů metadat pro {appid}" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." msgstr "Nalezeno více podpisových certifikátů pro repozitář." #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." msgstr "Pro repozitář nenalezen žádný podpisový certifikát." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" msgstr "Nalezen ne-soubor v %s" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" msgstr "Nalezen {apkfilename} na {url}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} problems in {filename}" msgstr "Skener našel {count} problémů v {filename}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" msgstr "Nalezeno {count} varování v {filename}" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" msgstr "Vygenerována kostra metadat pro {appid}" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" msgstr "Git checkout '%s' se nezdařil" #: ../fdroidserver/common.py msgid "Git clean failed" msgstr "Git clean se nezdařil" #: ../fdroidserver/common.py msgid "Git fetch failed" msgstr "Git fetch se nezdařil" #: ../fdroidserver/common.py msgid "Git prune failed" msgstr "Git prune se nezdařil" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Git remote set-head se nezdařil: „%s“" #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Git reset se nezdařil" #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Git submodule sync se nezdařil" #: ../fdroidserver/common.py msgid "Git submodule update failed" msgstr "Git submodule update se nezdařil" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" msgstr "U URL adres Subversion musí být použito HTTPS!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" msgstr "Pokud se git mirror stane příliš velkým, umožnit smazání archivu" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" msgstr "Pokud toto nahrání selže, zkuste manuálně nahrát na {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." msgstr "Ignorování pole ‚{field}‘ v metadatech ‚{metapath}‘, protože je zastaralé." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "Ignorování vstupu FUNDING.yml delšího než 2048: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" msgstr "Ignorování nesprávného prvku v manifestu: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorování balíčku bez metadat: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" msgstr "Ignorování zastaralých dat mezipaměti {apkfilename}" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" msgstr "Zahrnout soubory APK, které jsou podepsané zakázanými algoritmy jako MD5" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" msgstr "Zahrnout .asc soubory podpisu PGP do mirroru" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" msgstr "Zahrnout protokoly sestavení do mirroru" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" msgstr "Zahrnout zdrojové tarbally do mirroru" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" msgstr "Včetně metadat z %s@%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" msgstr "Včetně metadat z {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Inicializace submodulů" #: ../fdroidserver/install.py msgid "Install all signed applications available" msgstr "Instalace všech dostupných podepsaných aplikací" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" msgstr "Nainstalujte vestavěné balíčky na zařízení" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." msgstr "Instalace %s..." #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." msgstr "Instalace ‚{apkfilename}‘ na {dev}..." #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" msgstr "Interakce se serverem repo HTTP" #: ../fdroidserver/update.py msgid "Invalid APK" msgstr "Neplatné APK" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" msgstr "Neplatný AutoUpdateMode: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" msgstr "Neplatný UpdateCheckMode: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" msgstr "Neplatný VercodeOperation: {field}" #: ../fdroidserver/lint.py #, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "Neplatný VercodeOperation: {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "Neplatné ID aplikace {appid}" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" msgstr "Neplatná logická hodnota ‚%s‘" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Neplatný seznam s odrážkami" #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" msgstr "Neplatný název pro publikovaný soubor: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" msgstr "Neplatné ndk: záznam v sestavení: „{ndk}“" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " msgstr "Neplatné přesměrování na jiný než HTTPS: {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" msgstr "Neplatná metadata scrlib: ‚{file}‘ neexistuje" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" msgstr "Neplatná srclib metadata: nelze parsovat ‚{file}‘" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" msgstr "Neplatná srclib metadata: neznámý klíč ‚{key}‘ v ‚{file}‘" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" msgstr "Podpis JAR se nepodařilo ověřit: {path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" msgstr "Ověření podpisu JAR: {path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" msgstr "Soubor Java JAR" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" msgstr "Java JDK nenalezeno! Nainstalujte jej do standardního umístění nebo nastavte java_paths!" #: ../fdroidserver/scanner.py msgid "Java compiled class" msgstr "Zkompilovaná třída Java" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" msgstr "Java jarsigner nebyl nalezen! Nainstalujte jej do standardního umístění nebo nastavte java_paths!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" msgstr "Javascript v atributech HTML src" #: ../fdroidserver/build.py #, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" msgstr "Uchovávání neúspěšného sestavení „{apkfilename}“" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Úložiště klíčů pro podpisový klíč:\t" #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" msgstr "Poslední použitá revize ‚{commit}‘ vypadá jako značka, ale UpdateCheckMode je ‚{ucm}‘" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" msgstr "Darovací metody Liberapay patří do pole Liberapay: pole" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted (dry run)" msgstr "Seznam souborů, které budou přeformátovány (zkušební provoz)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "Překlad obsažený v URL f-droid.org" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" msgstr "Zastavení sestavování při výjimkách" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." msgstr "Poškozené mirrory repozitáře." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" msgstr "Poškozený řádek serverwebroot:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" msgstr "Dosažena maximální hloubka rekurze v souboru ZIP: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Zrcadlení celého repozitáře a archivu, všechny typy souborů." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" msgstr "Chybějící výstupní adresář" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" msgstr "Přesun deklarací Anti-Features do lokalizovaných souborů:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "V souboru config.yml není nastaven \"repo_pubkey\" ani \"keystorepass\"" #: ../fdroidserver/verify.py #, python-format msgid "No APK for package: %s" msgstr "Žádné APK pro balíček: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Nebylo nalezeno Android SDK!" #: ../fdroidserver/install.py msgid "No attached devices found" msgstr "Nebyla nalezena žádná připojená zařízení" #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "V adrese URL není otisk prstu." #: ../fdroidserver/common.py msgid "No git submodules available" msgstr "Nejsou k dispozici žádné submoduly git" #: ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "Nebyl nalezen žádný projekt gradle. Specifikujte --subdir?" #: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Nebyly nalezeny žádné informace." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" msgstr "Nebyly nalezeny žádné odpovídající štítky" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." msgstr "V {0} nebyla nalezena minimální verze SDK, použita výchozí (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Není třeba uvádět, že aplikace je svobodný software" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" msgstr "Není třeba uvádět, že je aplikace určena pro Android" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "Není nastavena žádná možnost! Upravte svůj config.yml a nastavte alespoň jedno z těchto:" #: ../fdroidserver/common.py msgid "No packages specified" msgstr "Nebyly zadány žádné balíčky" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" msgstr "Žádné podepsané APK k dispozici pro %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" msgstr "Žádný podepsaný výstupní adresář - není co dělat" #: ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" msgstr "Nenalezeny žádné podpisové certifikáty v {path}" #: ../fdroidserver/common.py #, python-format msgid "No such package: %s" msgstr "Žádný takový balíček: %s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" msgstr "Žádný takový versionCode {versionCode} pro aplikaci {appid}" #: ../fdroidserver/checkupdates.py msgid "No tags found" msgstr "Nebyly nalezeny žádné značky" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" msgstr "Žádný nepodepsaný adresář - není co dělat" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Neplatná definice velikosti: \"{}\"" #: ../fdroidserver/signindex.py msgid "Nothing to do" msgstr "Není co dělat" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." msgstr "Pro {appid} není co dělat." #: ../fdroidserver/init.py msgid "Now set these in config.yml:" msgstr "Nyní nastavte následující v config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" msgstr "Soubor OBB má novější versionCode({integer}) než jakýkoli APK:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" msgstr "Název souboru OBB musí začínat s \"main.\" nebo \"patch.\":" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" msgstr "Packagename souboru OBB neodpovídá podporovanému souboru APK:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Offline počítač, přeskočení generování mirroru git až do `fdroid deploy`" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Pro grafiku jsou podporovány pouze formáty PNG a JPEG, nalezeno: {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Zobrazit pouze rozdíly s Obchodem Play" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Zpracovat pouze aplikace s automatickými aktualizacemi" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Darovací metody OpenCollective patří do pole OpenCollective: pole" #: /usr/lib/python3.11/optparse.py msgid "Options" msgstr "Možnosti" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Uložit hlášení JSON do souboru pojmenovaného podle APK." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." msgstr "Uložit JSON do stdout." #: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py #: ../fdroidserver/publish.py ../fdroidserver/signindex.py #: ../fdroidserver/update.py msgid "Outputting JSON" msgstr "Ukládání výstupu JSON" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Celková licence projektu." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Přepisování prázdného versionName v {apkfilename} z metadat: {version}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "Balíček „{appid}“ již existuje" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" msgstr "Parsování manifestu v ‚{path}‘" #: ../fdroidserver/common.py msgid "Password required with username" msgstr "Vyžadováno heslo s uživatelským jménem" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "Cesta k hlavnímu podadresáři projektu Android, pokud není v kořenovém adresáři." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" msgstr "Cesta k Android SDK (někdy nastavena v ANDROID_HOME)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" msgstr "Cesta ke git repozitáři k použití jako protokol" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" msgstr "Cesta k úložišti klíčů pro podpisový klíč repozitáře" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Zobrazit tajnou proměnnou v terminálu pro jednoduché kopírování/vložení" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" msgstr "Problém se souborem ZIP: %s, chyba %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" msgstr "Problém s xml v '{path}'" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" msgstr "Zpracovat auto-aktualizace" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" msgstr "Zpracování {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" msgstr "Zpracování {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" msgstr "Vytváření lidsky čitelných souborů XML/JSON pro indexové soubory" #: ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "Adresa URL projektu, ze které se má importovat." #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" msgstr "Mělo by být vyvarováno interpunkce" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" msgstr "Odeslat protokol do tohoto vzdáleného git repozitáře" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing binary transparency log to {url}" msgstr "Odeslání protokolu binární průhlednosti do {url}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" msgstr "Odesílání do {url}" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" msgstr "Rychle spusťte nové úložiště" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" msgstr "Přečtěte si všechny soubory metadat a ukončete" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" msgstr "Čtení ‚{config_file}‘" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" msgstr "Čtení packageName/versionCode/versionName se nezdařilo, APK nepatné: ‚{apkfilename}‘" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" msgstr "Čtení packageName/versionCode/versionName se nezdařilo, APK nepatné: ‚{apkfilename}‘" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" msgstr "Čtení {apkfilename} z mezipaměti" #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Odebírání určených souborů" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" msgstr "Odebírání {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Přejmenujte soubory APK, které se neshodují s package.name_123.apk" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" msgstr "Režim aktualizace RepoTrunk má smysl pouze v repozitářích git-svn" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." msgstr "Resetovat a vytvořit zcela nový server sestavení, i když se stávající zdá být v pořádku." #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" msgstr "Opětovné podepisování {apkfilename} s poskytnutým debug.keystore" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" msgstr "Změnit velikost všech ikon přesahujících maximální velikost pixelů a ukončit aplikaci" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" msgstr "Omezit výstup na varování a chyby" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Přepsat všechny soubory metadat" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" msgstr "Přepisování ‚{appid}‘" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" msgstr "Spustit v repozitáři git s nezveřejněnými změnami" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Spustit rewritemeta pro opravu formátování" #: ../fdroidserver/deploy.py msgid "Running first pass with MD5 checking disabled" msgstr "Spuštění prvního průchodu s vypnutou kontrolou MD5" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" msgstr "Spouštění wget v {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" msgstr "SHA-256 z {url} neodpovídá zadání!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Oskenovat výsledná APK, zda neobsahují známé nesvobodné třídy." #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" msgstr "Naskenujte zdrojový kód balíčku" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {apk}" msgstr "Skener našel {count} problémů v {apk}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" msgstr "Skener našel {count} problémů v {appid}:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" msgstr "Skener našel {count} problémů v {appid}:{versionCode}:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "Skener našel {} problém" msgstr[1] "Skener našel {} problémy" msgstr[2] "Skener našel {} problémů" #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "Skenování APK pomocí dexdump na známé nesvobodné třídy." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" msgstr "Nastavit NDK {release} ({version})" #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Nastavit hodiny na daný čas pomocí:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" msgstr "Nastavit maximální počet vydání před archivací starších" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" msgstr "Nastavit limit otevřených souborů na {integer}" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" msgstr "Nastavit sestavení aplikace pro nightly sestavení repozitáře" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " msgstr "Nastavení limitu otevřených souborů se nezdařilo: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" msgstr "Nastavení časového limitu {0} sek pro toto sestavení" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Podepsat a umístit balíčky v repo" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" msgstr "Podepsat indexy vytvořené pomocí aktualizace -- nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" msgstr "Přeskočení kontroly zdrojového kódu binárních souborů a dalších problémů" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Přeskakování ‚{apkfilename}‘ s neplatným podpisem!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" msgstr "Přeskakování mirroru GitLab Pages, protože je repozitář příliš velký (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" msgstr "Přeskakování generování indexu pro {appid}" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" msgstr "Přeskakování {apkfilename} s neplatným podpisem!" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" msgstr "Přeskakování {appid}: zakázáno" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" msgstr "Určete místní složku, do které chcete synchronizovat repozitář" #: ../fdroidserver/deploy.py msgid "Specify an identity file to provide to SSH for rsyncing" msgstr "Určete soubor identity k poskytnutí pro SSH pro rsyncing" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." msgstr "Určete, který ladicí soubor úložiště klíčů se má použít." #: ../fdroidserver/common.py msgid "Spew out even more information than normal" msgstr "Zobrazovat ještě více informací než normálně" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" msgstr "Odstraňování tajemného podpisu z {apkfilename}" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" msgstr "Shrnutí ‚%s‘ je pouze název aplikace" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" msgstr "Souhrn délky {length} je nad limitem {limit} znaků" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" msgstr "Systémové hodiny jsou starší než datum v {path}!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" msgstr "Režim aktualizace štítků v současné době funguje pouze pro repozitáře git, hg, bzr a git-svn" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "Režim aktualizace pomocí značek se používá v git-svn, ale repozitář nebyl nastaven se značkami" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Testovací režim - výstup se ukládá pouze do adresáře tmp a vždy se sestavuje, i když výstup již existuje." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" msgstr "Kód verze OBB musí být uveden za „{name}.“:" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" msgstr "Základní URL repozitáře k logování (výchozí: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" msgstr "Adresář, do kterého se má zapsat mirror" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" msgstr "Soubor, který má být zahrnut do repozitáře (cesta nebo glob)" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." msgstr "Otisk prstu repozitáře se neshoduje." #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" msgstr "Kořenový adresář pro local_copy_dir „{path}“ neexistuje!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" msgstr "Došlo ke kolizi keyalias – publikování zastaveno" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." msgstr "Aplikace, které byly archivovány z hlavního repozitáře." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Toto je repozitář aplikací, který lze používat s aplikací F-Droid. Aplikace v tomto repozitáři jsou buď oficiální binární soubory sestavené původními vývojáři aplikací, nebo binární soubory sestavené ze zdrojových kódů správcem f-droid.org pomocí nástrojů na adrese https://gitlab.com/fdroid." #: ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Tento repozitář již má místní metadata: %s" #: ../fdroidserver/init.py #, python-format msgid "" "To complete the setup, add your APKs to \"%s\"\n" "then run \"fdroid update -c; fdroid update\". You might also want to edit\n" "\"config.yml\" to set the URL, repo name, and more. You should also set up\n" "a signing key (a temporary one might have been automatically generated).\n" "\n" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" "Chcete-li dokončit nastavení, přidejte soubory APK na adresu \"%s\".\n" "poté spusťte příkaz „fdroid update -c; fdroid update“. Možná budete chtít také upravit\n" "„config.yml“, abyste nastavili adresu URL, název repozitáře a další údaje. Měli byste také nastavit\n" "podpisový klíč (dočasný klíč již mohl být vygenerován automaticky).\n" "\n" "Další informace: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "a https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Chcete-li používat awsbucket, musí být v souboru config.yml nastaven také awssecretkey a awsaccesskeyid!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "URL musí začínat s https:// nebo http://" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" msgstr "Zkracovače URL by neměly být používány" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" msgstr "URL {url} v popisu: {error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" msgstr "Neočekávaná licenční značka „{}“! Používejte pouze značky schválené FSF nebo OSI z https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Neočekávaná licenční značka „{}“! Používejte pouze licenční značky nakonfigurované v konfiguračním souboru" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" msgstr "Neočekávaný cíl symlinku: {link} -> {target}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" msgstr "Neznámá položka {key} in {configname}" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Došlo k neznámé chybě!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" msgstr "Neznámý soubor ‚{filename}‘ v sestavení ‚{versionName}‘" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" msgstr "Neznámý formát metadat: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" msgstr "Neznámý formát metadat: {path} (použijte: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " msgstr "Neznámá verze aapt, může způsobit problémy: " #: ../fdroidserver/lint.py msgid "Unnecessary leading space" msgstr "Zbytečná úvodní mezera" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" msgstr "Zbytečná mezera na konci" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" msgstr "Nerozpoznané pole aplikace ‚{fieldname}‘ v ‚{path}‘" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Nerozpoznaný příznak sestavení ‚{build_flag}‘ v ‚{path}‘" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" msgstr "Nepodporovaný typ souboru „{extension}“ pro grafiku repozitáře" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" msgstr "Nalezen nepodporovaný soubor grafiky: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" msgstr "Nepoužitý extlib na %s" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" msgstr "Nepoužitý soubor na %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" msgstr "Nepoužitá cesta scandelete: %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" msgstr "Nepoužitá cesta scanignore: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" msgstr "Rozbalování do %s" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Aktualizujte informace o repo pro nové balíčky" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" msgstr "Aktualizujte protokol binárního průhlednosti pro adresu URL" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData má neplatnou URL: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" msgstr "UpdateCheckData musí odpovídat kódu verze jako celému číslu (\\d nebo [0-9]): {codeex}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" msgstr "UpdateCheckData musí používat HTTPS URL: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData není platná URL: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode je nastaven, ale vypadá to, že akce checkupdates ještě nebyla spuštěna." #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName je nastaveno na známé ID aplikace, lze jej odstranit" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" msgstr "Nahrávání {apkfilename} na androidobservatory.org" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" msgstr "Nahrávání {apkfilename} na virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "Usage" msgstr "Použití" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Použití: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Použijte /HEAD místo /master k ukázání na soubor ve výchozí větvi" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "K vytvoření použijte `fdroid update -c`." #: ../fdroidserver/build.py msgid "Use build server" msgstr "Použít server pro sestavení" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" msgstr "Pro nově přidaná APK použít datum z APK místo aktuálního času" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." msgstr "Používám „{path}“ pro konfiguraci s3cmd." #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "Používám APK Signature v2" #: ../fdroidserver/common.py msgid "Using APK Signature v3" msgstr "Používám APK Signature v3" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Používám jarsigner Javy, není doporučeno pro ověřování APK! Použijte apksigner" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" msgstr "Používám androguard z „{path}“" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" msgstr "Použití prázdného slovníku místo obsahu {path}!" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" msgstr "Používám existující keystore „{path}“" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" msgstr "Používám s3cmd pro synchronizaci s: {url}" #: ../fdroidserver/__main__.py msgid "Valid commands are:" msgstr "Platné příkazy jsou:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." msgstr "Ověřit proti lokálně uložené kopii místo opětovného stahování." #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" msgstr "Ověřte integritu stažených balíčků" #: ../fdroidserver/index.py msgid "Verifying index signature:" msgstr "Ověřování podpisu indexu:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "Klíč API VirusTotal neumožňuje nahrávání souborů větších než 32 MB, k nahrání {path} použijte {url}." #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Varovat ohledně možných chyb metadat" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Pokud jsou nakonfigurovány podepsané indexy, vytvořit v této fázi pouze nepodepsané indexy" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "Při lintingu celého úložiště je yamllint ve výchozím nastavení zakázán. Tato volba vynucuje yamllint bez ohledu na to." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distinguished Name' používané při generování klíčů" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" msgstr "Pro nastavení cesty k vašemu SDK můžete použít ANDROID_HOME, např.:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" msgstr "Archiv souborů ZIP" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" msgstr "přidávám IdentityFile do {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" msgstr "přidávání do {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "nejednoznačná možnost: %(option)s by mohlo odpovídat %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "nejednoznačná možnost: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner nenalezen! Nelze podepsat nebo ověřit moderní APK" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "apksigner nenalezen, je vyžadován k podepisování!" #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "ID aplikace nebo soubor, se kterým se má pracovat" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" msgstr "ID aplikace s nepovinným kódem verze ve tvaru APPID[:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" msgstr "archive_url musí končit na /archive" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "argument \"-\" s režimem %r" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" msgstr "argument %(argument_name)s: %(message)s" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" msgstr "pokus o holé připojení SSH k testování klíče pro nasazení:" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" msgstr "nelze parsovat specifikaci scrlib (není to řetězec): ‚{}‘" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "nelze otevřít '%(filename)s': %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" msgstr "nelze otevřít non-https url: '{};" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" msgstr "nelze najít požadované srclibs: „{path}“" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "nelze mít více argumentů subparseru" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "nelze sloučit akce - dvě skupiny jsou pojmenovány %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" msgstr "nelze publikovat aktualizaci, nastavili jste klíč pro nasazení?" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" msgstr "klonování {url}" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" msgstr "příkazy z modulů pluginů:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" msgstr "komplexní" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "konfliktní řetězec možnosti: %s" msgstr[1] "konfliktní řetězce možnosti: %s" msgstr[2] "konfliktní řetězce možnosti: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser alias: %s" msgstr "konfliktní alias subparseru: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser: %s" msgstr "konfliktní subparser: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" msgstr "nepodařilo se parsovat '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "nepodařilo se parsovat srclib spec (není určen ref): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" msgstr "nepodařilo se parsovat srclib spec (příliš mnoho značek '@'): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" msgstr "vytvořeno {path}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" msgstr "současná verze je novější: starý vercode={old}, nový vercode={new}" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" msgstr "mazání: repo/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" msgstr "protokol procesu {path} nasazen do {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest= je vyžadován pro možnosti jako %r" #: ../fdroidserver/scanner.py msgid "downloading '{}'" msgstr "stahování ‚{}‘" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" msgstr "stahování podpisů skeneru z ‚{}‘ se nezdařilo" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" msgstr "spustitelná binárka, případně kód" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "očekáván %s argument" msgstr[1] "očekávány %s argumenty" msgstr[2] "očekáváno %s argumentů" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "očekáván alespoň jeden argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "očekáván maximálně jeden argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "očekáván jeden argument" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--help|--version|]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" msgstr "stáhnout nejnovější verzi podpisů z webu" #: /usr/lib/python3.11/optparse.py msgid "floating-point" msgstr "floating-point" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "vynutit, aby chyby metadat (výchozí) byly varovány nebo vyly ignorovány." #: ../fdroidserver/common.py msgid "git svn clone failed" msgstr "git svn clone selhalo" #: ../fdroidserver/scanner.py msgid "gzip file archive" msgstr "archiv souborů gzip" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "ignorován explicitní argument %r" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 musí mít podpis, použijte `fdroid signindex` pro jeho vytvoření!" #: ../fdroidserver/index.py msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 musí mít podpis, použijte `fdroid signindex` pro jeho vytvoření!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" msgstr "celé číslo" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "neplatná hodnota %(type)s: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "neplatná volba: %(value)r (vyberte si z %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "neplatná hodnota conflict_resolution: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "neplatný řetězec možnosti %(option)r: musí začínat znakem %(prefix_chars)r" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" msgstr "ipfs_cid nenalezeno, přeskakování generování CIDv1" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" msgstr "poslední recept sestavení je novější: starý vercode={old}, nový vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "local_copy_dir nekončí s \"fdroid\", možná jste měli na mysli: \"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" msgstr "local_copy_dir musí být absolutní cesta!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" msgstr "local_copy_dir musí být adresář, ne soubor!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" msgstr "mirror '%s' nekončí s 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "společně exkluzivní argumenty musí být volitelné" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" msgstr "příští aktualizace mezipaměti {name} proběhne za {time}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" msgstr "žádná \"icon\" v {appid}" #: ../fdroidserver/signatures.py msgid "no APK supplied" msgstr "neposkytnuto APK" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" msgstr "žádná taková volba: %s" #: ../fdroidserver/__main__.py msgid "no version info found!" msgstr "nenalezeno info o verzi!" #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "nenalezeny informace o verzi" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "není povoleno s argumentem %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "jeden z argumentů %s je vyžadován" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" msgstr "přijímá pouze řetězce, seznamy a tuply" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "možnost %s: pokud opravdu chcete nainstalovat všechny podepsané aplikace, použijte --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "možnost %s: neplatná hodnota %s: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "možnost %s: neplatná volba: %r (vyberte si z %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" msgstr "možnost - %s není rozpoznána" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" msgstr "možnost - %s vyžaduje argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "možnost --%s nesmí mít argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "možnost --%s není jedinečná předpona" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" msgstr "možnost -%s není rozpoznána" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s requires argument" msgstr "možnost --%s vyžaduje argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "volitelné argumenty" #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "možnosti" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" msgstr "přepisování existující {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "poziční argumenty" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" msgstr "proces nasazení protokolu {path} do {dest} selhal!" #: ../fdroidserver/build.py msgid "reference binary missing signature" msgstr "chybějící podpis v referenčním binárním souboru" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" msgstr "odmítnout stahování přes nezabezpečené spojení HTTP (použít HTTPS nebo upřesnit --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." msgstr "repo_icon \"repo/icons/%s\" neexistuje, generování placeholderu." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" msgstr "repo_url musí končit na /repo" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml není nainstalován, nelze zapisovat metadata." #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sync indexes {path} do {url} a odstranit" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "mezipaměť skeneru je poškozena! Můžete ji vymazat pomocí: ‚{clear}‘" #: ../fdroidserver/scanner.py msgid "shared library" msgstr "sdílená knihovna" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" msgstr "zobrazit číslo verze programu a ukončit" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" msgstr "zobrazí tuto nápovědu a skončí" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." msgstr "podepsané APK, buď file-path nebo HTTPS URL." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" msgstr "přeskočit nasazení plných protokolů sestavení: obsah protokolu je prázdný" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" msgstr "přeskočit nasazení plných protokolů sestavení: není povoleno v configu" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" msgstr "přeskakování zdrojového tarballu: {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" msgstr "scribls chybí název a/nebo @" #: ../fdroidserver/scanner.py msgid "static library" msgstr "statická knihovna" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" msgstr "dodaný referenční binární soubor umožnil podepisujícího {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "jsou vyžadovány následující argumenty: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "neočekávaný řetězec možností: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "neznámý parser %(parser_name)r (volby: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "nerozpoznané argumenty: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "nebezpečné oprávnění na '{config_file}' (má být 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "použití: " #: ../fdroidserver/deploy.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" msgstr "používám Apache libcloud pro synchronizaci s {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com omezuje rychlost, čekám na opětovný pokus..." #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" msgstr[0] "{0} aplikace, {1} aliasů klíčů" msgstr[1] "{0} aplikace, {1} aliasů klíčů" msgstr[2] "{0} aplikací, {1} aliasů klíčů" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) nemá žádná metadata!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" msgstr "{apkfilename} má několik souborů {name}, vypadá to na exploit Master Key!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "AndroidManifest.xml aplikace {apkfilename} má špatné datum: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} nemá název! Používám ID aplikace." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" msgstr "{appid} z {path} není platné ID Android aplikace!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid} z {path} není platný název balíčku Java!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" msgstr "{appid} má APK i soubory: {files}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" msgstr "{appid} chybí {name}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" msgstr "{appid}: Neznámá extlib {path} v sestavení '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" msgstr "{appid}: žádná určená sestavení, běžím na současném stavu zdroje" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" msgstr "{appid}: {field} musí být '{type}', ale je '{fieldtype}!'" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" msgstr "{appid}: {field} musí být '{type}', ale je '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} musí být celé číslo, nalezeno: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be list or string, found: {value}" msgstr "{build_flag} musí být seznam nebo řetězec, nalezeno: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" msgstr "{file} je prázdný nebo poškozený!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" neexistuje! Zkontrolujte \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} je zastaralý, použijte {newfile}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "{path} již existuje, ignorování importování výsledků!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" msgstr "{path} neexistuje! Vytvořte ji spuštěním:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} má nesprávný podpis balíčku \"{pattern}\", možný exploit Janus!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" msgstr "{path} má nulovou velikost!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} více než 200 MB, ruční nahrání: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} nekončí s \"fdroid\", zkontrolujte cestu URL!" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url} nezačíná s \"http\"!" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" msgstr[0] "{} sestavení selhalo" msgstr[1] "{} sestavení selhala" msgstr[2] "{} sestavení selhalo" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} sestavení úspěšné" msgstr[1] "{} sestavení úspěšná" msgstr[2] "{} sestavení úspěšných" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/locale/de/0000755000175000017500000000000014620351546014637 5ustar00hanshans././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.888382 fdroidserver-2.3a1/locale/de/LC_MESSAGES/0000755000175000017500000000000014620351546016424 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/locale/de/LC_MESSAGES/fdroidserver.po0000644000175000017500000027433614620351225021473 0ustar00hanshans# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # Oliver , 2020. # Fynn Godau , 2020. # melusine , 2020. # marzzzello , 2020, 2022. # Hans-Christoph Steiner , 2020, 2021. # Predatorix Phoenix , 2021. # cheese1 , 2021. # Aleph Null , 2021. # nautilusx , 2021, 2022. # forght , 2021. # TobiGr , 2021. # FW , 2021. # fossdd , 2021. # Ceeee , 2021. # C. Rüdinger , 2021, 2022. # VfBFan , 2021, 2023. # Roman Leo , 2021. # Follpvosten , 2021. # ssantos , 2022, 2023. # "C. Rüdinger" , 2023. # VfBFan , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2024-03-12 12:37+0000\n" "Last-Translator: VfBFan \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" "\n" "Öffentlicher SSH-Schlüssel, der als Bereitstellungsschlüssel verwendet werden soll:" #: ../fdroidserver/nightly.py #, python-brace-format msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" "\n" "{path} kodiert für die geheime Variable DEBUG_KEYSTORE:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" besitzt keine zugehörige Metadaten-Datei!" #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" msgstr "\"local_copy_dir\" {path}\" existiert nicht!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\" ist bereits auf {dev} installiert." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" msgstr "{name} ({version}) in „{path}” veraltet" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" msgstr "{name} ({version}) in \"{path}\" ist aktuell" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" msgstr "\"{path}” vorhanden, aber S3cmd ist nicht installiert!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" msgstr "\"{path}\" ist ein nicht unterstütztes Dateiformat (Verwendung: metadata/*.yml)" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "\"{path}” ist mit einem nicht zulässigen Schlüssel signiert:" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" ist keine gültige URL!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" msgstr[0] "Option %(option)s benötigt %(number)d Argument" msgstr[1] "Option %(option)s benötigt %(number)d Argumente" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: Fehler: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" msgstr "%d Probleme gefunden" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "%prog [options]" msgstr "%prog [Optionen]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" msgstr "%r ist nicht abrufbar" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" msgstr "%s hat kein dict hervorgebracht!" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" msgstr "%s hat schlechtes SHA-256: %s" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" msgstr "%s ist kein zulässiges Build-Feld" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" msgstr "Option %s verfügt über keinen Wert" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "„keypass” nicht in config.yml vorhanden!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' ist NONE und 'smartcardoptions' ist leer!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "„keystore” nicht in config.yml vorhanden!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "„keystorepass” nicht in config.yml vorhanden!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "„repo_keyalias” nicht in config.yml vorhanden!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "„required” ist ein ungültiges Argument für Positionsangaben" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" msgstr "Kein 'sdk_path' in 'config.yml' festgelegt!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "„{aapt}” ist veraltet, fdroid benötigt build-tools-{version} oder neuer!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" msgstr "Das Feld „{field}” wird in zufälliger Reihenfolge angezeigt! Verwenden Sie runde ( ) oder eckige [ ] Klammern, wenn die Reihenfolge wichtig ist!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" msgstr "„{path}” konnte nicht ausgeführt werden!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' in ungültigem Format, sollte ein Wörterbuch sein!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "„{value}” ist kein gültiges {field} in {appid}. Regex-Muster: {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "„{value}” ist kein gültiges {field}, sollte {pattern} sein" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" msgstr "… checkupdate für {appid} fehlgeschlagen: {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() nicht festgelegt" #: ../fdroidserver/lint.py msgid "/issues is missing" msgstr "/issues fehlt" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" msgstr "Als Argument wird eine URL benötigt!" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "GnuPG PGP-Signaturen für Programmpakete in der Paketquelle hinzufügen" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" msgstr "Füge einen Repository-Signierschlüssel zu einem unsignierten Repository hinzu" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" msgstr "Füge eine Metadaten-Vorlage für APKs hinzu, die keine haben" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" msgstr "Nur für {name} eine neue Repro hinzufügen" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" msgstr "Pseudonym des Repository-Signierchlüssels im Schlüsselspeicher" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" msgstr "AllowedAPKSigningKeys fehlen aber Referenz-Binärdatei geliefert" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Ermöglicht die Bestimmung unterschiedlicher Überarbeitungen (oder Git-Zweige) für den Erstimport" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" msgstr "Auch den gesamten Archivbereich spiegeln" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" msgstr "Auch vor Formatierungsfehler warnen, wie etwa \"rewritemeta -l\"" #: ../fdroidserver/scanner.py msgid "Android AAR library" msgstr "Android-AAR-Bibliothek" #: ../fdroidserver/scanner.py msgid "Android APK file" msgstr "Android-APK-Datei" #: ../fdroidserver/scanner.py msgid "Android DEX code" msgstr "Android-DEX-Code" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" msgstr "Android-SDK nicht unter {path} gefunden!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" msgstr "Android-SDK-Pfad »{path}« nicht vorhanden!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" msgstr "Android-SDK-Pfad »{path}« ist kein Verzeichnis!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" msgstr "Android-SDK-Tool {cmd} nicht gefunden!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "App besitzt Binärdateien aber keine entsprechenden AllowedAPKSigningKeys, um Zertifikat zu verankern." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "App hat NoSourceSince oder ArchivePolicy \"0 Versionen\", aber AutoUpdateMode oder UpdateCheckMode sind nicht None" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" msgstr "App befindet sich in „{repo}”, enthält aber einen Verweis auf {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "App-Version besitzt Binärdateien aber keine entsprechenden AllowedAPKSigningKeys, um Zertifikat zu verankern." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Das Anhängen von .git ist nicht notwendig" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" msgstr "Archivierung von {apkfilename} mit ungültiger Signatur!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode mit UpdateCheckMode: HTTP muss ein Muster haben." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" msgstr "Falscher Typeneintrag „{mirrortype}“ in Spiegelserver-Konfiguration von: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "Basis-URL zum Spiegeln, kann den Index-Signierungsschlüssel mit Hilfe des Abfrage-Strings enthalten: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" msgstr "Zweig „{branch}”, der als Bestätigung im Build verwendet wird „{versionName}”" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" msgstr "Zweig „{branch}” wird als Bestätigung in srclib verwendet „{srclib}”" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" msgstr "Kaputter Symlink: {path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" msgstr "Programmpaket aus Quellcode erstellen" #: ../fdroidserver/build.py msgid "Build all applications available" msgstr "Alle verfügbaren Anwendungen erstellen" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" msgstr "Build durch „fdroid import” erstellt - Entfernen Sie die Zeile „Deaktiviert”, sobald sie fertig ist" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" msgstr "Build Metadaten Git Repo hat nicht committete Änderungen!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" msgstr "Nur die neueste Version jedes Programmpakets erstellen" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" msgstr "Built-Repo basiert in „%s” auf der Konfiguration von:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" msgstr "Auto-Update der App ohne CurrentVersionCode nicht möglich" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "Kann nicht erstellt werden, da {} Fehler beim Prüfen aufgetreten ist" msgstr[1] "Kann nicht erstellt werden, da {} Fehler beim Prüfen aufgetreten sind" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" msgstr "\"{path}\" konnte nicht überschrieben werden" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "Kategorie »%s« ist nicht gültig" #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "Kategorien sind nicht festgelegt" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Auf Aktualisierungen für Anwendungen prüfen" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Archivierung auf {appid} überprüfen - apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Sauber aktualisieren - ohne Verwendung der Zwischenspeicher, alle APKs wiederaufbereiten" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Liste der Kategorien durch Kommata getrennt." #: ../fdroidserver/__main__.py #, python-format msgid "Command '%s' not recognised.\n" msgstr "Befehl '%s' nicht erkannt.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" msgstr "Änderungen übergeben" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" msgstr "Widersprüchliche „{field}“-Definitionen in .yml- bzw. übersetzten Dateien:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Widersprüchliche Argumente: '--verbose' und '--quiet' können nicht gleichzeitig angegeben werden." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" msgstr "Konflikt in der Konfiguration. Verwende {newfile}, ignoriere {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "„{command}” konnte auf Ihrem System nicht gefunden werden" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Neuester Versionscode konnte nicht gefunden werden" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Neuester Versionsname konnte nicht gefunden werden" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" msgstr "{path} konnte nicht gefunden werden, um ihn zu entfernen" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " msgstr "Konnte APK-Datei {path} nicht für Analyse öffnen " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Konnte Größe \"{size}\" nicht parsen, falscher Typ \"{type}\"" #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Konnte Anwendungs-ID nicht finden" #: ../fdroidserver/checkupdates.py msgid "Couldn't find any version information" msgstr "Versionsinformationen konnten nicht gefunden werden" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "Konnte Paket-ID nicht finden" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" msgstr "Es ist ungehörig, bestehende Signaturschlüssel-Einstellungen zu überschreiben!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" msgstr "Neuer Container „{name}” wurde erstellt" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." msgstr "„{path}” für die Konfiguration von S3cmd wird erstellt." #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Erstelle Logverzeichnis" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" msgstr "Neuer S3-Bucket wird erstellt: {url}" #: ../fdroidserver/publish.py msgid "Creating output directory" msgstr "Erstelle Ausgabeverzeichnis" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" msgstr "Signierter Index mit diesem Schlüssel (SHA256) wird erstellt:" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" msgstr "Erstelle temporäres Verzeichnis" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" msgstr "Unsignierter Index zur Vorbereitung der Signierung wird erstellt" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" msgstr "CurrentVersionCode {cv} ist kleiner als der älteste Build-Eintrag {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" msgstr "DEBUG_KEYSTORE ist nicht festgelegt oder der Wert ist unvollständig" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" msgstr "APKs und/oder OBBs ohne Metadaten aus dem Repository löschen" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" msgstr "Lösche Archiv, Repository ist zu groß ({size} max {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" msgstr "Git-Mirror-Verlauf löschen, Repository ist zu groß ({size} max {limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" msgstr "Lösche unbekannte Datei: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" msgstr "Die Beschreibung '%s' ist nur die Zusammenfassung der App" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" msgstr "Beschreibung enthält eine doppelte Zeile" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" msgstr "Beschreibung enthält eine Liste (%s), ist aber weder aufgezählt (*) noch nummeriert (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" msgstr "Länge der Beschreibung {length} übersteigt die zulässige Zeichenzahl {limit}" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Nicht 'disable:' zu den erzeugten Erstellungseinträgen hinzufügen" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" msgstr "Verteilen Sie die neuen Dateien nicht in das Repo" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" msgstr "„{path}” nicht in die URL einfügen!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" msgstr "Android-SDK-Pfad nicht abfragen, einfach überspringen" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" msgstr "Entfernen Sie die vom Schlüsselspeicher erzeugten privaten Schlüssel nicht" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" msgstr "Keinen Tarball vom Quellcode erstellen, nützlich bei Test eines Builds" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" msgstr "Keine Aktualisierung des Repositorys. Nützlich, wenn ein Build ohne Internetverbindung getestet wird" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" msgstr "Keine rsync-Prüfsummen verwenden" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Komplette Spiegel von kleinen Paketquellen herunterladen" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" msgstr "Herunterladen %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Herunterladen des Repositorys bereits einmal fehlgeschlagen, versuche es nicht nochmal." #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" msgstr "Herunterladen von {url} fehlgeschlagen. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" msgstr "Doppelte Anti-Feature-Deklaration in {path} wurde ignoriert!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" msgstr "Doppelter „%s“-Eintrag in Spiegelserver-Konfiguration!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" msgstr "Link in „{field}” duplizieren: {url}" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "FEHLER: Der \"server\"-Unterbefehl wurde entfernt, verwende \"deploy\"!" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" "FEHLER: Dieser Befehl sollte niemals verwendet werden, um f-droid.org zu spiegeln!\n" "Ein vollständiger Spiegel von f-droid.org erfordert mehr als 200 GB." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "FEHLER: nicht unterstützter CI-Typ, Patches willkommen!" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "FEHLER: nicht unterstützter Git-Host \"%s\", Patches willkommen!" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." msgstr "Die Kodierung ist auf '{enc}' gesetzt. Dies könnte zu Kodierungsproblemen führen. Bitte setze sie auf ''UTF-8'' für beste Ergebnisse." #: ../fdroidserver/init.py #, python-format msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" "Geben Sie hier den Pfad zum Android-SDK (%s) ein:\n" "> " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" msgstr "Umgebungsvariable {var} von {configname} ist nicht gesetzt!" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Fehler bei der Ermittlung der Repro-Adresse" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" msgstr "Mit einem von Null verschiedenen Code beenden, falls Probleme auftreten" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Extrahieren von Anwendungsmetadaten aus einem Quell-Repository" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Signaturen aus APKs extrahieren" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" msgstr "Kopieren von {path} fehlgeschlagen: {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" msgstr "Abrufen von Signaturen für „{apkfilename}” fehlgeschlagen: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" msgstr "Lesen von {path} fehlgeschlagen: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" msgstr "Größenanpassung von {path} fehlgeschlagen: {error}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" msgstr "S3-Bucket konnte nicht erstellt werden: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" msgstr "Abrufen der APK-Informationen fehlgeschlagen, {path} wird gelöscht" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" msgstr "Abrufen der APK-Informationen fehlgeschlagen, {path} wird übersprungen" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" msgstr "Abrufen des APK-Signierschlüssel-Fingerabdrucks fehlgeschlagen" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" msgstr "Installation von „{apkfilename}” auf {dev} fehlgeschlagen: {error}" #: ../fdroidserver/common.py msgid "Failed to sign application" msgstr "Signieren der Anwendung fehlgeschlagen" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" msgstr "BuildServerID von VM abgerufen: {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" msgstr "Signaturen für {apkfilename} -> {sigdir} abgerufen" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" msgstr "Datei verschwand während der Verarbeitung: {path}" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py #: ../fdroidserver/update.py msgid "Finished" msgstr "Fertiggestellt" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" msgstr "Flattr-Spendenmethoden gehören in das FlattrID-Feld" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Verbotene HTML-Befehle" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." msgstr "Erstellung deaktivierter Apps erzwingen und ungeachtet von Scan-Problemen ausüben. Nur im Testmodus erlaubt." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" msgstr "Erzwingt das Anhalten des Builds nach {0} Sek. Zeitüberschreitung!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." msgstr "Scannen von deaktivierten Anwendungen und Builds erzwingen." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" msgstr "Grafik \"{path}\" ohne Metadaten für App \"{name}\" gefunden!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "Schlechte Finanzierungsdatei \"{path}\" für \"{name}\" gefunden:" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" msgstr "Ungültige Appids in Argumenten gefunden" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "Ungültige versionCodes für einige Apps gefunden" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Mehrere JAR-Signaturzertifikate in {path} gefunden" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" msgstr "Mehrere Metadaten-Dateien für {appid} gefunden" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." msgstr "Mehrere Signaturzertifikate für das Repository gefunden." #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." msgstr "Es wurden keine Signaturzertifikate für das Repository gefunden." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" msgstr "Ungültige Datei bei %s gefunden" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" msgstr "{apkfilename} unter {url} gefunden" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} problems in {filename}" msgstr "{count} Probleme in {filename} gefunden" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" msgstr "{count} Warnungen in {filename} gefunden" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" msgstr "Generierte Metadaten aus Vorlage für {appid}" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" msgstr "Git checkout von '%s' fehlgeschlagen" #: ../fdroidserver/common.py msgid "Git clean failed" msgstr "Git clean fehlgeschlagen" #: ../fdroidserver/common.py msgid "Git fetch failed" msgstr "Git fetch fehlgeschlagen" #: ../fdroidserver/common.py msgid "Git prune failed" msgstr "Git prune fehlgeschlagen" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Git remote set-head fehlgeschlagen: \"%s\"" #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Git reset fehlgeschlagen" #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Git submodule sync fehlgeschlagen" #: ../fdroidserver/common.py msgid "Git submodule update failed" msgstr "Git submodule update fehlgeschlagen" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" msgstr "HTTPS muss bei Subversion-URLs verwendet werden!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" msgstr "Wenn ein Git-Mirror zu groß wird, erlaube dem Archiv gelöscht zu werden" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" msgstr "Wenn das Hochladen fehlschlägt, versuchen Sie es händisch auf {url} hochzuladen" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." msgstr "'{field}' in '{metapath}' Metadaten wird ignoriert, da es veraltet ist." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "Ignoriere FUNDING.yml Einträge länger als 2048: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" msgstr "Ignoriere schlechtes Element im Manifest: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignoriere Paket ohne Metadaten: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" msgstr "Ignoriere veraltete Cachedaten für {apkfilename}" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" msgstr "APKs einschließen, die mit untauglichen Algorithmen wie MD5 signiert sind" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" msgstr "Einbinden der .asc-PGP-Signaturdateien in den Spiegelserver" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" msgstr "Einbinden der Build-Protokolle in den Spiegelserver" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" msgstr "Einbinden der Quellen-Tarballs in den Spiegelserver" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" msgstr "Einschließlich der Metadaten von %s@%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" msgstr "Einschließlich der Metadaten von {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Initialisiere Submodule" #: ../fdroidserver/install.py msgid "Install all signed applications available" msgstr "Alle verfügbaren, signierten Anwendungen installieren" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" msgstr "Erstellte Programmpakete auf Geräten installieren" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." msgstr "Installiere %s …" #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." msgstr "Installiere '{apkfilename}' auf {dev} …" #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" msgstr "Mit dem HTTP-Server des Repository kommunizieren" #: ../fdroidserver/update.py msgid "Invalid APK" msgstr "Ungültige APK" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" msgstr "Ungültiger AutoUpdateMode: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" msgstr "Ungültiger UpdateCheckMode: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" msgstr "Ungültige VercodeOperation: {field}" #: ../fdroidserver/lint.py #, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "Ungültige VercodeOperation: {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "Ungültige Anwendungs-ID {appid}" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" msgstr "Ungültiger boolescher Wert '%s'" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Ungültige Aufzählung" #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" msgstr "Ungültiger Name für die veröffentlichte Datei: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" msgstr "Ungültiger ndk: Eintrag in Build: \"{ndk}\"" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " msgstr "Ungültige Umleitung auf Nicht-HTTPS: {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" msgstr "Ungültige scrlib-Metadaten: '{file}' ist nicht vorhanden" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" msgstr "Ungültige srclib-Metadaten: '{file}' konnte nicht analysiert werden" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" msgstr "Ungültige srclib-Metadaten: unbekannter Schlüssel '{key}' in '{file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" msgstr "JAR-Signatur konnte nicht überprüft werden: {path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" msgstr "JAR-Signatur verifiziert: {path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" msgstr "Java JAR-Datei" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" msgstr "Java JDK nicht gefunden! Installieren Sie es in einem Standardordner oder setzen Sie java_paths!" #: ../fdroidserver/scanner.py msgid "Java compiled class" msgstr "Java-kompilierte Klasse" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" msgstr "Java jarsigner nicht gefunden! Installieren Sie es in einem Standardordner oder setzen Sie java_paths!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" msgstr "Javascript in HTML src-Attributen" #: ../fdroidserver/build.py #, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" msgstr "Fehlgeschlagener Build \"{apkfilename}\" behalten" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Schlüsselspeicher für den Signierschlüssel:\t" #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" msgstr "Der zuletzt verwendete Commit '{commit}' sieht aus wie ein Tag, aber der Aktualisierung-Überprüfungs-Modus ist '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" msgstr "Liberapay-Spendenmethoden gehören in das Liberapay: Feld" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted (dry run)" msgstr "Dateien listen, die reformatiert würden (Probelauf)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "Gebietsschema in der f-droid.org URL enthalten" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" msgstr "Erstellung bei Fehlern anhalten" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." msgstr "Fehlerhafte Paketquellen-Spiegelserver." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" msgstr "Fehlerhafte serverwebroot Zeile:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" msgstr "Maximale Rekursionstiefe in ZIP-Datei erreicht: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Spiegeln Sie die komplette Paketquelle und das Archiv, inklusive aller Dateitypen." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" msgstr "Fehlendes Ausgabeverzeichnis" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" msgstr "Verschiebe Anti-Feature-Deklarationen in lokalisierte Dateien:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "Weder \"repo_pubkey\" noch \"keystorepass\" in config.yml gesetzt" #: ../fdroidserver/verify.py #, python-format msgid "No APK for package: %s" msgstr "Keine APK für das Paket: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Kein Android SDK gefunden!" #: ../fdroidserver/install.py msgid "No attached devices found" msgstr "Keine angeschlossenen Geräte gefunden" #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Kein Fingerabdruck in der URL." #: ../fdroidserver/common.py msgid "No git submodules available" msgstr "Keine Git-Submodule verfügbar" #: ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "Es konnte kein Gradle-Projekt gefunden werden. \"--subdir\" angeben?" #: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Keine Informationen gefunden." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" msgstr "Keine passenden Tags gefunden" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." msgstr "Keine Mindest-SDK-Version in {0} gefunden, Standard (3) verwendet." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Sie müssen nicht angeben, dass die App Freie Software ist" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" msgstr "Sie müssen nicht angeben, dass die App für Android ist" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "Keine Option gesetzt! Bearbeiten Sie Ihre config.yml, um mindestens eine davon zu setzen:" #: ../fdroidserver/common.py msgid "No packages specified" msgstr "Keine Pakete angegeben" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" msgstr "Keine signierte Apk für %s verfügbar" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" msgstr "Kein signiertes Ausgabeverzeichnis - nichts zu tun" #: ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" msgstr "Keine Signaturzertifikate in {path} gefunden" #: ../fdroidserver/common.py #, python-format msgid "No such package: %s" msgstr "Kein solches Paket: %s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" msgstr "Kein Versionscode {versionCode} für App {appid}" #: ../fdroidserver/checkupdates.py msgid "No tags found" msgstr "Keine Tags gefunden" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" msgstr "Kein unsigniertes Verzeichnis - nichts zu tun" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Keine gültige Größendefinition: \"{}\"" #: ../fdroidserver/signindex.py msgid "Nothing to do" msgstr "Keine zu erledigenden Aufgaben" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." msgstr "Keine zu erledigenden Aufgaben für {appid}." #: ../fdroidserver/init.py msgid "Now set these in config.yml:" msgstr "Legen Sie diese nun in der config.yml fest:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" msgstr "Die OBB-Datei hat eine neuere VersionCode ({integer}) als jedes APK:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" msgstr "Der OBB Dateiname muss mit \"main.\" oder \"patch.\" beginnen:" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" msgstr "Der OBB-Packetname stimmt mit keinem unterstützten APK überein:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Maschine offline, überspringe git-Spiegelgeneration bis `fdroid deploy`" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Nur PNG und JPEG werden für Grafiken unterstützt, gefunden wurde: {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Nur Unterschiede zum Play Store ausgeben" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Nur Apps mit automatischen Aktualisierungen verarbeiten" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "OpenCollective-Spendenmethoden gehören in das OpenCollective: Feld" #: /usr/lib/python3.11/optparse.py msgid "Options" msgstr "Optionen" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "JSON-Bericht in eine nach der APK benannte Datei ausgeben." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." msgstr "JSON an stdout ausgeben." #: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py #: ../fdroidserver/publish.py ../fdroidserver/signindex.py #: ../fdroidserver/update.py msgid "Outputting JSON" msgstr "JSON ausgeben" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Gesamt-Lizenz des Projekts." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Überschreiben von leeren Versionsnamen in {apkfilename} aus Metadaten: {version}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "Paket \"{appid}\" existiert bereits" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" msgstr "Analysiere Manifest bei {path}" #: ../fdroidserver/common.py msgid "Password required with username" msgstr "Passwort mit Benutzername benötigt" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "Pfad zum Unterverzeichnis des Android-Hauptprojekts, wenn es nicht im Stammverzeichnis ist." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" msgstr "Pfad zum Android-SDK (Softwareentwicklungsbaukasten) (mitunter in ANDROID_HOME festgelegt)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" msgstr "Pfad zum Git-Repository, der zur Anmeldung verwendet werden soll" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" msgstr "Pfad zum Schlüsselspeicher für den Repository-Signierschlüssel" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Drucken der geheimen Variable in das Terminal zum einfachen Kopieren/Einfügen" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" msgstr "Problem mit der ZIP-Datei: %s, Fehler %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" msgstr "Problem mit xml bei {path}" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" msgstr "Aktualisierungen automatisch ausführen" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" msgstr "Verarbeite {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" msgstr "Verarbeite {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" msgstr "Erstelle menschenlesbares XML/JSON für Indexdateien" #: ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "Projekt-Adresse, von der importiert werden soll." #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" msgstr "Interpunktion sollte vermieden werden" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" msgstr "Anmeldung an diesem Git-Repository durchführen" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing binary transparency log to {url}" msgstr "Binäres Transparenz-Log nach {url} pushen" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" msgstr "Pushen auf {url}" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" msgstr "Schnellstart eines neuen Repositorys" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" msgstr "Alle Metadaten-Dateien betrachten und beenden" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" msgstr "Lese '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" msgstr "Lesen von packageName/versionCode/versionName fehlgeschlagen, APK ungültig: '{apkfilename}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" msgstr "Lesen von packageName/versionCode/versionName fehlgeschlagen,APK ungültig: '{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" msgstr "Lese {apkfilename} aus dem Cache" #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Entferne angegebene Dateien" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" msgstr "Entferne {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "APK-Dateien umbenennen, die nicht dem Muster „package.name_123.apk“ entsprechen" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" msgstr "Der RepoTrunk-Aktualisierungsmodus ist nur bei git-svn-Paketquellen sinnvoll" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." msgstr "Zurücksetzen und ganz neuen Build-Server einrichten, auch wenn der bestehende in Ordnung zu sein scheint." #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" msgstr "{apkfilename} erneut mit dem mitgelieferten debug.keystore signieren" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" msgstr "Größe aller Symbole ändern, welche die maximale Pixelgröße überschreiten, und beenden" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" msgstr "Ausgabe auf Warnungen und Fehler beschränken" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Alle Metadaten-Dateien neu schreiben" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" msgstr "Schreibe '{appid}' neu" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" msgstr "Auf Git Repo, das nicht committete Änderungen hat, laufen lassen" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Metadaten neu schreiben, um Formatierungen zu korrigieren" #: ../fdroidserver/deploy.py msgid "Running first pass with MD5 checking disabled" msgstr "Erster Durchlauf mit MD5-Prüfung abgeschaltet" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" msgstr "Ausführen von wget in {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" msgstr "SHA-256 von {url} stimmt nicht mit Eintrag überein!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Scannen Sie die entstandene(n) APK(s) nach bekannten non-free-Klassen." #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" msgstr "Quellcode eines Programmpakets durchsuchen" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {apk}" msgstr "Scanner fand {count} Probleme in {apk}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" msgstr "Scanner fand {count} Probleme in {appid}:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" msgstr "Scanner fand {count} Probleme in {appid}:{versionCode}:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "Scanner fand {count} Problem" msgstr[1] "Scanner fand {count} Probleme" #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "APK mit dexdump nach bekannten nicht-quelloffenen Klassen scannen." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" msgstr "NDK {release} ({version}) einrichten" #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Einstellen der Uhr auf diese Zeit mit:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" msgstr "Setze maximale Veröffentlichungen im Repo bevor ältere archiviert werden" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" msgstr "Setzen des Limits für geöffnete Dateien auf {integer}" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" msgstr "Ein App-Build für einen nightly Build-Repo einrichten" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " msgstr "Das Setzen des Limits für geöffnete Dateien ist fehlgeschlagen: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" msgstr "Stelle einen {0} Sek timeout für diesen Build ein" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Programmpakete in Paketquelle signieren und einstellen" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" msgstr "Erstellte Indizes durch Verwendung von „update --nosign“ signieren" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" msgstr "Durchsuchen des Quellcodes nach Binärdateien und anderen Problemen überspringen" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Überspringen von '{apkfilename}' mit ungültiger Signatur!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" msgstr "GitLab Pages Mirror wird übersprungen, da das Repo zu groß ist (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" msgstr "Überspringe Indexerzeugung für {appid}" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" msgstr "Überspringe '{apkfilename}' mit ungültiger Signatur!" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" msgstr "Überspringen von {appid}: deaktiviert" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" msgstr "Einen lokalen Ordner bestimmen, in dem das Repository synchronisiert wird" #: ../fdroidserver/deploy.py msgid "Specify an identity file to provide to SSH for rsyncing" msgstr "Eine Identitätsdatei bestimmen, die bei Re-Synchronisation an SSH übergeben wird" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." msgstr "Geben Sie an, welche Debug Keystore-Datei verwendet werden soll." #: ../fdroidserver/common.py msgid "Spew out even more information than normal" msgstr "Mehr Informationen als gewöhnlich ausspucken" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" msgstr "Entferne mysteriöse Signatur aus {apkfilename}" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" msgstr "Zusammenfassung '%s' ist nur der Name der App" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" msgstr "Zusammenfassung mit der Länge {length} liegt über der {limit} Zeichengrenze" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" msgstr "Die System-Uhr ist älter als das Datum in {path}!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" msgstr "Der Aktualisierungsmodus funktioniert derzeit nur für Git-, Hg-, Bzr- und Git-SVN-Paketquellen" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "Aktualisierungsmodus mit Tags in git-svn verwendet, aber das Repo wurde nicht mit Tags eingerichtet" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Testmodus - Ausgabe nur ins tmp-Verzeichnis einfügen, immer erstellen, selbst wenn die Ausgabe bereits vorhanden ist." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" msgstr "Der OBB-Versionscode muss nach \"{name}.\" stehen:" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" msgstr "Basis-Adresse zur Anmeldung am Repository (Standard: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" msgstr "Das Verzeichnis in das der Spiegelserver geschrieben werden soll" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" msgstr "Die in das Repo aufzunehmende Datei (Pfad oder Glob)" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." msgstr "Der Fingerabdruck des Repositorys stimmt nicht." #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" msgstr "Das Wurzelverzeichnis für local_copy_dir \"{path}\" existiert nicht!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" msgstr "Es gibt eine Keyalias-Kollision - Veröffentlichung gestoppt" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." msgstr "Dies sind die Apps, die aus dem Hauptrepository archiviert wurden." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Dies ist eine Paketquelle für Anwendungen, die für die Benutzung zusammen mit F-Droid gedacht ist. Die darin enthaltenen Anwendungen sind entweder offizielle von den Entwicklern erstellte Binärdateien oder werden von f-droid.org mithilfe des Werkzeugs auf https://gitlab.com/fdroid aus dem Quellcode erstellt." #: ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Dieses Repo hat bereits lokale Metadaten: %s" #: ../fdroidserver/init.py #, python-format msgid "" "To complete the setup, add your APKs to \"%s\"\n" "then run \"fdroid update -c; fdroid update\". You might also want to edit\n" "\"config.yml\" to set the URL, repo name, and more. You should also set up\n" "a signing key (a temporary one might have been automatically generated).\n" "\n" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" "Um die Einrichtung abzuschließen, fügen Sie Ihre APKs zu \"%s\"\n" "und führen Sie dann \"fdroid update -c; fdroid update\" aus. Vielleicht möchten Sie auch\n" "\"config.yml\" bearbeiten, um die URL, den Repo-Namen und mehr festzulegen. Sie sollten auch\n" "einen Signierschlüssel einrichten (ein temporärer Schlüssel könnte automatisch generiert worden sein).\n" "\n" "Für weitere Informationen: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "und https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Um awsbucket zu benutzen, müssen awssecretkey und awsaccesskeyid auch in der config.yml gesetzt sein!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "URL muss mit https:// oder http:// beginnen" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" msgstr "Kurz-URL-Dienste sollten nicht verwendet werden" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" msgstr "URL {url} in der Beschreibung: {error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" msgstr "Ungültiges Lizenz-Tag \"{}\"! Verwenden Sie nur Kennzeichen von https://spdx.org/license-list, die von FSF oder OSI anerkannt sind" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Unerwartetes Lizenz-Tag \"{}\"! Nur Lizenz-Tags verwenden, die in deiner config-Datei eingerichtet sind" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" msgstr "Unerwartetes Symlink-Ziel: {link} -> {target}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" msgstr "Unbekannter Eintrag {key} in {configname}" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Unbekannter Fehler aufgetreten!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" msgstr "Unbekannte Datei '{filename}' im Build '{versionName}''" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" msgstr "Unbekanntes Metadatenformat: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" msgstr "Unbekanntes Metadaten-Format: {path} (benutze: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " msgstr "Unbekannte Version von aapt, könnte Probleme verursachen: " #: ../fdroidserver/lint.py msgid "Unnecessary leading space" msgstr "Unnötige führende Leerzeichen" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" msgstr "Unnötige Leerzeichen an Ende" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" msgstr "Nicht erkanntes App-Feld '{fieldname}' in '{path}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "NIcht erkannte Build Flag '{build_flag}' in '{path}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" msgstr "Nicht unterstützter Dateityp \"{extension}\" für Repo-Grafik" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" msgstr "Nicht unterstützte Grafikdatei gefunden: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" msgstr "Nicht verwendete extlib bei %s" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" msgstr "Nicht verwendete Datei bei %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" msgstr "Nicht verwendeter „scandelete“ Pfad: %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" msgstr "Nicht verwendeter „scanignore“ Pfad: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" msgstr "Entpacke nach %s" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Paketquelleninformationen zu neuen Programmpaketen aktualisieren" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" msgstr "Binäres Transparency-Log einer URL aktualisieren" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData hat eine ungültige URL: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" msgstr "UpdateCheckData muss mit dem Versionscode als Ganzzahl (\\d oder [0-9]) übereinstimmen: {codeex}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" msgstr "UpdateCheckData muss HTTPS-URL verwenden: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData hat eine ungültige URL: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode ist gesetzt, aber likecheckupdates wurde vermutlich noch nicht ausgeführt" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName ist auf eine bekannte App-ID gesetzt, sie kann entfernt werden" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" msgstr "Lade {apkfilename} auf androidobservatory.org hoch" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" msgstr "Lade {apkfilename} auf VirusTotal hoch" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "Usage" msgstr "Syntax" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Syntax: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Verwenden Sie /HEAD anstelle von /master, um auf eine Datei im Hauptzweig zu verweisen" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Verwenden Sie `fdroid update -c´ zum Erstellen." #: ../fdroidserver/build.py msgid "Use build server" msgstr "Build-Server verwenden" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" msgstr "APK-Datum statt der aktuellen Zeit für neu hinzugefügte APKs verwenden" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." msgstr "Verwende {path} zur Konfiguration von s3cmd." #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "Verwende APK-Signatur v2" #: ../fdroidserver/common.py msgid "Using APK Signature v3" msgstr "Verwende APK-Signatur v3" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Von Java jarsigner zur Verifikation von APKs wird abgeraten! Verwenden Sie apksigner" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" msgstr "Verwende Androguard von \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" msgstr "Verwende leeres Verzeichnis statt der Inhalte von {path}!" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" msgstr "Verwende vorhandenen Schlüsselspeicher \"{path}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" msgstr "Verwende s3cmd zum Synchronisieren mit: {url}" #: ../fdroidserver/__main__.py msgid "Valid commands are:" msgstr "Gültige Befehle sind:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." msgstr "Vergleichen Sie mit lokal zwischengespeicherter Kopie, anstatt erneut herunterzuladen." #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" msgstr "Integrität der heruntergeladenen Programmpakete überprüfen" #: ../fdroidserver/index.py msgid "Verifying index signature:" msgstr "Überprüfe die Index-Signatur:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "VirusTotal-API-Schlüssel kann nicht Dateien größer 32MB hochladen, verwende {url} um {path} hochzuladen." #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Vor möglichen Metadaten-Fehlern warnen" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Bei einer Konfiguration mit signierten Indizes, in dieser Phase nur unsignierte Indizes erstellen" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "Beim Linting des gesamten Repositoriums wird yamllint standardmäßig deaktiviert. Diese Option erzwingt yamllint ungeachtet dessen." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distinguished Name' zum Erzeugen von Schlüsseln" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" msgstr "Sie können ANDROID_HOME verwenden, um den Pfad zu Ihrem SDK zu setzen, z. B.:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" msgstr "ZIP-Dateiarchiv" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" msgstr "Füge IdentityFile zu {path} hinzu" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" msgstr "Hinzufügen zu {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "Mehrdeutige Option: %(option)s könnte übereinstimmen mit %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "Mehrdeutige Option: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner nicht gefunden! Moderne APKs können nicht signiert oder verifiziert werden" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "apksigner nicht gefunden, er wird zum Signieren benötigt!" #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "App-ID der Datei, die bearbeitet werden soll" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" msgstr "App-ID mit fakultativem Versionscode in der Form APPID[:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" msgstr "archive_url muss mit /archive enden" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "Argument \"-\" mit Modus %r" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" msgstr "Argument %(argument_name)s: %(message)s" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" msgstr "Versuch einer reinen SSH-Verbindung, um den Deployment-Key zu testen:" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" msgstr "kann scrlib-Spezifikation nicht parsen (keine Zeichenkette): '{}'" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "'%(filename)s' kann nicht geöffnet werden: %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" msgstr "Nicht-HTTPS-URL kann nicht geöffnet werden: '{};" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" msgstr "Konnte die benötigten srclibs nicht finden: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "Mehrere Subparser-Argumente sind unzulässig" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "kann keine Aktionen zusammenführen - zwei Gruppen heißen %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" msgstr "Kann das Update nicht veröffentlichen. Ist der Deploy-Schlüssel gesetzt?" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" msgstr "Klone {url}" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" msgstr "Befehle aus den PlugIn-Modulen:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" msgstr "komplex" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "widersprüchliche Optionsangabe: %s" msgstr[1] "widersprüchliche Optionsangaben: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser alias: %s" msgstr "widersprüchlicher Subparser-Alias: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser: %s" msgstr "widersprüchlicher Subparser: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" msgstr "konnte '{path}' nicht parsen" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "konnte srclib-Spezifikation nicht parsen (keine ref angegeben): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" msgstr "konnte srclib-Spezifikation nicht parsen (zu viele '@'-Zeichen): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" msgstr "{path} erzeugt" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" msgstr "die aktuelle Version ist neuer: alter vercode={old}, neuer vercode={new}" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" msgstr "Lösche: repo/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" msgstr "Verarbeitungsprotokoll {path} unter {dest} bereitgestellt" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest= wird benötigt für Optionen wie %r" #: ../fdroidserver/scanner.py msgid "downloading '{}'" msgstr "Herunterladen von '{}'" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" msgstr "Herunterladen der Scanner-Signaturen von '{}' fehlgeschlagen" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" msgstr "ausführbare Binärdatei, vermutlich Code" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "%s Argument erwartet" msgstr[1] "%s Argumente erwartet" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "mindestens ein Argument erwartet" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "höchstens ein Argument erwartet" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "ein Argument erwartet" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--help|--version|]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" msgstr "Abrufen der neuesten Version von Signaturen aus dem Web" #: /usr/lib/python3.11/optparse.py msgid "floating-point" msgstr "Gleitkomma" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "Erzwingen, dass Metadatenfehler (Standard) als Warnung ausgegeben oder ignoriert werden." #: ../fdroidserver/common.py msgid "git svn clone failed" msgstr "git svn Klonen fehlgeschlagen" #: ../fdroidserver/scanner.py msgid "gzip file archive" msgstr "gzip Dateiarchiv" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "Ausdrückliches Argument %r ignoriert" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 muß eine Signatur haben, verwenden Sie `fdroid signindex` um sie zu erzeugen!" #: ../fdroidserver/index.py msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 muss eine Signatur haben, verwenden Sie `fdroid signindex`, um sie zu erstellen!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" msgstr "Ganzzahl" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "Ungültige(r) %(type)s mit Wert: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "Ungültige Auswahl: %(value)r (Wählen Sie aus %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "Ungültiger conflict_resolution-Wert: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "Ungültige Optionszeichenfolge %(option)r: muss mit einem Zeichen %(prefix_chars)r beginnen" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" msgstr "ipfs_cid nicht gefunden, CIDv1-Generierung wird übersprungen" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" msgstr "Neuestes Build-Rezept ist neuer: alter Vercode={old}, neuer Vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "local_copy_dir endet nicht auf \"fdroid\", meinten Sie stattdessen: \"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" msgstr "local_copy_dir muß eine absolute Pfadangabe sein!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" msgstr "local_copy_dir muß ein Verzeichnis sein, keine Datei!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" msgstr "Spiegelserver '%s' ended nicht mit 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "sich gegenseitig ausschließende Argumente müssen optional sein" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" msgstr "nächstes {name} Cache-Update fällig in {time}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" msgstr "kein \"icon\" in {appid}" #: ../fdroidserver/signatures.py msgid "no APK supplied" msgstr "kein APK bereitgestellt" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" msgstr "keine solche Option: %s" #: ../fdroidserver/__main__.py msgid "no version info found!" msgstr "keine Versionsinformation gefunden!" #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "keine Versionsinformation gefunden" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "unzulässig mit Argument %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "eines der Argumente %s ist erforderlich" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" msgstr "akzeptiert nur Zeichenketten, Listen und Tupel" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "Option %s: Wenn Sie wirklich alle signierten Apps installieren wollen, verwenden Sie --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "Option %s: ungültiger %s Wert: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "Option %s: ungültige Wahl: %r (wählen Sie aus %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" msgstr "Option -%s nicht erkannt" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" msgstr "Option -%s erfordert Argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "Option --%s darf kein Argument haben" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "option --%s ist kein eindeutiges Präfix" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" msgstr "Option --%s nicht erkannt" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s requires argument" msgstr "Option --%s erfordert Argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "optionale Argumente" #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "Optionen" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" msgstr "überschreiben des vorhandenen {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "Positionsparameter" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" msgstr "Bereitstellen des Process Log {path} auf {dest} ist fehlgeschlagen!" #: ../fdroidserver/build.py msgid "reference binary missing signature" msgstr "Referenz-Binärdatei fehlt Signatur" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" msgstr "Download über ungesicherte HTTP-Verbindung verweigert (verwenden Sie HTTPS oder geben Sie --no-https-check an): {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." msgstr "repo_icon \"repo/icons/%s\" existiert nicht, erzeuge Platzhalter." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" msgstr "repo_url muss mit /repo enden" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml ist nicht installiert, kann Metadaten nicht schreiben." #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd-Sync {path} indizieren auf {url} und dann löschen" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "Der Scanner-Cache ist fehlerhaft! Sie können ihn löschen mit: '{clear}'" #: ../fdroidserver/scanner.py msgid "shared library" msgstr "dynamische Bibliothek" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" msgstr "Versionsnummer der Anwendung anzeigen und beenden" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" msgstr "diese Hilfemeldung anzeigen und beenden" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." msgstr "signiertes APK, entweder ein Dateipfad oder eine HTTPS-URL." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" msgstr "Überspringen des Deployens von vollständigen Build-Logs: der Log-Inhalt ist leer" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" msgstr "Überspringen des Deployens von vollständigen Build-Logs: nicht in der Konfiguration aktiviert" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" msgstr "Überspringe Quell-Tarball: {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" msgstr "Srclibs-Name fehlt und/oder @" #: ../fdroidserver/scanner.py msgid "static library" msgstr "statische Bibliothek" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" msgstr "Angewandte Referenz-Binary erlaubt Signer {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "die folgenden Argumente sind erforderlich: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "Unerwartete Optionsverkettung: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "Unbekannter Parser %(parser_name)r (Auswahl: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "nicht erkannte Argumente: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "Unsichere Berechtigungen in „{config_file}” (sollte 0600 sein)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "Syntax: " #: ../fdroidserver/deploy.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" msgstr "Verwende Apache libcloud zur Synchronisation mit {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com limitiert die Zugriffe, warte auf Wiederholung …" #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" msgstr[0] "{0} app, {1} Schlüsselaliase" msgstr[1] "{0} apps, {1} Schlüsselaliase" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) besitzt keine Metadaten!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" msgstr "{apkfilename} hat mehrere {name} Dateien, sieht aus wie Master Key Exploit!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "Die AndroidManifest.xml der App „{apkfilename}” hat ein ungültiges Datum: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} besitzt keinen Namen! Die Anwendungs-ID wird stattdessen verwendet." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" msgstr "{appid} von {path} ist keine gültige Android-Anwendungs-ID!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid} von {path} ist kein gültiger Java-Paketname!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" msgstr "{appid} hat sowohl APKs als auch Dateien: {files}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" msgstr "{appid} fehlt {name}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" msgstr "{appid}: unbekannte Extlib {path} im Build '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" msgstr "{appid}: keine builds angegeben, läuft auf dem aktuellen source-Stand" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" msgstr "{appid}: {field} muss ein '{type}' sein, ist aber ein '{fieldtype}!'" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" msgstr "{appid}: {field} muss ein '{type}' sein, ist aber ein '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} muss ein Integer sein, gefunden: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be list or string, found: {value}" msgstr "{build_flag} muss eine Liste oder Zeichenkette sein, gefunden: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" msgstr "{file} ist leer oder beschädigt!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" existiert nicht! Überprüfe \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} ist veraltet, benutze {newfile}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "{path} existiert schon, importierte Ergebnisse werden nicht berücksichtigt!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" msgstr "{path} existiert nicht! Erstellen Sie es durch Ausführen von:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} hat die schlechte Dateisignatur \"{pattern}\", möglicher Janus-Exploit!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" msgstr "{path} hat Dateigröße Null!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} ist größer als 200MB und muss manuell auf {url} hochgeladen werden" #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} endet nicht mit \"fdroid\", überprüfen Sie den URL-Pfad!" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url} beginnt nicht mit \"http\"!" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" msgstr[0] "{} Build fehlgeschlagen" msgstr[1] "{} Builds fehlgeschlagen" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} Build erfolgreich" msgstr[1] "{} Builds erfolgreich" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/locale/es/0000755000175000017500000000000014620351546014656 5ustar00hanshans././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.888382 fdroidserver-2.3a1/locale/es/LC_MESSAGES/0000755000175000017500000000000014620351546016443 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/locale/es/LC_MESSAGES/fdroidserver.po0000644000175000017500000027400014620351225021476 0ustar00hanshans# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Maximiliano Castañón , 2020. # Jo , 2020. # Hans-Christoph Steiner , 2020, 2021, 2022. # Alvaro , 2020. # Fioddor Superconcentrado , 2021. # Adolfo Jayme Barrientos , 2021. # mondstern , 2021. # Germe the fur star , 2021. # Iago , 2022. # Iago , 2022. # Jaime Marquínez Ferrándiz , 2022. # gallegonovato , 2022, 2023, 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2024-04-10 18:44+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" "\n" "Clave pública SSH que se usará como clave de despliegue:" #: ../fdroidserver/nightly.py #, python-brace-format msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" "\n" "{path} codificada para la variable secreta DEBUG_KEYSTORE:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" msgstr "¡\"%s/\" no tiene su correspondiente fichero de metadatos!" #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" msgstr "¡El directorio raíz para local_copy_dir \"{path}\" no existe!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\" ya está instalado en {dev}." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" msgstr "\"{path}\" contiene {name} ({version}) caducado" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" msgstr "\"{path}\" contiene {name} ({version}) reciente" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" msgstr "\"{path}\" existe pero ¡s3cmd no está instalado!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" msgstr "\"{path}\" no es un formato reconocido, convertir a metadata/*.yml" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "\"{path}\" está firmado por una clave no permitida:" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" no es una URL válida!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" msgstr[0] "la opción %(option)s requiere %(number)d argumento" msgstr[1] "la opción %(option)s requiere %(number)d argumentos" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: error: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" msgstr "%d problemas encontrados" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "%prog [options]" msgstr "%prog [opciones]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" msgstr "no se puede llamar a %r" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" msgstr "¡%s no ha producido un dict!" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" msgstr "%s tienes mal un SHA-256: %s" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" msgstr "%s no es un campo de construcción aceptado" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" msgstr "la opción %s no toma un valor" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "¡'keypass' no encontrado en config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "¡\"keystore\" es NONE y \"smartcardoptions\" está vacío!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "¡'keystore' no encontrado en config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "¡'keystorepass' no encontrado en config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "¡'repo_keyalias' no encontrado en config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' es un argumento inválido para posicionales" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" msgstr "¡'sdk_path' no establecido en 'config.yml'!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "¡'{aapt}' es demasiado antiguo, fdroid requiere build-tools-{version} o posterior!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" msgstr "¡'{field}' estará en un orden aleatorio! ¡Use paréntesis () o [] si el orden es importante!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" msgstr "¡Falló la ejecución de '{path}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' tiene un formato inválido, ¡debería ser un diccionario!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' no es un {field} válido en {appid}. Patrón de expresión regular: {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' no es un {field} válido, debería ser {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" msgstr "...falló la comprobación de actualizaciones para {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() no definida" #: ../fdroidserver/lint.py msgid "/issues is missing" msgstr "no se encuentra /issues" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" msgstr "¡Se requiere una URL como argumento!" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Añadir las firmas PGP para los paquetes en el repositorio usando GnuPG" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" msgstr "Cree una clave de firmado para un repositorio sin firmar" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" msgstr "Agregar archivos con esqueleto de metadats para las aplicaciones que no los tienen" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" msgstr "Agregando nuevo repo solamente para {name}" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" msgstr "Alias de la clave de firma de repositorio en el depósitio de claves" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" msgstr "Falta la AllowedAPKSigningKeys, pero se proporcionó un binario de referencia" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Permite especificar una revisión diferente (o git sector) para la importación inicial" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" msgstr "También replicar la sección completa del archivo" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" msgstr "También advierta sobre problemas de formato, como r rewritemeta-l" #: ../fdroidserver/scanner.py msgid "Android AAR library" msgstr "Biblioteca AAR para Android" #: ../fdroidserver/scanner.py msgid "Android APK file" msgstr "Fichero APK de Android" #: ../fdroidserver/scanner.py msgid "Android DEX code" msgstr "Código DEX en Android" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" msgstr "¡No se encontró el SDK de Android en {path}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" msgstr "¡No existe la ruta '{path}' al SDK de Android!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" msgstr "¡La ruta al SDK de Android '{path}' no es un directorio!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" msgstr "¡No se encontró la herramienta {cmd} del SDK de Android!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "La aplicación tiene archivos binarios, pero no las AllowedAPKSigningKeys correspondientes para fijat el certificado." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "La aplicación tiene NoSourceSince o ArchivePolicy \"0 versiones\", pero AutoUpdateMode o UpdateCheckMode no es Ninguno" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" msgstr "La aplicación está en '{repo}' pero tiene un enlace a {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "La versión de la aplicación es binaria pero no tiene las correspondientes AllowedAPKSigningKeys para fijar el certificado." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "No es necesario agregar .git" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" msgstr "¡Archivando {apkfilename} con una firma inválida!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode con UpdateCheckMode: el HTTP debe tener un patrón." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" msgstr "Tipo de entrada incorrecto \"{mirrortype}\" en la configuración de los espejos: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "URL base para replicar, puede incluir la clave de firma del índice usando la cadena de consulta: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" msgstr "Rama '{branch}' usada como \"commit\" en el build '{versionName}'" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" msgstr "Rama '{branch}' usada como \"commit\" en srclib '{srclib}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" msgstr "Enlace simbólico roto: {path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" msgstr "Crear un paquete desde la fuente" #: ../fdroidserver/build.py msgid "Build all applications available" msgstr "Compilar todas las aplicaciones disponibles" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" msgstr "Build generada por `fdroid import` - Eliminar \"disable line\" cuando esté lista" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" msgstr "¡El repositorio git de la compilación de metadatos tiene cambios pendientes!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" msgstr "Construir sólo la última versión de cada paquete" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" msgstr "Repositorio creado en \"%s\" con esta configuración:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" msgstr "No se puede actualizar automáticamente, app sin CurrentVersionCode" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "No se puede construir debido al error {} mientras se comprobaba" msgstr[1] "No se puede construir debido a los errores {} mientras se comprobaba" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" msgstr "No se puede reescribir \"{path}\"" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "La categoría '%s' no es válida" #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "No se han establecido categorías" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Buscar actualizaciones de aplicaciones" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Comprobando la operación de archivo para {appid} - APKs:{integer}, versiones mantenidas:{keep}, arquitecturas de apk:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Actualización limpia, no usa la caché, procesa todas las APKs" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Lista de categorías separadas por comas." #: ../fdroidserver/__main__.py #, python-format msgid "Command '%s' not recognised.\n" msgstr "No se reconoció la orden «%s».\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" msgstr "Aplicar cambios" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" msgstr "Definiciones \"{field}\" contradictorias entre los archivos .yml y los archivos localizados:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argumentos incompatibles: No se puede especificar \"--verbose\" y \"--quiet\" a la vez." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" msgstr "Archivos de configuración en conflicto. ¡Usando {newfile}, ignorando {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "No se pudo encontrar '{command}' en el sistema" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "No se pudo encontrar el último código de versión" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "No se pudo encontrar el último nombre de versión" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" msgstr "No se pudo encontrar {path} para eliminarlo" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " msgstr "No se pudo abrir el archivo APK {path} para analizarlo: " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "No se puede procesar el tamaño \"{size}\", tipo erróneo \"{type}\"" #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "No se pudo encontrar el identificador de aplicación" #: ../fdroidserver/checkupdates.py msgid "Couldn't find any version information" msgstr "No se pudo encontrar ninguna información sobre la versión" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "No se ha podido encontrar el identificador de paquete" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" msgstr "¡Se ha rechazado (cobardemente) sobrescribir la configuración existente de clave de firma!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" msgstr "Se ha creado el contenedor nuevo \"{name}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Creando \"{path}\" para configurar s3cmd." #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Creando el directorio de registro (\"log\")" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" msgstr "Creando nuevo cubo S3: {url} 1" #: ../fdroidserver/publish.py msgid "Creating output directory" msgstr "Creando el directorio de salida" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" msgstr "Creando índice firmado con esta clave (SHA256):" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" msgstr "Creando directorio temporal" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" msgstr "Creando índice no firmado, en preparación de la firma" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" msgstr "CurrentVersionCode {cv} es menor que la compilación más antigua registrada {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" msgstr "DEBUG_KEYSTORE no está establecida o su valor es incompleto" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" msgstr "Borrar del repositorio archivos APK y/o OBB sin metadatos" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" msgstr "Borrando archivo, el repositorio es demasiado grande ({size} vs. {limit} máximo)" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" msgstr "Borrando la historia del repositorio git espejo, el repositorio es demasiado grande({size} vs. {limit} máximo)" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" msgstr "Borrando fichero desconocido: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" msgstr "La descripción '%s' es simplemente el resumen de la aplicación" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" msgstr "La descripción contiene una línea duplicada" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" msgstr "La descripción tiene una lista (%s) pero no está estructurada (*) ni numerada (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" msgstr "La descripción de longitud {length} supera el límite de caracteres, {limit}" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "No agregar 'disable:' a las entradas de compilaciones generadas" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" msgstr "No desplegar los ficheros nuevos en el repositorio" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" msgstr "¡No incluir \"{path}\" en la URL!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" msgstr "No solicitar la ruta al Android SDK, si falla" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" msgstr "No elimine las claves privadas generadas del almacén de claves" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" msgstr "No cree un tarball de origen, útil al probar una compilación" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" msgstr "No actualizar el repositorio, útil al probar una compilación sin conexión a Internet" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" msgstr "No use rsync checksums" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Descargar réplicas completas de repositorios pequeños" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" msgstr "Descargando %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "La descarga del repositorio ya falló una vez, no se intentará de nuevo." #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" msgstr "La descarga de {url} falló. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" msgstr "¡Se ignoró la declaración duplicada de Anti-Feature en la {path}!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" msgstr "¡Entrada duplicada \"%s\"en la configuración de los espejos!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" msgstr "Enlace duplicado en '{field}': {url}" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ERROR: ¡El subcomando \"server\" se ha eliminado. Use \"deploy\"!" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" "ERROR: ¡esta orden no se debería usar nunca para replicar f-droid.org!\n" "Una réplica completa de f-droid.org requiere más de 200GB." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERROR: tipo de CI no soportado, ¡se aceptan parches!" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "ERROR: host git no soportado \"%s\", ¡parches bienvenidos!" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." msgstr "La codificación establecida es '{enc}'. fdroid podría sufrir problemas de codificación. Por favor establecerla a 'UTF-8' para resultados óptimos." #: ../fdroidserver/init.py #, python-format msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" "Introduzca la ruta a Android SDK (%s) aquí:\n" "> " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" msgstr "¡La variable de entorno {var} de {configname} no tiene valor asignado!" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Error al obtener la dirección del repositorio" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" msgstr "Salir con un código distinto de cero si se encontraron problemas" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Extraer los metadatos de la aplicación de un repositorio de origen" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Extraer firmas de APKs" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" msgstr "Fallo copiando {path}: {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" msgstr "Fallo al obtener firmas para '{apkfilename}': {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" msgstr "Fallo al leer {path}: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" msgstr "Fallo al cambiar de tamaño {path}: {error}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" msgstr "Fallo al crear bucket S3 : {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" msgstr "Fallo al obtener la información de APK, borrando {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" msgstr "Fallo al obtener la información de APK, omitiendo {path}" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" msgstr "Fallo al obtener la información de manifiesto APK" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" msgstr "Fallo al instalar '{apkfilename}' en {dev}: {error}" #: ../fdroidserver/common.py msgid "Failed to sign application" msgstr "Fallo al firmar la aplicación" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" msgstr "Buildserverid obtenido de la VM: {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" msgstr "Firmas obtenidas para '{apkfilename}'-> '{sigdir}'" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" msgstr "El archivo desapareció al procesarlo: {path}" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py #: ../fdroidserver/update.py msgid "Finished" msgstr "Terminado" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" msgstr "Los métodos de donación de Flattr pertenecen al FlattrID: field" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Etiquetas HTML prohibidas" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." msgstr "Forzar la creación de compilaciones deshabilitadas, independientemente de los problemas de escaneo. Sólo se permite en modo de prueba." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" msgstr "¡Forzar la suspensión de la compilación tras {0} segundos!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." msgstr "Forzar el escaneo de aplicaciones y compilaciones deshabilitadas." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" msgstr "¡Se encontró la gráfica \"{path}\" sin metadatos para la aplicación \"{name}\"!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "Se encontró archivo de financiación \"{path}\" para \"{name}\":" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" msgstr "Se encontraron identificadores de aplicaciones inválidos en los argumentos" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "Se encontraron códigos de versión (versionCodes) inválidos para algunas aplicaciones" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Encontrados varios ficheros de bloque de firma JAR en {path}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" msgstr "Se encontraron multiples ficheros de metadatos para {appid}" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." msgstr "Encontrados varios certificados de firma para el repositorio." #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." msgstr "Ningún certificado de firma encontrado para el repositorio." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" msgstr "Se encontró algo que no es un fichero en %s" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" msgstr "Se encontró {apkfilename} en {url}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} problems in {filename}" msgstr "Encontró {count} problemas en {filename}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" msgstr "Se encontraron {count} advertencias en {filename}" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" msgstr "Creada la estructura de metadatos para {appid}" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" msgstr "Falló el checkout Git de '%s'" #: ../fdroidserver/common.py msgid "Git clean failed" msgstr "Git clean falló" #: ../fdroidserver/common.py msgid "Git fetch failed" msgstr "Git fetch falló" #: ../fdroidserver/common.py msgid "Git prune failed" msgstr "Falló la extracción de Git" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Git remote set-head falló: \"%s\"" #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Git reset falló" #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "La sincronización del submodulo de Git falló" #: ../fdroidserver/common.py msgid "Git submodule update failed" msgstr "La actualización del submodulo de Git falló" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" msgstr "¡Se debe usar HTTPS con URLs de Subversion!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" msgstr "Si un repositorio espejo git crece mucho, permitir borrar el archivo" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" msgstr "Si esta carga falla, prueba cargarlo manualmente a {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." msgstr "Ignorando '{field}' en medatos '{metapath}' por obsoleto." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "Ignorando entrada en FUNDING.yml mayor de 2048: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" msgstr "Ignorar el elemento incorrecto en el manifiesto: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorando paquete sin metadatos: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" msgstr "Ignorando datos de cache atascada para {apkfilename}" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" msgstr "Incluir APKs que están firmados con algoritmos deshabilitados como MD5" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" msgstr "Incluir los archivos .asc de firma PGP en el espejo" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" msgstr "Incluir las bitácoras de compilación en el repositorio espejo" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" msgstr "Incluir en el espejo los archivos tarball de código fuente" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" msgstr "Incluyendo metadatos de %s@%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" msgstr "Incluyendo metadatos de {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Inicializando submodules" #: ../fdroidserver/install.py msgid "Install all signed applications available" msgstr "Instalar todas las aplicaciones firmadas disponibles" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" msgstr "Instalar paquetes constuídos en el dispositivo" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." msgstr "Instalando %s…" #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." msgstr "Instalando '{apkfilename}' en {dev}…" #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" msgstr "Interactuar con el servidor HTTP del repositorio" #: ../fdroidserver/update.py msgid "Invalid APK" msgstr "APK no válido" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" msgstr "ModoActualizaciónAutomática Inválido: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" msgstr "UpdateCheckMode no válido {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" msgstr "VercodeOperation no válida: {field}" #: ../fdroidserver/lint.py #, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "VercodeOperation no válido: {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "ID de aplicación inválido {appid}" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" msgstr "Valor booleano no válido '%s'" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Lista no numerada no válida" #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" msgstr "Nombre no válido para archivo publicado: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" msgstr "Ndk no válido: entrada en paquete: \"{ndk}\"" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " msgstr "Redirección no válida a no HTTPS: {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" msgstr "Metadato scrlib inválido: '{file}' no existe" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" msgstr "Metadato scrlib no válido: no se pudo procesar '{file}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" msgstr "Metadato scrlib no válido: clave desconocida '{key}' en el archivo '{file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" msgstr "No se pudo comprobar la firma JAR: {path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" msgstr "Firma JAR verificada: {path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" msgstr "Archivo java JAR" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" msgstr "¡No se encontró Java JDK! ¡Instale en una ubicación estándar o establezca java_paths!" #: ../fdroidserver/scanner.py msgid "Java compiled class" msgstr "Clase compilada java" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" msgstr "Java jarsigner no encontrado! Instalar en una ubicación estándar o establecer java_paths!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" msgstr "Javascript en atributos src de HTML src" #: ../fdroidserver/build.py #, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" msgstr "Mantener la compilación fallida \"{apkfilename}\"" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Depósito de claves para la clave de firma de repositorio:\t" #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" msgstr "La última confirmación utilizada '{commit}' parece una etiqueta, pero Update Check Mode es '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" msgstr "Los métodos de donación de Liberapay pertenecen al Liberapay: field" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted (dry run)" msgstr "Lista de archivos que se reformatearán (ejecución en seco)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "Locale incluída en la URL de f-droid.org" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" msgstr "Hacer que la construcción se detenga en las excepciones" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." msgstr "Réplicas de repositorio mal formadas." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" msgstr "Línea serverwebroot mal formada:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" msgstr "Se alcanzó el máximo en el archivo ZIP: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Crea un espejo completo del repositorio y del archivo, todos los tipos de fichero." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" msgstr "Falta el directorio de salida" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" msgstr "Moviendo las declaraciones de Anti-Features a los archivos localizados:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "Ni \"repo_pubkey\" ni \"keystorepass\" establecidos en config.yml" #: ../fdroidserver/verify.py #, python-format msgid "No APK for package: %s" msgstr "No existe APK para tal paquete: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "¡No se encontró Android SDK!" #: ../fdroidserver/install.py msgid "No attached devices found" msgstr "No se han encontrado dispositivos asociados" #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "No hay huella digital en la URL." #: ../fdroidserver/common.py msgid "No git submodules available" msgstr "No hay git submodules disponibles" #: ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "No se encontró ningún proyecto gradle. ¿Quizá quiera especificar --subdir?" #: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "No se encontró información." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" msgstr "No se encontraron etiquetas coincidentes" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." msgstr "No se encontró una versión de SDK mínima en {0}, utilizando el valor por defecto (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "No hay necesidad de especificar que la aplicación es software libre" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" msgstr "No hay necesidad de especificar que la aplicación es para Android" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "No hay opción establecida! Edita tu config.yml para establecer al menos una de estas opciones:" #: ../fdroidserver/common.py msgid "No packages specified" msgstr "No se han especificado paquetes" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" msgstr "No hay APK firmado disponible para %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" msgstr "Sin directorio de salida firmado - nada que hacer" #: ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" msgstr "No se ha encontrado ningún certificado de firma en {path}" #: ../fdroidserver/common.py #, python-format msgid "No such package: %s" msgstr "No existe tal paquete: %s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" msgstr "No existe tal versiónCode {versionCode} para app {appid}" #: ../fdroidserver/checkupdates.py msgid "No tags found" msgstr "No se encontró ninguna etiqueta" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" msgstr "No hay directorio sin firma - nada que hacer" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "No es una definición válida del tamaño: \"{}\"" #: ../fdroidserver/signindex.py msgid "Nothing to do" msgstr "Nada que hacer" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." msgstr "Nada que hacer para {appid}." #: ../fdroidserver/init.py msgid "Now set these in config.yml:" msgstr "Ahora establezca lo siguiente en config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" msgstr "OBB tiene una versiónCode({integer}) más nueva que cualquier APK:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" msgstr "El nombre del archivo OBB debe comenzar con \"main.\" o \"patch.\":" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" msgstr "El nombre de paquete de OBB no coincide con un APK soportado:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Maquina desconectada. Saltando la generación del repositorio espejo git hasta`fdroid deploy`" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Sólo PNG y JPEG son compatibles con los gráficos, encontrados: {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Solo imprimir diferencias con el Play Store" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Solo procesar aplicaciones con actualizaciones automáticas" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Los métodos de donación de OpenCollective pertenecen al OpenCollective: field" #: /usr/lib/python3.11/optparse.py msgid "Options" msgstr "Opciones" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Sacar el informe JSON a un fichero nombrado según el APK." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." msgstr "Sacar JSON a stdout." #: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py #: ../fdroidserver/publish.py ../fdroidserver/signindex.py #: ../fdroidserver/update.py msgid "Outputting JSON" msgstr "Sacando JSON" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Licencia general del proyecto." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Sobrescribir versionName vacío en {apkfilename} con el de los metadatos: {version}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "El paquete \"{appid}\" ya existe" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" msgstr "Procesando el manifiesto en '{path}'" #: ../fdroidserver/common.py msgid "Password required with username" msgstr "Se requiere contraseña con el nombre de usuario" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "Ruta al subdirectorio principal del proyecto Android, si no está en la raíz." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" msgstr "Ruta al Android SDK (a veces ubicado en ANDROID_HOME)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" msgstr "Ruta de acceso al reporte git para usarlo como registro" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" msgstr "Ruta al depósito de claves para la clave de firma de repositorio" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Mostrar la variable secreta en el terminal para copiar/pegar fácilmente" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" msgstr "Problema con el archivo ZIP: %s, error %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" msgstr "Problema con xml en '{path}'" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" msgstr "Actualizaciones automáticas de procesos" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" msgstr "Procesando {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" msgstr "Procesando {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" msgstr "Para los ficheros de índice, produce un documento XML/JSON legible por humanos" #: ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "importar desde.URL del proyecto." #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" msgstr "Se debe evitar la puntuación" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" msgstr "Pulse el registro a este repositorio remoto Git" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing binary transparency log to {url}" msgstr "Publicar el registro de transparencia binario en {url}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" msgstr "Empujando a {url}" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" msgstr "Iniciar rápidamente un nuevo repositorio" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" msgstr "Leer todos los archivos de metadatos y salir" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" msgstr "Leyendo '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" msgstr "Falló lectura de packageName/versionCode/versionName, APK inválida: '{apkfilename}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" msgstr "Error al leer packageName/versionCode/versionName,APK inválido: '{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" msgstr "Leyendo {apkfilename} desde caché" #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Removiendo archivos especificados" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" msgstr "Eliminando {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Cambiar el nombre de archivos APK que no coinciden con el formato package.name_123.apk" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" msgstr "El modo de actualización RepoTrunk solo tiene sentido en repositorios git-svn" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." msgstr "Restablecer y crear un nuevo servidor de compilación, incluso si el existente parece estar bien." #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" msgstr "Firmando de nuevo {apkfilename} con el depósito de claves de depuración proporcionado" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" msgstr "Cambiar el tamaño de todos los iconos que exceden el tamaño máximo del pixeles y salir" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" msgstr "Restringir los resultados a advertencias y errores" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Reescribir todos los archivos de metadatos" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" msgstr "Reescribiendo '{appid}'" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" msgstr "Ejecutar en repositorio git con cambios pendientes" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Ejecutar rewritemeta para arreglar el formato" #: ../fdroidserver/deploy.py msgid "Running first pass with MD5 checking disabled" msgstr "Ejecutando la primera iteración con la comprobación de MD5 deshabilitada" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" msgstr "Ejecutando wget en {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" msgstr "¡El SHA-256 de {url} no coincide con la entrada!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Escaneando los APK(s) resultantes en busca de clases no libres conocidas." #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" msgstr "Escanear el código fuente de un paquete" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {apk}" msgstr "El escáner encontró {count} problemas en {apk}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" msgstr "El escáner encontró {count} problemas en {appid}:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" msgstr "El escáner encontró {count} problemas en {appid}:{versionCode}:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "El escáner encontró {} problema" msgstr[1] "El escáner encontró {} problemas" #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "Escaneo del APK con dexdump para clases no gratuitas conocidas." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" msgstr "Configurar el NDK de {release} ({version}) arriba" #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Ajustar el reloj a esa hora usando:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" msgstr "Establecer la cantidad máxima de lanzamientos antes de que los anteriores sean archivados" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" msgstr "Establecer el límite de ficheros abiertos a {integer}" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" msgstr "Configurar una compilación de app para un repositorio de compilación nocturna" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " msgstr "Configuración fallida de límite de apertura de archivo: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" msgstr "Estableciendo un máximo de {0} segundos para esta compilación" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Firmar y colocar paquetes en el repositorio" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" msgstr "Firmar los índices creados usando update --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" msgstr "Omitir el escaneo del código fuente por problemas binarios u otros problemas" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "¡Ignorando '{apkfilename}' por firma no válida!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" msgstr "¡Saltando el mirror de GitLab Pages porque el repositorio es demasiado grande (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" msgstr "Saltando la generación de índices para {appid}" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" msgstr "¡Ignorando {apkfilename} por firma no válida!" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" msgstr "Saltando {appid}: desactivado" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" msgstr "Especifique una carpeta local para sincronizar el" #: ../fdroidserver/deploy.py msgid "Specify an identity file to provide to SSH for rsyncing" msgstr "Especifique un fichero de identidad que ofrezca SSH para rsync" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." msgstr "Especifique qué fichero de almacenamiento de claves usar para depuración." #: ../fdroidserver/common.py msgid "Spew out even more information than normal" msgstr "Diseminar más información de lo normal" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" msgstr "Quitando firma misteriosa de {apkfilename}" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" msgstr "Resúmen '%s' es sólo el nombre de la app" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" msgstr "El resumen de longitud {length} supera el límite de {limit} caracteres" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" msgstr "¡El fecha del sistema es anterior a la de {path}!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" msgstr "El modo de actualización de etiquetas actualmente solo funciona para repositorios de git, hg, bzr y git-svn" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "El modo de actualización de etiquetas se utilizó en git-svn, pero el repositorio no se configuró con etiquetas" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Modo de prueba: ponga la salida solo en el directorio tmp y siga desarrollando, incluso si la salida ya existe." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" msgstr "El código de versión OBB tiene que venir tras \"{name}.\":" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" msgstr "El URL base para el registro del repositorio (por defecto: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" msgstr "El directorio al que escribir el espejo" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" msgstr "El fichero a incluír en el repositorio (ruta o glob)" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." msgstr "La huella digital del repositorio no coincide." #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" msgstr "¡El directorio raíz para local_copy_dir \"{path}\" no existe!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" msgstr "Hay una colisión de keyalias - publicación detenida" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." msgstr "Estas son aplicaciones del repositorio principal que se han archivado." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Este es un repositorio de aplicaciones para usar con F-Droid. Las aplicaciones en este repositorio son binarios oficiales construidos por los desarrolladores originales de la aplicación, o son binarios creados a partir de su código fuente por f-droid.org utilizando las herramientas de https://gitlab.com/fdroid." #: ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Este repo ya tiene metadatos locales: %s" #: ../fdroidserver/init.py #, python-format msgid "" "To complete the setup, add your APKs to \"%s\"\n" "then run \"fdroid update -c; fdroid update\". You might also want to edit\n" "\"config.yml\" to set the URL, repo name, and more. You should also set up\n" "a signing key (a temporary one might have been automatically generated).\n" "\n" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" "Para completar la configuración, añade tus APKs a \"%s\"\n" "después ejecuta \"fdroid update -c; fdroid update\". Puede que también quieras editar \"config.yml\" \n" "para especificar la URL, el nombre del repositorio, y más. También debes de configurar una \n" "llave de firmado (puede que se haya generrado automáticamente una temporal).\n" "\n" "ara más información: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "y https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "¡Para usar awsbucket hay que configurar también awssecretkey y awsaccesskeyid en config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "La URL debe comenzar con https:// o http://" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" msgstr "Acortadores de URL no deben ser utilizados" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" msgstr "URL {url} en Descripción: {error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" msgstr "¡Etiqueta de licencia inesperada \"{}\"! Use solo etiquetas aprobadas por FSF u OSI de https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "¡Etiqueta de licencia inesperada \"{}\"! Use solo etiquetas de licencia configuradas en su archivo de configuración" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" msgstr "Destino del enlace simbólico inesperado: {link} ->{target}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" msgstr "Entrada desconocida {key} en {configname}" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "¡Se encontró una excepción desconocida!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" msgstr "Fichero '{filename}' desconocido en compilación '{versionName}'" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" msgstr "Formato de metadatos desconocido: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" msgstr "Formato de metadatos desconocido: {path} (use: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " msgstr "Versión desconocida de aapt, podría causar problemas: " #: ../fdroidserver/lint.py msgid "Unnecessary leading space" msgstr "Espacio innecesario al principio" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" msgstr "Espacio innecesario al final" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" msgstr "Campo de app '{fieldname}' desconocido en '{path}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Flag de compilación '{build_flag}' desconocido en '{path}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" msgstr "Tipo de fichero \"{extension}\" no soportado para gráfico de repositorio" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" msgstr "Fichero de gráficos no soportado: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" msgstr "Extlib no utilizada en %s" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" msgstr "Fichero no utilizado en %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" msgstr "Ruta scandelete sin uso: %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" msgstr "Ruta scanignore sin uso: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" msgstr "Descomprimiendo a %s" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Actualizar la información del repositorio para nuevos paquetes" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" msgstr "Actualizar el registro de transparencia binario para una URL" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData tiene una URL no válida: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" msgstr "UpdateCheckData debe coincidir con el código de la versión como entero (\\d o [0-9]): {codeex}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" msgstr "UpdateCheckData tiene que usar una URL HTTPS: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData tiene una URL no válida: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode está configurado pero parece que aún no se han ejecutado las actualizaciones." #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName está configurado con el ID de la aplicación conocida, se puede eliminar" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" msgstr "Subiendo {apkfilename} a androidobservatory.org" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" msgstr "Subiendo {apkfilename} a virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "Usage" msgstr "Utilización" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Uso: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Use /HEAD en vez de /master para apuntar a un fichero en la rama por omisión" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Use `fdroid update -c` para crearlo." #: ../fdroidserver/build.py msgid "Use build server" msgstr "Use un servidor de compilación" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" msgstr "Use la fecha del APK en vez de la fecha actual para los nuevos APK añadidos" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." msgstr "Usando \"{path}\" para configurar s3cmd." #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "Utilizando Firma APK v2" #: ../fdroidserver/common.py msgid "Using APK Signature v3" msgstr "Utilizando firma APK v3" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "¡Usando jarsigner de Java. No recomendado para verificar APKs! Use apksigner" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" msgstr "Usando androguard de \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" msgstr "¡Usando un diccionario en blanco en lugar del contenido de la {path}!" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" msgstr "Usando almacén de claves existente \"{path}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" msgstr "Usando s3cmd para sincronizar con: {url}" #: ../fdroidserver/__main__.py msgid "Valid commands are:" msgstr "Los comandos válidos son:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." msgstr "Verificar una copia en caché local en vez de volver a descargar." #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" msgstr "Verificar la integridad de los paquetes descargados" #: ../fdroidserver/index.py msgid "Verifying index signature:" msgstr "Verificar el índice de la firma:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "La clave de API de VirusTotal no puede subir archivos mayores de 32MB. Use {url} para subir {path}." #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Alertar sobre posibles errores de metadatos" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Cuando está configurado para índices firmados, crear solo índices sin signo en esta etapa" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "Cuando se limpia el repositorio completo yamllint está deshabilitado por defecto. Esta opción fuerza yamllint a pesar de todo." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Nombre Distintivo' (DN) usado al generar claves" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" msgstr "Puede usar ANDROID_HOME para definir la ruta a su SDK, p.ej.:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" msgstr "Archivo de ficheros ZIP" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" msgstr "añadiendo IdentityFile a {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" msgstr "añadiendo a {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opción ambigua: %(option)s podría corresponderse con %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "opción ambigua: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "¡No se encontró apksigner! No se pueden firmar o verificar los APKs modernos" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "¡Se requiere apksigner para firmar pero no se encontró!" #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "identificador de aplicación del fichero en el que operar" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" msgstr "identificador de aplicación con código de versión opcional en la forma APPID[: VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" msgstr "El archive_url debe terminar con /archive" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "argumento \"-\" con modo %r" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" msgstr "argumento %(argument_name)s: %(message)s" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" msgstr "intentando conexión SSH pura para probar la llave de despliegue:" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" msgstr "no se puede procesar (no es una cadena) la especificación scrlib: '{}'" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "no se puede abrir '%(filename)s': %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" msgstr "no se puede abrir una url que no sea https: '{};" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" msgstr "no se encuentran las srclibs requeridas: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "no se puede tener varios argumentos de subparser" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "no se pueden fundir acciones - 2 grupos se llaman %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" msgstr "no se puede publicar actualización. ¿Estableció Ud. la clave de despliegue?" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" msgstr "clonando {url}" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" msgstr "órdenes de módulos de extensión (plugins):" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" msgstr "complejo" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "cadena de opción conflictiva: %s" msgstr[1] "cadenas de opción conflictivas: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser alias: %s" msgstr "Alias de los subanalizadores en el conflicto:%s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser: %s" msgstr "subanalizador del conflictivo:%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" msgstr "no se pudo procesar '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "no se pudo procesar especificación srclib (sin especificar ref): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" msgstr "no se pudo procesar especificación srclib (demasiadas arrobas '@'): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" msgstr "{path} creado" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" msgstr "la versión actual es más nueva: código de versión viejo={old}, código de versión nuevo={new}" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" msgstr "eliminando: repo/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" msgstr "registro de proceso {path} desplegado en '{dest}'" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "las opciones como %r requieren dest =" #: ../fdroidserver/scanner.py msgid "downloading '{}'" msgstr "Descargando '{}'" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" msgstr "la descarga del escaneo de la firma para '{}' falló" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" msgstr "binario ejecutable, posiblemente código" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "argumento inesperado %s" msgstr[1] "argumentos inesperados %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "se esperaba al menos 1 argumento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "no se esperaba más de 1 argumento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "se esperaba 1 argumento" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--help|--version|]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" msgstr "obtener la última versión de las firmas de la web" #: /usr/lib/python3.11/optparse.py msgid "floating-point" msgstr "punto flotante" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "forzar que los errores en metadatos sean avisos, o que se ignoren (valor predeterminado: errores)." #: ../fdroidserver/common.py msgid "git svn clone failed" msgstr "falló git svn clone" #: ../fdroidserver/scanner.py msgid "gzip file archive" msgstr "archivo de ficheros gzip" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "argumento explícito %r ignorado" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "¡index-v1 tiene que tener una firma, use `fdroid signindex` para crearla!" #: ../fdroidserver/index.py msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 debe tener una firma, ¡ use `f droid signindex` para crearla!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" msgstr "entero" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valor inválido de tipo %(type)s: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "opción no válida: %(value)r (escoja de entre %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valor para conflict_resolution no válido: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "cadena de opciones %(option)r no válida: tiene que comenzar por un carácter %(prefix_chars)r" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" msgstr "ipfs_cid no encontrado, omitiendo la generación de CIDv1" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" msgstr "la última receta de empaquetado es más nueva: vercode={old}, nuevo vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "local_copy_dir no termina en \"fdroid\", tal vez quisiste decir: \"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" msgstr "¡local_copy_dir tiene que ser una ruta absoluta!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" msgstr "¡local_copy_dir tiene que ser un directorio, no un fichero!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" msgstr "¡el espejo '%s' no termina en 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "los argumentos mutuamente exclusivos tienen que ser opcionales" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" msgstr "la próxima actualización de la caché de {name} tendrá lugar después de {time}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" msgstr "{appid} sin \"icono\"" #: ../fdroidserver/signatures.py msgid "no APK supplied" msgstr "no se ha indicado APK" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" msgstr "no hay tal opción: %s" #: ../fdroidserver/__main__.py msgid "no version info found!" msgstr "¡no se encontró información de la versión!" #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "no se encontró información de la versión" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "no permitido con el argumento %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "se necesita 1 de los argumentos %s" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" msgstr "solo acepta cadenas, listas, y tuplas" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "opción %s: Si de verdad quiere instalar todas las apps firmadas use --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "opción %s: valor de %s no válido: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "opción %s: selección no válida: %r (elija de entre %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" msgstr "opción -%s no reconocida" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" msgstr "opción -%s requiere un argumento" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "opción --%s no puede llevar argumento" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "opción --%s no es un prefijo único" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" msgstr "opción --%s no reconocida" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s requires argument" msgstr "opción --%s requiere un argumento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "argumentos opcionales" #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "opciones" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" msgstr "sobrescribiendo {path} existente" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "argumentos posicionales" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" msgstr "¡Falló el despliegue del registro de proceso {path} en {dest}!" #: ../fdroidserver/build.py msgid "reference binary missing signature" msgstr "falta la firma del archivo binario de referencia" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" msgstr "rechazar descarga por conexión HTTP insegura (use HTTPS o especifique --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." msgstr "repo_icon \"repo/icons/%s\" no existe, generando placeholder." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" msgstr "repo_url debe terminar con /repo" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml no instalado. No se pueden escribir metadatos." #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sync indexa {path} a {url} y elimina" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "¡El escaner de la cache está mal realizado! Puedes borrarlo con: '{clear}'" #: ../fdroidserver/scanner.py msgid "shared library" msgstr "biblioteca compartida" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" msgstr "mostrar el número de versión del programa y salir" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" msgstr "mostrar este mensaje de ayuda y salir" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." msgstr "APK firmado, o una ruta a fichero o una URL HTTPS." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" msgstr "saltar el despliegue de registros de compilación completos: el registro está vacío" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" msgstr "saltar el despliegue de registros de compilación completos: no está activado en la configuración" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" msgstr "ignorando tarball de fuentes: {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" msgstr "a scrlibs le falta el nombre y/o @" #: ../fdroidserver/scanner.py msgid "static library" msgstr "biblioteca estática" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" msgstr "el archivo binario de referencia ha proporcionado autorización al firmante {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "se requieren los siguientes argumentos: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "cadena de opción inesperada: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "parser '%(parser_name)r' desconocido. (Opciones válidas: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "argumentos no reconocidos: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "permisos inseguros en '{config_file}' (¡debería ser 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "uso: " #: ../fdroidserver/deploy.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" msgstr "usando Apache libcloud para sincronizar con {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com está limitando el consumo, esperando para reintentar..." #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" msgstr[0] "{0} aplicación, {1} alias de clave" msgstr[1] "{0} aplicaciones, {1} alias de clave" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" msgstr "¡{apkfilename} ({appid}) no tiene metadatos!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" msgstr "¡{apkfilename} tiene multiples ficheros {name}, parece un exploit de clave maestra!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "El AndroidManifest.xml de {apkfilename} tiene la fecha mal: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "¡{appid} no tiene nombre! Usando su identificador." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" msgstr "¡{appid} de {path} no es un identificador (ID) de aplicación Android válido!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "¡{appid} de {path} no es un nombre de paquete Java válido!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" msgstr "{appid} tiene tanto APKs como archivos: {files}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" msgstr "{appid} no tiene {name}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" msgstr "{appid}: extlib {path} desconocido en la compilación '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" msgstr "{appid}: no se ha especificado compilación, ejecutando sobre el estado actual del código fuente" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" msgstr "¡{appid}: {field} tiene que ser un '{type}' pero es un '{fieldtype}!'" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" msgstr "¡{appid}: {field} tiene que ser un '{type}' pero es un '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} tiene que ser un entero pero se ha encontrado: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be list or string, found: {value}" msgstr "{build_flag} debe ser una lista o una cadena, encontrada: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" msgstr "¡{file} está vacío o corrupto!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "¡{name} \"{section}/icons/{path}\" no existe! Corrijalo en config.yml." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} está obsoleto, use {newfile}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "¡{path} ya existe, ignorando resultados de importaciones!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" msgstr "¡{path} no existe! Créela ejecutando:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "¡{path} tiene una firma de fichero \"{pattern}\" mala, posible exploit Janus!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" msgstr "¡{path} está vacío!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} mayor de 200MB, subir manualmente: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "¡{url} no termina en \"fdroid\", verifique la URL!" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "¡{url} no empieza por \"http\"!" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" msgstr[0] "compilación fallida {}" msgstr[1] "compilaciones fallidas {}" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "compilación con éxito {}" msgstr[1] "compilaciones con éxito {}" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/locale/fr/0000755000175000017500000000000014620351546014656 5ustar00hanshans././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.888382 fdroidserver-2.3a1/locale/fr/LC_MESSAGES/0000755000175000017500000000000014620351546016443 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/locale/fr/LC_MESSAGES/fdroidserver.po0000644000175000017500000030121414620351225021474 0ustar00hanshans# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # Julien Gontier , 2020. # anonymous , 2020. # Hans-Christoph Steiner , 2020, 2021, 2024. # Jeannette L , 2020. # Nathan , 2020. # Virgile L. , 2020. # Lucas Brizzi , 2020. # Jose , 2020. # DGO , 2020, 2021. # Yannick A. , 2020. # Renaud Perrai , 2020. # rational , 2020. # Coucouf , 2020. # Alexandre Hô , 2020. # Yldun , 2020. # Renaud Perrai , 2020. # Éfrit , 2021. # hilariousperson , 2021. # Madeorsk , 2021. # Adrien le Maire , 2021. # gub , 2021, 2023. # ButterflyOfFire , 2021, 2022, 2023. # Vincent Finance , 2021. # Gavy , 2021. # lilim , 2021. # Jaxom , 2021. # booteille , 2021, 2022. # translator , 2021. # translator , 2022. # Julien Maulny , 2022. # Translator , 2022, 2023. # Ldm Public , 2022, 2023. # TopFox , 2022. # John Donne , 2022, 2023. # Deleted User , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" "\n" "Clé SSH publique à utiliser comme clé de déploiement :" #: ../fdroidserver/nightly.py #, python-brace-format msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" "\n" "{path} encodé pour la variable secrète DEBUG_KEYSTORE :" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" n'a pas de fichier de métadonnées correspondant !" #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" msgstr "Le dossier racine pour « local_copy_dir » {path} n’existe pas !" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "«{apkfilename}» est déjà installé sur {dev}." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" msgstr "\"{path}\" contient {name} obsolète ({version})" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" msgstr "\"{path}\" contient le récent {name} ({version})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" msgstr "\"{path}\" existe mais s3cmd n'est pas installé !" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" msgstr "Le format du ficher \"{path}\" n'est pas supporté (utiliser : metadata/*.yml)" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "\"{path}\" est signé par une clé qui n'est pas autorisée :" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" n'est pas une URL valide !" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" msgstr[0] "L'option %(option)s requiert %(number)d argument" msgstr[1] "L'option %(option)s requiert %(number)d arguments" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s : erreur : %(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" msgstr "%d problèmes trouvés" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "%prog [options]" msgstr "%prog [options]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" msgstr "%r n’est pas appelable" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" msgstr "%s ne produit pas de dict !" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" msgstr "%s a un mauvais SHA-256 : %s" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" msgstr "%s n'est pas un champ de construction acceptable" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" msgstr "l'option %s ne prend pas de valeur" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' non trouvé dans config.yml !" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' n'est pas utilisé et 'smartcardoptions' est vide !" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "'keystore' non trouvé dans config.yml !" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' non trouvé dans config.yml !" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' non trouvé dans config.yml !" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' est invalide comme argument positionnel" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" msgstr "'sdk_path' n'est pas configuré dans 'config.yml' !" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' est obsolète, fdroid requiert build-tools-{version} ou plus !" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" msgstr "'{field}' sera ordonné aléatoirement ! Utilisez des parenthèses () ou des crochets [] si l'ordre est important !" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" msgstr "'{path}' n'a pas pu être exécuté !" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "Le format de '{path}' est incorrect, il devrait s'agir d’un dictionnaire !" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' n'est pas un(e) {field} valide dans {appid}. Motif regex : {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' n'est pas un(e) {field} valide et devrait être {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" msgstr "...checkupdate a échoué pour {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() n'est pas défini" #: ../fdroidserver/lint.py msgid "/issues is missing" msgstr "/issues est manquant" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" msgstr "Une URL est requise en argument !" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Ajouter des signatures PGP avec GnuPG pour les paquets dans le dépôt" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" msgstr "Ajout d'une clé de signature de dépôt à un dépôt non signé" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" msgstr "Créer les métadonnées de base manquantes pour les APKs qui n'en sont pas pourvus" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" msgstr "Ajout d'un nouveau dépôt pour seulement {name}" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" msgstr "Alias de la clé de signature du dépôt dans le trousseau" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" msgstr "AllowedAPKSigningKeys est manquante mais des références binaires sont indiquées" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Autoriser une version différente (ou branche git) a être spécifiée pour l'import initial" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" msgstr "Faire aussi un miroir de la section d'archive complète" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" msgstr "Alerter aussi à propos des problèmes de formatage, comme rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" msgstr "Bibliothèque Android AAR" #: ../fdroidserver/scanner.py msgid "Android APK file" msgstr "Fichier Android APK" #: ../fdroidserver/scanner.py msgid "Android DEX code" msgstr "Code Android DEX" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" msgstr "SDK Android introuvable dans {path} !" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" msgstr "Le SDK Android '{path}' n’existe pas !" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" msgstr "Le chemin du SDK Android '{path}' n'est pas un dossier !" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" msgstr "L'outil SDK Android {cmd} n'a pas été trouvé !" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "L’application possède des fichiers binaires mais n'a pas les AllowedAPKSigningKeys correspondantes pour épingler le certificat." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "L'application a NoSourceSince ou ArchivePolicy « 0 version » mais AutoUpdateMode ou UpdateCheckMode ne valent pas None" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" msgstr "L'application est dans '{repo}' mais a un lien vers {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "Des versions de l’application possède des fichiers binaires mais n'ont pas les AllowedAPKSigningKeys correspondantes pour épingler le certificat." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Il n'est pas nécessaire d'ajouter .git" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" msgstr "Archivage de {apkfilename} avec une signature invalide !" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode avec UpdateCheckMode : HTTP doit avoir un modèle." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" msgstr "Mauvais type d'entrée \"{mirrortype}\" dans le paramétrage des miroirs : {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "URL de base à mirorer, peut inclure la clef de signature d'index à l'aide de la chaîne de requête : ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" msgstr "Branche « {branch} » utilisée comme commit dans le build « {versionName} »" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" msgstr "Branche '{branch}' utilisée comme commit dans srclib '{srclib}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" msgstr "Lien symbolique cassé : {path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" msgstr "Construire un paquet depuis les sources" #: ../fdroidserver/build.py msgid "Build all applications available" msgstr "Compiler toutes les applications disponibles" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" msgstr "Build généré par `fdroid import` — supprimer la ligne désactivée une fois prêt" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" msgstr "Le dépôt git des métadonnées de build a des changements non sauvegardés !" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" msgstr "Compiler uniquement la dernière version de chaque paquet" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" msgstr "Dépôt du build basé sur \"%s\" avec cette config :" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" msgstr "Impossible de mettre à jour l'application automatiquement sans \"CurrentVersionCode\"" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "Build impossible à cause de l'erreur lors de l'analyse" msgstr[1] "Build impossible à cause des {} erreurs lors de l'analyse" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" msgstr "Impossible d'écrire sur \"{path}\"" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "Catégories « %s » invalides" #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "Catégories non définies" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Vérifier les mises à jour pour les applications" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Vérification de l'archivage pour {appid} — apks : {integer}, keepversions : {keep}, archapks : {arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Mise à jour propre — n'utilise pas les caches, traite à nouveau tous les APKs" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Liste de catégories séparées par des virgules." #: ../fdroidserver/__main__.py #, python-format msgid "Command '%s' not recognised.\n" msgstr "La commande '%s' n'est pas reconnue.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" msgstr "Sauvegarder les changements (commit)" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" msgstr "Conflit des définitions « {field} » entre les fichiers .yml et ceux traduits :" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Conflit d'arguments : '--verbose' et '--quiet' ne peuvent être choisis en même temps." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" msgstr "Conflit de fichiers de configuration ! Utilisation de {newfile}, ignorant {oldfile} !" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "Impossible de trouver '{command}' sur votre système" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Impossible de trouver la dernière version du code" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Impossible de trouver le nom de la dernière version" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" msgstr "Chemin {path} introuvable pour sa suppression" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " msgstr "Impossible d'ouvrir le fichier APK {path} pour analyse : " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Impossible de récupérer la taille \"{size}\", mauvais type \"{type}\"" #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Impossible de trouver l'ID de l'application" #: ../fdroidserver/checkupdates.py msgid "Couldn't find any version information" msgstr "Impossible de trouver des informations sur la version" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "Impossible de trouver l'ID du paquet" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" msgstr "Je refuse de remplacer la configuration existante des clés de signature !" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" msgstr "Nouveau container « {name} » créé" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Création de « {path} » pour configurer s3cmd." #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Création du répertoire des logs" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" msgstr "Création d'un nouveau bucket S3 : {url}" #: ../fdroidserver/publish.py msgid "Creating output directory" msgstr "Création du répertoire de sortie" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" msgstr "Création d'un index signé avec la clé (SHA256) :" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" msgstr "Création du répertoire temporaire" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" msgstr "Création d'un index non signé pour préparer la signature" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" msgstr "Le code de la version actuel {cv} est moins récent que la dernier build {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" msgstr "DEBUG_KEYSTORE n'est pas définie ou sa valeur est incomplète" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" msgstr "Supprimer les APK et/ou OBB sans métadonnées dans le dépôt" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" msgstr "Suppression de l'archive en cours, le dépôt occupe trop de place ({size} max {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" msgstr "Suppression de l'historique de git-mirror, car le dépôt occupe trop de place ({size} max {limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" msgstr "Suppression d'un fichier inconnu : {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" msgstr "Description de '%s' n'est qu'un résumé de l'application" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" msgstr "Ligne dupliquée dans la description" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" msgstr "La description contient une liste (%s) mais ce n'est ni une liste à puces (*) ni une liste numérotée (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" msgstr "La longueur de la description {length} dépasser la limite du nombre de caractères autorisés {limit}" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Ne pas ajouter \"disable:\" aux entrées générées" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" msgstr "Ne pas déployer les nouveaux fichiers dans le dépôt" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" msgstr "Ne pas inclure « {path} » dans l'URL !" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" msgstr "Ne pas demander le chemin vers le SDK Android, juste abandonner (fail)" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" msgstr "Ne pas supprimer les clés privées générées par le keystore" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" msgstr "Ne pas créer un tarball avec les sources, utile pour tester un build" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" msgstr "Ne pas rafraîchir le dépôt, utile pour tester un build sans connexion internet" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" msgstr "Ne pas utiliser les sommes de contrôle rsync" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Télécharger une image complète des petits dépôts" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" msgstr "Téléchargement de %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Le téléchargement du référentiel a déjà échoué une fois, ne pas réessayer." #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" msgstr "Échec lors du téléchargement de {url}. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" msgstr "La double déclaration d'une antifonction dans {path} a été ignorée !" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" msgstr "Entrée doublon \"%s\" dans le paramétrage des miroirs !" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" msgstr "Lien dupliqué dans « {field} » : {url}" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ERREUR : La sous-commande \"server\" a été supprimée, utilisez plutôt \"deploy\" !" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" "ERREUR : cette commande ne devrait jamais être utilisée pour copier f-droid.org !\n" "Une copie de f-droid.org occupe plus de 200GB." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERREUR : type de CI non supporté, les corrections sont bienvenues !" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "ERREUR : hébergeur git « %s » non supporté, les corrections sont les bienvenues !" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." msgstr "L'encodage est mis sur '{enc}', FDroid peut rencontrer des problèmes d'encodage. Merci de le mettre sur 'UTF-8' pour de meilleurs résultats." #: ../fdroidserver/init.py #, python-format msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" "Entrez le chemin du SDK Android (%s1) :\n" "> " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" msgstr "La variable d'environnent {var} de {configname} n'est pas configurée !" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Erreur lors de l'obtention de l'adresse du dépôt" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" msgstr "Quitter avec un code différent de zéro si des problèmes ont été détectés" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Extraire les métadonnées de l'application depuis un dépôt source" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Extraction des signatures à partir des APKs" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" msgstr "Erreur durant la copie de {path} : {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" msgstr "Erreur lors de l'extraction des signatures pour '{apkfilename}' : {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" msgstr "Erreur de lecture {path} : {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" msgstr "Impossible de redimensionner {path} : {error}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" msgstr "La création du S3 Bucket a échoué : {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" msgstr "Impossible d'obtenir les informations de l'APK, suppression {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" msgstr "Échoument lors de la récupération des informations de l'APK, saut de {path}" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" msgstr "Échec de l’obtention de l’empreinte de la clé de signature de l’APK" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" msgstr "Impossible d'installer « {apkfilename} » sur {dev} : {error}" #: ../fdroidserver/common.py msgid "Failed to sign application" msgstr "Erreur lors de la signature de l'application" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" msgstr "Récupération de l'ID du serveur de construction depuis la VM : {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" msgstr "Récupération de la signature pour '{apkfilename}' -> '{sigdir}'" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" msgstr "Le fichier a été supprimé au cours du traitement : {path}" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py #: ../fdroidserver/update.py msgid "Finished" msgstr "Terminé" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" msgstr "Les informations de dons via Flattr doivent être renseignées dans le champ FlattrID:" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Balises HTML interdites" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." msgstr "Forcer la construction des application désactiver, et opérateur indépendament au scan des problèmes. Seulement autoriser en mode de test." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" msgstr "Arrêt forcer de la construction après {0} secondes de délai d'attente !" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." msgstr "Forcer le scan d'applications et versions désactivées." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" msgstr "« {path} » graphique trouvée sans métadonnées pour l'application « {name} » !" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "Mauvais fichier de financement « {path} » trouvé pour « {name} » :" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" msgstr "Appids invalide trouvée dans l'argument" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "Code de version invalide trouvée pour certaines application" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Plusieurs fichiers de bloc de signature JAR trouvé à {path}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" msgstr "De multiples fichiers de métadonnées ont été trouvés pour {appid}" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." msgstr "Plusieurs certificats de signature ont étés trouvés pour le référentiel." #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." msgstr "Aucun certificat signée trouvée dans le dépot." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" msgstr "Aucun fichier trouvée a %s" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" msgstr "{apkfilename} trouvé à {url}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} problems in {filename}" msgstr "{count} problèmes détectés dans {filename}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" msgstr "{count} avertissements détectés dans {filename}" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" msgstr "Créer les métadonnées de base manquantes pour {appid}" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" msgstr "Vérification échouée du Git a '%s'" #: ../fdroidserver/common.py msgid "Git clean failed" msgstr "Nettoyage du Git échoué" #: ../fdroidserver/common.py msgid "Git fetch failed" msgstr "Recherche du Git échouée" #: ../fdroidserver/common.py msgid "Git prune failed" msgstr "Git prune a échoué" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Impossible de définir la branche par défaut du Git distant : \"%s\"" #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Reset de Git échouée" #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Synchronisation du submodule Git échoué" #: ../fdroidserver/common.py msgid "Git submodule update failed" msgstr "Échec de la mise à jour du sous-module Git" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" msgstr "HTTPS doit être utilisé avec les URL de Subversion !" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" msgstr "Si un miroir git prend trop de place, permet à l'archive d'être supprimé" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" msgstr "Si ce téléversement échoue, tente de le téléverser manuellement vers {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." msgstr "Ignore '{field}' dans les métadonnées '{metapath}' parce que c'est déprécié." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "Ignorer l'entrée FUNDING.yml supérieure à 2048 : %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" msgstr "Un mauvais élément du manifest est ignoré : %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Paquet sans métadonnées ignoré : " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" msgstr "Ignorer les données de cache périmées pour {apkfilename}" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" msgstr "Inclure des fichiers APK signés avec algorithmes désactivés comme MD5" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" msgstr "Inclure au miroir les fichiers .asc de signature PGP" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" msgstr "Inclure les journaux de construction dans le miroir" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" msgstr "Inclure au miroir les tarballs de source" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" msgstr "Inclure les métadonnées de %s@%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" msgstr "Inclure les métadonnées de {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Initialisation des sous-modules" #: ../fdroidserver/install.py msgid "Install all signed applications available" msgstr "Installer toutes les applications signées disponibles" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" msgstr "Installer les paquets compilés sur le(s) périphérique(s)" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." msgstr "Installation de %s …" #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." msgstr "Installation de '{apkfilename}' sur {dev}…" #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" msgstr "Interagir avec le serveur HTTP du dépôt" #: ../fdroidserver/update.py msgid "Invalid APK" msgstr "APK invalide" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" msgstr "AutoUpdateMode non valide : {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" msgstr "UpdateCheckMode non valide : {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" msgstr "VercodeOperation non valide : {field}" #: ../fdroidserver/lint.py #, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "VercodeOperation non valide : {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "ID de l'application invalide {appid}" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" msgstr "Booléen '%s' non valide" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Liste à puces non valide" #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" msgstr "Nom non valide pour le fichier publié :%s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" msgstr "Ndk non valide : entrée dans le build : « {ndk} »" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " msgstr "Redirection non valide vers non-HTTPS : {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" msgstr "Métadonnée de scrlib invalide : '{file}' n'existe pas" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" msgstr "Métadonnée de scrlib invalide : '{file}' ne peut être analysé" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" msgstr "Métadonnée de scrlib invalide : la clé '{key}' est inconnue dans '{file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" msgstr "La signature JAR n'a pas pu vérifier :{path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" msgstr "Signature JAR vérifiée : {path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" msgstr "Fichier Java JAR" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" msgstr "Java JDK introuvable ! Installez dans un emplacement standard ou définissez java_paths !" #: ../fdroidserver/scanner.py msgid "Java compiled class" msgstr "Classe Java compilée" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" msgstr "Java jarsigner introuvable ! Installez dans un emplacement standard ou définissez java_paths !" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" msgstr "Attributs Javascript trouvée dans HTML src" #: ../fdroidserver/build.py #, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" msgstr "Conserver la version ayant échoué « {apkfilename} »" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Stockage des clés signée :\t" #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" msgstr "Le dernier commit utilisé '{commit}' ressemble a une balise, mais le UpdateCheckMode est '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" msgstr "Les méthodes de don via Liberapay font partie de Liberapay : field" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted (dry run)" msgstr "Lister les fichiers qui seront reformater (test à blanc)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "Les paramètres de lieu sont inclus dans f-droid.org URL" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" msgstr "Faire la construction s'arrèter si exceptions" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." msgstr "Mirroirs de dépot malformée." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" msgstr "serverwebroot malformer en ligne :" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" msgstr "Profondeur maximale de récursivité dans le fichier ZIP atteinte : %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Cloner entièrement le repo et les archives, tous les fichiers." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" msgstr "Répertoire de destination manquant" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" msgstr "Déplacement des déclarations des antifonctions vers les fichiers de traduction :" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "Ni « repo_pubkey », ni « keystorepass » ne sont définis dans config.yml" #: ../fdroidserver/verify.py #, python-format msgid "No APK for package: %s" msgstr "Aucun APK pour le paquet : %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Aucun SDK Android trouvée !" #: ../fdroidserver/install.py msgid "No attached devices found" msgstr "Aucun périphérique connecté trouvé" #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Aucune empreinte dans l'URL." #: ../fdroidserver/common.py msgid "No git submodules available" msgstr "Aucun sous-module git disponible" #: ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "Aucun projet gradle n'a pu être trouvé. Spécifier --subdir ?" #: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Aucune information trouvée." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" msgstr "Aucune étiquette correspondante n’a été trouvée" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." msgstr "Aucune version minimale du SDK trouvée dans {0}, utilisation de la valeur par défaut (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Pas besoin de spécifier que l'application est un logiciel libre" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" msgstr "Pas besoin de spécifier que l'application est pour Android" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "Aucune option configurée ! Éditez votre config.yml pour définir au moins l'une d'entre elles :" #: ../fdroidserver/common.py msgid "No packages specified" msgstr "Aucun paquet spécifié" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" msgstr "Aucun APK signé disponible pour %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" msgstr "Aucun répertoire de sortie signé — il n'y a rien à faire" #: ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" msgstr "Aucun certificat signé trouvé dans {path}" #: ../fdroidserver/common.py #, python-format msgid "No such package: %s" msgstr "Ce paquet n'existe pas : %s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" msgstr "Aucun code de version {versionCode} pour l'application {appid}" #: ../fdroidserver/checkupdates.py msgid "No tags found" msgstr "Aucune étiquette trouvée" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" msgstr "Aucun dossier non signé — il n'y a rien à faire" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Définition de la taille invalide : \"{}\"" #: ../fdroidserver/signindex.py msgid "Nothing to do" msgstr "Rien à faire" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." msgstr "Rien à faire pour {appid}." #: ../fdroidserver/init.py msgid "Now set these in config.yml:" msgstr "Maintenant, définissez-les dans config.yml :" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" msgstr "Le fichier OBB a un code de version plus récent ({integer}) que n'importe quel APK :" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" msgstr "Le nom de fichier OBB doit commencer par «principal». ou \"patch\" :" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" msgstr "Le nom de paquet d'OBB ne correspond pas à un fichier APK pris en charge :" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Machine hors-ligne, la génération du miroir git est sautée jusqu'à `fdroid deploy`" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Seuls les formats PNG et JPEG sont pris en charge pour les graphiques, trouvés : {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Afficher uniquement les différences avec le Play Store" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Traiter uniquement les applications ayant des mises à jour automatiques" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Les méthodes de donation OpenCollective vont dans le champ OpenCollective:" #: /usr/lib/python3.11/optparse.py msgid "Options" msgstr "Options" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Générez un rapport JSON dans un fichier nommé d'après l'APK." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." msgstr "Sortie JSON vers stdout." #: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py #: ../fdroidserver/publish.py ../fdroidserver/signindex.py #: ../fdroidserver/update.py msgid "Outputting JSON" msgstr "Sortie vers JSON" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Licence globale du projet." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Substitution du nom de version vide dans {apkfilename} des métadonnées : {version}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "Le paquet \"{appid}\" existe déjà" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" msgstr "Analyse du fichier manifeste sur « {path} »" #: ../fdroidserver/common.py msgid "Password required with username" msgstr "Mot de passe requis avec le nom d'utilisateur" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "Chemin d'accès au sous-répertoire principal du projet Android, si ce n'est pas dans le répertoire racine." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" msgstr "Chemin vers le SDK Android (parfois défini dans ANDROID_HOME)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" msgstr "Chemin vers un dépôt git à utiliser comme journal" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" msgstr "Chemin vers le keystore pour la clé de signature du dépôt" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Afficher la variable secrète dans le terminal pour un copier/coller facilité" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" msgstr "Problème avec le fichier ZIP : %s, erreur %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" msgstr "Problème avec xml sur '{path}'" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" msgstr "Réaliser les mises à jour automatiques" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" msgstr "Traitement de {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" msgstr "Traitement de {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" msgstr "Produire des fichiers d'index XML ou JSON lisibles par un humain" #: ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "URL du projet à importer" #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" msgstr "La ponctuation doit être évitée" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" msgstr "Envoyer les logs dans ce dépôt git distant" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing binary transparency log to {url}" msgstr "Envoyer les logs de transparence de la compilation vers {url}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" msgstr "Envoyer vers {url}" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" msgstr "Démarrer un nouveau dépôt rapidement" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" msgstr "Lire toutes les métadonnées et quitter" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" msgstr "Lecture de '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" msgstr "La lecture de packageName/versionCode/versionName a échoué, APK invalide : '{apkfilename}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" msgstr "La lecture de packageName/versionCode/versionName a échoué, APK invalide : '{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" msgstr "Lecture de {apkfilename} à partir du cache" #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Suppression des fichiers spécifiés" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" msgstr "Suppression de {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Renomme les fichiers APK dont le nom ne ressemble pas à nom.paquet_123.apk" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" msgstr "Le mode de mise à jour de RepoTrunk n'a de sens que pour les dépôts git-svn" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." msgstr "Réinitialiser et créer un tout nouveau serveur de construction, même si le serveur existant semble correct." #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" msgstr "Re-signature de {apkfilename} avec le debug.keystore fournit" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" msgstr "Redimensionner toutes les icônes excédant la taille maximale en pixels et quitter" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" msgstr "Limiter la sortie aux avertissements et aux erreurs" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Réécrire toutes les métadonnées" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" msgstr "Réécriture de « {appid} »" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" msgstr "Exécuter sur le dépôt git qui a des modifications non validées" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Exécuter rewritemeta pour corriger le formatage" #: ../fdroidserver/deploy.py msgid "Running first pass with MD5 checking disabled" msgstr "Exécution de la première passe avec la vérification MD5 désactivée" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" msgstr "Exécution de wget dans {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" msgstr "Le SHA-256 de {url} ne correspond pas à l'entrée !" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Analyse le(s) APK(s) généré(s) afin de trouver les classes connues comme non libres." #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" msgstr "Scanner le code source d'un paquet" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {apk}" msgstr "Le scan a détecté {count} problèmes dans {apk}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" msgstr "Le scan a détecté {count} problèmes dans {appid} :" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" msgstr "Le scanner a trouvé {count} problèmes dans {appid} :{versionCode} :" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "Le scanneur a trouvé {} problème" msgstr[1] "Le scanneur a trouvé {} problèmes" #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "Analyse de l’APK avec dexdump pour les classes non libres connues." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" msgstr "Installer NDK {release} ({version})" #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Réglez l'horloge à cette heure à l'aide de :" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" msgstr "Régler le maximum de versions dans le dépôt avant que les plus anciennes soient archivées" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" msgstr "Définition de la limite de fichiers ouverts à {integer}" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" msgstr "Programmer une compilation de l'application pour le dépôt des versions de test" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " msgstr "Définir la limite d'échec du nombre de fichiers ouvert : " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" msgstr "Définir une timeout de {0} secondes pour cette construction" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Signer et déplacer les paquets dans le dépôt" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" msgstr "Signer les indexes créés avec update --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" msgstr "Sauter le scan du code source pour des fichiers binaires et d'autres problèmes" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Omission de '{apkfilename}' qui a une signature non valide !" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" msgstr "Ignorer le miroir GitLab Pages car le dépôt est trop volumineux (>%.2fGB) !" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" msgstr "Omission de la génération de l'index pour {appid}" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" msgstr "Omission de {apkfilename} qui a une signature non valide !" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" msgstr "Omission de {appid} : désactivé" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" msgstr "Spécifier un dossier local à synchroniser avec le dépôt" #: ../fdroidserver/deploy.py msgid "Specify an identity file to provide to SSH for rsyncing" msgstr "Spécifier un fichier d'identité à fournir à SSH pour utiliser rsync" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." msgstr "Spécifier le fichier de magasin de clés de débogage à utiliser." #: ../fdroidserver/common.py msgid "Spew out even more information than normal" msgstr "Fournir encore plus d'information que d'habitude" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" msgstr "Ignorer la signature mystère de {apkfilename}" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" msgstr "Le résumé '%s' est juste le nom de l'application" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" msgstr "Le résumé de taille {length} est au-dessus de la limite de {limit} caractères" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" msgstr "L'horloge système est plus âgée que la date dans {path} !" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" msgstr "Le mode de mise à jour par étiquettes fonctionne seulement pour les dépôts git, hg, bzr et git-svn pour le moment" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "Le mode de mise à jour par étiquettes est utilisé dans git-svn, mais le dépôt n'était pas paramétré avec des étiquettes" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Mode test — mettre la sortie dans le dossier tmp uniquement et toujours compiler, même si la sortie existe déjà." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" msgstr "Le code de version OBB doit venir après \"{name}. :" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" msgstr "URL de base du dépôt à journaliser (par défaut : https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" msgstr "Le répertoire dans lequel écrire le miroir" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" msgstr "Le fichier à inclure dans le dépôt (chemin ou glob)" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." msgstr "L'empreinte du dépôt ne correspond pas." #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" msgstr "Le dossier racine pour local_copy_dir \"{path}\" n'existe pas !" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" msgstr "Il y a une collision de keyalias — publication interrompue" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." msgstr "Voici les applications qui ont été archivées à partir du dépôt principal." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Ceci est un dépôt d’applications à utiliser avec FDroid. Les applications publiées dans ce dépôt sont soit les binaires officiels compilés par les développeurs de ces applications, soit celles compilées par f-droid.org à partir des sources en utilisant les outils disponibles sur https://gitlab.com/fdroid." #: ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Ce dépôt a déjà des méta-données locales : %s" #: ../fdroidserver/init.py #, python-format msgid "" "To complete the setup, add your APKs to \"%s\"\n" "then run \"fdroid update -c; fdroid update\". You might also want to edit\n" "\"config.yml\" to set the URL, repo name, and more. You should also set up\n" "a signing key (a temporary one might have been automatically generated).\n" "\n" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" "Pour terminer la configuration, ajoutez vos APK dans « %s ».\n" "Ensuite lancez « fdroid update -c ; fdroid update ».\n" "Pensez à modifier le fichier « config.yml »\n" "pour indiquer l'URL, le nom du dépôt et d'autres éléments.\n" "Vous devriez aussi paramétrer une clé de signature\n" "(une clé temporaire peut avoir été générée automatiquement).\n" "\n" "Plus d'informations sur : https://f-droid.org/fr/docs/Setup_an_F-Droid_App_Repo\n" "et https://f-droid.org/fr/docs/Signing_Process." #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Pour utiliser awsbucket, awssecretkey et awsaccesskeyid doivent aussi être configurées dans config.yml !" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "L'URL doit commencer par https:// ou http://" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" msgstr "Les raccourcisseurs d'URL ne devraient pas être utilisés" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" msgstr "URL {url} en Description : {error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" msgstr "Balise de licence non valide \"{}\" ! Utilisez uniquement des balises approuvées par la FSF ou l'OSI de https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Balise de licence non valide \"{}\" ! Utilisez uniquement des balises de licence configurées dans votre fichier de configuration" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" msgstr "Cible du lien symbolique inattendue : {link} -> {target}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" msgstr "Entrée {key} inconnue dans {configname}" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Exception inconnue détectée !" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" msgstr "Fichier '{filename}' inconnu dans la construction '{versionName}'" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" msgstr "Format de méta-données inconnu : %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" msgstr "Format de méta-données inconnu : {path} (utilisez : *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " msgstr "Version inconnue de aapt, peut causer des problèmes : " #: ../fdroidserver/lint.py msgid "Unnecessary leading space" msgstr "Espace inutile au début" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" msgstr "Espace inutile à la fin" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" msgstr "Champ application non reconnu '{fieldname}' dans '{path}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Option de compilation '{build_flag}' non reconnue dans '{path}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" msgstr "Type de fichier non pris en charge \"{extension}\" pour graphique de dépôt" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" msgstr "Fichier graphique non pris en charge trouvé : {path}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" msgstr "Extlib non utilisée à %s" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" msgstr "Fichier non utilisé à %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" msgstr "Chemin scandelete inutilisé : %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" msgstr "Chemin scanignore inutilisé : %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" msgstr "Extraction vers %s" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Mettre à jour les données des dépôts pour les nouveaux paquets" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" msgstr "Mettre à jour le rapport de transparence des fichiers binaires pour une URL" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData a une URL invalide : {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" msgstr "UpdateCheckData doit correspondre au code de la version en nombre entier (\\d ou [0-9]) : {codeex}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" msgstr "UpdateCheckData doit utiliser une URL HTTPS : {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData URL non valide : {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode est configuré mais on dirait que checkupdates n'a pas encore été lancé" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName est défini sur l’ID d’application connu, il peut être supprimé" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" msgstr "Téléversement de {apkfilename} vers androidobservatory.org" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" msgstr "Téléversement de {apkfilename} vers virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "Usage" msgstr "Usage" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Usage : %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Utiliser /HEAD plutôt que /master pour pointer un fichier dans la branche par défaut" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Utiliser 'fdroid update -c' pour le créer." #: ../fdroidserver/build.py msgid "Use build server" msgstr "Utiliser le serveur de build" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" msgstr "Utiliser la date de l'APK plutôt que la date courante pour les APKs nouvellement ajoutés" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." msgstr "Utiliser \"{path}\" pour configurer s3cmd." #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "Utilisation de la signature d'APK v2" #: ../fdroidserver/common.py msgid "Using APK Signature v3" msgstr "Utilisation de la signature d'APK v3" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "L'utilisation de l'utilitaire jarsigner de Java n'est pas recommandé pour vérifier les APKs ! Utiliser apksigner" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" msgstr "Utiliser d’androguard à partir de \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" msgstr "Utilisation d'un dictionnaire vide plutôt que du contenu de {path} !" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" msgstr "Utilise le trousseau existant \"{path}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" msgstr "Utiliser s3cmd pour synchroniser avec : {url}" #: ../fdroidserver/__main__.py msgid "Valid commands are:" msgstr "Les commandes valides sont les suivantes :" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." msgstr "Vérifier dans le cache plutôt que de télécharger à nouveau." #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" msgstr "Vérifier l'intégrité des paquets téléchargés" #: ../fdroidserver/index.py msgid "Verifying index signature:" msgstr "Vérification de la signature d'index :" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "L’API de VirusTotal ne permet pas d’envoyer des fichiers plus grands que 32Mo, utilisez {url} pour envoyer {path}." #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Avertir de possibles erreurs dans les métadonnées" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Lorsqu'il est configuré pour les index signés, ne créez que des index non signés à ce stade" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "Lors du linting, tout le dépôt yamllint est désactivé par défaut. Cette option force yamllint malgré tout." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Nom distingué' utilisé lors de la génération des clés" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" msgstr "Vous pouvez utiliser ANDROID_HOME pour définir le chemin de votre SDK, ex. :" #: ../fdroidserver/scanner.py msgid "ZIP file archive" msgstr "Archive ZIP" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" msgstr "ajoute IdentityFile à {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" msgstr "ajoute à {name} : {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "option ambiguë : %(option)s peut correspondre à %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "option ambiguë : %s (%s ?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner introuvable ! Impossible de signer ou de vérifier les APK modernes" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "apksigner est introuvable, il est requis pour la signature !" #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "applicationId du fichier à traiter" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" msgstr "ID d'application avec le versionCode optionnel sous la forme APPID[:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" msgstr "archive_url doit se terminer par /archive" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "argument \"-\" avec le mode %r" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" msgstr "argument %(argument_name)s : %(message)s" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" msgstr "tentative de connexion SSH simple pour tester la clé de déploiement :" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" msgstr "impossible d'analyser la spécification de scrlib (not a string) : '{}'" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "impossible d'ouvrir « %(filename)s » : %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" msgstr "impossible d'ouvrir les url sans https : '{};" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" msgstr "Impossible de trouver srclibs : \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "Impossible d'avoir plusieurs arguments du sous-parseur" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "impossible de fusionner les actions — deux groupes sont nommés %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" msgstr "impossible de publier la mise à jour, avez-vous affecté la clé de déploiement ?" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" msgstr "clonage de {url}" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" msgstr "commandes des modules d'extension :" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" msgstr "complexe" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "option en conflit : %s" msgstr[1] "options en conflit : %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser alias: %s" msgstr "conflit de l'alias subparser : %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser: %s" msgstr "conflit de subparser : %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" msgstr "impossible de lire '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "impossible d'analyser la spécification srclib (pas de référence spécifiée) : '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" msgstr "impossible d'analyser la spécification srclib (trop de caractères '@') : '{}'" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" msgstr "{path} a été créé" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" msgstr "la version actuelle est plus récente : ancien vercode={old}, nouveau vercode={new}" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" msgstr "suppression : repo/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" msgstr "journal du processus déployé de {path} vers {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest= est obligatoire pour les options comme %r" #: ../fdroidserver/scanner.py msgid "downloading '{}'" msgstr "téléchargement de '{}'" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" msgstr "le téléchargement de l'analyse des signatures de '{}' a échoué" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" msgstr "binaire exécutable, possiblement du code" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "%s argument attendu" msgstr[1] "%s arguments attendus" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "au moins un argument est attendu" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "un seul argument au plus est attendu" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "un seul argument est attendu" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--help|--version|]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" msgstr "recupération de la dernière version des signatures depuis le web" #: /usr/lib/python3.11/optparse.py msgid "floating-point" msgstr "virgule flottante" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "forcer les erreurs (par défaut) sur les métadonnées à être des avertissements, ou les ignorer." #: ../fdroidserver/common.py msgid "git svn clone failed" msgstr "git svn clone a échoué" #: ../fdroidserver/scanner.py msgid "gzip file archive" msgstr "archive GZIP" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "argument explicite %r ignoré" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 doit avoir une signature, utilisez `fdroid signindex` pour la créer !" #: ../fdroidserver/index.py msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 doit avoir une signature, utilisez `fdroid signindex` pour la créer !" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" msgstr "entier" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valeur %(type)s non valide : %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "choix non valide : %(value)r (choisissez parmi %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valeur de conflict_resolution invalide : %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "chaîne d’option non valide %(option)r : doit commencer par un caractère %(prefix_chars)r" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" msgstr "ipfs_cid introuvable, omission de la génération de CIDv1" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" msgstr "la recette de la dernière version est plus récente : ancien vercode={old}, nouveau vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "local_copy_dir ne semble pas se terminer avec \"fdroid\", peut être voulez-vous dire : \"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" msgstr "local_copy_dir doit être un chemin absolu !" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" msgstr "local_copy_dir doit être un dossier et non un fichier !" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" msgstr "le miroir «%s» ne se termine pas par «fdroid» !" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "les arguments qui s'excluent mutuellement doivent être optionnels" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" msgstr "prochaine mise à jour du cache de {name} attendu dans {time}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" msgstr "aucune \"icon\" dans {appid}" #: ../fdroidserver/signatures.py msgid "no APK supplied" msgstr "aucun APK n’est fourni" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" msgstr "option inexistante : %s" #: ../fdroidserver/__main__.py msgid "no version info found!" msgstr "aucune information de version n'a été trouvée !" #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "aucune information sur la version n’a été trouvée" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "non permis avec les arguments %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "un des arguments %s est requis" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" msgstr "accepte uniquement les chaînes de caractères, listes et tuples" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "option %s : Si vous voulez vraiment installer toutes les applications signées, utilisez --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "option %s : valeur %s non valide : %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "option %s : choix non valide : %r (choisissez depuis %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" msgstr "L'option -%s n'est pas reconnue" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" msgstr "l'option -%s requiert un argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "L'option %s ne doit pas avoir d'argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "option --%s n'est pas un préfixe unique" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" msgstr "option --%s non reconnue" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s requires argument" msgstr "L'option %s requiert un argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "arguments optionnels" #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "options" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" msgstr "écrasement de {path} en cours" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "arguments de position" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" msgstr "le déploiement du journal du processus {path} vers {dest} a echoué !" #: ../fdroidserver/build.py msgid "reference binary missing signature" msgstr "signature manquante du fichier binaire de référence" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" msgstr "refuser le téléchargement via une connexion HTTP non sécurisée (utilisez HTTPS ou précisez --no-https-check) : {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." msgstr "repo_icon \"repo/icons/%s\" n'existe pas, génération d'une icône de substitution." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" msgstr "repo_url doit se terminer par /repo" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml n’est pas installé, impossible d’écrire les métadonnées." #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd synchroniser les index de {path} vers {url} et les supprimer" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "l'analyse du cache est mal formée ! Vous pouvez le nettoyer avec : '{clear}'" #: ../fdroidserver/scanner.py msgid "shared library" msgstr "bibliothèque partagée" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" msgstr "afficher le numéro de version du programme et quitter" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" msgstr "afficher ce message d'aide et quitter" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." msgstr "APK signé, soit un chemin de fichier ou une URL HTTPS." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" msgstr "passer le déploiement des journaux de compilation complets : le contenu du journal est vide" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" msgstr "passer le déploiement des journaux de compilation complets : non activé dans la configuration" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" msgstr "omission de la tarball de sources : {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" msgstr "les srclibs manquent un nom ou un @" #: ../fdroidserver/scanner.py msgid "static library" msgstr "librairie statique" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" msgstr "le fichier binaire de référence fourni a autorisé le signataire {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "les arguments suivants sont requis %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "chaîne d'option inattendue : %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "parser inconnu %(parser_name)r (choix : %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "arguments non reconnu : %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "permissions dangereuses sur '{config_file}' (doit être 0600) !" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "usage : " #: ../fdroidserver/deploy.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" msgstr "utilisation de Apache libcloud pour syncronizer avec {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com limite le nombre de requêtes, en attente avant de réessayer..." #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" msgstr[0] "{0} appli, {1} alias de clé" msgstr[1] "{0} applis, {1} alias de clé" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) ne contient pas de métadonnées !" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" msgstr "{apkfilename} a plusieurs fichiers {name}, on dirait que c'est une faille ou exploitation de la clé maître (Master Key) !" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "Le fichier AndroidManifest.xml de {apkfilename} possède une date incorrecte : " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} n’a pas de nom ! Utilisation de l’ID d’application à la place." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" msgstr "{appid} de {path} n’est pas un ID d’application Android valide !" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid} de {path} n’est pas un nom de paquet Java valide !" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" msgstr "{appid} possède à la fois des APK et des fichiers : {files}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" msgstr "{appid} n'a pas de {name}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" msgstr "{appid} : Bibliothèque externe (extlib) {path} inconnue dans la version '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" msgstr "{appid} : pas de versions spécifiées, s'exécute à partir de l'état présent du code source" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" msgstr "{appid} : {field} doit être de '{type}', mais est un '{fieldtype} !'" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" msgstr "{appid} : {field} doit être un '{type}', mais est un '{fieldtype}' !" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} doit être un entier, valeur trouvée : {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be list or string, found: {value}" msgstr "{build_flag} doit être une liste ou une chaîne de caractères, valeur trouvée : {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" msgstr "{file} est vide ou corrompu !" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" n'existe pas ! Vérifiez \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} est obsolète, utilisez {newfile}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "{path} existe déjà, ignorance des résultats de l'importation !" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" msgstr "{path} n’existe pas ! Créez-le en exécutant :" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} a une mauvaise signature de fichier \"{pattern}\", possibilité d'une faille Janus !" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" msgstr "{path} a une taille nulle !" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} supérieur à 200MB, envoi manuel : {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" msgstr "{path} : {error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} ne fini pas par \"fdroid\", vérifiez l'URL !" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url} ne commence pas par \"http\" !" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" msgstr[0] "{} compilation échouée" msgstr[1] "{} compilations échouées" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} compilation réussie" msgstr[1] "{} compilations réussies" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/locale/hu/0000755000175000017500000000000014620351546014663 5ustar00hanshans././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.888382 fdroidserver-2.3a1/locale/hu/LC_MESSAGES/0000755000175000017500000000000014620351546016450 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/locale/hu/LC_MESSAGES/fdroidserver.po0000644000175000017500000024563014620351225021512 0ustar00hanshans# SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # Balázs Meskó , 2020, 2021. # Hans-Christoph Steiner , 2020, 2021, 2022, 2024. # KissPandur , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" "\n" "A telepítési kulcsként használandó nyilvános SSH-kulcs:" #: ../fdroidserver/nightly.py #, python-brace-format msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" "\n" "A(z) „{path}” kódolva a DEBUG_KEYSTORE titkos változóhoz:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" msgstr "A(z) „%s/” nem rendelkezik megfelelő metaadatfájllal." #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" msgstr "\"local_copy_dir\" {path} nem létezik!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "A(z) „{apkfilename}” már telepítve van ezen: {dev}." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" msgstr "A(z) „{path}” elavult {name} csomagot tartalmaz ({version})" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" msgstr "A(z) „{path}” friss {name} csomagot tartalmaz ({version})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" msgstr "A(z) „{path}” létezik, de az s3cmd nincs telepítve." #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" msgstr "A(z) „{path}” nem egy elfogadott formátum, alakítsa át erre: metadata/*.yml" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "\"{path}\" kulccsal aláírt és így nem engedélyezett:" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "A(z) „{url}” nem érvényes URL!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" msgstr[0] "A(z) %(option)s kapcsoló %(number)d argumentumot igényel" msgstr[1] "A(z) %(option)s kapcsoló %(number)d argumentumot igényel" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: hiba: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" msgstr "%d probléma található" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "%prog [options]" msgstr "%prog [kapcsolók]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" msgstr "A(z) %r nem hívható" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" msgstr "" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" msgstr "" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" msgstr "A(z) %s nem elfogadott összeállítási mező" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" msgstr "A(z) %s kapcsoló nem fogad értéket" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "A „keypass” nem található a config.yml fájlban." #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "A „keystore” értéke NONE és a „smartcardoptions” üres." #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "A „keystore” nem található a config.yml fájlban." #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "A „keystorepass” nem található a config.yml fájlban." #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "A „repo_keyalias” nem található a config.yml fájlban." #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "A „required” argumentum érvénytelen argumentum pozicionális paraméterek esetén" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" msgstr "Az „sdk_path” nincs megadva a „config.yml” fájlban." #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "Az „{aapt}” túl régi, az fdroidhoz build-tools-{version} vagy újabb szükséges." #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" msgstr "A(z) „{field}” véletlenszerű sorrendben lesz. Használjon () vagy [] zárójeleket, ha fontos a sorrend." #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" msgstr "A(z) „{path}” végrehajtása sikertelen." #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "A(z) „{value}” nem érvényes {field} érték itt: {appid}. Regex minta: {pattern}" #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "A(z) „{value}” nem érvényes {field} érték itt: minta: {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" msgstr "…checkupdate sikertelen ennél: {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() nincs definiálva" #: ../fdroidserver/lint.py msgid "/issues is missing" msgstr "a /issues hiányzik" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" msgstr "Az URL argumentumként megadása szükséges." #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "PGP aláírások hozzáadása GnuPG segítségével a tároló csomagjaihoz" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" msgstr "Tároló aláírási kulcs hozzáadása a nem aláírt tárolóhoz" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" msgstr "Metaadatfájl-vázak hozzáadása azon APK-khoz, melyeknél hiányoznak" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" msgstr "Új tároló hozzáadása csak a következő miatt: {name}" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" msgstr "A tároló aláírókulcsának álneve a kulcstárolóban" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" msgstr "" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Lehetővé teszi, hogy különböző verziót (vagy git ágat) adjon meg a kezdeti importáláshoz" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" msgstr "Letükrözi a teljes archívum szakaszt is" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" msgstr "Figyelmeztet a formázási problémákra is, mint a „rewritemeta -l”" #: ../fdroidserver/scanner.py msgid "Android AAR library" msgstr "Android AAR programkönyvtár" #: ../fdroidserver/scanner.py msgid "Android APK file" msgstr "Android APK-fájl" #: ../fdroidserver/scanner.py msgid "Android DEX code" msgstr "Android DEX kód" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" msgstr "Az Android SDK nem található itt: {path}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" msgstr "A(z) „{path}” Android SDK elérési út nem található!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" msgstr "A(z) „{path}” Android SDK elérési út nem könyvtár!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" msgstr "A(z) „{cmd}” Android SDK eszköz megtalálva!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" msgstr "Az alkalmazás a(z) „{repo}” tárolóban található, de erre hivatkozik: {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "A .git hozzáfűzése nem szükséges" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" msgstr "Az érvénytelen aláírású {apkfilename} archiválása!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" msgstr "" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "A tükrözendő alap URL, tartalmazhatja az index aláírókulcsát a lekérdezésben: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" msgstr "A(z) „{branch}” ág véglegesítésként használva a(z) „{versionName}” összeállításnál" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" msgstr "A(z) „{branch}” ág véglegesítésként használva a(z) „{srclib}” srclibnél" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" msgstr "Törött szimbolikus link: {path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" msgstr "Csomag összeállítása forrásból" #: ../fdroidserver/build.py msgid "Build all applications available" msgstr "Az összes elérhető alkalmazás összeállítása" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" msgstr "Az összeállítást az „fdroid import” állította elő – törölje a letiltási sort, ha végzett" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" msgstr "A metaadatok git tárolójában nem véglegesített változások találhatók!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" msgstr "Csak a csomagok legújabb verziójának összeállítása" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" msgstr "A tároló összeállítva itt: „%s”, ezzel a konfigurációval:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" msgstr "" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "Nem lehet összeállítani, mert {} hiba történt az átvizsgáláskor" msgstr[1] "Nem lehet összeállítani, mert {} hiba történt az átvizsgáláskor" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" msgstr "A(z) „{path}” nem írható újra" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "A(z) „%s” kategória érvénytelen" #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "A kategóriák nincsenek megadva" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Alkalmazásfrissítések keresése" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Archiválás ellenőrzése ennél: {appid} – apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Tiszta frissítés – nem használ gyorsítótárat, minden APK-k újra feldolgoz" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Kategóriák vesszőkkel elválasztott listája." #: ../fdroidserver/__main__.py #, python-format msgid "Command '%s' not recognised.\n" msgstr "A(z) „%s” nem ismerhető fel.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" msgstr "Változások véglegesítése" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" msgstr "" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Ütköző argumentumok: a „--verbose” és a „--quite” kapcsolók együtt nem adhatók meg." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" msgstr "Ütköző konfigurációs fájlok! {newfile} használata, {oldfile} mellőzése!" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "A(z) „{command}” nem található a rendszeren" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "A legfrissebb verzió kódja nem található" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "A legfrissebb verzió neve nem található" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" msgstr "A(z) {path} eltávolítandó fájl nem található" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " msgstr "A(z) {path} APK nem nyitható meg az elemzéshez: " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "A(z) „{size}” méret nem dolgozható fel, hibás „{type}” típus" #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Az alkalmazásazonosító nem található" #: ../fdroidserver/checkupdates.py #, fuzzy msgid "Couldn't find any version information" msgstr "A legfrissebb verzió neve nem található" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "A csomagazonosító nem található" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" msgstr "A meglévő aláírókulcs-beállítás felülírása megtagadva!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" msgstr "Új „{name}” konténer létrehozva" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." msgstr "„{path}” létrehozása a s3cmd beállításához." #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Naplókönyvtár létrehozása" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" msgstr "Új S3 vödör létrehozása: {url}" #: ../fdroidserver/publish.py msgid "Creating output directory" msgstr "Kimeneti könyvtár létrehozása" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" msgstr "Aláírt index létrehozása ezzel a kulccsal (SHA256):" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" msgstr "Ideiglenes könyvtár létrehozása" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" msgstr "Nem aláírt index létrehozása az aláírás előkészítéséhez" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" msgstr "A CurrentVersionCode ({cv}) kisebb, mint a legrégebbi összeállítási bejegyzés: {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" msgstr "A DEBUG_KEYSTORE nincs beállítva, vagy az értéke nem teljes" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" msgstr "Minden metaadat nélküli APK- és OBB-fájl törlése a tárolóból" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" msgstr "Archívum törlése, a tároló túl nagy ({size}, korlát: {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" msgstr "A git-mirror előzményeinek törlése, a tároló túl nagy ({size}, korlát: {limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" msgstr "Ismeretlen fájl törlése: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" msgstr "A(z) „%s” leírás csak az alkalmazás összegzése" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" msgstr "A leírás ismételt sorokat tartalmaz" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" msgstr "A leírás listát (%s) tartalmaz, de nem pontozott (*) vagy számozott (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" msgstr "A leírás {length} karakteres hossza több, mint a {limit} karakteres korlát" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Ne adja a hozzá a „disable:” szöveget az előállított összeállítási elemekhez" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" msgstr "Ne telepítse az új fájlokat a tárolóba" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" msgstr "Ne adja hozzá a(z) „{path}” elérési utat az URL-hez!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" msgstr "Ne kérdezze meg az Android SDK elérési utat, csak álljon le sikertelenül" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" msgstr "Ne távolítsa el a kulcstárolóból előállított privát kulcsokat" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" msgstr "Ne hozzon létre forráscsomagot, ez egy összeállítás tesztelésekor hasznos" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" msgstr "Ne frissítse a tárolót, hasznos ha internetkapcsolat nélkül tesztel egy összeállítást" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" msgstr "Ne használja az rsync ellenőrzőösszegeit" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Kis tárolók teljes tükrének letöltése" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" msgstr "" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "A tároló letöltése már egyszer sikertelen volt, nem próbálja meg újra." #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" msgstr "A(z) {url} letöltése sikertelen. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" msgstr "" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" msgstr "Ismételt hivatkozás a(z) „{field}” mezőben: {url}" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "HIBA: A „server” alparancs eltávolításra került, használja ezt: „deploy”!" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" "HIBA: a parancsot sose használja az f-droid.org tükrözéséhez.\n" "Az f-droid.org teljes tükrözéséhez több mint 200 GB tárhely szükséges." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "HIBA: nem támogatott CI típus, foltokat szívesen fogadunk!" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." msgstr "A karakterkódolás beállítása „{enc}”, az fdroid kódolási problémákba futhat. A legjobb eredmény érdekében használjon „UTF-8” kódolást." #: ../fdroidserver/init.py #, python-format msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" "Adja meg az Android SDK (%s) elérési útját itt:\n" "> " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" msgstr "A(z) {configname} konfigurációból származó {var} környezeti változó nincs beállítva!" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Hiba történt a tároló címének lekérésekor" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" msgstr "" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Aláírások kinyerése az APK-kból" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" msgstr "A(z) {path} másolása sikertelen: {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" msgstr "A(z) „{apkfilename}” aláírásainak összegyűjtése sikertelen: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" msgstr "A(z) {path} olvasása sikertelen: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" msgstr "A(z) {path} átméretezése sikertelen: {error}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" msgstr "Az S3 vödör létrehozása sikertelen: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" msgstr "Az APK információk lekérése sikertelen, a(z) {path} törlése" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" msgstr "Az APK információk lekérése sikertelen, a(z) {path} kihagyása" #: ../fdroidserver/update.py #, fuzzy msgid "Failed to get APK signing key fingerprint" msgstr "Az APK leíró információk lekérése sikertelen" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" msgstr "A(z) „{apkfilename}” telepítése a(z) {dev} eszközön sikertelen: {error}" #: ../fdroidserver/common.py msgid "Failed to sign application" msgstr "Az alkalmazás aláírása sikertelen" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" msgstr "A virtuális géptől lekért buildserverid: {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" msgstr "A(z) „{apkfilename}” APK aláírásai lekérve -> „{sigdir}”" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" msgstr "A fájl feldolgozás közben eltűnt: {path}" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py #: ../fdroidserver/update.py msgid "Finished" msgstr "Befejezve" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" msgstr "A Flattr adományozási módok a FlattrID: mezőbe tartoznak" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Tiltott HTML címkék" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." msgstr "Letiltott alkalmazások összeállításának kényszerítése, és folytatás az átvizsgálási problémáktól függetlenül. Csak teszt módban engedélyezett." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" msgstr "Összeállítás kényszerített leállítása {0} másodperces időtúllépés után." #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." msgstr "Letiltott alkalmazások és összeállítások átvizsgálásának kényszerítése." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" msgstr "Metaadatok nélküli „{path}” grafika található a(z) „{name}” alkalmazásnál." #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "Hibás „{path}” finanszírozási fájl található a(z) „{name}” alkalmazásnál:" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" msgstr "Érvénytelen alkalmazásazonosítók találhatók az argumentumokban" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "Egyes alkalmazásoknál érvénytelen versionCode paraméterek találhatók" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Több JAR aláírásblokkfájl található itt: {path}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" msgstr "Több metaadatfájl található ennél: {appid}" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." msgstr "Több aláíró-tanúsítvány található a tárolóhoz." #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." msgstr "Nem található aláíró-tanúsítvány a tárolóhoz." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" msgstr "Nem fájl található itt: %s" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" msgstr "{apkfilename} található itt: {url}" #: ../fdroidserver/scanner.py #, fuzzy, python-brace-format msgid "Found {count} problems in {filename}" msgstr "Az átvizsgáló {count} problémát talált a(z) „{filename}” alkalmazásban" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" msgstr "Metaadatváz előállítva ehhez: {appid}" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" msgstr "A(z) „%s” git ágra váltás sikertelen" #: ../fdroidserver/common.py msgid "Git clean failed" msgstr "A git tisztítás sikertelen" #: ../fdroidserver/common.py msgid "Git fetch failed" msgstr "A git lekérés sikertelen" #: ../fdroidserver/common.py #, fuzzy msgid "Git prune failed" msgstr "A git helyreállítás sikertelen" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "A git távoli fej beállítás sikertelen: „%s”" #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "A git helyreállítás sikertelen" #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "A git almodul szinkronizációs sikertelen" #: ../fdroidserver/common.py msgid "Git submodule update failed" msgstr "A git almodul frissítése sikertelen" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" msgstr "HTTPS-t kell használni a Subversion URL-ekhez!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" msgstr "Ha egy tükör túl naggyá válik, akkor engedélyezze az archívum törlését" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" msgstr "Ha a feltöltés sikertelen, próbálja meg kézzel feltölteni ide: {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." msgstr "A(z) „{field}” mellőzése a(z) „{metapath}” metaadatokban, mert elavult." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "A 2048-nál hosszabb FUNDING.yml bejegyzés figyelmen kívül hagyása: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" msgstr "" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "A metaadatok nélküli csomag figyelmen kívül hagyása: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" msgstr "A(z) {apkfilename} elévült gyorsítótáradatainak figyelmen kívül hagyása" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" msgstr "A letiltott algoritmusokkal (például MD5) aláírt APK-k belevétele" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" msgstr "A PGP-aláírást tartalmazó .asc fájlok belevétele a tükörbe" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" msgstr "Az összeállítási napló belevétele a tükörbe" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" msgstr "A forráscsomagok belevétele a tükörbe" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" msgstr "" #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Almodulok előkészítése" #: ../fdroidserver/install.py msgid "Install all signed applications available" msgstr "Összes aláírt alkalmazás telepítése" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" msgstr "Összeállított csomagok telepítése az eszközökre" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." msgstr "%s telepítése…" #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." msgstr "A(z) „{apkfilename}” telepítése ezen: {dev}…" #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" msgstr "Interakció a tároló HTTP kiszolgálójával" #: ../fdroidserver/update.py msgid "Invalid APK" msgstr "Érvénytelen APK" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" msgstr "Érvénytelen VercodeOperation: {field}" #: ../fdroidserver/lint.py #, fuzzy, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "Érvénytelen VercodeOperation: {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "Érvénytelen alkalmazásazonosító: {appid}" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" msgstr "Érvénytelen logikai érték: „%s”" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Érvénytelen felsorolás" #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" msgstr "Érvénytelen név a közzétett fájlnak: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " msgstr "Érvénytelen átirányítás nem HTTPS oldalra: {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" msgstr "Érvénytelen srclib metaadatok: a(z) „{file}” nem létezik" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" msgstr "Érvénytelen srclib metaadatok: a(z) „{file}” nem dolgozható fel" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" msgstr "Érvénytelen srclib metaadatok: ismeretlen „{key}” kulcs itt: „{file}”" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" msgstr "A JAR aláírásának ellenőrzése sikertelen: {path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" msgstr "A JAR aláírása ellenőrizve: {path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" msgstr "Java JAR-fájl" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" msgstr "A Java JDK nem található. Telepítse szabványos helyre, vagy adja meg a java_paths változókat!" #: ../fdroidserver/scanner.py msgid "Java compiled class" msgstr "Legfordított Java osztály" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" msgstr "A Java „jarsigner” nem található. Telepítse szabványos helyre, vagy adja meg a java_paths változókat!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" msgstr "JavaScript a HTML src attribútumokban" #: ../fdroidserver/build.py #, fuzzy, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" msgstr "A minSdkVersion olvasása sikertelen: „{apkfilename}”" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Kulcstároló az aláírókulcshoz:\t" #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" msgstr "A legutóbb használt „{commit}” véglegesítés címkének tűnik, de az UpdateCheckMode „{ucm}”" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" msgstr "A Liberapay adományozási módok a Liberapay: mezőbe tartoznak" #: ../fdroidserver/rewritemeta.py #, fuzzy msgid "List files that would be reformatted (dry run)" msgstr "Az újra formázásra kerülendő fájlok felsorolása" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "A területi beállítás szerepel az f-droid.org URL-ben" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" msgstr "Az összeállítás álljon meg a kivételeknél" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." msgstr "Rosszul formázott tárolótükrök." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" msgstr "Rosszul formázott serverwebroot sor:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" msgstr "" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "A teljes tároló és archívum tükrözés, minden fájltípussal." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" msgstr "Hiányzó kimeneti könyvtár" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" msgstr "" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" #: ../fdroidserver/verify.py #, fuzzy, python-format msgid "No APK for package: %s" msgstr "Nincs ilyen csomag: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Nem található Android SDK!" #: ../fdroidserver/install.py msgid "No attached devices found" msgstr "Nem található csatolt eszköz" #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Nincs ujjlenyomat az URL-ben." #: ../fdroidserver/common.py msgid "No git submodules available" msgstr "Nem érhetők el git almodulok" #: ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "Nem található gradle projekt. Megad --subdir argumentumot?" #: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Nem található információ." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." msgstr "" #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Nem kell megadnia, hogy az alkalmazás szabad szoftver" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" msgstr "Nem kell megadnia, hogy az alkalmazás androidos" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "Nincs beállítás megadva. Szerkessze a config.yml fájlt, hogy ezek közül legalább egyet megadjon:" #: ../fdroidserver/common.py msgid "No packages specified" msgstr "Nincs csomag megadva" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" msgstr "Nem érhetők el aláírt APK-k ehhez: %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" msgstr "Nincs aláírt kimeneti könyvtár – nincs teendő" #: ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" msgstr "Nem található aláíró-tanúsítvány itt: {path}" #: ../fdroidserver/common.py #, python-format msgid "No such package: %s" msgstr "Nincs ilyen csomag: %s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" msgstr "Nincs {versionCode} versionCode a(z) {appid} alkalmazáshoz" #: ../fdroidserver/checkupdates.py #, fuzzy msgid "No tags found" msgstr "Nem található csatolt eszköz" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" msgstr "Nincs aláíratlan könyvtár – nincs teendő" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Nem érvényes méretmegadás: „{}”" #: ../fdroidserver/signindex.py msgid "Nothing to do" msgstr "Nincs teendő" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." msgstr "Nincs teendő a(z) {appid} alkalmazásnál." #: ../fdroidserver/init.py msgid "Now set these in config.yml:" msgstr "Most adja meg ezeket a config.yml fájlban:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" msgstr "Az OBB-fájlnak újabb versionCode értéke ({integer}) van, mint bármelyik APK-nak:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" msgstr "Az OBB-fájl nevének „main.” vagy „patch.” szöveggel kell kezdődnie:" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" msgstr "Az OBB csomagneve nem egyezik egyik támogatott APK-val sem:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Offline gép, git tükör előállításának kihagyása az „fdroid deploy” kiadásáig" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "A grafikáknál csak PNG és JPEG formátum támogatott, ez található: {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Csak a különbségek kiírása Play Áruház esetén" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Csak az automatikus frissítésekkel rendelkező alkalmazások feldolgozása" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Az OpenCollective adományozási módok a OpenCollective: mezőbe tartoznak" #: /usr/lib/python3.11/optparse.py msgid "Options" msgstr "Beállítások" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "A JSON jelentés kiírása egy APK után elnevezett fájlba." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." msgstr "A JSON kiírása a szabványos kimenetre." #: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py #: ../fdroidserver/publish.py ../fdroidserver/signindex.py #: ../fdroidserver/update.py msgid "Outputting JSON" msgstr "JSON kiírása" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Az egész projekt átfogó licence." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Az üres versionName felülírása a(z) {apkfilename} fájlban a metaadatokból: {version}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "A(z) „{appid}” csomag már létezik" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" msgstr "A(z) „{path}” helyen lévő leírófájl feldolgozása" #: ../fdroidserver/common.py msgid "Password required with username" msgstr "Jelszó szükséges a felhasználónévvel" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "A fő androidos projekt alkönyvtár elérési útja, ha nem a gyökér." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" msgstr "Az Android SDK elérési útja (néha az ANDROID_HOME-ban van megadva)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" msgstr "A naplóként használandó git tároló elérési útja" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" msgstr "A tároló aláírókulcsához használt kulcstároló elérési útja" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "A titkos változó kiírása a terminálba a könnyű másolás és beillesztés érdekében" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" msgstr "Probléma az itt lévő XML-lel: „{path}”" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" msgstr "Automatikus frissítések feldolgozása" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" msgstr "{apkfilename} feldolgozása" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" msgstr "{appid} feldolgozása" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" msgstr "Ember számára olvasható XML/JSON fájlok készítése indexfájlként" #: ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "Importálási forrásként használandó projekt URL." #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" msgstr "A központozást kerülni kell" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" msgstr "A napló beküldése ebbe a távoli git tárolóba" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing binary transparency log to {url}" msgstr "A bináris átláthatósági napló beküldése ide: {url}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" msgstr "Beküldés ide: {url}" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" msgstr "Új tároló gyors elindítása" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" msgstr "Összes metaadatfájl felolvasása és kilépés" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" msgstr "„{config_file}” olvasása" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" msgstr "A packageName/versionCode/versionName olvasása sikertelen, az APK érvénytelen: „{apkfilename}”" #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" msgstr "A packageName/versionCode/versionName olvasása sikertelen, az APK érvénytelen: „{apkfilename}”" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" msgstr "A(z) {apkfilename} olvasása gyorsítótárból" #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Megadott fájlok eltávolítása" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" msgstr "" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Azon APK fájlok átnevezése, melyek nem illeszkednek a csomag.név_123.apk mintára" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" msgstr "" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." msgstr "Visszaállítás és teljesen új összeállítási kiszolgáló létrehozása, még akkor is, ha a meglévő rendben lévőnek tűnik." #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" msgstr "A(z) {apkfilename} újra aláírása a megadott debug.keystore segítségével" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" msgstr "A legnagyobb képpontméretet meghaladó összes ikon átméretezése, és kilépés" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" msgstr "A kimenet figyelmeztetésekre és hibákra korlátozása" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Összes metaadatfájl újraírása" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" msgstr "„{appid}” újraírása" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" msgstr "Futtatás azon a git tárolón, amelyben nem véglegesített változtatások vannak" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "A rewritemeta futtatása a formázás javításához" #: ../fdroidserver/deploy.py msgid "Running first pass with MD5 checking disabled" msgstr "Az MD5 ellenőrzés első menetének futtatása letiltva" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" msgstr "A wget futtatása itt: {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" msgstr "" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Az elkészült APK-k átvizsgálása ismert nem szabad osztályokat keresve." #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" msgstr "A csomag forráskódjának átvizsgálása" #: ../fdroidserver/scanner.py #, fuzzy, python-brace-format msgid "Scanner found {count} problems in {apk}" msgstr "Az átvizsgáló {count} problémát talált a(z) „{apk}” alkalmazásban" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" msgstr "Az átvizsgáló {count} problémát talált a(z) „{appid}” alkalmazásban:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" msgstr "Az átvizsgáló {count} problémát talált a(z) „{appid}:{versionCode}” alkalmazásban:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "Az átvizsgáló {count} problémát talált" msgstr[1] "Az átvizsgáló {count} problémát talált" #: ../fdroidserver/scanner.py #, fuzzy msgid "Scanning APK with dexdump for known non-free classes." msgstr "Az elkészült APK-k átvizsgálása ismert nem szabad osztályokat keresve." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" msgstr "" #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Óra beállítása ara az időre a következővel:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" msgstr "A tárolókban szereplő kiadások számának legnagyobb száma, mielőtt a régebbieket archiválni kezdi" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" msgstr "A nyitott fájlok korlátjának beállítása erre: {integer}" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" msgstr "" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " msgstr "A nyitott fájlok korlátjának beállítása sikertelen: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" msgstr "{0} másodperces időtúllépés beállítása ehhez az összeállításhoz" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Aláírás és csomagok tárolóba helyezése" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" msgstr "Az update --nosign paranccsal készült indexek aláírása" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" msgstr "A forráskód binárisok és egyéb problémák miatti átvizsgálásának kihagyása" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Az érvénytelen aláírású „{apkfilename}” kihagyása!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" msgstr "A(z) „{appid}” indexelőállításának kihagyása" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" msgstr "Az érvénytelen aláírású {apkfilename} kihagyása!" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" msgstr "{appid} kihagyása: letiltott" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" msgstr "" #: ../fdroidserver/deploy.py msgid "Specify an identity file to provide to SSH for rsyncing" msgstr "" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." msgstr "" #: ../fdroidserver/common.py msgid "Spew out even more information than normal" msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" msgstr "" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" msgstr "" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" msgstr "" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" msgstr "" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" msgstr "" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" msgstr "" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" msgstr "" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" msgstr "" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" msgstr "" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." msgstr "" #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" #: ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/init.py #, python-format msgid "" "To complete the setup, add your APKs to \"%s\"\n" "then run \"fdroid update -c; fdroid update\". You might also want to edit\n" "\"config.yml\" to set the URL, repo name, and more. You should also set up\n" "a signing key (a temporary one might have been automatically generated).\n" "\n" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" msgstr "" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" msgstr "" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" msgstr "" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Ismeretlen kivétel észlelve!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" msgstr "" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" msgstr "" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " msgstr "" #: ../fdroidserver/lint.py msgid "Unnecessary leading space" msgstr "" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" msgstr "" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" msgstr "" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" msgstr "" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" msgstr "" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" msgstr "" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" msgstr "" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Tárolóinformációk frissítése az új csomagoknál" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" msgstr "A bináris átláthatósági napló frissítése az URL-nél" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "Usage" msgstr "Használat" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Használat: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" #: ../fdroidserver/build.py msgid "Use build server" msgstr "" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." msgstr "" #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" #: ../fdroidserver/common.py msgid "Using APK Signature v3" msgstr "" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" msgstr "" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" msgstr "" #: ../fdroidserver/__main__.py msgid "Valid commands are:" msgstr "Az érvényes parancsok:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." msgstr "" #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" msgstr "Ellenőrizze a letöltött csomagok érintetlenségét" #: ../fdroidserver/index.py msgid "Verifying index signature:" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Figyelmeztetés a lehetséges metaadat-hibákról" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" msgstr "" #: ../fdroidserver/scanner.py msgid "ZIP file archive" msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "nem egyértelmű kapcsoló: %(option)s, ezekre illeszkedhet: %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "nem egyértelmű kapcsoló: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" msgstr "" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" msgstr "" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" msgstr "" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "„%(filename)s” nem nyitható meg: %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" msgstr "" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" msgstr "" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" msgstr "komplex" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "" msgstr[1] "" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser alias: %s" msgstr "" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser: %s" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" msgstr "" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "" #: ../fdroidserver/scanner.py msgid "downloading '{}'" msgstr "" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" msgstr "" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "" msgstr[1] "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--help|--version|]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" msgstr "" #: /usr/lib/python3.11/optparse.py msgid "floating-point" msgstr "lebegőpontos" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" #: ../fdroidserver/common.py msgid "git svn clone failed" msgstr "git svn klónozás meghiúsult" #: ../fdroidserver/scanner.py msgid "gzip file archive" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "a(z) %r. explicit argumentum mellőzése" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "az index-v1-nek kell legyen aláírása, használja az „fdroid signindex” parancsot a létrehozásához." #: ../fdroidserver/index.py #, fuzzy msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "az index-v1-nek kell legyen aláírása, használja az `fdroid signindex` parancsot a létrehozásához!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" msgstr "" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" msgstr "" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" msgstr "" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" msgstr "" #: ../fdroidserver/signatures.py msgid "no APK supplied" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" msgstr "nincs ilyen kapcsoló: %s" #: ../fdroidserver/__main__.py msgid "no version info found!" msgstr "" #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" msgstr "" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" msgstr "a(z) -%s kapcsoló nem ismert" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" msgstr "a(z) -%s kapcsolóhoz argumentum szükséges" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "a(z) --%s kapcsolóhoz argumentum szükséges" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "a(z) --%s kapcsoló nem egyedi előtag" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" msgstr "a(z) --%s kapcsoló nem ismert" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s requires argument" msgstr "a(z) --%s kapcsolóhoz argumentum szükséges" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "nem kötelező argumentumok" #: /usr/lib/python3.11/argparse.py #, fuzzy msgid "options" msgstr "Beállítások" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "pozicionális argumentumok" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" msgstr "" #: ../fdroidserver/build.py msgid "reference binary missing signature" msgstr "" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" msgstr "" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." msgstr "" #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" msgstr "" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" msgstr "a programverzió megjelenítése és kilépés" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" msgstr "ezen üzenet kiírása és kilépés" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." msgstr "" #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" msgstr "" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" msgstr "" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" msgstr "" #: ../fdroidserver/scanner.py msgid "static library" msgstr "" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "a következő argumentumok szükségesek: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "váratlan kapcsoló karakterlánc: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "nem felismert argumentumok: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "nem biztonságos jogosultságok ennél: „{config_file}” (0600-nak kellene lennie)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "használat: " #: ../fdroidserver/deploy.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" msgstr "" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" msgstr[0] "" msgstr[1] "" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" msgstr "" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" msgstr "" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" msgstr "" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be list or string, found: {value}" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" msgstr "" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" msgstr "" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{path}: {error}" msgstr "A(z) {path} másolása sikertelen: {error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" msgstr[0] "" msgstr[1] "" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "" msgstr[1] "" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/locale/it/0000755000175000017500000000000014620351546014663 5ustar00hanshans././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.888382 fdroidserver-2.3a1/locale/it/LC_MESSAGES/0000755000175000017500000000000014620351546016450 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/locale/it/LC_MESSAGES/fdroidserver.po0000644000175000017500000027172514620351225021516 0ustar00hanshans# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # random r , 2020, 2022, 2023. # Luca Zambarda , 2020. # IvanDan , 2020, 2021. # Massimiliano Caniparoli , 2020. # x , 2020, 2021. # Hans-Christoph Steiner , 2020. # Francesco Saltori , 2020. # Francesco Esposito , 2021. # mondstern , 2021. # Frankie McEyes , 2022. # Antonello Pirina , 2022. # Pixel-Tux , 2023. # Davide Neri , 2023. # Mirko Di , 2023. # coronabond , 2023. # Random , 2023, 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2024-04-13 17:01+0000\n" "Last-Translator: Random \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" "\n" "Chiave pubblica SSH da usare come chiave di deploy:" #: ../fdroidserver/nightly.py #, python-brace-format msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" "\n" "{path} codificato per la variabile segreta DEBUG_KEYSTORE:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" non ha un file di metadati corrispondente!" #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" msgstr "La directory principale per \"local_copy_dir\" {path} non esiste!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\" è già installato su {dev}." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" msgstr "\"{path}\" contiene {name} obsoleto ({version})" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" msgstr "\"{path}\" contiene {name} recente ({version})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" msgstr "\"{path}\" esiste ma s3cmd non è installato!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" msgstr "\"{path}\" non è un formato accettato (usa: metadata/*.yml)" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "\"{path}\" è firmato da una chiave non autorizzata:" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" non è un URL valido!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" msgstr[0] "l'opzione %(option)s richiede l'argomento %(number)d" msgstr[1] "l'opzione %(option)s richiede gli argomenti %(number)d" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: errore: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" msgstr "trovati %d problemi" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "%prog [options]" msgstr "%prog [opzioni]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" msgstr "%r non è richiamabile" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" msgstr "%s non ha prodotto un dict!" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" msgstr "%s ha un SHA-256 errato: %s" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" msgstr "%s non è un campo di build accettato" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" msgstr "l'opzione %s non accetta un valore" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "\"keypass\" non trovato in config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' è NONE e 'smartcardoptions' è vuoto!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "\"keystore\" non trovato in config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "\"keystorepass\" non trovato in config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "\"repo_keyalias\" non trovato in config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "\"required\" è un argomento invalido per i posizionali" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" msgstr "\"sdk_path\" non impostato in config.yml!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' è troppo vecchio, fdroid richiede build-tools-{version} o più recente!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" msgstr "\"{field}\" sarà in ordine casuale! Usa le parentesi () o [] se l'ordine è importante!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" msgstr "Esecuzione di \"{path}\" fallita!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' ha un formato non valido, dovrebbe essere un dizionario!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "\"{value}\" non è un {field} valido in {appid}. Espressione regolare: {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "\"{value}\" non è un {field} valido, dovrebbe essere {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" msgstr "...checkupdate fallito per {appid}:{error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() non definita" #: ../fdroidserver/lint.py msgid "/issues is missing" msgstr "/issues è mancante" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" msgstr "È richiesto un URL come argomento!" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Aggiungi firme PGP con GnuPG per i pacchetti in un repository" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" msgstr "Aggiungi una chiave di firma ad un repository non firmato" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" msgstr "Aggiungi i file scheletro di metadata agli APK che sono senza" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" msgstr "Aggiungendo un repository solo per {name}" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" msgstr "Alias della chiave di firma del repository nel keystore" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" msgstr "AllowedAPKSigningKeys mancante ma il riferimento binario è stato fornito" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Permetti di specificare una revisione (o branch git) diversa per l'importazione iniziale" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" msgstr "Esegui il mirroring anche per l'intera sezione archivi" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" msgstr "Avvisa anche dei problemi di formattazione, come rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" msgstr "Libreria Android AAR" #: ../fdroidserver/scanner.py msgid "Android APK file" msgstr "File APK per Android" #: ../fdroidserver/scanner.py msgid "Android DEX code" msgstr "Codice DEX Android" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" msgstr "Android SDK non trovato in {path}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" msgstr "Il path di Android SDK \"{path}\" non esiste!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" msgstr "Il path di Android SDK \"{path}\" non è una directory!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" msgstr "Strumento Android SDK {cmd} non trovato!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "L'app ha Binaries ma non ha AllowedAPKSigningKeys corrispondente per fissare il certificato." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "L'app ha NoSourceSince o ArchivePolicy \"0 versioni\" ma AutoUpdateMode o UpdateCheckMode non sono None" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" msgstr "L'app è in \"{repo}\" ma ha un collegamento a {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "La versione dell'app ha il file binario ma non ha un AllowedAPKSigningKeys corrispondente per fissare il certificato." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Non è necessario aggiungere \".git\"" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" msgstr "Archiviando {apkfilename} con una firma invalida!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode con UpdateCheckMode: HTTP deve avere uno schema." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" msgstr "Tipo di voce \"{mirrortype}\" errato nella configurazione dei mirror: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "Indirizzo URL base per il mirror, può includere la chiave di firma dell'indice utilizzando la query string: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" msgstr "Branch \"{branch}\"usata come commit nella build \"{versionName}\"" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" msgstr "Branch \"{branch}\" usata come commit in srclib \"{srclib}\"" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" msgstr "Collegamento simbolico orfano: {path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" msgstr "Costruisci un pacchetto dai sorgenti" #: ../fdroidserver/build.py msgid "Build all applications available" msgstr "Costruisci tutte le applicazioni disponibili" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" msgstr "Build generata da \"froid import\" - rimuovi disable line quando ha finito" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" msgstr "Il repository git dei metadati di compilazione ha modifiche non autorizzate!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" msgstr "Costruisci solo l'ultima versione di ciascun pacchetto" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" msgstr "Costruito il repository in \"%s\" con questa configurazione:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" msgstr "Impossibile aggiornare automaticamente app prive del CurrentVersionCode" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "Impossibile costruire a causa di un errore con {} durante la scansione" msgstr[1] "Impossibile costruire a causa di errori con {} durante la scansione" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" msgstr "Impossibile riscrivere \"{path}\"" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "La categoria \"%s\" non è valida" #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "Le categorie non sono impostate" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Cerca gli aggiornamenti delle applicazioni" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Controllo dell'archiviazione per {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Aggiornamento pulito - non usa cache, riprocessa tutti gli APK" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Lista di categorie separate da una virgola." #: ../fdroidserver/__main__.py #, python-format msgid "Command '%s' not recognised.\n" msgstr "Comando \"%s\" non riconosciuto.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" msgstr "Cambiamenti del commit" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" msgstr "Definizioni \"{field}\" in conflitto tra .yml e file localizzati:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argomenti in conflitto: '--verbose' e '--quiet' non possono essere specificati contemporaneamente." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" msgstr "File di configurazione in conflitto! Utilizzando {newfile}, ignorando {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "Impossibile trovare \"{command}\" sul tuo sistema" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Impossibile trovare il codice della versione più recente" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Impossibile trovare il nome della versione più recente" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" msgstr "Impossibile trovare {path} da rimuovere" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " msgstr "Impossibile aprire il file APK {path} per l'analisi: " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Impossibile analizzare la dimensione \"{size}\", tipo sbagliato \"{type}\"" #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Impossibile trovare l'ID dell'applicazione" #: ../fdroidserver/checkupdates.py msgid "Couldn't find any version information" msgstr "Impossibile trovare informazioni sulla versione" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "Impossibile trovare l'ID del pacchetto" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" msgstr "Mi rifiuto di sovrascrivere il setup della chiave di firma già esistente!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" msgstr "Nuovo container \"{name}\" creato" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Creazione \"{path}\" per configurazione s3cmd." #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Creazione della directory dei log" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" msgstr "Creazione di un nuovo bucket S3: {url}" #: ../fdroidserver/publish.py msgid "Creating output directory" msgstr "Creazione della directory di output" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" msgstr "Creazione di un indice firmato con questa chiave (SHA256):" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" msgstr "Creazione della directory temporanea" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" msgstr "Creazione dell'indice non firmato in preparazione della firma" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" msgstr "CurrentVersionCode {cv} è inferiore alla voce di build più vecchia {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" msgstr "DEBUG_KEYSTORE non impostato o il valore è incompleto" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" msgstr "Cancella gli APK e/o OBB senza metadati dal repository" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" msgstr "Eliminazione dell'archivio, il repository è troppo grande ({size} max {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" msgstr "Eliminazione della cronologia git-mirror, il repository è troppo grande ({size} max {limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" msgstr "Cancellazione del file sconosciuto: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" msgstr "La descrizione \"%s\" è solo il riassunto dell'app" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" msgstr "La descrizione ha una riga duplicata" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" msgstr "La descrizione ha un elenco (%s) ma non è puntato (*) né numerato (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" msgstr "La descrizione di lunghezza {length} supera il limite di {limit} caratteri" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Non aggiungere 'disable:' alle voci di compilazione generate" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" msgstr "Non distribuire i nuovi file nel repository" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" msgstr "Non includere \"{path}\" nell'URL!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" msgstr "Non chiedere il path di Android SDK, esci subito con un errore" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" msgstr "Non rimuovere le chiavi private generate dal keystore" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" msgstr "Non creare un tarball sorgente, utile per testare una build" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" msgstr "Non aggiornare il repository, utile per testare una build offline" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" msgstr "Non usare checksum rsync" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Scarica mirror completi di piccoli repository" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" msgstr "Scaricando %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Lo scaricamento del repository è gia fallito una volta, non verrà riprovato." #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" msgstr "Scaricamento di {url} fallito. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" msgstr "La dichiarazione di Anti-Feature duplicata in {path} è stata ignorata!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" msgstr "Voce \"%s\" duplicata nella configurazione dei mirror!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" msgstr "Link duplicato in '{field}': {url}" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ERRORE: il sottocomando \"server\" è stato rimosso, usa \"deploy\"!" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" "ERRORE: questo comando non deve mai essere utilizzato per il mirror f-droid.org!\n" "L’intero mirror di f-droid.org richiede più di 200GB." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERRORE: tipo di CI non supportato, le patch sono benvenute!" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "ERRORE: host git \"%s\" non supportato, le patch sono benvenute!" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." msgstr "La codifica è impostata su \"{enc}\" fdroid potrebbe incorrere in problemi di codifica. Impostalo su \"UTF-8\" per ottenere i migliori risultati." #: ../fdroidserver/init.py #, python-format msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" "Inserisci qui il percorso dell'Android SDK (%s):\n" "> " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" msgstr "La variabile d'ambiente {var} da {configname} non è impostata!" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Errore nell'ottenere l'indirizzo del repo" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" msgstr "Esci con un codice diverso da zero se sono stati rilevati problemi" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Estrarre i metadati dell'applicazione da una repository di origine" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Estrai le firme dagli APK" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" msgstr "Copia non riuscita {path}: {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" msgstr "Impossibile recuperare le firme per '{apkfilename}': {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" msgstr "Impossibile leggere {path}: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" msgstr "Impossibile ridimensionare {path}: {error}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" msgstr "Impossibile creare il bucket S3: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" msgstr "Impossibile ottenere informazioni dell’APK, eliminando {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" msgstr "Impossibile ottenere informazioni dell’APK, saltando {path}" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" msgstr "Impossibile ottenere l'impronta digitale della chiave di firma del pacchetto APK" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" msgstr "Impossibile installare '{apkfilename}' su {dev}: {error}" #: ../fdroidserver/common.py msgid "Failed to sign application" msgstr "Impossibile firmare l'applicazione" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" msgstr "Buildserverid recuperato dalla VM: {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" msgstr "Firme recuperate per \"{apkfilename}\" -> \"{sigdir}\"" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" msgstr "Il file è scomparso durante l'elaborazione: {path}" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py #: ../fdroidserver/update.py msgid "Finished" msgstr "Finito" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" msgstr "I metodi di donazione di Flattr appartengono al campo FlattrID" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Tag HTML vietati" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." msgstr "Forza la compilazione delle app disabilitate e prosegui indipendentemente dai problemi di scansione. Consentito solo in modalità test." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" msgstr "Forza l'arresto della compilazione dopo il timeout di {0} sec!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." msgstr "Forza la scansione di app e build disabilitate." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" msgstr "Trovato l'elemento grafico \"{path}\" senza metadati per l'app \"{name}\"!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "Trovato file di finanziamento non valido \"{path}\" per \"{name}\":" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" msgstr "Trovati appid non validi negli argomenti" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "Trovati codici di versione non validi per alcune app" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Trovati più file di blocco della firma JAR in {path}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" msgstr "Trovati più file di metadati per {appid}" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." msgstr "Trovati più certificati di firma per il repository." #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." msgstr "Nessun certificato di firma trovato per il repository." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" msgstr "Trovato non-file in %s" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" msgstr "Trovato {apkfilename} in {url}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} problems in {filename}" msgstr "Trovati {count} problemi in {filename}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" msgstr "Trovati {count} avvisi in {filename}" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" msgstr "Metadati dello scheletro generati per {appid}" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" msgstr "Checkout Git di \"%s\" non riuscito" #: ../fdroidserver/common.py msgid "Git clean failed" msgstr "Git clean non riuscito" #: ../fdroidserver/common.py msgid "Git fetch failed" msgstr "Recupero Git non riuscito" #: ../fdroidserver/common.py msgid "Git prune failed" msgstr "Cancellazione Git non riuscita" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Set-head remoto Git non riuscito: \"%s\"" #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Ripristino Git non riuscito" #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Sincronizzazione del sottomodulo Git non riuscita" #: ../fdroidserver/common.py msgid "Git submodule update failed" msgstr "Aggiornamento del sottomodulo Git non riuscito" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" msgstr "HTTPS deve essere utilizzato con gli URL Subversion!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" msgstr "Se un mirror git diventa troppo grande, consenti l'eliminazione dell'archivio" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" msgstr "Se il caricamento non riesce, prova a caricare manualmente su {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." msgstr "Ignorando i metadati '{field}' in '{metapath}' perché obsoleti." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "Ignorando la voce FUNDING.yml più lunga di 2048: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" msgstr "Ignorato elemento errato nel manifest: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorare il pacchetto senza metadati: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" msgstr "Ignorare i dati della cache obsoleti per {apkfilename}" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" msgstr "Includere gli APK firmati con algoritmi disabilitati come MD5" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" msgstr "Includere i file .asc della firma PGP nel mirror" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" msgstr "Includere i log di build nel mirror" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" msgstr "Includere i tarball dei sorgenti nel mirror" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" msgstr "Includo metadati da %s@%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" msgstr "Includo metadati da {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Inizializzazione dei sottomoduli" #: ../fdroidserver/install.py msgid "Install all signed applications available" msgstr "Installa tutte le applicazioni firmate disponibili" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" msgstr "Installa i pacchetti costruiti su dispositivi" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." msgstr "Installando %s..." #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." msgstr "Installazione di '{apkfilename}' su {dev}..." #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" msgstr "Interagisci col server HTTP del repository" #: ../fdroidserver/update.py msgid "Invalid APK" msgstr "APK non valido" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" msgstr "Modalità di aggiornamento automatico non valida: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" msgstr "Modalità di controllo aggiornamento non valida: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" msgstr "VercodeOperation non valido: {field}" #: ../fdroidserver/lint.py #, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "VercodeOperation non valido: {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "ID applicazione non valida {appid}" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" msgstr "Valore booleano '%s' non valido" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Elenco puntato non valido" #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" msgstr "Nome non valido per il file pubblicato: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" msgstr "nkd non valido: entry nella compilazione: \"{ndk}\"" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " msgstr "Reindirizzamento non valido a non HTTPS: {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" msgstr "Metadati scrlib non validi: '{file}' non esiste" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" msgstr "Metadati srclib non validi: impossibile analizzare '{file}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" msgstr "Metadati srclib non validi: chiave sconosciuta '{key}' in '{file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" msgstr "Impossibile verificare la firma JAR: {path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" msgstr "Firma JAR verificata: {path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" msgstr "File JAR Java" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" msgstr "Java JDK non trovato! Installa nella posizione standard o imposta java_paths!" #: ../fdroidserver/scanner.py msgid "Java compiled class" msgstr "Classe compilata in Java" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" msgstr "Java jarsigner non trovato! Installa nella posizione standard o imposta java_paths!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" msgstr "Javascript negli attributi HTML src" #: ../fdroidserver/build.py #, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" msgstr "Mantenimento della build fallita \"{apkfilename}\"" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Keystore per la firma della chiave:\t" #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" msgstr "L'ultimo commit utilizzato '{commit}' sembra un tag, ma UpdateCheckMode è '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" msgstr "I metodi di donazione di Liberapay appartengono al campo Liberapay" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted (dry run)" msgstr "Elenca i file che verrebbero riformattati (simulazione)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "Locale incluso in f-droid.org URL" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" msgstr "Interrompere la compilazione sulle eccezioni" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." msgstr "Mirror del repository malformati." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" msgstr "Riga del serverwebroot malformata:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" msgstr "Raggiunta la massima profondità di ricorsione nel file ZIP: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Rispecchiare il repository completo e l'archivio, tutti i tipi di file." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" msgstr "Directory di output mancante" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" msgstr "Spostamento delle dichiarazioni di Anti-Features nei file localizzati:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "Né \"repo_pubkey\" o \"keystorepass\" sono stati impostati in config.yml" #: ../fdroidserver/verify.py #, python-format msgid "No APK for package: %s" msgstr "Nessun APK per il pacchetto: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Android SDK non trovato!" #: ../fdroidserver/install.py msgid "No attached devices found" msgstr "Nessun dispositivo collegato trovato" #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Nessuna impronta digitale nell'URL." #: ../fdroidserver/common.py msgid "No git submodules available" msgstr "Nessun sottomodulo git disponibile" #: ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "Nessun progetto gradle è stato trovato. Specificare --subdir?" #: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Nessun informazione trovata." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" msgstr "Nessuna etichetta corrispondente trovata" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." msgstr "Nessuna versione minima dell'SDK trovata in {0}, viene usata la predefinita (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Non è necessario specificare che l'app è un Software Libero" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" msgstr "Non c'è bisogno di specificare che l'applicazione è per Android" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "Nessuna opzione impostata! Modifica il tuo config.yml per impostare almeno uno di questi:" #: ../fdroidserver/common.py msgid "No packages specified" msgstr "Nessun pacchetto specificato" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" msgstr "Nessun APK firmato disponibile per %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" msgstr "Nessuna directory di output firmata - niente da fare" #: ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" msgstr "Nessun certificato di firma trovato in {path}" #: ../fdroidserver/common.py #, python-format msgid "No such package: %s" msgstr "Nessun pacchetto di questo tipo: %s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" msgstr "Nessun versionCode di questo tipo {versionCode} per l'app {appid}" #: ../fdroidserver/checkupdates.py msgid "No tags found" msgstr "Nessuna etichetta trovata" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" msgstr "Nessuna directory non firmata - niente da fare" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Definizione di dimensione non valida: \"{}\"" #: ../fdroidserver/signindex.py msgid "Nothing to do" msgstr "Niente da fare" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." msgstr "Niente da fare per {appid}." #: ../fdroidserver/init.py msgid "Now set these in config.yml:" msgstr "Ora imposta i seguenti campi in config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" msgstr "Il file OBB ha un versionCode più recente ({integer}) di qualsiasi APK:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" msgstr "Il nome del file OBB deve iniziare con \"main.\" o \"patch.\":" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" msgstr "Il nome del pacchetto di OBB non corrisponde a un APK supportato:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Macchina offline, saltando la generazione del mirror git fino a quando `fdroid deploy`" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Solo PNG e JPEG sono supportati per la grafica, trovati: {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Stampa solo le differenze con il Play Store" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Elabora solo app con aggiornamenti automatici" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "I metodi di donazione di OpenCollective appartengono al campo OpenCollective" #: /usr/lib/python3.11/optparse.py msgid "Options" msgstr "Opzioni" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Rapporto di uscita JSON al file chiamato dopo APK." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." msgstr "Invia l'output del JSON allo stdout." #: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py #: ../fdroidserver/publish.py ../fdroidserver/signindex.py #: ../fdroidserver/update.py msgid "Outputting JSON" msgstr "Output di JSON" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Licenza generale del progetto." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Sostituzione di versionName vuoto in {apkfilename} dai metadati: {version}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "Pacchetto \"{appid}\" già esistente" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" msgstr "Analisi del manifesto in '{path}'" #: ../fdroidserver/common.py msgid "Password required with username" msgstr "Password richiesta con nome utente" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "Percorso alla sottodirectory principale del progetto Android, se non in root." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" msgstr "Percorso per l'SDK Android (a volte impostato in ANDROID_HOME)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" msgstr "Percorso del repository git da utilizzare come registro" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" msgstr "Percorso del keystore per la chiave di firma del repository" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Stampa la variabile segreta sul terminale per un facile copia/incolla" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" msgstr "Problema con il file ZIP: %s, errore %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" msgstr "Problema con xml in '{path}'" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" msgstr "Elabora gli aggiornamenti automatici" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" msgstr "Elaborazione di {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" msgstr "Elaborazione di {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" msgstr "Produci XML/JSON leggibili dagli utenti per i file di indice" #: ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "URL del progetto da cui importare." #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" msgstr "La punteggiatura dovrebbe essere evitata" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" msgstr "Esegui il push del log in questo repository git remoto" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing binary transparency log to {url}" msgstr "Invio del log di trasparenza binaria su {url}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" msgstr "Spingere a {url}" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" msgstr "Crea velocemente un nuovo repository" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" msgstr "Leggi tutti i file di metadati ed esci" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" msgstr "Lettura di '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" msgstr "Lettura di packageName/versionCode/ ersionName non riuscita, APK non valido: '{apkfilename}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" msgstr "Lettura di packageName/versionCode/versionName non riuscita, APK non valido: '{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" msgstr "Lettura di {apkfilename} dalla cache" #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Rimozione dei file specificati" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" msgstr "Rimozione di {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Rinomina i file APK che non corrispondono a package.name_123.apk" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" msgstr "La modalità di aggiornamento RepoTrunk ha senso solo nei repository git-svn" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." msgstr "Reimposta e crea un nuovo server di compilazione, anche se quello esistente sembra essere ok." #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" msgstr "Firmando di nuovo {apkfilename} con il debug.keystore fornito" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" msgstr "Ridimensiona tutte le icone che superano la dimensione massima dei pixel ed esci" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" msgstr "Limita l'output ad avvisi ed errori" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Riscrivi tutti i file di metadati" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" msgstr "Riscrittura di \"{appid}\"" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" msgstr "Esegui su repository git con modifiche non salvate" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Esegui rewritemeta per correggere la formattazione" #: ../fdroidserver/deploy.py msgid "Running first pass with MD5 checking disabled" msgstr "Esecuzione del primo passaggio con controllo MD5 disabilitato" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" msgstr "Esecuzione di wget in {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" msgstr "Lo SHA-256 di {url} non corrisponde alla voce!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Scansiona gli APK risultanti per le classi non libere note." #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" msgstr "Scansiona il codice sorgente di un pacchetto" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {apk}" msgstr "Lo scanner ha trovato {count} problemi in {apk}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" msgstr "Scanner trovato {count} problemi in {appid}:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" msgstr "Scanner trovato {count} problemi in {appid}: {versionCode}:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "Scanner trovato {} problema" msgstr[1] "Scanner trovato {} problemi" #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "Scansiona gli APK con apkanalyzer per le classi note non libere." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" msgstr "Impostare NDK {release} ({version})" #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Imposta l'orologio a quell'ora usando:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" msgstr "Imposta le versioni massime in repo prima che quelle più vecchie vengano archiviate" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" msgstr "Imposta il limite di file aperto su {integer}" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" msgstr "Impostare una build di app per un repository di build notturno" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " msgstr "Impostazione del limite di file aperto non riuscita: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" msgstr "Impostazione del timeout {0} sec per questa build" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Firma e metti i pacchetti nel repository" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" msgstr "Firma gli indici creati con update --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" msgstr "Salta la scansione del codice sorgente per i binari e altri problemi" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Saltare '{apkfilename} con firma non valida!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" msgstr "Saltando il mirror di GitLab Pages perché la repo è troppo grande (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" msgstr "Saltare la generazione dell'indice per {appid}" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" msgstr "Saltare {apkfilename} con firma non valida!" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" msgstr "Saltare {appid}: disabilitato" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" msgstr "Specificare una cartella locale in cui sincronizzare il repository" #: ../fdroidserver/deploy.py msgid "Specify an identity file to provide to SSH for rsyncing" msgstr "Specificare un file di identità da fornire a SSH per rsyncing" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." msgstr "Specificare quale file keystore di debug utilizzare." #: ../fdroidserver/common.py msgid "Spew out even more information than normal" msgstr "Vomitare ancora più informazioni del normale" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" msgstr "Riduzione della firma misteriosa da {apkfilename}" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" msgstr "Riepilogo \"%s\" è solo il nome dell'app" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" msgstr "Riepilogo di length {length} supera il limite di caratteri {limit}" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" msgstr "L'orologio di sistema è più vecchio della data in {path}!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" msgstr "La modalità di aggiornamento dei tag attualmente funziona solo per i repository git, hg, bzr e git-svn" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "Modalità di aggiornamento dei tag utilizzata in git-svn, ma il repo non è stato configurato con i tag" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Modalità test - mette l'output solo nella directory tmp, e costruisce sempre, anche se l'output esiste già." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" msgstr "Il codice della versione OBB deve venire dopo \"{name}\":" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" msgstr "L'URL di base per il repo da registrare (predefinito: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" msgstr "La directory in cui scrivere il mirror" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" msgstr "Il file da includere nel repo (percorso o glob)" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." msgstr "L'impronta digitale del repository non corrisponde." #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" msgstr "La directory principale per local_copy_dir \"{path}\" non esiste!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" msgstr "C'è una collisione keyalias - pubblicazione interrotta" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." msgstr "Queste sono le applicazioni che sono state archiviate dal repo principale." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Questo è un repository di applicazioni da utilizzare con F-Droid. Le applicazioni in questo repository sono o binari ufficiali compilati dagli sviluppatori dell'applicazione originale, o sono binari compilati dai sorgenti dall'amministratore di f-droid.org usando gli strumenti su https://gitlab.com/fdroid." #: ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Questo repo ha già metadati locali: %s" #: ../fdroidserver/init.py #, python-format msgid "" "To complete the setup, add your APKs to \"%s\"\n" "then run \"fdroid update -c; fdroid update\". You might also want to edit\n" "\"config.yml\" to set the URL, repo name, and more. You should also set up\n" "a signing key (a temporary one might have been automatically generated).\n" "\n" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" "Per completare la configurazione, aggiungi i tuoi APKs a \"%s\",\n" "poi esegui \"fdroid update -c; fdroid update\". Puoi anche modificare\n" "\"config.yml\" per impostare URL, nome del repo e altro. Dovresti anche creare\n" "una chiave di firma (ne può essere stata generata una temporanea in automatico).\n" "\n" "Per altre info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "e https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Per usare awsbucket, awssecretkey e awsaccesskeyid devono essere impostati anche in config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "L'URL deve iniziare con https:// o http://" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" msgstr "Gli accorciatori di URL non dovrebbero essere usati" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" msgstr "URL {url} in Descrizione: {error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" msgstr "Tag di licenza inaspettato \"{}\"! Usare solo tag approvati da FSF o OSI da https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Tag di licenza inaspettato \"{}\"! Usa solo i tag di licenza configurati nel tuo file di configurazione" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" msgstr "Destinazione collegamento simbolico inattesa: {link} -> {target}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" msgstr "Voce sconosciuta {key} in {configname}" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Eccezione sconosciuta trovata!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" msgstr "File sconosciuto '{filename}' nella build '{versionName}'" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" msgstr "Formato di metadati sconosciuto: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" msgstr "Formato dei metadati sconosciuto: {path} (usa: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " msgstr "Versione sconosciuta di aapt, potrebbe causare problemi: " #: ../fdroidserver/lint.py msgid "Unnecessary leading space" msgstr "Spazio iniziale non necessario" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" msgstr "Spazio finale non necessario" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" msgstr "Campo dell'app non riconosciuto '{fieldname}' in '{path}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Flag di costruzione non riconosciuto '{build_flag}' in '{path}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" msgstr "Tipo di file non supportato \"{extension}\" per la grafica del repo" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" msgstr "Trovato un file grafico non supportato: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" msgstr "Extlib inutilizzata a %s" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" msgstr "File inutilizzato a %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" msgstr "Percorso scandelete non utilizzato: %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" msgstr "Percorso scanignore non utilizzato: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" msgstr "Decomposizione in %s" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Aggiorna le informazioni del repository coi nuovi pacchetti" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" msgstr "Aggiorna il log di trasparenza binario con un nuovo URL" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData ha un URL non valido: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" msgstr "UpdateCheckData deve corrispondere al codice di versione come intero (\\d o [0-9]): {codeex}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" msgstr "UpdateCheckData deve usare l'URL HTTPS: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData non è un URL valido: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode impostato ma sembra che checkupdates non sia ancora stato eseguito." #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName è impostato sull'ID dell'applicazione nota, può essere rimosso" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" msgstr "Caricamento di {apkfilename} su androidobservatory.org" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" msgstr "Caricamento di {apkfilename} su virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "Usage" msgstr "Uso" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Utilizzo: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Usare /HEAD invece di /master per puntare a un file nel ramo predefinito" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Usa `fdroid update -c` per crearlo." #: ../fdroidserver/build.py msgid "Use build server" msgstr "Utilizzare il build server" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" msgstr "Usa la data dell'APK invece dell'ora corrente per gli APK aggiunti di recente" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." msgstr "Usare \"{path}\" per configurare s3cmd." #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "Usare la firma APK v2" #: ../fdroidserver/common.py msgid "Using APK Signature v3" msgstr "Usare la firma APK v3" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Utilizzando jarsigner di Java, non raccomandato per verificare APK! Utilizzare apksigner" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" msgstr "Usando androguard da \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" msgstr "Utilizzo di un dizionario vuoto al posto del contenuto di {path}!" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" msgstr "Utilizzando il keystore esistente \"{path}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" msgstr "Utilizzando s3cmd per sincronizzare con: {url}" #: ../fdroidserver/__main__.py msgid "Valid commands are:" msgstr "I comandi validi sono:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." msgstr "Anziché scaricare di nuovo, verifica con la copia memorizata nella cache locale." #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" msgstr "Verifica l'integrità dei pacchetti scaricati" #: ../fdroidserver/index.py msgid "Verifying index signature:" msgstr "Verifica della firma dell'indice:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "La chiave API di VirusTotal non può caricare file più grandi di 32MB, usa {url} per caricare {path}." #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Avvisa riguardo possibili errori nei metadati" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Se configurato per indici firmati, crea solo indici senza segno in questa fase" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "Quando linting l'intero repository yamllint è disabilitato per impostazione predefinita. Questa opzione costringe yamllint a prescindere." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distinguished Name' usato quando si generano le chiavi" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" msgstr "Potete usare ANDROID_HOME per impostare il percorso del vostro SDK, cioè:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" msgstr "Archivio di file ZIP" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" msgstr "aggiungendo IdentityFile a {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" msgstr "aggiungendo a {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opzione ambigua: %(option)s potrebbe corrispondere a %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "opzione ambigua: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner non trovato! Impossibile firmare o verificare gli APK moderni" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "apksigner non trovato, è necessario per la firma!" #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "ID dell'applicazione del file su cui operare" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" msgstr "ID dell'applicazione con versionCode opzionale nella forma APPID[:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" msgstr "archive_url deve terminare con /archive" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "argomento \" -\" con la modalità %r" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" msgstr "argomento %(argument_name)s: %(message)s" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" msgstr "tentativo di connessione SSH nuda per testare la chiave di distribuzione:" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" msgstr "impossibile analizzare le specifiche scrlib (non una stringa): '{}'" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "impossibile aprire '%(filename)s': %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" msgstr "impossibile aprire l'url non-https: '{};" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" msgstr "impossibile trovare srclibs richiesto: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "impossibile avere più argomenti subparser" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "impossibile unire le azioni : due gruppi sono denominati %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" msgstr "non può pubblicare l'aggiornamento, avete impostato la chiave di distribuzione?" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" msgstr "clonazione {url}" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" msgstr "dai moduli dei plugin:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" msgstr "complesso" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "stringa di opzioni in conflitto: %s" msgstr[1] "stringhe di opzioni in conflitto: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser alias: %s" msgstr "alias subparser in conflitto: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser: %s" msgstr "subparser in conflitto: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" msgstr "non ha potuto analizzare '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "non ha potuto analizzare la specifica srclib (nessun riferimento specificato): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" msgstr "non ha potuto analizzare la specifica srclib (troppi segni '@'): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" msgstr "creato {path}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" msgstr "la versione attuale è più recente: old vercode={old}, new vercode={new}" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" msgstr "cancellazione: repo/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" msgstr "log di processo distribuito {path} a {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest= è richiesto per opzioni come %r" #: ../fdroidserver/scanner.py msgid "downloading '{}'" msgstr "scaricando '{}'" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" msgstr "scaricamento delle firme dello scanner da '{}' fallito" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" msgstr "binario eseguibile, eventualmente codice" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "atteso %s argomento" msgstr[1] "atteso %s argomenti" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "si aspettava almeno un argomento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "atteso al massimo un argomento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "atteso un argomento" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--help|--version|]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" msgstr "recupera l'ultima versione delle firme dal web" #: /usr/lib/python3.11/optparse.py msgid "floating-point" msgstr "in virgola mobile" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "forza gli errori di metadati (predefinito) come avvisi, o da ignorare." #: ../fdroidserver/common.py msgid "git svn clone failed" msgstr "git svn clone fallito" #: ../fdroidserver/scanner.py msgid "gzip file archive" msgstr "archivio file gzip" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "ignorava l'argomento esplicito %r" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 deve avere una firma, usa `fdroid signindex` per crearla!" #: ../fdroidserver/index.py msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 deve avere una firma, usa `fdroid signindex` per crearla!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" msgstr "intero" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valore %(type)s non valido: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "scelta non valida: %(value)r (scegliere tra %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valore di risoluzione dei conflitti non valido: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "stringa di opzioni non valida %(option)r: deve iniziare con un carattere %(prefix_chars)r" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" msgstr "ipfs_cid non trovato, salto la generazione di CIDv1" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" msgstr "l'ultima ricetta di compilazione è più recente: vecchio vercode={old}, nuovo vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "local_copy_dir not finisce con \"fdroid\", forse intendevi: \"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" msgstr "local_copy_dir deve essere un percorso assoluto!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" msgstr "local_copy_dir deve essere una cartella, non un file!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" msgstr "il mirror '%s' non finisce con 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "gli argomenti che si escludono a vicenda devono essere opzionali" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" msgstr "prossimo aggiornamento cache {name} tra {time}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" msgstr "nessuna \"icona\" in {appid}" #: ../fdroidserver/signatures.py msgid "no APK supplied" msgstr "nessun APK fornito" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" msgstr "opzione inesistente: %s" #: ../fdroidserver/__main__.py msgid "no version info found!" msgstr "nessuna informazione sulla versione è stata trovata!" #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "nessuna informazione sulla versione trovata" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "non consentito con argomento %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "uno degli argomenti %s è richiesto" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" msgstr "accetta solo stringhe, liste e tuple" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "opzione %s: Se volete davvero installare tutte le app firmate, usate --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "opzione %s: valore %s non valido: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "opzione %s: scelta non valida: %r (scegliere da %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" msgstr "opzione -%s non riconosciuta" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" msgstr "l'opzione -%s richiede degli argomenti" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "l'opzione --%s non deve avere argomenti" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "l'opzione --%s non ha un prefisso univoco" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" msgstr "opzione --%s non riconosciuta" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s requires argument" msgstr "l'opzione --%s richiede un argomento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "argomenti facoltativi" #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "opzioni" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" msgstr "sovrascrivendo il {path} esistente" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "argomenti posizionali" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" msgstr "processo log deploy {path} a {dest} fallito!" #: ../fdroidserver/build.py msgid "reference binary missing signature" msgstr "binario di riferimento senza firma" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" msgstr "rifiuta il download tramite connessione HTTP insicura (usa HTTPS o specifica --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." msgstr "repo_icon \"repo/icons/%s\" non esiste, genera un segnaposto." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" msgstr "Il repo_url deve terminare con /repo" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml non installato, non può scrivere metadati." #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sincronizza gli indici {path} con {url} e cancella" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "la cache dello scanner è malformata! Puoi svuotarla con: '{clear}'" #: ../fdroidserver/scanner.py msgid "shared library" msgstr "libreria condivisa" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" msgstr "mostra il numero di versione del programma ed esci" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" msgstr "mostra questo messaggio di aiuto ed esci" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." msgstr "APK firmato, un percorso di file o un URL HTTPS." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" msgstr "saltare la distribuzione dei log di compilazione completi: il contenuto del log è vuoto" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" msgstr "saltare la distribuzione dei log di compilazione completi: non abilitato nella configurazione" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" msgstr "saltare il tarball di origine: {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" msgstr "srclibs manca il nome e/o @" #: ../fdroidserver/scanner.py msgid "static library" msgstr "libreria statica" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" msgstr "il binario di riferimento fornito ha il firmatario autorizzato {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "i seguenti argomenti sono obbligatori: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "stringa di opzioni inaspettata: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "parser sconosciuto %(parser_name)r (scelte: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "argomenti sconosciuti: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "permessi su \"{config_file}\" insicuri (dovrebbero essere 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "utilizzo: " #: ../fdroidserver/deploy.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" msgstr "utilizzando Apache libcloud per sincronizzare con {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com sta limitando il tasso, in attesa di riprovare..." #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" msgstr[0] "{0} app, {1} alias chiave" msgstr[1] "{0} applicazioni, {1} alias chiave" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) non ha metadati!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" msgstr "{apkfilename} ha più file {name}, sembra un exploit di Master Key!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "L'AndroidManifest.xml di {apkfilename} ha una data non corretta: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} non ha un nome! Usa invece l'ID dell'applicazione." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" msgstr "{appid} da {path} non è un ID di applicazione Android valido!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid} da {path} non è un nome di pacchetto Java valido!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" msgstr "{appid} ha sia APK che file: {files}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" msgstr "{appid} manca {name}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" msgstr "{appid}: extlib sconosciuto {path} nella build '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" msgstr "{appid}: nessuna build specificata, in esecuzione sullo stato sorgente corrente" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" msgstr "{appid}:{field} deve essere un '{type}', ma è un '{fieldtype}!'" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" msgstr "{appid}: {field} deve essere un '{type}', ma è un '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} deve essere un intero, trovato: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be list or string, found: {value}" msgstr "{build_flag} deve essere una lista o una stringa, trovato: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" msgstr "{file} è vuoto o corrotto!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" non esiste! Controlla \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} è deprecato, usa {newfile}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "{path} esiste già, ignorando i risultati dell'importazione!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" msgstr "{path} non esiste! Crealo eseguendo:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} ha una cattiva firma di file \"{pattern}\", possibile exploit di Janus!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" msgstr "{path} è di dimensioni zero!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} più di 200MB, caricare manualmente: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} non finisce con \"fdroid\", controlla il percorso dell'URL!" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url} non inizia con \"http\"!" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" msgstr[0] "{} costruzione fallita" msgstr[1] "{} le costruzioni sono fallite" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} costruzione riuscita" msgstr[1] "{} costruisce con successo" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/locale/ko/0000755000175000017500000000000014620351546014660 5ustar00hanshans././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.888382 fdroidserver-2.3a1/locale/ko/LC_MESSAGES/0000755000175000017500000000000014620351546016445 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/locale/ko/LC_MESSAGES/fdroidserver.po0000644000175000017500000022411114620351225021476 0ustar00hanshans# SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # Hans-Christoph Steiner , 2020, 2021, 2022, 2024. # Myeongjin Lee , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-135-g16dd6d28\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Korean \n" "Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" "\n" "배포 키로 사용될 SSH 공개 키:" #: ../fdroidserver/nightly.py #, python-brace-format msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" "\n" "{path}는 DEBUG_KEYSTORE 비밀 변수를 위해 인코딩됩니다:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\"에 일치하는 메타데이터 파일이 없습니다!" #: ../fdroidserver/index.py #, fuzzy, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" msgstr "Android SDK 경로 '{path}'는 존재하지 않습니다!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\"는 이미 {dev}에 설치되어 있습니다." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" msgstr "\"{path}\"는 오래된 {name} ({version})를 포함합니다" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" msgstr "\"{path}\"는 최근 {name} ({version})를 포함합니다" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" msgstr "\"{path}\"는 존재하지만 s3cmd는 설치되어 있지 않습니다!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\"은 올바른 URL이 아닙니다!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" msgstr[0] "%(option)s 옵션은 %(number)d 인자가 필요합니다" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: 오류: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" msgstr "문제 %d개를 찾음" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "%prog [options]" msgstr "%prog [옵션]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" msgstr "%r는 호출할 수 없습니다" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" msgstr "" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" msgstr "" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" msgstr "%s는 빌드 필드 값으로 허용되지 않습니다" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" msgstr "%s 옵션은 값을 받지 않습니다" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass'를 config.yml에서 찾을 수 없습니다!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore'이 없고 'smartcardoptions'가 비어 있습니다!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "'keystore'를 config.yml에서 찾을 수 없습니다!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass'를 config.yml에서 찾을 수 없습니다!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias'를 config.yml에서 찾을 수 없습니다!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required'는 고정적을 위한 잘못된 인수입니다" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" msgstr "'sdk_path'가 config.yml에서 설정되어 있지 않습니다!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}'는 너무 오래되었습니다, fdroid는 build-tools-{version} 이후가 필요합니다!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" msgstr "'{field}'는 순서가 무작위로 변합니다! 순서가 중요하면 괄호 ()나 대괄호 []를 사용하세요!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" msgstr "'{path}'를 실행하는 데 실패했습니다!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}'는 {appid}에서 올바른 {field}가 아닙니다. 정규식 패턴: {pattern}" #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}'에서 올바른 {field}가 아닙니다. 정규식 패턴: {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" msgstr "...{appid}를 위한 checkupdate가 실패됨 : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__()이 정의되지 않음" #: ../fdroidserver/lint.py msgid "/issues is missing" msgstr "/이슈가 없습니다" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" msgstr "URL은 인수로서 필요합니다!" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "저장소의 패키지를 위해 GnuPG를 사용하여 PGP 서명을 추가합니다" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" msgstr "서명되지 않은 저장소에 저장소 서명 키를 추가합니다" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" msgstr "{name}를 위해서만 새 저장소를 추가하기" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" msgstr "키스토어에서 저장소 서명 키의 별칭" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" msgstr "" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" msgstr "또한 전체 보존 절을 미러합니다" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" msgstr "또한 rewritemeta -l와 같이, 포맷팅 이슈에 대해 경고합니다" #: ../fdroidserver/scanner.py msgid "Android AAR library" msgstr "" #: ../fdroidserver/scanner.py msgid "Android APK file" msgstr "" #: ../fdroidserver/scanner.py msgid "Android DEX code" msgstr "" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" msgstr "{path}에서 Android SDK를 찾을 수 없습니다!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" msgstr "Android SDK 경로 '{path}'는 존재하지 않습니다!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" msgstr "Android SDK 경로 '{path}'는 디렉터리가 아닙니다!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" msgstr "" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" msgstr "앱은 '{repo}'에 있지만 {url}로의 연결이 있습니다" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr ".git 추가가 필요하지 않습니다" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" msgstr "올바르지 않은 서명으로 {apkfilename}를 보존 중입니다!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" msgstr "" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" msgstr "브랜치 '{branch}'는 빌드 '{versionName}'에서 커밋으로 사용됩니다" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" msgstr "브랜치 '{branch}'는 srclib '{srclib}'에서 커밋으로 사용됩니다" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" msgstr "" #: ../fdroidserver/__main__.py msgid "Build a package from source" msgstr "소스로부터 패키지를 빌드합니다" #: ../fdroidserver/build.py msgid "Build all applications available" msgstr "사용 가능한 모든 애플리케이션을 빌드합니다" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" msgstr "" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" msgstr "" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" msgstr "" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" msgstr "" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" msgstr "" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" msgstr "" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "카테고리 '%s'는 올바르지 않습니다" #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "카테고리가 설정되어 있지 않습니다" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "애플리케이션으로의 업데이트를 확인합니다" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" #: ../fdroidserver/__main__.py #, python-format msgid "Command '%s' not recognised.\n" msgstr "명령 '%s'은 인식되지 않습니다.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" msgstr "번경사항 커밋" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" msgstr "" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" #: ../fdroidserver/checkupdates.py msgid "Couldn't find any version information" msgstr "" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "기록 디렉터리 만들기" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" msgstr "" #: ../fdroidserver/publish.py msgid "Creating output directory" msgstr "출력 디렉터리 만들기" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" msgstr "" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" msgstr "임시 디렉터리 만들기" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" msgstr "" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" msgstr "" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" msgstr "저장소에서 메타데이터 없이 APK 및/또는 OBB를 삭제합니다" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" msgstr "알 수 없는 파일 삭제하기: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" msgstr "" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" msgstr "" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" msgstr "" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" msgstr "" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" msgstr "" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" msgstr "" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" msgstr "" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" msgstr "" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" msgstr "" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" msgstr "" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" msgstr "" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" msgstr "" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." msgstr "" #: ../fdroidserver/init.py #, python-format msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" msgstr "" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" msgstr "" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" msgstr "" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" msgstr "" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" msgstr "" #: ../fdroidserver/common.py msgid "Failed to sign application" msgstr "" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" msgstr "" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" msgstr "" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py #: ../fdroidserver/update.py msgid "Finished" msgstr "마침" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" msgstr "" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." msgstr "" #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" msgstr "" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" msgstr "앱 \"{name}\"를 위한 메타데이터가 없이 \"{path}\" 그래픽을 찾았습니다!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" msgstr "" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." msgstr "" #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." msgstr "" #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" msgstr "" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} problems in {filename}" msgstr "" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" msgstr "" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" msgstr "" #: ../fdroidserver/common.py msgid "Git clean failed" msgstr "" #: ../fdroidserver/common.py msgid "Git fetch failed" msgstr "" #: ../fdroidserver/common.py #, fuzzy msgid "Git prune failed" msgstr "git svn 복제에 실패됨" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" #: ../fdroidserver/common.py msgid "Git submodule update failed" msgstr "" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" msgstr "" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." msgstr "" #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" msgstr "" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" msgstr "" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" msgstr "" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" msgstr "" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" msgstr "" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" msgstr "" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" msgstr "" #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "하위 모듈을 초기 설정 중" #: ../fdroidserver/install.py msgid "Install all signed applications available" msgstr "사용 가능한 모든 서명된 애플리케이션 설치" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" msgstr "기기에 내장된 패키지 설치" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." msgstr "%s 설치 중…" #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." msgstr "{dev}에서 '{apkfilename}' 설치 중..." #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" msgstr "저장소 HTTP 서버와의 상호 작용" #: ../fdroidserver/update.py msgid "Invalid APK" msgstr "올바르지 않은 APK" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" msgstr "잘못된 Vercode연산: {field}" #: ../fdroidserver/lint.py #, fuzzy, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "잘못된 VercodeOperation연산: {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" msgstr "올바르지 않은 부울 '%s'" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "잘못된 글머리 기호 목록" #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" msgstr "게시된 파일을 위한 잘못된 이름: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " msgstr "HTTPS가 아닌 곳으로의 잘못된 리다이렉트: {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" msgstr "" #: ../fdroidserver/scanner.py msgid "Java JAR file" msgstr "" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" msgstr "" #: ../fdroidserver/scanner.py msgid "Java compiled class" msgstr "" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" msgstr "" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" msgstr "" #: ../fdroidserver/build.py #, fuzzy, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" msgstr "삭제 중: repo/{apkfilename}" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "서명 키를 위한 키저장소:\t" #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" msgstr "" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" msgstr "" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted (dry run)" msgstr "" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" msgstr "" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." msgstr "" #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" msgstr "" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" msgstr "" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" #: ../fdroidserver/gpgsign.py msgid "Missing output directory" msgstr "" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" msgstr "" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" #: ../fdroidserver/verify.py #, python-format msgid "No APK for package: %s" msgstr "" #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "" #: ../fdroidserver/install.py msgid "No attached devices found" msgstr "" #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" #: ../fdroidserver/common.py msgid "No git submodules available" msgstr "" #: ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "" #: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "" #: ../fdroidserver/checkupdates.py msgid "No matching tags found" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." msgstr "" #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py msgid "No packages specified" msgstr "" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" msgstr "" #: ../fdroidserver/common.py #, python-format msgid "No such package: %s" msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" msgstr "" #: ../fdroidserver/checkupdates.py msgid "No tags found" msgstr "" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" msgstr "" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" #: ../fdroidserver/signindex.py msgid "Nothing to do" msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py msgid "Now set these in config.yml:" msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" msgstr "" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" msgstr "" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" msgstr "" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "PNG와 JPEG만 그래픽을 위해 지원됩니다, 찾았습니다: {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" #: /usr/lib/python3.11/optparse.py msgid "Options" msgstr "옵션" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." msgstr "" #: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py #: ../fdroidserver/publish.py ../fdroidserver/signindex.py #: ../fdroidserver/update.py msgid "Outputting JSON" msgstr "" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "" #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" msgstr "" #: ../fdroidserver/common.py msgid "Password required with username" msgstr "" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "" #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" msgstr "" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" msgstr "" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" msgstr "" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" msgstr "" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" msgstr "" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" msgstr "" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" msgstr "" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" msgstr "사람이 읽을 수 있는 색인 파일을 위한 XML/JSON을 생산합니다" #: ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "" #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" msgstr "" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing binary transparency log to {url}" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" msgstr "" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" msgstr "새 저장소를 빠르게 시작합니다" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" msgstr "모든 메타데이터 파일을 읽고 종료합니다" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" msgstr "" #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" msgstr "" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "package.name_123.apk와 일치하지 않는 APK 파일의 이름을 바꿉니다" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" msgstr "" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" msgstr "" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" msgstr "" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" msgstr "" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "모든 메타데이터 파일을 다시 씁니다" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" msgstr "" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" msgstr "" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" #: ../fdroidserver/deploy.py msgid "Running first pass with MD5 checking disabled" msgstr "" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" msgstr "" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" msgstr "" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" msgstr "패키지의 소스 코드를 스캔합니다" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {apk}" msgstr "" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" msgstr "" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" msgstr "" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "" #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" msgstr "" #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" msgstr "" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" msgstr "" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" msgstr "" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " msgstr "" #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" msgstr "" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "저장소에서 패키지를 서명하고 배치합니다" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" msgstr "update --nosign을 사용하여 만들어진 색인을 서명합니다" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" msgstr "" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" msgstr "" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" msgstr "" #: ../fdroidserver/deploy.py msgid "Specify an identity file to provide to SSH for rsyncing" msgstr "" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." msgstr "" #: ../fdroidserver/common.py msgid "Spew out even more information than normal" msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" msgstr "" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" msgstr "" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" msgstr "" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" msgstr "" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" msgstr "" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" msgstr "" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" msgstr "" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" msgstr "" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" msgstr "" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." msgstr "" #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" #: ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/init.py #, python-format msgid "" "To complete the setup, add your APKs to \"%s\"\n" "then run \"fdroid update -c; fdroid update\". You might also want to edit\n" "\"config.yml\" to set the URL, repo name, and more. You should also set up\n" "a signing key (a temporary one might have been automatically generated).\n" "\n" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" msgstr "" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" msgstr "잘못된 라이선스 태그 \"{}\"! https://spdx.org/license-list 에서 FSF 또는 OSI에서 승인된 태그만을 사용하세요" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" msgstr "" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "알 수 없는 예외가 찾아졌습니다!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" msgstr "빌드 '{versionName}'에서 알 수 없는 파일 '{filename}'" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" msgstr "알 수 없는 메타데이터 형식: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" msgstr "알 수 없는 메타데이터 형식: {path} (사용: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " msgstr "" #: ../fdroidserver/lint.py msgid "Unnecessary leading space" msgstr "" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" msgstr "저장소 그래픽을 위한 파일 형식 \"{extension}\"가 지원되지 않습니다" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" msgstr "지원되지 않는 그래픽 파일을 찾았습니다: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" msgstr "%s에서 사용되지 않은 extlib" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" msgstr "%s에서 사용되지 않은 파일" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" msgstr "사용되지 않은 스캔삭제 경로: %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" msgstr "사용되지 않은 스캔삭제 경로: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" msgstr "" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "새 패키지를 위한 저장소 정보를 업데이트합니다" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" msgstr "URL을 위한 바이너리 투명성 기록을 업데이트합니다" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData에 올바르지 않은 URL이 있습니다: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" msgstr "UpdateCheckData는 HTTPS URL을 사용해야 합니다: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData는 올바른 URL이 아닙니다: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "Usage" msgstr "사용법" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "Usage: %s\n" msgstr "사용법: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "그것을 만드려면 `fdroid update -c`를 사용하세요." #: ../fdroidserver/build.py msgid "Use build server" msgstr "빌드 서버를 사용합니다" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" msgstr "새로 추가된 APK를 위해 현재 시간 대신에 APK에서의 날짜를 사용합니다" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." msgstr "s3cmd를 구성하기 위해 \"{path}\" 사용." #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" #: ../fdroidserver/common.py msgid "Using APK Signature v3" msgstr "" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Java의 jarsigner를 사용하여, APK를 검증하는 것은 권장되지 않습니다! apksigner를 사용하세요" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" msgstr "\"{path}\"에서 androguard를 사용 중" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" msgstr "" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" msgstr "기존 키스토어 \"{path}\"를 사용 중" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" msgstr "다음과 동기화하는 데 s3cmd 사용: {url}" #: ../fdroidserver/__main__.py msgid "Valid commands are:" msgstr "올바른 명령은:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." msgstr "로컬에 캐시된 복사본을 다시 다운로드하는 대신에 검증합니다." #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" msgstr "다운로드된 패키지의 무결성 확인" #: ../fdroidserver/index.py msgid "Verifying index signature:" msgstr "색인 서명을 검증 중:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "가능한 메타데이터 오류에 대해 경고합니다" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" msgstr "당신은 당신의 SDK에 경로를 설정하기 위해 ANDROID_HOME을 사용할 수 있습니다, 즉:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" msgstr "{path}에 IdentityFile을 추가 중" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" msgstr "{name}에 추가 중: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "모호한 옵션: %(option)s은 %(matches)s와 일치했을 수 있습니다" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "모호한 옵션: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "작업할 파일의 애플리케이션 ID" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" msgstr "양식 APPID[:VERCODE]에서 선택적인 versionCode로 된 애플리케이션 ID" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" msgstr "" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" msgstr "" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "'%(filename)s'를 열 수 없습니다: %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" msgstr "" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "작동을 병합할 수 없습니다 - 두 그룹은 %r로 이름지어져 있습니다" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" msgstr "{url}를 복제 중" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" msgstr "복잡" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "충돌하는 옵션 문자열: %s" #: /usr/lib/python3.11/argparse.py #, fuzzy, python-format msgid "conflicting subparser alias: %s" msgstr "충돌하는 옵션 문자열: %s" #: /usr/lib/python3.11/argparse.py #, fuzzy, python-format msgid "conflicting subparser: %s" msgstr "충돌하는 옵션 문자열: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" msgstr "" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" msgstr "{path}가 만들어짐" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" msgstr "삭제 중: repo/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest=는 %r과 같은 옵션을 위해 필요합니다" #: ../fdroidserver/scanner.py msgid "downloading '{}'" msgstr "" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" msgstr "" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [<명령>] [-h|--help|--version|<인수>]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" msgstr "" #: /usr/lib/python3.11/optparse.py msgid "floating-point" msgstr "부동소수점" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "경고하거나 무시되는 강제 메타데이터 오류 (기본값)." #: ../fdroidserver/common.py msgid "git svn clone failed" msgstr "git svn 복제에 실패됨" #: ../fdroidserver/scanner.py msgid "gzip file archive" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1은 서명이 있어야 합니다, 그것을 만드려면 `fdroid signindex`를 사용하세요!" #: ../fdroidserver/index.py #, fuzzy msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1은 서명이 있어야 합니다, 그것을 만드려면 `fdroid signindex`를 사용하세요!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" msgstr "정수" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "올바르지 않은 %(type)s 값: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "올바르지 않은 선택: %(value)r (%(choices)s에서 선택하세요)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "올바르지 않은 conflict_resolution 값: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "올바르지 않은 옵션 문자열 %(option)r: 문자 %(prefix_chars)r로 시작해야 합니다" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" msgstr "" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" msgstr "local_copy_dir는 파일이 아니라, 디렉터리여야 합니다!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" msgstr "미러 '%s'는 'fdroid'로 끝나지 않습니다!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" msgstr "" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" msgstr "{appid}에 \"icon\"이 없습니다" #: ../fdroidserver/signatures.py msgid "no APK supplied" msgstr "제공된 APK가 없습니다" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" msgstr "이러한 옵션이 없습니다: %s" #: ../fdroidserver/__main__.py msgid "no version info found!" msgstr "버전 정보를 찾지 못했습니다!" #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "버전 정보를 찾지 못했습니다" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" msgstr "" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "옵션 %s: 당신이 정말 모든 서명된 앱을 설치하기를 원한다면, --all을 사용하세요" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "옵션 %s: 올바르지 않은 %s 값: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "옵션 %s: 올바르지 않은 선택: %r (%s에서 선택하세요)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" msgstr "옵션 -%s은 인식되지 않습니다" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" msgstr "옵션 -%s은 인수가 필요합니다" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "옵션 --%s은 인수를 가지지 않아야 합니다" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "옵션 --%s는 고유한 접두어가 아닙니다" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" msgstr "옵션 --%s은 인식되지 않습니다" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s requires argument" msgstr "옵션 --%s은 인수가 필요합니다" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "선택적 인수" #: /usr/lib/python3.11/argparse.py #, fuzzy msgid "options" msgstr "옵션" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" msgstr "기존 {path}를 덮어쓰는 중" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "고정적 인수" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" msgstr "" #: ../fdroidserver/build.py msgid "reference binary missing signature" msgstr "" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" msgstr "" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." msgstr "" #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" msgstr "" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd 동기화는 {url}로 {path}를 색인하고 삭제합나다" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" msgstr "프로그램의 버전 번호를 보여주고 종료합니다" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" msgstr "이 도움말 메시지를 보여주고 종료합니다" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." msgstr "서명된 APK, 파일 경로 또는 HTTPS URL 중 하나." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" msgstr "" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" msgstr "소스 타르볼을 건너뛰는 중: {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" msgstr "srclibs 없는 이름 및/또는 @" #: ../fdroidserver/scanner.py msgid "static library" msgstr "" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "다음 인수들이 필요합니다: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "예기치 않은 옵션 문자열: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "알 수 없는 파서 %(parser_name)r (선택: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "인식할 수 없는 인수: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "'{config_file}'에 안전하지 않은 권한 (0600이어야 합니다)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "사용법: " #: ../fdroidserver/deploy.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" msgstr "" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" msgstr[0] "앱 {0}개, 키 별칭 {1}개" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid})에 메타데이터가 없습니다!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "{apkfilename}의 AndroidManifest.xml에 잘못된 날짜가 있습니다: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid}는 이름을 가지지 않습니다! 대신 애플리케이션 ID를 사용." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" msgstr "" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" msgstr "" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" msgstr "{appid}는 없는 {name}입니다" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" msgstr "{appid}: 빌드 '{versionName}'에서 알 수 없는 extlib {path}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be list or string, found: {value}" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\"는 존재하지 않습니다! \"config.yml\"을 확인하세요." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" msgstr "" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" msgstr "{path}는 존재하지 않습니다! 실행하여 그것을 만드세요:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" msgstr "{path}는 영 크기입니다!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" msgstr "" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url}는 \"fdroid\"로 끝나지 않습니다, URL 경로를 확인하세요!" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url}는 \"http\"로 시작하지 않습니다!" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" msgstr[0] "{} 빌드 실패됨" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} 빌드 성공됨" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/locale/nb_NO/0000755000175000017500000000000014620351546015242 5ustar00hanshans././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.888382 fdroidserver-2.3a1/locale/nb_NO/LC_MESSAGES/0000755000175000017500000000000014620351546017027 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/locale/nb_NO/LC_MESSAGES/fdroidserver.po0000644000175000017500000025644514620351225022077 0ustar00hanshans# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # Allan Nordhøy , 2020, 2021, 2022. # Hans-Christoph Steiner , 2020, 2022. # mondstern , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-74-ga380b9f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2022-09-06 14:30+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Norwegian Bokmål \n" "Language: nb_NO\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.14.1-dev\n" #: ../fdroidserver/nightly.py #, fuzzy msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" "\n" "Offentlig SSH-nøkkel å bruke som utrullingsnøkkel:" #: ../fdroidserver/nightly.py #, python-brace-format msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" "\n" "{path} kodet for hemmelig DEBUG_KEYSTORE-variabel:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" har ingen samsvarende metadatafil!" #: ../fdroidserver/index.py #, fuzzy, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" msgstr "Rotmappen for local_copy_dir \"{path}\" finnes ikke." #: ../fdroidserver/install.py #, fuzzy, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "'{apkfilename}' er allerede installert på {dev}." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" msgstr "\"{path}\" inneholder utdatert {name} ({version})" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" msgstr "\"{path}\" inneholder nylig {name} ({version})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" msgstr "\"{path}\" finnes, men s3cmd er ikke installert!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" msgstr "\"{path}\" er ikke et støttet filformat. (bruk: metadata/*.yml)" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" er ikke en gyldig nettadresse." #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" msgstr[0] "%(option)s-valget krever %(number)d argument" msgstr[1] "%(option)s-valget krever %(number)d argumenter" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: feil: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" msgstr "%d problemer funnet" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "%prog [options]" msgstr "%prog [valg]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" msgstr "%r kan ikke kalles" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" msgstr "" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" msgstr "" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" msgstr "%s er ikke et godtatt bygge-felt" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" msgstr "%s-valget tar ikke en verdi" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' ble ikke funnet i config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "«keystore» er NONE og «smartcardoptions» er tom!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "'keystore' ble ikke funnet i config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' ble ikke funnet i config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' ble ikke funnet i config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, fuzzy msgid "'required' is an invalid argument for positionals" msgstr "'required' er et ugyldig argument for posisjonsinfo" #: ../fdroidserver/common.py #, fuzzy msgid "'sdk_path' not set in config.yml!" msgstr "'sdk_path' ble ikke funnet i config.yml!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' er for gammel, fdroid krever build-tools-{version} eller nyere." #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" msgstr "'{field}' vil bli utført i tilfeldig rekkefølge. Bruk () eller [] -parenteser hvis rekkefølgen er viktig." #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" msgstr "\"{path}\" klarte ikke å kjøre." #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "\"{value}\" er ikke et gyldig {field} i {appid}. Mønster for regulært uttrykk: {pattern}" #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "\"{value}\" er ikke et gyldig {field} i {appid}. Mønster for regulært uttrykk: {pattern}" #: ../fdroidserver/checkupdates.py #, fuzzy, python-brace-format msgid "...checkupdate failed for {appid} : {error}" msgstr "…oppdateringssjekk mislyktes for {appid}: {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() udefinert" #: ../fdroidserver/lint.py msgid "/issues is missing" msgstr "/issues mangler" #: ../fdroidserver/mirror.py #, fuzzy msgid "A URL is required as an argument!" msgstr "valg -%s krever et argument" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Legg til PGP-signaturer for pakker i pakkebrønnen ved bruk av GnuPG" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" msgstr "Legg til pakkebrønnssigneringsnøkkel for usignert repo" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" msgstr "Legg til skjelettmetadatafiler for APK-er som ikke har dem" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "Adding new repo for only {name}" msgstr "Legger til ny pakkebrønn kun for {name}" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" msgstr "Alias for pakkebrønnssigneringsnøkkel i nøkkellageret" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" msgstr "" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Tillater en annen revisjon (eller git-avgreining) å angis for igangsettende import" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" msgstr "Speil også hele arkivdelen" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" msgstr "Advar også om formateringsproblemer, som rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" msgstr "AAR-bibliotek for Android" #: ../fdroidserver/scanner.py msgid "Android APK file" msgstr "APK-fil for Android" #: ../fdroidserver/scanner.py #, fuzzy msgid "Android DEX code" msgstr "Fant ingen Android-SDK." #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" msgstr "Fant ikke Android-SDK i {path}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" msgstr "Sti for Android-SDK \"{path}\" finnes ikke." #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" msgstr "Android SDK-stien '{path}' er ikke ei mappe." #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Android SDK tool {cmd} not found!" msgstr "Fant ikke Android-SDK-verktøyet {cmd}!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" msgstr "Program finnes i '{repo}', men har en lenke til {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Å legge til .git er ikke nødvendig" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" msgstr "Pakker {apkfilename} med ugyldig signatur." #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" msgstr "" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "Grunnettadresse å speile, kan inkludere indekssigneringsnøkkelen ved bruk av spørreingsstrengen: ?fingerpring=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" msgstr "Forgrening '{branch}' brukt som innsendelse i bygg '{versionName}'" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" msgstr "Forgrening '{branch}' brukt som innsendelse i srclib '{srclib}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" msgstr "Brutt symbolsk lenke: {path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" msgstr "Bygg en pakke fra kildekode" #: ../fdroidserver/build.py msgid "Build all applications available" msgstr "Bygg alle tilgjengelige versjoner" #: ../fdroidserver/lint.py #, fuzzy msgid "Build generated by `fdroid import` - remove disable line once ready" msgstr "Bygg generert av `fdroid import`- fjern linje for avskruing når det er klart" #: ../fdroidserver/checkupdates.py #, fuzzy msgid "Build metadata git repo has uncommited changes!" msgstr "Git-pakkebrønn for byggmetadata har uinnsendte endringer." #: ../fdroidserver/build.py msgid "Build only the latest version of each package" msgstr "Bygg kun seneste versjon av hver pakke" #: ../fdroidserver/init.py #, fuzzy, python-format msgid "Built repo based in \"%s\" with this config:" msgstr "Bygde pakkebrønn med base i \"%s\" med dette oppsettet:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" msgstr "Kan ikke auto-uppgradere program som mangler «CurrentVersionCode»" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "Kan ikke bygge som følge av {} feil under skanning" msgstr[1] "Kan ikke bygge som følge av {} feiler under skanning" #: ../fdroidserver/rewritemeta.py #, fuzzy, python-brace-format msgid "Cannot rewrite \"{path}\"" msgstr "Kan ikke lese \"{path}\"." #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "Kategorien '%s' er ikke gyldig" #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "Kategoreier ikke satt" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Se etter programoppdateringer" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Sjekker arkivering for {appid} - APK-er:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Ren oppdatering, ikke bruk hurtiglager, behandle alle APK-er på ny" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Kommainndelt liste over kategorier." #: ../fdroidserver/__main__.py #, python-format msgid "Command '%s' not recognised.\n" msgstr "Kommandoen \"%s\" gjenkjennes ikke.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" msgstr "Send inn endringer" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" msgstr "" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argumenter i konflikt: '--verbose' og '--quiet' kan ikke angis samtidig." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" msgstr "Filer i konflikt med hverandre. Bruker {newfile}, ser bort fra {oldfile}." #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "Fant ikke \"{command}\" på ditt system" #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Could not find latest version code" msgstr "Fant ikke seneste versjonskode" #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Could not find latest version name" msgstr "Fant ikke seneste versjonsnavn" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "Could not find {path} to remove it" msgstr "Fant ikke \"{path}\" for fjerning derav" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "Could not open APK {path} for analysis: " msgstr "Kunne ikke åpne APK {path} for analyse: " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Kunne ikke fortolke størrelse \"{size}\", feil type \"{type}\"" #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Couldn't find Application ID" msgstr "Fant ikke pakke-ID" #: ../fdroidserver/checkupdates.py #, fuzzy msgid "Couldn't find any version information" msgstr "Fant ikke seneste versjonsnavn" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "Fant ikke pakke-ID" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" msgstr "Nekter feigt å overskrive eksisterende nøkkelsigneringsoppsett." #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" msgstr "Opprettet ny beholder \"{name}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Oppretter \"{path}\" for oppsett av s3cmd." #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Oppretter loggingsmappe" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" msgstr "Oppretter ny S3-spann: {url}" #: ../fdroidserver/publish.py msgid "Creating output directory" msgstr "Oppretter utdatamappe" #: ../fdroidserver/index.py #, fuzzy msgid "Creating signed index with this key (SHA256):" msgstr "Oppretter signert indeks med denne nøkkelen (SHA-256):" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" msgstr "Oppretter midlertidig mappe" #: ../fdroidserver/index.py #, fuzzy msgid "Creating unsigned index in preparation for signing" msgstr "Oppretter usignert indeks i påvente av signering" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" msgstr "CurrentVersionCode {cv} er mindre enn eldste byggoppføring {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" msgstr "DEBUG_KEYSTORE er ikke satt, eller så er verdien ufullstendig" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" msgstr "Slett APK-er og/eller OBB-er uten metadata fra pakkebrønnen" #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" msgstr "Sletter arkiv, pakkebrønnen er for stor ({size} maks. {limit})" #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" msgstr "Sletter historikk for git-mirror, pakkebrønnen er for stor ({size} maks. {limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" msgstr "Sletter ukjent fil: {path}" #: ../fdroidserver/lint.py #, fuzzy, python-format msgid "Description '%s' is just the app's summary" msgstr "Beskrivelsen \"%s\" er bare programsammendraget" #: ../fdroidserver/lint.py #, fuzzy msgid "Description has a duplicate line" msgstr "Beskrivelsen har repetert linje" #: ../fdroidserver/lint.py #, fuzzy, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" msgstr "Beskrivelsen har en liste (%s), men er ikke punktvis (*) eller nummerert (#)" #: ../fdroidserver/lint.py #, fuzzy, python-brace-format msgid "Description of length {length} is over the {limit} char limit" msgstr "Beskrivelse av lengde {length} overstiger {limit} tegngrensen" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Ikke legg til «deaktivert:» blant genererte bygg" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" msgstr "Ikke send de nye filene til pakkebrønnen" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" msgstr "Ikke inkluder \"{path}\" i nettadresse." #: ../fdroidserver/init.py #, fuzzy msgid "Do not prompt for Android SDK path, just fail" msgstr "Ikke spør om Android-SDK-sti, bare spill fallitt" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" msgstr "Ikke fjern de private nøklene generert fra nøkkellageret" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" msgstr "Ikke opprett en kildetjæreball, nyttig når et bygg skal testes" #: ../fdroidserver/build.py #, fuzzy msgid "Don't refresh the repository, useful when testing a build with no internet connection" msgstr "Ikke gjenoppfrisk pakkebrønnen, nyttig under testing av et bygg uten å ha internettilkobling" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" msgstr "Ikke bruk rsync-sjekksummer" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Last ned fullstendige speilinger av små pakkebrønner" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" msgstr "Laster ned %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Nedlasting av pakkebrønn mislyktes én gang, prøver ikke igjen." #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" msgstr "Nedlasting av {url} mislyktes. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" msgstr "" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" msgstr "Dobbeltlenke i \"{field}\": {url}" #: ../fdroidserver/__main__.py #, fuzzy msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "Feil: «server»-underkommandoen har blitt fjernet. Bruk «depoloy»." #: ../fdroidserver/mirror.py #, fuzzy msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" "Feil: Denne kommandoen bør aldri brukes til å speile f-droid.org.\n" "Et helt speil av f-droid.org krever mer enn 200GB." #: ../fdroidserver/nightly.py #, fuzzy msgid "ERROR: unsupported CI type, patches welcome!" msgstr "Feil: Ustøttet CI-type, feilrettinger er velkomne." #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." msgstr "" #: ../fdroidserver/init.py #, python-format msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" "Skriv inn stien til Android SDK (%s) her:\n" "> " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" msgstr "Miljøvariabelen {var} fra {configname} er ikke satt!" #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Error while getting repo address" msgstr "Kunne ikke hente pakkebrønnsadresse" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" msgstr "" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Hent ut signaturer fra APK-er" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "Failed copying {path}: {error}" msgstr "Klarte ikke å lese {path}: {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" msgstr "Klarte ikke å hente signaturer for '{apkfilename}': {error}" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "Failed reading {path}: {error}" msgstr "Klarte ikke å lese {path}: {error}" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "Failed resizing {path}: {error}" msgstr "Klarte ikke å endre størrelse på {path}: {error}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" msgstr "Klarte ikke å opprette S3-spann: {url}" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "Failed to get APK information, deleting {path}" msgstr "Klarte ikke å hente APK-info, sletter {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" msgstr "Klarte ikke å hente APK-info, hopper over {path}" #: ../fdroidserver/update.py #, fuzzy msgid "Failed to get APK signing key fingerprint" msgstr "Klarte ikke å hente APK-manifestinfo" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" msgstr "Klarte ikke å installere '{apkfilename}' på {dev}: {error}" #: ../fdroidserver/common.py msgid "Failed to sign application" msgstr "Klarte ikke å singere program" #: ../fdroidserver/build.py #, fuzzy, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" msgstr "Hentet BuildServerID fra VM: {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" msgstr "Hentet signaturer for '{apkfilename}' → '{sigdir}'" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" msgstr "En fil ble borte mens den ble behandlet: {path}" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py #: ../fdroidserver/update.py msgid "Finished" msgstr "Fullført" #: ../fdroidserver/lint.py #, fuzzy msgid "Flattr donation methods belong in the FlattrID: field" msgstr "Flatter-donasjonsmetoder hører hjemme i FlattrID-flagget" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Forbudte HTML-tagger" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." msgstr "Tvinger bygging av avskrudde programmer, og fortsetter uavhengig av skanningsproblemer. Tillates kun i testmodus." #: ../fdroidserver/build.py #, fuzzy, python-brace-format msgid "Force halting build after {0} sec timeout!" msgstr "Tving gjennom byggstans etter {0} sek. tidsavbrudd." #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." msgstr "Påtving skanning av avskrudde programmer og bygg." #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" msgstr "Fant \"{path}\"-grafikk uten metadata for programmet \"{name}\"." #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "Fant feilaktig kronerullingsfil «{path}» for «{name}»:" #: ../fdroidserver/common.py #, fuzzy msgid "Found invalid appids in arguments" msgstr "Fant ugyldige App-ID-er i argumenter" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, fuzzy msgid "Found invalid versionCodes for some apps" msgstr "Noen programmer ble funnet å ha ugldige versionCodes" #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Fant flere signeringssertifikater i {path}." #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" msgstr "Fant flere metadatafiler for {appid}" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." msgstr "Fant flere signeringssertifikater for pakkebrønn." #: ../fdroidserver/index.py #, fuzzy msgid "Found no signing certificates for repository." msgstr "Fant ikke noe signeringssertifikat for pakkebrønn." #: ../fdroidserver/lint.py #, fuzzy, python-format msgid "Found non-file at %s" msgstr "Fant ikke-fil i %s" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" msgstr "Fant {apkfilename} i {url}" #: ../fdroidserver/scanner.py #, fuzzy, python-brace-format msgid "Found {count} problems in {filename}" msgstr "Skanner fant {count} problemer i {appid}:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" msgstr "Genererte skjelettmetadata for {appid}." #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" msgstr "Git-utsjekking av \"%s\" mislyktes" #: ../fdroidserver/common.py msgid "Git clean failed" msgstr "Git-tømming mislyktes" #: ../fdroidserver/common.py msgid "Git fetch failed" msgstr "Git-innhenting mislyktes" #: ../fdroidserver/common.py #, fuzzy msgid "Git prune failed" msgstr "Git-tilbakestilling mislyktes" #: ../fdroidserver/common.py #, fuzzy, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Git set-head annensteds hen mislyktes: «%s»" #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Git-tilbakestilling mislyktes" #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Git-synkronisering av undermodul mislyktes" #: ../fdroidserver/common.py msgid "Git submodule update failed" msgstr "Git-oppdatering av undermodul mislyktes" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" msgstr "HTTPS må brukes sammen med Subversjon-nettadresser." #: ../fdroidserver/deploy.py #, fuzzy msgid "If a git mirror gets to big, allow the archive to be deleted" msgstr "Hvis en Git-avspeiling blir for stor, tillat sletting av arkivet" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" msgstr "Hvis opplasting mislykkes kan du prøve å laste opp manuelt til {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." msgstr "Ser bort fra «{field}» i «{metapath}» fordi det er er foreldet." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "Ser bort fra FUNDING.yml-oppføring som er lengre enn 2048: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" msgstr "" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorerte pakke uten metadata: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" msgstr "Ignorerer brakk hurtiglagringsdata for {apkfilename}." #: ../fdroidserver/update.py #, fuzzy msgid "Include APKs that are signed with disabled algorithms like MD5" msgstr "Inkluder APK-er som er signert med svartelistede algoritmer, som MD5" #: ../fdroidserver/mirror.py #, fuzzy msgid "Include the PGP signature .asc files in the mirror" msgstr "Inkluder .asc-filer for PGP-signaturen i avspeilingen" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" msgstr "Inkluder byggloggene i avspeilingen" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" msgstr "Inkluder kildetjæreballene i avspeilingen" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" msgstr "" #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Igangsetter undermoduler" #: ../fdroidserver/install.py #, fuzzy msgid "Install all signed applications available" msgstr "Installer alle tilgjengelige signerte programmer" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" msgstr "Installer bygde pakker på enheter" #: ../fdroidserver/install.py #, fuzzy, python-format msgid "Installing %s..." msgstr "Installerer %s…" #: ../fdroidserver/install.py #, fuzzy, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." msgstr "Installerer '{apkfilename}' på {dev}…" #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" msgstr "Interagere med repo HTTP-serveren" #: ../fdroidserver/update.py msgid "Invalid APK" msgstr "Ugyldig APK" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" msgstr "Ugyldig AutoUpdateMode: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" msgstr "Ugyldig VercodeOperation: {field}" #: ../fdroidserver/lint.py #, fuzzy, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "Ugyldig VercodeOperation: {field}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "Ugyldig program-ID {appid}" #: ../fdroidserver/metadata.py #, fuzzy, python-format msgid "Invalid boolean '%s'" msgstr "Ugyldig boolsk uttrykk \"%s\"" #: ../fdroidserver/lint.py #, fuzzy msgid "Invalid bulleted list" msgstr "Ugyldig punktvis liste" #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" msgstr "Ugyldig navn for publisert fil: %s" #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" msgstr "Ugyldig NDK: oppføring i bygg: «{ndk}»" #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " msgstr "Ugyldig videresending til ikke-HTTPS: {before} → {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" msgstr "Ugyldig scrlib-metadata: «{file}» finnes ikke" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" msgstr "Ugyldig srclib-metadata: kunne ikke tolke «{file}»" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" msgstr "Ugyldig srclib-metadata: ukjent nøkkel «{key}» i «{file}»" #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "JAR signature failed to verify: {path}" msgstr "Klarte ikke å bekrefte JAR-signatur: {path}" #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "JAR signature verified: {path}" msgstr "JAR-signatur bekreftet: {path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" msgstr "JAR-fil for Java" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py #, fuzzy msgid "Java JDK not found! Install in standard location or set java_paths!" msgstr "Fant ingen Java JDK. Installer på vanlig plass, eller sett java_paths." #: ../fdroidserver/scanner.py msgid "Java compiled class" msgstr "Java-kompilert klasse" #: ../fdroidserver/signindex.py #, fuzzy msgid "Java jarsigner not found! Install in standard location or set java_paths!" msgstr "Fant ikke Java-jarsigner. Installer på vanlig plass, eller sett java_paths." #: ../fdroidserver/lint.py #, fuzzy msgid "Javascript in HTML src attributes" msgstr "JavaScript i HTML -src-attributter" #: ../fdroidserver/build.py #, fuzzy, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" msgstr "Kunne ikke lese minSdkVersion: \"{apkfilename}\"" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Nøkkellager for signeringsnøkkel:\t" #: ../fdroidserver/lint.py #, fuzzy, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" msgstr "Sist brukte innsendelse \"{commit}\" ser ut som en tagg, men oppdateringssjekkingsmodus er på \"{ucm}\"." #: ../fdroidserver/lint.py #, fuzzy msgid "Liberapay donation methods belong in the Liberapay: field" msgstr "Flatter-donasjonsmetoder hører hjemme i FlattrID-flagget" #: ../fdroidserver/rewritemeta.py #, fuzzy msgid "List files that would be reformatted (dry run)" msgstr "Liste over filer som ville blitt formatert" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "Lokalitet inkludert i f-droid.org -nettadresse" #: ../fdroidserver/build.py #, fuzzy msgid "Make the build stop on exceptions" msgstr "Stopp bygging ved unntak" #: ../fdroidserver/index.py #, fuzzy msgid "Malformed repository mirrors." msgstr "Feilaktig innskrevne pakkebrønnsspeil." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" msgstr "Feilaktig innskrevet serverwebroot-linje:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" msgstr "" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Avspeil hele pakkebrønnen og arkivet, alle filtyper." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" msgstr "Manglende utdatamappe" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" msgstr "" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" #: ../fdroidserver/verify.py #, fuzzy, python-format msgid "No APK for package: %s" msgstr "Ingen slik pakke: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Fant ingen Android-SDK." #: ../fdroidserver/install.py msgid "No attached devices found" msgstr "Fant ingen tilknyttede enheter" #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Inget fingeravtrykk i nettadresse." #: ../fdroidserver/common.py #, fuzzy msgid "No git submodules available" msgstr "Ingen Git-undermoduler tilgjengelige" #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "No gradle project could be found. Specify --subdir?" msgstr "Fant inget Android- eller Kivy-prosjekt. Angi --subdir?" #: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Ingen informasjon funnet." #: ../fdroidserver/checkupdates.py #, fuzzy msgid "No matching tags found" msgstr "Ingen informasjon funnet." #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." msgstr "" #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Inget behov for å spesifisere at programmet er fri programvare" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" msgstr "Inget behov for å spesifisere at programmet er for Android" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "Inget valg satt. Rediger din config.yml og sett minst én av disse:" #: ../fdroidserver/common.py msgid "No packages specified" msgstr "Ingen pakker angitt" #: ../fdroidserver/install.py #, fuzzy, python-format msgid "No signed APK available for %s" msgstr "Ingen signert APK tilgjengelig for %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" msgstr "Ingen signert utdatamappe - ingenting å gjøre" #: ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" msgstr "Ingen signeringssertifikater funnet i {path}" #: ../fdroidserver/common.py #, python-format msgid "No such package: %s" msgstr "Ingen slik pakke: %s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" msgstr "Ingen slik versionCode {versionCode} for programmet {appid}" #: ../fdroidserver/checkupdates.py #, fuzzy msgid "No tags found" msgstr "Fant ingen tilknyttede enheter" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" msgstr "Ingen usignert mappe - ingenting å gjøre" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Ikke en gyldig størrelsesdefinisjon: «{}»" #: ../fdroidserver/signindex.py msgid "Nothing to do" msgstr "Ingenting å gjøre" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." msgstr "Ingenting å gjøre for {appid}." #: ../fdroidserver/init.py #, fuzzy msgid "Now set these in config.yml:" msgstr "Nå må du sette disse i config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" msgstr "OBB-fil har nyere versionCode({integer}) enn noen APK:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" msgstr "OBB-filnavn må starte med \"main.\" eller \"patch.\":" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" msgstr "OBB-pakkenavn samsvarer ikke med noen støttet APK:" #: ../fdroidserver/deploy.py #, fuzzy msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Frakoblet maskin. Hopper over Git-avspeilingsgenerering til «fdroid deploy»" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Kun PNG og JPEG støttes for grafikk, fant: {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Kun skriv ut forskjeller vis-a-vis Play-butikken" #: ../fdroidserver/checkupdates.py #, fuzzy msgid "Only process apps with auto-updates" msgstr "Behandle kun programmer som har auto-oppdateringer" #: ../fdroidserver/lint.py #, fuzzy msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Flatter-donasjonsmetoder hører hjemme i FlattrID-flagget" #: /usr/lib/python3.11/optparse.py msgid "Options" msgstr "Valg" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Skriv ut JSON-rapport til fil navngitt etter APK-en." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." msgstr "Send utdata-JSON til stdout." #: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py #: ../fdroidserver/publish.py ../fdroidserver/signindex.py #: ../fdroidserver/update.py #, fuzzy msgid "Outputting JSON" msgstr "Produserer JSON" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Overnevnt lisens for prosjektet." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Overskriver blank versionName i {apkfilename} fra metadata: {version}." #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "Pakken «{appid}» finnes allerede" #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Parsing manifest at '{path}'" msgstr "Tolker manifest i \"{path}\"." #: ../fdroidserver/common.py msgid "Password required with username" msgstr "Passord påkrevd med brukernavn" #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Path to main Android project subdirectory, if not in root." msgstr "Sti til hovedundermappe for Androidprosjekt, hvis ikke i rot." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" msgstr "Sti til Android-SDK-en (noen ganger satt i ANDROID_HOME)" #: ../fdroidserver/btlog.py #, fuzzy msgid "Path to the git repo to use as the log" msgstr "Sti til Git-pakkebrønn å bruke som logg" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" msgstr "Sti til nøkkellager for pakkebrønnssigneringsnøkkel" #: ../fdroidserver/nightly.py #, fuzzy msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Skriv den hemmelige variabelen til terminalen for enkel kopiering/innliming." #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" msgstr "" #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Problem with xml at '{path}'" msgstr "Problem med XML i '{path}'" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" msgstr "Behandle auto-oppdateringer" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" msgstr "Behandler {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" msgstr "Behandler {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" msgstr "Produser menneskelig lesbar XML/JSON for indeksfiler" #: ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "Prosjektnettadresse å importere fra." #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" msgstr "Tegnsetting bør unngås" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" msgstr "Dytt loggen til denne Git-pakkebrønnen annensteds hen" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing binary transparency log to {url}" msgstr "Dytter binærgjennomsiktighetslogg til {url}." #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" msgstr "Dytter til {url}." #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" msgstr "Raskt starte et nytt lager" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" msgstr "Les alle metadatafilene og avslutt" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" msgstr "Leser '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" msgstr "Kunne ikke lese packageName/versionCode/versionName, APK ugyldig: \"{apkfilename}\"" #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" msgstr "Kunne ikke lese packageName/versionCode/versionName, APK ugyldig: \"{apkfilename}\"" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "Reading {apkfilename} from cache" msgstr "Behandler {apkfilename}" #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Fjerner angitte filer" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" msgstr "Fjerner {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Gi nytt navn til APK-filer som ikke samsvarer med package.name_123.apk" #: ../fdroidserver/checkupdates.py #, fuzzy msgid "RepoTrunk update mode only makes sense in git-svn repositories" msgstr "RepoTrunk-oppdateringsmodus gir kun mening i Git-SVN-kodelager" #: ../fdroidserver/build.py #, fuzzy msgid "Reset and create a brand new build server, even if the existing one appears to be ok." msgstr "Tilbakestill og opprett en helt ny byggtjener, selv når den eksisterende later til å være i orden." #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" msgstr "Signerer {apkfilename} på ny med angitt debug.keystore" #: ../fdroidserver/update.py #, fuzzy msgid "Resize all the icons exceeding the max pixel size and exit" msgstr "Endre størrelse på alle ikoner som overstiger maksimal pikselantall og avslutt" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" msgstr "Begrens utdata til advarsler og feil" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Skriv om alle metadatafilene" #: ../fdroidserver/rewritemeta.py #, fuzzy, python-brace-format msgid "Rewriting '{appid}'" msgstr "Skriver om \"{appid}\"" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" msgstr "Kjør på Git-pakkebrønn som har uinnsendte endringer" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Kjør rewritemetadata for å fikse formatering" #: ../fdroidserver/deploy.py #, fuzzy msgid "Running first pass with MD5 checking disabled" msgstr "Kjører første passering med MD5-sjekking avskrudd" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" msgstr "Kjører wget i {path}." #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" msgstr "" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Skann resulterende APK(er) for kjente ufrie klasser." #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" msgstr "Skann kildekoden til en pakke" #: ../fdroidserver/scanner.py #, fuzzy, python-brace-format msgid "Scanner found {count} problems in {apk}" msgstr "Skanner fant {count} problemer i {appid}:" #: ../fdroidserver/scanner.py #, fuzzy, python-brace-format msgid "Scanner found {count} problems in {appid}:" msgstr "Skanner fant {count} problemer i {appid}:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" msgstr "Skanner fant {count} problemer i {appid}:{versionCode}:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "Skanner fant {} problem" msgstr[1] "Skanner fant {} problemer" #: ../fdroidserver/scanner.py #, fuzzy msgid "Scanning APK with dexdump for known non-free classes." msgstr "Skanner APK med APK Analyzer for kjente ikke-frie klasser." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" msgstr "" #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Sett klokke til sådan tid ved bruk av:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" msgstr "" #: ../fdroidserver/build.py #, fuzzy, python-brace-format msgid "Set open file limit to {integer}" msgstr "Sett åpen filgrense til {integer}" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" msgstr "Sett opp programbygging for nattlig byggingspakkebrønn." #: ../fdroidserver/build.py #, fuzzy msgid "Setting open file limit failed: " msgstr "Kunne ikke sette åpen filgrense: " #: ../fdroidserver/build.py #, fuzzy, python-brace-format msgid "Setting {0} sec timeout for this build" msgstr "Setter {0} sek. tidsavbrudd for dette bygget" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Logg inn og legg til pakker i pakkebrønnen" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" msgstr "Signer indekser ved bruk av update --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" msgstr "Hopp over skanning av kildekoden for binærfiler og andre problemer" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Hopper over '{apkfilename}' med ugyldig signatur." #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, fuzzy, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" msgstr "Hopper over GitLab Pages-avspeiling fordi kodelageret er for stort (>%.2f GB)!" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" msgstr "Hopper over generering av indeks for {appid}." #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" msgstr "Hopper over {apkfilename} med ugyldig signatur." #: ../fdroidserver/scanner.py #, fuzzy, python-brace-format msgid "Skipping {appid}: disabled" msgstr "Hopper over {appid}: Avskrudd" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" msgstr "Angi ei lokal mappe å synkronisere pakkebrønnen til" #: ../fdroidserver/deploy.py #, fuzzy msgid "Specify an identity file to provide to SSH for rsyncing" msgstr "Angi ei identitetsfil å tilby til SSH for rsync-ing" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." msgstr "Angi hvilken feilrettingsnøkkellagersfil som skal brukes." #: ../fdroidserver/common.py #, fuzzy msgid "Spew out even more information than normal" msgstr "Gulp opp enda mer info enn normalt" #: ../fdroidserver/nightly.py #, fuzzy, python-brace-format msgid "Stripping mystery signature from {apkfilename}" msgstr "Stripper mystisk signatur fra {apkfilename}" #: ../fdroidserver/lint.py #, fuzzy, python-format msgid "Summary '%s' is just the app's name" msgstr "Sammendraget \"%s\" er bare pakkenavnet" #: ../fdroidserver/lint.py #, fuzzy, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" msgstr "Sammendrag av lengde {length} overstiger {limit} tegngrensen" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" msgstr "Systemklokka er eldre enn datoen i {path}." #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" msgstr "" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Testmodus - putt utdata kun i tmp-mappe, og alltid bygg, selv når utdataen finnes allerede." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" msgstr "OBB-versjonskoden må komme etter \"{name}.\":" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" msgstr "Grunnettadressen for pakkebrønnen å loggføre til (forvalg: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" msgstr "Mappen å skrive speilet til" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" msgstr "Filen å inkludere i pakkebrønnen (sti eller glob)." #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." msgstr "Pakkebrønnens fingeravtrykk samsvarer ikke." #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" msgstr "Rotmappen for local_copy_dir \"{path}\" finnes ikke." #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" msgstr "Nøkkelaliaskollisjon - offentliggjøring stanset" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." msgstr "" #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" #: ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Denne pakkebrønnen har allerede lokal metadata: %s" #: ../fdroidserver/init.py #, python-format msgid "" "To complete the setup, add your APKs to \"%s\"\n" "then run \"fdroid update -c; fdroid update\". You might also want to edit\n" "\"config.yml\" to set the URL, repo name, and more. You should also set up\n" "a signing key (a temporary one might have been automatically generated).\n" "\n" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" #: ../fdroidserver/deploy.py #, fuzzy msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "For å bruke AWS-spann, må \"awssecretkey\" og \"awsaccesskeyid\" også være satt i config.yml." #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "Nettadressen må starte med https:// eller http://" #: ../fdroidserver/lint.py #, fuzzy msgid "URL shorteners should not be used" msgstr "Nettadresseforkortere skal ikke brukes" #: ../fdroidserver/lint.py #, fuzzy, python-brace-format msgid "URL {url} in Description: {error}" msgstr "Nettadresse {url} i beskrivelse: {error}" #: ../fdroidserver/lint.py #, fuzzy msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" msgstr "Ugyldig lisenstagg \"%s\". Kun bruk de som er å finne på https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" msgstr "" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Ukjent unntak møtt!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" msgstr "Ukjent fil \"{filename}\" i bygg \"{versionName}\"." #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" msgstr "Ukjent metadataformat: %s" #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" msgstr "Ukjent metadataformat: {path}" #: ../fdroidserver/common.py #, fuzzy msgid "Unknown version of aapt, might cause problems: " msgstr "Ukjent versjon av aapt, kan forårsake problemer: " #: ../fdroidserver/lint.py msgid "Unnecessary leading space" msgstr "Unødvendig innledende mellomrom" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" msgstr "Unødvendig etterfølgende mellomrom" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" msgstr "Ugjenkjent felt «{fieldname}» i «{path}»" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Ugjenkjent felt «{build_flag}» i «{path}»" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" msgstr "Ustøttet filtype \"{extension}\" for pakkebrønnsgrafikk" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" msgstr "Ustøttet grafikkfil funnet: {path}." #: ../fdroidserver/lint.py #, fuzzy, python-format msgid "Unused extlib at %s" msgstr "Ubrukt extlib i %s" #: ../fdroidserver/lint.py #, fuzzy, python-format msgid "Unused file at %s" msgstr "Ubrukt fil i %s" #: ../fdroidserver/scanner.py #, fuzzy, python-format msgid "Unused scandelete path: %s" msgstr "Ubrukt fil i %s" #: ../fdroidserver/scanner.py #, fuzzy, python-format msgid "Unused scanignore path: %s" msgstr "Ubrukt fil i %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" msgstr "Pakker ut til %s" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Oppdater repo informasjon for nye pakker" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" msgstr "Oppdater binær gjennomsiktighetslogg for en URL" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData har ugyldig nettadresse: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" msgstr "UpdateCheckData må bruke HTTPS-nettadresse: {url}" #: ../fdroidserver/lint.py #, fuzzy, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData er ikke en gyldig nettadresse: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py #, fuzzy msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "\"Update Check Name\" er satt til den kjente App-ID-en - den kan fjernes." #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" msgstr "Laster opp {apkfilename} to androidobservatory.org" #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format msgid "Uploading {apkfilename} to virustotal" msgstr "Behandler {apkfilename}" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "Usage" msgstr "Bruk" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Bruk: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Bruk /HEAD istedenfor /master for å peke til en fil i forvalgt forgrening" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Bruk `fdroid update -c` for å opprette den." #: ../fdroidserver/build.py msgid "Use build server" msgstr "Bruk byggtjener" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" msgstr "Bruk dato fra APK istedenfor nåværende tid for nylig tillagte APK-er" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." msgstr "Bruker \"{path}\" for oppsett av s3cmd." #: ../fdroidserver/common.py #, fuzzy msgid "Using APK Signature v2" msgstr "Bruker APK Signature v2" #: ../fdroidserver/common.py #, fuzzy msgid "Using APK Signature v3" msgstr "Bruker APK Signature v3" #: ../fdroidserver/common.py #, fuzzy msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Bruker Java sin jarsigner, ikke anbefalt for bekreftelse av APK-er. Bruk apksigner." #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Using androguard from \"{path}\"" msgstr "Bruker Androguard fra \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" msgstr "" #: ../fdroidserver/init.py #, fuzzy, python-brace-format msgid "Using existing keystore \"{path}\"" msgstr "Bruker eksisterende nøkkellager \"{path}\"." #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" msgstr "Bruk s3cmd til å synkronisere med: {url}" #: ../fdroidserver/__main__.py msgid "Valid commands are:" msgstr "Gyldige kommandoer er:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." msgstr "Bekreft mot lokalt hurtiglagret kopi snarere enn å laste ned på ny." #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" msgstr "Bekreft integriteten til nedlastede pakker" #: ../fdroidserver/index.py msgid "Verifying index signature:" msgstr "Bekrefter indekssignatur:" #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "VirusTotal API-nøkkel kan ikke laste opp filer større enn 32 MB, bruk {url} for å laste opp {path}." #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Advar om mulige metadata-feil" #: ../fdroidserver/update.py #, fuzzy msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Når oppsatt for signerte indekser, vil kun usignerte indekser bli opprettet i dette stadiet" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 \"Entydig navn\" (DN) brukt ved generering av nøkler." #: ../fdroidserver/common.py #, fuzzy msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" msgstr "Du kan bruke ANDROID_HOME til å sette stien til din SDK, f.eks:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" msgstr "ZIP-filarkiv" #: ../fdroidserver/nightly.py #, fuzzy, python-brace-format msgid "adding IdentityFile to {path}" msgstr "legger til IdentityFile i {path}" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "adding to {name}: {path}" msgstr "legger til i {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, fuzzy, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "tvetydig valg: %(option)s kan passe overens med %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "tvetydig valg: %s (%s?)" #: ../fdroidserver/common.py #, fuzzy msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "fant ikke apksigner (som kreves for signering)." #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "fant ikke apksigner (som kreves for signering)." #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py #, fuzzy msgid "application ID of file to operate on" msgstr "App-ID å sjekke for oppdateringer" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py #, fuzzy msgid "application ID with optional versionCode in the form APPID[:VERCODE]" msgstr "App-ID med valgfri versionCode, i formen APPID[:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "argument \"-\" med modus %r" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" msgstr "" #: ../fdroidserver/nightly.py #, fuzzy msgid "attempting bare SSH connection to test deploy key:" msgstr "forsøker naken SSH-tilkobling for å teste utrullingsnøkkel:" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "kan ikke åpne '%(filename)s': %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" msgstr "" #: ../fdroidserver/build.py #, fuzzy, python-brace-format msgid "cannot find required srclibs: \"{path}\"" msgstr "Finner ikke AppID for {path}." #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "kan ikke ha flere underfortolkningsargumenter" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "kan ikke flette handlinger - to grupper heter %r" #: ../fdroidserver/nightly.py #, fuzzy msgid "cannot publish update, did you set the deploy key?" msgstr "kan ikke offentliggjøre oppdatering, har du satt utrullingsnøkkelen?" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" msgstr "kloner {url}" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" msgstr "kommandoer fra programtilleggsmodulene:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, fuzzy msgid "complex" msgstr "kompleks" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "konflikterende valgstreng: %s" msgstr[1] "konflikterende valgstrenger: %s" #: /usr/lib/python3.11/argparse.py #, fuzzy, python-format msgid "conflicting subparser alias: %s" msgstr "konflikterende valgstreng: %s" #: /usr/lib/python3.11/argparse.py #, fuzzy, python-format msgid "conflicting subparser: %s" msgstr "konflikterende valgstreng: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" msgstr "kunne ikke tolke'{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" msgstr "opprettet {path}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" msgstr "" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "deleting: repo/{apkfilename}" msgstr "Behandler {apkfilename}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest= er påkrevd for valg som %r" #: ../fdroidserver/scanner.py #, fuzzy msgid "downloading '{}'" msgstr "Laster ned %s" #: ../fdroidserver/scanner.py #, fuzzy msgid "downloading scanner signatures from '{}' failed" msgstr "Stripper mystisk signatur fra {apkfilename}" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" msgstr "kjørbar binærfil, muligens kode" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "forventet %s argument" msgstr[1] "forventet %s argumenter" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "forventet minst ett argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "forventet på det meste ett argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "forventet ett argument" #: ../fdroidserver/__main__.py #, fuzzy msgid "fdroid [] [-h|--help|--version|]" msgstr "bruk: fdroid [-h|--help|--version] []" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" msgstr "" #: /usr/lib/python3.11/optparse.py #, fuzzy msgid "floating-point" msgstr "flyttall" #: ../fdroidserver/metadata.py #, fuzzy msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "tving feil til å bli advarsler, eller ignorer" #: ../fdroidserver/common.py #, fuzzy msgid "git svn clone failed" msgstr "\"git svn clone\" mislyktes" #: ../fdroidserver/scanner.py #, fuzzy msgid "gzip file archive" msgstr ".gzip-filarkiv" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, fuzzy, python-format msgid "ignored explicit argument %r" msgstr "ignorerte eksplisitt argument %r" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 må ha en signatur, bruk `fdroid signindex` for å opprette den." #: ../fdroidserver/index.py #, fuzzy msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 må ha en signatur, bruk `fdroid signindex` for å opprette den." #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" msgstr "heltall" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, fuzzy, python-format msgid "invalid %(type)s value: %(value)r" msgstr "ugydlig %(type)s verdi: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "ugyldig valg: %(value)r (velg fra %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "ugyldig conflict_resolution-verdi: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "Ugyldig valgstreng %(option)r: Må starte med et tegn %(prefix_chars)r" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "local_copy_dir slutter ikke med \"fdroid\", kanskje du mente: \"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" msgstr "local_copy_dir må være en absolutt sti!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" msgstr "local_copy_dir må være ei mappe, ikke ei fil!" #: ../fdroidserver/index.py #, fuzzy, python-format msgid "mirror '%s' does not end with 'fdroid'!" msgstr "speilet \"%s\" slutter ikke med \"fdroid\"." #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "gjensidig utelukkende argumenter må være valgfrie" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" msgstr "" #: ../fdroidserver/mirror.py #, fuzzy, python-brace-format msgid "no \"icon\" in {appid}" msgstr "Behandler {appid}" #: ../fdroidserver/signatures.py msgid "no APK supplied" msgstr "ingen APK angitt" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" msgstr "Inget slikt valg: %s" #: ../fdroidserver/__main__.py msgid "no version info found!" msgstr "ingen versjonsinfo funnet!" #: ../fdroidserver/checkupdates.py #, fuzzy msgid "no version information found" msgstr "ingen versjonsinfo funnet!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, fuzzy, python-format msgid "not allowed with argument %s" msgstr "ikke tillatt med argument %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, fuzzy, python-format msgid "one of the arguments %s is required" msgstr "ett av argumentene %s kreves" #: ../fdroidserver/common.py ../fdroidserver/index.py #, fuzzy msgid "only accepts strings, lists, and tuples" msgstr "kun godta strenger, lister, og forekomster" #: ../fdroidserver/install.py #, fuzzy, python-format msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "valg %s: Hvis du virkelig ønsker å installere alle signerte programmer, bruk -all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "valg %s: ugyldig %s verdi: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, fuzzy, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "valg %s: ugyldig valg: %r (velg mellom %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" msgstr "Kommandoen \"-%s\" gjenkjennes ikke" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" msgstr "valg -%s krever et argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, fuzzy, python-format msgid "option --%s must not have an argument" msgstr "valget --%s kan ikke ha et argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, fuzzy, python-format msgid "option --%s not a unique prefix" msgstr "valget --%s er ikke et unikt prefiks" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" msgstr "Kommandoen \"--%s\" gjenkjennes ikke" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s requires argument" msgstr "valget --%s krever et argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "valgfrie argumenter" #: /usr/lib/python3.11/argparse.py #, fuzzy msgid "options" msgstr "Valg" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" msgstr "overskriver eksisterende {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "Posisjonelle argumenter" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" msgstr "" #: ../fdroidserver/build.py msgid "reference binary missing signature" msgstr "" #: ../fdroidserver/signatures.py #, fuzzy, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" msgstr "nekt nedlasting via usikker HTTP-tilkobling (bruk HTTPS eller angi --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." msgstr "" #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" msgstr "" #: ../fdroidserver/metadata.py #, fuzzy msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml er ikke installert. Kan ikke skrive metadata." #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd synkroniserer indekser {path} til {url} og sletter" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" #: ../fdroidserver/scanner.py msgid "shared library" msgstr "delt bibliotek" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" msgstr "vis programmets versjonsnummer og avslutt" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" msgstr "vis denne hjelpemeldingen og avslutt" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." msgstr "signert APK, enten en filsti, eller HTTPS-nettadresse." #: ../fdroidserver/common.py #, fuzzy msgid "skip deploying full build logs: log content is empty" msgstr "hopp over innsendelse av fullstendige bygglogger: Logginhold er tomt" #: ../fdroidserver/common.py #, fuzzy msgid "skip deploying full build logs: not enabled in config" msgstr "hopp over innsendelse av fullstendige byggingslogger: Ikke påslått i oppsett" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "skipping source tarball: {path}" msgstr "hopper over kildetjæreball: {path}" #: ../fdroidserver/lint.py #, fuzzy msgid "srclibs missing name and/or @" msgstr "srclibs mangler navn og/eller @" #: ../fdroidserver/scanner.py msgid "static library" msgstr "statisk bibliotek" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "følgende argumenter kreves: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "uventet valgstreng: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "ukjent fortolker %(parser_name)r (valg: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "ugjengkjente argumenter: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "utrygge tilganger for '{config_file}' (skal være 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "bruk: " #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format msgid "using Apache libcloud to sync with {url}" msgstr "bruker Apache-libcloud for å synkronisere med {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" msgstr[0] "{0} program, {1} nøkkelalias" msgstr[1] "{0} programmer, {1} nøkkelalias" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) mangler metadata." #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" msgstr "{apkfilename} har flere {name}-filer, ser ut til å være en hovednøkkelutnyttelse." #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "{apkfilename} sin AndroidManifest.xml har en feilaktig dato: " #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} mangler navn. Bruker pakkenavn istedenfor." #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" msgstr "{appid} fra {path} er ikke et gyldig Android-pakkenavn!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid} fra {path} er ikke et gyldig Java-pakkenavn!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" msgstr "{appid} har både APK-er og filer: {files}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" msgstr "{appid} mangler {name}." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, fuzzy, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" msgstr "{appid}: Ukjent extlib {path} i bygg \"{versionName}\"" #: ../fdroidserver/scanner.py #, fuzzy, python-brace-format msgid "{appid}: no builds specified, running on current source state" msgstr "{appid}: Ingen bygg angitt, kjører på nåværende kildetilstand." #: ../fdroidserver/lint.py #, fuzzy, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" msgstr "{appid}: {field} må være en '{type}', men er ikke et '{fieldtype}!'" #: ../fdroidserver/lint.py #, fuzzy, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" msgstr "{appid}: {field} må være en '{type}', men er ikke et '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} må være et heltall, fant: {value}" #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format msgid "{build_flag} must be list or string, found: {value}" msgstr "{build_flag} må være et heltall, fant: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" msgstr "{file} er tom eller skadet!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} «{section}/icons/{path}» finnes ikke. Rett det i config.yml." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} er avleggs, bruk {newfile}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "{path} finnes allerede, ignorerer importeringsresultater." #: ../fdroidserver/nightly.py #, fuzzy, python-brace-format msgid "{path} does not exist! Create it by running:" msgstr "{path} finnes ikke. Opprett den ved å kjøre:" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} har feilaktig filsignatur \"{pattern}\", mulig Janus-utnyttelse." #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" msgstr "{path} er null størrelse." #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} er mer enn 200MB, last opp manuelt: {url}" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{path}: {error}" msgstr "Klarte ikke å lese {path}: {error}" #: ../fdroidserver/mirror.py #, fuzzy, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} slutter ikke med \"fdroid\", sjekk nettadressestien." #: ../fdroidserver/import_subcommand.py #, fuzzy, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url} slutter ikke med \"fdroid\", sjekk nettadressestien." #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" msgstr[0] "{} bygg mislyktes" msgstr[1] "{} bygg mislyktes" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} bygg fullført" msgstr[1] "{} bygg fullført" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/locale/pl/0000755000175000017500000000000014620351546014662 5ustar00hanshans././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.888382 fdroidserver-2.3a1/locale/pl/LC_MESSAGES/0000755000175000017500000000000014620351546016447 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/locale/pl/LC_MESSAGES/fdroidserver.po0000644000175000017500000027276614620351225021523 0ustar00hanshans# SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # WaldiS , 2020, 2021. # Michal L , 2020, 2021. # mondstern , 2021. # Hans-Christoph Steiner , 2021. # Agnieszka C , 2021, 2022, 2023, 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2024-04-10 18:44+0000\n" "Last-Translator: Agnieszka C \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" "\n" "Klucz publiczny SSH, który ma być używany jako klucz wdrażania:" #: ../fdroidserver/nightly.py #, python-brace-format msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" "\n" "{path} kodowane dla zmiennej tajnej DEBUG_KEYSTORE:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" nie ma pasującego pliku metadanych!" #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" msgstr "„local_copy_dir” {path} nie istnieje!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\" jest już zainstalowany na {dev}." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" msgstr "\"{path}\" zawiera nieaktualne {name} ({version})" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" msgstr "\"{path}\" zawiera najnowsze {name} ({version})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" msgstr "\"{path}\" istnieje, ale s3cmd nie jest zainstalowany!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" msgstr "„{path}” nie jest obsługiwanym formatem pliku (użyj: metadata/*.yml)" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "„{path}” jest podpisany kluczem, który jest niedozwolony:" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" nie jest prawidłowym adresem URL!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" msgstr[0] "%(option)s opcja wymaga %(number)d argument" msgstr[1] "%(option)s opcji wymaga %(number)d argumentów" msgstr[2] "%(option)s opcje wymagają %(number)d argumentów" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: błąd: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" msgstr "%d problemy odnalezione" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "%prog [options]" msgstr "%prog [opcje]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" msgstr "%r nie można wywołać" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" msgstr "%s nie wytworzyło dict!" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" msgstr "%s ma zły SHA-256: %s" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" msgstr "%s nie jest akceptowanym polem kompilacji" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" msgstr "%s opcja nie przyjmuje wartości" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' nie znaleziono w config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "\"keystore\" nie ma, a \"smartcardoptions\" jest puste!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "'Plik kluczy' nie został znaleziony w pliku config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' nie znaleziono w config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' nie znaleziono w config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'wymagane' jest nieprawidłowym argumentem dla pozycji" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" msgstr "'sdk_path' nie jest ustawiony w config.yml!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' jest zbyt stary, fdroid wymaga narzędzi-kompilacji-{version} lub nowsze!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" msgstr "'{field}' będą w losowej kolejności! Użyj nawiasów () lub [], jeśli kolejność jest ważna!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" msgstr "'{path}' nie udało się wykonać!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' ma nieprawidłowy format, powinien być słownikiem!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' nie jest prawidłowy {field} w {appid}. Wzór Regex: {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' nie jest prawidłowym {field}, powinno być {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" msgstr "...sprawdzenie aktualizacji nie powiodło się {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() nie określono" #: ../fdroidserver/lint.py msgid "/issues is missing" msgstr "/nie ma problemów" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" msgstr "Adres URL jest wymagany jako argument!" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Dodaj podpisy PGP za pomocą GnuPG dla pakietów w repozytorium" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" msgstr "Dodaj klucz podpisu repozytorium do niepodpisanego repozytorium" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" msgstr "Dodaj pliki metadanych szkieletu dla pakietów APK, które ich nie zawierają" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" msgstr "Dodaje tylko nowe repozytorium {name}" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" msgstr "Alias klucza podpisu repozytorium w magazynie kluczy" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" msgstr "Brak AllowedAPKSigningKeys, ale dostarczono referencyjny plik binarny" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Umożliwia określenie innej wersji (lub gałęzi git) dla początkowego importu" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" msgstr "Również odzwierciedla całą sekcję archiwów" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" msgstr "Ostrzeż także o problemach z formatowaniem, takich jak rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" msgstr "Biblioteka AAR systemu Android" #: ../fdroidserver/scanner.py msgid "Android APK file" msgstr "Plik APK systemu Android" #: ../fdroidserver/scanner.py msgid "Android DEX code" msgstr "Kod DEX Android" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" msgstr "Nie znaleziono zestawu SDK systemu Android pod adresem {path}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" msgstr "Android SDK ścieżka '{path}' nie istnieje!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" msgstr "Android SDK ścieżka '{path}' nie jest katalogiem!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" msgstr "Nie znaleziono narzędzia Android SDK {cmd}!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "Aplikacja ma Binaries, ale nie ma odpowiednich kluczy AllowedAPKSingKeys do przypięcia certyfikatu." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Aplikacja ma NoSourceSince lub ArchivePolicy „0 versions”, ale AutoUpdateMode lub UpdateCheckMode nie są None" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" msgstr "Aplikacja jest w '{repo}' ale ma link do {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "Wersja aplikacji ma plik binarny, ale nie ma odpowiednich kluczy AllowedAPKSigningKeys do przypięcia certyfikatu." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Dołączanie .git nie jest konieczne" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" msgstr "Archiwizacja {apkfilename} z nieprawidłowym podpisem!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode z UpdateCheckMode: HTTP musi mieć wzorzec." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" msgstr "Błędny typ wpisu „{mirrortype}” w konfiguracji serwerów lustrzanych: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "Bazowy adres URL do serwera lustrzanego, może zawierać klucz do podpisywania indeksu za pomocą łańcucha zapytania: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" msgstr "Oddział '{branch}' używany jako commit w kompilacji '{versionName}'" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" msgstr "Gałąź '{branch}' używana jako commit w srclib '{srclib}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" msgstr "Uszkodzone dowiązanie symboliczne: {path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" msgstr "Zbuduj pakiet ze źródła" #: ../fdroidserver/build.py msgid "Build all applications available" msgstr "Zbuduj wszystkie dostępne aplikacje" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" msgstr "Kompilacja generowana przez `fdroid import` - usuń wyłączenie linii po przygotowaniu" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" msgstr "Repozytorium git metadanych kompilacji zawiera niescommitowane zmiany!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" msgstr "Twórz tylko najnowszą wersję każdego pakietu" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" msgstr "Zbudowane repo w oparciu o \"%s\" z tą konfiguracją:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" msgstr "Nie można automatycznie zaktualizować aplikacji bez CurrentVersionCode" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "Nie można zbudować z powodu błędu {} podczas skanowania" msgstr[1] "Nie można zbudować z powodu błędów {} podczas skanowania" msgstr[2] "Nie można zbudować z powodu błędów {} podczas skanowania" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" msgstr "Nie można odczytać \"{path}\"" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "Kategorie '%s' są nieprawidłowe" #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "Kategorie nie są ustawione" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Sprawdź aktualizacje aplikacji" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Sprawdzanie archiwizacji dla {appid} - apks: {integer}, keepversions: {keep}, archapks: {arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Czysta aktualizacja - nie używa pamięci podręcznych, przetwarzaj ponownie wszystkie pakiety APK" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Rozdzielana przecinkami lista kategorii." #: ../fdroidserver/__main__.py #, python-format msgid "Command '%s' not recognised.\n" msgstr "Polecenie '%s' nie rozpoznane.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" msgstr "Scommituj zmiany" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" msgstr "Sprzeczne definicje „{field}” między plikami .yml a przetłumaczonymi:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Sprzeczne argumenty: '--verbose' i '--quiet' nie mogą być podane w tym samym czasie." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" msgstr "Pliki konfiguracyjne powodujące konflikt! Używając {newfile}, ignoruje {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "Nie można znaleźć '{command}' w twoim systemie" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Nie można znaleźć najnowszej wersji kodu" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Nie można odnaleźć nazwy najnowszej wersji" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" msgstr "Nie można znaleźć pliku {path}, aby go usunąć" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " msgstr "Nie można otworzyć pliku APK {path} do analizy: " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Nie można przeanalizować rozmiaru \"{size}\", nieprawidłowy typ \"{type}\"" #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Nie można odnaleźć identyfikatora aplikacji" #: ../fdroidserver/checkupdates.py msgid "Couldn't find any version information" msgstr "Nie udało się znaleźć żadnych informacji o wersji" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "Nie można znaleźć identyfikatora pakietu" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" msgstr "Tchórzliwa odmowa nadpisania istniejącej konfiguracji klucza podpisu!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" msgstr "Utworzono nowy kontener \"{name}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Tworzenie \"{path}\" do konfiguracji s3cmd." #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Tworzenie katalogu dzienników" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" msgstr "Tworzenie nowego zasobnika S3: {url}" #: ../fdroidserver/publish.py msgid "Creating output directory" msgstr "Tworzenie katalogu wyjściowego" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" msgstr "Tworzenie podpisanego indeksu za pomocą tego klucza (SHA256):" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" msgstr "Tworzenie katalogu tymczasowego" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" msgstr "Tworzenie niepodpisanego indeksu w ramach przygotowań do podpisania" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" msgstr "CurrentVersionCode {cv} jest mniejszy niż najstarszy wpis kompilacji {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" msgstr "DEBUG_KEYSTORE nie jest ustawione lub wartość jest niepełna" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" msgstr "Usuń pliki APK i/lub OBB bez metadanych z repozytorium" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" msgstr "Usuwanie archiwum, repozytorium jest zbyt duże ({size} maks {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" msgstr "Usuwanie historii git-mirror, repozytorium jest zbyt duże ({size} max {limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" msgstr "Usuwanie nieznanego pliku: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" msgstr "Opis \"%s\" to tylko podsumowanie aplikacji" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" msgstr "Opis ma zduplikowaną linię" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" msgstr "Opis ma listę (%s), ale nie jest wypunktowana (*) ani ponumerowana (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" msgstr "Opis długości {length} przekracza limit {limit} char" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Nie dodawaj „wyłącz:” do wygenerowanych wpisów kompilacji" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" msgstr "Nie wdrażaj nowych plików w repozytorium" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" msgstr "Nie podawaj \"{path}\" w adresie URL!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" msgstr "Nie pytaj o ścieżkę SDK systemu Android, po prostu nie" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" msgstr "Nie usuwaj kluczy prywatnych wygenerowanych z magazynu kluczy" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" msgstr "Nie twórz archiwum źródłowego, przydatnego podczas testowania kompilacji" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" msgstr "Nie odświeżaj repozytorium, przydatne podczas testowania kompilacji bez połączenia z Internetem" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" msgstr "Nie używaj sum kontrolnych rsync" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Pobierz pełne mirrors małych repozytoriów" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" msgstr "Pobieranie %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Pobieranie repozytorium już raz się nie powiodło, nie próbuje ponownie." #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" msgstr "Pobieranie {url} nie powiodło się. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" msgstr "Zduplikowana deklaracja niepożądanej funkcji w {path} została zignorowana!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" msgstr "Zduplikowany wpis „%s” w konfiguracji serwerów lustrzanych!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" msgstr "Zduplikowany link w '{field}': {url}" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "BŁĄD: podkomenda „serwer” została usunięta, użyj polecenia „deploy”!" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" "BŁĄD: tego polecenia nigdy nie należy używać do zwierciadlania f-droid.org!\n" "Pełne lustro f-droid.org wymaga ponad 200 GB." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "BŁĄD: nieobsługiwany typ CI, mile widziane poprawki!" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "BŁĄD: nieobsługiwany host git „%s”, łatki mile widziane!" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." msgstr "Kodowanie jest ustawione na '{enc}'. Fdroid może napotkać problemy z kodowaniem. Aby uzyskać najlepsze wyniki, ustaw go na 'UTF-8'." #: ../fdroidserver/init.py #, python-format msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" "Podaj ścieżkę do zestawu SDK systemu Android (%s) tutaj:\n" " > " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" msgstr "Zmienna środowiskowa {var} z {configname} nie jest ustawiona!" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Błąd podczas uzyskiwania adresu repo" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" msgstr "Zakończ z niezerowym kodem, jeśli znaleziono problemy" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Wyodrębnij metadane aplikacji z repozytorium źródłowego" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Wyciągnij podpisy z plików APK" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" msgstr "Nieudane kopiowanie {path}: {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" msgstr "Nie powiodło się pobieranie podpisów dla '{apkfilename}': {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" msgstr "Błąd odczytu {path}: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" msgstr "Nie udało się zmienić rozmiaru {path}: {error}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" msgstr "Nie można utworzyć zasobnika S3: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" msgstr "Nie udało się uzyskać informacji o APK, usunięcie {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" msgstr "Nie udało się uzyskać informacji o APK, pomijając {path}" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" msgstr "Nie udało się uzyskać odcisku palca klucza podpisywania APK" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" msgstr "Instalacja nie powiodła się '{apkfilename}' na {dev}: {error}" #: ../fdroidserver/common.py msgid "Failed to sign application" msgstr "Nie udało się podpisać aplikacji" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" msgstr "Pobrano buildserverid z VM: {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" msgstr "Pobrane podpisy dla '{apkfilename}' -> '{sigdir}'" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" msgstr "Plik zniknął podczas przetwarzania go: {path}" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py #: ../fdroidserver/update.py msgid "Finished" msgstr "Skończone" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" msgstr "Metody darowizn Flattr należą do FlattrID: field" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Zakazane tagi HTML" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." msgstr "Wymuszaj budowanie wyłączonych aplikacji i działa niezależnie od problemów ze skanowaniem. Dopuszczalne tylko w trybie testowym." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" msgstr "Wymuś zatrzymanie kompilacji po {0} upływie limitu czasu!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." msgstr "Wymuś skanowanie wyłączonych aplikacji i kompilacji." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" msgstr "Znaleziono \"{path}\" grafiki bez metadanych dla aplikacji \"{name}\"!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "Znaleziono zły plik finansowania \"{path}\" dla \"{name}\":" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" msgstr "Znaleziono nieprawidłowe pliki w argumentach" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "Znaleziono nieprawidłowe kody wersji dla niektórych aplikacji" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Znaleziono wiele plików bloków podpisów JAR w {path}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" msgstr "Znaleziono wiele plików metadanych dla {appid}" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." msgstr "Znaleziono wiele certyfikatów do podpisywania dla repozytorium." #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." msgstr "Nie znaleziono certyfikatów do podpisywania dla repozytorium." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" msgstr "Znaleziono plik nieprzechowy na %s" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" msgstr "Znaleziono {apkfilename} na {url}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} problems in {filename}" msgstr "Znaleziono {count} problemy(-ów) w {filename}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" msgstr "Znaleziono {count} ostrzeżeń(-nia) w {filename}" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" msgstr "Wygenerowano metadane szkieletu dla {appid}" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" msgstr "Git checkout z '%s' nie powiodło się" #: ../fdroidserver/common.py msgid "Git clean failed" msgstr "Git clean nie powiódł się" #: ../fdroidserver/common.py msgid "Git fetch failed" msgstr "Pobranie Git nie powiodło się" #: ../fdroidserver/common.py msgid "Git prune failed" msgstr "Git prune nie powiodło się" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Błąd zdalnego ustawiania Git: \"%s\"" #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Resetowanie Git nie powiodło się" #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Nie udało się zsynchronizować modułu submodule Git" #: ../fdroidserver/common.py msgid "Git submodule update failed" msgstr "Aktualizacja submodułu Git nie powiodła się" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" msgstr "HTTPS musi być używany z adresami URL Subversion!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" msgstr "Jeśli serwer lustrzany git stanie się Duży, Zezwól na usunięcie archiwum" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" msgstr "Jeśli przesyłanie się nie uda, spróbuj przesłać ręcznie do {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." msgstr "Ignorowanie metadanych '{field}' w '{metapath}' ponieważ są one przestarzałe." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "Ignorowanie wpisu FUNDING.yml dłuższego niż 2048: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" msgstr "Ignorowanie błędnego elementu w manifeście: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorowanie pakietu bez metadanych: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" msgstr "Ignorowanie starych danych pamięci podręcznej dla {apkfilename}" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" msgstr "Dołącz pliki APK, które są podpisane przy użyciu wyłączonych algorytmów, takich jak MD5" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" msgstr "Dołącz podpis PGP .pliki asc w lustrze" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" msgstr "Dołącz dzienniki budowy do lustra" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" msgstr "Dołącz źródło tarballs w lustrze" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" msgstr "Włączenie metadanych z %s@%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" msgstr "Włączenie metadanych z {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Inicjowanie submodułów" #: ../fdroidserver/install.py msgid "Install all signed applications available" msgstr "Zainstaluj wszystkie dostępne podpisane aplikacje" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" msgstr "Zainstaluj wbudowane pakiety na urządzeniach" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." msgstr "Instalowanie %s…" #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." msgstr "Instalowanie '{apkfilename}' na {dev}…" #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" msgstr "Wejdź w interakcje z repozytorium serwera HTTP" #: ../fdroidserver/update.py msgid "Invalid APK" msgstr "Nieprawidłowy plik APK" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" msgstr "Nieprawidłowy AutoUpdateMode: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" msgstr "Nieprawidłowy UpdateCheckMode: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" msgstr "Nieprawidłowa VercodeOperation: {field}" #: ../fdroidserver/lint.py #, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "Nieprawidłowa VercodeOperation: {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "Nieprawidłowy ID aplikacji {appid}" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" msgstr "Niepoprawna wartość boolean '%s'" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Nieprawidłowa lista wypunktowana" #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" msgstr "Niepoprawna nazwa opublikowanego pliku: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" msgstr "Nieprawidłowy ndk: wpis w kompilacji: „{ndk}”" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " msgstr "Nieprawidłowe przekierowanie do nie-HTTPS: {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" msgstr "Nieprawidłowe metadane scrlib: '{file}' nie istnieje" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" msgstr "Nieprawidłowe metadane srclib: nie można przeanalizować '{file}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" msgstr "Nieprawidłowe metadane srclib: nieznany klucz '{key}' w '{file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" msgstr "Podpis JAR nie mógł zweryfikować: {path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" msgstr "Podpis JAR potwierdzony: {path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" msgstr "Plik Java JAR" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" msgstr "Nie znaleziono Java JDK! Zainstaluj w standardowej lokalizacji lub ustaw ścieżki java!" #: ../fdroidserver/scanner.py msgid "Java compiled class" msgstr "Klasa skompilowana Java" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" msgstr "Jarsigner Java nie został znaleziony! Zainstaluj w standardowej lokalizacji lub ustaw ścieżki java (java_paths)!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" msgstr "JavaScript w atrybutach src HTML" #: ../fdroidserver/build.py #, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" msgstr "Utrzymywanie nieudanej kompilacji „{apkfilename}”" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Magazyn kluczy do podpisywania klucza:\t" #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" msgstr "Ostatnio używany commit '{commit}' wygląda jak tag, ale UpdateCheckMode to '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" msgstr "Metody darowizny Liberapay należą do Liberapay: field" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted (dry run)" msgstr "Lista plików, które mają zostać ponownie sformatowane (przebieg próbny)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "Ustawienia regionalne zawarte w adresie URL f-droid.org" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" msgstr "Wykonaj zatrzymanie kompilacji z wyjątkami" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." msgstr "Nieprawidłowo repozytorium mirrors." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" msgstr "Nieprawidłowy wiersz serverwebroot:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" msgstr "Osiągnięto maksymalną głębokość rekurencji w pliku ZIP: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Mirror pełnego repo i archiwum, wszystkie typy plików." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" msgstr "Brakujący katalog wyjściowy" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" msgstr "Przenoszenie deklaracji niepożądanych funkcji do przetłumaczonych plików:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "Ani „repo_pubkey”, ani „keystorepass” nie są ustawione w config.yml" #: ../fdroidserver/verify.py #, python-format msgid "No APK for package: %s" msgstr "Brak APK dla pakietu: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Nie znaleziono pakietu SDK Androida!" #: ../fdroidserver/install.py msgid "No attached devices found" msgstr "Nie znaleziono podłączonych urządzeń" #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Brak odcisku palca w adresie URL." #: ../fdroidserver/common.py msgid "No git submodules available" msgstr "Brak dostępnych submodułów git" #: ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "Nie można znaleźć żadnego projektu gradle. Podaj --subdir?" #: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Nie znaleziono informacji." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" msgstr "Nie znaleziono pasujących tagów" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." msgstr "Nie znaleziono minimalnej wersji SDK w {0}, użyto domyślnej (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Nie musisz określać, że aplikacja jest wolnym oprogramowaniem" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" msgstr "Nie musisz określać, że aplikacja jest przeznaczona dla Androida" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "Brak opcji! Edytuj plik config.yml, aby ustawić co najmniej jedno z poniższych:" #: ../fdroidserver/common.py msgid "No packages specified" msgstr "Nie określono pakietów" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" msgstr "Żaden podpisany APK nie jest dostępny dla %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" msgstr "Brak podpisanego katalogu wyjściowego - nic nie można zrobić" #: ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" msgstr "Nie znaleziono certyfikatów do podpisu w {path}" #: ../fdroidserver/common.py #, python-format msgid "No such package: %s" msgstr "Brak takiego pakietu: %s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" msgstr "Brak takiego kodu wersji {versionCode} dla aplikacji {appid}" #: ../fdroidserver/checkupdates.py msgid "No tags found" msgstr "Nie znaleziono tagów" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" msgstr "Brak katalogu bez podpisu - nic nie można zrobić" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Nieprawidłowa definicja rozmiaru: \"{}\"" #: ../fdroidserver/signindex.py msgid "Nothing to do" msgstr "Nie ma nic do roboty" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." msgstr "Nic nie robić w {appid}." #: ../fdroidserver/init.py msgid "Now set these in config.yml:" msgstr "Teraz ustaw je w config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" msgstr "Plik OBB ma nowszą wersjęCode ({integer}) niż jakikolwiek pakiet APK:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" msgstr "Nazwa pliku OBB musi zaczynać się od \"main\". lub \"patch.\":" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" msgstr "Nazwa pakietu OBB nie jest zgodna z obsługiwanym pakietem APK:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Maszyna Offline, pomijając generowanie git mirror aż do ' fdroid deploy`" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Tylko PNG i JPEG są obsługiwane dla grafiki, znaleziono: {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Wydrukuj tylko różnice ze Sklepem Play" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Przetwarzaj tylko aplikacje z automatycznymi aktualizacjami" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Metody darowizn OpenCollective należą do OpenCollective: field" #: /usr/lib/python3.11/optparse.py msgid "Options" msgstr "Opcje" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Wyjście raportu JSON do pliku o nazwie po APK." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." msgstr "Wyjście JSON na stdout." #: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py #: ../fdroidserver/publish.py ../fdroidserver/signindex.py #: ../fdroidserver/update.py msgid "Outputting JSON" msgstr "Wyprowadzanie JSON" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Całkowita licencja na projekt." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Przesłaniam pustą versionName w {apkfilename} z metadanych: {version}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "Pakiet \"{appid}\" już istnieje" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" msgstr "Analizowanie manifestu w{path}" #: ../fdroidserver/common.py msgid "Password required with username" msgstr "Hasło wymagane przy użyciu nazwy użytkownika" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "Ścieżka do głównego podkatalogu projektu Android, jeśli nie w katalogu głównym." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" msgstr "Ścieżka do zestawu SDK systemu Android (czasami jest ustawiona w ANDROID_HOME)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" msgstr "Ścieżka do repozytorium git do użycia jako dziennik" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" msgstr "Ścieżka do magazynu kluczy dla klucza podpisywania repo" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Wydrukuj tajną zmienną do terminala, aby ułatwić kopiowanie/wklejanie" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" msgstr "Problem z plikiem ZIP: %s, błąd %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" msgstr "Problem z xml na {path}" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" msgstr "Proces auto aktualizacji" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" msgstr "Przetwarzanie {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" msgstr "Przetwarzanie {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" msgstr "Przygotuj czytelny dla człowieka XML/JSON dla plików index" #: ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "Adres URL projektu do zaimportowania z." #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" msgstr "Należy unikać interpunkcji" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" msgstr "Przepchnij dziennik do tego zdalnego repozytorium git" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing binary transparency log to {url}" msgstr "Przesyłanie dziennika przejrzystości plików binarnych do {url}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" msgstr "Wyślij do {url}" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" msgstr "Szybko uruchom nowe repozytorium" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" msgstr "Przeczytaj wszystkie pliki metadanych i zakończ" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" msgstr "Czytaj '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" msgstr "Nie można odczytać packageName/versionCode/versionName, niepoprawny pakiet APK: '{apkfilename}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" msgstr "Nie udało się odczytać packageName/versionCode/versionName, nieprawidłowy plik APK: „{apkfilename}”" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" msgstr "Czytanie {apkfilename} z pamięci podręcznej" #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Usuwanie określonych plików" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" msgstr "Usuwanie „{path}”" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Zmień nazwy plików APK, które nie pasują do pliku package.name_123.apk" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" msgstr "Tryb aktualizacji RepoTrunk ma sens tylko w repozytoriach git-svn" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." msgstr "Zresetuj i utwórz zupełnie nowy serwer kompilacji, nawet jeśli istniejący wydaje się być w porządku." #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" msgstr "Rezygnacja z pliku {apkfilename} za pomocą dostarczonego pliku debug.keystore" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" msgstr "Zmień rozmiar wszystkich ikon przekraczających maksymalny rozmiar pikseli i zakończ" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" msgstr "Ogranicz wyjście do ostrzeżeń i błędów" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Przepisz wszystkie pliki metadanych" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" msgstr "Przepisywanie '{appid}'" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" msgstr "Uruchom ponownie repozytorium git z niescommitowanymi zmianami" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Uruchom rewritemeta, aby naprawić formatowanie" #: ../fdroidserver/deploy.py msgid "Running first pass with MD5 checking disabled" msgstr "Uruchomienie pierwszego przejścia z wyłączonym sprawdzaniem MD5" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" msgstr "Uruchomienie wget w {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" msgstr "SHA-256 z {url} nie pasuje do wpisu!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Przeskanuj otrzymany plik APK w poszukiwaniu znanych niewolnych klas." #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" msgstr "Zeskanuj kod źródłowy pakietu" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {apk}" msgstr "Skaner znalazł {count} problemy(-ów) w {apk}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" msgstr "Skaner znalazł {count} problem w {appid}:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" msgstr "Skaner znalazł {count} problem w {appid}:{versionCode}:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "Skaner znalazł {} problem" msgstr[1] "Skaner znalazł {} problemów" msgstr[2] "Skaner znalazł {} problemy" #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "Skanowanie pakietu APK za pomocą dexdump w poszukiwaniu znanych niewolnych klas." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" msgstr "Ustaw NDK {release} ({version})" #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Ustaw zegar na ten czas, używając:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" msgstr "Ustaw maksymalne wydania w repo przed archiwizacją starszych" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" msgstr "Ustaw limit otwartych plików na {integer}" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" msgstr "Skonfiguruj aplikację na nocne repozytorium" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " msgstr "Ustawienie limitu otwartych plików nie powiodło się: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" msgstr "Ustawienie limitu czasu {0} w sek dla tej kompilacji" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Podpisz i umieść paczki w repozytorium" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" msgstr "Zarejestruj indeksy utworzone przy użyciu update --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" msgstr "Pomiń skanowanie kodu źródłowego dla plików binarnych i innych problemów" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Pomijaj '{apkfilename}' z nieprawidłowym podpisem!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" msgstr "Pomijanie serwera lustrzanego GitLab Pages, ponieważ repozytorium jest zbyt duże (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" msgstr "Pomijaj generowanie indeksu dla {appid}" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" msgstr "Pomijaj pliki {apkfilename} z nieprawidłowym podpisem!" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" msgstr "Pomiń {appid}: wyłączone" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" msgstr "Określ folder lokalny do synchronizacji repo do" #: ../fdroidserver/deploy.py msgid "Specify an identity file to provide to SSH for rsyncing" msgstr "Podaj plik tożsamości, który ma dostarczyć SSH dla rsyncing" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." msgstr "Określ, który plik pliku kluczy debugowania ma zostać użyty." #: ../fdroidserver/common.py msgid "Spew out even more information than normal" msgstr "Wypluwaj jeszcze więcej informacji niż zwykle" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" msgstr "Usuwanie tajemniczego podpisu z {apkfilename}" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" msgstr "Podsumowanie '%s' to tylko nazwa aplikacji" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" msgstr "Podsumowanie długości {length} przekracza limit {limit} char" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" msgstr "Zegar systemowy jest starszy niż data w {path}!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" msgstr "Tryb aktualizacji tagów działa obecnie tylko dla repozytoriów git, hg, bzr i git-svn" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "Tryb aktualizacji tagów użyty w git-svn, ale repozytorium nie zostało skonfigurowane z tagami" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Tryb testowy - umieszczaj dane wyjściowe tylko w katalogu tmp i zawsze buduj, nawet jeśli dane wyjściowe już istnieją." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" msgstr "Kod wersji OBB musi nadejść później \"{name}.\":" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" msgstr "Podstawowy adres URL repo do logowania (default: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" msgstr "Katalog do zapisania kopii lustrzanej" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" msgstr "Plik do uwzględnienia w repozytorium (ścieżka lub glob)" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." msgstr "Odcisk palca repozytorium nie pasuje." #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" msgstr "Katalog główny katalogu local_copy_dir \"{path}\" nie istnieje!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" msgstr "Istnieje kolizja keyalias - wstrzymano publikowanie" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." msgstr "To są aplikacje, które zostały zarchiwizowane w głównym repozytorium." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "To jest repozytorium aplikacji używanych z F-Droid. Aplikacje w tym repozytorium są albo oficjalnymi plikami binarnymi utworzonymi przez oryginalnych programistów aplikacji, albo plikami binarnymi utworzonymi ze źródła przez administratora f-droid.org przy użyciu narzędzi na https://gitlab.com/fdroid." #: ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "To repo ma już lokalne metadane: %s" #: ../fdroidserver/init.py #, python-format msgid "" "To complete the setup, add your APKs to \"%s\"\n" "then run \"fdroid update -c; fdroid update\". You might also want to edit\n" "\"config.yml\" to set the URL, repo name, and more. You should also set up\n" "a signing key (a temporary one might have been automatically generated).\n" "\n" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" "Aby zakończyć konfigurację, dodaj swoje pliki APK do „%s”\n" "następnie uruchom „fdroid update -c; fdroid update”. Możesz też chcieć zedytować\n" "„config.yml”, aby ustawić adres URL, nazwę repozytorium i inne. Powinieneś również skonfigurować\n" "klucz podpisu (tymczasowy mógł zostać wygenerowany automatycznie).\n" "\n" "Więcej informacji: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "i https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Aby użyć awsbucket, awssecretkey i awsaccesskeyid muszą być również ustawione w config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "Adres URL musi rozpoczynać się od https:// lub http://" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" msgstr "Skróty adresów URL nie powinny być używane" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" msgstr "Adres URL {url} w opisie {error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" msgstr "Nieprawidłowy tag licencji \"{}\"! Używaj tylko tagów zgodnych z FSF lub OSI ze strony https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Nieprawidłowy tag licencji \"{}\"! Używaj tylko tagów licencji skonfigurowanych w twoim pliku konfiguracji" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" msgstr "Nieoczekiwany cel dowiązania symbolicznego: {link} -> {target}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" msgstr "Nieznany wpis {key} w {configname}" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Znaleziono nieznany wyjątek!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" msgstr "Nieznany plik '{filename}' w kompilacji '{versionName}'" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" msgstr "Nieznany format metadanych: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" msgstr "Nieznany format metadanych: {path} (użyj: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " msgstr "Nieznana wersja programu aapt może powodować problemy: " #: ../fdroidserver/lint.py msgid "Unnecessary leading space" msgstr "Niepotrzebna przestrzeń wiodąca" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" msgstr "Niepotrzebne spacje końcowe" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" msgstr "Nierozpoznane pole aplikacji '{fieldname}' w '{path}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Nierozpoznana flaga kompilacji '{build_flag}' w '{path}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" msgstr "Nieobsługiwany typ pliku \"{extension}\" dla grafiki repo" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" msgstr "Znaleziono nieobsługiwany plik graficzny: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" msgstr "Niewykorzystane extlib o %s" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" msgstr "Plik UNUSED, o %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" msgstr "Nieużywana ścieżka scandelete: %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" msgstr "Nieużywana ścieżka scanignore: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" msgstr "Rozpakowywanie do %s" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Zaktualizuj informacje o repozytorium dla nowych pakietów" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" msgstr "Zaktualizuj dziennik przejrzystości plików binarnych dla adresu URL" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData ma nieprawidłowy adres URL: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" msgstr "UpdateCheckData musi odpowiadać kodowi wersji jako liczba całkowita (\\d lub [0-9]): {codeex}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" msgstr "UpdateCheckData musi używać adresu URL HTTPS: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData nie jest prawidłowym adresem URL: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode jest ustawiony, ale wygląda na to, że checkupdates nie został jeszcze uruchomiony" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName jest ustawiony na znany identyfikator aplikacji, można go usunąć" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" msgstr "Przesyłanie {apkfilename} do androidobservatory.org" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" msgstr "Przesyłanie {apkfilename} do virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "Usage" msgstr "Zastosowanie" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Użycie: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Użyj /HEAD zamiast/ master, aby wskazać plik w domyślnej gałęzi" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Użyj `fdroid update -c`, aby go utworzyć." #: ../fdroidserver/build.py msgid "Use build server" msgstr "Użyj serwera kompilacji" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" msgstr "Użyj daty z pliku APK zamiast aktualnego dla nowo dodanych pakietów APK" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." msgstr "Użyj \"{path}\" do konfiguracji s3cmd." #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "Używając APK Signature v2" #: ../fdroidserver/common.py msgid "Using APK Signature v3" msgstr "Używając APK Signature v3" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Korzystanie z jarsignera Java nie jest zalecane do weryfikacji plików APK! Użyj apksigner" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" msgstr "Korzystanie z androguard od \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" msgstr "Używanie pustego słownika zamiast zawartości {path}!" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" msgstr "Korzystanie z istniejącego magazynu kluczy \"{path}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" msgstr "Użyj s3cmd do synchronizacji z: {url}" #: ../fdroidserver/__main__.py msgid "Valid commands are:" msgstr "Prawidłowe polecenia to:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." msgstr "Zweryfikuj lokalnie kopiowaną pamięć podręczną zamiast pobierać ponownie." #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" msgstr "Sprawdź integralność pobranych pakietów" #: ../fdroidserver/index.py msgid "Verifying index signature:" msgstr "Weryfikowanie podpisu indeksu:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "Klucz VirusTotal API nie może przesyłać plików większych niż 32 MB, użyj {url}, aby przesłać {path}." #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Ostrzegaj o możliwych błędach metadanych" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Po skonfigurowaniu dla indeksów podpisanych utwórz na tym etapie tylko niepodpisane indeksy" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "Podczas linkowania całego repozytorium yamllint jest domyślnie wyłączony. Ta opcja wymusza yamllint niezależnie od tego." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distinguished Name' używana podczas generowania kluczy" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" msgstr "Możesz użyć ANDROID_HOME, aby ustawić ścieżkę do SDK, tj .:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" msgstr "Plik archiwum ZIP" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" msgstr "dodawanie pliku IdentityFile do {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" msgstr "dodaj do {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "niejednoznaczna opcja: %(option)s może dopasować %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "niejednoznaczna opcja: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "Nie znaleziono apksignera! Nie można podpisać ani zweryfikować nowoczesnych pakietów APK" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "apksigner nie znaleziono, jest wymagane do podpisania!" #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "Identyfikator aplikacji, na której ma działać" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" msgstr "identyfikator aplikacji z opcjonalnym kodem wersji w postaci APPID [: VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" msgstr "archive_url musi kończyć się na /archive" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "argument \"-\" w trybie %r" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" msgstr "argument %(argument_name)s: %(message)s" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" msgstr "próba połączenia odsłoniętego SSH w celu przetestowania klucza wdrożenia:" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" msgstr "can not parse scrlib spec (not a string):' {}'" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "nie można otworzyć „%(filename)s”: %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" msgstr "nie można otworzyć adresu URL innego niż https: „{}”" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" msgstr "Nie można znaleźć wymaganych srclibs: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "nie może mieć wielu argumentów o różnych argumentach" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "nie można scalać działania - dwie grupy są nazywane %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" msgstr "nie mogę opublikować aktualizacji, czy ustawiłeś klucz wdrożenia?" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" msgstr "klonowanie {url}" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" msgstr "polecenia z modułów plugin:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" msgstr "złożony" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "sprzeczny ciąg opcji: %s" msgstr[1] "sprzecznych ciągów opcji: %s" msgstr[2] "sprzeczne ciągi opcji: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser alias: %s" msgstr "kolidujący alias subparsera: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser: %s" msgstr "kolidujący subparser: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" msgstr "nie można przeanalizować '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "could not parse srclib spec (no ref specified):' {}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" msgstr "nie można przeanalizować specyfikacji srclib (za dużo znaków '@'): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" msgstr "tworzony {path}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" msgstr "aktualna wersja jest nowsza: stary vercode={old}, nowy vercode={new}" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" msgstr "usuwanie: repo/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" msgstr "wdrożony dziennik procesów {path} do {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest = jest wymagany dla opcji takich jak %r" #: ../fdroidserver/scanner.py msgid "downloading '{}'" msgstr "pobieranie „{}”" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" msgstr "nie udało się pobrać sygnatur skanera z „{}”" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" msgstr "wykonywalny binarny, ewentualnie kod" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "oczekiwany argument %s" msgstr[1] "oczekiwanych argumentów %s" msgstr[2] "oczekiwane argumenty %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "spodziewano się co najmniej jednego argumentu" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "spodziewano się co najwyżej jednego argumentu" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "oczekiwano jednego argumentu" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--help|--version|]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" msgstr "pobierz najnowszą wersję sygnatur z sieci" #: /usr/lib/python3.11/optparse.py msgid "floating-point" msgstr "zmiennoprzecinkowy" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "wymuszaj błędy metadanych (domyślnie), aby były ostrzeżeniami lub aby zostały zignorowane." #: ../fdroidserver/common.py msgid "git svn clone failed" msgstr "klon git svn nie powiódł się" #: ../fdroidserver/scanner.py msgid "gzip file archive" msgstr "plik archiwum gzip" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "zignorował wyraźny argument %r" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 musi mieć podpis, użyj `fdroid signindex` aby go utworzyć!" #: ../fdroidserver/index.py msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 musi mieć podpis, użyj `fdroid signindex`, aby go utworzyć!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" msgstr "liczba całkowita (ang. integer)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "nieprawidłowe %(type)s wartość: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "nieprawidłowy wybór: %(value)r (wybierz z %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "niepoprawna wartość parametru conflict_resolution: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "niepoprawny ciąg opcji %(option)r: musi zaczynać się od postaci %(prefix_chars)r" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" msgstr "nie znaleziono ipfs_cid, pomijanie generowania CIDv1" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" msgstr "najnowsza instrukcja kompilacji jest nowsza: stary vercode={old}, nowy vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "local_copy_dir nie kończy się na \"fdroid\", może masz na myśli: \"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" msgstr "local_copy_dir musi być ścieżką bezwzględną!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" msgstr "local_copy_dir musi być katalogiem, a nie plikiem!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" msgstr "mirror '%s'nie kończy się na 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "wykluczające się wzajemnie argumenty muszą być opcjonalne" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" msgstr "następna aktualizacja pamięci podręcznej {name} zaplanowana na {time}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" msgstr "brak \"ikony\" w {appid}" #: ../fdroidserver/signatures.py msgid "no APK supplied" msgstr "nie dostarczono pakietu APK" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" msgstr "brak takiej opcji: %s" #: ../fdroidserver/__main__.py msgid "no version info found!" msgstr "nie znaleziono informacji o wersji!" #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "nie znaleziono informacji o wersji" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "niedozwolone z argumentem %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "jeden z argumentów %s jest wymagany" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" msgstr "akceptuje tylko łańcuchy, listy i krotki" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "opcja %s: Jeśli naprawdę chcesz zainstalować wszystkie podpisane aplikacje, użyj --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "opcja %s: nieprawidłowa %s wartość: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "opcja %s: nieprawidłowy wybór: %r (wybierz z %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" msgstr "opcja -%s nie został rozpoznany" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" msgstr "opcja -%s wymaga argumentu" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "opcja --%s nie może mieć argumentu" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "opcja --%s nie jest to unikalny prefiks" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" msgstr "opcja --%s nie został rozpoznany" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s requires argument" msgstr "opcja --%s wymaga argumentu" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "opcjonalne argumenty" #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "opcje" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" msgstr "nadpisanie istniejącego {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "argumenty pozycyjne" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" msgstr "proces wdrażania dziennika {path} do {dest} nie powiódł się!" #: ../fdroidserver/build.py msgid "reference binary missing signature" msgstr "brakujący podpis binarnego pliku odniesienia" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" msgstr "odmów pobierania przez niezabezpieczone połączenie HTTP (użyj HTTPS lub określ --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." msgstr "repo_icon \"repo / icons / %s\" nie istnieje, generuje symbol zastępczy." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" msgstr "repo_url musi kończyć się na /repo" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "nie zainstalowano ruamel.yaml, nie można zapisać metadanych." #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd zsynchronizuj indeksy {path} do {url} i usuń" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "pamięć podręczna skanera jest zniszczona! Możesz to wyczyścić poleceniem: „{clear}”" #: ../fdroidserver/scanner.py msgid "shared library" msgstr "biblioteka współdzielona" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" msgstr "pokaż numer wersji programu i zakończ" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" msgstr "pokaż ten komunikat pomocy i zakończ" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." msgstr "podpisany plik APK - ścieżka do pliku lub URL HTTPS." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" msgstr "pomiń wdrażanie dzienników pełnej kompilacji: zawartość dziennika jest pusta" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" msgstr "pomiń wdrażanie pełnych dzienników kompilacji: nie włączone w konfiguracji" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" msgstr "pomijanie archiwum źródłowego: {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" msgstr "brak nazwy srclibs i/lub @" #: ../fdroidserver/scanner.py msgid "static library" msgstr "biblioteka statyczna" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" msgstr "dostarczony referencyjny plik binarny umożliwił podpis {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "wymagane są następujące argumenty: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "nieoczekiwany ciąg opcji: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "nieznana składnia (parser) %(parser_name)r (wybierz: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "nierozpoznane argumenty: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "niebezpieczne uprawnienia na '{config_file}' (powinno być 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "stosowanie: " #: ../fdroidserver/deploy.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" msgstr "używając Apache libcloud do zsynchronizowania z {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com jest ograniczenie stawki, czeka na ponowną próbę..." #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" msgstr[0] "{0} app, {1} kluczowy alias" msgstr[1] "{0} app, {1} kluczowe aliasy" msgstr[2] "{0} apps, {1} kluczowych aliasów" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) nie ma metadanych!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" msgstr "{apkfilename} ma wiele {name} plików, wygląda jak exploit Master Key!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "{apkfilename} AndroidManifest.xml ma złą datę: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} nie ma nazwy! Zamiast tego używam identyfikatora aplikacji." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" msgstr "{appid} z {path} nie jest prawidłowym identyfikatorem aplikacji na system Android!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid} z {path} nie jest prawidłową nazwą pakietu Java!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" msgstr "{appid} zawiera zarówno pliki APK, jak i pliki: {files}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" msgstr "{appid} brakuje {name}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" msgstr "{appid}: Nieznany extlib {path} w kompilacji '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" msgstr "{appid}: nie określono żadnych kompilacji, działa na bieżącym stanie źródła" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" msgstr "{appid}: {field} musi być '{type}', ale to jest '{fieldtype}!'" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" msgstr "{appid}: {field} musi być '{type}', ale to jest '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} musi być liczbą całkowitą, znaleziono: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be list or string, found: {value}" msgstr "{build_flag} musi być listą lub ciągiem, znaleziono: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" msgstr "{file} jest pusty lub uszkodzony!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" nie istnieje! Sprawdź \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} jest przestarzałe, użyj {newfile}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "{path} już istnieje, ignorowanie rezultatów importowania!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" msgstr "{path} nie istnieje! Utwórz go, uruchamiając:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} ma zły podpis pliku \"{pattern}\", możliwe wykorzystanie Janusa!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" msgstr "{path} ma zerowy rozmiar!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} więcej niż 200MB, przesłane ręcznie: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} nie kończy się na 'fdroid', sprawdź ścieżkę URL!" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url} nie zaczyna się od \"http\"!" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" msgstr[0] "{} kompilacja nie powiodła się" msgstr[1] "{} kompilacji nie powiodło się" msgstr[2] "{} kompilacje nie powiodły się" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} kompilacja powiodła się" msgstr[1] "{} kompilacji powiodło się" msgstr[2] "{} kompilacje powiodły się" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/locale/pt/0000755000175000017500000000000014620351546014672 5ustar00hanshans././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.888382 fdroidserver-2.3a1/locale/pt/LC_MESSAGES/0000755000175000017500000000000014620351546016457 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/locale/pt/LC_MESSAGES/fdroidserver.po0000644000175000017500000027201314620351225021514 0ustar00hanshans# SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # ssantos , 2020, 2021, 2022, 2023. # Peter J. Mello , 2021. # Eduardo Rodrigues , 2021. # SC , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2023-07-02 15:51+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 5.0-dev\n" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" "\n" "Chave pública SSH a ser usada como chave de implantação:" #: ../fdroidserver/nightly.py #, python-brace-format msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" "\n" "{path} codificado para a variável secreta DEBUG_KEYSTORE:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" não tem ficheiro de metadados correspondente!" #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" msgstr "O diretório raiz para \"local_copy_dir\" {path} não existe!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "'{apkfilename}' já está instalado no {dev}." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" msgstr "\"{path}\" contém {name} ({version}) desatualizado" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" msgstr "\"{path}\" contém {name} ({version}) recente" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" msgstr "\"{path}\" existe, mas s3cmd não está instalado!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" msgstr "\"{path}\" não é um formato de ficheiro aceito (use: metadata/*.yml)" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "\"{path}\" é assinado por uma chave que não é permitida:" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" não é uma URL válida!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" msgstr[0] "A opção %(option)s requer o argumento %(number)d" msgstr[1] "A opção %(option)s requer os argumentos %(number)d" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: erro: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" msgstr "%d problemas encontrados" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "%prog [options]" msgstr "%prog [opções]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" msgstr "%r não pode ser invocado" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" msgstr "%s não produziu um dict!" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" msgstr "%s tem um SHA-256 ruim: %s" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" msgstr "%s não é um campo criado aceito" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" msgstr "opção %s não leva um valor" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' não foi encontrada em config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "\"keystore\" é NONE e \"smartcardoptions\" está vazio!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "'keystore' não encontrada em config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' não encontrada em config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' não encontrada em config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' é um argumento inválido para posicionadores" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" msgstr "'sdk_path' não definido em 'config.yml'!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' é muito antigo, fdroid requer build-tools-{version} ou mais recente!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" msgstr "'{field}' será em ordem aleatória! Use () ou [] se a ordem for importante!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" msgstr "'{path}' falhou ao executar!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' tem um formato inválido, deveria ser um dicionário!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' não é um {field} válido em {appid}. Modelo regex: {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' não é um {field} válido, deve ser {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" msgstr "...checkupdate falhou para {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() não definida" #: ../fdroidserver/lint.py msgid "/issues is missing" msgstr "está faltando o /issues" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" msgstr "Uma URL é necessária como um argumento!" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Adicione assinaturas PGP usando GnuPG para os pacotes no repositório" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" msgstr "Adicionar uma chave de assinatura para um repositório não assinado" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" msgstr "Adicionar ficheiros de metadados de esqueleto para APKs que estão faltando-lhes" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" msgstr "Adicionando novo repositório para apenas {name}" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" msgstr "Alias (apelido) da chave de assinatura do repositório na keystore" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" msgstr "AllowedAPKSigningKeys está ausente, mas o binário de referência foi fornecido" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Permite que uma revisão diferente (ou árvore do git) seja especificada para a importação inicial" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" msgstr "Também espelhar o ficheiro completo da secção" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" msgstr "Também avisar sobre problemas de formatação, como rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" msgstr "Biblioteca AAR do Android" #: ../fdroidserver/scanner.py msgid "Android APK file" msgstr "Ficheiro APK do Android" #: ../fdroidserver/scanner.py msgid "Android DEX code" msgstr "Código DEX do Android" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" msgstr "SDK do Android não foi encontrado em {path}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" msgstr "O caminho do SDK Android '{path}' não existe!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" msgstr "O caminho do SDK Android '{path}' não é um diretório!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" msgstr "A ferramenta SDK do Android {cmd} não foi encontrada!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "A app tem binários, mas não tem AllowedAPKSigningKeys correspondentes para fixar o certificado." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "A app tem NoSourceSince ou ArchivePolicy \"0 versões\", mas AutoUpdateMode ou UpdateCheckMode não são Nenhum" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" msgstr "A App está em '{repo}' mas tem uma hiperligação para {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "A versão da app tem um binário, mas não tem as AllowedAPKSigningKeys correspondentes para fixar o certificado." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Acrescentar .git não é necessário" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" msgstr "Arquivamento {apkfilename} com assinatura inválida!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode com UpdateCheckMode: HTTP deve ter um modelo." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" msgstr "Tipo de entrada \"{mirrortype}\" incorreto na configuração de espelhos: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "URL base para espelhar, pode incluir a chave de assinatura de índice usando a cadeia de consulta: ?fingerprint =" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" msgstr "Filial '{branch} 1' usada como commit no build '{versionName} 2'" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" msgstr "Ramificação '{branch}' usado como commit em srclib '{srclib}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" msgstr "Ligação simbólica quebrada: {path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" msgstr "Construir pacote através da fonte" #: ../fdroidserver/build.py msgid "Build all applications available" msgstr "Compilar todos as aplicações disponíveis" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" msgstr "Compilação gerada por `fdroid import` - remove a linha de desativação quando estiver pronto" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" msgstr "Construir metadados git repo não tem mudanças comprometidas!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" msgstr "Compilar apenas a última versão de cada pacote" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" msgstr "Repo construído baseado em \"%s\" com esta configuração:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" msgstr "Não é possível atualizar automaticamente a aplicação sem CurrentVersionCode" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "Não é possível construir devido a erro {} durante a digitalização" msgstr[1] "Não é possível construir devido a erros {} durante a digitalização" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" msgstr "Não é possível reescrever \"{path}\"" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "As categorias '%s' não são válidas" #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "As categorias não são definidas" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Verificação de actualizações das aplicações" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Verificando o arquivamento para {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Atualização limpa - não usa cache, reprocessa todos os APKs" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Lista de categorias separadas por vírgula." #: ../fdroidserver/__main__.py #, python-format msgid "Command '%s' not recognised.\n" msgstr "Comando '%s' não reconhecido.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" msgstr "Enviar mudanças" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" msgstr "Definições contraditórias de \"{field}\" entre ficheiros .yml e ficheiros localizados:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argumentos conflitantes: \"--verbose\" e \"--quiet\" não podem ser especificados ao mesmo tempo." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" msgstr "Ficheiros de configuração conflitantes! Usando {newfile}, ignorando {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "Não foi possível encontrar '{command}' no seu sistema" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Não foi possível encontrar o código de versão mais recente" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Não foi possível encontrar o nome da versão mais recente" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" msgstr "Não foi possível localizar {path} para removê-lo" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " msgstr "Não foi possível abrir o APK {path} para análise: " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Não foi possível analisar o tamanho \"{size}\", tipo \"{type}\" incorreto" #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Não foi possível encontrar o ID da aplicação" #: ../fdroidserver/checkupdates.py msgid "Couldn't find any version information" msgstr "Não foi encontrada qualquer informação da versão" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "Não foi possível encontrar o ID do pacote" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" msgstr "Cobardemente recusando substituir a configuração da chave de assinatura existente!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" msgstr "Novo contentor criado: \"{name}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Criando \"{path}\" para configurar s3cmd." #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Criando o diretório de log" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" msgstr "Criando novo bucket S3: {url}" #: ../fdroidserver/publish.py msgid "Creating output directory" msgstr "Criando diretório de output" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" msgstr "Criando índice assinado com esta chave (SHA256):" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" msgstr "Criando diretório temporário" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" msgstr "Criação de índice não assinado em preparação para assinatura" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" msgstr "CurrentVersionCode {cv} é menor que a entrada mais antiga de build {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" msgstr "DEBUG_KEYSTORE não está definido ou o valor está incompleto" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" msgstr "Eliminação de APK'S e/ou OBBs que não contêm metadados do repositório" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" msgstr "Apagar ficheiro, o reporte é muito grande ({size} max {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" msgstr "Apagar o histórico do git-mirror, o repo é muito grande ({size} max {limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" msgstr "Apagando o ficheiro desconhecido: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" msgstr "Descrição '%s' é apenas o resumo da app" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" msgstr "A descrição tem uma linha duplicada" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" msgstr "A descrição tem a lista (%s), mas não tem marcadores (*), nem é numerada (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" msgstr "A descrição de comprimento {length} é sobre o limite de char {limit}" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Não adicionar 'disable:' às entradas de compilação geradas" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" msgstr "Não implante os novos ficheiros no repositório" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" msgstr "Não incluir \"{path}\" no URL!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" msgstr "Não solicitar o caminho do Android SDK, apenas falhe" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" msgstr "Não remover as chaves privadas geradas do keystore" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" msgstr "Não criar um tarball da fonte; útil quando testando uma compilação" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" msgstr "Não atualizar o repositório; útil quando testando uma compilação sem conexão com a internet" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" msgstr "Não usar as somas de verificação (checksums) do rsync" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Descarregar espelhos completos de repos pequenos" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" msgstr "A descarregar %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "O descarregamento do repositório já falhou uma vez, não tento novamente." #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" msgstr "Descarregar {url} falhou. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" msgstr "A declaração duplicada da característica indesejada em {path} foi ignorada!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" msgstr "Entrada \"%s\" duplicada na configuração de espelhos!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" msgstr "Ligação duplicada em '{field}': {url}" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ERRO: o subcomando \"server\" foi removido, use \"deploy\"!" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" "ERRO: este comando nunca deve ser usado para espelhar f-Droid.org!\n" "Um espelho completo de f-Droid.org requer mais de 200GB." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERRO: tipo de CI sem suporte, patches são bem-vindos!" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "ERRO: host de git \"%s\" não suportado, patches são bem-vindos!" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." msgstr "A codificação está definida como '{enc}' fdroid pode ter problemas de codificação. Por favor, configure-o para 'UTF-8' para obter melhores resultados." #: ../fdroidserver/init.py #, python-format msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" "Digite o caminho para o SDK do Android (%s) aqui:\n" "> " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" msgstr "A variável de ambiente {var} de {configname} não está definida!" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Erro ao obter o endereço do repo" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" msgstr "Sair com um código diferente de zero se problemas forem encontrados" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Extrair metadados de aplicações de um repositório de origem" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Extrato de assinaturas de APKs" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" msgstr "Falha ao copiar {path}: {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" msgstr "Falha ao buscar assinaturas para '{apkfilename}': {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" msgstr "Falha de leitura {path}: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" msgstr "Falha ao redimensionar {path}: {error}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" msgstr "Falha ao criar o bucket S3: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" msgstr "Falha ao obter informações do APK, apagando {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" msgstr "Falha ao obter informações do APK, ignorando {path}" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" msgstr "Falha ao obter a impressão digital da chave de assinatura do APK" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" msgstr "Falha ao instalar '{apkfilename}' em {dev}: {error}" #: ../fdroidserver/common.py msgid "Failed to sign application" msgstr "Falha ao assinar a app" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" msgstr "Buildserverid obtido da VM: {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" msgstr "Assinaturas obtidas para '{apkfilename}'-> '{sigdir}'" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" msgstr "O ficheiro desapareceu enquanto era processado: {path}" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py #: ../fdroidserver/update.py msgid "Finished" msgstr "Terminado" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" msgstr "Os métodos de doação do Flattr pertencem no campo FlattrID:" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Tags HTML proibidos" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." msgstr "Forçar a compilação de apps desativados e continuar independentemente de problemas de escaneamento. Apenas permitido no modo de teste." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" msgstr "Forçar suspender a construção depois de esperar {0} segundos!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." msgstr "Forçar a análise de apps e construções desativados." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" msgstr "\"{path}\" gráfico encontrado sem metadados para o app \"{name}\"!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "Ficheiro de financiamento ruim \"{path}\" encontrado para \"{name}\":" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" msgstr "appids inválidos encontrados em argumentos" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "versionCodes inválidos encontrados para algumas apps" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Vários ficheiros de blocos de assinaturas JAR foram encontrados em {path}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" msgstr "Encontrados vários ficheiros de metadados para {appid}" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." msgstr "Vários certificados de assinatura encontrados para o repositório." #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." msgstr "Nenhum certificado de assinatura para repositório encontrado." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" msgstr "Não-ficheiro encontrado em %s" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" msgstr "{apkfilename} encontrado em {url}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} problems in {filename}" msgstr "{count} problemas encontrados em {filename}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" msgstr "{count} avisos encontrados em {filename}" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" msgstr "Gerado esqueleto de metadados para {appid}" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" msgstr "Git checkout de '%s' falhou" #: ../fdroidserver/common.py msgid "Git clean failed" msgstr "Git clean falhou" #: ../fdroidserver/common.py msgid "Git fetch failed" msgstr "Git fetch falhou" #: ../fdroidserver/common.py msgid "Git prune failed" msgstr "Git prune falhou" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Git remote set-head falhou: \"%s\"" #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Git reset falhou" #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Git submodule sync falhou" #: ../fdroidserver/common.py msgid "Git submodule update failed" msgstr "Git submodule update falhou" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" msgstr "HTTPS deve ser usado nos URLs do Subversion!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" msgstr "Se um espelho git ficar muito grande, permite que o arquivo seja apagado" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" msgstr "Se esse envio falhar, tente enviar manualmente para {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." msgstr "A ignorar '{field}' em metadados '{metapath}' porque é depreciado." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "A ignorar a entrada FUNDING.yml por mais de 2048: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" msgstr "A ignorar o elemento mau no manifesto: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorando o pacote sem metadados: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" msgstr "Ignorando dados de cache obsoletos para {apkfilename}" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" msgstr "Incluir APKs assinados com algoritmos desativados como MD5" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" msgstr "Incluir os ficheiros .asc da assinatura PGP no espelho" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" msgstr "Incluir os registos de construção no espelho" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" msgstr "Incluir os tarballs de fontes no espelho" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" msgstr "Incluindo metadados de %s@%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" msgstr "Incluindo metadados de {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Inicializando submódulos" #: ../fdroidserver/install.py msgid "Install all signed applications available" msgstr "Instalar todas as aplicações assinadas disponíveis" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" msgstr "Instalação dos pacotes compilados no aparelho" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." msgstr "A instalar %s…" #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." msgstr "A instalar '{apkfilename}' em {dev}…" #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" msgstr "Interacção com o repositório do servidor HTTP" #: ../fdroidserver/update.py msgid "Invalid APK" msgstr "APK inválido" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" msgstr "AutoUpdateMode inválido: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" msgstr "UpdateCheckMode inválido: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" msgstr "VercodeOperation inválido: {field}" #: ../fdroidserver/lint.py #, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "VercodeOperation inválido: {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "ID da aplicação {appid} inválido" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" msgstr "Booleano inválido '%s'" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Lista com marcadores inválida" #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" msgstr "Nome inválido para o ficheiro publicado: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" msgstr "Ndk inválido: entrada na compilação: \"{ndk}\"" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " msgstr "Redirecionamento inválido para não-HTTPS: {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" msgstr "Metadados de scrlib inválidos: '{file}' não existe" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" msgstr "Metadados de srclib inválidos: não foi possível analisar \"{file}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" msgstr "Metadados de srclib inválidos: chave \"{key}\" desconhecida no \"{file}\"" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" msgstr "A assinatura JAR falhou a verificação: {path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" msgstr "Assinatura JAR verificada: {path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" msgstr "Ficheiro Java JAR" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" msgstr "O Java JDK não foi encontrado! Instalar no local predefinido ou definir java_paths!" #: ../fdroidserver/scanner.py msgid "Java compiled class" msgstr "Classe Java compilada" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" msgstr "Java jarsigner não encontrado! Instale no local predefinido ou define java_paths!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" msgstr "JavaScript em atributos HTML src" #: ../fdroidserver/build.py #, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" msgstr "Mantendo a compilação com falha \"{apkfilename}\"" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Armazenamento de chaves de assinatura:\t" #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" msgstr "O último commit usado '{commit}' parece-se com uma tag, mas o UpdateCheckMode (modo de verificação de atualização) é '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" msgstr "Os métodos de doação de Liberapay pertencem no campo Liberapay:" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted (dry run)" msgstr "Listar ficheiros que devem ser reformatados (execução a seco)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "Locale incluído no URL do f-droid.org" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" msgstr "Fazer a compilação parar se encontrar exceções" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." msgstr "Espelhos de repositório malformados." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" msgstr "Linha de serverwebroot malformada:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" msgstr "Profundidade máxima de recursão no ficheiro ZIP atingida: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Espelha todo o repositório e pacotes, todos os tipos de ficheiros." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" msgstr "Falta diretório de saída" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" msgstr "A mover as declarações de características indesejadas para ficheiros localizados:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "Nem \"repo_pubkey\" nem \"keystorepass\" definidos em config.yml" #: ../fdroidserver/verify.py #, python-format msgid "No APK for package: %s" msgstr "Nenhum APK para o pacote: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Android SDK não encontrado!" #: ../fdroidserver/install.py msgid "No attached devices found" msgstr "Nenhum aparelho anexado encontrado" #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Nenhuma impressão digital no URL." #: ../fdroidserver/common.py msgid "No git submodules available" msgstr "Não há submódulos git disponíveis" #: ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "Não foi possível encontrar nenhum projeto de gradle. Especificar --subdir?" #: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Nenhuma informação encontrada." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" msgstr "Não foram encontradas marcações correspondentes" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." msgstr "Nenhuma versão mínima do SDK encontrada em {0}, a usar a predefinição (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Não há necessidade de especificar que o app é software livre" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" msgstr "Não há necessidade de especificar que o app é para Android" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "Sem opção definida! Edite seu config.yml para definir pelo menos um destes:" #: ../fdroidserver/common.py msgid "No packages specified" msgstr "Nenhum pacote especificado" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" msgstr "Nenhum APK assinado disponível para %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" msgstr "Nenhum diretório de saída assinado - nada a fazer" #: ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" msgstr "Nenhum certificado de assinatura encontrado em {path}" #: ../fdroidserver/common.py #, python-format msgid "No such package: %s" msgstr "Nenhum pacote desses: %s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" msgstr "Nenhum versionCode {versionCode} para o app {appid}" #: ../fdroidserver/checkupdates.py msgid "No tags found" msgstr "Nenhuma etiqueta encontrada" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" msgstr "Nenhum diretório não assinado - nada a fazer" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Não é uma definição de tamanho válida: \"{}\"" #: ../fdroidserver/signindex.py msgid "Nothing to do" msgstr "Nada para fazer" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." msgstr "Nada a fazer para {appid}." #: ../fdroidserver/init.py msgid "Now set these in config.yml:" msgstr "Agora configure estes em config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" msgstr "OBB tem versionCode ({integer}) mais recente que qualquer APK:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" msgstr "O nome do ficheiro OBB deve começar com \"main.\" ou \"patch.\":" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" msgstr "O packagename do OBB não corresponde a um APK suportado:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "A máquina está offline, a saltar a geração de espelhos de git até o `fdroid deploy'" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Somente PNG e JPEG são suportados para gráficos, encontrado: {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Apenas mostrar diferenças com a Play Store" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Processar apenas apps com atualizações automáticas" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Os métodos de doação OpenCollective pertencem no campo OpenCollective:" #: /usr/lib/python3.11/optparse.py msgid "Options" msgstr "Opções" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Saída de relatório JSON para ficheiro nomeado após APK." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." msgstr "Saída de JSON para stdout." #: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py #: ../fdroidserver/publish.py ../fdroidserver/signindex.py #: ../fdroidserver/update.py msgid "Outputting JSON" msgstr "Saída do JSON" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Licença geral do projeto." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Substituindo versionName em branco em {apkfilename} dos metadados: {version}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "O pacote \"{appid}\" já existe" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" msgstr "Analisando o manifesto em '{path}'" #: ../fdroidserver/common.py msgid "Password required with username" msgstr "Palavra-passe necessária com o nome de utilizador" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "Caminho para o subdiretório principal do projeto Android, se não estiver na raiz." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" msgstr "Caminho até o Android SDK (algumas vezes definido em ANDROID_HOME)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" msgstr "Caminho para o repositório git para usar como log" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" msgstr "Caminho até a keystore para a chave de assinatura do repositório" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Imprimir a variável secreta para o terminal para copiar/colar fácilmente" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" msgstr "Problema com o ficheiro ZIP: %s, erro %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" msgstr "Problema com xml em '{path}'" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" msgstr "Processar atualizações automáticas" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" msgstr "A processar {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" msgstr "A processar {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" msgstr "Produzir XML/JSON legível por humanos para ficheiros de índice" #: ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "URL do projeto para importar." #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" msgstr "A pontuação deve ser evitada" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" msgstr "Submeter o registo de eventos para este repositório git remoto" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing binary transparency log to {url}" msgstr "A submeter o registo de transparência de binário para {url}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" msgstr "A submeter para {url}" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" msgstr "Criar rapidamente um novo repositório" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" msgstr "Ler todos os ficheiros de metadados e sair" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" msgstr "A ler '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" msgstr "A leitura de packageName/versionCode/versionName falhou, APK inválido: '{apkfilename}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" msgstr "Falha ao ler packageName/versionCode/versionName, APK inválido: '{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" msgstr "Lendo {apkfilename} do cache" #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Apagando ficheiros especificados" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" msgstr "A remover {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Renomear todos os ficheiros APKs que não correspondem com package.name_123.apk" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" msgstr "O modo de atualização repoTrunk só faz sentido em repositórios de git-svn" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." msgstr "Redefinir e criar um novo servidor de compilação, mesmo que o existente parecer normal." #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" msgstr "Renunciando {apkfilename} com debug.keystore fornecido" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" msgstr "Redimensionar todos os ícones que excedam o tamanho máximo de pixels e sair" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" msgstr "Restringir a saída a erros e avisos" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Regravar todos os ficheiros de metadados" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" msgstr "Reescrevendo '{appid}'" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" msgstr "Executar no repo git que tem alterações não confirmadas" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Executar rewritemeta para corrigir a formatação" #: ../fdroidserver/deploy.py msgid "Running first pass with MD5 checking disabled" msgstr "Executando a primeira passagem com a verificação de MD5 desativada" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" msgstr "Executando o wget em {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" msgstr "O SHA-256 de {url} não corresponde à entrada!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Procure no(s) APK(s) resultante(s) por classes conhecidas não livres." #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" msgstr "Analisar o código fonte de um pacote" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {apk}" msgstr "O scanner encontrou {count} problemas em {apk}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" msgstr "O scanner encontrou {count} problemas em {appid}:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" msgstr "O scanner encontrou {count} problemas em {appid}:{versionCode}:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "Scanner encontrou {} problema" msgstr[1] "Scanner encontrou {} problemas" #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "A verificar o APK com dexdump por classes não-livres conhecidas." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" msgstr "Definir NDK {release} ({version}) para cima" #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Configurar o relógio para esse tempo usando:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" msgstr "Definir o máximo de lançamentos no repo antes que os mais antigos sejam arquivados" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" msgstr "Definir o limite de ficheiros abertos para {integer}" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" msgstr "Configurar uma compilação de app para um repositório de compilação noturno" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " msgstr "Falha ao definir o limite de ficheiros abertos: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" msgstr "Definindo o tempo limite de {0} seg para esta compilação" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Assinar e pôr os pacotes no repositório" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" msgstr "Assinar os índices criados com o uso de update --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" msgstr "Pular o escaneamento do código-fonte atrás de binários e outros problemas" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Ignorando '{apkfilename}' com uma assinatura inválida!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" msgstr "A ignorar o espelho do GitLab Pages porque o repositório é muito grande (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" msgstr "Ignorando a geração de índices para {appid}" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" msgstr "Ignorando '{apkfilename}' com uma assinatura inválida!" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" msgstr "Ignorando {appid}: desativado" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" msgstr "Especifique uma pasta local para ser sincronizada com o repositório" #: ../fdroidserver/deploy.py msgid "Specify an identity file to provide to SSH for rsyncing" msgstr "Especifique um ficheiro identidade para fornecer ao SSH para usar o rsync" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." msgstr "Especifique o ficheiro de armazenamento de chaves de depuração." #: ../fdroidserver/common.py msgid "Spew out even more information than normal" msgstr "Mostrar ainda mais informações que o normal" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" msgstr "Esvaziar a assinatura misteriosa de {apkfilename}" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" msgstr "O resumo '%s' é apenas o nome do app" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" msgstr "A descrição de comprimento {length} é sobre o limite de charácteres {limit}" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" msgstr "O relógio do sistema é mais antigo que a data em {path}!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" msgstr "O modo de atualização de marcações só funciona atualmente para repositórios git, hg, bzr e git-svn" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "Modo de atualização de marcações usado no git-svn, mas a repo não foi configurada com marcações" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Modo de teste - coloque a saída apenas no diretório tmp e sempre compile, mesmo que a saída já exista." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" msgstr "O código de versão OBB deve estar após \"{name}.\":" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" msgstr "O URL base para o registro de mudanças do repositório (predefinição: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" msgstr "O diretório para onde escrever o espelho" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" msgstr "O ficherio a ser incluído no repo (caminho ou glob)" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." msgstr "A impressão digital do repositório não corresponde." #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" msgstr "O diretório raiz para local_copy_dir \"{path}\" não existe!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" msgstr "Há uma colisão do keyalias - publicação parada" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." msgstr "Estas são as aplicações que foram arquivadas do repositório principal." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Este é um repositório de apps a serem usados com o F-Droid. Aplicações neste repositório são binários oficiais compilados pelos programadores da aplicação original ou são binários compilados da fonte por f-droid.org a usar as ferramentas em https://gitlab.com/fdroid." #: ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Este repositório já tem metadados locais: %s" #: ../fdroidserver/init.py #, python-format msgid "" "To complete the setup, add your APKs to \"%s\"\n" "then run \"fdroid update -c; fdroid update\". You might also want to edit\n" "\"config.yml\" to set the URL, repo name, and more. You should also set up\n" "a signing key (a temporary one might have been automatically generated).\n" "\n" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" "Para completar a configuração, adicione os seus APKs ao \"%s\",\n" "depois execute \"fdroid update -c; fdroid update\". Também pode editar\n" "\"config.yml\" para definir a URL, nome do repo, e muito mais. Também deve configurar\n" "uma chave de assinatura (uma chave temporária pode ter sido gerada automaticamente).\n" "\n" "Para mais informações: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "e https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "A URL deve começar com https:// ou http://" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" msgstr "Encurtadores de URL não devem ser usados" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" msgstr "Há o URL {url} na descrição: {error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" msgstr "Etiqueta de licença \"{}\" inesperada! Use somente as etiquetas aprovadas pela FSF ou OSI de https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Etiqueta de licença \"{}\" inesperada! Use somente as etiquetas de licença configuradas no seu ficheiro de configuração" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" msgstr "Alvo symlink inesperado: {link} -> {target}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" msgstr "Entrada {key} desconhecida em {configname}" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Exceção desconhecida!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" msgstr "Ficheiro desconhecido '{filename}' na compilação '{versionName}'" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" msgstr "Formato de metadados desconhecido: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" msgstr "O formato de metadados é desconhecido: {path} (use: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " msgstr "Versão desconhecida do aapt, pode causar problemas: " #: ../fdroidserver/lint.py msgid "Unnecessary leading space" msgstr "Espaço desnecessário à frente" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" msgstr "Espaço desnecessário ao fim" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" msgstr "Campo de aplicação '{fieldname}' não reconhecido em '{path}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Bandeira de compilação '{build_flag}' não reconhecida em '{path}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" msgstr "Tipo de ficheiro \"{extension}\" não suportado para o gráfico de repo" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" msgstr "Ficheiro gráfico não suportado encontrado: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" msgstr "Extlib não utilizado em %s" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" msgstr "Ficheiro não utilizado em %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" msgstr "O caminho de scandelete não é usado: %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" msgstr "O caminho de scanignore não é usado: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" msgstr "A descompactar para %s" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Atualizar a informação do repositório para novos pacotes" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" msgstr "Atualizar o registo de transparência de binário para um URL" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData tem URL inválido: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" msgstr "UpdateCheckData deve corresponder ao código da versão como inteiro (\\d ou [0-9]): {codeex}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" msgstr "UpdateCheckData deve usar um URL HTTPS: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData não é uma URL válida: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não foi executado" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName (o nome da verificação de atualização) é definido como o ID comun da aplicação - pode ser removido" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" msgstr "A enviar {apkfilename} ao androidobservatory.org" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" msgstr "A enviar {apkfilename} ao virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "Usage" msgstr "Utilização" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Utilização: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Use /HEAD em vez de /master para apontar num ficheiro na ramificação predefinida" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Use ' fdroid update -c ' para criá-lo." #: ../fdroidserver/build.py msgid "Use build server" msgstr "Usar servidor de compilação" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" msgstr "Use da data do APK em vez do tempo atual para APKs recém-adicionados" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." msgstr "Usando \"{path}\" para configurar s3cmd." #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "A usar a assinatura APK v2" #: ../fdroidserver/common.py msgid "Using APK Signature v3" msgstr "A usar a assinatura APK v3" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Usando o jarsigner de Java, não recomendado para verificar APKs! Use apksigner" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" msgstr "Usando androguard de \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" msgstr "A utilizar um dicionário em branco em vez do conteúdo de {path}!" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" msgstr "Utilizando armazenamento de chave existente \"{path}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" msgstr "Usando s3cmd para sincronizar com: {url}" #: ../fdroidserver/__main__.py msgid "Valid commands are:" msgstr "Comandos válidos:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." msgstr "Verifique a cópia em cache local em vez de redescarregando." #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" msgstr "Verifique a integridade dos pacotes descarregados" #: ../fdroidserver/index.py msgid "Verifying index signature:" msgstr "Verificar o índice de assinatura:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "A chave VirusTotal API não pode enviar ficheiros maiores que 32MB, use {url} para enviar {path}." #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Avisar sobre possíveis erros de metadados" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Quando configurado para índices assinados, crie apenas índices não assinados nesta etapa" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "Ao cotar todo o repositório o yamllint é desativado por predefinição. Esta opção força o yamllint independentemente." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distiguished Name' usado na geração de chaves" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" msgstr "Pode usar ANDROID_HOME para definir o caminho para o seu SDK, ou seja:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" msgstr "Arquivo de ficheiros ZIP" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" msgstr "adicionando IdentityFile a {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" msgstr "adicionando a {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opção ambígua: %(option)s poderia corresponder %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "opção ambígua: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner não encontrado! Não é possível assinar ou verificar APKs modernos" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "Nenhum apksigner encontrado, é necessário para assinar!" #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "ID de aplicação do ficheiro para operar" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationID com versionCode opcional na forma APPID[:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" msgstr "archive_url precisa de terminar com /archive" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "argumento \"-\" com o modo %r" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" msgstr "argumento %(argument_name)s: %(message)s" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" msgstr "tentar a conexão nua por SSH para testar a implantação da chave:" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" msgstr "não é possível analisar as especificações do scrlib (não é uma cadeia): '{}'" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "não é possível abrir '%(filename)s': %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" msgstr "não é possível abrir o url não-https: '{};" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" msgstr "não é possível encontrar os srclibs necessários: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "não é possível ter vários argumentos de subparser" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "não é possível unir ações - dois grupos são denominados %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" msgstr "não é possível publicar a atualização, definiu a chave de implantação?" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" msgstr "clonagem {url}" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" msgstr "comandos dos módulos de plugin:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" msgstr "complexo" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "cadeia de opções conflitante: %s" msgstr[1] "cadeias de opções conflitantes: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser alias: %s" msgstr "alias de subanalisador conflitante: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser: %s" msgstr "subanalisador conflitante: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" msgstr "não foi possível analisar '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "não foi possível analisar a especificação srclib (referência não especificada): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" msgstr "não foi possível analisar a especificação srclib (demais símbolos '@'): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" msgstr "{path} criado" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" msgstr "a versão atual é mais nova: velho vercódigo={old}, novo vercódigo={new}" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" msgstr "apagando: repo/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" msgstr "registo de processo implantado {path} a {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest = é necessário para opções como %r" #: ../fdroidserver/scanner.py msgid "downloading '{}'" msgstr "a descarregar '{}'" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" msgstr "a descarga de assinaturas de scanner de '{}' falhou" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" msgstr "binário executável, possivelmente código" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "%s argumento esperado" msgstr[1] "%s argumentos esperados" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "esperado pelo menos um argumento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "esperado um argumento no máximo" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "esperado um argumento" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--help|--version|]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" msgstr "buscar a versão de assinaturas mais recente da Web" #: /usr/lib/python3.11/optparse.py msgid "floating-point" msgstr "ponto flutuante" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "Forçar os erros de metadados (padrão) para serem avisos, ou para serem ignorados." #: ../fdroidserver/common.py msgid "git svn clone failed" msgstr "git svn clone falhou" #: ../fdroidserver/scanner.py msgid "gzip file archive" msgstr "arquivo de ficheiros gzip" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "argumento explícito %r ignorado" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 deve ter uma assinatura, use ' fdroid signindex ' para criá-lo!" #: ../fdroidserver/index.py msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 deve ter uma assinatura, use droid signindex` para o criar!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" msgstr "inteiro" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valor inválido do tipo %(type)s: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "opção inválida: %(value)r (escolha de %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valor conflict_resolution inválido: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "Opção cadeia %(option)r inválida: deve começar com o caractere %(prefix_chars)r" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" msgstr "ipfs_cid não encontrado, a ignorar a geração de CIDv1" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" msgstr "a última receita de construção é mais recente: velho vercódigo={old}, novo vercódigo={new}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "local_copy_dir não termina com \"fdroid\", talvez quis: \"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" msgstr "local_copy_dir deve ser um caminho absoluto!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" msgstr "local_copy_dir deve ser directory, não um ficheiro!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" msgstr "espelho '%s' não termina com 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "argumentos mutuamente exclusivos devem ser opcional" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" msgstr "próxima atualização do cache {name} prevista para {time}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" msgstr "nenhum \"ícone\" em {appid}" #: ../fdroidserver/signatures.py msgid "no APK supplied" msgstr "nenhum APK fornecido" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" msgstr "não tem tal opção: %s" #: ../fdroidserver/__main__.py msgid "no version info found!" msgstr "não há informações de versão encontrada!" #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "nenhuma informação de versão encontrada" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "não é permitido com o argumento %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "um dos argumentos %s é necessário" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" msgstr "apenas aceita cadeias, listas e tuplos" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "opção %s: se realmente deseja instalar todas as apps assinadas, use --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "Opção %s: valor %s inválido: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "opção %s: escolha inválida: %r (escolha entre %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" msgstr "opção -%s não reconhecida" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" msgstr "opção -%s requer um argumento" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "opção --%s não pode ter argumento" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "opção --%s não é prefixo único" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" msgstr "opção --%s não reconhecida" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s requires argument" msgstr "opção --%s necessita argumento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "argumentos opcionais" #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "opções" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" msgstr "sobrescrevendo {path} existente" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "argumentos posicionais" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" msgstr "a implementação do registo de processo {path} a {dest} falhou!" #: ../fdroidserver/build.py msgid "reference binary missing signature" msgstr "binária de referência sem assinatura" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" msgstr "Recusado a descarrega via conexão HTTP insegura (use HTTPS ou especifique --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." msgstr "repo_icon \"repo/icons/%s\" não existe, a gerar um espaço reservado." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" msgstr "repo_url precisa de terminar com /repo" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "o ruamel.yaml não está instalado, não é possível escrever metadados." #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sincroniza índices {path} para {url} e apaga" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "o cache do scanner está malformado! Pode limpá-lo com: '{clear}'" #: ../fdroidserver/scanner.py msgid "shared library" msgstr "biblioteca compartilhada" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" msgstr "mostrar versão do programa e sair" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" msgstr "mostrar esta ajuda e sair" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." msgstr "APK assinado, seja um caminho de ficheiro ou um URL HTTPS." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" msgstr "pular a implantação de logs completos de compilação: o conteúdo do log está vazio" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" msgstr "pular a implantação de logs de criação completos: não ativado na configuração" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" msgstr "ignorando o tarball de origem: {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" msgstr "Nome 'srclibs' ausente e/ou '@'" #: ../fdroidserver/scanner.py msgid "static library" msgstr "biblioteca estática" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" msgstr "o binário de referência fornecido tem o assinante permitido {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "os seguintes argumentos são necessários: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "opção de cadeia de texto inesperada: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "O formato '%(parser_name)r' é desconhecido. (Opções Válidas: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "argumentos não reconhecidos: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "permissões inseguras em '{config_file}' (deveria ser 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "utilização: " #: ../fdroidserver/deploy.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" msgstr "usando o Apache libcloud para sincronizar com {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "o virustotal.com está a limitar a taxa, à espera para voltar a tentar..." #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" msgstr[0] "{0} app, {1} aliases chave" msgstr[1] "{0} apps, {1} aliases chave" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) não tem metadados!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" msgstr "{apkfilename} tem vários ficheiros {name} que, parece explorar a Master Key!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "AndroidManifest.xml do {apkfilename} tem uma data má: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} não tem um nome! A usar o ID da aplicação em vez disso." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" msgstr "{appid} de {path} não é um ID de aplicação Android válido!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid} do {path} não é um Nome de Pacote Java válido!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" msgstr "{appid} tem APKs e ficheiros: {files}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" msgstr "{appid} tem falta de {name}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" msgstr "{appid}: extlib {path} desconhecido na compilação '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" msgstr "{appid}: nehnuma compilação especificada, em execução no estado de origem atual" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" msgstr "{appid}: {field} deve ser um '{type}', mas é um '{fieldtype}!'" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" msgstr "{appid}: {field} deve ser um '{type}', mas é um '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} deve ser um inteiro, encontrado: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be list or string, found: {value}" msgstr "{build_flag} deve ser uma lista ou uma cadeia de caracteres, encontrado: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" msgstr "{file} está em branco ou corrompido!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" não existe! Corrija-o no \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} está obsoleto, use {newfile}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "{path} já existe, a ignorar os resultados das importações!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" msgstr "{path} não existe! Crie-o executando:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} tem uma má assinatura de ficheiro \"{pattern}\", um exploração Janus é possível!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" msgstr "{path} tem um tamanho de zero!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} mais de 200MB, enviar manualmente: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} não termina com \"fdroid\", verifique o caminho na URL!" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url} não começa com \"http\"!" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" msgstr[0] "{} compilação falhada" msgstr[1] "{} compilações falhadas" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} compilação com sucesso" msgstr[1] "{} compilações com sucesso" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/locale/pt_BR/0000755000175000017500000000000014620351546015255 5ustar00hanshans././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.888382 fdroidserver-2.3a1/locale/pt_BR/LC_MESSAGES/0000755000175000017500000000000014620351546017042 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/locale/pt_BR/LC_MESSAGES/fdroidserver.po0000644000175000017500000027322414620351225022104 0ustar00hanshans# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # Wellington Terumi Uemura , 2020. # André Marcelo Alvarenga , 2020. # Hans-Christoph Steiner , 2020. # Rafael Fontenelle , 2020, 2021. # ssantos , 2020. # The Cats , 2020. # Eduardo Rodrigues , 2021. # Flavio F. M. , 2022. # The Cats , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2023-08-18 15:51+0000\n" "Last-Translator: The Cats \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 5.0-dev\n" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" "\n" "Chave pública SSH para ser usada como chave de implantação:" #: ../fdroidserver/nightly.py #, python-brace-format msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" "\n" "{path} codificado para a variável secreta DEBUG_KEYSTORE:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" não tem arquivo de metadados correspondente!" #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" msgstr "O diretório raiz para \"local_copy_dir\" {path} não existe!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\" já está instalado em {dev}." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" msgstr "\"{path}\" contém {name} ({version}) desatualizado" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" msgstr "\"{path}\" contém {name} ({version}) recente" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" msgstr "\"{path}\" existe, mas s3cmd não está instalado!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" msgstr "\"{path}\" não é um formato aceito (use: metadata/*.yml)" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "\"{path}\" é assinado por uma chave que não é permitida:" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" não é uma URL válida!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" msgstr[0] "opção %(option)s necessita %(number)d argumento" msgstr[1] "opção %(option)s necessita %(number)d argumentos" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: erro: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" msgstr "%d problemas encontrados" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "%prog [options]" msgstr "%prog [opções]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" msgstr "%r não é chamável" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" msgstr "%s não produziu um dict!" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" msgstr "%s tem SHA-256 ruim: %s" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" msgstr "%s não é um campo criado aceito" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" msgstr "opção %s não leva um valor" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' não foi encontrada em config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "\"keystore\" é NONE e \"smartcardoptions\" está vazia!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "'keystore' não encontrada em config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' não encontrada em config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' não encontrada em config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' é um argumento inválido para posicionadores" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" msgstr "\"sdk_path\" não definido em config.yml!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' é muito antigo, fdroid requer build-tools-{version} ou mais recente!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" msgstr "'{field}' será em ordem aleatória! Use () ou [] se a ordem for importante!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" msgstr "'{path}' falhou ao executar!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' tem um formato inválido, deveria ser um dicionário!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' não é um{field} válido em {appid}. Regex padrão: {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' não é um {field} válido, deveria ser {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" msgstr "...checkupdate falhou para {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() não definida" #: ../fdroidserver/lint.py msgid "/issues is missing" msgstr "está faltando o /issues" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" msgstr "Uma URL é necessária como um argumento!" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Adicione assinaturas PGP usando GnuPG para os pacotes no repositório" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" msgstr "Adicionar uma chave de assinatura para um repositório não assinado" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" msgstr "Adicionar arquivos de metadados de esqueleto para APKs que estão faltando-lhes" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" msgstr "Adicionando novo repositório para apenas {name}" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" msgstr "Alias (apelido) da chave de assinatura do repositório na keystore" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" msgstr "AllowedAPKSigningKeys ausente, mas binário de referência fornecido" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Permite que uma revisão diferente (ou árvore do git) seja especificada para a importação inicial" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" msgstr "Também espelhar o arquivo completo da seção" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" msgstr "Também avisar sobre problemas de formatação, como rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" msgstr "Biblioteca AAR do Android" #: ../fdroidserver/scanner.py msgid "Android APK file" msgstr "Arquivo APK do Android" #: ../fdroidserver/scanner.py msgid "Android DEX code" msgstr "Código DEX do Android" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" msgstr "Android SDK não encontrado em {path}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" msgstr "O caminho do SDK Android '{path}' não existe!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" msgstr "O caminho do SDK Android '{path}' não é um diretório!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" msgstr "A ferramenta SDK do Android {cmd} não foi encontrada!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "O aplicativo tem binários, mas não tem AllowedAPKSigningKeys correspondentes para fixar o certificado." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "O aplicativo tem NoSourceSince ou ArchivePolicy \"0 versões\", mas AutoUpdateMode ou UpdateCheckMode não são None" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" msgstr "O App está em '{repo}' mas tem um link para {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "A versão do aplicativo tem binário, mas não tem as correspondentes AllowedAPKSigningKeys para fixar o certificado." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Acrescentar .git não é necessário" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" msgstr "Arquivamento {apkfilename} com assinatura inválida!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode com atualização CheckMode: HTTP deve ter um padrão." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" msgstr "Tipo de entrada incorreto \"{mirrortype}\" na configuração de espelhos: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "URL base para espelhar, pode incluir a chave de assinatura de índice usando a string de consulta:? Fingerprint =" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" msgstr "Filial '{branch} 1' usada como commit no build '{versionName} 2'" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" msgstr "Ramificação '{branch}' usada como commit em srclib '{srclib}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" msgstr "Link simbólico quebrado: {path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" msgstr "Compila um pacote a partir do código-fonte" #: ../fdroidserver/build.py msgid "Build all applications available" msgstr "Compilar todos aplicativos disponíveis" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" msgstr "Compilação gerada por `fdroid import` - remove a linha de desativação quando estiver pronto" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" msgstr "Construir metadados git repo não tem mudanças comprometidas!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" msgstr "Compilar apenas a última versão de cada pacote" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" msgstr "Repo construído baseado em \"%s\" com esta configuração:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" msgstr "Não pode atualizar automaticamente o aplicativo sem CurrentVersionCode" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "Não é possível criar devido a {} erro durante a digitalização" msgstr[1] "Não é possível criar devido a {} erros durante a digitalização" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" msgstr "Não é possível reescrever \"{path}\"" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "Categorias '%s' não são válidas" #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "As categorias não estão definidas" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Verifica se existem atualizações para os aplicativos" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Verificar o arquivamento de {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Atualização limpa - não utiliza o cache, reprocessa todos os APKs" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Lista de categorias separadas por vírgula." #: ../fdroidserver/__main__.py #, python-format msgid "Command '%s' not recognised.\n" msgstr "Comando \"%s\" não reconhecido.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" msgstr "Enviar mudanças" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" msgstr "Definições conflitantes de \"{field}\" entre arquivos .yml e localizados:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argumentos conflitantes: \"--verbose\" e \"--quiet\" não podem ser especificados ao mesmo tempo." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" msgstr "Arquivos de configuração conflitantes! Usando {newfile}, ignorando {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "Impossível encontrar '{command}' em seu sistema" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Não foi possível encontrar o código da versão mais recente" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Não foi possível encontrar o nome da versão mais recente" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" msgstr "Impossível encontrar {path} para removê-lo" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " msgstr "Impossível abrir o APK {path} para análise: " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Não foi possível analisar o tamanho \"{size}\", tipo incorreto \"{type}\"" #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Não foi possível encontrar o ID do aplicativo" #: ../fdroidserver/checkupdates.py msgid "Couldn't find any version information" msgstr "Não foi possível encontrar nenhuma informação de versão" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "Impossível encontrar o ID do pacote" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" msgstr "Recusando-se covardemente de sobrescrever a configuração de chave de assinatura existente!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" msgstr "Novo container criado \"{name}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Criando \"{path}\" para configurar s3cmd." #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Criando diretório de registro" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" msgstr "Criando o novo Balde de S3: {url}" #: ../fdroidserver/publish.py msgid "Creating output directory" msgstr "Criando diretório de saída" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" msgstr "Criando índice assinado com esta chave (SHA256):" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" msgstr "Criando diretório temporário" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" msgstr "Criando índice não assinado em preparação para assinatura" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" msgstr "O CurrentVersionCode {cv} é menor que a entrada da versão mais antiga {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" msgstr "DEBUG_KEYSTORE não está definido ou o valor está incompleto" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" msgstr "Apaga os APKs e/ou OBBs sem metadados do repositório" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" msgstr "Excluindo o pacote, o repositório está grande demais ({size} máx {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" msgstr "Excluindo histórico de git-mirror, o repositório está grande demais ({size} máx {limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" msgstr "Excluindo arquivo desconhecido: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" msgstr "Descrição '%s' é apenas o resumo do aplicativo" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" msgstr "Descrição tem uma linha duplicada" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" msgstr "Descrição tem uma lista (%s), mas não é com marcadores (*) nem numerada (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" msgstr "A descrição de tamanho {length} está acima do limite de {limit} caracteres" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Não adicione \"disable:\" para as entradas de compilação geradas" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" msgstr "Não implemente os novos arquivos no repositório" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" msgstr "Não inclua \"{path}\" no URL!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" msgstr "Não solicitar o caminho do Android SDK, apenas falhe" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" msgstr "Não remova as chaves privadas geradas do keystore" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" msgstr "Não criar um tarball da fonte; útil quando testando uma compilação" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" msgstr "Não atualizar o repositório; útil quando testando uma compilação sem conexão com a internet" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" msgstr "Não usar as somas de verificação (checksums) do rsync" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Faça o download de espelhos completos de pequenos repositórios" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" msgstr "Baixando %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "O download do repositório já falhou uma vez, não tente novamente." #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" msgstr "Falha ao baixar '{url}'. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" msgstr "A declaração duplicada do Anti-Recurso em {path} foi ignorada!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" msgstr "Entrada \"%s\" duplicada na configuração de espelhos!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" msgstr "Link duplicado em '{field}': {url}" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ERRO: o subcomando \"server\" foi removido, use \"deploy\"!" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" "ERRO: este comando nunca deve ser usado para espelhar o f-droid.org!\n" "Um espelho completo de f-droid.org requer mais de 200 GB." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERRO: tipo de IC não suportado, correções bem-vindas!" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "ERRO: host de git \"%s\" não suportado, patches são bem-vindos!" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." msgstr "A codificação está definida para \"{enc}\", fdroid pode ter problemas de codificação. Defina-a para \"UTF-8\" para melhores resultados." #: ../fdroidserver/init.py #, python-format msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" "Digite o caminho para o Android SDK (%s) aqui:\n" "> " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" msgstr "A variável de ambiente {var} de {configname} não está definida!" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Erro ao obter o endereço do repositório" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" msgstr "Sair com um código diferente de zero se problemas forem encontrados" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Extrair metadados de aplicativos de um repositório de origem" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Extrair assinaturas de APKs" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" msgstr "Falha ao copiar {path}: {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" msgstr "Falha ao buscar assinaturas para '{apkfilename}': {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" msgstr "Falha ao ler {path}: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" msgstr "Falha ao redimensionar {path}: {error}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" msgstr "Falha ao criar o Balde do S3: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" msgstr "Falha ao obter informações do APK, excluindo {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" msgstr "Falha ao obter informações do APK, ignorando {path}" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" msgstr "Falha ao obter a impressão digital da chave de assinatura do APK" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" msgstr "Falha ao instalar '{apkfilename}' em {dev}: {error}" #: ../fdroidserver/common.py msgid "Failed to sign application" msgstr "Falha ao assinar inscrição" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" msgstr "ID do servidor de compilação buscado na Máquina Virtual: {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" msgstr "As assinaturas buscadas para '{apkfilename}' -> '{sigdir}'" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" msgstr "O arquivo desapareceu enquanto era processado: {path}" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py #: ../fdroidserver/update.py msgid "Finished" msgstr "Acabado" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" msgstr "Métodos de doação Flattr pertencem ao campo FlattrID" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Tags HTML proibidas" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." msgstr "Forçar a compilação de aplicativos desativados e continuar independentemente de problemas de escaneamento. Apenas permitido no modo de teste." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" msgstr "Forçar a parada da compilação após tempo limite de {0} segundos!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." msgstr "Força varredura de aplicativos e compilações desativadas." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" msgstr "Foi encontrado o gráfico \"{path}\" sem metadados para o aplicativo \"{name}\"!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "Encontrado arquivo inválido \"{path}\" de financiamento para \"{name}\":" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" msgstr "Encontrou aplicativos inválidos em argumentos" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "Encontrado versões de códigos inválidas para alguns aplicativos" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Encontrados vários arquivos de bloqueio de assinatura JAR em {path}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" msgstr "Encontrados vários arquivos de metadados para {appid}" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." msgstr "Encontrado vários certificados de assinatura para o repositório." #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." msgstr "Não encontrado os certificados de assinatura para o repositório." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" msgstr "Arquivo não encontrado em %s" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" msgstr "Encontrado {apkfilename} em {url}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} problems in {filename}" msgstr "{count} problemas encontrados em {filename}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" msgstr "{count} advertências encontradas em {filename}" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" msgstr "Gerado esqueleto de metadados para {appid}" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" msgstr "Checkout de Git '%s' falhou" #: ../fdroidserver/common.py msgid "Git clean failed" msgstr "Falha ao limpar o Git" #: ../fdroidserver/common.py msgid "Git fetch failed" msgstr "Falha no 'fetch' do Git" #: ../fdroidserver/common.py msgid "Git prune failed" msgstr "Falha na remoção do Git" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Git remote set-head falhou: \"%s\"" #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Falha no 'reset' do Git" #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Falha na sincronização do submódulo Git" #: ../fdroidserver/common.py msgid "Git submodule update failed" msgstr "Falha na atualização do submódulo Git" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" msgstr "HTTPS deve ser usado com URLs do Subversion(SVN)!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" msgstr "Se um espelho git ficar muito grande, permite que o arquivo seja excluído" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" msgstr "Se o upload falhar, tente fazer o upload manualmente para {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." msgstr "Ignorando \"{field}\" em metadados \"{metapath}\" porque foi descontinuado." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "Ignorando entrada de FUNDING.yml maior que 2048: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" msgstr "Ignorando o elemento mau no manifesto: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorando o pacote sem metadados: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" msgstr "Ignorando dados de 'cache' antigos de {apkfilename}" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" msgstr "Inclua APKs assinados com algoritmos desativados, como o MD5" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" msgstr "Inclui os arquivos de assinatura PGP (.asc) no espelho" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" msgstr "Inclui os logs de compilação no espelho" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" msgstr "Inclui os tarballs fonte no espelho" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" msgstr "Incluindo metadados de %s@%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" msgstr "Incluindo metadados de {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Inicializando submódulos" #: ../fdroidserver/install.py msgid "Install all signed applications available" msgstr "Instalar todos os aplicativos assinados disponíveis" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" msgstr "Instala pacotes compilados nos dispositivos" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." msgstr "Instalando %s…" #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." msgstr "Instalando \"{apkfilename}\" em {dev}…" #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" msgstr "Interage com o servidor HTTP do repositório" #: ../fdroidserver/update.py msgid "Invalid APK" msgstr "APK inválido" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" msgstr "Modo de Atualização Automática inválido: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" msgstr "UpdateCheckMode inválido: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" msgstr "Versão de Operação de Código inválido: {field}" #: ../fdroidserver/lint.py #, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "Versão de Operação de Código inválido: {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "ID do aplicativo {appid} inválido" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" msgstr "Booleano inválido '%s'" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Lista com marcadores inválida" #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" msgstr "Nome inválido para o arquivo publicado: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" msgstr "ndk inválido: entrada na compilação: \"{ndk}\"" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " msgstr "Redirecionamento inválido para não HTTPS: {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" msgstr "Metadados de scrlib inválidos: \"{file}\" não existe" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" msgstr "Metadados de srclib inválidos: não foi possível analisar \"{file}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" msgstr "Metadados de srclib inválidos: chave desconhecida \"{key}\" em \"{file}\"" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" msgstr "A assinatura JAR falhou ao verificar: {path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" msgstr "Assinatura do JAR verificada: {path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" msgstr "Arquivo JAR de Java" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" msgstr "Java JDK não encontrado! Instale no local padrão ou defina java_paths!" #: ../fdroidserver/scanner.py msgid "Java compiled class" msgstr "Classe Java compilada" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" msgstr "Java jarsigner não encontrado! Instale no local padrão ou defina java_paths!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" msgstr "Javascript em atributo 'src' de HTML" #: ../fdroidserver/build.py #, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" msgstr "Mantendo a compilação com falha \"{apkfilename}\"" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Armazenamento de chaves de assinatura:\t" #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" msgstr "O último commit usado '{commit}' parece com uma tag, mas o UpdateCheckMode (modo de verificação de atualização) é '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" msgstr "Métodos de doação do Liberapay pertencem ao campo LiberapayID" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted (dry run)" msgstr "Listar arquivos que seriam reformatados (execução a seco)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "A localização foi incluída na URL f-droid.org" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" msgstr "Fazer a compilação parar se encontrar exceções" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." msgstr "Espelhos de repositórios malformados." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" msgstr "Linha mal-formada do 'serverwebroot':" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" msgstr "Profundidade máxima de recursão no arquivo ZIP atingida: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Espelha todo o repositório e pacotes, todos os tipos de arquivos." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" msgstr "Diretório de saída ausente" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" msgstr "Movendo declarações de Anti-Recursos para arquivos localizados:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "Nem \"repo_pubkey\" nem \"keystorepass\" definidos em config.yml" #: ../fdroidserver/verify.py #, python-format msgid "No APK for package: %s" msgstr "Nenhum APK para o pacote: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Nenhum 'Android SDK' foi encontrado!" #: ../fdroidserver/install.py msgid "No attached devices found" msgstr "Nenhum dispositivo conectado encontrado" #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Nenhuma impressão digital (fingerprint) no URL." #: ../fdroidserver/common.py msgid "No git submodules available" msgstr "Nenhum Submódulo Git disponível" #: ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "Nenhum projeto gradle foi encontrado. Especifique --subdir?" #: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Nenhuma informação encontrada." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" msgstr "Nenhuma tag correspondente encontrada" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." msgstr "Nenhuma versão mínima do SDK encontrada em {0}, usando o padrão (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Não há necessidade de especificar que o aplicativo é Software Livre" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" msgstr "Não há necessidade de especificar que é um aplicativo para Android" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "Nenhuma opção definida! Edite seu 'config.yml' para definir pelo menos um destes:" #: ../fdroidserver/common.py msgid "No packages specified" msgstr "Nenhum pacote especificado" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" msgstr "Não há APK assinado disponível para %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" msgstr "Nenhum diretório de saída assinado - nada a fazer" #: ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" msgstr "Nenhum certificado de assinatura encontrado em {path}" #: ../fdroidserver/common.py #, python-format msgid "No such package: %s" msgstr "Nenhum pacote desse tipo: %s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" msgstr "Nenhum tal versionCode {versionCode} para o aplicativo {appid}" #: ../fdroidserver/checkupdates.py msgid "No tags found" msgstr "Nenhuma etiqueta encontrada" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" msgstr "Nenhum diretório não assinado - nada a fazer" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Não é uma definição de tamanho válida: \"{}\"" #: ../fdroidserver/signindex.py msgid "Nothing to do" msgstr "Nada para fazer" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." msgstr "Nada a fazer para {appid}." #: ../fdroidserver/init.py msgid "Now set these in config.yml:" msgstr "Agora defina estes em config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" msgstr "O arquivo OBB tem um novo versionCode ({integer}) que qualquer outro APK:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" msgstr "O nome do arquivo OBB deve começar com \"main.\" ou \"patch.\":" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" msgstr "O nome do pacote do OBB não corresponde a um APK suportado:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "A máquina está desconectada, pulando geração de espelhos de git até o `fdroid deploy'" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Apenas PNG e JPEG são suportados para gráficos, encontrados: {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Apenas mostrar diferenças com a Play Store" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Processar apenas aplicativos com atualizações automáticas" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Os métodos de doação opencollective pertencem ao campo OpenCollective" #: /usr/lib/python3.11/optparse.py msgid "Options" msgstr "Opções" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Exporte a saída do relatório JSON para um nome de arquivo após APK." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." msgstr "Emite JSON para stdout (saída padrão)." #: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py #: ../fdroidserver/publish.py ../fdroidserver/signindex.py #: ../fdroidserver/update.py msgid "Outputting JSON" msgstr "Emitindo JSON" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Licença geral do projeto." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Substituindo versionName em branco em {apkfilename} dos metadados: {version}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "O pacote \"{appid}\" já existe" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" msgstr "Manifesto de análise no '{path}'" #: ../fdroidserver/common.py msgid "Password required with username" msgstr "Senha requerida com nome de usuário" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "Caminho para os principais subdiretórios do projeto android, se não estiver na raiz (root)." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" msgstr "Caminho até o Android SDK (algumas vezes definido em ANDROID_HOME)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" msgstr "Caminho para o repositório git para usar como log" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" msgstr "Caminho até a keystore para a chave de assinatura do repositório" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Imprima a variável secreta no terminal para facilitar a cópia/colagem" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" msgstr "Problema com o arquivo ZIP: %s, erro %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" msgstr "Problema com XML em '{path}'" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" msgstr "Processar atualizações automáticas" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" msgstr "Processando {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" msgstr "Processando {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" msgstr "Produzir XML/JSON legível por humanos para arquivos de índice" #: ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "URL do projeto para importar." #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" msgstr "Pontuação deve ser evitada" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" msgstr "Mandar o registro de mudanças para este repositório git remoto" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing binary transparency log to {url}" msgstr "Atualizar o log de transparência de um binário para {url}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" msgstr "Empurrando para {url}" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" msgstr "Cria rapidamente um novo repositório" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" msgstr "Lê todos os arquivos de metadados e sai" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" msgstr "Lendo '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" msgstr "A leitura de packageName/versionCode/versionName falhou, o APK inválido: '{apkfilename}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" msgstr "Falha ao ler packageName/versionCode/versionName, APK inválido: '{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" msgstr "Lendo {apkfilename} do cache" #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Removendo arquivos especificados" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" msgstr "Removendo {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Renomeia arquivos APK que não correspondem a pacote.nome_123.apk" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" msgstr "O modo de atualização repoTrunk só faz sentido em repositórios git-svn" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." msgstr "Redefinir e criar um novo servidor de compilação, mesmo que o existente parecer normal." #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" msgstr "Resignando {apkfilename} como o fornecido debug.keystore" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" msgstr "Redimensionar todos os ícones que excedam o tamanho máximo de pixels e sair" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" msgstr "Restringir a saída a erros e avisos" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Reescreve todos os arquivos de metadados" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" msgstr "Reescrevendo '{appid}'" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" msgstr "Executar no repositório do Git que tenha alterações não confirmadas" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Executar rewritemeta para corrigir a formatação" #: ../fdroidserver/deploy.py msgid "Running first pass with MD5 checking disabled" msgstr "Execução da primeira passagem com a verificação do MD5 desativada" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" msgstr "Executando o 'wget' em {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" msgstr "O SHA-256 de {url} não corresponde à entrada!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Verifique os APKs resultantes na busca das classes não gratuitas já conhecidas." #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" msgstr "Percorre o código-fonte de um pacote" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {apk}" msgstr "O scanner encontrou {count} problemas em {apk}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" msgstr "O scanner encontrou {count} problemas em {appid}:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" msgstr "O scanner encontrou {count} problemas em {appid}: {versionCode}:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "O Scanner encontrou {} problema" msgstr[1] "O Scanner encontrou {} problemas" #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "Verificando o APK com dexdump por classes não-livres conhecidas." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" msgstr "Defina NDK {release} ({version}) para cima" #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Ajuste o relógio para esse horário usando:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" msgstr "Defina as liberações máximas no repo antes que as mais antigas sejam arquivadas" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" msgstr "Defina o limite de arquivos abertos para {integer}" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" msgstr "Configurar uma compilação de aplicativo para um repositório de compilação todas-as-noites" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " msgstr "A configuração do limite de arquivos abertos falhou: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" msgstr "Definindo {0} segundos como tempo limite de para esta compilação" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Assina e coloca pacotes no repositório" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" msgstr "Assina os índices criados usando update --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" msgstr "Pular o escaneamento do código fonte atrás de binários e outros problemas" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Ignorando '{apkfilename}' com assinatura inválida!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" msgstr "Ignorando o espelho do GitLab Pages porque o repositório é muito grande (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" msgstr "Ignorando a geração de índice para {appid}" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" msgstr "Ignorando {apkfilename} com assinatura inválida!" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" msgstr "Ignorando {appid}: desativado" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" msgstr "Especifique uma pasta local para ser sincronizada com o repositório" #: ../fdroidserver/deploy.py msgid "Specify an identity file to provide to SSH for rsyncing" msgstr "Especifique um arquivo identidade para fornecer ao SSH para usar o rsync" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." msgstr "Especifique qual arquivo keystore de depuração deve ser usado." #: ../fdroidserver/common.py msgid "Spew out even more information than normal" msgstr "Mostrar ainda mais informações que o normal" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" msgstr "Descarnar a assinatura misteriosa a partir do {apkfilename}" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" msgstr "Resumo '%s' é apenas o nome do aplicativo" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" msgstr "O resumo do tamanho {length} está acima do limite de caracteres {limit}" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" msgstr "O relógio/calendário do sistema é mais atrasado que em '{path}'!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" msgstr "O modo de atualização de tags só funciona para repositórios git, hg, bzr e git-svn atualmente" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "Modo de atualização de tags usado no git-svn, mas o repositório não foi configurado com tags" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Modo de teste - coloque a saída apenas no diretório tmp e sempre compile, mesmo que a saída já exista." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" msgstr "O código da versão do OBB deve vir depois de \"{name}.\":" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" msgstr "O URL base para o registro de mudanças do repositório (padrão: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" msgstr "O diretório para escrever o espelho para" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" msgstr "O arquivo a ser incluído no repositório (caminho ou glob)" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." msgstr "A impressão digital do repositório não corresponde." #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" msgstr "O diretório raiz para local_copy_dir \"{path}\" não existe!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" msgstr "Há uma colisão do keyalias - publicação parada" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." msgstr "Estas são as aplicações que foram arquivadas a partir do repositório principal." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Este é um repositório de aplicativos a serem usados com o F-Droid. Os aplicativos neste repositório são binários oficiais compilados pelos desenvolvedores do aplicativo original ou são binários compilados a partir da fonte por f-droid.org usando as ferramentas em https://gitlab.com/fdroid." #: ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Este repositório já tem metadados locais: %s" #: ../fdroidserver/init.py #, python-format msgid "" "To complete the setup, add your APKs to \"%s\"\n" "then run \"fdroid update -c; fdroid update\". You might also want to edit\n" "\"config.yml\" to set the URL, repo name, and more. You should also set up\n" "a signing key (a temporary one might have been automatically generated).\n" "\n" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" "Para concluir a configuração, adicione seus APKs a \"%s\"\n" "em seguida, execute \"fdroid update -c; atualização do fdroid\". Você também pode querer editar\n" "\"config.yml\" para definir o URL, o nome do repositório e muito mais. Você também deve configurar\n" "uma chave de assinatura (uma temporária pode ter sido gerada automaticamente).\n" "\n" "Para mais informações: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "e https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "A URL deve começar com https:// ou http://" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" msgstr "Encurtadores de URL não devem ser usados" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" msgstr "Há o URL {url} na descrição: {error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" msgstr "A etiqueta da licença foi inesperada \"{}\"! Use apenas etiquetas FSF ou OSI a partir do https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "A etiqueta da licença foi inesperada \"{}\"! Use apenas as etiquetas configuradas no seu arquivo de configuração" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" msgstr "Destino de symlink inesperado: {link} -> {target}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" msgstr "Entrada desconhecida {key} em {configname}" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Exceção desconhecida encontrada!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" msgstr "Arquivo desconhecido '{filename}' na compilação '{versionName}'" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" msgstr "Formato de metadados desconhecido: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" msgstr "O formato dos metadados é desconhecido: {path} (use: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " msgstr "Versão desconhecida do aapt, pode causar problemas: " #: ../fdroidserver/lint.py msgid "Unnecessary leading space" msgstr "Espaço desnecessário à frente" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" msgstr "Espaço desnecessário ao fim" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" msgstr "O campo '{fieldname}' não foi reconhecido em '{path}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "O sinalizador de construção '{build_flag}' desconhecido em '{path}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" msgstr "Tipo de arquivo \"{extension}\" não suportado para o gráfico de repo" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" msgstr "Arquivo gráfico não suportado encontrado: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" msgstr "Extlib não utilizado em %s" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" msgstr "Arquivo não utilizado em %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" msgstr "Caminho scandelete não usado: %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" msgstr "Caminho scanignore não usado: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" msgstr "Descompactando para %s" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Atualiza as informações do repositório para novos pacotes" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" msgstr "Atualiza o log de transparência de um binário para um URL" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData tem URL inválido: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" msgstr "UpdateCheckData deve corresponder ao código da versão como número inteiro (\\d ou [0-9]): {codeex}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" msgstr "UpdateCheckData deve usar um URL HTTPS: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData não é uma URL válida: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não foi executado" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName (atualização da verificação do nome) é definido como o ID comun do app - pode ser removido" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" msgstr "Enviando o {apkfilename} para o androidobservatory.org" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" msgstr "Enviando o {apkfilename} para o virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "Usage" msgstr "Uso" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Uso: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Use /HEAD em vez de /master para apontar em um arquivo na ramificação predefinida" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Use ' fdroid update -c ' para criá-lo." #: ../fdroidserver/build.py msgid "Use build server" msgstr "Usar servidor de compilação" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" msgstr "Usar a data do APK ao invés do horário atual para APKs recentemente adicionados" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." msgstr "Usando \"{path}\" para configurar s3cmd." #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "Usando a Assinatura APK v2" #: ../fdroidserver/common.py msgid "Using APK Signature v3" msgstr "Usando a Assinatura APK v3" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Usando o jarsigner de Java, não recomendado para verificar APKs! Use apksigner" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" msgstr "Usando androguard de \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" msgstr "Usando um dicionário em branco em vez do conteúdo de {path}!" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" msgstr "Utilizando armazenamento de chave existente \"{path}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" msgstr "Usando s3cmd para sincronizar com: {url}" #: ../fdroidserver/__main__.py msgid "Valid commands are:" msgstr "Os comandos válidos são:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." msgstr "Verifique a cópia em cache local em vez de redescarregando." #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" msgstr "Verifica a integridade dos pacotes baixados" #: ../fdroidserver/index.py msgid "Verifying index signature:" msgstr "Verificar o índice de assinatura:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "A chave API do VirusTotal não pode carregar arquivos maiores que 32MB, utilize {url} para enviar para {path}." #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Avisa sobre possíveis erros de metadados" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Quando configurado para índices assinados, crie apenas índices não assinados nesta etapa" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "Ao cotar todo o repositório, o yamllint é desativado por padrão. Independente de qualquer coisa esta opção impõem o uso do yamllint." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distiguished Name' usado na geração de chaves" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" msgstr "Você pode usar ANDROID_HOME para definir o caminho para o seu SDK, ou seja:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" msgstr "Arquivo ZIP" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" msgstr "adicionando IdentityFile a {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" msgstr "adicionando a {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opção ambígua: %(option)s pode corresponder a %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "opção ambígua: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner não encontrado! Não é possível assinar ou verificar APKs modernos" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "o apksigner não foi encontrado, ele é necessário para assinar!" #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "ID de aplicação do arquivo para operar" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationId com versionCode opcional na forma APPID[:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" msgstr "archive_url precisa terminar com /archive" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "argumento \"-\" com o modo %r" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" msgstr "argumento %(argument_name)s: %(message)s" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" msgstr "tentando uma conexão SSH vazia para testar a chave de implantação:" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" msgstr "não é possível analisar a especificação scrlib (não uma string): '{}'" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "não é possível abrir '%(filename)s': %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" msgstr "não é possível abrir a url não-https: '{};" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" msgstr "não é possível encontrar os srclibs necessários: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "não é possível ter vários argumentos de subparser" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "não é possível unir ações - dois grupos são denominados %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" msgstr "não é possível publicar a atualização, você definiu a chave de implantação?" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" msgstr "clonagem {url}" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" msgstr "comandos a partir dos módulos de plugin:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" msgstr "complexo" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "opção conflitante na string: %s" msgstr[1] "opções conflitantes nas strings: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser alias: %s" msgstr "alias de subanalizador conflitante: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser: %s" msgstr "subanalizador conflitante: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" msgstr "não foi possível analisar '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "não foi possível analisar a especificação srclib (referência sem especificação): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" msgstr "não foi possível analisar a especificação srclib (excesso de sinais '@'): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" msgstr "{path} criado" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" msgstr "versão atual é mais recente: old vercode={old}, new vercode={new}" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" msgstr "apagando: repo/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" msgstr "registro de processo implantado {path} para {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest = é necessário para opções como %r" #: ../fdroidserver/scanner.py msgid "downloading '{}'" msgstr "baixando '{}'" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" msgstr "o download de assinaturas de scanner de '{}' falhou" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" msgstr "binário executável, possivelmente código" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "foi previsto %s argumento" msgstr[1] "foi previsto %s argumentos" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "esperado pelo menos um argumento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "esperado um argumento no máximo" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "esperado um argumento" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--help|--version|]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" msgstr "obter a versão de assinaturas mais recente da Web" #: /usr/lib/python3.11/optparse.py msgid "floating-point" msgstr "ponto flutuante" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "Forçar os erros de metadados (padrão) para serem avisos, ou para serem ignorados." #: ../fdroidserver/common.py msgid "git svn clone failed" msgstr "git svn clone falhou" #: ../fdroidserver/scanner.py msgid "gzip file archive" msgstr "arquivo gzip" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "argumento explícito %r ignorado" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 deve ter uma assinatura, use ' fdroid signindex ' para criá-lo!" #: ../fdroidserver/index.py msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 deve ter uma assinatura, use droid signindex` para criá-la!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" msgstr "inteiro" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valor inválido do tipo %(type)s: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "opção inválida: %(value)r (escolha de %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valor conflict_resolution inválido: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "Opção cadeia %(option)r inválida: deve começar com o caractere %(prefix_chars)r" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" msgstr "ipfs_cid não encontrado, omitindo a geração de CIDv1" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" msgstr "receita de compilação mais recente é: old vercode={old}, new vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "local_copy_dir não termina com \"fdroid\", talvez você quis: \"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" msgstr "local_copy_dir deve ser um caminho absoluto!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" msgstr "local_copy_dir deve ser um diretório, não um arquivo!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" msgstr "espelho '%s' não termina com 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "argumentos mutuamente exclusivos devem ser opcional" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" msgstr "próxima atualização do cache {name} prevista para {time}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" msgstr "nenhum \"ícone\" em {appid}" #: ../fdroidserver/signatures.py msgid "no APK supplied" msgstr "nenhum APK fornecido" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" msgstr "não tem tal opção: %s" #: ../fdroidserver/__main__.py msgid "no version info found!" msgstr "não há informações de versão encontrada!" #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "nenhuma informação de versão encontrada" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "não é permitido com o argumento %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "um dos argumentos %s é necessário" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" msgstr "apenas aceita cadeias, listas e tuplos" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "opção %s: se você realmente deseja instalar todas as apps assinadas, use --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "Opção %s: valor %s inválido: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "opção %s: escolha inválida: %r (escolha entre %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" msgstr "opção -%s não reconhecida" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" msgstr "a opção -%s necessita de argumento" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "opção --%s não pode ter argumento" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "opção --%s não é prefixo único" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" msgstr "opção --%s não reconhecida" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s requires argument" msgstr "opção --%s necessita argumento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "argumentos opcionais" #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "opções" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" msgstr "sobrescrevendo {path} existente" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "argumentos posicionais" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" msgstr "houve uma falha no registro de processo implantação {path} para {dest}!" #: ../fdroidserver/build.py msgid "reference binary missing signature" msgstr "falta assinatura no binário de referência" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" msgstr "Recuse o download inseguro via conexão HTTP (use HTTPS ou especifique --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." msgstr "repo_icon \"repo/icons/%s\" não existe, gerando um espaço reservado." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" msgstr "repo_url precisa terminar com /repo" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "o ruamel.yaml não está instalado, não é possível escrever os metadados." #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sincroniza índices {path} para {url} e exclui" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "o cache do scanner está malformado! Você pode limpá-lo com: '{clear}'" #: ../fdroidserver/scanner.py msgid "shared library" msgstr "biblioteca compartilhada" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" msgstr "mostra o número da versão do programa e sai" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" msgstr "mostra esta mensagem de ajuda e sai" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." msgstr "APK assinado, seja um caminho de arquivo ou um URL HTTPS." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" msgstr "ignorar a implantação de logs de compilação completos: o conteúdo do log está vazio" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" msgstr "ignorar a implantação de logs de compilação completos: não habilitado na configuração" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" msgstr "ignorando o tarball de origem: {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" msgstr "Nome 'srclibs' ausente e/ou '@'" #: ../fdroidserver/scanner.py msgid "static library" msgstr "biblioteca estática" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" msgstr "o binário de referência fornecido autorizou o signatário {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "os seguintes argumentos são necessários: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "opção de cadeia de texto inesperada: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "O formato '%(parser_name)r' é desconhecido. (Opções Válidas: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "argumentos não reconhecidos: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "permissões inseguras em '{config_file}' (deveria ser 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "uso: " #: ../fdroidserver/deploy.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" msgstr "usando o Apache libcloud para sincronizar com {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "o virustotal.com está limitando a taxa, esperando para tentar novamente ..." #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" msgstr[0] "{0} apl, {1} codinome de chave" msgstr[1] "{0} apls, {1} codinome de chaves" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) não tem metadados!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" msgstr "{apkfilename} tem vários arquivos {name} que, parece explorar a Master Key!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "AndroidManifest.xml do {apkfilename} tem uma data má: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} não tem um nome! Usando o ID do applicativo em vez disso." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" msgstr "O {appid} do {path} não é um ID de aplicativo Android válido!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "O {appid} do {path} não é um Nome de Pacote Java válido!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" msgstr "{appid} tem APKs e arquivos: {files}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" msgstr "{appid} tem falta de {name}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" msgstr "{appid}: extlib {path} desconhecido na compilação '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" msgstr "{appid}: nenhuma compilação especificada, em execução no estado de origem atual" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" msgstr "O {appid}: {field} deve ser um '{type}', porém é um '{fieldtype}!'" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" msgstr "O {appid}: {field} deve ser um '{type}', porém é um '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} deve ser um número inteiro, encontrado: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be list or string, found: {value}" msgstr "{build_flag} deve ser uma lista ou uma cadeia de caracteres, encontrado: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" msgstr "o {file} está vazio ou está corrompido!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" não existe! Corrija-o no \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} foi descontinuado, use {newfile}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "o {path} já existe, ignorando os resultados de importação!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" msgstr "{path} não existe! Crie-o executando:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} tem uma má assinatura de arquivo \"{pattern}\", um exploração Janus é possível!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" msgstr "{path} tem um tamanho de zero!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" msgstr "o {path} tem mais de 200MB, upload manual: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" msgstr "Falha ao copiar {path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} não termina com \"fdroid\", verifique o caminho na URL!" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "a {url} não começa com \"http\"!" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" msgstr[0] "{} compilação falhou" msgstr[1] "{} compilações falharam" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} compilação foi bem sucedida" msgstr[1] "{} compilações foram bem sucedidas" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/locale/pt_PT/0000755000175000017500000000000014620351546015275 5ustar00hanshans././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.888382 fdroidserver-2.3a1/locale/pt_PT/LC_MESSAGES/0000755000175000017500000000000014620351546017062 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/locale/pt_PT/LC_MESSAGES/fdroidserver.po0000644000175000017500000027212714620351225022125 0ustar00hanshans# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Manuela Silva , 2020. # ssantos , 2020, 2021, 2022, 2023. # Hans-Christoph Steiner , 2020, 2022. # Peter J. Mello , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2023-07-02 15:51+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese (Portugal) \n" "Language: pt_PT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 5.0-dev\n" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" "\n" "Chave pública SSH a ser usada como chave de implantação:" #: ../fdroidserver/nightly.py #, python-brace-format msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" "\n" "{path} codificado para a variável secreta DEBUG_KEYSTORE:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" não tem ficheiro de metadados correspondente!" #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" msgstr "O diretório raiz para \"local_copy_dir\" {path} não existe!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "'{apkfilename}' já está instalado no {dev}." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" msgstr "\"{path}\" contém {name} ({version}) desatualizado" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" msgstr "\"{path}\" contém {name} ({version}) recente" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" msgstr "\"{path}\" existe, mas s3cmd não está instalado!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" msgstr "\"{path}\" não é um formato de ficheiro aceito (use: metadata/*.yml)" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "\"{path}\" é assinado por uma chave que não é permitida:" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" não é uma URL válida!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" msgstr[0] "A opção %(option)s requer o argumento %(number)d" msgstr[1] "A opção %(option)s requer os argumentos %(number)d" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: erro: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" msgstr "%d problemas encontrados" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "%prog [options]" msgstr "%prog [opções]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" msgstr "%r não pode ser invocado" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" msgstr "%s não produziu um dict!" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" msgstr "%s tem um SHA-256 ruim: %s" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" msgstr "%s não é um campo criado aceito" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" msgstr "opção %s não leva um valor" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' não foi encontrada em config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "\"keystore\" é NONE e \"smartcardoptions\" está vazio!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "'keystore' não encontrada em config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' não encontrada em config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' não encontrada em config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' é um argumento inválido para posicionadores" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" msgstr "'sdk_path' não definido em 'config.yml'!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' é muito antigo, fdroid requer build-tools-{version} ou mais recente!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" msgstr "'{field}' será em ordem aleatória! Use () ou [] se a ordem for importante!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" msgstr "'{path}' falhou ao executar!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' tem um formato inválido, deve ser um dicionário!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' não é um {field} válido em {appid}. Modelo regex: {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' não é um {field} válido, deve ser {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" msgstr "...checkupdate falhou para {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() não definida" #: ../fdroidserver/lint.py msgid "/issues is missing" msgstr "está faltando o /issues" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" msgstr "Uma URL é necessária como um argumento!" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Adicione assinaturas PGP usando GnuPG para os pacotes no repositório" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" msgstr "Adicionar uma chave de assinatura para um repositório não assinado" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" msgstr "Adicionar ficheiros de metadados de esqueleto para APKs que estão faltando-lhes" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" msgstr "Adicionando novo repositório para apenas {name}" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" msgstr "Alias (apelido) da chave de assinatura do repositório na keystore" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" msgstr "AllowedAPKSigningKeys está ausente, mas o binário de referência foi fornecido" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Permite que uma revisão diferente (ou árvore do git) seja especificada para a importação inicial" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" msgstr "Também espelhar o ficheiro completo da secção" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" msgstr "Também avisar sobre problemas de formatação, como rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" msgstr "Biblioteca AAR do Android" #: ../fdroidserver/scanner.py msgid "Android APK file" msgstr "Ficheiro APK do Android" #: ../fdroidserver/scanner.py msgid "Android DEX code" msgstr "Código DEX do Android" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" msgstr "O SDK do Android não foi encontrado em {path}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" msgstr "O caminho do SDK Android '{path}' não existe!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" msgstr "O caminho do SDK Android '{path}' não é um diretório!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" msgstr "A ferramenta SDK do Android {cmd} não foi encontrada!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "A app tem binários, mas não tem AllowedAPKSigningKeys correspondentes para fixar o certificado." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "A app tem NoSourceSince ou ArchivePolicy \"0 versões\", mas AutoUpdateMode ou UpdateCheckMode não são Nenhum" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" msgstr "A App está em '{repo}' mas tem uma hiperligação para {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "A versão da app tem um binário, mas não tem as AllowedAPKSigningKeys correspondentes para fixar o certificado." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Acrescentar .git não é necessário" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" msgstr "Arquivamento {apkfilename} com assinatura inválida!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode com UpdateCheckMode: HTTP deve ter um modelo." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" msgstr "Tipo de entrada \"{mirrortype}\" incorreto na configuração de espelhos: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "URL base para espelhar, pode incluir a chave de assinatura de índice usando a string de consulta:? Fingerprint =" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" msgstr "Filial '{branch} 1' usada como commit no build '{versionName} 2'" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" msgstr "Ramificação '{branch}' usado como commit em srclib '{srclib}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" msgstr "Ligação simbólica quebrada: {path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" msgstr "Construir pacote através da fonte" #: ../fdroidserver/build.py msgid "Build all applications available" msgstr "Compilar todos as aplicações disponíveis" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" msgstr "Compilação gerada por `fdroid import` - remove a linha de desativação quando estiver pronto" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" msgstr "Construir metadados git repo não tem mudanças comprometidas!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" msgstr "Compilar apenas a última versão de cada pacote" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" msgstr "Repo construído baseado em \"%s\" com esta configuração:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" msgstr "Não é possível atualizar a app automaticamente sem CurrentVersionCode" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "Não é possível construir devido a erro {} durante a digitalização" msgstr[1] "Não é possível construir devido a erros {} durante a digitalização" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" msgstr "Não é possível reescrever \"{path}\"" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "As categorias '%s' não são válidas" #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "As categorias não são definidas" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Verificação de actualizações das aplicações" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "A verificar o arquivamento para {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Atualização limpa - não usa cache, reprocessa todos os APKs" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Lista de categorias separadas por vírgula." #: ../fdroidserver/__main__.py #, python-format msgid "Command '%s' not recognised.\n" msgstr "Comando '%s' não reconhecido.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" msgstr "Enviar mudanças" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" msgstr "Definições conflitantes de \"{field}\" entre arquivos .yml e localizados:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argumentos conflitantes: \"--verbose\" e \"--quiet\" não podem ser especificados ao mesmo tempo." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" msgstr "Ficheiros de configuração conflitantes! Usando {newfile}, ignorando {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "Não foi possível encontrar '{command}' no seu sistema" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Não foi possível encontrar o código de versão mais recente" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Não foi possível encontrar o nome da versão mais recente" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" msgstr "Não foi possível localizar {path} para removê-lo" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " msgstr "Não foi possível abrir o APK {path} para análise: " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Não foi possível analisar o tamanho \"{size}\", tipo \"{type}\" incorreto" #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Não foi possível encontrar o ID da aplicação" #: ../fdroidserver/checkupdates.py msgid "Couldn't find any version information" msgstr "Não foi encontrada qualquer informação da versão" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "Não foi possível encontrar o ID do pacote" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" msgstr "Cobardemente recusando substituir a configuração da chave de assinatura existente!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" msgstr "Novo contentor criado: \"{name}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Criando \"{path}\" para configurar s3cmd." #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Criando o diretório de log" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" msgstr "Criando novo bucket S3: {url}" #: ../fdroidserver/publish.py msgid "Creating output directory" msgstr "Criando diretório de output" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" msgstr "Criando índice assinado com esta chave (SHA256):" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" msgstr "Criando diretório temporário" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" msgstr "Criação de índice não assinado em preparação para assinatura" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" msgstr "CurrentVersionCode {cv} é menor que a entrada mais antiga de build {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" msgstr "DEBUG_KEYSTORE não está definido ou o valor está incompleto" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" msgstr "Eliminação de APK'S e/ou OBBs que não contêm metadados do repositório" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" msgstr "Apagar ficheiro, o reporte é muito grande ({size} max {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" msgstr "Apagar o histórico do git-mirror, o repo é muito grande ({size} max {limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" msgstr "Apagando o ficheiro desconhecido: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" msgstr "Descrição '%s' é apenas o resumo da app" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" msgstr "A descrição tem uma linha duplicada" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" msgstr "A descrição tem a lista (%s), mas não tem marcadores (*), nem é numerada (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" msgstr "A descrição de comprimento {length} é sobre o limite de char {limit}" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Não adicionar 'disable:' às entradas de compilação geradas" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" msgstr "Não implante os novos ficheiros no repositório" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" msgstr "Não incluir \"{path}\" no URL!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" msgstr "Não solicitar o caminho do Android SDK, apenas falhe" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" msgstr "Não remover as chaves privadas geradas do keystore" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" msgstr "Não criar um tarball da fonte; útil quando testando uma compilação" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" msgstr "Não atualizar o repositório; útil quando testando uma compilação sem conexão com a internet" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" msgstr "Não usar as somas de verificação (checksums) do rsync" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Descarregar espelhos completos de repos pequenos" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" msgstr "A descarregar %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "O descarregamento do repositório já falhou uma vez, não tento novamente." #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" msgstr "Descarregar {url} falhou. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" msgstr "A declaração duplicada da característica indesejada em {path} foi ignorada!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" msgstr "Entrada \"%s\" duplicada na configuração de espelhos!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" msgstr "Ligação duplicada em '{field}': {url}" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ERRO: o subcomando \"server\" foi removido, use \"deploy\"!" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" "ERRO: este comando nunca deve ser usado para espelhar f-Droid.org!\n" "Um espelho completo de f-Droid.org requer mais de 200GB." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERRO: tipo de CI sem suporte, patches são bem-vindos!" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "ERRO: host de git \"%s\" não suportado, patches são bem-vindos!" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." msgstr "A codificação está definida como '{enc}' fdroid pode ter problemas de codificação. Por favor, configure-o para 'UTF-8' para obter melhores resultados." #: ../fdroidserver/init.py #, python-format msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" "Digite o caminho para o SDK do Android (%s) aqui:\n" "> " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" msgstr "A variável de ambiente {var} de {configname} não está definida!" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Erro ao obter o endereço do repo" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" msgstr "Sair com um código diferente de zero se problemas forem encontrados" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Extrair metadados de aplicações de um repositório de origem" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Extrato de assinaturas de APKs" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" msgstr "Falha ao copiar {path}: {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" msgstr "Falha ao buscar assinaturas para '{apkfilename}': {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" msgstr "Falha de leitura {path}: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" msgstr "Falha ao redimensionar {path}: {error}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" msgstr "Falha ao criar o bucket S3: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" msgstr "Falha ao obter informações do APK, apagando {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" msgstr "Falha ao obter informações do APK, ignorando {path}" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" msgstr "Falha ao obter a impressão digital da chave de assinatura do APK" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" msgstr "Falha ao instalar '{apkfilename}' em {dev}: {error}" #: ../fdroidserver/common.py msgid "Failed to sign application" msgstr "Falha ao assinar a app" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" msgstr "Buildserverid obtido da VM: {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" msgstr "Assinaturas obtidas para '{apkfilename}'-> '{sigdir}'" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" msgstr "O ficheiro desapareceu enquanto era processado: {path}" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py #: ../fdroidserver/update.py msgid "Finished" msgstr "Terminado" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" msgstr "Os métodos de doação do Flattr pertencem no campo FlattrID:" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Tags HTML proibidos" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." msgstr "Forçar a compilação de apps desativados e continuar independentemente de problemas de escaneamento. Apenas permitido no modo de teste." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" msgstr "Forçar suspender a construção depois de esperar {0} segundos!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." msgstr "Forçar a análise de apps e construções desativados." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" msgstr "\"{path}\" gráfico encontrado sem metadados para o app \"{name}\"!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "Ficheiro de financiamento ruim \"{path}\" encontrado para \"{name}\":" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" msgstr "appids inválidos encontrados em argumentos" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "versionCodes inválidos encontrados para algumas apps" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Vários ficheiros de blocos de assinaturas JAR foram encontrados em {path}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" msgstr "Encontrados vários ficheiros de metadados para {appid}" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." msgstr "Vários certificados de assinatura encontrados para o repositório." #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." msgstr "Nenhum certificado de assinatura para repositório encontrado." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" msgstr "Não-ficheiro encontrado em %s" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" msgstr "{apkfilename} encontrado em {url}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} problems in {filename}" msgstr "{count} problemas encontrados em {filename}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" msgstr "{count} avisos encontrados em {filename}" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" msgstr "Gerado esqueleto de metadados para {appid}" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" msgstr "Git checkout de '%s' falhou" #: ../fdroidserver/common.py msgid "Git clean failed" msgstr "Git clean falhou" #: ../fdroidserver/common.py msgid "Git fetch failed" msgstr "Git fetch falhou" #: ../fdroidserver/common.py msgid "Git prune failed" msgstr "Git prune falhou" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Git remote set-head falhou: \"%s\"" #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Git reset falhou" #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Git submodule sync falhou" #: ../fdroidserver/common.py msgid "Git submodule update failed" msgstr "Git submodule update falhou" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" msgstr "HTTPS deve ser usado nos URLs do Subversion!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" msgstr "Se um espelho git ficar muito grande, permite que o arquivo seja apagado" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" msgstr "Se esse envio falhar, tente enviar manualmente para {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." msgstr "A ignorar '{field}' em metadados '{metapath}' porque é depreciado." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "A ignorar a entrada FUNDING.yml por mais de 2048: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" msgstr "A ignorar o elemento mau no manifesto: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorando o pacote sem metadados: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" msgstr "Ignorando dados de cache obsoletos para {apkfilename}" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" msgstr "Incluir APKs assinados com algoritmos desabilitados como MD5" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" msgstr "Incluir os ficheiros .asc da assinatura PGP no espelho" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" msgstr "Incluir os registos de construção no espelho" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" msgstr "Incluir os tarballs de fontes no espelho" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" msgstr "Incluindo metadados de %s@%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" msgstr "Incluindo metadados de {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Inicializando submódulos" #: ../fdroidserver/install.py msgid "Install all signed applications available" msgstr "Instalar todas as aplicações assinadas disponíveis" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" msgstr "Instalação dos pacotes compilados no aparelho" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." msgstr "A instalar %s…" #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." msgstr "A instalar '{apkfilename}' em {dev}…" #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" msgstr "Interacção com o repositório do servidor HTTP" #: ../fdroidserver/update.py msgid "Invalid APK" msgstr "APK inválido" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" msgstr "AutoUpdateMode inválido: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" msgstr "UpdateCheckMode inválido: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" msgstr "VercodeOperation inválido: {field}" #: ../fdroidserver/lint.py #, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "VercodeOperation inválido: {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "ID da aplicação {appid} inválido" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" msgstr "Booleano inválido '%s'" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Lista com marcadores inválida" #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" msgstr "Nome inválido para o ficheiro publicado: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" msgstr "Ndk inválido: entrada na compilação: \"{ndk}\"" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " msgstr "Redirecionamento inválido para não-HTTPS: {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" msgstr "Metadados de scrlib inválidos: '{file}' não existe" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" msgstr "Metadados de srclib inválidos: não foi possível analisar \"{file}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" msgstr "Metadados de srclib inválidos: chave \"{key}\" desconhecida no \"{file}\"" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" msgstr "A assinatura JAR falhou a verificação: {path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" msgstr "Assinatura JAR verificada: {path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" msgstr "Ficheiro Java JAR" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" msgstr "O Java JDK não foi encontrado! Instalar no local predefinido ou definir java_paths!" #: ../fdroidserver/scanner.py msgid "Java compiled class" msgstr "Classe Java compilada" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" msgstr "Java jarsigner não encontrado! Instale no local predefinido ou define java_paths!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" msgstr "JavaScript em atributos HTML src" #: ../fdroidserver/build.py #, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" msgstr "Mantendo a compilação com falha \"{apkfilename}\"" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Armazenamento de chaves de assinatura:\t" #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" msgstr "O último commit usado '{commit}' parece-se com uma tag, mas o UpdateCheckMode (modo de verificação de atualização) é '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" msgstr "Os métodos de doação de Liberapay pertencem no campo Liberapay:" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted (dry run)" msgstr "Listar ficheiros que devem ser reformatados (execução a seco)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "Locale incluído no URL do f-droid.org" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" msgstr "Fazer a compilação parar se encontrar exceções" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." msgstr "Espelhos de repositório malformados." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" msgstr "Linha de serverwebroot malformada:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" msgstr "Profundidade máxima de recursão no ficheiro ZIP atingida: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Espelha todo o repositório e pacotes, todos os tipos de ficheiros." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" msgstr "Falta diretório de saída" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" msgstr "A mover as declarações de características indesejadas para ficheiros localizados:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "Nem \"repo_pubkey\" nem \"keystorepass\" definidos em config.yml" #: ../fdroidserver/verify.py #, python-format msgid "No APK for package: %s" msgstr "Nenhum APK para o pacote: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Android SDK não encontrado!" #: ../fdroidserver/install.py msgid "No attached devices found" msgstr "Nenhum aparelho anexado encontrado" #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Nenhuma impressão digital no URL." #: ../fdroidserver/common.py msgid "No git submodules available" msgstr "Não há submódulos git disponíveis" #: ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "Não foi possível encontrar nenhum projeto de gradle. Especificar --subdir?" #: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Nenhuma informação encontrada." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" msgstr "Não foram encontradas marcações correspondentes" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." msgstr "Nenhuma versão mínima do SDK encontrada em {0}, a usar a predefinição (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Não há necessidade de especificar que o app é software livre" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" msgstr "Não há necessidade de especificar que o app é para Android" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "Sem opção definida! Edite seu config.yml para definir pelo menos um destes:" #: ../fdroidserver/common.py msgid "No packages specified" msgstr "Nenhum pacote especificado" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" msgstr "Nenhum APK assinado disponível para %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" msgstr "Nenhum diretório de saída assinado - nada a fazer" #: ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" msgstr "Nenhum certificado de assinatura encontrado em {path}" #: ../fdroidserver/common.py #, python-format msgid "No such package: %s" msgstr "Nenhum pacote desses: %s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" msgstr "Nenhum versionCode {versionCode} para o app {appid}" #: ../fdroidserver/checkupdates.py msgid "No tags found" msgstr "Nenhuma etiqueta encontrada" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" msgstr "Nenhum diretório não assinado - nada a fazer" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Não é uma definição de tamanho válida: \"{}\"" #: ../fdroidserver/signindex.py msgid "Nothing to do" msgstr "Nada para fazer" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." msgstr "Nada a fazer para {appid}." #: ../fdroidserver/init.py msgid "Now set these in config.yml:" msgstr "Agora configure estes em config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" msgstr "OBB tem versionCode ({integer}) mais recente que qualquer APK:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" msgstr "O nome do ficheiro OBB deve começar com \"main.\" ou \"patch.\":" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" msgstr "O packagename do OBB não corresponde a um APK suportado:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "A máquina está offline, a saltar a geração de espelhos de git até o `fdroid deploy'" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Somente PNG e JPEG são suportados para gráficos, encontrado: {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Apenas mostrar diferenças com a Play Store" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Processar apenas apps com atualizações automáticas" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Os métodos de doação OpenCollective pertencem no campo OpenCollective:" #: /usr/lib/python3.11/optparse.py msgid "Options" msgstr "Opções" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Saída de relatório JSON para ficheiro nomeado após APK." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." msgstr "Saída de JSON para stdout." #: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py #: ../fdroidserver/publish.py ../fdroidserver/signindex.py #: ../fdroidserver/update.py msgid "Outputting JSON" msgstr "Saída do JSON" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Licença geral do projeto." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Substituindo versionName em branco em {apkfilename} dos metadados: {version}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "O pacote \"{appid}\" já existe" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" msgstr "Analisando o manifesto em '{path}'" #: ../fdroidserver/common.py msgid "Password required with username" msgstr "Palavra-passe necessária com o nome de utilizador" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "Caminho para o subdiretório principal do projeto Android, se não estiver na raiz." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" msgstr "Caminho até o Android SDK (algumas vezes definido em ANDROID_HOME)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" msgstr "Caminho para o repositório git para usar como log" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" msgstr "Caminho até a keystore para a chave de assinatura do repositório" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Imprimir a variável secreta para o terminal para copiar/colar fácilmente" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" msgstr "Problema com o ficheiro ZIP: %s, erro %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" msgstr "Problema com xml em '{path}'" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" msgstr "Processar atualizações automáticas" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" msgstr "A processar {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" msgstr "A processar {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" msgstr "Produzir XML/JSON legível por humanos para ficheiros de índice" #: ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "URL do projeto para importar." #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" msgstr "A pontuação deve ser evitada" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" msgstr "Submeter o registo de eventos para este repositório git remoto" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing binary transparency log to {url}" msgstr "A submeter o registo de transparência de binário para {url}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" msgstr "A submeter para {url}" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" msgstr "Criar rapidamente um novo repositório" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" msgstr "Ler todos os ficheiros de metadados e sair" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" msgstr "A ler '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" msgstr "A leitura de packageName/versionCode/versionName falhou, APK inválido: '{apkfilename}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" msgstr "Falha ao ler packageName/versionCode/versionName, APK inválido: '{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" msgstr "Lendo {apkfilename} do cache" #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Apagando ficheiros especificados" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" msgstr "A remover {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Renomear todos os ficheiros APKs que não correspondem com package.name_123.apk" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" msgstr "O modo de atualização repoTrunk só faz sentido em repositórios de git-svn" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." msgstr "Redefinir e criar um novo servidor de compilação, mesmo que o existente parecer normal." #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" msgstr "Renunciando {apkfilename} com debug.keystore fornecido" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" msgstr "Redimensionar todos os ícones que excedam o tamanho máximo de pixels e sair" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" msgstr "Restringir a saída a erros e avisos" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Regravar todos os ficheiros de metadados" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" msgstr "Reescrevendo '{appid}'" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" msgstr "Executar no repo git que tem alterações não confirmadas" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Executar rewritemeta para corrigir a formatação" #: ../fdroidserver/deploy.py msgid "Running first pass with MD5 checking disabled" msgstr "Executando a primeira passagem com a verificação de MD5 desativada" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" msgstr "Executando o wget em {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" msgstr "O SHA-256 de {url} não corresponde à entrada!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Procure no(s) APK(s) resultante(s) por classes conhecidas não livres." #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" msgstr "Analisar o código fonte de um pacote" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {apk}" msgstr "O scanner encontrou {count} problemas em {apk}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" msgstr "O scanner encontrou {count} problemas em {appid}:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" msgstr "O scanner encontrou {count} problemas em {appid}:{versionCode}:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "Scanner encontrou {} problema" msgstr[1] "Scanner encontrou {} problemas" #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "A verificar o APK com dexdump por classes não-livres conhecidas." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" msgstr "Definir NDK {release} ({version}) para cima" #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Configurar o relógio para esse tempo usando:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" msgstr "Definir o máximo de lançamentos no repo antes que os mais antigos sejam arquivados" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" msgstr "Definir o limite de ficheiros abertos para {integer}" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" msgstr "Configurar uma compilação de app para um repositório de compilação noturno" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " msgstr "Falha ao definir o limite de ficheiros abertos: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" msgstr "Definindo o tempo limite de {0} seg para esta compilação" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Assinar e pôr os pacotes no repositório" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" msgstr "Assinar os índices criados com o uso de update --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" msgstr "Pular o escaneamento do código-fonte atrás de binários e outros problemas" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Ignorando '{apkfilename}' com uma assinatura inválida!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" msgstr "A ignorar o espelho do GitLab Pages pelo repositório ser muito grande (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" msgstr "Ignorando a geração de índices para {appid}" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" msgstr "Ignorando '{apkfilename}' com uma assinatura inválida!" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" msgstr "Ignorando {appid}: desativado" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" msgstr "Especifique uma pasta local para ser sincronizada com o repositório" #: ../fdroidserver/deploy.py msgid "Specify an identity file to provide to SSH for rsyncing" msgstr "Especifique um ficheiro identidade para fornecer ao SSH para usar o rsync" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." msgstr "Especifique o ficheiro de armazenamento de chaves de depuração." #: ../fdroidserver/common.py msgid "Spew out even more information than normal" msgstr "Mostrar ainda mais informações que o normal" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" msgstr "Esvaziar a assinatura misteriosa de {apkfilename}" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" msgstr "O resumo '%s' é apenas o nome do app" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" msgstr "A descrição de comprimento {length} é sobre o limite de charácteres {limit}" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" msgstr "O relógio do sistema é mais antigo que a data em {path}!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" msgstr "O modo de atualização de marcações só funciona atualmente para repositórios git, hg, bzr e git-svn" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "Modo de atualização de marcações usado no git-svn, mas a repo não foi configurada com marcações" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Modo de teste - coloque a saída apenas no diretório tmp e sempre compile, mesmo que a saída já exista." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" msgstr "O código de versão OBB deve estar após \"{name}.\":" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" msgstr "O URL base para o registro de mudanças do repositório (predefinição: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" msgstr "O diretório para onde escrever o espelho" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" msgstr "O ficherio a ser incluído no repo (caminho ou glob)" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." msgstr "A impressão digital do repositório não corresponde." #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" msgstr "O diretório raiz para local_copy_dir \"{path}\" não existe!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" msgstr "Há uma colisão do keyalias - publicação parada" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." msgstr "Estas são as aplicações que foram arquivadas do repositório principal." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Este é um repositório de apps a serem usados com o F-Droid. Aplicações neste repositório são binários oficiais compilados pelos programadores da aplicação original ou são binários compilados da fonte por f-droid.org a usar as ferramentas em https://gitlab.com/fdroid." #: ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Este repositório já tem metadados locais: %s" #: ../fdroidserver/init.py #, python-format msgid "" "To complete the setup, add your APKs to \"%s\"\n" "then run \"fdroid update -c; fdroid update\". You might also want to edit\n" "\"config.yml\" to set the URL, repo name, and more. You should also set up\n" "a signing key (a temporary one might have been automatically generated).\n" "\n" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" "Para completar a configuração, adicione os seus APKs ao \"%s\",\n" "depois execute \"fdroid update -c; fdroid update\". Também pode editar\n" "\"config.yml\" para definir a URL, nome do repo, e muito mais. Também deve configurar\n" "uma chave de assinatura (uma chave temporária pode ter sido gerada automaticamente).\n" "\n" "Para mais informações: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "e https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "A URL deve começar com https:// ou http://" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" msgstr "Encurtadores de URL não devem ser usados" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" msgstr "Há o URL {url} na descrição: {error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" msgstr "Etiqueta de licença \"{}\" inesperada! Use somente as etiquetas aprovadas pela FSF ou OSI de https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Etiqueta de licença \"{}\" inesperada! Use somente as etiquetas de licença configuradas no seu ficheiro de configuração" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" msgstr "Alvo symlink inesperado: {link} -> {target}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" msgstr "Entrada {key} desconhecida em {configname}" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Exceção desconhecida!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" msgstr "Ficheiro desconhecido '{filename}' na compilação '{versionName}'" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" msgstr "Formato de metadados desconhecido: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" msgstr "O formato de metadados é desconhecido: {path} (use: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " msgstr "Versão desconhecida do aapt, pode causar problemas: " #: ../fdroidserver/lint.py msgid "Unnecessary leading space" msgstr "Espaço desnecessário à frente" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" msgstr "Espaço desnecessário ao fim" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" msgstr "Campo de aplicação '{fieldname}' não reconhecido em '{path}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Bandeira de compilação '{build_flag}' não reconhecida em '{path}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" msgstr "Tipo de ficheiro \"{extension}\" não suportado para o gráfico de repo" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" msgstr "Ficheiro gráfico não suportado encontrado: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" msgstr "Extlib não utilizado em %s" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" msgstr "Ficheiro não utilizado em %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" msgstr "O caminho de scandelete não é usado: %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" msgstr "O caminho de scanignore não é usado: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" msgstr "A descompactar para %s" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Atualizar a informação do repositório para novos pacotes" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" msgstr "Atualizar o registo de transparência de binário para um URL" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData tem URL inválido: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" msgstr "UpdateCheckData deve corresponder ao código da versão como inteiro (\\d ou [0-9]): {codeex}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" msgstr "UpdateCheckData deve usar um URL HTTPS: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData não é uma URL válida: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não foi executado" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName (o nome da verificação de atualização) é definido como o ID comun da aplicação - pode ser removido" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" msgstr "A enviar {apkfilename} ao androidobservatory.org" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" msgstr "A enviar {apkfilename} ao virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "Usage" msgstr "Utilização" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Utilização: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Use /HEAD em vez de /master para apontar num ficheiro na ramificação predefinida" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Use ' fdroid update -c ' para criá-lo." #: ../fdroidserver/build.py msgid "Use build server" msgstr "Usar servidor de compilação" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" msgstr "Use da data do APK em vez do tempo atual para APKs recém-adicionados" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." msgstr "Usando \"{path}\" para configurar s3cmd." #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "A usar a assinatura APK v2" #: ../fdroidserver/common.py msgid "Using APK Signature v3" msgstr "A usar a assinatura APK v3" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Usando o jarsigner de Java, não recomendado para verificar APKs! Use apksigner" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" msgstr "Usando androguard de \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" msgstr "A utilizar um dicionário em branco em vez do conteúdo de {path}!" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" msgstr "Utilizando armazenamento de chave existente \"{path}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" msgstr "Usando s3cmd para sincronizar com: {url}" #: ../fdroidserver/__main__.py msgid "Valid commands are:" msgstr "Comandos válidos:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." msgstr "Verifique a cópia em cache local em vez de redescarregando." #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" msgstr "Verifique a integridade dos pacotes descarregados" #: ../fdroidserver/index.py msgid "Verifying index signature:" msgstr "Verificar o índice de assinatura:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "A chave VirusTotal API não pode enviar ficheiros maiores que 32MB, use {url} para enviar {path}." #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Avisar sobre possíveis erros de metadados" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Quando configurado para índices assinados, crie apenas índices não assinados nesta etapa" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "Ao cotar todo o repositório o yamllint é desativado por predefinição. Esta opção força o yamllint independentemente." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distiguished Name' usado na geração de chaves" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" msgstr "Pode usar ANDROID_HOME para definir o caminho para o seu SDK, ou seja:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" msgstr "Arquivo de ficheiros ZIP" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" msgstr "adicionando IdentityFile a {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" msgstr "adicionando a {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opção ambígua: %(option)s poderia corresponder %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "opção ambígua: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner não encontrado! Não é possível assinar ou verificar APKs modernos" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "Nenhum apksigner encontrado, é necessário para assinar!" #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "ID de aplicação do ficheiro para operar" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationID com versionCode opcional na forma APPID[:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" msgstr "archive_url precisa de terminar com /archive" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "argumento \"-\" com o modo %r" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" msgstr "argumento %(argument_name)s: %(message)s" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" msgstr "tentar a conexão nua por SSH para testar a implantação da chave:" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" msgstr "não é possível analisar as especificações do scrlib (não é uma cadeia): '{}'" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "não é possível abrir '%(filename)s': %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" msgstr "não é possível abrir o url não-https: '{};" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" msgstr "não é possível encontrar os srclibs necessários: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "não é possível ter vários argumentos de subparser" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "não é possível unir ações - dois grupos são denominados %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" msgstr "não é possível publicar a atualização, definiu a chave de implantação?" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" msgstr "clonagem {url}" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" msgstr "comandos dos módulos de plugin:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" msgstr "complexo" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "cadeia de opções conflitante: %s" msgstr[1] "cadeias de opções conflitantes: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser alias: %s" msgstr "alias de subanalisador conflitante: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser: %s" msgstr "subanalisador conflitante: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" msgstr "não foi possível analisar '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "não foi possível analisar a especificação srclib (referência não especificada): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" msgstr "não foi possível analisar a especificação srclib (demais símbolos '@'): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" msgstr "{path} criado" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" msgstr "a versão atual é mais nova: velho vercódigo={old}, novo vercódigo={new}" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" msgstr "apagando: repo/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" msgstr "registo de processo implantado {path} a {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest = é necessário para opções como %r" #: ../fdroidserver/scanner.py msgid "downloading '{}'" msgstr "a descarregar '{}'" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" msgstr "a descarga de assinaturas de scanner de '{}' falhou" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" msgstr "binário executável, possivelmente código" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "%s argumento esperado" msgstr[1] "%s argumentos esperados" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "esperado pelo menos um argumento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "esperado um argumento no máximo" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "esperado um argumento" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--help|--version|]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" msgstr "buscar a versão de assinaturas mais recente da Web" #: /usr/lib/python3.11/optparse.py msgid "floating-point" msgstr "ponto flutuante" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "Forçar os erros de metadados (padrão) para serem avisos, ou para serem ignorados." #: ../fdroidserver/common.py msgid "git svn clone failed" msgstr "git svn clone falhou" #: ../fdroidserver/scanner.py msgid "gzip file archive" msgstr "arquivo de ficheiros gzip" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "argumento explícito %r ignorado" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 deve ter uma assinatura, use ' fdroid signindex ' para criá-lo!" #: ../fdroidserver/index.py msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 deve ter uma assinatura, use droid signindex` para o criar!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" msgstr "inteiro" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valor inválido do tipo %(type)s: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "opção inválida: %(value)r (escolha de %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valor conflict_resolution inválido: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "Opção cadeia %(option)r inválida: deve começar com o caractere %(prefix_chars)r" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" msgstr "ipfs_cid não encontrado, a ignorar a geração de CIDv1" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" msgstr "a última receita de construção é mais recente: velho vercódigo={old}, novo vercódigo={new}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "local_copy_dir não termina com \"fdroid\", talvez quis: \"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" msgstr "local_copy_dir deve ser um caminho absoluto!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" msgstr "local_copy_dir deve ser directory, não um ficheiro!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" msgstr "espelho '%s' não termina com 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "argumentos mutuamente exclusivos devem ser opcional" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" msgstr "próxima atualização do cache {name} prevista para {time}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" msgstr "nenhum \"ícone\" em {appid}" #: ../fdroidserver/signatures.py msgid "no APK supplied" msgstr "nenhum APK fornecido" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" msgstr "não tem tal opção: %s" #: ../fdroidserver/__main__.py msgid "no version info found!" msgstr "não há informações de versão encontrada!" #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "não há informações de versão encontrada" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "não é permitido com o argumento %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "um dos argumentos %s é necessário" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" msgstr "apenas aceita cadeias, listas e tuplos" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "opção %s: se realmente deseja instalar todas as apps assinadas, use --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "Opção %s: valor %s inválido: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "opção %s: escolha inválida: %r (escolha entre %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" msgstr "opção -%s não reconhecida" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" msgstr "opção -%s requer um argumento" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "opção --%s não pode ter argumento" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "opção --%s não é prefixo único" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" msgstr "opção --%s não reconhecida" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s requires argument" msgstr "opção --%s necessita argumento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "argumentos opcionais" #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "opções" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" msgstr "sobrescrevendo {path} existente" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "argumentos posicionais" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" msgstr "a implementação do registo de processo {path} a {dest} falhou!" #: ../fdroidserver/build.py msgid "reference binary missing signature" msgstr "binária de referência sem assinatura" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" msgstr "Recusado o download via conexão HTTP insegura (use HTTPS ou especifique --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." msgstr "repo_icon \"repo/icons/%s\" não existe, a gerar um espaço reservado." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" msgstr "repo_url precisa de terminar com /repo" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "o ruamel.yaml não está instalado, não é possível escrever metadados." #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sincroniza índices {path} para {url} e exclui" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "o cache do scanner está malformado! Pode limpá-lo com: '{clear}'" #: ../fdroidserver/scanner.py msgid "shared library" msgstr "biblioteca compartilhada" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" msgstr "mostrar versão do programa e sair" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" msgstr "mostrar esta ajuda e sair" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." msgstr "APK assinado, seja um caminho de ficheiro ou um URL HTTPS." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" msgstr "pular a implantação de logs completos de compilação: o conteúdo do log está vazio" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" msgstr "pular a implantação de logs de criação completos: não ativado na configuração" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" msgstr "ignorando o tarball de origem: {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" msgstr "Nome 'srclibs' ausente e/ou '@'" #: ../fdroidserver/scanner.py msgid "static library" msgstr "biblioteca estática" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" msgstr "o binário de referência fornecido tem o assinante permitido {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "os seguintes argumentos são necessários: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "opção de cadeia de texto inesperada: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "O formato '%(parser_name)r' é desconhecido. (Opções Válidas: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "argumentos não reconhecidos: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "permissões inseguras em '{config_file}' (deveria ser 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "utilização: " #: ../fdroidserver/deploy.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" msgstr "usando o Apache libcloud para sincronizar com {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "o virustotal.com está a limitar a taxa, à espera para voltar a tentar..." #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" msgstr[0] "{0} app, {1} aliases chave" msgstr[1] "{0} apps, {1} aliases chave" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) não tem metadados!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" msgstr "{apkfilename} tem vários ficheiros {name} que, parece explorar a Master Key!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "AndroidManifest.xml do {apkfilename} tem uma data má: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} não tem um nome! A usar o ID da aplicação em vez disso." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" msgstr "{appid} de {path} não é um ID de aplicação Android válido!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid} do {path} não é um Nome de Pacote Java válido!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" msgstr "{appid} tem APKs e ficheiros: {files}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" msgstr "{appid} tem falta de {name}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" msgstr "{appid}: extlib {path} desconhecido na compilação '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" msgstr "{appid}: nehnuma compilação especificada, em execução no estado de origem atual" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" msgstr "{appid}: {field} deve ser um '{type}', mas é um '{fieldtype}!'" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" msgstr "{appid}: {field} deve ser um '{type}', mas é um '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} deve ser um inteiro, encontrado: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be list or string, found: {value}" msgstr "{build_flag} deve ser uma lista ou uma cadeia de caracteres, encontrado: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" msgstr "{file} está em branco ou corrompido!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" não existe! Corrija-o no \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} está obsoleto, use {newfile}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "{path} já existe, a ignorar os resultados das importações!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" msgstr "{path} não existe! Crie-o executando:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} tem uma má assinatura de ficheiro \"{pattern}\", um exploração Janus é possível!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" msgstr "{path} tem um tamanho de zero!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} mais de 200MB, enviar manualmente: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} não termina com \"fdroid\", verifique o caminho na URL!" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url} não começa com \"http\"!" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" msgstr[0] "{} compilação falhada" msgstr[1] "{} compilações falhadas" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} compilação com sucesso" msgstr[1] "{} compilações com sucesso" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/locale/ro/0000755000175000017500000000000014620351546014667 5ustar00hanshans././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.888382 fdroidserver-2.3a1/locale/ro/LC_MESSAGES/0000755000175000017500000000000014620351546016454 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/locale/ro/LC_MESSAGES/fdroidserver.po0000644000175000017500000027374414620351225021525 0ustar00hanshans# SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # Daniel Șerbănescu , 2021. # Christian Eichert , 2021. # Simona Iacob , 2021, 2022, 2023, 2024. # Licaon Kter , 2021, 2022, 2023. # Hans-Christoph Steiner , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;\n" "X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" "\n" "Cheia publică SSH care urmează să fie utilizată ca cheie de implementare:" #: ../fdroidserver/nightly.py #, python-brace-format msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" "\n" "{path} codificată pentru variabila secretă DEBUG_KEYSTORE:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" nu are un fișier de metadate corespunzător!" #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" msgstr "\"local_copy_dir\" {path} nu există!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\" este deja instalat pe {dev}." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" msgstr "\"{path}\" conține {name} ({version}) depășite" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" msgstr "\"{path}\" conține {name} recente ({version})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" msgstr "\"{path}\" există, dar s3cmd nu este instalat!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" msgstr "\"{path}\" nu este un format de fișier acceptat (utilizați: metadata/*.yml)" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "\"{path}\" este semnat de o cheie care nu este permisă:" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" nu este un URL valid!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" msgstr[0] "Opțiunea %(option)s necesită %(number)d argument" msgstr[1] "Opțiunea %(option)s necesită %(number)d argumente" msgstr[2] "Opțiunea %(option)s necesită %(number)d argumente" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: eroare: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" msgstr "%d probleme găsite" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "%prog [options]" msgstr "%prog [opțiuni]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" msgstr "%r nu este apelabil" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" msgstr "%s nu a produs un text!" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" msgstr "%s are un SHA-256 greșit: %s" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" msgstr "%s nu este un câmp de construcție acceptat" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" msgstr "Opțiunea %s nu acceptă o valoare" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' nu a fost găsit în config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' este NONE și 'smartcardoptions' este gol!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "'keystore' nu a fost găsit în config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' nu se găsește în config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' nu se găsește în config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' este un argument invalid pentru poziționale" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" msgstr "'sdk_path' nu este setat în 'config.yml'!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' este prea vechi, fdroid necesită build-tools-{version} sau mai nou!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" msgstr "'{field}' va fi în ordine aleatorie! Folosiți paranteze () sau [] dacă ordinea este importantă!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" msgstr "'{path}' nu a reușit să se execute!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' are un format invalid, ar trebui să fie un dicționar!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' nu este valid {field} în {appid}. Regex model: {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' nu este un {field} valid, ar trebui să fie {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" msgstr "...checkupdate a eșuat pentru {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() nu este definit" #: ../fdroidserver/lint.py msgid "/issues is missing" msgstr "/problemele lipsesc" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" msgstr "Un URL este necesar ca argument!" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Adăugați semnături PGP folosind GnuPG pentru pachetele din depozit" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" msgstr "Adăugați o cheie de semnare repo la un depozit nesemnat" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" msgstr "Adăugați fișiere de metadate schelet pentru APK-urile care le lipsesc" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" msgstr "Adăugarea unui nou depozit doar pentru {name}" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" msgstr "Alias al cheii de semnare repo din magazinul de chei" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" msgstr "AllowedAPKSigningKeys lipsește, dar este furnizat un binar de referință" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Permite specificarea unei revizuiri diferite (sau a unei ramuri git) pentru importul inițial" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" msgstr "De asemenea, oglindește secțiunea arhivă completă" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" msgstr "De asemenea, avertizează asupra problemelor de formatare, cum ar fi rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" msgstr "Biblioteca Android AAR" #: ../fdroidserver/scanner.py msgid "Android APK file" msgstr "Android APK fișier" #: ../fdroidserver/scanner.py msgid "Android DEX code" msgstr "Android DEX cod" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" msgstr "Android SDK nu a fost găsit la {path}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" msgstr "Calea Android SDK '{path}' nu există!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" msgstr "Calea Android SDK '{path}' nu este un director!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" msgstr "Instrumentul Android SDK {cmd} nu a fost găsit!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "Aplicația are binare, dar nu are AllowedAPKSigningKeys corespunzătoare pentru a fixa certificatul." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "App are NoSourceSince sau ArchivePolicy \"0 versions\" dar AutoUpdateMode sau UpdateCheckMode nu sunt None" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" msgstr "Aplicația se află în '{repo}', dar are un link către {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "Versiunea aplicației are o versiune binară, dar nu are AllowedAPKSigningKeys corespunzătoare pentru a fixa certificatul." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Adăugarea .git nu este necesară" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" msgstr "Arhivare {apkfilename} cu semnătură invalidă!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode cu UpdateCheckMode: HTTP trebuie să aivă un format." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" msgstr "Intrare de tip \"{mirrortype}\" greșită în configurația oglinzilor: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "URL de bază pentru oglindire, poate include cheia de semnare a indexului folosind șirul de interogare: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" msgstr "Ramificația '{branch}' utilizată ca și confirmare în construcția '{versionName}'" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" msgstr "Ramificația '{branch}' utilizată ca și commit în srclib '{srclib}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" msgstr "Legătură sym ruptă: {path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" msgstr "Construiți un pachet din sursă" #: ../fdroidserver/build.py msgid "Build all applications available" msgstr "Construiți toate aplicațiile disponibile" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" msgstr "Construire generată de `fdroid import` - eliminați linia de dezactivare odată ce este gata" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" msgstr "Depozitul git al metadatelor de construire are modificări necomandate!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" msgstr "Construiți doar cea mai recentă versiune a fiecărui pachet" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" msgstr "Construit depozit bazat în \"%s\" cu această configurație:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" msgstr "Nu se poate actualiza automat aplicația fără CurrentVersionCode" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "Nu se poate construi din cauza unei erori {} în timpul scanării" msgstr[1] "Nu se poate construi din cauza erorilor {} în timpul scanării" msgstr[2] "Nu se poate construi din cauza erorilor {} în timpul scanării" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" msgstr "Nu se poate rescrie \"{path}\"" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "Categoriile \"%s\" nu sunt valabile" #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "Categoriile nu sunt setate" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Verificați dacă există actualizări ale aplicațiilor" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Verificarea arhivării pentru {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Actualizare curată - nu folosește memoria cache, reprocesează toate APK-urile" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Lista de categorii separate prin virgulă." #: ../fdroidserver/__main__.py #, python-format msgid "Command '%s' not recognised.\n" msgstr "Comanda '%s' nerecunoscută.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" msgstr "Efectuați modificări" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" msgstr "Definiții \"{field}\" contradictorii între fișierele .yml și cele localizate:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argumente contradictorii: '--verbose' și '--quiet' nu pot fi specificate în același timp." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" msgstr "Fișiere de configurare conflictuale! Folosind {newfile}, ignorând {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "Nu a putut găsi '{command}' pe sistemul dvs" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Nu a putut găsi codul ultimei versiuni" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Nu a putut găsi numele celei mai recente versiuni" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" msgstr "Nu a putut găsi {path} pentru a-l elimina" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " msgstr "Nu s-a putut deschide APK {path} pentru analiză: " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Nu a putut analiza dimensiunea \"{size}\", tip greșit \"{type}\"" #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Nu s-a putut găsi ID-ul aplicației" #: ../fdroidserver/checkupdates.py msgid "Couldn't find any version information" msgstr "Nu am putut găsi nicio informație despre versiune" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "Nu a putut găsi ID-ul pachetului" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" msgstr "Refuzând cu lașitate să suprascrieți configurarea cheilor de semnare existente!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" msgstr "Creat un nou container \"{name}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Crearea \"{path}\" pentru configurarea s3cmd." #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Crearea directorului de jurnal" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" msgstr "Crearea unui nou recipient S3: {url}" #: ../fdroidserver/publish.py msgid "Creating output directory" msgstr "Crearea directorului de ieșire" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" msgstr "Crearea unui index semnat cu această cheie (SHA256):" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" msgstr "Crearea unui director temporar" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" msgstr "Crearea unui index nesemnat în vederea pregătirii pentru semnare" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" msgstr "CurrentVersionCode {cv} este mai mic decât cea mai veche intrare de construcție {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" msgstr "DEBUG_KEYSTORE nu este setat sau valoarea este incompletă" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" msgstr "Ștergeți APK-urile și/sau OBB-urile fără metadate din repo" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" msgstr "Ștergerea arhivei, repo este prea mare ({size} max {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" msgstr "Ștergerea istoricului git-mirror, repo este prea mare ({size} max {limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" msgstr "Ștergerea unui fișier necunoscut: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" msgstr "Descrierea \"%s\" este doar un rezumat al aplicației" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" msgstr "Descrierea are o linie duplicată" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" msgstr "Descrierea are o listă (%s), dar nu este punctată (*) și nici numerotată (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" msgstr "Descrierea lungimii {length} este peste limita {limit} limitei de caractere" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Nu adăugați \"disable:\" la intrările de construcție generate" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" msgstr "Nu distribuiți noile fișiere în repo" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" msgstr "Nu includeți \"{path}\" în URL!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" msgstr "Nu solicitați calea Android SDK, doar eșuați" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" msgstr "Nu eliminați cheile private generate din keystore" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" msgstr "Nu creați un tarball sursă, util atunci când testați o construcție" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" msgstr "Nu reîmprospătați depozitul, util atunci când testați o construcție fără conexiune la internet" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" msgstr "Nu folosiți sumele de verificare rsync" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Descărcați oglinzi complete ale depozitelor mici" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" msgstr "Descărcare %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Descărcarea depozitului a eșuat deja o dată, nu mai încerc din nou." #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" msgstr "Descărcarea {url} a eșuat. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" msgstr "Declarația duplicată Anti-Feature la {path} a fost ignorată!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" msgstr "Intrare duplicată \"%s\" în oglinzile config!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" msgstr "Legătură duplicată în \"{field}\": {url}" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ERROR: Subcomanda \"server\" a fost eliminată, utilizați \"deploy\"!" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" "ERROR: această comandă nu ar trebui să fie folosită niciodată pentru a oglindi f-droid.org!\n" "O oglindă completă a f-droid.org necesită mai mult de 200GB." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERROR: tip CI neacceptat, patch-uri binevenite!" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "EROARE: gazdă git neacceptată „%s”, corecții binevenite!" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." msgstr "Encoding este setat la '{enc}' fdroid ar putea întâmpina probleme de codificare. Vă rugăm să o setați la 'UTF-8' pentru cele mai bune rezultate." #: ../fdroidserver/init.py #, python-format msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" "Introduceți aici calea către Android SDK (%s):\n" "> " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" msgstr "Variabila de mediu {var} din {configname} nu este setată!" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Eroare la obținerea adresei repo" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" msgstr "Ieșiți cu un cod diferit de zero dacă au fost găsite probleme" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Extrageți metadatele aplicației dintr-un depozit sursă" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Extrageți semnăturile din APK-uri" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" msgstr "A eșuat copierea {path}: {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" msgstr "A eșuat preluarea semnăturilor pentru '{apkfilename}': {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" msgstr "A eșuat citirea {path}: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" msgstr "A eșuat redimensionarea {path}: {error}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" msgstr "Nu s-a reușit crearea unui recipient S3: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" msgstr "Nu a reușit să obțină informații despre APK, ștergând {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" msgstr "Nu a reușit să obțină informații despre APK, sărind peste {path}" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" msgstr "Nu a reușit să obțină amprenta digitală a cheii de semnare APK" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" msgstr "Nu s-a reușit instalarea '{apkfilename}' pe {dev}: {error}" #: ../fdroidserver/common.py msgid "Failed to sign application" msgstr "Nu a reușit să semneze aplicația" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" msgstr "A preluat buildserverid de la VM: {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" msgstr "A preluat semnăturile pentru '{apkfilename}' -> '{sigdir}'" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" msgstr "Fișierul a dispărut în timpul procesării acestuia: {path}" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py #: ../fdroidserver/update.py msgid "Finished" msgstr "Finalizat" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" msgstr "Metodele de donație Flattr fac parte din FlattrID: câmp" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Etichete HTML interzise" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." msgstr "Forțează compilarea forțată a aplicațiilor dezactivate și continuă indiferent de problemele de scanare. Este permisă numai în modul de testare." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" msgstr "Forțați oprirea construcției după {0} sec timeout!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." msgstr "Forțați scanarea aplicațiilor și construcțiilor dezactivate." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" msgstr "Am găsit graficul \"{path}\" fără metadate pentru aplicația \"{name}\"!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "Am găsit un fișier de finanțare necorespunzător \"{path}\" pentru \"{name}\":" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" msgstr "Găsit appids invalid în argumente" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "Am găsit coduri de versiune invalide pentru unele aplicații" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Am găsit mai multe fișiere JAR Signature Block în {path}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" msgstr "Am găsit mai multe fișiere de metadate pentru {appid}" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." msgstr "S-au găsit mai multe certificate de semnare pentru depozit." #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." msgstr "Nu s-au găsit certificate de semnare pentru depozit." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" msgstr "Găsit non-file la %s" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" msgstr "Am găsit {apkfilename} la {url}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} problems in {filename}" msgstr "Am găsit {count} probleme în {filename}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" msgstr "Am găsit {count} avertismente în {filename}" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" msgstr "Generarea metadatelor schelet pentru {appid}" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" msgstr "Verificarea Git a '%s' a eșuat" #: ../fdroidserver/common.py msgid "Git clean failed" msgstr "Curățarea Git a eșuat" #: ../fdroidserver/common.py msgid "Git fetch failed" msgstr "Git fetch a eșuat" #: ../fdroidserver/common.py msgid "Git prune failed" msgstr "Git plum a eșuat" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Git remote set-head a eșuat: \"%s\"" #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Resetarea Git a eșuat" #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Sincronizarea submodulelor Git a eșuat" #: ../fdroidserver/common.py msgid "Git submodule update failed" msgstr "Actualizarea submodulelor Git a eșuat" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" msgstr "HTTPS trebuie folosit cu URL-urile Subversion!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" msgstr "Dacă o oglindă git devine prea mare, permite ca arhiva să fie ștearsă" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" msgstr "Dacă această încărcare eșuează, încercați să încărcați manual la {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." msgstr "Ignorarea lui '{field}' în metadatele '{metapath}', deoarece este depășită." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "Ignorarea intrării FUNDING.yml mai lungă de 2048: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" msgstr "Ignorarea elementului greșit din manifest: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorarea pachetului fără metadate: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" msgstr "Ignorarea datelor vechi din memoria cache pentru {apkfilename}" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" msgstr "Includeți APK-uri care sunt semnate cu algoritmi dezactivați, cum ar fi MD5" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" msgstr "Includeți fișierele .asc cu semnătura PGP în oglindă" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" msgstr "Includeți jurnalele de construcție în oglindă" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" msgstr "Includeți tarball-urile sursă în oglindă" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" msgstr "Includerea metadatelor din %s@%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" msgstr "Includerea metadatelor din {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Inițializarea submodulelor" #: ../fdroidserver/install.py msgid "Install all signed applications available" msgstr "Instalați toate aplicațiile semnate disponibile" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" msgstr "Instalarea pachetelor construite pe dispozitive" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." msgstr "Se instalează %s..." #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." msgstr "Instalarea '{apkfilename}' pe {dev}..." #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" msgstr "Interacționați cu serverul HTTP repo" #: ../fdroidserver/update.py msgid "Invalid APK" msgstr "APK invalid" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" msgstr "AutoUpdateMode invalid: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" msgstr "UpdateCheckMode invalid: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" msgstr "VercodeOperation invalid: {field}" #: ../fdroidserver/lint.py #, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "VercodeOperation invalidă: {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "ID-ul aplicației nevalabil {appid}" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" msgstr "Boolean invalid \"%s" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Listă cu puncte invalidă" #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" msgstr "Nume nevalabil pentru fișierul publicat: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" msgstr "Ndk invalid: intrare în build: \"{ndk}\"" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " msgstr "Redirecționare nevalabilă către non-HTTPS: {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" msgstr "Metadate scrlib nevalabile: '{file}' nu există" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" msgstr "Metadate srclib nevalabile: nu s-a putut analiza '{file}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" msgstr "Metadate srclib invalide: cheie necunoscută '{key}' în '{file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" msgstr "Nu s-a reușit verificarea semnăturii JAR: {path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" msgstr "Semnătura JAR verificată: {path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" msgstr "Fișier Java JAR" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" msgstr "Java JDK nu a fost găsit! Instalați în locația standard sau setați java_paths!" #: ../fdroidserver/scanner.py msgid "Java compiled class" msgstr "Clasa compilată Java" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" msgstr "Java jarsigner nu a fost găsit! Instalați în locația standard sau setați java_paths!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" msgstr "Javascript în atributele src HTML" #: ../fdroidserver/build.py #, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" msgstr "Nu a reușit să construiască \"{apkfilename}\"" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Keystore pentru cheia de semnare:\t" #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" msgstr "Ultima confirmare utilizată '{commit}' arată ca o etichetă, dar UpdateCheckMode este '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" msgstr "Metodele de donație Liberapay se află în Liberapay: câmp" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted (dry run)" msgstr "Lista fișierelor care ar urma să fie reformatate (execuție în regim de probă)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "Locale incluse în URL-ul f-droid.org" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" msgstr "Opriți construcția la excepții" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." msgstr "Oglinzi de depozit malformate." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" msgstr "Linie de root a serverului web deformată:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" msgstr "A fost atinsă adâncimea maximă de recursivitate în fișierul ZIP: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Oglindește întregul repo și arhiva, toate tipurile de fișiere." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" msgstr "Lipsește directorul de ieșire" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" msgstr "Mutarea declarațiilor Anti-Features în fișierele localizate:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "Nici \"repo_pubkey\" și nici \"keystorepass\" nu sunt setate în config.yml" #: ../fdroidserver/verify.py #, python-format msgid "No APK for package: %s" msgstr "Nu există APK pentru pachetul: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Nu s-a găsit niciun SDK Android!" #: ../fdroidserver/install.py msgid "No attached devices found" msgstr "Nu s-au găsit dispozitive atașate" #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Nu există amprente în URL." #: ../fdroidserver/common.py msgid "No git submodules available" msgstr "Nu există submodule git disponibile" #: ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "Nu a putut fi găsit niciun proiect gradle. Specificați --subdir?" #: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Nu s-au găsit informații." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" msgstr "Nu s-au găsit etichete corespunzătoare" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." msgstr "Nu a fost găsită nicio versiune minimă a SDK în {0}, se utilizează versiunea implicită (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Nu este nevoie să specificați că aplicația este Free Software" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" msgstr "Nu este nevoie să specificați că aplicația este pentru Android" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "Nu există set de opțiuni! Modificați fișierul config.yml pentru a seta cel puțin una dintre acestea:" #: ../fdroidserver/common.py msgid "No packages specified" msgstr "Nu sunt specificate pachete" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" msgstr "Nu există niciun APK semnat disponibil pentru %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" msgstr "Nici un director de ieșire semnat - nimic de făcut" #: ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" msgstr "Nu s-au găsit certificate de semnare în {path}" #: ../fdroidserver/common.py #, python-format msgid "No such package: %s" msgstr "Nu există un astfel de pachet: %s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" msgstr "Nu există un astfel de versionCode {versionCode} pentru aplicația {appid}" #: ../fdroidserver/checkupdates.py msgid "No tags found" msgstr "Nu s-au găsit etichete" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" msgstr "Niciun director nesemnat - nimic de făcut" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Nu este o definiție valabilă a dimensiunii: \"{}\"" #: ../fdroidserver/signindex.py msgid "Nothing to do" msgstr "Nimic de făcut" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." msgstr "Nimic de făcut pentru {appid}." #: ../fdroidserver/init.py msgid "Now set these in config.yml:" msgstr "Acum setați-le în config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" msgstr "Fișierul OBB are un versionCode({integer}) mai nou decât orice APK:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" msgstr "Numele fișierului OBB trebuie să înceapă cu \"main.\" sau \"patch.\":" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" msgstr "OBB's packagename nu se potrivește cu un APK acceptat:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Mașină offline, sărind peste generarea oglinzii git până la `fdroid deploy`" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Doar PNG și JPEG sunt acceptate pentru grafică, găsite: {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Imprimă doar diferențele cu Play Store" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Procesați numai aplicațiile cu actualizări automate" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Metodele de donație OpenCollective aparțin OpenCollective: câmp" #: /usr/lib/python3.11/optparse.py msgid "Options" msgstr "Opțiuni" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Emite raportul JSON în fișierul numit după APK." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." msgstr "Emite JSON către stdout." #: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py #: ../fdroidserver/publish.py ../fdroidserver/signindex.py #: ../fdroidserver/update.py msgid "Outputting JSON" msgstr "Ieșirea JSON" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Licența generală a proiectului." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Suprascrierea versiunii goale VersionName în {apkfilename} din metadate: {version}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "Pachetul \"{appid}\" există deja" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" msgstr "Analiza manifestului la '{path}'" #: ../fdroidserver/common.py msgid "Password required with username" msgstr "Parola este necesară cu numele de utilizator" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "Calea de acces la subdirectorul principal al proiectului Android, dacă nu se află în root." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" msgstr "Calea către Android SDK (uneori setată în ANDROID_HOME)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" msgstr "Calea către repo-ul git care urmează să fie utilizat ca jurnal" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" msgstr "Calea către depozitul de chei pentru cheia de semnare a repo-ului" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Tipărește variabila secretă în terminal pentru un ușor copy/paste" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" msgstr "Problema cu fișierul ZIP: %s, eroare %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" msgstr "Problemă cu xml la '{path}'" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" msgstr "Procesul de autoactualizare" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" msgstr "Procesarea {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" msgstr "Prelucrare {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" msgstr "Producerea de fișiere XML/JSON lizibile de către om pentru fișierele de indexare" #: ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "URL-ul proiectului din care se importă." #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" msgstr "Punctuația trebuie evitată" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" msgstr "Împingeți jurnalul în acest depozit de la distanță git" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing binary transparency log to {url}" msgstr "Trimiterea jurnalului de transparență binară la {url}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" msgstr "Împingerea către {url}" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" msgstr "Începeți rapid un nou depozit" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" msgstr "Citiți toate fișierele de metadate și ieșiți" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" msgstr "Citirea '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" msgstr "Citirea packageName/versionCode/versionName a eșuat, APK invalid: '{apkfilename}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" msgstr "Citirea packageName/versionCode/versionName a eșuat, APK invalid: '{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" msgstr "Citirea {apkfilename} din memoria cache" #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Eliminarea fișierelor specificate" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" msgstr "Eliminarea lui {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Redenumiți fișierele APK care nu se potrivesc cu package.name_123.apk" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" msgstr "Modul de actualizare RepoTrunk are sens doar în depozitele git-svn" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." msgstr "Resetați și creați un nou server de construcție, chiar dacă cel existent pare să fie în regulă." #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" msgstr "Renunțarea la {apkfilename} cu debug.keystore furnizat" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" msgstr "Redimensionați toate pictogramele care depășesc dimensiunea maximă a pixelilor și ieșiți" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" msgstr "Limitarea ieșirii la avertismente și erori" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Rescrieți toate fișierele de metadate" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" msgstr "Rescrierea '{appid}'" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" msgstr "Rulați pe un depozit git care are modificări necomandate" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Rulați rewritemeta pentru a repara formatarea" #: ../fdroidserver/deploy.py msgid "Running first pass with MD5 checking disabled" msgstr "Rularea primei treceri cu verificarea MD5 dezactivată" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" msgstr "Rularea wget în {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" msgstr "SHA-256 din {url} nu se potrivește cu intrarea!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Scanați APK-ul (APK-urile) rezultat(e) pentru clasele cunoscute care nu sunt libere." #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" msgstr "Scanarea codului sursă al unui pachet" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {apk}" msgstr "Scanerul a găsit {count} probleme în {apk}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" msgstr "Scanerul a găsit {count} probleme în {appid}:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" msgstr "Scanerul a găsit {count} probleme în {appid}:{versionCode}:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "Scannerul a găsit o problemă {}" msgstr[1] "Scannerul a găsit {} probleme" msgstr[2] "Scannerul a găsit {} probleme" #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "Scanarea APK cu dexdump pentru clasele cunoscute ca fiind non-libere." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" msgstr "Setați NDK {release} ({version}) sus" #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Setați ceasul la ora respectivă folosind:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" msgstr "Setați numărul maxim de versiuni în depozit înainte ca cele mai vechi să fie arhivate" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" msgstr "Setați limita fișierelor deschise la {integer}" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" msgstr "Configurați o compilare de aplicații pentru un depozit de compilare nocturnă" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " msgstr "Setarea limitei fișierelor deschise a eșuat: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" msgstr "Setarea {0} sec timeout pentru această construcție" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Semnați și plasați pachetele în repo" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" msgstr "Semnează indexurile create folosind update --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" msgstr "Treceți peste scanarea codului sursă pentru binare și alte probleme" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Ignorarea '{apkfilename}' cu semnătură invalidă!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" msgstr "Omiterea oglinzii GitLab Pages pentru că repo-ul este prea mare (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" msgstr "Ignorarea generării indexului pentru {appid}" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" msgstr "Săritură {apkfilename} cu semnătură invalidă!" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" msgstr "Salt peste {appid}: dezactivat" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" msgstr "Specificați un dosar local în care să sincronizați depozitul" #: ../fdroidserver/deploy.py msgid "Specify an identity file to provide to SSH for rsyncing" msgstr "Specificați un fișier de identitate pe care să îl furnizați la SSH pentru rsyncing" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." msgstr "Specificați fișierul keystore de depanare care trebuie utilizat." #: ../fdroidserver/common.py msgid "Spew out even more information than normal" msgstr "Aruncă și mai multe informații decât în mod normal" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" msgstr "Eliminarea semnăturii misterioase din {apkfilename}" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" msgstr "Rezumat \"%s\" este doar numele aplicației" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" msgstr "Rezumat al lungimii {length} depășește limita de caractere {limit} char limit" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" msgstr "Ceasul sistemului este mai vechi decât data din {path}!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" msgstr "Modul de actualizare a etichetelor funcționează doar pentru depozitele git, hg, bzr și git-svn în prezent" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "Modul de actualizare a etichetelor folosit în git-svn, dar repo-ul nu a fost configurat cu etichete" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Modul test - puneți ieșirea numai în directorul tmp și construiți întotdeauna, chiar dacă ieșirea există deja." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" msgstr "Codul versiunii OBB trebuie să apară după \"{name}.\":" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" msgstr "URL-ul de bază pentru repo-ul de logat (implicit: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" msgstr "Directorul în care se va scrie oglinda" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" msgstr "Fișierul care urmează să fie inclus în repo (cale sau glob)" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." msgstr "Amprenta digitală a depozitului nu se potrivește." #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" msgstr "Directorul root pentru local_copy_dir \"{path}\" nu există!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" msgstr "Există o coliziune keyalias - publicarea a fost oprită" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." msgstr "Acestea sunt aplicațiile care au fost arhivate din depozitul principal." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Acesta este un depozit de aplicații care pot fi utilizate cu F-Droid. Aplicațiile din acest depozit sunt fie binare oficiale construite de către dezvoltatorii aplicațiilor originale, fie binare construite din sursă de către administratorul f-droid.org folosind instrumentele de pe https://gitlab.com/fdroid." #: ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Acest depozit are deja metadate locale: %s" #: ../fdroidserver/init.py #, python-format msgid "" "To complete the setup, add your APKs to \"%s\"\n" "then run \"fdroid update -c; fdroid update\". You might also want to edit\n" "\"config.yml\" to set the URL, repo name, and more. You should also set up\n" "a signing key (a temporary one might have been automatically generated).\n" "\n" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" "Pentru a finaliza configurarea, adăugați APK-urile la \"%s\"\n" "apoi rulați \"fdroid update -c; fdroid update\". De asemenea, este posibil să doriți să editați\n" "\"config.yml\" pentru a seta URL-ul, numele repo și altele. De asemenea, ar trebui să configurați\n" "o cheie de semnare (este posibil ca una temporară să fi fost generată automat).\n" "\n" "Pentru mai multe informații: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "și https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Pentru a utiliza awsbucket, awssecretkey și awsaccesskeyid trebuie să fie de asemenea setate în config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "URL-ul trebuie să înceapă cu https:// sau http://" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" msgstr "Scurtătoarele de URL-uri nu trebuie utilizate" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" msgstr "URL {url} în Descriere: {error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" msgstr "Etichetă de licență neașteptată \"{}\"! Folosiți numai etichete aprobate de FSF sau OSI de pe https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Etichetă de licență neașteptată \"{}\"! Utilizați numai etichetele de licență configurate în fișierul de configurare" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" msgstr "Neașteptată țintă symlink: {link} -> {target}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" msgstr "Intrare necunoscută {key} în {configname}" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "S-a găsit o excepție necunoscută!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" msgstr "Fișier necunoscut '{filename}' în build '{versionName}'" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" msgstr "Format de metadate necunoscut: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" msgstr "Format de metadate necunoscut: {path} (use: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " msgstr "Versiune necunoscută de aapt, ar putea cauza probleme: " #: ../fdroidserver/lint.py msgid "Unnecessary leading space" msgstr "Spațiu de conducere inutil" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" msgstr "Spațiu de urmărire nejustificat" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" msgstr "Câmp de aplicație nerecunoscut '{fieldname}' în '{path}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Indicator de construcție nerecunoscut '{build_flag}' în '{path}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" msgstr "Tip de fișier \"{extension}\" neacceptat pentru graficul repo" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" msgstr "A fost găsit un fișier grafic neacceptat: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" msgstr "Extlib nefolosit la %s" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" msgstr "Fișier nefolosit la %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" msgstr "Calea de scanare a ștergerii neutilizată: %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" msgstr "Cale de scanare neutilizată: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" msgstr "Decomprimarea la %s" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Actualizarea informațiilor repo pentru noile pachete" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" msgstr "Actualizarea jurnalului de transparență binară pentru o adresă URL" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData are un URL invalid: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" msgstr "UpdateCheckData trebuie să corespundă codului versiunii ca număr întreg (\\d sau [0-9]): {codeex}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" msgstr "UpdateCheckData trebuie să utilizeze un URL HTTPS: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData nu este un URL valid: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode este setat, dar se pare că checkupdates nu a fost încă rulat." #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName este setat la ID-ul cunoscut al aplicației, acesta poate fi eliminat" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" msgstr "Încărcarea {apkfilename} pe androidobservatory.org" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" msgstr "Încărcarea {apkfilename} la virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "Usage" msgstr "Utilizare" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Utilizare: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Folosiți /HEAD în loc de /master pentru a indica un fișier din ramura implicită" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Utilizați `fdroid update -c` pentru a-l crea." #: ../fdroidserver/build.py msgid "Use build server" msgstr "Utilizați serverul de construcție" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" msgstr "Utilizați data din APK în loc de ora curentă pentru APK-urile nou adăugate" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." msgstr "Utilizarea \"{path}\" pentru configurarea s3cmd." #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "Folosind APK Signature v2" #: ../fdroidserver/common.py msgid "Using APK Signature v3" msgstr "Folosind APK Signature v3" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Folosind jarsigner de la Java, nu este recomandat pentru verificarea APK-urilor! Utilizați apksigner" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" msgstr "Folosind androguard din \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" msgstr "Utilizarea dicționarului gol în loc de conținutul lui {path}!" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" msgstr "Utilizarea keystore-ului existent \"{path}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" msgstr "Folosind s3cmd pentru a sincroniza cu: {url}" #: ../fdroidserver/__main__.py msgid "Valid commands are:" msgstr "Comenzile valide sunt:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." msgstr "Verificați în funcție de copia memorată în memoria cache locală, mai degrabă decât să reîncărcați." #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" msgstr "Verificarea integrității pachetelor descărcate" #: ../fdroidserver/index.py msgid "Verifying index signature:" msgstr "Verificarea semnăturii indexului:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "VirusTotal API key nu poate încărca fișiere mai mari de 32MB, utilizați {url} pentru a încărca {path}." #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Avertizează cu privire la posibile erori de metadate" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Atunci când este configurat pentru indici cu semnătură, creați numai indici fără semnătură în această etapă" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "Atunci când se face linting pentru întregul depozit, yamllint este dezactivat în mod implicit. Această opțiune forțează yamllint indiferent de aceasta." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 \"Distinguished Name\" utilizat la generarea cheilor" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" msgstr "Puteți utiliza ANDROID_HOME pentru a seta calea către SDK-ul dvs., adică:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" msgstr "Arhiva de fișiere ZIP" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" msgstr "adăugând IdentityFile la {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" msgstr "adăugând la {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opțiune ambiguă: %(option)s ar putea corespunde cu %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "opțiune ambiguă: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner nu a fost găsit! Nu se poate semna sau verifica APK-urile moderne" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "apksigner nu a fost găsit, este necesar pentru a semna!" #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "ID-ul de aplicație al fișierului pe care se operează" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" msgstr "ID-ul aplicației cu versionCode opțional sub forma APPID[:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" msgstr "archive_url trebuie să se termine cu /archive" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "argumentul \"-\" cu modul %r" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" msgstr "argument %(argument_name)s: %(message)s" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" msgstr "încercând o conexiune SSH goală pentru a testa cheia de implementare:" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" msgstr "nu poate analiza specificația scrlib (not a string): '{}'" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "nu se poate deschide '%(filename)s': %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" msgstr "nu se poate deschide un URL non-https: '{};" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" msgstr "nu poate găsi srclibs necesare: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "nu poate avea mai multe argumente subparser" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "nu poate fuziona acțiuni - două grupuri se numesc %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" msgstr "nu poate publica actualizarea, ați setat cheia de implementare?" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" msgstr "clonarea {url}" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" msgstr "comenzi din modulele plugin:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" msgstr "complexă" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "șir de opțiuni conflictuale: %s" msgstr[1] "șiruri de opțiuni conflictuale: %s" msgstr[2] "șiruri de opțiuni conflictuale: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser alias: %s" msgstr "șir de alias conflictual: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser: %s" msgstr "șir de opțiuni conflictuale: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" msgstr "nu s-a putut analiza '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "nu a putut analiza specificația srclib (nu a fost specificat niciun ref): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" msgstr "could not parse srclib spec (prea multe semne '@'): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" msgstr "a creat {path}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" msgstr "versiunea curentă este mai nouă: old vercode={old}, new vercode={new}" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" msgstr "ștergere: repo/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" msgstr "a implementat jurnalul de proces {path} la {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest= este necesar pentru opțiuni precum %r" #: ../fdroidserver/scanner.py msgid "downloading '{}'" msgstr "descărcare '{}'" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" msgstr "descărcarea semnăturilor de scaner de la '{}' a eșuat" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" msgstr "binar executabil, eventual cod" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "argument %s așteptat" msgstr[1] "argumente %s așteptate" msgstr[2] "argumente %s așteptate" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "se așteaptă cel puțin un argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "se așteaptă cel mult un argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "se așteaptă un singur argument" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--help|--version|]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" msgstr "extrage cea mai recentă versiune de semnături de pe web" #: /usr/lib/python3.11/optparse.py msgid "floating-point" msgstr "punct flotant" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "forțează erorile de metadate (implicit) să fie avertismente sau să fie ignorate." #: ../fdroidserver/common.py msgid "git svn clone failed" msgstr "git svn clone a eșuat" #: ../fdroidserver/scanner.py msgid "gzip file archive" msgstr "Arhiva de fișiere gzip" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "a ignorat argumentul explicit %r" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 trebuie să aibă o semnătură, folosiți `fdroid signindex` pentru a o crea!" #: ../fdroidserver/index.py msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 trebuie să aibă o semnătură, folosiți `fdroid signindex` pentru a o crea!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" msgstr "întreg" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "invalid %(type)s valoare: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "alegere invalidă: %(value)r (alege din %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valoare invalidă a rezoluției_conflictului: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "șir de opțiuni invalid %(option)r: trebuie să înceapă cu un caracter %(prefix_chars)r" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" msgstr "ipfs_cid nu a fost găsit, sărind peste generarea CIDv1" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" msgstr "ultima rețetă de construcție este mai nouă: old vercode={old}, new vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "local_copy_dir nu se termină cu \"fdroid\", poate ai vrut să spui: \"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" msgstr "local_copy_dir trebuie să fie o rută de acces absolută!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" msgstr "local_copy_dir trebuie să fie un director, nu un fișier!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" msgstr "oglinda '%s' nu se termină cu 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "argumentele care se exclud reciproc trebuie să fie opționale" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" msgstr "următoarea actualizare a memoriei cache {name} va fi efectuată în {time}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" msgstr "nu există \" pictogramă \" în {appid}" #: ../fdroidserver/signatures.py msgid "no APK supplied" msgstr "nici un APK furnizat" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" msgstr "nu există o astfel de opțiune: %s" #: ../fdroidserver/__main__.py msgid "no version info found!" msgstr "nu s-au găsit informații despre versiune!" #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "nu s-au găsit informații despre versiune" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "nu este permis cu argumentul %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "unul dintre argumentele %s este necesar" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" msgstr "acceptă doar șiruri de caractere, liste și tupluri" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "opțiunea %s: Dacă doriți cu adevărat să instalați toate aplicațiile semnate, utilizați --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "opțiunea %s: valoare %s invalidă: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "opțiunea %s: alegere invalidă: %r (alege din %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" msgstr "opțiunea -%s nerecunoscută" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" msgstr "opțiunea -%s necesită argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "opțiunea --%s nu trebuie să aibă un argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "opțiunea --%s nu este un prefix unic" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" msgstr "opțiunea --%s nerecunoscută" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s requires argument" msgstr "opțiunea --%s necesită un argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "argumente opționale" #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "opțiuni" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" msgstr "suprascriere {path} existent" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "argumente poziționale" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" msgstr "jurnalul procesului deploy {path} la {dest} a eșuat!" #: ../fdroidserver/build.py msgid "reference binary missing signature" msgstr "referință binară semnătură lipsă" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" msgstr "refuză descărcarea prin conexiune HTTP nesigură (utilizați HTTPS sau specificați --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." msgstr "repo_icon \"repo/icons/%s\" nu există, se generează un înlocuitor." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" msgstr "repo_url trebuie să se termine cu /repo" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml nu este instalat, nu poate scrie metadatele." #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sincronizează indexurile {path} cu {url} și șterge" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "cache-ul scanerului este deformat! Puteți să o ștergeți cu: '{clear}'" #: ../fdroidserver/scanner.py msgid "shared library" msgstr "bibliotecă partajată" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" msgstr "arată numărul versiunii programului și iese" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" msgstr "arată acest mesaj de ajutor și iese" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." msgstr "APK semnat, fie un file-path, fie un URL HTTPS." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" msgstr "săriți distribuirea jurnalelor complete de construcție: conținutul jurnalului este gol" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" msgstr "săriți distribuirea jurnalelor complete de construcție: nu este activată în configurare" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" msgstr "săriți de la pachetul sursă: {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" msgstr "srclibs lipsește numele și/sau @" #: ../fdroidserver/scanner.py msgid "static library" msgstr "bibliotecă statică" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" msgstr "binare de referință furnizate au permis semnatarului {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "sunt necesare următoarele argumente: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "șir de opțiuni neașteptate: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "parser necunoscut %(parser_name)r (choices: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "argumente nerecunoscute: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "permisiuni nesigure pe '{config_file}' (ar trebui să fie 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "utilizare: " #: ../fdroidserver/deploy.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" msgstr "folosind Apache libcloud pentru a se sincroniza cu {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com limitează rata, așteptând o nouă încercare..." #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" msgstr[0] "{0} aplicație, {1} aliasuri de chei" msgstr[1] "{0} aplicații, {1} aliasuri de chei" msgstr[2] "{0} aplicații, {1} aliasuri de chei" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) nu are metadate!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" msgstr "{apkfilename} are mai multe fișiere {name}, pare a fi un exploit Master Key!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "AndroidManifest.xml al lui {apkfilename} are o dată greșită: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} nu are un nume! În schimb, utilizați ID-ul aplicației." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" msgstr "{appid} din {path} nu este un ID de aplicație Android valid!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid} din {path} nu este un nume de pachet Java valid!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" msgstr "{appid} are atât APK-uri, cât și fișiere: {files}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" msgstr "{appid} lipsește {name}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" msgstr "{appid}: Extlib necunoscut {path} în build '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" msgstr "{appid}: nu este specificată nicio construcție, rulează pe starea curentă a sursei" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" msgstr "{appid}: {field} trebuie să fie un \"{type}\", dar este un \"{fieldtype}!\"" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" msgstr "{appid}: {field} trebuie să fie un '{type}', dar este un '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} trebuie să fie un număr întreg, găsit: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be list or string, found: {value}" msgstr "{build_flag} trebuie să fie un număr întreg, găsit: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" msgstr "{file} este gol sau corupt!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" nu există! Verificați \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} este depreciat, folosiți {newfile}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "{path} există deja, ignorând rezultatele importului!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" msgstr "{path} nu există! Creați-l prin rularea:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} are o semnătură proastă a fișierului \"{pattern}\", posibil exploit Janus!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" msgstr "{path} este de dimensiune zero!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} mai mult de 200MB, încărcați manual: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} nu se termină cu \"fdroid\", verificați calea URL!" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url} nu începe cu \"http\"!" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" msgstr[0] "{} construcția a eșuat" msgstr[1] "{} a eșuat" msgstr[2] "{} a eșuat" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} a reușit să construiască" msgstr[1] "{} construite cu succes" msgstr[2] "{} construite cu succes" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/locale/ru/0000755000175000017500000000000014620351546014675 5ustar00hanshans././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.888382 fdroidserver-2.3a1/locale/ru/LC_MESSAGES/0000755000175000017500000000000014620351546016462 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/locale/ru/LC_MESSAGES/fdroidserver.po0000644000175000017500000034211114620351225021514 0ustar00hanshans# SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # Golubev Alexander , 2020, 2021. # Mingun , 2020. # anonymous , 2020. # Andrey , 2020, 2021, 2022, 2023. # gardenapple , 2020. # Boris Timofeev , 2020. # Hans-Christoph Steiner , 2020. # Roman , 2020. # S3aBreeze , 2021. # Чтабс , 2021. # Andrei Stepanov , 2022. # Макар Разин , 2023. # Alexander Ivanov , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2024-02-23 12:59+0000\n" "Last-Translator: Alexander Ivanov \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" "\n" "Открытый SSH-ключ, который будет использоваться в качестве ключа развертывания (Deploy Key):" #: ../fdroidserver/nightly.py #, python-brace-format msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" "\n" "{path} закодирован в скрытую переменную DEBUG_KEYSTORE:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" msgstr "У \"%s/\" нет соответствующего файла метаданных!" #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" msgstr "\"local_copy_dir\" {path} не существует!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "'{apkfilename}' уже установлен на {dev}." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" msgstr "В пути \"{path}\" устаревшие имя {name} или версия {version} пакета" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" msgstr "в пути \"{path}\" последние имя {name} и версия {version} пакета" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" msgstr "путь \"{path}\" существует, но s3cmd клиент не установлен!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" msgstr "\"{path}\" не поддерживаемый формат файла (используйте: metadata/*.yml)" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "\"{path}\" подписан ключом, который не разрешен:" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" — не корректный URL!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" msgstr[0] "Параметр %(option)s требует %(number)d аргумент" msgstr[1] "Параметр %(option)s требует %(number)d аргумента" msgstr[2] "Параметр %(option)s требует %(number)d аргументов" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: ошибка: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" msgstr "%d ошибок найдено" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "%prog [options]" msgstr "%prog [параметры]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" msgstr "к %r нельзя обратиться" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" msgstr "%s не создает dict!" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" msgstr "%s имеет неверный SHA-256: %s" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" msgstr "%s не является допустимым полем" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" msgstr "%s параметр не принимает значений" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "В config.yml нет переменной 'keypass'!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "Значение 'keystore` — NONE, но 'smartcardoptions' не задан!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "'keystore' не найден в config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' не найден в config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' не найден в config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' не годится в качестве позиционного аргумента" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" msgstr "'sdk_path' не найден в config.yml!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "{aapt} — устаревшая версия, F-droid нужна версия build-tools-{version} или более поздняя!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" msgstr "'{field}' добавлено в произвольном порядке! Если порядок важен, используйте скобки () и []!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" msgstr "{path} не удалось исполнить!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' имеет недопустимый формат, это должен быть словарь!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' не подходит в качестве {field} в {appid}. Образец регулярного выражения: {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' не является допустимым {field}, должно быть {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" msgstr "...checkupdate для {appid} завершился ошибкой: {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() не определен" #: ../fdroidserver/lint.py msgid "/issues is missing" msgstr "Не хватает /issues" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" msgstr "В качестве аргумента нужен URL-адрес!" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Добавить PGP подписи для пакетов в репозитории с помощью GnuPG" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" msgstr "Добавлять ключ для подписи в неподписанный репозиторий" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" msgstr "Добавлять основные файлы метаданных в APK, если они там отсутствуют" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" msgstr "Добавление нового репозитория только для {name}" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" msgstr "Алиас для ключа для подписи репозитория в хранилище ключей" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" msgstr "AllowedAPKSigningKeys отсутствует, но предоставлен эталонный двоичный файл" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Позволяет выбрать разные ревизии или ветки для первичного импорта" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" msgstr "Дополнительно создавать полную копию раздела архива" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" msgstr "Дополнительно предупреждать о нарушениях форматирования (вроде rewritemeta -l)" #: ../fdroidserver/scanner.py msgid "Android AAR library" msgstr "AAR-библиотека Android" #: ../fdroidserver/scanner.py msgid "Android APK file" msgstr "APK-файл Android" #: ../fdroidserver/scanner.py msgid "Android DEX code" msgstr "DEX-код Android" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" msgstr "Android SDK не обнаружен в {path}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" msgstr "Android SDK '{path}' нет в переменных окружения!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" msgstr "Путь Android SDK '{path}' указывает не на директорию!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" msgstr "Инструмент Android SDK {cmd} не найден!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "Приложение имеет двоичные файлы, но не имеет соответствующего сертификата AllowedAPKSigningKeys для закрепления." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Приложение имеет NoSourceSince или ArchivePolicy \"0 версий\", но AutoUpdateMode или UpdateCheckMode не равны None" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" msgstr "Приложение находится в репозитории '{repo}', но ссылка указывает на {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "Версия приложения имеет двоичный код, но не имеет соответствующего сертификата AllowedAPKSigningKeys для закрепления." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Добавлять .git необязательно" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" msgstr "Вы пытаетесь поместить в архив {apkfilename} с недопустимой подписью!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode с UpdateCheckMode: HTTP должен иметь шаблон." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" msgstr "Неверный тип записи \"{mirrortype}\" в конфигурации зеркал: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "Основной URL-адрес зеркала может содержать ключ для подписывания индекса (добавьте запрос \"?fingerprint=\")" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" msgstr "Ветка '{branch}' вошла в билд '{versionName}' как коммит" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" msgstr "Ветка '{branch}' вошла в библиотеку '{srclib}' как коммит" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" msgstr "Неработающая символическая ссылка: {path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" msgstr "Собрать пакет из исходников" #: ../fdroidserver/build.py msgid "Build all applications available" msgstr "Запустить сборку всех доступных приложений" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" msgstr "Билд подготовлен командой `fdroid import`, перед сборкой удалите строку \"disable\"" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" msgstr "В репозитории с метаданными билдов есть незакоммиченные изменения!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" msgstr "Запустить сборку только последней версии для каждого пакета" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" msgstr "Репозиторий создан в \"%s\", основываясь на конфигурации:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" msgstr "Невозможно автоматически обновить приложение без CurrentVersionCode" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "Запустить сборку невозможно из-за {} ошибки во время сканирования данных" msgstr[1] "Запустить сборку невозможно из-за {} ошибок во время сканирования данных" msgstr[2] "Запустить сборку невозможно из-за {} ошибок во время сканирования данных" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" msgstr "Невозможно переписать \"{path}\"" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "Неправильные категории: '%s'" #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "Категории не выбраны" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Проверить обновления для приложений" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Проверка перед помещением в архив для {appid}. apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Очистка с обновлением: не использовать кэш, повторно сгенерировать все APK" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Категории перечислены через запятую." #: ../fdroidserver/__main__.py #, python-format msgid "Command '%s' not recognised.\n" msgstr "Команда '%s' не распознана.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" msgstr "Сохранить изменения (commit)" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" msgstr "Конфликтующие определения \"{field}\" между .yml и локализованными файлами:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Несовместимые аргументы: '--verbose' и '--quiet' нельзя указывать одновременно." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" msgstr "Конфликтуюущие файлы настроек! {newfile} — используется; {oldfile} — игнорируется!" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "В вашей системе недоступна команда '{command}'" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Не удалось найти последнюю версию приложения (versionCode)" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Не удалось найти название последней версии" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" msgstr "Указанный для удаления {path} не найден" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " msgstr "Не удалось открыть и проанализировать файл APK {path}: " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Не удалось разобрать размер «{size}», неверный тип «{type}»" #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Не удалось найти Application ID" #: ../fdroidserver/checkupdates.py msgid "Couldn't find any version information" msgstr "Не удалось найти никакой информации о версии" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "Не удалось найти package ID" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" msgstr "Менять текущий ключ для подписывания как-то боязно. Пожалуй, не станем!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" msgstr "Новый контейнер \"{name}\" создан" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Создание \"{path}\" для конфигурации s3cmd." #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Создание директории для хранения логов" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" msgstr "Создание нового S3 bucket: {url}" #: ../fdroidserver/publish.py msgid "Creating output directory" msgstr "Создание директории для выходных данных" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" msgstr "Подписывание индекса ключом (SHA256):" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" msgstr "Создание директории для хранения временных файлов" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" msgstr "Создание неподписанного индекса (подготовка к подписыванию)" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" msgstr "CurrentVersionCode {cv} меньше значения старейшей сборки {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" msgstr "Переменная DEBUG_KEYSTORE пустая или заполнена неправильно" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" msgstr "Удалить APK и/или OBB без метаданных из репозитория" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" msgstr "Удаление архива, репозиторий слишком большой ({size}, максиммум {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" msgstr "Удаление истории git-зеркала, репозиторий слишком большой ({size}, максиммум {limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" msgstr "Удаление неизвестного файла: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" msgstr "Описание '%s' копирует краткий обзор приложения (app's summary)" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" msgstr "В описании встречаются одинаковые строки" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" msgstr "В описании есть неразмеченный список (%s). Воспользуйтесь (*) для ненумерованного списка и (#) для нумерованного" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" msgstr "Описание {length} превышает лимит по количеству знаков {limit}" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Не добавлять 'disable:' к сгенерированным данным сборки" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" msgstr "Не помещать новые файлы сразу в репозиторий" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" msgstr "Не включайте \"{path}\" в URL-адрес!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" msgstr "Не спрашивать путь к Android SDK, а просто выйти с ошибкой" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" msgstr "Не удалять сгенерированные приватные ключи из хранилища" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" msgstr "Не создавать архив с исходниками. Ускоряет тестовые сборки" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" msgstr "Не обновлять репозиторий. Упрощает тестовые сборки при отсутствии интернета" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" msgstr "Не использовать контрольные суммы rsync" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Полностью загружать зеркала для небольших репозиториев" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" msgstr "Загрузка %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Репозиторий не удалось склонировать с первой попытки." #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" msgstr "Загрузить {url} не получилось. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" msgstr "Повторяющееся объявление Anti-Feature в {path} было проигнорировано!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" msgstr "Дублирующаяся запись \"%s\" в конфигурации зеркал!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" msgstr "Точная копия ссылки в '{field}': {url}" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ОШИБКА: подкоманда \"server\" была удалена, используйте \"deploy\"!" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" "ОШИБКА: эту команду ни в коем случае нельзя использовать для создания зеркала f-droid.org!\n" "Оно занимает больше 200 Гб." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ОШИБКА: этот тип CI не поддерживается, налаживайте и присылайте патчи!" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "ОШИБКА: неподдерживаемый хост git «%s», патчи приветствуются!" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." msgstr "Задана кодировка '{enc}'. F-droid может испытывать сложности с кодировками. Пожалуйста, используйте 'UTF-8' во избежании ошибок." #: ../fdroidserver/init.py #, python-format msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" "Укажите путь к Android SDK (%s): \n" "> " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" msgstr "Переменная среды {var} из {configname} не установлена!" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Ошибка при получении адреса репозитория" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" msgstr "Выход с ненулевым кодом, если обнаружены проблемы" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Извлекать метаданные приложения из исходного репозитория" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Извлечь подписи из APK файлов" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" msgstr "Не удалось скопировать {path}: {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" msgstr "Не удалось получить подпись для '{apkfilename}: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" msgstr "Не удалось распознать {path}: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" msgstr "Не удалось изменить размер {path}: {error}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" msgstr "Создать S3 объект (S3 bucket) не получилось: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" msgstr "Не удалось получить информацию об APK файле, {path} будет удален" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" msgstr "Не удалось получить информацию об APK файле, {path} будет пропущен" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" msgstr "Не удалось получить отпечаток ключа подписи APK" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" msgstr "Установить {apkfilename} на {dev} не получилось: {error}" #: ../fdroidserver/common.py msgid "Failed to sign application" msgstr "Подписать приложение не удалось" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" msgstr "Сервер для сборки скопирован с ВМ {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" msgstr "Получены подписи для '{apkfilename}' -> '{sigdir}'" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" msgstr "Файл исчез во время обработки: {path}" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py #: ../fdroidserver/update.py msgid "Finished" msgstr "Готово" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" msgstr "Cсылка на пожертвования через Flattr должна быть в поле «FlattrID:»" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Запрещенные теги HTML" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." msgstr "Принудительно собирать заблокированные приложения, игнорируя ошибки при сканировании. Доступно только в тестовом режиме." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" msgstr "Принудительно останавливать сборку, если тайм-аут больше {0} секунд!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." msgstr "Принудительно сканировать отключенные приложения и сборки." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" msgstr "В \"{path}\" обнаружены изображения без метаданных для приложения \"{name}\"!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "Обнаружен неверный файл финансирования \"{path}\" для \"{name}\":" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" msgstr "В аргументах обнаружены неправильные appid" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "Для некоторых приложений обнаружены неправильные номера внутренней версии (versionCode)" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" msgstr "В {path} обнаружено несколько сертификатов (JAR Signature Block File)" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" msgstr "Для {appid} обнаружено несколько файлов метаданных" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." msgstr "Для этого репозитория обнаружено несколько ключей для подписывания." #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." msgstr "Сертификат для подписывания для этого репозитория не обнаружен." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" msgstr "Это не похоже на файл: %s" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" msgstr "Найдено {apkfilename} в {url}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} problems in {filename}" msgstr "Найдено {count} проблем(ы) в {filename}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" msgstr "Найдено {count} предупреждений в {filename}" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" msgstr "Первоначальная заготовка метаданных для {appid} завершена" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" msgstr "Не удалось получить данные репозитория (git checkout) из '%s'" #: ../fdroidserver/common.py msgid "Git clean failed" msgstr "Очистка репозитория (git clean) не удалась" #: ../fdroidserver/common.py msgid "Git fetch failed" msgstr "Не удалось получить данные из репозитория (git fetch)" #: ../fdroidserver/common.py msgid "Git prune failed" msgstr "Не удалось выполнить Git prune" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Не удалось настроить HEAD для удаленного репозитория (git remote set-head): \"%s\"" #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Не удалось отменить изменения (git reset)" #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Не удалось синхронизировать модули Git (git submodules sync)" #: ../fdroidserver/common.py msgid "Git submodule update failed" msgstr "Не удалось обновить модули Git (git submodules update)" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" msgstr "URL-адреса для Subversion должны начинаться с HTTPS!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" msgstr "Разрешить удаление архива, когда git-зеркало становится слишком большим" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" msgstr "Если эта загрузка не удалась, попробуйте вручную загрузить на {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." msgstr "Проигнорировано: поле '{field}' в метаданных '{metapath}' т.к. оно признано нежелательным (deprecated)." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "Проигнорировано: запись в FUNDING.yml длиннее 2048 символов: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" msgstr "Игнорирование плохого элемента в манифесте: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Проигнорировано, пакеты без метаданных: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" msgstr "Проигнорировано: устаревший кеш для {apkfilename}" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" msgstr "Включать APK, подписанные отключенными алгоритмами, например MD5" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" msgstr "Включать PGP-подпись («*.asc» файлы) в зеркало" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" msgstr "Включать логи сборки в зеркало" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" msgstr "Включать архивы с исходным кодом в зеркало" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" msgstr "Включение метаданных из %s@%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" msgstr "Включение метаданных из {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Подключение модулей" #: ../fdroidserver/install.py msgid "Install all signed applications available" msgstr "Установить все доступные подписанные приложения" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" msgstr "Установить собранные пакеты на устройства" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." msgstr "Установка %s..." #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." msgstr "Установка '{apkfilename}' на устройство {dev}..." #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" msgstr "Взаимодействовать с HTTP сервером репозитория" #: ../fdroidserver/update.py msgid "Invalid APK" msgstr "Непригодный файл APK" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" msgstr "Неверный режим автообновления: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" msgstr "Недопустимый UpdateCheckMode: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" msgstr "Расхождение версий приложения в метаданных: {field}" #: ../fdroidserver/lint.py #, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "Недействительная VercodeOperation: {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "Неверный ID приложения: {appid}" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" msgstr "Расхождение условий перехода состояния (boolean) в метаданных: '%s'" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Неверно размеченный список" #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" msgstr "Неверное имя для опубликованного файла: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" msgstr "Недопустимый ndk: запись в сборке: \"{ndk}\"" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " msgstr "Неверное перенаправление (не HTTPS): {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" msgstr "Некорректные метаданные scrlib: '{file}' не существует" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" msgstr "Некорректные метаданные scrlib: не удалось разобрать содержимое '{file}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" msgstr "Некорректные метаданные scrlib: не известный ключ '{key}' в '{file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" msgstr "Не удается проверить подпись JAR: {path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" msgstr "Подпись JAR прошла проверку: {path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" msgstr "JAR-файл Java" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" msgstr "Не обнаружена Java JDK! Установите ее по стандартному пути или настройте переменную java_paths!" #: ../fdroidserver/scanner.py msgid "Java compiled class" msgstr "Скомпилированный класс Java" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" msgstr "Java jarsigner не обнаружен! Установите по стандартному пути или настройте переменную java_paths!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" msgstr "В атрибутах исходного HTML кода содержится Javascript" #: ../fdroidserver/build.py #, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" msgstr "Сохранение неудачной сборки \"{apkfilename}\"" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Хранилище ключа для подписывания:→\t" #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" msgstr "Последний наложенный коммит '{commit}' похож на метку (tag), но режим проверки обновлений (UpdateCheckMode) — '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" msgstr "Cсылка на пожертвования через Liberapay должна быть в поле «Liberapay:»" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted (dry run)" msgstr "Список файлов, которые будут переформатированы (сухой прогон)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "В URL f-droid.org включена локаль" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" msgstr "Останавливать сборку при появлении исключений (exception)" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." msgstr "Неверные адреса зеркал для репозитория." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" msgstr "Неверный путь serverwebroot:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" msgstr "Достигнута максимальная глубина рекурсии в ZIP-файле: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Создать зеркало всего репозитория и архива, включая все типы файлов." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" msgstr "Директории для хранения выводных данных не существует" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" msgstr "Перемещение объявлений Anti-Features в локализованные файлы:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "Ни «repo_pubkey», ни «keystorepass» не указаны в config.yml" #: ../fdroidserver/verify.py #, python-format msgid "No APK for package: %s" msgstr "Нет APK для пакета: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Android SDK не обнаружена!" #: ../fdroidserver/install.py msgid "No attached devices found" msgstr "Подключенных устройств не найдено" #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "URL-адрес не содержит идентификационной метки (fingerprint)." #: ../fdroidserver/common.py msgid "No git submodules available" msgstr "Модулей Git не обнаружено" #: ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "Проект gradle не найден. Возможно, нужно указать его в параметре --subdir?" #: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Информация о репозитории неверна." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" msgstr "Соответствующие теги не найдены" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." msgstr "Не найдена минимальная версия SDK в {0}, используется версия по умолчанию (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Указывать в описании, что приложение свободное, необязательно. Других здесь не держат" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" msgstr "Указывать в описании, что приложение для Android, не обязательно. Других здесь не держат" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "Недостаточно опций сборки! Настройте как минимум вот эти (в config.yml):" #: ../fdroidserver/common.py msgid "No packages specified" msgstr "Не выбраны пакеты" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" msgstr "Для %s нет подписанного APK" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" msgstr "Директории с данными для подписывания не найдено. До новых встреч" #: ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" msgstr "В {path} не обнаружены сертификаты для подписывания" #: ../fdroidserver/common.py #, python-format msgid "No such package: %s" msgstr "Такого пакета не существует: %s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" msgstr "Внутренней версии (versionCode) с номером {versionCode} для приложения {appid} не существует" #: ../fdroidserver/checkupdates.py msgid "No tags found" msgstr "Теги не найдены" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" msgstr "Директории с неподписанными данными не существует. До новых встреч" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Неверное определение размера: \"{}\"" #: ../fdroidserver/signindex.py msgid "Nothing to do" msgstr "До новых встреч" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." msgstr "Автоматические обновления для {appid} недоступны." #: ../fdroidserver/init.py msgid "Now set these in config.yml:" msgstr "Определите эти переменные в config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" msgstr "В OBB файле обнаружена более свежая внутренняя версия приложения (versionCode: {integer}), чем в APK:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" msgstr "Имя файла OBB должно начинаться с \"main.\" или \"patch.\":" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" msgstr "Указанный в OBB файле packagename не соответствует указанному в APK:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Автономная система, пропуск генерации git-зеркала до `fdroid deploy`" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Допускаются изображения только в форматах PNG и JPEG: {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Отобразить только приложения, версия которых в Play Store отличается от здешней" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Запустить проверку только для приложений с автоматическим обновлением" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Cсылка на пожертвования через OpenCollective должна быть в поле «OpenCollective:»" #: /usr/lib/python3.11/optparse.py msgid "Options" msgstr "Параметры" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Вывод отчета в формате JSON под именем файла APK." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." msgstr "Вывести JSON в stdout." #: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py #: ../fdroidserver/publish.py ../fdroidserver/signindex.py #: ../fdroidserver/update.py msgid "Outputting JSON" msgstr "Выводится JSON" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Основная лицензия проекта." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Заменить пустое значение versionName в {apkfilename} значением из метаданных: {version}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "Пакет {appid}\" уже существует" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" msgstr "Чтение манифеста: '{path}'" #: ../fdroidserver/common.py msgid "Password required with username" msgstr "Необходимо указать не только имя пользователя, но и пароль" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "Путь к рабочей директории проекта Android (если она не в его корне)." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" msgstr "Путь к Android SDK (можно настроить в переменной ANDROID_HOME)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" msgstr "Путь к репозиторию git, который будет отображться в логах" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" msgstr "Путь к хранилищу с ключом для подписывания" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Отобразить секретную переменную в терминале (чтобы ее было легче скопировать и вставить)" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" msgstr "Проблема с файлом ZIP: %s, ошибка %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" msgstr "Ошибка в xml '{path}'" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" msgstr "Запустить автоматическое обновление" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" msgstr "Подписывание {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" msgstr "Обработка данных {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" msgstr "Отобразить XML/JSON для индекс файлов в удобном для чтения виде" #: ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "URL-адрес проекта для импорта." #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" msgstr "Знаки препинания недопустимы" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" msgstr "Отправить лог в удаленный репозиторий git" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing binary transparency log to {url}" msgstr "Публикация лога прозрачности кода в {url}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" msgstr "Публикация в {url}" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" msgstr "Быстро создать новый репозиторий" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" msgstr "Прочесть все метаданные и выйти" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" msgstr "Чтение '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" msgstr "Не удалось извлечь packageName, внутреннюю или внешнюю версию приложения, поэтому APK считается непригодным: '{apkfilename}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" msgstr "Не удалось прочитать packageName/versionCode/versionName failed, APK недействителен: '{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" msgstr "Чтение {apkfilename} из кеша" #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Удаление выбранных файлов" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" msgstr "Удаление {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Переименовать все APK файлы, не соответствующие шаблону \"название.пакета_123.apk\"" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" msgstr "Режим обновления RepoTrunk имеет смысл только в репозиториях git-svn" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." msgstr "Сбросить все настройки и создать новый сервер сборки, даже если со старым все в порядке." #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" msgstr "Подпись {apkfilename} предоставленным отладочным ключом (debug.keystore)" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" msgstr "Изменить размер всех иконок, превышающих допустимое значение в пикселях, и выйти" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" msgstr "Показывать в выводе только предупреждения и ошибки" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Перезаписать все метаданные" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" msgstr "Перезапись '{appid}'" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" msgstr "Запустить для репозитория git с несохраненными изменениями" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Запустить rewritemeta для исправления ошибок форматирования" #: ../fdroidserver/deploy.py msgid "Running first pass with MD5 checking disabled" msgstr "Первая попытка загрузить данные (выполняется с отключенной проверкой MD5)" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" msgstr "Выполняется wget в {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" msgstr "SHA-256 {url} не соответствует записи!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Проскандировать получившиеся APK на известные несвободные классы." #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" msgstr "Сканировать исходный код пакета" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {apk}" msgstr "Сканирование обнаружило {count} проблем(ы) в {apk}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" msgstr "Сканирование обнаружило {count} ошибок в {appid}:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" msgstr "Сканирование обнаружило {count} ошибок в {appid}:{versionCode}:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "Сканирование обнаружило {} ошибку" msgstr[1] "Сканирование обнаружило {} ошибки" msgstr[2] "Сканирование обнаружило {} ошибок" #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "Сканирование APK с помощью dexdump на наличие известных несвободных классов." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" msgstr "Настройка NDK {release} ({version})" #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Настроить системное время с помощью:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" msgstr "Установить максимальный номер версии релиза в репозитории прежде чем более старые версии будут заархивированы" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" msgstr "Настроить ограничение для количества одновременно открытых файлов: {integer}" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" msgstr "Настроить ежедневную сборку приложения (nightly build)" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " msgstr "Не удалось настроить ограничение для количества одновременно открытых файлов: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" msgstr "Время ожидания для этой сборки выставляется в {0} секунд" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Подписать пакеты и поместить в репозиторий" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" msgstr "Подписать индексы созданные с \"update --nosign\"" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" msgstr "Пропустить сканирование исходного кода" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Неверная подпись '{apkfilename}', пропустить!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" msgstr "Пропуск зеркала GitLab Pages из-за слишком большого размера репозитория (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" msgstr "Пропустить генерацию индекса для {appid}" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" msgstr "Неверная подпись {apkfilename}, пропустить!" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" msgstr "Пропустить {appid}: отключено" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" msgstr "Выбрать локальную директорию, с которой будет синхронизирован репозиторий" #: ../fdroidserver/deploy.py msgid "Specify an identity file to provide to SSH for rsyncing" msgstr "Выбрать идентификационный файл (нужен SSH для rsync)" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." msgstr "Выбрать отладочный ключ." #: ../fdroidserver/common.py msgid "Spew out even more information than normal" msgstr "Писать очень подробные логи" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" msgstr "Удаление неизвестной подписи из {apkfilename}" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" msgstr "Короткое описание %s состоит из одного имени приложения" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" msgstr "Короткое описание приложения ({length} знаков) превышает допустимый лимит в {limit} знаков" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" msgstr "Системное время отстает от date в {path}!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" msgstr "Режим обновления тегов в настоящее время работает только для репозиториев git, hg, bzr и git-svn" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "Режим обновления тегов используется в git-svn, но репозиторий не был настроен с тегами" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Тестовый режим. Все собранное попадает во временную директорию; сборка запускается снова в любом случае." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" msgstr "Внутрення версия приложения из OBB файла должна следовать после \"{name}.\":" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" msgstr "Основной URL-адрес репозитория для отображения в логах (по умолчанию: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" msgstr "Директория для сохранения зеркала" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" msgstr "Файл для включения в репозиторий (путь или шаблон пути)" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." msgstr "Идентификационная метка (fingerprint) репозитория не совпадает с исходной." #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" msgstr "Корневой директории для local_copy_dir \"{path}\" нет!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" msgstr "Есть расхождения в алиасах ключей для подписывания. Публикация остановлена" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." msgstr "Это те приложения, которые были заархивированы из основного репозитория." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Это репозиторий приложений, предназначенных для использования в FDroid. Приложения в этом репозитории являются либо официальными бинарными файлами, созданными разработчиками оригинального приложения, либо бинарными файлами, созданными f-droid.org из исходного кода с помощью инструментов на https://gitlab.com/fdroid." #: ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Локальная копия метаданных репозитория уже существует: %s" #: ../fdroidserver/init.py #, python-format msgid "" "To complete the setup, add your APKs to \"%s\"\n" "then run \"fdroid update -c; fdroid update\". You might also want to edit\n" "\"config.yml\" to set the URL, repo name, and more. You should also set up\n" "a signing key (a temporary one might have been automatically generated).\n" "\n" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" "Для завершения настройки добавьте свои APK в \"%s\"\n" "затем запустите \"fdroid update -c; fdroid update\". Возможно, вы также захотите отредактировать\n" "\"config.yml\", чтобы задать URL, имя репозитория и многое другое. Вам также следует установить\n" "ключ подписи (временный ключ может быть сгенерирован автоматически).\n" "\n" "Дополнительная информация: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "и https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Необходимо определить переменные awsbucket, awssecretkey и awsaccesskeyid в config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "URL должна начинаться с https:// или http://" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" msgstr "URL-адреса сокращать нельзя" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" msgstr "URL-адрес {url} в описании приложения: {error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" msgstr "Неожиданная метка лицензии: \"{}\"! Используйте только метки, одобренные FSF или OSI из https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Неожиданная метка лицензии: \"{}\"! Используйте только метки, указанные в вашем файле настроек" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" msgstr "Неожиданная цель симлинка: {link} -> {target}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" msgstr "Неизвестная запись {key} в {configname}" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Произошла неизвестная ошибка!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" msgstr "Неизвестный файл '{filename}' в сборке '{versionName}'" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" msgstr "Неизвестный формат метаданных: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" msgstr "Неизвестный формат метаданных: {path} (используйте *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " msgstr "Неизвестная версия AAPT. Это может сломать сборку: " #: ../fdroidserver/lint.py msgid "Unnecessary leading space" msgstr "Лишний пробел в начале строки" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" msgstr "Лишний пробел в конце строки" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" msgstr "Неизвестное поле приложения '{fieldname}' в '{path}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Неизвестный флаг сборки '{build_flag}' в '{path}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" msgstr "Формат изображений \"{extension}\" не поддерживается" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" msgstr "Обнаружены изображения в неверном формате: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" msgstr "Внешняя библиотека не используется %s" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" msgstr "Файл не ипользуется %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" msgstr "Неиспользованный scandelete-путь: %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" msgstr "Неиспользованный scanignore-путь: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" msgstr "Распаковка в %s" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Обновить информацию о репозитории для новых пакетов" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" msgstr "Обновить лог степени прозрачности (binary transparency log) для URL-адреса" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData содержит некорректный URL-адрес: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" msgstr "UpdateCheckData должен соответствовать коду версии как целое число (\\d или [0-9]): {codeex}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" msgstr "URL-адрес в UpdateCheckData должен начинаться с HTTPS: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData содержит некорректный URL-адрес: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode настроен, но похоже, что команда checkupdates еще не была запущена" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "Имя приложения для проверки обновлений (UpdateCheckName) соответствует ID приложения — это поле можно удалить" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" msgstr "Загрузка {apkfilename} на androidobservatory.org" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" msgstr "Загрузка {apkfilename} на virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "Usage" msgstr "Использование" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Использование: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Указывайте /HEAD, а не /master, ссылаясь на файл в ветке по умолчанию" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Чтобы создать необходимые файлы метаданных, выполните `fdroid update -c`." #: ../fdroidserver/build.py msgid "Use build server" msgstr "Использовать сервер сборки" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" msgstr "Использовать время date из APK вместо текущего при добавлении новых APK" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." msgstr "Для конфигурации s3cmd используется \"{path}\"." #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "Используется схема подписи APK v2" #: ../fdroidserver/common.py msgid "Using APK Signature v3" msgstr "Используется схема подписи APK v3" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Проверка APK с помощью Java jarsigner. Так делать не следует! Пользуйтесь для этого apksigner" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" msgstr "Запуск androguard из \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" msgstr "Использование пустого словаря вместо содержимого {path}!" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" msgstr "Используются ключи из \"{path}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" msgstr "s3cmd синхронизация с: {url}" #: ../fdroidserver/__main__.py msgid "Valid commands are:" msgstr "Допустимые команды:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." msgstr "Сверяться с закешированной копией вместо того, чтобы загружать еще раз." #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" msgstr "Проверить целостность загруженных пакетов" #: ../fdroidserver/index.py msgid "Verifying index signature:" msgstr "Проверка подписи индекса:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "Через API VirusTotal нельзя загрузить файлы больше 32MB, загрузите {path} на {url} самостоятельно." #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Предупреждать о возможных ошибках в метаданных" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Даже если в конфигурации сборки задано подписывать индексы, то все равно cоздавать неподписанные индексы (только на данном этапе)" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "При проверке целого репозитория, yamllint по умолчанию отключен. Этот параметр принудительно включает yamllint." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "При генерации ключей использовалось различимое имя (Distinguished Name) стандарта X.509" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" msgstr "Путь к SDK можно указать в переменной ANDROID_HOME:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" msgstr "Архив ZIP" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" msgstr "добавление IdentiyFile в {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" msgstr "добавление в {name}:{path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "неоднозначный выбор: %(option)s совпадает с %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "неоднозначный выбор: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner не найден! Невозможно подписать или проверить актуальные APK-файлы" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "apksigner не найден, он необходим для создания подписи!" #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "ID приложения того файла, с которым будут производится операции" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" msgstr "ID приложения и внутренняя версия приложения (versionCode) в виде APPID[:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" msgstr "archive_url должен оканчиваться «/archive»" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "аргумент \"-\" c режимом %r" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" msgstr "аргумент %(argument_name)s: %(message)s" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" msgstr "попытка установить голое SSH-соединение для проверки ключа развертывания:" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" msgstr "не удалось разобрать спецификацию scrlib (не является строкой): '{}'" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "не удается открыть '%(filename)s': %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" msgstr "не удалось открыть не-https url: '{};" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" msgstr "не удалось найти необходимые srclibs: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "у субпарсера должен быть только один аргумент" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "не получается объединить действия: указаны две группы %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" msgstr "не получается опубликовать обновление. Ключ для развертывания (deploy key) существует?" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" msgstr "клонирование {url}" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" msgstr "Команды из подключаемых модулей:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" msgstr "комплекс" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "конфликтующая строка: %s" msgstr[1] "кофликтующие строки: %s" msgstr[2] "конфликтующих строк: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser alias: %s" msgstr "конфликтный псевдоним субпарсера: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser: %s" msgstr "конфликтный субпарсер:%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" msgstr "не удалось разобрать '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "не удалось разобрать спецификацию scrlib (не задана ссылка): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" msgstr "не удалось разобрать спецификацию scrlib (слишком много символов '@'): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" msgstr "создан {path}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" msgstr "текущая версия новее: old vercode={old}, new vercode={new}" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" msgstr "удаление: repo/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" msgstr "лог {path} загружен на {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "для параметра %r необходимо указать dest=" #: ../fdroidserver/scanner.py msgid "downloading '{}'" msgstr "загрузка '{}'" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" msgstr "не удалось загрузить подписи сканера с '{}'" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" msgstr "исполняемый бинарный файл, возможно код" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "необходимо указать %s аргумент" msgstr[1] "необходимо указать %s аргумента" msgstr[2] "необходимо указать %s аргументов" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "необходимо указать хотя бы один аргумент" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "можно указать только один аргумент" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "можно указать только один аргумент" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [<команда>] [-h|--help|--version|<аргументы>]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" msgstr "получить последнюю версию подписей из интернета" #: /usr/lib/python3.11/optparse.py msgid "floating-point" msgstr "с плавающей запятой" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "принудительно обрабатывать ошибки как предупреждения или игнорировать их." #: ../fdroidserver/common.py msgid "git svn clone failed" msgstr "команда git svn clone не выполнена" #: ../fdroidserver/scanner.py msgid "gzip file archive" msgstr "архив gzip" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "указанный аргумент %r проигнорирован" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 должен быть подписан, сделайте это с помощью `fdroid signindex`!" #: ../fdroidserver/index.py msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 должен быть подписан, сделайте это с помощью `fdroid signindex`!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" msgstr "число" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "неверное %(type)s значение: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "неверный выбор: %(value)r (следует выбрать из %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "неверное значение conflict_resolution: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "неверный синтаксис в строке параметра %(option)r: она должна начинаться с символа %(prefix_chars)r" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" msgstr "ipfs_cid не найдено, пропускаем генерацию CIDv1" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" msgstr "рецепт последней сборки более новый: old vercode={old}, new vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "local_copy_dir должна заканчиваться на \"fdroid\". Возможно, имелось в виду \"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" msgstr "Путь к local_copy_dir должен быть абсолютным!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" msgstr "local_copy_dir должна быть директорией, а не файлом!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" msgstr "адрес зеркала '%s' должен заканчиваться 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "взаимоисключающие аргументы не должны быть обязательными" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" msgstr "следующее обновление кэша {name} должно произойти {time}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" msgstr "{appid} не содержит поля \"icon\"" #: ../fdroidserver/signatures.py msgid "no APK supplied" msgstr "APK файл не указан" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" msgstr "такого параметра нет: %s" #: ../fdroidserver/__main__.py msgid "no version info found!" msgstr "определить версию не удалось!" #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "информация о версии не найдена" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "недопустимо с аргументом %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "необходимо указать хотя бы один аргумент из списка %s" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" msgstr "принимает строки, списки и туплы" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "параметр %s: если вы действительно хотите установить все подписанные приложения, то используйте --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "параметр %s: неверное %s значение: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "параметр %s: неверный выбор: %r (следует выбрать из %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" msgstr "параметр -%s не распознан" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" msgstr "параметр -%s требует аргумент" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "параметру --%s не нужны аргументы" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "параметр --%s не является уникальным префиксом" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" msgstr "параметр --%s не распознан" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s requires argument" msgstr "параметру --%s нужен аргумент" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "необязательные аргументы" #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "параметры" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" msgstr "перезапись существующего пути {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "позиционные аргументы" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" msgstr "Не удалось загрузить лог {path} на {dest}!" #: ../fdroidserver/build.py msgid "reference binary missing signature" msgstr "эталонный двоичный файл с отсутствующей подписью" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" msgstr "использовать для загрузки небезопасное HTTP-соединение не стоит (пользуйтесь HTTPS или укажите --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." msgstr "значок репозитория (repo_icon) 'repo/icons/%s' не существует, генерируется суррогат." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" msgstr "repo_url должен оканчиваться «/repo»" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml не установлен, не получается записать метаданные." #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd синхронизировать индексы из {path} в {url} и удалить их" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "кэш сканера поврежден! Вы можете очистить его с помощью: '{clear}'" #: ../fdroidserver/scanner.py msgid "shared library" msgstr "разделяемая библиотека" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" msgstr "показать номер версии программы и выйти" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" msgstr "показать это справочное сообщение и выйти" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." msgstr "подписанный APK файл (путь к файлу или URL-адрес, начинающийся с HTTPS)." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" msgstr "пропустить загрузку подробного лога сборки: лог пустой" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" msgstr "пропустить загрузку подробного лога сборки: логи отключены при конфигурации" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" msgstr "пропустить для архива с исходниками: {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" msgstr "библиотеки srclib: имя отсутствует или не содержит символа @" #: ../fdroidserver/scanner.py msgid "static library" msgstr "статическая библиотека" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" msgstr "предоставленный эталонный двоичный файл разрешил подписанту {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "требуются аргументы: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "неизвестная строка параметра: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "неизвестный парсер %(parser_name)r (следует выбрать из %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "неизвестные аргументы: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "небезопасные права доступа к файлу '{config_file}' (должны быть 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "использование: " #: ../fdroidserver/deploy.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" msgstr "Аpache libcloud: синхронизация с {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com ограничивает траффик, ждем повторной попытки..." #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" msgstr[0] "{0} приложение, {1} алиасов ключей для подписывания" msgstr[1] "{0} приложения, {1} алиасов ключей для подписывания" msgstr[2] "{0} приложений, {1} алиасов ключей для подписывания" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" msgstr "Не обнаружено метаданных для {apkfilename} ({appid})!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" msgstr "У {apkfilename} несколько файлов {name}. Выглядит подозрительно и похоже на попытку нарушения безопасности (Master Key exploit)!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "AndroidManifest.xml приложения {apkfilename} содержит неверную дату: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "У {appid} нет имени! Будет использовано ID приложения." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" msgstr "{appid} из {path} не годится в качестве ID приложения Android!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid} из {path} не годится в качестве имени пакета Java!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" msgstr "{appid} содержит как APK, так и файлы: {files}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" msgstr "В {appid} нет {name}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" msgstr "{appid}: неизвестная внешняя библиотека {path} в сборке '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" msgstr "{appid}: ревизия сборки не указана, сборка будет запущена для кода в текущем состоянии" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" msgstr "{appid}: {field} должно быть '{type}', а не '{fieldtype}!'" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" msgstr "{appid}: {field} должно быть '{type}', а не '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} должен быть целым числом, но найдено значение: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be list or string, found: {value}" msgstr "{build_flag} должен быть списком или строкой, найдено: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" msgstr "{file} пустой или поврежденный!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name}: \"{section}/icons/{path}\" не существует! Поправьте свой \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} признан устаревшим; используйте {newfile}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "{path} уже существует, результаты импорта игнорируются!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" msgstr "{path} не существует! Создайте, выполнив команду:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path}: неверная подпись \"{pattern}\". Выглядит подозрительно и похоже на попытку нарушения безопасности (Janus exploit)!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" msgstr "размер {path} равен нулю!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" msgstr "Размер {path} больше 200MB, загрузите его вручную на {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "Адрес {url} должен заканчиваться на \"fdroid\". Проверьте URL-адрес!" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "Адрес {url} должен начинаться с \"http\"!" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" msgstr[0] "{} сломанная сборка" msgstr[1] "{} сломанных сборки" msgstr[2] "{} сломанных сборок" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} успешная сборка" msgstr[1] "{} успешные сборки" msgstr[2] "{} успешных сборок" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/locale/sq/0000755000175000017500000000000014620351546014672 5ustar00hanshans././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.888382 fdroidserver-2.3a1/locale/sq/LC_MESSAGES/0000755000175000017500000000000014620351546016457 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/locale/sq/LC_MESSAGES/fdroidserver.po0000644000175000017500000027125614620351225021524 0ustar00hanshans# SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # Besnik Bleta , 2020, 2021, 2022, 2023, 2024. # Hans-Christoph Steiner , 2020, 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2024-02-20 18:58+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" "Language: sq\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" "\n" "Kyç SSH Publik për t’u përdorur si kyç sendërtimesh:" #: ../fdroidserver/nightly.py #, python-brace-format msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" "\n" "{path} i koduar për ndryshoren e fshehtë DEBUG_KEYSTORE:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" msgstr "“%s/”\" s’ka kartelë tejtëdhënash me përputhje!" #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" msgstr "“local_copy_dir” {path} s’ekziston!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "'{apkfilename}' është tashmë e instaluar në {dev}." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" msgstr "“{path}” përmban {name} të vjetruar ({version})" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" msgstr "“{path}” përmban {name} të freskët ({version})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" msgstr "“{path}” ekziston, por s3cmd s’është e instaluar!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" msgstr "“{path}” s’është format kartelash i mbuluar (përdorni: metadata/*.yml)" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "“{path}” është nënshkruar me një kyç që s’lejohet:" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "“{url}” s’është URL e vlefshme!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" msgstr[0] "Mundësi %(option)s lyp %(number)d argument" msgstr[1] "Mundësi %(option)s lyp %(number)d argumente" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: gabim: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" msgstr "U gjetën %d probleme" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "%prog [options]" msgstr "%prog [mundësi]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" msgstr "%r s’mund të thirret" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" msgstr "%s s’prodhoi një “dict”!" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" msgstr "%s ka SHA-256 të gabuar: %s" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" msgstr "%s s’është fushë e pranuar montimi" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" msgstr "Mundësia %s s’merr ndonjë vlerë" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "S’u gjet 'keypass' në config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' është NONE dhe 'smartcardoptions' është e zbrazët!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "S’u gjet 'keystore' në config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "S’u gjet 'keystorepass' te config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "S’u gjet 'repo_keyalias' te config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' është argument i pavlefshëm për pozicionalë" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" msgstr "'sdk_path' te 'config.yml' s’është ujdisur!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' është shumë i vjetër, fdroid lyp build-tools-{version} ose më të ri!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" msgstr "'{field}' do të jetë sipas një rendi kuturu! Nëse rendi është i rëndësishëm, përdorni kllapa () ose []!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" msgstr "S’u arrit të përmbushet '{path}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' ka format të pavlefshëm, duhet të jetë një fjalor!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' s’është një {field} e vlefshme te {appid}. Rregullsi shprehjeje të rregullt: {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' s’është një {field} e vlefshme, duhet të jetë {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" msgstr "…checkupdate dështoi për {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() e pacaktuar" #: ../fdroidserver/lint.py msgid "/issues is missing" msgstr "/issues mungon" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" msgstr "Lypset një URL si argument!" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Shtoni për paketa në depo nënshkrime PGP duke përdorur GnuPG-në" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" msgstr "Shtoni te një depo e panënshkruar një kyç nënshkrimi depoje" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" msgstr "Shtoni kartela tejtëdhënash skeleton për APK ku mungojnë të tilla" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" msgstr "Po shtohet depo e re për vetëm {name}" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" msgstr "Alias i kyçit të nënshkrimeve të depos te depo kyçesh" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" msgstr "" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Lejon të specifikohet një rishikim tjetër (ose kryeni “git branch”) për importimin fillestar" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" msgstr "Pasqyro gjithashtu pjesën e arkivit të plotë" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" msgstr "Sinjalizo gjithashtu mbi probleme formatimi, bie fjala, rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" msgstr "Librari Android AAR" #: ../fdroidserver/scanner.py msgid "Android APK file" msgstr "Kartelë APK Android" #: ../fdroidserver/scanner.py msgid "Android DEX code" msgstr "Kod DEX Android" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" msgstr "S’u gjet SDK Android-i në {path}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" msgstr "Shtegu Android SDK '{path}' s’ekziston!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" msgstr "Shtegu Android SDK '{path}' s’është drejtori!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" msgstr "S’u gjet {cmd} mjeti SDK-je Android!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "Aplikacioni ka Dyorë, por s’ka AllowedAPKSigningKeys përkatës për të fiksuar dëshmi." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Aplikacioni ka NoSourceSince ose ArchivePolicy “0 versione”, por AutoUpdateMode ose UpdateCheckMode janë vënë si “Asnjë”" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" msgstr "Aplikacioni gjendet në '{repo}' por ka një lidhje te {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "Aplikacioni ka dyor, por s’ka AllowedAPKSigningKeys përkatës për të fiksuar dëshmi." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "S’është i nevojshëm shtimi i .git nga pas" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" msgstr "Po arkivohet {apkfilename} me nënshkrim të pavlefshëm!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode me UpdateCheckMode: HTTP duhet të ketë një rregullsi." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" msgstr "Lloj i gabuar zëri “{mirrortype}” në formësim pasqyrash: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "URL bazë për t’u pasqyruar, mund të përfshijë kyçin e nënshkrimit të treguesit që përdor vargun e kërkimi: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" msgstr "Dega '{branch}' u përdor si “commit” në montimin '{versionName}'" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" msgstr "Dega '{branch}' u përdorur si “commit” në srclib '{srclib}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" msgstr "Simlidhje e dëmtuar: {path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" msgstr "Montoni një paketë nga burimi" #: ../fdroidserver/build.py msgid "Build all applications available" msgstr "Monto krejt aplikacionet e mundshme" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" msgstr "Montim i prodhuar nga `fdroid import` - hiqni rreshtin e çaktivizimit, pasi të jetë gati" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" msgstr "Depoja git e tejtëdhënave të montimit ka ndryshime të paparashtruara!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" msgstr "Monto vetëm versionin më të ri të çdo pakete" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" msgstr "Depo montimesh e bazua në “%s” me këtë formësim:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" msgstr "S’kryhet dot “auto-update app” pa CurrentVersionCode" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "S’montohet dot, për shkak të {} gabimi teksa skanohej" msgstr[1] "S’montohet dot, për shkak të {} gabimeve teksa skanohej" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" msgstr "S’rishkruhet dot “{path}”" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "Kategoritë '%s' s’janë të vlefshme" #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "S’janë ujdisur kategori" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Kontrollo për përditësime aplikacionesh" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Po kontrollohet arkivimi për {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Përditësim nha e para - mos përdor fshehtina, ripërpuno krejt APK-të" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Listë kategorish ndarë me presje." #: ../fdroidserver/__main__.py #, python-format msgid "Command '%s' not recognised.\n" msgstr "Urdhër '%s' jo i pranuar.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" msgstr "Depozito ndryshimet" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" msgstr "Përkufizime “{field}” me përplasje, mes kartelash .yml dhe të përkthyerash:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argumente që përplasen: '--verbose' dhe '--quiet' s’mund të përdoren në të njëjtën kohë." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" msgstr "Kartela formësimi me përplasje! Po përdoret {newfile}, po shpërfillet {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "Në sistemin tuaj s’u gjet '{command}'" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "S’u gjet dot kod i versionit më të ri" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "S’u gjet dot emër i versionit më të ri" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" msgstr "S’u gjet dot {path} për ta hequr" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " msgstr "S’u hap dot kartela APK {path} për analizim : " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "S’u përtyp dot madhësia “{size}”, lloj i gabuar “{type}”" #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "S’u gjet dot ID Aplikacione" #: ../fdroidserver/checkupdates.py msgid "Couldn't find any version information" msgstr "S’u gjet dot ndonjë hollësi versioni" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "S’u gjet dot ID pakete" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" msgstr "Po refuzohet me burracakëri të mbishkruhet ujdisje ekzistuese kyçesh nënshkrimi!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" msgstr "U krijua kontejner i ri “{name}”" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Po krijohet “{path}” për formësim të s3cmd." #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Po krijohet drejtori regjistrash" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" msgstr "Po krijohet S3 bucket i ri: {url}" #: ../fdroidserver/publish.py msgid "Creating output directory" msgstr "Po krijohet drejtori përfundimesh" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" msgstr "Po krijohet tregues i nënshkruar me këtë kyç (SHA256):" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" msgstr "Po krijohet drejtori e përkohshme" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" msgstr "Po krijohet tregues i panënshkruar, si përgatitje për nënshkrim" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" msgstr "CurrentVersionCode {cv} është më i vogël sesa zëri {versionCode} i montimit më të vjetër" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" msgstr "DEBUG_KEYSTORE s’është ujdisur ose vlera është e paplotë" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" msgstr "Fshi APK-ra dhe/ose OBB-ra pa tejtëdhëna prej depos" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" msgstr "Po fshihet arkivi, depoja është shumë e madhe ({size} maks. {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" msgstr "Po fshihet historik git-mirror, depoja është shumë e madhe ({size} maks. {limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" msgstr "Po fshihet kartelë e panjohur: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" msgstr "Përmbledhja '%s' është thjesht përmbledhja e aplikacionit" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" msgstr "Përshkrimi ka një rresht të përsëdytur" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" msgstr "Përshkrimi ka një listë (%s), por kjo s’është as me toptha (*), as e numërtuar (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" msgstr "Përshkrimi me gjatësi {length} është mbi kufirin prej {limit} shenjash" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Mos shtoni 'disable:' te zëra të prodhuar të montimit" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" msgstr "Mos i vendos kartelat e reja te depoja" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" msgstr "Mos përfshi “{path}” në URL!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" msgstr "Mos kërko shteg SDK-je Android, thjesht dështo" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" msgstr "Mos i hiq kyçet private të prodhuar nga depo kyçesh" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" msgstr "Mos krijo një paketë tar burimi, e dobishme kur testohet një montim" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" msgstr "Mos rifresko depon, e dobishme kur testohet një montim pa lidhje internet" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" msgstr "Mos përdorni checksum-e rsync-u" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Shkarko pasqyra të plota deposh të vogla" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" msgstr "Po shkarkohet %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Shkarkimi i depos dështoi një herë, s’po riprovohet." #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" msgstr "Shkarkimi i {url} dështoi. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" msgstr "" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" msgstr "Zë i përsëdytur “%s” në formësim pasqyrash!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" msgstr "Lidhje e përsëdytur te '{field}': {url}" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "GABIM: Nënurdhri “server” është hequr, përdorni “deploy”!" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" "GABIM: ky urdhër s’duhet përdorur kurrë për krijimin e një pasqyre të f-droid.org!\n" "Një pasqyrë e plotë e f-droid.org lyp më tepër se 200GB." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "GABIM: lloj CI i pambuluar, arnimet janë të mirëpritura!" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "GABIM: strehë git “%s” që nuk mbulohet, arnimet janë të mirëpritura!" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." msgstr "Si kodim është caktuar '{enc}'. Fdroid mund të hasë probleme kodimi. Për përfundimet më të mira, caktojeni si 'UTF-8'." #: ../fdroidserver/init.py #, python-format msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" "Jepni shtegun për te Android SDK (%s) këtu:\n" "> " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" msgstr "S’është ujdisur ndryshore {var} nga {configname}!" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Gabim teksa merrej adresë depoje" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" msgstr "Dil me një kod jozero, nëse gjenden probleme" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Përftoji tejtëdhënat e aplikacionit prej një depoje burim" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Përfto nënshkrime prej APK-sh" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" msgstr "S’u arrit të kopjohej {path}: {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" msgstr "S’u arrit të sillen nënshkrime për '{apkfilename}': {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" msgstr "S’u arrit të lexohej {path}: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" msgstr "S’u arrit të ripërmasohej {path}: {error}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" msgstr "S’u arrit të krijohej bucket S3: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" msgstr "S’u arrit të merren të dhëna APK-je, po fshihet {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" msgstr "S’u arrit të merren të dhëna APK-je, po anashkalohet {path}" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" msgstr "S’u arrit të merren shenja gishtash kyçi nënshkrimi APK-je" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" msgstr "S’u arrit të instalohej '{apkfilename}' në {dev}: {error}" #: ../fdroidserver/common.py msgid "Failed to sign application" msgstr "S’u arrit të nënshkruhej aplikacioni" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" msgstr "U soll buildserverid prej VM-je: {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" msgstr "U sollën nënshkrime për '{apkfilename}' -> '{sigdir}'" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" msgstr "Kartela u zhduk teksa përpunohej: {path}" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py #: ../fdroidserver/update.py msgid "Finished" msgstr "Përfundoi" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" msgstr "Metodat e dhurimit përmes Flattr-i i takojnë fushës FlattrID:" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Etiketa HTML të ndaluara" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." msgstr "Detyro montim aplikacionesh të çaktivizuara, dhe vazhdon pavarësisht problemesh skanimi. E lejuar vetëm nën mënyrën testim." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" msgstr "Detyro ndaljen e montimit pas {0} sek. mbarimi kohe!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." msgstr "Detyro skanim aplikacionesh dhe montimesh të çaktivizuara." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" msgstr "U gjet grafik “{path}” pa tejtëdhëna për aplikacionin “{name}”!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "U gjet kartelë e dëmtuar themeli “{path}” për “{name}”:" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" msgstr "U gjetën appid-e të pavlefshëm te argumente" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "U gjetën versionCodes të pavlefshëm për disa aplikacione" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Te {path} u gjetën Kartela të shumta JAR Blloqesh Nënshkrimi" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" msgstr "U gjetën kartela të shumta tejtëdhënash për {appid}" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." msgstr "U gjetën dëshmi të shumta nënshkrimi për depon." #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." msgstr "S’u gjetën dëshmi nënshkrimi për depon." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" msgstr "U gjet jo-kartelë te %s" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" msgstr "U gjet {apkfilename} te {url}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} problems in {filename}" msgstr "U gjetën {count} probleme te {filename}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" msgstr "U gjetën {count} sinjalizime te {filename}" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" msgstr "U prodhuan tejtëdhëna skeleton për {appid}" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" msgstr "Veprimi “git checkout” për '%s' dështoi" #: ../fdroidserver/common.py msgid "Git clean failed" msgstr "Veprimi “git clean” dështoi" #: ../fdroidserver/common.py msgid "Git fetch failed" msgstr "Veprimi “git fetch” dështoi" #: ../fdroidserver/common.py msgid "Git prune failed" msgstr "Veprimi “git prune” dështoi" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Veprimi “git remote set-head” dështoi: “%s”" #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Veprimi “git reset” dështoi" #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Veprimi “git submodule sync” dështoi" #: ../fdroidserver/common.py msgid "Git submodule update failed" msgstr "Veprimi “git submodule update” dështoi" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" msgstr "Me URL Subversion duhet përdorur HTTPS!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" msgstr "Nëse një pasqyrë git bëhet shumë e madhe, lejoje arkivin të fshihet" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" msgstr "Nëse ky ngarkim dështon, provoni ta ngarkoni dorazi te {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." msgstr "Po shpërfillet '{field}' te tejtëdhëna '{metapath}', ngaqë është nxjerrë nga përdorimi." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "Po shpërfillen zëra FUNDING.yml më të gjatë se 2048: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" msgstr "Po shpërfillet element i gabuar në manifest: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Po shpërfillet paketë pa tejtëdhëna: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" msgstr "Po shpërfillen të dhëna të ndenjura fshehtine për {apkfilename}" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" msgstr "Përfshi APKra që janë nënshkruar me algoritme të çaktivizuar, bie fjala, me MD5" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" msgstr "Përfshi te pasqyra kartela .asc nënshkrimi PGP" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" msgstr "Përfshi te pasqyra regjistrat e montimeve" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" msgstr "Përfshi te pasqyra paketa tarball" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" msgstr "Me përfshirje tejtëdhënash nga %s@%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" msgstr "Me përfshirje tejtëdhënash nga {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Po gatiten nënmodule" #: ../fdroidserver/install.py msgid "Install all signed applications available" msgstr "Instalo krejt aplikacionet e nënshkruara që mundet" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" msgstr "Instalo në pajisje paketat montuara" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." msgstr "Po instalohet %s…" #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." msgstr "Po instalohet '{apkfilename}' në {dev}…" #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" msgstr "Ndërveproni me shërbyesin HTTP të depos" #: ../fdroidserver/update.py msgid "Invalid APK" msgstr "APK e pavlefshme" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" msgstr "AutoUpdateMode e Pavlefshme: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" msgstr "UpdateCheckMode i pavlefshëm: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" msgstr "VercodeOperationi pavlefshëm: {field}" #: ../fdroidserver/lint.py #, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "VercodeOperation i pavlefshëm: {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "ID e pavlefshme aplikacioni {appid}" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" msgstr "Bulean i pavlefshëm '%s'" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Listë me toptha e pavlefshme" #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" msgstr "Emër i pavlefshëm për kartelë të botuar: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" msgstr "Zë ndk: i pavlefshëm në montim: \"{ndk}\"" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " msgstr "Ridrejtim i pavlefshëm te non-HTTPS: {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" msgstr "Tejtëdhëna scrlib të pavlefshme: '{file}' s’ekziston" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" msgstr "Tejtëdhëna srclib të pavlefshme: s’u përtyp dot '{file}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" msgstr "Tejtëdhëna srclib të pavlefshme: kyçi panjohur '{key}' te kartela '{file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" msgstr "Dështoi verifikimi i nënshkrimit JAR: {path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" msgstr "Nënshkrimi JAR u verifikua: {path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" msgstr "Kartelë JAR Java" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" msgstr "S’u gjet Java JDK! Instalojeni në vendndodhje standarde ose caktoni java_paths!" #: ../fdroidserver/scanner.py msgid "Java compiled class" msgstr "Klasë Java e përpiluar" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" msgstr "S’u gjet Java jarsigner! Instalojeni në vendndodhje standarde ose caktoni java_paths!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" msgstr "Javascript në atribute src HTML" #: ../fdroidserver/build.py #, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" msgstr "Po mbahet montim i dështuar “{apkfilename}”" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Depo kyçesh për kyç nënshkrimi:\t" #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" msgstr "Parashtrimi '{commit}' i përdorur së fundi duket si etiketë, por si UpdateCheckMode është '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" msgstr "Metodat e dhurimit përmes Liberapay i takojnë fushës Liberapay:" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted (dry run)" msgstr "Paraqit kartela që do të duhej të riformatoheshin (dry run)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "Vendore e përfshirë te URL f-droid.org" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" msgstr "Bëje montimin të ndalet kur has përjashtime" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." msgstr "Pasqyra depoje të keqformuara." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" msgstr "Rresht serverwebroot i keqformuar:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" msgstr "U mbërrit në thellësi maksimum rekursive te kartelë ZIP: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Pasqyro depon e plotë dhe arkivin, krejt llojet e kartelave." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" msgstr "Mungon drejtori përfundimesh" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" msgstr "Po kalohen pohime Anti-Features te kartela të përkthyera:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "Te config.yml s’është ujdisur as “repo_pubkey”, as “keystorepass”" #: ../fdroidserver/verify.py #, python-format msgid "No APK for package: %s" msgstr "S’ka APK për paketën: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "S’u gjet SDK Android!" #: ../fdroidserver/install.py msgid "No attached devices found" msgstr "S’u gjetën pajisje të bashkëngjitura" #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "S’ka shenja gishtash te URL-ja." #: ../fdroidserver/common.py msgid "No git submodules available" msgstr "S’ka “git submodules”" #: ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "S’u gjet dot projekt gradle. Të specifikohet --subdir?" #: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "S’u gjetën të dhëna." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" msgstr "S’u gjetën etiketa me përputhje" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." msgstr "Te {0} s’u gjet version minimum SDK-je, po përdoret parazgjedhja (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "S’ka nevojë të specifikohet që aplikacioni është Software i Lirë" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" msgstr "S’ka nevojë të specifikohet që aplikacioni është për Android" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "S’ka mundësi të ujdisur! Përpunoni config.yml tuaj që të ujdisni të paktën një prej:" #: ../fdroidserver/common.py msgid "No packages specified" msgstr "S’u specifikuan paketa" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" msgstr "S’ka të gatshme APK të nënshkruara për %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" msgstr "S’ka drejtori output-i të nënshkruar - s’ka ç’bëhet" #: ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" msgstr "S’u gjetën dëshmi nënshkrimi te {path}" #: ../fdroidserver/common.py #, python-format msgid "No such package: %s" msgstr "S’ka paketë të tillë: %s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" msgstr "S’ka versionCode {versionCode} për aplikacionin {appid}" #: ../fdroidserver/checkupdates.py msgid "No tags found" msgstr "S’u gjetën etiketa" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" msgstr "S’ka drejtori të panënshkruar - s’ka ç’bëhet" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Përkufizim jo i vlefshëm për madhësinë: “{}”" #: ../fdroidserver/signindex.py msgid "Nothing to do" msgstr "S’ka ç’bëhet" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." msgstr "S’ka ç’bëhet për {appid}." #: ../fdroidserver/init.py msgid "Now set these in config.yml:" msgstr "Tani, ujdisini këto te config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" msgstr "Kartela OBB ka versionCode({integer}) më të ri se sa cilado APK:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" msgstr "Emri i kartelës OBB duhet të fillojë me “main.” ose “patch.”:" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" msgstr "packagename i OBB-së nuk përputhet me ndonjë APK të mbuluar:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Makinë jo në linjë, po anashkalohet prodhim pasqyre git, deri sa `fdroid deploy`" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Si formate grafike mbulohen vetëm PNG dhe JPEG, u gjet: {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Shtyp vetëm dallimet me Play Store-in" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Kryeje vetëm për aplikacione me vetëpërditësime" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Metodat e dhurimit përmes OpenCollective i takojnë fushës OpenCollective:" #: /usr/lib/python3.11/optparse.py msgid "Options" msgstr "Mundësi" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Hidhe raportin JSON te kartelë e emërtuar sipas APK-sh." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." msgstr "" #: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py #: ../fdroidserver/publish.py ../fdroidserver/signindex.py #: ../fdroidserver/update.py msgid "Outputting JSON" msgstr "" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Licenca e përgjithshme e projektit." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Po anashkalohet versionName i zbrazët te {apkfilename} prej tejtëdhënash: {version}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "Paketa “{appid}” ekziston tashmë" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" msgstr "Po përtypet manifest te '{path}'" #: ../fdroidserver/common.py msgid "Password required with username" msgstr "Me emrin e përdoruesit lypset fjalëkalim" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "Shteg për te nëndrejtoria e projektit kryesor Android, në mos qoftë rrënja." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" msgstr "Shteg për te SDK Android-i (ndonjëherë caktuar te ANDROID_HOME)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" msgstr "Shteg për te depo git për t’u përdorur si regjistri" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" msgstr "Shteg për te depo kyçesh për kyçin e nënshkrimit të depos" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Shtype ndryshoren e fshehtë te terminali, për kopjim/ngjitje të kollajtë" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" msgstr "Problem me kartelën ZIP: %s, gabim %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" msgstr "Problem me xml-në te '{path}'" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" msgstr "Kryeji vetëpërditësimet" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" msgstr "Po përpunohet {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" msgstr "Po përpunohet {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" msgstr "Për kartela treguesish, prodho XML/JSON të lexueshëm nga syri njerëzor" #: ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "URL prej nga të importohet projekt." #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" msgstr "Pikësimi duhet shmangur" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" msgstr "Kryej push të regjistrit te kjo depo e largët git" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing binary transparency log to {url}" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" msgstr "" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" msgstr "Filloni shpejt e shpejt një depo të re" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" msgstr "Lexo krejt kartelat e tejtëdhënave dhe dil" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" msgstr "Po lexohet '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" msgstr "Leximi i packageName/versionCode/versionName dështoi, APK e pavlefshme: '{apkfilename}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" msgstr "Leximi i packageName/versionCode/versionName dështoi, APK e pavlefshme: '{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" msgstr "Po lexohet {apkfilename} prej fshehtine" #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Po hiqen kartelat e treguara" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" msgstr "Po hiqet {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Riemërtoni kartelat APK që nuk përputhen me package.name_123.apk" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" msgstr "Mënyra “RepoTrunk” ka kuptim vetën në depo git-svn" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." msgstr "Zeroje dhe krijo një shërbyes montimesh të ri fringo, edhe nëse ai ekzistuesi duket të jetë në rregull." #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" msgstr "Po rinënshkruhet {apkfilename} me debug.keystore e furnizuar" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" msgstr "Ripërmaso krejt ikonat që tejkalojnë madhësinë maksimum në piksel dhe dil" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" msgstr "Kufizoje output-in në sinjalizime dhe gabime" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Rishkruaj krejt kartelat e tejtëdhënave" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" msgstr "Po rishkruhet '{appid}'" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" msgstr "Xhirojeni në depo git që ka ndryshime të padepozituara te dega vendore" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Që të ndreqet formatimi, xhironi rewritemeta" #: ../fdroidserver/deploy.py msgid "Running first pass with MD5 checking disabled" msgstr "Po xhirohet kalimi i parë me kontrollin MD5 të çaktivizuar" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" msgstr "Po xhirohet wget te {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" msgstr "" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Kontrollo për klasa jo të lira të ditura APK-në(të) e prodhuara." #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" msgstr "Skanoni kodin burim të një pakete" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {apk}" msgstr "Kontrolli gjeti {count} probleme te {apk}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" msgstr "Kontrolli gjeti {count} probleme te {appid}:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" msgstr "Kontrolli gjeti {count} probleme te {appid}:{versionCode}:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "Kontrolli gjeti {} problem" msgstr[1] "Kontrolli gjeti {} probleme" #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "Po kontrollohet APK me “dexdump” për klasa të ditura jo të lira." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" msgstr "" #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Vëre sahatin në atë kohë duke përdorur:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" msgstr "Caktoni numër maksimum hedhjesh në qarkullim, përpara se të arkivohen të vjetrat" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" msgstr "Si kufi hapjeje kartele cakto {integer}" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" msgstr "Ujdisni një montim aplikacioni për një depo montimesh të përnatshme" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " msgstr "Dështoi ujdisje kufiri hapjesh kartelash: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" msgstr "Po ujdiset mbarim kohe {0} sekonda për këtë montim" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Nënshkruani dhe vendosni paketa te depoja" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" msgstr "Tregues nënshkrimi të krijuar duke përdorur “update --nosign”" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" msgstr "Anashkalo skanimin e kodit burim për dyorë dhe probleme të tjera" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Po anashkalohet '{apkfilename}' me nënshkrim i pavlefshëm!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" msgstr "Po anashkalohet pasqyrë GitLab Pages, ngaqë depoja është shumë e madhe (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" msgstr "Po anashkalohet prodhim treguesi për {appid}" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" msgstr "Po anashkalohet {apkfilename} me nënshkrim të pavlefshëm!" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" msgstr "Po anashkalohet {appid}: e çaktivizuar" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" msgstr "Specifikoni një dosje vendore te e cila të njëkohësohet depoja" #: ../fdroidserver/deploy.py msgid "Specify an identity file to provide to SSH for rsyncing" msgstr "Specifikoni një kartelë identiteti për t’ia furnizuar SSH-s për njëkohësim me rsync-un" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." msgstr "Specifikoni cila kartelë depoje kyçesh diagnostikimesh të përdoret." #: ../fdroidserver/common.py msgid "Spew out even more information than normal" msgstr "U la të rrjedhë edhe më tepër informacion se sa normalisht" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" msgstr "Po hiqet nënshkrim i mistershëm prej {apkfilename}" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" msgstr "Përmbledhja '%s' është thjesht emri i aplikacionit" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" msgstr "Përmbledhja me gjatësi {length} është mbi kufirin prej {limit} shenjash" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" msgstr "Ora e sistemit është më herët se sa data në {path}!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" msgstr "Aktualisht, mënyra “tags update” funksionon vetëm për depo git, hg, bzr dhe git-svn" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "U përdor mënyra “tags update” në git-svn, por depoja s’qe ujdisur me etiketa" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Mënyra testim - hidhe output-in vetëm te drejtoria tmp, dhe monto përherë, edhe nëse output-i ekziston tashmë." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" msgstr "Kodi për versionin OBB duhet të vijë pas “{name}.”:" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" msgstr "URL bazë për depon për regjistrim (parazgjedhje: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" msgstr "Drejtoria ku të shkruhet pasqyra" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" msgstr "Kartela që duhet përfshirë te depoja (shteg ose shenjë e gjithëpushtetshme)" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." msgstr "Shenjat e gishtave të depos nuk përputhen." #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" msgstr "Drejtoria rrënjë për local_copy_dir “{path}” s’ekziston!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" msgstr "Ka një përplasje keyalias-i - botimi u ndal" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." msgstr "Këto janë aplikacionet që janë arkivuar nga depoja kryesore." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Kjo është një depo aplikacionesh për t’u përdorur me F-Droid. Aplikacionet në këtë depo ose janë dyorë zyrtarë të montuar nga zhvilluesit e aplikacionit origjinal, ose janë dyorë të montuar nga burimi prej f-droid.org duke përdorur mjetet në https://gitlab.com/fdroid." #: ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Kjo depo ka tashmë tejtëdhëna vendore: %s" #: ../fdroidserver/init.py #, python-format msgid "" "To complete the setup, add your APKs to \"%s\"\n" "then run \"fdroid update -c; fdroid update\". You might also want to edit\n" "\"config.yml\" to set the URL, repo name, and more. You should also set up\n" "a signing key (a temporary one might have been automatically generated).\n" "\n" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" "Që të plotësoni ujdisjen, shtojini APK-të tuaja te “%s”,\n" "mandej kryeni “fdroid update -c; fdroid update”. Mund të doni edhe\n" "të përpunoni “config.yml”, për të caktuar URL-në, emrin e depos, etj.\n" "Duhet të ujdisni edhe një kyç nënshkrimesh (një i tillë i përkohshëm\n" "mund të jetë prodhuar automatikisht).\n" "\n" "Për më tepër hollësi: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "dhe https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Për të përdorur awsbucket, te config.yml duhen ujdisur edhe awssecretkey dhe awsaccesskey!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "URL-ja duhet të fillojë me https:// ose http://" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" msgstr "S’duhen përdorur shkurtues URL-sh" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" msgstr "URL {url} te Përshkrim: {error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" msgstr "Etiketë licence “{}” e papritur! Përdorni vetëm etiketa të miratuara nga FSF ose OSI, prej https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Etiketë e papritur licence “{}”! Përdorni vetëm etiketa licencash të formësuara te kartela e formësimit tuaj" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" msgstr "Vendmbërritje e papritur lidhjeje simbolike: {link} -> {target}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" msgstr "Zë i panjohur {key} në {configname}" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "U gjet përjashtim i panjohur!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" msgstr "Kartelë e panjohur '{filename}' te montimi '{versionName}'" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" msgstr "Format i panjohur tejtëdhënash: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" msgstr "Format i panjohur tejtëdhënash: {path} (përdorni: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " msgstr "Version i panjohur i aapt-së, mund të sjellë probleme: " #: ../fdroidserver/lint.py msgid "Unnecessary leading space" msgstr "Hapësirë e panevojshme në fillim" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" msgstr "Hapësirë e panevojshme në fund" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" msgstr "Fushë aplikacioni jo e pranuar '{fieldname}' te '{path}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Flamurkë e jo e pranuar montimi '{build_flag}' te '{path}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" msgstr "Lloj i pambuluar kartele “{extension}” për grafik depoje" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" msgstr "U gjet kartelë e pambuluar grafike: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" msgstr "extlib i papërdorur te %s" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" msgstr "Kartelë e papërdorur te %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" msgstr "Shteg scandelete i papërdorur: %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" msgstr "Shteg scanignore i papërdorur: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" msgstr "Po përftohet te %s" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Përditësoni të dhëna depoje për paketa të reja" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" msgstr "Përditësoni regjistrin e transparencës së dyorit për një URL" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData ka URL të pavlefshme: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" msgstr "UpdateCheckData duhet të përputhet me kodin e versionit si numër i plotë (\\d, ose [0-9]): {codeex}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" msgstr "UpdateCheckData duhet të përdorë URL HTTPS: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData s’është URL e vlefshme: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode është ujdisur, por duket sikur checkupdates s’është xhiruar ende" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "Si UpdateCheckName është caktuar ID aplikacioni të njohur - s’mund të hiqet" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" msgstr "Po ngarkohet {apkfilename} te androidobservatory.org" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" msgstr "Po ngarkohet {apkfilename} to virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "Usage" msgstr "Përdorim" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Përdorim: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Për të treguar një kartelë te dega parazgjedhje, përdorni /HEAD, në vend se /master" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Përdor `fdroid update -c` për ta krijuar." #: ../fdroidserver/build.py msgid "Use build server" msgstr "Përdor shërbyes montimesh" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" msgstr "Për APK-ra të shtuara rishtazi, përdor datë prej APK-je, në vend se kohën e tanishme" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." msgstr "Po përdoret “{path}” për formësim të s3cmd." #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "Po përdoret Nënshkrimi APK-je v2" #: ../fdroidserver/common.py msgid "Using APK Signature v3" msgstr "Po përdoret Nënshkrimi APK-je v3" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Po përdoret jarsigner Java, s’rekomandohet për verifikim APK-sh! Përdorni apksigner" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" msgstr "Po përdoret androguard prej “{path}”" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" msgstr "Po përdoret fjalor i zbrazët, në vend se lënda e {path}!" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" msgstr "Po përdoret depo ekzistuese kyçesh “{path}”" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" msgstr "Po përdoret s3cmd për njëkohësim me: {url}" #: ../fdroidserver/__main__.py msgid "Valid commands are:" msgstr "Urdhrat e vlefshëm janë:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." msgstr "Verifikoje ndaj një kopjeje të ruajtur lokalisht në fshehtinë, në vend se ta rishkarkosh." #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" msgstr "Verifikoni integritetin e paketave të shkarkuara" #: ../fdroidserver/index.py msgid "Verifying index signature:" msgstr "Po verifikohet nënshkrim treguesi:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "Kyçi API VirusTotal s’mund të ngarkojë kartela më të mëdha se 2MB, përdorni {url} që të ngarkoni {path}." #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Sinjalizo rreth gabimesh të mundshëm tejtëdhënash" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Kur është formësuar për tregues të nënshkruar, në këtë fazë krijo vetëm tregues të panënshkruar" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distinguished Name' i përdorur teksa prodhoheshin kyçe" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" msgstr "Mund të përdorni ANDROID_HOME që të caktoni shtegun për te SDK-ja juaj, domethënë:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" msgstr "Arkiv kartelash ZIP" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" msgstr "po shtohet IdentityFile te {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" msgstr "po shtohet te {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "mundësi e dykuptimtë: %(option)s mund të përputhej me %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "mundësi e dykuptimtë: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "S’u gjet apksigner! S’nënshkruhen ose verifikohen dot APK-ra moderne" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "S’u gjet apksigner, është i domosdoshëm për nënshkrim!" #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "ID aplikacioni e kartelës mbi të cilën të veprohet" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" msgstr "ID aplikacioni me versionCode opsional në formën APPID[:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" msgstr "archive_url lypset të përfundojë me /archive" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "argument “-” me mënyrën %r" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" msgstr "argument %(argument_name)s: %(message)s" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" msgstr "po tentohet lidhje SSH e zhveshur, për të testuar kyç sendërtimesh:" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" msgstr "s’përtyp dot specifikim scrlib (s’është një varg): '{}'" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "s’hapet dot '%(filename)s': %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" msgstr "s’mund të hapet url jo https: '{};" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" msgstr "s’gjenden dot srclibs të domosdoshme: “{path}”" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "s’mund të kihen argumente të shumtë për subparser" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "s’mund të përzihen veprimet - ka dy grupe të quajtur %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" msgstr "s’mund të botohet përditësim, e ujdisët kyçin e sendërtimit?" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" msgstr "po klonohet {url}" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" msgstr "urdhra prej modulesh shtojce:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" msgstr "kompleks" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "varg mundësie me përplasje: %s" msgstr[1] "vargje mundësish me përplasje: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser alias: %s" msgstr "" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser: %s" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" msgstr "s’u përtyp dot '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "s’u përtyp dot specifikim scrlib (s’u dha referencë): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" msgstr "s’u përtyp dot specifikim scrlib (shumë shenja '@'): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" msgstr "u krijua {path}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" msgstr "versioni i tanishëm është më i ri: kod versioni të vjetër={old}, kod versioni të ri={new}" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" msgstr "po fshihet: repo/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest= është e domosdoshme për mundësi si %r" #: ../fdroidserver/scanner.py msgid "downloading '{}'" msgstr "po shkarkohet “{}”" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" msgstr "dështoi shkarkimi i nënshkrimeve të kontrollorit prej “{}”" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" msgstr "dyor i ekzekutueshëm, ka gjasa të jetë kod" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "pritej %s argument" msgstr[1] "priteshin %s argumente" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "pritej e pakta një argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "pritej e shumta një argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "pritej një argument" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--help|--version|]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" msgstr "sill nga interneti versionin më të ri të nënshkrimeve" #: /usr/lib/python3.11/optparse.py msgid "floating-point" msgstr "" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "bëji gabimet e tejtëdhënave (parazgjedhje) të jenë sinjalizime, ose të shpërfillen." #: ../fdroidserver/common.py msgid "git svn clone failed" msgstr "veprimi “git svn clone” dështoi" #: ../fdroidserver/scanner.py msgid "gzip file archive" msgstr "Arkiv gzip kartelash" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "u shpërfill argumenti eksplicit %r" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 duhet të ketë një nënshkrim, përdorni `fdroid signindex` për ta krijuar!" #: ../fdroidserver/index.py msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 duhet të ketë një nënshkrim, përdorni `fdroid signindex` për ta krijuar!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" msgstr "numër i plotë" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "vlerë %(type)s e pavlefshme: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "zgjedhje e pavlefshme: %(value)r (zgjidhni nga %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "vlerë e pavlefshme conflict_resolution: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "varg i pavlefshëm mundësie %(option)r: duhet të fillojë me një shenjë %(prefix_chars)r" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" msgstr "S’u gjet ipfs_cid, po anashkalohet prodhimi i CIDv1" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" msgstr "udhëzimet e fundit për montimin janë më të reja: kod versioni të vjetër={old}, kod versioni të ri={new}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "local_copy_dir does s’mbaron me “fdroid”, ndoshta kishit në mendje: “{path}”" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" msgstr "local_copy_dir duhet të jetë një shteg absolut!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" msgstr "local_copy_dir duhet të jetë një drejtori, jo një kartelë!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" msgstr "pasqyra '%s' s’përfundon me 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "argumentet që përjashtojnë njëri-tjetrin duhet të jenë opsionalë" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" msgstr "përditësim pasues i fshehtinës {name} për {time}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" msgstr "s’ka “icon” te {appid}" #: ../fdroidserver/signatures.py msgid "no APK supplied" msgstr "s’u dha APK" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" msgstr "s’ka mundësi të tillë: %s" #: ../fdroidserver/__main__.py msgid "no version info found!" msgstr "s’u gjetën të dhëna versioni!" #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "s’u gjetën hollësi versioni" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "e palejuar me argumentin %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "një nga argumentet %s është i domosdoshëm" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" msgstr "prano vetëm vargje, lista dhe dyshe" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "mundësi %s: Nëse doni vërtet të instaloni krejt aplikacionet e nënshkruar, përdorni --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "mundësi %s: vlerë %s e pavlefshme: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "mundësia %s: zgjedhje e pavlefshme: %r (zgjidhni nga %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" msgstr "mundësi -%s jo e pranuar" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" msgstr "mundësia -%s lyp argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "mundësia --%s s’duhet të ketë një argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "mundësia --%s s’është parashtesë unike" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" msgstr "mundësi --%s e papranuar" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s requires argument" msgstr "mundësia --%s lyp argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "argumente opsionalë" #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "mundësi" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" msgstr "po mbishkruhet {path} ekzistues" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "argumente pozicionalë" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" msgstr "" #: ../fdroidserver/build.py msgid "reference binary missing signature" msgstr "" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" msgstr "refuzo shkarkim përmes lidhjeje HTTP të pasigurt (përdorni HTTPS ose specifikoni --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." msgstr "repo_icon “repo/icons/%s” s’ekziston, po prodhohet vendmbajtëse." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" msgstr "repo_url lypset të përfundojë me /repo" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml s’është i instaluar, s’mund të shkruhen tejtëdhëna." #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sync indexes {path} to {url} and delete" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "fshehtina e kontrollorit është e keqformuar! Mund ta spastroni me: “{clear}”" #: ../fdroidserver/scanner.py msgid "shared library" msgstr "librari e përbashkët" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" msgstr "shfaq numër versioni programi dhe dil" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" msgstr "shfaq këtë mesazh ndihme dhe dil" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." msgstr "APK e nënshkruar, ose një shteg-kartele, ose URL HTTPS." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" msgstr "anashkalo sendërtim regjistrash të plotë montimesh: lëndë e regjistrit është e zbrazët" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" msgstr "anashkalo krijim regjistrash të plotë montimi: e paaktivizuar te formësimi" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" msgstr "po anashkalohet paketë tar burimi: {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" msgstr "srclibs-it i mungon emër dhe/ose @" #: ../fdroidserver/scanner.py msgid "static library" msgstr "librari statike" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "argumentet vijuese janë të domosdoshëm: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "varg i papritur mundësie: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "përtypës i panjohur %(parser_name)r (choices: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "argumente të papranuar: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "leje jo të parrezikshme mbi '{config_file}' (duhet të ishin 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "përdorimi: " #: ../fdroidserver/deploy.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" msgstr "po përdoret Apache libcloud për njëkohësim me {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com i kufizon shpejtësitë, po pritet për riprovim…" #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" msgstr[0] "{0} aplikacion, {1} aliase kyçi" msgstr[1] "{0} aplikacione, {1} aliase kyçi" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) s’ka tejtëdhëna!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" msgstr "{apkfilename} ka shumë kartela {name}, duket si rreng me Kyçin e Përgjithshëm!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "AndroidManifest.xml e {apkfilename} ka një datë të gabuar: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} s’ka emër! Në vend të tij po përdoret ID aplikacioni." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" msgstr "{appid} prej {path} s’është ID e vlefshme aplikacioni Android!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid} prej {path} s;është Emër i vlefshëm Pakete Java!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" msgstr "{appid} ka nga të dyja, APK-ra dhe kartela: {files}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" msgstr "{appid} i mungon {name}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" msgstr "{appid}: extlib i panjohur {path} te montimi '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" msgstr "{appid}: s’u specifikuan montime, po xhirohet me gjendjen e tanishme të burimit" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" msgstr "{appid}: {field} duhet të jetë një '{type}', por është një '{fieldtype}!'" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" msgstr "{appid}: {field} duhet të jetë një '{type}', por është një '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} duhet të jetë numër i plotë, u gjet: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be list or string, found: {value}" msgstr "{build_flag} duhet të jetë listë, ose varg, u gjet: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" msgstr "{file} është e zbrazët ose e dëmtuar!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} “{section}/icons/{path}” s’ekziston! Kontrolloni “config.yml”." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} është nxjerrë nga përdorimi, përdorni {newfile}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "{path} ekziston tashmë, po shpërfillen përfundimet e importimit!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" msgstr "{path} s’ekziston! Krijojeni duke xhiruar:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} ka “{pattern}” të gabuar nënshkrimi kartele, ka gjasa të jetë rreng Janus!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" msgstr "{path} është me madhësi zero!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} më tepër se 200MB, ngarkojeni dorazi: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} s’përfundon me “fdroid”, kontrolloni shtegun e URL-së!" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url} s’fillon me “http”!" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" msgstr[0] "Dështoi {} montim" msgstr[1] "Dështuan {} montime" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} doli me sukses" msgstr[1] "{} dolën me sukses" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/locale/tr/0000755000175000017500000000000014620351546014674 5ustar00hanshans././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.888382 fdroidserver-2.3a1/locale/tr/LC_MESSAGES/0000755000175000017500000000000014620351546016461 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/locale/tr/LC_MESSAGES/fdroidserver.po0000644000175000017500000027005314620351225021520 0ustar00hanshans# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # Oğuz Ersen , 2020, 2021, 2022. # Orhan , 2021. # Oğuz Ersen , 2022, 2023, 2024. # Bai , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2024-04-11 20:02+0000\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" "\n" "Dağıtım anahtarı olarak kullanılacak SSH ortak anahtarı:" #: ../fdroidserver/nightly.py #, python-brace-format msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" "\n" "DEBUG_KEYSTORE gizli değişkeni için kodlanmış {path}:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" eşleşen üst veri dosyasına sahip değil!" #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" msgstr "\"local_copy_dir\" {path} mevcut değil!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\" zaten {dev} üzerinde kurulu." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" msgstr "\"{path}\" tarihi geçmiş {name} ({version}) içeriyor" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" msgstr "\"{path}\" en son {name} ({version}) içeriyor" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" msgstr "\"{path}\" var ancak s3cmd kurulu değil!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" msgstr "\"{path}\" desteklenen bir dosya biçimi değil (şunu kullanın: metadata/*.yml)" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "\"{path}\", izin verilmeyen bir anahtarla imzalandı:" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" geçerli bir URL değil!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" msgstr[0] "%(option)s seçeneği %(number)d argüman gerektirir" msgstr[1] "%(option)s seçeneği %(number)d argüman gerektirir" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: hata: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" msgstr "%d sorun bulundu" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "%prog [options]" msgstr "%prog [seçenekler]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" msgstr "%r çağrılabilir değil" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" msgstr "%s bir sözlük üretmedi!" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" msgstr "%s bozuk SHA-256'ya sahip: %s" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" msgstr "%s kabul edilen bir inşa alanı değil" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" msgstr "%s seçeneği bir değer almaz" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' config.yml içinde bulunamadı!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' seçeneği NONE ve 'smartcardoptions' seçeneği boş!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "'keystore' config.yml içinde bulunamadı!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' config.yml içinde bulunamadı!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' config.yml içinde bulunamadı!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' positionals için geçersiz bir argüman" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" msgstr "'sdk_path' config.yml içinde ayarlı değil!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' çok eski, fdroid build-tools-{version} veya daha yenisini gerektirir!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" msgstr "'{field}' rastgele sırada olacak! Sıra önemliyse () veya [] parantez kullanın!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" msgstr "'{path}' yürütülemedi!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' geçersiz biçime sahip, bir sözlük olmalı!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' {appid} içinde geçerli {field} değil. Regex ifadesi: {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' geçerli bir {field} değil, {pattern} olmalı" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" msgstr ".. .checkupdate {appid} için başarısız oldu: {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() tanımlı değil" #: ../fdroidserver/lint.py msgid "/issues is missing" msgstr "/issues eksik" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" msgstr "Bir URL, argüman olarak gereklidir!" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Depodaki paketler için GnuPG ile PGP imzaları ekle" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" msgstr "İmzalanmamış bir depoya, depo imzalama anahtarı ekleyin" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" msgstr "İskelet üst veri dosyaları olmayan APK'lar için onları ekle" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" msgstr "Yalnızca {name} için yeni depo ekleniyor" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" msgstr "Depo imzalama anahtarının anahtar deposundaki takma adı" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" msgstr "AllowedAPKSigningKeys eksik ancak referans ikili dosyası sağlandı" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "İlk içe aktarım için farklı bir revizyonun (veya git dalının) belirtilmesine izin verir" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" msgstr "Tam arşiv bölümünü de yansıt" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" msgstr "Ayrıca biçimlendirme sorunları hakkında uyar, rewritemeta -l gibi" #: ../fdroidserver/scanner.py msgid "Android AAR library" msgstr "Android AAR kütüphanesi" #: ../fdroidserver/scanner.py msgid "Android APK file" msgstr "Android APK dosyası" #: ../fdroidserver/scanner.py msgid "Android DEX code" msgstr "Android DEX kodu" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" msgstr "Android SDK {path} konumunda bulunamadı!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" msgstr "Android SDK konumu '{path}' yok!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" msgstr "Android SDK yolu '{path}' bir dizin değil!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" msgstr "Android SDK aracı {cmd} bulunamadı!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "Uygulama İkili Dosyalara sahip ancak sertifikayı sabitlemek için karşılık gelen AllowedAPKSigningKeys'e sahip değil." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Uygulamanın NoSourceSince veya ArchivePolicy \"0 sürümü\" var ancak AutoUpdateMode veya UpdateCheckMode Yok değil" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" msgstr "Uygulama '{repo}' içinde ancak {url} adresine bir bağlantısı var" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "Uygulama sürümü ikili dosyaya sahip ancak sertifikayı sabitlemek için karşılık gelen AllowedAPKSigningKeys'e sahip değil." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Ekleme .gıt gerekli değildir" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" msgstr "Geçersiz imza ile {apkfilename} arşivleme!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "UpdateCheckMode ile AutoUpdateMode: HTTP bir desene sahip olmalıdır." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" msgstr "Aynalar yapılandırmasında hatalı giriş türü \"{mirrortype}\": {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "Yansının temel URL'si, 'şu sorgu dizgisini kullanarak indeks imzalama anahtarını içerebilir: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" msgstr "Dal '{branch}' inşa '{versionName}' içinde işleme olarak kullanıldı" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" msgstr "Srclib '{srclib}' içine işleme için dal '{branch}' kullanıldı" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" msgstr "Bozuk sembolik bağlantı: {path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" msgstr "Kaynaktan bir paket oluştur" #: ../fdroidserver/build.py msgid "Build all applications available" msgstr "Kullanılabilir tüm uygulamaları inşa et" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" msgstr "İnşa `fdroid import` ile üretildi - hazır olunca devre dışı satırını kaldırın" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" msgstr "Yapı metadata git repo, değişiklik yapılmadı!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" msgstr "Her paketin sadece son sürümünü inşa et" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" msgstr "Depo \"%s\" tabanında bu yapılandırma ile inşa edildi:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" msgstr "CurrentVersionCode olmadan uygulama otomatik olarak güncellenemiyor" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "Tarama sırasında {} hata nedeniyle inşa edilemiyor" msgstr[1] "Tarama sırasında {} hata nedeniyle inşa edilemiyor" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" msgstr "\"{path}\" yeniden yazılamıyor" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "'%s' kategorileri geçersiz" #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "Kategoriler ayarlı değil" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Uygulama güncellemelerini denetle" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "{appid} için arşivleme denetleniyor - apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Temiz güncelleme - önbellekleri kullanmaz, tüm APKları yeniden işler" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Kategorilerin virgülle ayrılmış listesi." #: ../fdroidserver/__main__.py #, python-format msgid "Command '%s' not recognised.\n" msgstr "'%s' komutu tanınmıyor.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" msgstr "Değişiklikleri işle" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" msgstr ".yml ve yerelleştirilmiş dosyalar arasında çakışan \"{field}\" tanımları:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Çakışan argümanlar: '--verbose' ve '--quiet' aynı anda belirtilemez." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" msgstr "Çakışan yapılandırma dosyaları! {newfile} kullanılıyor, {oldfile} yok sayılıyor!" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "'{command}' sisteminizde bulunamadı" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Son sürüm kodu bulunamadı" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Son sürüm adı bulunamadı" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" msgstr "Kaldırmak için {path} bulunamadı" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " msgstr "İnceleme için APK {path} açılamadı: " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "\"{size}\" boyutu ayrıştırılamadı, yanlış tür \"{type}\"" #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Uygulama kimliği bulunamadı" #: ../fdroidserver/checkupdates.py msgid "Couldn't find any version information" msgstr "Herhangi bir sürüm bilgisi bulunamadı" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "Paket ID bulunamadı" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" msgstr "Var olan imza anahtarı kurulumunun üzerine yazma korkakça reddediliyor!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" msgstr "Yeni kapsayıcı \"{name}\" oluşturuldu" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." msgstr "s3cmd yapılandırması için \"{path}\" oluşturuluyor." #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Günlük dizini oluşturuluyor" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" msgstr "Yeni S3 kovası oluşturuluyor: {url}" #: ../fdroidserver/publish.py msgid "Creating output directory" msgstr "Çıktı dizini oluşturuluyor" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" msgstr "Bu anahtarla (SHA256) imzalı indeks oluşturuluyor:" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" msgstr "Geçici dizin oluşturuluyor" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" msgstr "İmzalama hazırlığı için imzalanmamış indeks oluşturuluyor" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" msgstr "CurrentVersionCode {cv}, en eski derleme girişinden daha az {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" msgstr "DEBUG_KEYSTORE ayarlı değil veya değer eksik" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" msgstr "Depoda üst verisi olmayan APK ve/veya OBB dosyalarını sil" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" msgstr "Arşiv siliniyor, depo çok büyük ({size}, en fazla {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" msgstr "git-mirror geçmişi siliniyor, depo çok büyük ({size}, en fazla {limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" msgstr "Bilinmeyen dosya siliniyor: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" msgstr "Açıklama '%s' yalnızca uygulamanın özeti" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" msgstr "Açıklamanın yinelenen satırı var" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" msgstr "Açıklamanın bir listesi (%s) var fakat madde imli (*) veya numaralı(#) değil" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" msgstr "{length} uzunluğundaki açıklama, {limit} karakter sınırının üstünde" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Oluşturulan derleme girdilerine 'disable:' ekleme" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" msgstr "Yeni dosyaları repo'ya dağıtmayın" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" msgstr "URL'ye \"{path}\" ekleme!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" msgstr "Android SDK konumunu sorma, sadece başarısız ol" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" msgstr "Anahtar deposundan oluşturulan özel anahtarları kaldırmayın" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" msgstr "Bir kaynak tar dosyası yaratma, bir inşa sınanırken yararlıdır" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" msgstr "Depoyu yenileme, bir inşa internet bağlantısı olmadan sınanırken yararlıdır" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" msgstr "Rsync sağlama toplamlarını kullanma" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Küçük depoların tam yansımasını indir" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" msgstr "%s indiriliyor" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Depoyu indirmek zaten bir kez başarısız oldu, tekrar denenmiyor." #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" msgstr "{url} indirme başarısız. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" msgstr "{path} adresindeki yinelenen Anti-Özellik bildirimi göz ardı edildi!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" msgstr "Aynalar yapılandırmasında yinelenen \"%s\" girişi!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" msgstr "'{field}' içinde yinelenen bağlantı: {url}" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "HATA: \"server\" alt komutu kaldırıldı, \"deploy\" kullanın!" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" "HATA: bu komut asla f-droid.org'u yansıtmak için kullanılmamalıdır!\n" "f-droid.org'un tam bir yansıması 200GB'tan çok yer gerektirir." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "HATA: desteklenmeyen CI türü, yama gönderebilirsiniz!" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "HATA: desteklenmeyen git ana makinesi \"%s\", yama gönderebilirsiniz!" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." msgstr "Kodlama '{enc}' olarak ayarlandı, fdroid kodlama sorunlarıyla karşılaşabilir. En iyi sonuçlar için lütfen 'UTF-8' olarak ayarlayın." #: ../fdroidserver/init.py #, python-format msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" "Android SDK (%s) konumunu buraya girin:\n" "> " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" msgstr "{configname} içinden {var} ortam değişkeni ayarlı değil!" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Depo adresi alınırken hata" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" msgstr "Sorun bulunursa sıfır olmayan bir kodla çıkın" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Bir kaynak depodan uygulama üst verilerini ayıkla" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "APK'lardan imzaları ayıkla" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" msgstr "{path} kopyalanamadı: {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" msgstr "'{apkfilename}' için imza alınamadı: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" msgstr "{path} okunamadı: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" msgstr "{path} yeniden boyutlandırılamadı: {error}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" msgstr "S3 kovası oluşturulamadı: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" msgstr "APK bilgisi alınamadı, {path} siliniyor" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" msgstr "APK bilgisi alınamadı, {path} atlanıyor" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" msgstr "APK imzalama anahtarı parmak izi alınamadı" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" msgstr "'{apkfilename}' {dev} üstüne kurulamadı: {error}" #: ../fdroidserver/common.py msgid "Failed to sign application" msgstr "Uygulama imzalanamadı" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" msgstr "VM'den buildserverid alındı: {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" msgstr "'{apkfilename}' için imzalar alındı -> '{sigdir}'" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" msgstr "Dosya işlenirken kayboldu: {path}" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py #: ../fdroidserver/update.py msgid "Finished" msgstr "Tamamlandı" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" msgstr "Flattr bağış yöntemleri FlattrID: alanında olmalı" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Yasaklı HTML etiketleri" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." msgstr "Devre dışı uygulamaların inşasını zorunlu kıl, ve tarama problemi olsa bile devam et. Sadece sınama kipinde izin verilir." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" msgstr "İnşa, {0} saniye zaman aşımından sonra zorla durduruluyor!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." msgstr "Devre dışı bırakılan uygulamaların ve derlemelerin taranmasını zorla." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" msgstr "\"{name}\" uygulaması için üst verisi olmayan \"{path}\" grafiği bulundu!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "\"{name}\" için hatalı ödeme dosyası \"{path}\" bulundu:" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" msgstr "Argümanda geçersiz appid'ler bulundu" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "Bazı uygulamalar için geçersiz versionCodes bulundu" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" msgstr "{path} içinde birden fazla JAR İmza Blok Dosyası bulundu" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" msgstr "{appid} için birden çok üst veri dosyası bulundu" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." msgstr "Depo için birden çok imzalama sertifikası bulundu." #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." msgstr "Depo için imzalama sertifikaları bulunmadı." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" msgstr "%s konumunda dosya olmayan bulundu" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" msgstr "{url} adresinde {apkfilename} bulundu" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} problems in {filename}" msgstr "{filename} içinde {count} sorun bulundu" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" msgstr "{filename} içinde {count} uyarı bulundu" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" msgstr "{appid} için iskelet üst veri oluşturuldu" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" msgstr "'%s' için git checkout başarısız" #: ../fdroidserver/common.py msgid "Git clean failed" msgstr "Git clean başarısız" #: ../fdroidserver/common.py msgid "Git fetch failed" msgstr "Git fetch başarısız" #: ../fdroidserver/common.py msgid "Git prune failed" msgstr "Git prune başarısız" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Git remote set-head başarısız: \"%s\"" #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Git reset başarısız" #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Git alt modülü eşzamanlaması başarısız oldu" #: ../fdroidserver/common.py msgid "Git submodule update failed" msgstr "Git alt modülü güncellemesi başarısız oldu" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" msgstr "Subversion URL'leriyle HTTPS kullanılmalı!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" msgstr "Git yansısı çok büyük olursa, arşivin silinmesine izin ver" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" msgstr "Bu yükleme başarısız olursa, {url} adresine elle yüklemeyi deneyin" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." msgstr "Kullanımdan kaldırıldığı için '{metapath}' üst verilerindeki '{field}' yok sayılıyor." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "2048'den uzun FUNDING.yml girdisi yok sayılıyor: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" msgstr "Manifestteki hatalı öğe yok sayılıyor: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Üst verisiz paket yok sayılıyor: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" msgstr "{apkfilename} için eskimiş önbellek verisi yok sayılıyor" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" msgstr "MD5 gibi devre dışı algoritmalarla imzalanmış APK'ları dahil et" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" msgstr "PGP imzası .asc dosyalarını yansıya dahil et" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" msgstr "Derleme günlüklerini yansıya dahil et" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" msgstr "Kaynak tar arşivlerini yansıya dahil et" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" msgstr "%s@%s üst verileri dahil ediliyor" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" msgstr "{path} üst verileri dahil ediliyor" #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Alt modüller başlatılıyor" #: ../fdroidserver/install.py msgid "Install all signed applications available" msgstr "Kullanılabilir tüm imzalı uygulamaları kur" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" msgstr "Oluşturulan paketleri aygıtlara kur" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." msgstr "%s kuruluyor..." #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." msgstr "{dev} üzerinde '{apkfilename}' kuruluyor..." #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" msgstr "Depo HTTP sunucusu ile etkileşim kur" #: ../fdroidserver/update.py msgid "Invalid APK" msgstr "Geçersiz APK" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" msgstr "Geçersiz AutoUpdateMode: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" msgstr "Geçersiz UpdateCheckMode: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" msgstr "Geçersiz Vercode İşlemi: {field}" #: ../fdroidserver/lint.py #, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "Geçersiz VercodeOperation: {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "Geçersiz uygulama kimliği {appid}" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" msgstr "Geçersiz boole '%s'" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Geçersiz madde imli liste" #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" msgstr "Yayımlanmış dosya için geçersiz ad: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" msgstr "Geçersiz ndk: yapıdaki değer: \"{ndk}\"" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " msgstr "HTTPS olmayanlara geçersiz yönlendirme: {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" msgstr "Geçersiz scrlib üst verisi: '{file}' dosyası yok" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" msgstr "Geçersiz srclib üst verisi: '{file}' ayrıştırılamadı" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" msgstr "Geçersiz srclib üst verisi: '{file}' içinde bilinmeyen anahtar '{key}'" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" msgstr "JAR imzası doğrulanamadı: {path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" msgstr "JAR imzası doğrulandı: {path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" msgstr "Java JAR dosyası" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" msgstr "Java JDK bulunmadı! Standart konumda kurun veya java_paths'i ayarlayın!" #: ../fdroidserver/scanner.py msgid "Java compiled class" msgstr "Java derlenmiş sınıf" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" msgstr "Java jarsigner bulunamadı! Standart konuma kurun veya java_path ayarlayın!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" msgstr "HTML src özniteliklerinde javascript" #: ../fdroidserver/build.py #, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" msgstr "Başarısız yapı \"{apkfilename}\" tutuluyor" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "İmzalama için anahtar deposu:\t" #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" msgstr "Son kullanılan işleme '{commit}' bir etiket gibi görünüyor, ama UpdateCheckMode '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" msgstr "Liberapay bağış yöntemleri Liberapay: alanında olmalı" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted (dry run)" msgstr "Yeniden biçimlendirilecek olan dosyaları listele (deneme çalışması)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "f-droid.org URL'sine dahil yerel ayar" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" msgstr "Özel durumlarda inşayı durdur" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." msgstr "Bozuk depo yansımaları." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" msgstr "Bozuk serverwebroot satırı:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" msgstr "ZIP dosyasında azami özyineleme derinliğine ulaşıldı: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Tüm dosya türlerini, tam depoyu ve arşivi yansıla." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" msgstr "Eksik çıktı dizini" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" msgstr "Anti-Özellik bildirimlerinin yerelleştirilmiş dosyalara taşınıyor:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "config.yml dosyasında ne \"repo_pubkey\" ne de \"keystorepass\" ayarlandı" #: ../fdroidserver/verify.py #, python-format msgid "No APK for package: %s" msgstr "Paket için APK yok: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Android SDK bulunamadı!" #: ../fdroidserver/install.py msgid "No attached devices found" msgstr "Bağlı aygıt bulunamadı" #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "URL'de parmak izi yok." #: ../fdroidserver/common.py msgid "No git submodules available" msgstr "Kullanılabilir git alt modülü yok" #: ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "Gradle projesi bulunamadı. --subdir belirtin?" #: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Bilgi bulunamadı." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" msgstr "Eşleşen etiket bulunamadı" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." msgstr "{0} içinde en düşük SDK sürümü bulunamadı, öntanımlı değer kullanılıyor (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Uygulamanın Özgür Yazılım olduğunu belirtmeye gerek yok" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" msgstr "Uygulamanın Android için olduğunu belirtmeye gerek yok" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "Ayarlı seçenek yok! Sunlardan en az birini ayarlamak için config.yml dosyanızı düzenleyin:" #: ../fdroidserver/common.py msgid "No packages specified" msgstr "Belirtilen paket yok" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" msgstr "%s için kullanılabilir imzalanmış APK yok" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" msgstr "İmzalanmış çıktı dizini yok - yapılacak işlem yok" #: ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" msgstr "{path} içinde imzalama sertifikaları bulunamadı" #: ../fdroidserver/common.py #, python-format msgid "No such package: %s" msgstr "Böyle bir paket yok: %s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" msgstr "Uygulama {appid} için böyle bir versionCode {versionCode} yok" #: ../fdroidserver/checkupdates.py msgid "No tags found" msgstr "Etiket bulunamadı" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" msgstr "İmzalanmamış dizin yok - yapılacak işlem yok" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Geçerli bir boyut tanımı değil: \"{}\"" #: ../fdroidserver/signindex.py msgid "Nothing to do" msgstr "Yapılacak işlem yok" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." msgstr "{appid} için yapılacak işlem yok." #: ../fdroidserver/init.py msgid "Now set these in config.yml:" msgstr "Şimdi bunları config.yml içinde ayarlayın:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" msgstr "OBB dosyasının her APK'dan daha yeni versionCode'u({integer}) var:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" msgstr "OBB dosya adı \"main.\" veya \"patch.\" ile başlamalıdır:" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" msgstr "OBB'ın packagename değeri desteklenen APK ile eşleşmiyor:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Çevrim dışı makine, `fdroid deploy` komutuna kadar git yansı oluşturma atlanıyor" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Grafikler için yalnızca PNG ve JPEG desteklenir, bulunan: {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Yalnızca Play Store ile olan farkları yazdır" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Yalnızca kendiliğinden güncellemesi olan uygulamaları işle" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "OpenCollective bağış yöntemleri OpenCollective: alanında olmalı" #: /usr/lib/python3.11/optparse.py msgid "Options" msgstr "Seçenekler" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "APK'den sonra adlandırılmış dosyaya JSON raporu yazdırın." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." msgstr "Standart çıkışa JSON yazdır." #: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py #: ../fdroidserver/publish.py ../fdroidserver/signindex.py #: ../fdroidserver/update.py msgid "Outputting JSON" msgstr "JSON yazdırılıyor" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Projenin genel lisansı." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "{apkfilename} içindeki boş versionName değerine üst verideki yazılıyor: {version}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "\"{appid}\" paketi zaten var" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" msgstr "'{path}' konumundaki bildirim ayrıştırılıyor" #: ../fdroidserver/common.py msgid "Password required with username" msgstr "Kullanıcı adıyla parola gerekli" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "Kökte değilse, ana Android proje alt dizininin konumu." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" msgstr "Android SDK konumu (bazen ANDROID_HOME'da ayarlıdır)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" msgstr "Günlük olarak kullanılacak git deposunun konumu" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" msgstr "Depo imzalama anahtarı için anahtar deposunun konumu" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Kolay kopyala yapıştır için gizli değişkeni terminale yaz" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" msgstr "ZIP dosyası ile ilgili sorun: %s, hata %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" msgstr "'{path}' konumundaki xml ile ilgili sorun" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" msgstr "Kendiliğinden güncellemeleri işle" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" msgstr "{apkfilename} işleniyor" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" msgstr "{appid} işleniyor" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" msgstr "İndeks dosyaları için okunabilir XML/JSON üret" #: ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "İçe aktarma için proje URL'si." #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" msgstr "Noktalama işaretlerinden kaçınılmalı" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" msgstr "Günlüğü bu git uzak deposuna it" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing binary transparency log to {url}" msgstr "İkili şeffaflık günlüğü {url} konumuna gönderiliyor" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" msgstr "{url} adresine itiliyor" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" msgstr "Hızlıca yeni bir depo başlat" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" msgstr "Tüm üst veri dosyalarını oku ve çık" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" msgstr "'{config_file}' okunuyor" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" msgstr "packageName/versionCode/versionName okuma başarısız, APK geçersiz: '{apkfilename}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" msgstr "packageName/versionCode/versionName okuma başarısız, APK geçersiz: '{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" msgstr "{apkfilename} önbellekten okunuyor" #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Belirtilen dosyalar kaldırılıyor" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" msgstr "\"{path}\" kaldırılıyor" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "paket.adı_123.apk örüntüsüyle eşleşmeyen tüm APK dosyalarını yeniden adlandır" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" msgstr "RepoTrunk güncelleme modu yalnızca git-svn depolarında anlamlıdır" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." msgstr "Sıfırla ve yeni bir inşa sunucusu yarat, var olan iyi görünüyor olsa bile." #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" msgstr "{apkfilename} sağlanan debug.keystore ile yeniden imzalanıyor" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" msgstr "Piksel boyut sınırını aşan tüm simgeleri yeniden boyutlandır ve çık" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" msgstr "Çıkışı uyarılara ve hatalara kısıtla" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Tüm üst veri dosyalarını yeniden yaz" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" msgstr "'{appid}' yeniden yazılıyor" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" msgstr "Değişiklikleri olmayan git repo üzerinde çalış" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Biçimlemeyi düzeltmek için rewritemeta çalıştır" #: ../fdroidserver/deploy.py msgid "Running first pass with MD5 checking disabled" msgstr "İlk geçiş MD5 doğrulama olmadan çalıştırılıyor" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" msgstr "{path} konumunda wget çalıştırılıyor" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" msgstr "{url}'nin SHA-256'sı girişle eşleşmiyor!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Bilinen özgür olmayan sınıflar için ortaya çıkan APK'leri tara." #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" msgstr "Bir paketin kaynak kodunu tara" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {apk}" msgstr "Tarayıcı {apk} içinde {count} sorun buldu" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" msgstr "Tarayıcı {appid} içinde {count} sorun buldu:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" msgstr "Tarayıcı {appid}:{versionCode} içinde {count} sorun buldu:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "Tarayıcı {} sorun buldu" msgstr[1] "Tarayıcı {} sorun buldu" #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "Bilinen özgür olmayan sınıflar için dexdump ile APK taranıyor." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" msgstr "NDK {release} ({version}) kuruldu" #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Saati o zamana şunu kullanarak ayarla:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" msgstr "Eskileri arşivlenmeden önce depodaki en yüksek sürümleri ayarla" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" msgstr "Açık dosya sınırını {integer} olarak ayarla" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" msgstr "Gecelik bir inşa deposu için bir uygulama inşası kurun" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " msgstr "Açık dosya sınırı ayarı başarısız: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" msgstr "Bu inşa için {0} sn zaman aşımı ayarlanıyor" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Paketleri imzala ve depoya yerleştir" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" msgstr "update --nosign ile yaratılan indeksleri imzala" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" msgstr "Kaynak kodu, çalıştırılabilir dosyalar ve diğer sorunlar için taramayı atla" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Geçersiz imzalı '{apkfilename}' atlanıyor!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" msgstr "Depo çok büyük olduğundan (>%.2fGB) GitLab Sayfaları yansısı atlanıyor!" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" msgstr "{appid} için indeks üretimi atlanıyor" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" msgstr "Geçersiz imzalı {apkfilename} atlanıyor!" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" msgstr "{appid} atlanıyor: devre dışı" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" msgstr "Deponun eşleneceği yerel bir klasör belirtin" #: ../fdroidserver/deploy.py msgid "Specify an identity file to provide to SSH for rsyncing" msgstr "Rsync için SSH'a sağlanacak bir kimlik dosyası belirtin" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." msgstr "Kullanılacak hata ayıklama anahtar deposu dosyasını belirtin." #: ../fdroidserver/common.py msgid "Spew out even more information than normal" msgstr "Olağandan daha da çok bilgi çıkart" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" msgstr "Gizemli imza {apkfilename} dosyasından kaldırılıyor" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" msgstr "Özet '%s' yalnızca uygulamanın adı" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" msgstr "{length} uzunluğundaki özet, {limit} karakter sınırının üstünde" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" msgstr "Sistem saati {path} konumundaki tarihten daha eski!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" msgstr "Etiket güncelleme modu şu anda yalnızca git, hg, bzr ve git-svn depoları için çalışıyor" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "git-svn'de etiket güncelleme modu kullanıldı, ancak depo etiketlerle ayarlanmadı" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Sınama kipi - çıkışı sadece tmp dizinine koy, ve her zaman inşa et, çıkış zaten var olsa bile." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" msgstr "OBB sürüm kodu \"{name}.\" adından sonra gelmelidir:" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" msgstr "Günlüğe kaydedilecek depo için temel URL (öntanımlı olarak: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" msgstr "Yansımanın yazılacağı dizin" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" msgstr "Repo'ya dahil edilecek dosya (yol veya glob)" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." msgstr "Deponun parmak izi eşleşmiyor." #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" msgstr "local_copy_dir \"{path}\" için kök dizini yok!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" msgstr "Bir keyalias çakışması var - yayımlama durdu" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." msgstr "Bunlar ana depodan arşivlenmiş uygulamalardır." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Bu, F-Droid ile kullanılacak uygulamaların bir deposudur. Bu depodaki uygulamalar ya gerçek uygulama geliştiricileri tarafından oluşturulan resmi ikili dosyalardır ya da https://gitlab.com/fdroid adresindeki araçlar kullanılarak f-droid.org yöneticisi tarafından kaynaktan oluşturulan ikili dosyalardır." #: ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Bu deponun zaten yerel üst verisi var: %s" #: ../fdroidserver/init.py #, python-format msgid "" "To complete the setup, add your APKs to \"%s\"\n" "then run \"fdroid update -c; fdroid update\". You might also want to edit\n" "\"config.yml\" to set the URL, repo name, and more. You should also set up\n" "a signing key (a temporary one might have been automatically generated).\n" "\n" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" "Kurulumu tamamlamak için APK'larınızı \"%s\" içine\n" "ekleyin ve ardından \"fdroid update -c; fdroid update\" komutunu çalıştırın. URL'yi, depo\n" "adını ve daha fazlasını ayarlamak için \"config.yml\" dosyasını da düzenlemek isteyebilirsiniz.\n" "Ayrıca bir imzalama anahtarı da ayarlamalısınız (geçici bir anahtar otomatik olarak oluşturulmuş olabilir).\n" "\n" "Daha fazla bilgi için: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "ve https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Awsbucket kullanmak için, awssecretkey ve awsaccesskeyid de config.yml içinde ayarlanmalı!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "URL https:// veya http:// ile başlamalı" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" msgstr "URL kısaltıcılar kullanılmamalı" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" msgstr "Açıklamada URL {url}: {error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" msgstr "Beklenmeyen lisans etiketi \"{}\"! Yalnızca https://spdx.org/license-list adresindeki FSF veya OSI onaylı etiketleri kullanın" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Beklenmeyen lisans etiketi \"{}\"! Yalnızca yapılandırma dosyanızda yapılandırılan lisans etiketlerini kullanın" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" msgstr "Beklenmeyen sembolik bağlantı hedefi: {link} -> {target}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" msgstr "{configname} içinde bilinmeyen girdi {key}" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Bilinmeyen istisna bulundu!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" msgstr "İnşa '{versionName}' içinde bilinmeyen dosya '{filename}'" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" msgstr "Bilinmeyen üst veri biçimi: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" msgstr "Bilinmeyen üst veri biçimi: {path} (şunu kullanın: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " msgstr "aapt'nin bilinmeyen sürümü, soruna neden olabilir: " #: ../fdroidserver/lint.py msgid "Unnecessary leading space" msgstr "Gereksiz ön boşluk" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" msgstr "Gereksiz son boşluk" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" msgstr "'{path}'deki tanınmayan uygulama alanı '{fieldname}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "'{path}'de tanınmayan yapı bayrağı '{build_flag}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" msgstr "Depo grafiği için desteklenmeyen dosya türü \"{extension}\"" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" msgstr "Desteklenmeyen grafik dosyası bulundu: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" msgstr "%s konumunda kullanılmayan extlib" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" msgstr "%s konumunda kullanılmayan dosya" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" msgstr "Kullanılmayan scandelete yolu: %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" msgstr "Kullanılmayan scanignore yolu: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" msgstr "%s konumuna çıkarılıyor" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Yeni paketler için depo bilgisini güncelle" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" msgstr "Bir URL için çalıştırılabilir şeffaflık günlüğünü güncelle" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData geçersiz URL'ye sahip: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" msgstr "UpdateCheckData tam sayı olarak sürüm koduyla eşleşmelidir (\\d veya [0-9]): {codeex}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" msgstr "UpdateCheckData, HTTPS URL'sini kullanmalıdır: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData geçerli bir URL değil: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode ayarlı ancak checkupdates henüz çalıştırılmamış gibi görünüyor." #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName bilinen uygulama kimliğine ayarlı - kaldırılabilir" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" msgstr "{apkfilename}, androidobservatory.org'a yükleniyor" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" msgstr "{apkfilename} virustotal'e yükleniyor" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "Usage" msgstr "Kullanım" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Kullanım: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Öntanımlı daldaki bir dosyaya işaret etmek için /master yerine /HEAD kullanın" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Onu oluşturmak için `fdroid update -c` kullanın." #: ../fdroidserver/build.py msgid "Use build server" msgstr "İnşa sunucusu kullan" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" msgstr "Yeni eklenen APKlar için o anki zaman yerine APK'daki tarihi kullan" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." msgstr "s3cmd yapılandırması için \"{path}\" kullanılıyor." #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "APK İmza v2 kullanılıyor" #: ../fdroidserver/common.py msgid "Using APK Signature v3" msgstr "APK İmza v3 kullanılıyor" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Java'nın jarsigner'ı kullanılıyor, APK'ları doğrulamak için önerilmez! apksigner'ı kullanın" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" msgstr "\"{path}\" adresinden androguard'ı kullanıyor" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" msgstr "{path} içeriği yerine boş sözlük kullanılıyor!" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" msgstr "Var olan anahtar deposu \"{path}\" kullanılıyor" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" msgstr "{url} ile eşitleme için s3cmd kullanılıyor" #: ../fdroidserver/__main__.py msgid "Valid commands are:" msgstr "Geçerli komutlar:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." msgstr "Yeniden yükleme yerine yerel olarak önbelleğe alınmış kopyaya karşı doğrulayın." #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" msgstr "İndirilen paketlerin bütünlüğünü doğrula" #: ../fdroidserver/index.py msgid "Verifying index signature:" msgstr "İndeks imzası doğrulanıyor:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "VirusTotal API anahtarı 32MB'den büyük dosyaları yükleyemiyor, {path} yüklemek için {url} kullanın." #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Olası üst veri hataları hakkında uyar" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "İmzalı indeksler için yapılandırıldığında, bu aşamada sadece imzasız indeksleri yarat" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "Tüm depo denetlenirken yamllint öntanımlı olarak devre dışı bırakılır. Bu seçenek, yamllint kullanımını ne olursa olsun zorlar." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "Anahtarlar üretilirken X.509 'Distinguished Name' kullanılır" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" msgstr "SDK'nızın konumunu ayarlamak için ANDROID_HOME'u kullanabilirsiniz:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" msgstr "ZIP dosya arşivi" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" msgstr "IdentityFile {path} konumuna ekleniyor" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" msgstr "{name} adına ekleniyor: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "belirsiz şeçenek: %(option)s ile %(matches)s eşleşebilir" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "belirsiz şeçenek: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner bulunamadı! Modern APK'lar imzalanamıyor veya doğrulanamıyor" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "apksigner bulunamadı, imzalamak için gereklidir!" #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "üzerinde işlem yapılacak dosyanın uygulama kimliği" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" msgstr "UYGULAMA_KİMLİĞİ[:SÜRÜM_KODU] biçiminde isteğe bağlı versionCode ile uygulama kimliği" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" msgstr "archive_url'nin /archive ile bitmesi gerekiyor" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "%r kipiyle \"-\" argümanı" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" msgstr "argüman %(argument_name)s: %(message)s" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" msgstr "Dağıtım anahtarını sınamak için çıplak SSH bağlantısı deneniyor:" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" msgstr "scrlib belirtimi ayrıştırılamıyor (bir dizge değil): '{}'" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "'%(filename)s' açılamıyor: %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" msgstr "https olmayan url açılamıyor: '{};" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" msgstr "gerekli srclibs bulunamıyor: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "birden çok alt-ayrıştırıcı argümanı verilemez" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "eylemler birleştirilemiyor - %r adlı iki grup" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" msgstr "güncelleme yayımlanamıyor, dağıtım anahtarını ayarladınız mı?" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" msgstr "{url} klonlanıyor" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" msgstr "eklenti modüllerinden komutlar:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" msgstr "karmaşık" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "çakışan seçenek satırı: %s" msgstr[1] "çakışan seçenek satırları: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser alias: %s" msgstr "çakışan alt ayrıştırıcı takma adı: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser: %s" msgstr "çakışan alt ayrıştırıcı: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" msgstr "'{path}' ayrıştırılamadı" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "srclib belirtimi ayrıştırılamadı (referans belirtilmedi): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" msgstr "srclib belirtimi ayrıştırılamadı (çok fazla '@' işareti): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" msgstr "{path} oluşturuldu" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" msgstr "şu anki sürüm daha yeni: eski sürüm kodu={old}, yeni sürüm kodu={new}" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" msgstr "siliniyor: repo/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" msgstr "{path} işlem günlüğü {dest}'e dağıtıldı" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest= %r gibi seçenekler için gerekli" #: ../fdroidserver/scanner.py msgid "downloading '{}'" msgstr "'{}' indiriliyor" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" msgstr "'{}' tarayıcı imzalarının indirilmesi başarısız oldu" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" msgstr "çalıştırılabilir ikili dosya, muhtemelen kod" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "beklenen %s argümandı" msgstr[1] "beklenen %s argümandı" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "beklenen en az bir argümandı" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "beklenen en çok bir argümandı" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "beklenen bir argümandı" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--help|--version|]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" msgstr "imzaların en son sürümünü internetten al" #: /usr/lib/python3.11/optparse.py msgid "floating-point" msgstr "kayan nokta" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "üst veri hatalarının (öntanımlı) uyarı olmasını veya yok sayılmasını zorunlu kıl." #: ../fdroidserver/common.py msgid "git svn clone failed" msgstr "git svn clone başarısız" #: ../fdroidserver/scanner.py msgid "gzip file archive" msgstr "gzip dosya arşivi" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "açık argüman %r yok sayıldı" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 bir imzaya sahip olmalı, oluşturmak için `fdroid signindex` kullanın!" #: ../fdroidserver/index.py msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 bir imzaya sahip olmalı, oluşturmak için `fdroid signindex` kullanın!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" msgstr "tamsayı" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "geçersiz %(type)s değeri: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "geçersiz seçim: %(value)r (%(choices)s içinden seçin)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "geçersiz conflict_resolution değeri: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "geçersiz seçenek satırı %(option)r: %(prefix_chars)r karakteri ile başlamalı" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" msgstr "ipfs_cid bulunamadı, CIDv1 oluşturma atlanıyor" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" msgstr "en son yapı tarifi daha yeni: eski sürüm kodu={old}, yeni sürüm kodu={new}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "local_copy_dir \"fdroid\" ile sonlanmıyor, belki de \"{path}\" demek istediniz" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" msgstr "local_copy_dir mutlak bir yol olmalı!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" msgstr "local_copy_dir bir dizin olmalı, dosya değil!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" msgstr "Yansıma '%s' 'fdroid' ile bitmiyor!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "birbirinden bağımsız argümanlar isteğe bağlı olmalıdır" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" msgstr "sonraki {name} önbellek güncellemesi {time} içinde" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" msgstr "{appid} içinde simge yok" #: ../fdroidserver/signatures.py msgid "no APK supplied" msgstr "APK sağlanmadı" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" msgstr "böyle bir şeçenek yok: %s" #: ../fdroidserver/__main__.py msgid "no version info found!" msgstr "Sürüm bilgisi bulunamadı!" #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "sürüm bilgisi bulunamadı" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "argüman %s ile izin verilmez" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "%s argümanlarından biri gerekli" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" msgstr "yalnızca dizgileri, listeleri ve demetleri (tuple) kabul eder" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "seçenek %s: Tüm imzalı uygulamaları gerçekten kurmak istiyorsanız, --all kullanın" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "seçenek %s: geçersiz %s değeri: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "seçenek %s: geçersiz seçim: %r (%s içinden seçin)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" msgstr "-%s seçeneği tanınmıyor" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" msgstr "-%s seçeneği argüman gerektirir" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "--%s seçeneğinin argümanı olmamalı" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "--%s seçeneği tekil ön ek değil" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" msgstr "--%s seçeneği tanınmıyor" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s requires argument" msgstr "--%s seçeneği argüman gerektirir" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "isteğe bağlı argümanlar" #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "seçenekler" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" msgstr "var olan {path} üzerine yazılıyor" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "konumsal argümanlar" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" msgstr "{path} işlem günlüğünü {dest}'e dağıtma başarısız oldu!" #: ../fdroidserver/build.py msgid "reference binary missing signature" msgstr "referans ikili eksik imza" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" msgstr "güvensiz HTTP bağlantısı ile indirmeyi reddet (HTTPS kullanın veya --no-https-check belirtin): {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." msgstr "repo_icon \"repo/icons/%s\" yok, yer tutucu oluşturuyor." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" msgstr "repo_url'nin /repo ile bitmesi gerekiyor" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml kurulu değil, üst veriler yazılamıyor." #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sync {path} konumunu {url} adresine indeksler ve siler" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "tarayıcı önbelleği bozuk! Şu şekilde temizleyebilirsiniz: '{clear}'" #: ../fdroidserver/scanner.py msgid "shared library" msgstr "paylaşımlı kütüphane" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" msgstr "programın sürüm numarasını göster ve çık" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" msgstr "bu yardım yazısını göster ve çık" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." msgstr "imzalanmış APK ya bir dosya konumu ya da bir HTTPS URL." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" msgstr "tam yapı günlüklerini dağıtmayı atla: günlük içeriği boş" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" msgstr "tam yapı günlüklerini dağıtmayı atla: yapılandırmada etkin değil" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" msgstr "kaynak tarball'ı atlanıyor: {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" msgstr "srclibs'de ad ve/veya @ eksik" #: ../fdroidserver/scanner.py msgid "static library" msgstr "statik kütüphane" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" msgstr "sağlanan referans ikilisi {signer} imzalayana izin verdi" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "şu argümanlar gerekli: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "beklenmeyen seçenek satırı: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "bilinmeyen ayrıştırıcı %(parser_name)r (seçenekler: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "tanınmayan argümanlar: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "'{config_file}' üzerinde güvenli olmayan izinler (0600 olmalı)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "kullanım: " #: ../fdroidserver/deploy.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" msgstr "{url} ile eşitleme için Apache libcloud kullanılıyor" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com hızı sınırlıyor, yeniden deneme bekleniyor..." #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" msgstr[0] "{0} uygulama, {1} anahtar adı" msgstr[1] "{0} uygulama, {1} anahtar adı" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename}{appid} üst verisi yok!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" msgstr "{apkfilename} içinde birden çok {name} dosyası var, Master Key istisamarı gibi görünüyor!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "{apkfilename} içindeki AndroidManifest.xml tarihi bozuk: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} bir ada sahip değil! Bunun yerine uygulama kimliği kullanılıyor." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" msgstr "{path}'den {appid} geçerli bir Android uygulama kimliği değil!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{path}'den {appid} geçerli bir Java Paket Adı değil!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" msgstr "{appid} hem APK hem de dosyalara sahip: {files}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" msgstr "{appid} içinde {name} eksik" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" msgstr "{appid}: İnşa '{versionName}' içinde bilinmeyen extlib {path}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" msgstr "{appid}: belirtilen inşa yok, şu anki kaynak durumu üstünden çalıştırılıyor" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" msgstr "{appid}: {field} bir '{type}' olmalı, fakat o bir '{fieldtype}!'" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" msgstr "{appid}: {field} bir '{type}' olmalı, fakat o bir '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} bir tam sayı olmalıdır, bulunan: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be list or string, found: {value}" msgstr "{build_flag} liste veya dize olmalıdır, bulunan: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" msgstr "{file} boş veya bozuk!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" yok! config.yml içinde düzeltin." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} kullanımdan kaldırıldı, {newfile} kullanın" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "{path} zaten var, içe aktarma sonuçları yok sayılıyor!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" msgstr "{path} yok! Şunu çalıştırarak oluşturun:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} konumunun bozuk imzası \"{pattern}\" var, olası Janus istismarı!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" msgstr "{path} boyutu sıfır!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} 200MB'den fazla, elle yükleyin: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} \"fdroid\" ile bitmiyor, URL konumunu doğrulayın!" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url} \"http\" ile başlamıyor!" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" msgstr[0] "{} inşa başarısız" msgstr[1] "{} inşa başarısız" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} inşa başarılı" msgstr[1] "{} inşa başarılı" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/locale/uk/0000755000175000017500000000000014620351546014666 5ustar00hanshans././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.888382 fdroidserver-2.3a1/locale/uk/LC_MESSAGES/0000755000175000017500000000000014620351546016453 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/locale/uk/LC_MESSAGES/fdroidserver.po0000644000175000017500000033123214620351225021507 0ustar00hanshans# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # Hans-Christoph Steiner , 2020. # ihor_ck , 2020. # Ihor Hordiichuk , 2020, 2021, 2022, 2023. # Tymofij Lytvynenko , 2021. # DankXylese , 2021. # Dan , 2022. # Sergii Horichenko , 2023. # Макар Разин , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2023-05-28 07:54+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.18-dev\n" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" "\n" "Загальнодоступний ключ SSH буде використано як ключ розгортання:" #: ../fdroidserver/nightly.py #, python-brace-format msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" "\n" "{path} закодовано для таємної змінної DEBUG_KEYSTORE:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" не має відповідного файлу метаданих!" #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" msgstr "\"local_copy_dir\" {path} не існує!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\" вже встановлено на {dev}." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" msgstr "\"{path}\" містить застарілу {name}{version}" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" msgstr "\"{path}\" містить найновішу {name}{version}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" msgstr "\"{path}\" існує, але s3cmd не встановлений!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" msgstr "\"{path}\" має непідтримуваний формат (скористайтеся: metadata/*.yml)" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "«{path}» підписано не дозволеним ключем:" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" є недійсною URL-адресою!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" msgstr[0] "%(option)s параметр вимагає %(number)d аргумент" msgstr[1] "%(option)s параметр вимагає %(number)d аргументи" msgstr[2] "%(option)s параметр вимагає %(number)d аргументів" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: помилка: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" msgstr "%d знайдено проблем" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "%prog [options]" msgstr "%prog [параметри]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" msgstr "%r не можна викликати" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" msgstr "%s не створює dict!" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" msgstr "%s має неправильний SHA-256: %s" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" msgstr "%s не є прийнятним полем для створення" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" msgstr "%s параметр не приймає значення" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' не знайдено в config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' — NONE і 'smartcardoptions' порожній!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "'keystore' не знайдено в config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' не знайдено в config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' не знайдено в config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' недійсний аргумент для позицій" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" msgstr "'sdk_path' не встановлено в config.yml!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' занадто старий, fdroid вимагає build-tools-{version} або новіший!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" msgstr "'{field}' буде у довільному порядкові! Використовуйте () або [], якщо порядок є важливим!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" msgstr "'{path}' не вдалося виконати!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' має недійсний формат, це має бути словник!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' не є правильним {field} у {appid}. Правильний приклад: {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' не є дійсним {field}, має бути {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" msgstr "... checkupdate не вдалося для {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() не визначено" #: ../fdroidserver/lint.py msgid "/issues is missing" msgstr "/issues відсутній" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" msgstr "URL потребується як аргумент!" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Додати підписи GnuPG для пакунків у репозиторії" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" msgstr "Створіть ключ підписування репозиторіїв до непідписаного репозиторію" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" msgstr "Додати тулуб файлових метаданих файлів для пакунків APK, яких бракує" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" msgstr "Додати новий репозиторій лише для {name}" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" msgstr "Псевдонім підписного ключа репозиторію у сховищі ключів" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" msgstr "AllowedAPKSigningKeys відсутні, але надається посилання на двійковий файл" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Дозволяє вказати іншу версію (або git гілку) для початкового імпорту" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" msgstr "Також відзеркалити всю секцію архіву" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" msgstr "Також попередити про проблеми форматування, наприклад rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" msgstr "Бібліотека Android AAR" #: ../fdroidserver/scanner.py msgid "Android APK file" msgstr "Файл Android APK" #: ../fdroidserver/scanner.py msgid "Android DEX code" msgstr "Код Android DEX" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" msgstr "Android SDK не знайдено в {path}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" msgstr "Android SDK шлях '{path}' не існує!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" msgstr "Android SDK шлях '{path}' це не каталог!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" msgstr "Інструмент Android SDK {cmd} не знайдено!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "Програма має двійкові файли, але не має відповідних AllowedAPKSigningKeys для закріплення сертифіката." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Застосунок має NoSourceSince або ArchivePolicy «0 версій», але AutoUpdateMode або UpdateCheckMode не дорівнюють None" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" msgstr "Застосунок '{repo}' але має ланку до {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "Версія програми має двійковий код, але не має відповідних AllowedAPKSigningKeys для закріплення сертифіката." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Додавання .git не потрібно" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" msgstr "Архівую {apkfilename} з неправильним підписом!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode з UpdateCheckMode: HTTP повинен мати шаблон." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" msgstr "Неправильний тип запису \"{mirrortype}\" у конфігурації дзеркал: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "Базова URL-адреса для дзеркала може містити ключ підпису індексу за допомогою рядка запиту: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" msgstr "Гілка \"{branch}\" використовується як подання до збірки '{versionName}'" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" msgstr "Гілка '{branch}' використовується як подання в бібліотеку srclib '{srclib}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" msgstr "Недійсне посилання: {path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" msgstr "Зібрати пакунок з джерела" #: ../fdroidserver/build.py msgid "Build all applications available" msgstr "Створіть всі доступні застосунки" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" msgstr "Збірку, створено за допомогою `fdroid import` - видаліть рядок вимикання після готовності" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" msgstr "У git-репозиторії з метаданими збірки є незбережені зміни!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" msgstr "Побудуйте лише найновішу версію кожного пакунка" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" msgstr "Вбудований репозиторій створено у \"%s\" на основі конфігурації:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" msgstr "Автооновлення застосунку без CurrentVersionCode неможливе" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "Неможливо створити через {} помилку під час сканування" msgstr[1] "Неможливо створити через {} помилки під час сканування" msgstr[2] "Неможливо створити через {} помилок під час сканування" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" msgstr "Не вдалося перезаписати шлях \"{path}\"" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "Категорія '%s' неприпустима" #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "Категорії не встановлено" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Перевірте наявність оновлень для застосунків" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Перевірка архівації на {appid} — apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Очистити оновлення - не використовує кеш, повторно обробляє всі APK" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Список категорій, розділених комами." #: ../fdroidserver/__main__.py #, python-format msgid "Command '%s' not recognised.\n" msgstr "Команда '%s' не визнана.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" msgstr "Прийняти зміни" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" msgstr "Конфлікт визначень \"{field}\" між .yml і локалізованими файлами:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Конфліктні аргументи: \"---verbose\" і \"--quiet\" не можна вказати одночасно." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" msgstr "Суперечливі файли налаштувань! Використання {newfile}, ігнорування {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "Не вдалося знайти '{command}' у вашій системі" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Не вдалося знайти останню версію коду" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Не вдалося знайти найновішу назву версії" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" msgstr "Не вдалося знайти шлях {path}, щоб вилучити його" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " msgstr "Не вдалося відкрити файл APK {path} для аналізу: " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Не вдалося проаналізувати розмір \"{size}\", неправильний тип \"{type}\"" #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Не вдалося знайти ID застосунку" #: ../fdroidserver/checkupdates.py msgid "Couldn't find any version information" msgstr "Не вдалося знайти відомості про версію" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "Не вдається знайти ідентифікатор пакунка" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" msgstr "Боязно трохи, ми відмовляємося перезаписувати наявний ключ підписування!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" msgstr "Створено новий контейнер \"{name}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Створення \"{path}\" для налаштування s3cmd." #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Створення каталогу журналу" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" msgstr "Створення нового блоку S3: {url}" #: ../fdroidserver/publish.py msgid "Creating output directory" msgstr "Створення вихідного каталогу" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" msgstr "Створення підписаного індексу за допомогою цієї клавіші (SHA256):" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" msgstr "Створення тимчасового каталогу" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" msgstr "Створення непідписаного індексу під час підготовки до підписання" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" msgstr "CurrentVersionCode {cv} менше, ніж найстаріший запис збірки {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" msgstr "DEBUG_KEYSTORE не встановлено або значення є неповним" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" msgstr "Видалити APK та/або OBB без метаданих з репозиторію" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" msgstr "Видалення архіву, репозиторій завеликий ({size} макс. {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" msgstr "Видалення історії git-mirror, репозиторій завеликий ({size} макс {limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" msgstr "Видалення невідомого файлу: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" msgstr "Опис '%s' є лише резюме застосунку" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" msgstr "Опис містить дублікат рядка" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" msgstr "Опис містить список (%s) але не маркірований (*) і не пронумерований (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" msgstr "Довжина опису {length} перевищує ліміт {limit}" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Не додавайте 'disable:' до створених записів збірки" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" msgstr "Не розміщувати нові файли до репозиторію одразу" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" msgstr "Не включайте \"{path}\" до URL-адреси!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" msgstr "Не точний шлях Android SDK, просто збій" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" msgstr "Не вилучайте приватні ключі, утворені у сховищі ключів" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" msgstr "Не створюйте вихідний код, корисно під час тестування створення" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" msgstr "Не оновлюйте репозиторій, корисно під час тестування створення без з'єднання з Інтернетом" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" msgstr "Не використовуйте контрольні суми rsync" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Завантажувати повноцінні дзеркала невеликих репозиторіїв" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" msgstr "Завантаження %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Завантаження репозиторію вже не вдалося, не намагайтеся знову." #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" msgstr "Завантаження {url} не вдалося. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" msgstr "Дубльована декларація небажаних функцій у {path} була проігнорована!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" msgstr "Дубльований запис \"%s\" у конфігурації дзеркал!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" msgstr "Дублікат посилання в '{field}': {url}" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ПОМИЛКА: Підкоманду \"server\" вилучено, використовуйте \"deploy\"!" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" "ПОМИЛКА: ця команда ніколи не повинна використовуватися для створення дзеркала f-droid.org!\n" "Повне дзеркало f-droid.org вимагає понад 200GB." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ПОМИЛКА: непідтримуваний вид CI, виправлення вітається!" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "ПОМИЛКА: непідтримуваний git-хост «%s», виправлення вітаються!" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." msgstr "Кодування встановлено на '{enc}' fdroid може отримати проблеми з кодуванням. Встановіть його на 'UTF-8' для найкращих результатів." #: ../fdroidserver/init.py #, python-format msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" "Введіть шлях до Android SDK (%s) тут:\n" "> " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" msgstr "Змінну середовища {var} від {configname} не налаштованоно!" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Помилка отримання адреси репозиторію" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" msgstr "Вихід із ненульовим кодом, якщо виявлено проблеми" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Витяг метаданих застосунку з вихідного репозиторію" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Експортування підписів з APK" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" msgstr "Не вдалося копіювати {path}: {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" msgstr "Не вдалося завантажити підписи для '{apkfilename}': {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" msgstr "Не вдалося розпізнати {path}: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" msgstr "Не вдалося змінити розмір {path}: {error}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" msgstr "Не вдалося створити сигмент S3: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" msgstr "Не вдалося отримати подробиці про APK, {path} буде видалено" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" msgstr "Не вдалося отримати подробиці про APK, {path} буде пропущено" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" msgstr "Не вдалося отримати відбиток ключа підпису APK" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" msgstr "Не вдалося встановити '{apkfilename}' в {dev}: {error}" #: ../fdroidserver/common.py msgid "Failed to sign application" msgstr "Не вдалося підписати застосунок" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" msgstr "Сервер для збірки скопійовано з ВМ {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" msgstr "Отримані підписи для '{apkfilename}' -> '{sigdir}'" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" msgstr "Файл зник під час його обробки: {path}" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py #: ../fdroidserver/update.py msgid "Finished" msgstr "Готово" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" msgstr "Належний до FlattrID метод допомоги Flattr: не вдалося" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Заборонені мітки HTML" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." msgstr "Збирати заблоковані застосунки попри проблеми сканування. Дозволено лише в тестовому режимі." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" msgstr "Примусово зупиняти збірку після {0} сек. затримки!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." msgstr "Примусово сканувати вимкнені застосунки та збірки." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" msgstr "У \"{path}\" виявлено зображення без метаданих для застосунку \"{name}\"!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "Знайдено пошкоджений файл фінансування \"{path}\" для \"{name}\":" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" msgstr "Знайдено недійсні прикладні програми в аргументах" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "Знайдено недійсні версії коду для деяких застосунків" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Знайдено кілька файлів блоку підписів JAR у {path}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" msgstr "Знайдено кілька файлів метаданих для {appid}" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." msgstr "Знайдено кілька сертифікатів підписування для репозиторію." #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." msgstr "Не знайдено сертифікатів підписування для репозиторію." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" msgstr "Знайдено не файл у %s" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" msgstr "Знайдено {apkfilename} у {url}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} problems in {filename}" msgstr "Виявлено {count} проблем у {filename}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" msgstr "Знайдено {count} попередження в {filename}" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" msgstr "Створено основні метадані для {appid}" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" msgstr "Помилка перевірки Git '%s'" #: ../fdroidserver/common.py msgid "Git clean failed" msgstr "Очистити Git невдалося" #: ../fdroidserver/common.py msgid "Git fetch failed" msgstr "Git вибірка не вдалася" #: ../fdroidserver/common.py msgid "Git prune failed" msgstr "Не вдалося виконати Git prune" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Помилка налаштування remote set-head для Git: «%s»" #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Скидання Git не вдалося" #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Не вдалося синхронізувати підмодуль Git" #: ../fdroidserver/common.py msgid "Git submodule update failed" msgstr "Не вдалося оновити підмодуль Git" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" msgstr "HTTPS потрібно використовувати з URL-адресами Subversion!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" msgstr "Якщо git mirror стає великим, дозволити видалити архів" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" msgstr "Якщо це завантаження не вдалося, спробуйте завантажити власноруч на {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." msgstr "Нехтування метаданими '{field}' у метаданих '{metapath}', оскільки їх вилучено." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "Нехтування записом FUNDING.yml з датою після 2048 року: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" msgstr "Ігнорування поганого елемента в маніфесті: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Нехтування пакунком без метаданих: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" msgstr "Нехтування застарілим кешем для {apkfilename}" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" msgstr "Включити APK, які підписані без алгоритмів, таких як MD5" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" msgstr "Включити у дзеркало файли .asc підпису PGP" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" msgstr "Включити журнали збірки в дзеркало" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" msgstr "Включити джерело tarballs в дзеркало" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" msgstr "Включно з метаданими від %s@%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" msgstr "Включно з метаданими з {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Під'єднання підмодулів" #: ../fdroidserver/install.py msgid "Install all signed applications available" msgstr "Встановити всі доступні підписані застосунки" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" msgstr "Встановити побудовані пакунки на пристрої" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." msgstr "Встановлення %s..." #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." msgstr "Встановлення '{apkfilename}' на {dev}..." #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" msgstr "Взаємодія з HTTP-сервером репозиторію" #: ../fdroidserver/update.py msgid "Invalid APK" msgstr "Недійсний APK" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" msgstr "Неприпустимий AutoUpdateMode: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" msgstr "Неприпустимий UpdateCheckMode: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" msgstr "Недійсна VercodeOperation: {field}" #: ../fdroidserver/lint.py #, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "Недійсна VercodeOperation: {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "Недійсний ID застосунку {appid}" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" msgstr "Недійсний логічний '%s'" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Недійсний розмічений список" #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" msgstr "Неправильне ім'я для оприлюдненого файлу: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" msgstr "Неприпустимий ndk: запис у збірці: \"{ndk}\"" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " msgstr "Недійсне переспрямування на не-HTTPS: {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" msgstr "Недійсні метадані scrlib: '{file}' не існує" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" msgstr "Неправильні метадані srclib: не вдалося зчитати «{file}»" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" msgstr "Неприпустимі метадані srclib: невідомий ключ '{key}' у '{file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" msgstr "Підпис JAR не вдалося перевірити: {path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" msgstr "Підтверджено підпис JAR: {path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" msgstr "Файл Java JAR" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" msgstr "Java JDK не знайдено! Встановіть в усталеному розташуванні або встановіть java_paths!" #: ../fdroidserver/scanner.py msgid "Java compiled class" msgstr "Java складений клас" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" msgstr "Jarsigner Java не знайдено! Встановіть в усталеному розташуванні або встановіть java_paths!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" msgstr "В атрибутах джерельного HTML коду міститься Javascript" #: ../fdroidserver/build.py #, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" msgstr "Зберігання невдалої збірки \"{apkfilename}\"" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Шлях до сховища ключів для ключа підпису сховища\t" #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" msgstr "Останнє подання '{commit}' виглядає як мітка, але в режимі перевірки оновлення '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" msgstr "Належний до Liberapay метод допомоги Liberapay: не вдалося" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted (dry run)" msgstr "Список файлів, які будуть переформатовані (пробний запуск)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "Переклад включено до URL-адреси f-droid.org" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" msgstr "Зробити зупинку створення за винятками" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." msgstr "Несправні дзеркала репозиторію." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" msgstr "Несправний шлях serverwebroot:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" msgstr "Досягнуто максимальної глибини рекурсії у ZIP-файлі: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Дзеркало всього репозиторію та архіву всіх типів файлів." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" msgstr "Відсутній вихідний шлях" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" msgstr "Переміщення декларацій небажаних функцій до локалізованих файлів:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "Ні \"repo_pubkey\", ні \"keystorepass\" не встановлені в config.yml" #: ../fdroidserver/verify.py #, python-format msgid "No APK for package: %s" msgstr "Немає APK для пакунка: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Не знайдено Android SDK!" #: ../fdroidserver/install.py msgid "No attached devices found" msgstr "Не знайдено приєднаних пристроїв" #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Немає власного цифрового відбитка в URL-адресі." #: ../fdroidserver/common.py msgid "No git submodules available" msgstr "Немає доступних підмодулів git" #: ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "Не знайдено жодного проєкту gradle. Вказати його у --subdir?" #: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Подробиць не знайдено." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" msgstr "Не знайдено відповідних тегів" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." msgstr "У {0} не знайдено мінімальної версії SDK, усталено (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Не має потреби вказувати, що застосунок є вільним ПЗ" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" msgstr "Не має потреби вказувати, що застосунок призначено для Android" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "Недостатньо параметрів! Змініть свій config.yml, щоб встановити принаймні один з цих:" #: ../fdroidserver/common.py msgid "No packages specified" msgstr "Пакунків не вказано" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" msgstr "Немає підписаних APK для %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" msgstr "Немає підписаного вихідного шляху — нічого виконувати" #: ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" msgstr "У {path} не знайдено сертифікатів для підписання" #: ../fdroidserver/common.py #, python-format msgid "No such package: %s" msgstr "Такого пакунка немає: %s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" msgstr "Немає такого versionCode {versionCode} для застосунку {appid}" #: ../fdroidserver/checkupdates.py msgid "No tags found" msgstr "Теги не знайдено" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" msgstr "Немає непідписаної теки — нічого виконувати" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Недійсне визначення розміру: \"{}\"" #: ../fdroidserver/signindex.py msgid "Nothing to do" msgstr "Нічого виконувати" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." msgstr "Для {appid} нічого виконувати." #: ../fdroidserver/init.py msgid "Now set these in config.yml:" msgstr "Тепер встановіть їх у config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" msgstr "OBB-файл має новішу версію коду ({integer}), ніж будь-який APK:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" msgstr "Назва файлу OBB повинна починатися з \"main.\" або \"patch.\":" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" msgstr "Назва пакунку OBB не відповідає підтримуваному APK:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Автономна машина, пропускання генерації дзеркал git до `fdroid deploy`" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Підтримуються лише PNG та JPEG зображення, знайдено: {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Друкувати відмінності тільки з Play Store" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Обробляти застосунки лише за допомогою автоматичних оновлень" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Належний до OpenCollective метод допомоги OpenCollective: не вдалося" #: /usr/lib/python3.11/optparse.py msgid "Options" msgstr "Параметри" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Виведіть JSON-звіт у назві файлу APK." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." msgstr "Вивід JSON на stdout." #: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py #: ../fdroidserver/publish.py ../fdroidserver/signindex.py #: ../fdroidserver/update.py msgid "Outputting JSON" msgstr "Вивід JSON" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Загальна ліцензія проєкту." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Перезапис порожнього versionName у {apkfilename} з метаданих: {version}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "Пакунок \"{appid}\" вже існує" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" msgstr "Читання маніфесту у '{path}'" #: ../fdroidserver/common.py msgid "Password required with username" msgstr "Потрібен парольіз іменем користувача" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "Шлях до основного підкаталогу проєкту Android, якщо не в кореневому каталозі." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" msgstr "Шлях до Android SDK (іноді встановлено в ANDROID_HOME)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" msgstr "Шлях до git-репозиторію, який використовується для журналювання" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" msgstr "Шлях до сховища ключів для підписного ключа репозиторія" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Вивести таємну змінну до термінала для легкого копіювання/вставлення" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" msgstr "Проблема з ZIP файлом: %s, помилка %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" msgstr "Проблема з xml у '{path}'" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" msgstr "Процес автоматичних оновлень" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" msgstr "Обробка {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" msgstr "Обробка {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" msgstr "Створити доступний для читання людиною XML/JSON для індексування файлів" #: ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "URL-адреса проєкту для імпорту." #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" msgstr "Слід уникати пунктуації" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" msgstr "Надіслати журнал цього віддаленого репозиторію git" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing binary transparency log to {url}" msgstr "Оновити двійковий журнал прозорості для {url}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" msgstr "Оприлюднення до {url}" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" msgstr "Швидкий запуск нового репозиторія" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" msgstr "Прочитайте всі файли метаданих і вийдіть" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" msgstr "Читання '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" msgstr "Помилка packageName/versionCode/versionName, APK недійсне: '{apkfilename}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" msgstr "Не вдалося прочитати packageName/versionCode/versionName failed, APK недійсний: '{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" msgstr "Читання {apkfilename} з кешу" #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Вилучення вказаних файлів" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" msgstr "Вилучення {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Перейменування файлів APK, які не відповідають package.name_123.apk" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" msgstr "Режим оновлення RepoTrunk має сенс лише в репозиторіях git-svn" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." msgstr "Перезавантажте та створіть новий сервер створення, навіть якщо наявний існує." #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" msgstr "Повторне підписання {apkfilename} з наданим debug.keystore" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" msgstr "Змінити розмір усіх значків, що перевищують максимальний розмір пікселя та вийти" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" msgstr "Обмеження виводу на попередження і помилки" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Перепишіть усі файли метаданих" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" msgstr "Перезапис '{appid}'" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" msgstr "Запустити для git-репозиторію з не подаинми змінами" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Запустити rewritemeta виправити форматування" #: ../fdroidserver/deploy.py msgid "Running first pass with MD5 checking disabled" msgstr "Запуск першого проходу з вимкненою перевіркою MD5" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" msgstr "Запуск wget у {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" msgstr "SHA-256 {url} не відповідає запису!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Перевірити отриманий файл APK на наявність відомих невільних класів." #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" msgstr "Сканування початкового коду пакунка" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {apk}" msgstr "Зчитувач знайшов {count} проблеми в {apk}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" msgstr "Зчитувач знайшов {count} проблеми в {appid}:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" msgstr "Зчитувач знайшов {count} проблеми в {appid}: {versionCode}:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "Знайдено {} проблему" msgstr[1] "Знайдено {} проблеми" msgstr[2] "Знайдено {} проблем" #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "Сканування APK за допомогою dexdump на наявність відомих невільних класів." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" msgstr "Установити NDK {release} ({version})" #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Встановіть годинник на цей час, використовуючи:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" msgstr "Встановити найбільшу кількість випусків у репозиторії перед архівуванням старих" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" msgstr "Встановити обмеження відкритого файлу на {integer}" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" msgstr "Налаштувати застосунок для збірки репозиторію в нічний час" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " msgstr "Не вдалося встановити обмеження кількості одночасно відкритих файлів: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" msgstr "Час очікування для цієї збірки становить {0}" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Записати та розмістити пакунки в репозиторії" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" msgstr "Запис індексів, створених за допомогою update --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" msgstr "Пропустити сканування початкового коду на наявність двійкових файлів та інших проблем" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Недійсний підпис '{apkfilename}', пропускаємо!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" msgstr "Пропуск дзеркала GitLab Pages через завеликий розмір репозиторію (>%.2fГБ)!" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" msgstr "Пропуск створення індексу для {appid}" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" msgstr "Недійсний підпис {apkfilename}, пропускаємо!" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" msgstr "Пропуск {appid}: вимкнено" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" msgstr "Вкажіть локальну теку, щоб синхронізувати репозиторій у" #: ../fdroidserver/deploy.py msgid "Specify an identity file to provide to SSH for rsyncing" msgstr "Вкажіть файл ідентифікатора для надання SSH для rsyncing" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." msgstr "Вкажіть, який файл зневадження сховища ключів застосовувати." #: ../fdroidserver/common.py msgid "Spew out even more information than normal" msgstr "Випишіть ще більше даних, ніж звичайно" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" msgstr "Видалення невідомого підпису для {apkfilename}" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" msgstr "Опис '%s' — це лише назва застосунку" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" msgstr "Довжина опису {length} перевищує обмеження {limit} знаків" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" msgstr "Системний годинник відстає від date в {path}!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" msgstr "Режим оновлення тегів наразі працює лише для репозиторіїв git, hg, bzr та git-svn" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "Режим оновлення тегів, який використовується в git-svn, але репозиторій не було налаштовано за допомогою тегів" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Тестовий режим - надсилайте випуск лише в каталозі tmp і завжди створюйте його, навіть якщо випуск вже існує." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" msgstr "Код версії OBB повинен надходити після \"{name}.\":" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" msgstr "Базова URL-адреса для входу до репозиторію (типово: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" msgstr "Каталог для запису дзеркала" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" msgstr "Файл, який слід включити до репозиторію (шлях чи шаблон шляху)" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." msgstr "Цифровий відбиток репозиторію не збігається." #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" msgstr "Кореневої теки local_copy_dir \"{path}\" не існує!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" msgstr "Відбулося зіткнення keyalias ключів - припинення оприлюднення" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." msgstr "Ці застосунки, заархівовано з основного репозиторію." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Цей репозиторій застосунків для використання з FDroid. Застосунки в цьому репозиторії — це або офіційні двійкові файли, побудовані розробниками оригінального застосунку, або двійкові файли, побудовані з джерела f-droid.org за допомогою інструментів з https://gitlab.com/fdroid." #: ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Репозиторій вже має локальні метадані: %s" #: ../fdroidserver/init.py #, python-format msgid "" "To complete the setup, add your APKs to \"%s\"\n" "then run \"fdroid update -c; fdroid update\". You might also want to edit\n" "\"config.yml\" to set the URL, repo name, and more. You should also set up\n" "a signing key (a temporary one might have been automatically generated).\n" "\n" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" "Щоб завершити налаштування, додайте свої файли .apk до «%s»\n" "потім запустіть \"fdroid update -c; fdroid update\". Ви також можете відредагувати\n" "\"config.yml\", щоб установити URL-адресу, назву репозиторію тощо. Ви також повинні\n" "налаштувати ключ підпису (тимчасовий ключ може бути створено автоматично).\n" "\n" "Докладніше: : https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Для використання awsbucket, awssecretkey та awsaccesskeyid також слід налаштувати config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "URL-адреса має починатися з https:// або http://" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" msgstr "Скорочувачі URL-адрес не варто використовувати" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" msgstr "URL {url} в описі: {error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" msgstr "Недійсна мітка ліцензії \"{}\"! Використовуйте лише затверджені FSF чи OSI мітки з https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Неочікувана мітка ліцензії \"{}\"! Використовуйте лише мітки ліцензій, налаштовані у файлі налаштувань" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" msgstr "Неочікувана ціль символічного посилання: {link} -> {target}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" msgstr "Невідомий запис {key} у {configname}" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Виявлено невідому виняткову ситуацію!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" msgstr "Невідомий файл '{filename}' в збірці '{versionName}'" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" msgstr "Невідомий формат метаданих: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" msgstr "Невідомий формат метаданих: {path} (використовуйте: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " msgstr "Невідома версія aapt, може спричинити складнощі: " #: ../fdroidserver/lint.py msgid "Unnecessary leading space" msgstr "Непотрібна прогалина на початку рядка" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" msgstr "Зайва прогалина в кінці" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" msgstr "Нерозпізнане поле застосунку '{fieldname}' в '{path}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Нерозпізнаний прапорець збірки '{build_flag}' у '{path}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" msgstr "Тип файлу не підтримується \"{extension}\" для репозиторію графіки" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" msgstr "Знайдено непідтримуване зображення: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" msgstr "Невикористаний extlib у %s" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" msgstr "Невикористаний файл у %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" msgstr "Невикористаний шлях scandelete: %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" msgstr "Невикористаний шлях scanignore: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" msgstr "Видобути в %s" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Оновіть дані репозиторію для нових пакунків" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" msgstr "Оновити бінарний журнал прозорості для URL-адреси" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData має недійсну URL-адресу: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" msgstr "UpdateCheckData повинен відповідати коду версії як ціле число (\\d або [0-9]): {codeex}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" msgstr "UpdateCheckData має використовувати URL-адресу HTTPS: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData не є дійсною URL-адресою: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode налаштовано, але схоже, що команду checkupdates ще не було запущено" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "Назву застосунку для перевірки оновлень встановлено на відомий ID застосунку — його можна буде вилучити" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" msgstr "Завантаження {apkfilename} на androidobservatory.org" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" msgstr "Завантаження {apkfilename} до virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "Usage" msgstr "Використання" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Використання: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Використовуйте /HEAD замість /master для вказання на файл типовій гілці" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Використовуйте `fdroid update -c`, щоб створити файли метаданих." #: ../fdroidserver/build.py msgid "Use build server" msgstr "Використовуйте сервер створення" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" msgstr "Використовуйте дату з APK замість поточного часу для нових доданих APK" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." msgstr "Використання \"{path}\" для налаштування s3cmd." #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "Використання підпису APK v2" #: ../fdroidserver/common.py msgid "Using APK Signature v3" msgstr "Використання підпису APK v3" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Не варто перевіряти APK за допомогою jarsigner Java! Користуйтеся apksigner" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" msgstr "Використання androguard від \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" msgstr "Використання порожнього словника замість вмісту {path}!" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" msgstr "Застосування наявного сховища ключів \"{path}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" msgstr "Використовувати s3cmd для синхронізації з: {url}" #: ../fdroidserver/__main__.py msgid "Valid commands are:" msgstr "Дійсні команди:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." msgstr "Перевіряти, за допомогою локальної кешованої копії замість повторного завантаження." #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" msgstr "Перевірте цілісність завантажених пакунків" #: ../fdroidserver/index.py msgid "Verifying index signature:" msgstr "Перевірка підпису індексу:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "Ключ API VirusTotal не може завантажити файли, розмір яких понад 32 МБ, використовуйте {url} для завантаження {path}." #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Попереджати про можливі помилки метаданих" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Коли налаштовано для підписаних індексів, на цьому етапі створюйте лише непідписані індекси" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "Під час перевірки всього репозиторію, yamllint типово вимкнено. Цей параметр змушує нехтувати yamllint." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distiguished Name' використовується під час створення ключів" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" msgstr "За допомогою ANDROID_HOME можна встановити шлях до SDK, тобто:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" msgstr "ZIP-архів" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" msgstr "додавання IdentityFile до {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" msgstr "додавання до {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "неоднозначний параметр: %(option)s може відповідати %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "неоднозначний параметр: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner не знайдено! Не вдалося підписати або перевірити актуальні файли APK" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "apksigner не знайдено, це потрібно для підписання!" #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "application ID файлу застосунку для роботи на" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" msgstr "ID застосунку з необов'язковим versionCode у формі APPID[:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" msgstr "archive_url має закінчуватися на /archive" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "аргумент \"-\" в режимі %r" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" msgstr "аргумент %(argument_name)s: %(message)s" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" msgstr "спроба відкритого з'єднання ssh для перевірки ключа розгортання:" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" msgstr "не вдається проаналізувати специфікацію scrlib (не рядок): '{}'" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "не вдалося відкрити «%(filename)s»: %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" msgstr "не вдалося відкрити не-https url: '{};" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" msgstr "не вдалося знайти потрібні srclibs: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "не може мати кілька аргументів підпарсера" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "не може об'єднати дії - дві групи мають ім'я %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" msgstr "не вдалося оприлюднити оновлення. Ви встановили ключ розгортання?" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" msgstr "клонування {url}" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" msgstr "команди з модулів плагіна:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" msgstr "складний" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "суперечний рядок параметра: %s" msgstr[1] "суперечних рядка параметра: %s" msgstr[2] "суперечних рядків параметра: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser alias: %s" msgstr "конфліктний псевдонім субпарсера: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser: %s" msgstr "конфліктний субпарсер: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" msgstr "не вдалося проаналізувати '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "не вдалося проаналізувати специфікацію srclib (посилання не вказано): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" msgstr "не вдалося проаналізувати специфікацію srclib (занадто багато знаків '@'): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" msgstr "створено {path}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" msgstr "поточна версія новіша: застаріла vercode={old}, нова vercode={new}" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" msgstr "видалення: репозиторій/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" msgstr "розгорнуто журнал процесів {path} до {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest= потрібен для таких варіантів, як %r" #: ../fdroidserver/scanner.py msgid "downloading '{}'" msgstr "завантаження '{}'" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" msgstr "не вдалося завантажити підписи сканера з '{}'" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" msgstr "виконуваний двійковий файл, можливо, код" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "очікується %s аргумент" msgstr[1] "очікується %s аргументи" msgstr[2] "очікується %s аргументів" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "очікується хоча б один аргумент" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "очікується не більше одного аргументу" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "очікується один аргумент" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [<команда>] [-h|--help|--version|<аргументи>]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" msgstr "отримати останню версію підписів з інтернету" #: /usr/lib/python3.11/optparse.py msgid "floating-point" msgstr "з комою, що плаває" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "показувати помилки метаданих (типово), як попередження, або нехтувати ними." #: ../fdroidserver/common.py msgid "git svn clone failed" msgstr "Не вдалося клонувати git svn" #: ../fdroidserver/scanner.py msgid "gzip file archive" msgstr "gzip-архів" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "нехтується явний аргумент %r" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 повинен мати підпис, використовуйте `fdroid signindex`, щоб створити його!" #: ../fdroidserver/index.py msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 повинен мати підпис, використовуйте `fdroid signindex`, щоб створити його!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" msgstr "ціле число" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "недійсне %(type)s значення: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "неправильний вибір: %(value)r (варто обрати з %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "недійсне значення conflict_resolution: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "неправильний рядок параметра %(option)r: повинен починатися зі знаку %(prefix_chars)r" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" msgstr "ipfs_cid не знайдено, пропускаємо генерацію CIDv1" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" msgstr "остання подана збірка новіша: застаріла vercode={old}, нова vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "local_copy_dir мусить закінчуватися на \"fdroid\", ймовірно, малося на увазі: \"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" msgstr "local_copy_dir мусить бути абсолютним шляхом!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" msgstr "local_copy_dir мусить бути текою, не файлом!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" msgstr "дзеркало '%s' не закінчується на 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "взаємозаперечні аргументи повинні бути необов'язковими" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" msgstr "наступне оновлення кешу {name} відбудеться {time}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" msgstr "не має \"icon\" у {appid}" #: ../fdroidserver/signatures.py msgid "no APK supplied" msgstr "APK не надано" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" msgstr "такого параметру немає: %s" #: ../fdroidserver/__main__.py msgid "no version info found!" msgstr "не вдалося визначити версію!" #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "не знайдено відомостей про версію" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "не дозволено з аргументом %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "потрібен один з аргументів %s" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" msgstr "приймає лише рядки, списки та кортежі" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "параметр %s: Якщо ви дійсно хочете встановити всі підписані застосунки, використовуйте --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "параметр %s: недійсне %s значення: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "для параметра %s: неправильний вибір: %r (вибрати з %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" msgstr "параметр -%s не розпізнано" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" msgstr "параметр -%s потрібен аргумент" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "параметр --%s не має аргументу" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "параметр --%s не унікальний префікс" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" msgstr "параметр --%s не визнано" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s requires argument" msgstr "параметр --%s потрібен аргумент" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "необов'язкові аргументи" #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "параметри" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" msgstr "перезаписування наявного шляху {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "позиційні аргументи" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" msgstr "не вдалося розгорнути журнал процесів {path} до {dest}!" #: ../fdroidserver/build.py msgid "reference binary missing signature" msgstr "еталонний двійковий файл з відсутнім підписом" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" msgstr "відмовитись від завантаження через небезпечне з'єднання HTTP (користати HTTPS чи вказати --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." msgstr "repo_icon \"repo/icons/%s\" не існує, створення заповнювача." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" msgstr "repo_url повинен закінчуватися на /repo" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml не встановлено, не вдається записати метадані." #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd синхронізувати індекси з {path} до {url} та видалити" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "кеш сканера пошкоджено! Ви можете очистити його за допомогою: '{clear}'" #: ../fdroidserver/scanner.py msgid "shared library" msgstr "спільна бібліотека" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" msgstr "показати номер версії програми та вийти" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" msgstr "показати довідку та вийти" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." msgstr "підписаний APK файл, шлях до файлу або URL-адреса HTTPS)." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" msgstr "пропустити розгортання усіх журналів збірки: журнал порожній" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" msgstr "пропустити розгортання усіх журналів збірки: не увімкнено під час налаштування" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" msgstr "пропустити для архіву з джерелом: {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" msgstr "srclibs відсутнє ім’я та/чи @" #: ../fdroidserver/scanner.py msgid "static library" msgstr "статична бібліотека" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" msgstr "наданий еталонний двійковий файл дозволив підписувачу {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "такі аргументи зобов'язані: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "неочікуваний рядок параметрів: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "невідомий парсер %(parser_name)r (варто вибрати: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "нерозпізнані аргументи: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "небезпечні дозволи на '{config_file}' (should be 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "використання: " #: ../fdroidserver/deploy.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" msgstr "Apache libcloud: синхронізація з {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com обмежує швидкість, очікування повторної спроби..." #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" msgstr[0] "{0} застосунок, {1} alias ключів" msgstr[1] "{0} застосунки, {1} alias ключів" msgstr[2] "{0} застосунків, {1} alias ключів" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) не має метаданих!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" msgstr "{apkfilename} має декілька {name} файлів, схоже на використання проблеми безпеки Master Key!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "AndroidManifest.xml застосунка {apkfilename} має неправильну дату: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} не має назви! Застосовуватиметься ID застосунку." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" msgstr "{appid} з {path} є недійсним ID застосунку Android!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid} з {path} є недійсною назвою пакунка Java!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" msgstr "{appid} має APK і файли: {files}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" msgstr "У {appid} немає {name}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" msgstr "{appid}: Невідомий extlib {path} у збірці '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" msgstr "{appid}: жодних збірок не вказано, працює у поточному стані джерела" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" msgstr "{appid}: {field} повинен бути '{type}', а не '{fieldtype}!'" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" msgstr "{appid}: {field} повинно бути '{type}', а не '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} має бути цілим числом, знайдено: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be list or string, found: {value}" msgstr "{build_flag} має бути списком або рядком, знайдено: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" msgstr "{file} порожній або пошкоджений!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" не існує! Виправте його в \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} вилучено, використовується {newfile}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "{path} вже існує, нехтування результатами імпорту!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" msgstr "{path} не існує! Створіть його, запустивши:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path}: недійсний підпис \"{pattern}\". Виглядає підозріло і схоже на спробу порушення безпеки Janus exploit!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" msgstr "{path} не має розміру!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} понад 200 МБ, вивантажити власноруч: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} не закінчується на \"fdroid\", перевірте шлях URL!" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url} не починається на \"http\"!" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" msgstr[0] "{} не вдалося зібрати" msgstr[1] "{} не вдалося зібрати" msgstr[2] "{} не вдалося зібрати" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} зібрано успішно" msgstr[1] "{} зібрано успішно" msgstr[2] "{} зібрано успішно" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/locale/zh_Hans/0000755000175000017500000000000014620351546015641 5ustar00hanshans././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.888382 fdroidserver-2.3a1/locale/zh_Hans/LC_MESSAGES/0000755000175000017500000000000014620351546017426 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/locale/zh_Hans/LC_MESSAGES/fdroidserver.po0000644000175000017500000025147314620351225022472 0ustar00hanshans# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # ERDwaYbR , 2020. # Trey Yang , 2020, 2022. # taiyuan <1006333969@qq.com>, 2020. # Eric , 2020, 2021. # Carlos , 2021. # Hans-Christoph Steiner , 2021. # Liu Tao , 2021. # 世界 , 2021. # ZZY2357 , 2021. # yahoo~~ , 2021. # Liu Wenyuan <15816141883@163.com>, 2021. # JY3 , 2021, 2022. # Eric , 2022. # shenzhui007 <12231252@bjtu.edu.cn>, 2022. # linsui , 2022. # YangYulin , 2022. # Yang Yulin , 2022. # yangyangdaji <1504305527@qq.com>, 2022. # Yang Yulin , 2022. # Eric , 2022. # Xu ZhuoHan , 2022. # Xiang Heng Wei , 2022, 2023. # RainSlide , 2023. # Eric , 2023. # Max Xie , 2023. # Kingo Bingo , 2023. # zhiqi , 2023. # David Jiang , 2023. # ALoLo_527 , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2024-04-13 17:01+0000\n" "Last-Translator: ALoLo_527 \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" "\n" "用作布署密钥的 SSH 公钥:" #: ../fdroidserver/nightly.py #, python-brace-format msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" "\n" "编码的 DEBUG_KEYSTORE {path} 秘密变量:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" 没有与之匹配的元数据文件!" #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" msgstr "\"local_copy_dir\" {path} 不存在!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "'{apkfilename}' 已安装在 {dev} 上." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" msgstr "\"{path}\" 包含过时的 {name} ({version})" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" msgstr "\"{path}\" 包含近期的 {name} ({version})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" msgstr "\"{path}\" 存在, 但 s3cmd 未安装!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" msgstr "\"{path}\" 不是受支持的文件格式(请用:metadata/*.yml)" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "\"{path}\" 由不允许的密钥所签署:" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" 不是有效的链接!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" msgstr[0] "%(option)s 选项需要 %(number)d 个参数" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s:错误:%(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" msgstr "发现 %d 个问题" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "%prog [options]" msgstr "%prog [选项]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" msgstr "%r 不可调用" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" msgstr "%s 未能产生字典!" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" msgstr "%s 的 SHA-256 值不正确:%s" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" msgstr "%s 不是一个被接受的构建字段" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" msgstr "%s 选项不采用参数" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "config.yml 中找不到 'keypass'!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' 没有赋值, 'smartcardoptions' 为空 !" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "config.yml 中找不到 'keystore'!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "config.yml 中找不到 'keystorepass'!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "config.yml 中找不到 'repo_keyalias'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' 是位置的无效参数" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" msgstr "未在 config.yml 中设置 'sdk_path'!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' 太旧, F-Droid 需要 build-tools-{version} 或更新的版本!" #: ../fdroidserver/common.py #, python-brace-format msgid "" "'{field}' will be in random order! Use () or [] brackets if order is " "important!" msgstr "{field} 将随机排列! 如果顺序很重要, 请使用 () 或 [] 括号!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" msgstr "'{path}' 执行失败!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' 是无效格式, 它应该是字典!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' 不是 {appid} 之有效 {field}. 正则表达式: {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' 不是有效 {field},应为 {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" msgstr "…为 {appid} 检查更新失败: {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() 未定义" #: ../fdroidserver/lint.py msgid "/issues is missing" msgstr "" "路径缺少 /issues ( 译者注: 此处仅支持 github 或 gitlab 之 issues 链接 )" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" msgstr "需要有一个链接作为参数!" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "使用 GnuPG 为存储库之软件包添加 PGP 签名" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" msgstr "添加存储库签名密钥到未签名的存储库" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" msgstr "为缺少主干元数据文件的 APK 添加这些文件" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" msgstr "仅为 {name} 添加新存储库" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" msgstr "密钥库中存储库签名密钥的别名" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" msgstr "缺少 AllowedAPKSigningKeys,但提供了参考二进制文件" #: ../fdroidserver/import_subcommand.py msgid "" "Allows a different revision (or git branch) to be specified for the initial " "import" msgstr "可让运行初始导入时指定不同修订 ( 或 git 分支 )" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" msgstr "同时对存档部分完整镜像" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" msgstr "同时警告格式问题, 如同 rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" msgstr "Android AAR 库" #: ../fdroidserver/scanner.py msgid "Android APK file" msgstr "Android APK 文件" #: ../fdroidserver/scanner.py msgid "Android DEX code" msgstr "Android DEX 代码" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" msgstr "未在 {path} 中找到 Android SDK!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" msgstr "Android SDK 路径 {path} 不存在!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" msgstr "Android SDK 路径 '{path}' 不是目录!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" msgstr "没找到 Android SDK 工具 {cmd}!" #: ../fdroidserver/lint.py msgid "" "App has Binaries but does not have corresponding AllowedAPKSigningKeys to " "pin certificate." msgstr "应用程序具有二进制文件,但没有相应的AllowedAPKSigningKeys 来固定证书。" #: ../fdroidserver/lint.py msgid "" "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or " "UpdateCheckMode are not None" msgstr "" "应用的 NoSourceSince 或 ArchivePolicy 为 “0 versions” 但 AutoUpdateMode 或 " "UpdateCheckMode 不是 None" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" msgstr "应用 在 '{repo}' 中, 但有一个链接到 {url}" #: ../fdroidserver/lint.py msgid "" "App version has binary but does not have corresponding AllowedAPKSigningKeys " "to pin certificate." msgstr "" "应用程序版本具有二进制文件,但没有相应的 AllowedAPKSigningKeys 来固定证书。" #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "不需要附加 .git" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" msgstr "正使用无效签名归档 {apkfilename}!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode 和 UpdateCheckMode:HTTP 必须有一个模式。" #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" msgstr "镜像配置中的错误条目类型“{mirrortype}”:{mirror}" #: ../fdroidserver/mirror.py msgid "" "Base URL to mirror, can include the index signing key using the query " "string: ?fingerprint=" msgstr "镜像的基本链接可以使用此请求参数包含索引签名键: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" msgstr "分支 '{branch}' 在构建 '{versionName}' 时被用作相应的提交" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" msgstr "分支 '{branch}' 在源码库 '{srclib}' 里被用作相应的提交" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" msgstr "断开的符号链接: {path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" msgstr "从源代码构建安装包" #: ../fdroidserver/build.py msgid "Build all applications available" msgstr "构建全部可用应用" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" msgstr "由 'fdroid import' 生成的构建 - 一旦准备就绪将删除禁用行" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" msgstr "构建元数据 git 存储库包含未提交的更改!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" msgstr "仅编译每个应用的最新版本" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" msgstr "使用此配置并基于 \"%s\" 的构建存储库:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" msgstr "在没有CurrentVersionCode的情况下不能自动更新应用程序" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "因扫描时的{}错误而无法构建" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" msgstr "无法重写 {path}" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "类别 '%s' 无效" #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "没有设置类别" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "检查应用的更新" #: ../fdroidserver/update.py #, python-brace-format msgid "" "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, " "archapks:{arch}" msgstr "" "正为 {appid} 检查存档: 安装包: {integer}, 保留版本数: {keep}, 架构安装包: " "{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "干净的更新 - 不使用缓存,重新处理全部 APK 文件" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "逗号分割的目录列表。" #: ../fdroidserver/__main__.py #, python-format msgid "Command '%s' not recognised.\n" msgstr "无法识别命令 '%s'。\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" msgstr "提交更改" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" msgstr ".yml 和本地化文件之间的“{field}”定义冲突:" #: ../fdroidserver/__main__.py msgid "" "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the " "same time." msgstr "冲突的参数: '--verbose' 和 '--quiet' 不能被同时使用." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" msgstr "冲突的配置文件! 使用 {newfile}, 忽略 {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "在您的系统中无法找到 '{command}'" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "找不到最新版本代码" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "找不到最新的版本名" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" msgstr "找不到 {path} 以移除" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " msgstr "无法打开 apk 文件 {path} 用于分析: " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "无法解析大小 \"{size}\", 错误类型 \"{type}\"" #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "找不到应用ID" #: ../fdroidserver/checkupdates.py msgid "Couldn't find any version information" msgstr "无法找到任何的版本信息" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "找不到安装包 ID" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" msgstr "拒绝覆盖现有的签署密钥设置!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" msgstr "创建新容器 \"{name}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." msgstr "创建用于配置 s3cmd 的 \"{path}\"。" #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "创建日志目录" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" msgstr "创建新的 S3 存储桶:{url}" #: ../fdroidserver/publish.py msgid "Creating output directory" msgstr "创建输出目录" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" msgstr "使用此密钥 (SHA256) 创建签名索引:" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" msgstr "创建临时目录" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" msgstr "创建未签名的索引以准备签名" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" msgstr "当前版本代码 {cv} 小于最旧的构建 {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" msgstr "DEBUG_KEYSTORE 未被设置或不完整" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" msgstr "从存储库中删除没有元数据的 APK 和 OBB" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" msgstr "存储库过大,将删除存档(大小 {size},限制 {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" msgstr "存储库过大,将删除镜像历史(大小 {size},限制 {limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" msgstr "删除未知文件: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" msgstr "简介“%s”与应用的概括文字相同" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" msgstr "简介有重复行" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" msgstr "简介中带有列表(%s),但它既不是子弹(*)形列表也不是编号(#)型列表" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" msgstr "简介长度 {length} 超过 {limit} 字限制" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "不要给生成的构建项添加 'disable:'" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" msgstr "不要给这个仓库部署新文件" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" msgstr "不要在链接中包含“{path}”!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" msgstr "不提示输入 Android SDK 路径,仅显示失败" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" msgstr "不要从密钥库删除已生成的私钥" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" msgstr "不创建源码 tarball 文件,便于内部版本测试" #: ../fdroidserver/build.py msgid "" "Don't refresh the repository, useful when testing a build with no internet " "connection" msgstr "不刷新资源库,便于没有互联网时的内部版本测试" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" msgstr "请勿使用 rsync 校验和" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "下载小型仓库的完整镜像" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" msgstr "正在下载 %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "下载仓库已经失败了一次,不再尝试。" #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" msgstr "{url} 下载失败。{error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" msgstr "{path} 处的重复负面特征声明被忽略!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" msgstr "镜像配置中的重复条目“%s”!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" msgstr "“{field}”中有重复的链接:{url}" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "错误:\"server\" 子命令已被删除,请使用 \"deploy\"!" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" "错误:请不要使用此命令来镜像 f-droid.org!\n" "对 f-droid.org 进行完整镜像至少需要超过 200GB 的储存空间。" #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "错误:不支持的 CI 类型,欢迎提交补丁添加支持!" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "错误:不支持的 git 主机类型 \"%s\",欢迎提交补丁添加支持!" #: ../fdroidserver/__main__.py #, python-brace-format msgid "" "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set " "it to 'UTF-8' for best results." msgstr "" "编码被设置为“{enc}”,可能会导致 fdroid 出现编码问题。为了最佳效果,请将其更改" "为“UTF-8”。" #: ../fdroidserver/init.py #, python-format msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" "请在此处输入 Android SDK(%s)的路径:\n" "> " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" msgstr "没有设置 {configname} 中的环境变量 {var}!" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "获取存储库地址时出错" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" msgstr "如果发现问题,则以非零代码退出" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "从源存储库中提取应用程序元数据" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "从 APK 中提取签名" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" msgstr "复制 {path} 失败:{error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" msgstr "获取 '{apkfilename}' 的签名时出错:{error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" msgstr "读取 {path} 失败:{error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" msgstr "缩放 {path} 失败:{error}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" msgstr "创建亚马逊简易储存服务失败:{url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" msgstr "获取 APK 信息失败,正在删除 {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" msgstr "获取APK信息失败,跳过{path}" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" msgstr "未能获取APK签名密钥指纹" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" msgstr "无法在 {dev} 上安装 '{apkfilename}':{error}" #: ../fdroidserver/common.py msgid "Failed to sign application" msgstr "未能对应用程序进行签名" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" msgstr "从虚拟机获取了buildserverid:{buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" msgstr "获取了'{apkfilename}'的签名-> '{sigdir}'" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" msgstr "文件在处理时消失: {path}" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py #: ../fdroidserver/update.py msgid "Finished" msgstr "已完成" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" msgstr "Flattr 捐赠方法属于 FlattrID: 字段" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "禁止的HTML标签" #: ../fdroidserver/build.py msgid "" "Force build of disabled apps, and carries on regardless of scan problems. " "Only allowed in test mode." msgstr "强制编译已禁用应用,忽略扫描出错。仅用于测试模式。" #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" msgstr "在{0}秒超时后强制停止构建!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." msgstr "强制扫描已禁用的应用和内部版本。" #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" msgstr "为应用程序“{name}”找到了没有元数据的“{path}”图形!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "为“{name}”找到了错误的资金文件“{path}”:" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" msgstr "在参数中发现无效的appids" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "发现某些应用的版本代码无效" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" msgstr "在{path}中发现多个JAR签名块文件" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" msgstr "找到多个 {appid} 的元数据文件" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." msgstr "发现存储库的多个签名证书。" #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." msgstr "未找到存储库的签名证书。" #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" msgstr "在%s处发现非文件" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" msgstr "在{url}发现{apkfilename}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} problems in {filename}" msgstr "发现了 {count} 个问题,扫描对象 {filename}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" msgstr "发现了 {count} 个警告,扫描对象 {filename}" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" msgstr "已生成 {appid} 的主干元数据" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" msgstr "'%s' 的 Git 签出失败" #: ../fdroidserver/common.py msgid "Git clean failed" msgstr "Git clean 失败" #: ../fdroidserver/common.py msgid "Git fetch failed" msgstr "Git fetch 失败" #: ../fdroidserver/common.py msgid "Git prune failed" msgstr "Git prune 失败" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Git remote set-head 失败:\"%s\"" #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Git reset 失败" #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Git 子模块同步失败" #: ../fdroidserver/common.py msgid "Git submodule update failed" msgstr "Git 子模块更新失败" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" msgstr "HTTPS 必须与 Subversion URL 一起使用!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" msgstr "如果 git 镜像变大,允许删除存档" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" msgstr "如果此上传失败,请尝试手动上传到 {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." msgstr "忽略“{metapath}”元数据中的“{field}”,因为它已被弃用。" #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "忽略超过 2048 的 FUNDING.yml 条目:%s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" msgstr "忽略清单中的错误元素: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "忽略没有元数据的包: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" msgstr "忽略 {apkfilename} 的过时缓存数据" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" msgstr "包括使用已禁用的算法(如 MD5)签名的 APK" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" msgstr "在镜像中包含 PGP 签名 .asc 文件" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" msgstr "在镜像中包含构建日志" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" msgstr "在镜像中包含源 tarball" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" msgstr "包括来自 %s@%s 的元数据" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" msgstr "包含来自 {path} 的元数据" #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "初始化子模块" #: ../fdroidserver/install.py msgid "Install all signed applications available" msgstr "安装全部可用的已签名应用" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" msgstr "在设备上安装生成的安装包" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." msgstr "正在安装 %s..." #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." msgstr "在 {dev} 上安装“{apkfilename}”..." #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" msgstr "与存储库 HTTP 服务器互动" #: ../fdroidserver/update.py msgid "Invalid APK" msgstr "无效的 APK" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" msgstr "无效的 AutoUpdateMode: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" msgstr "无效的 UpdateCheckMode:{mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" msgstr "无效的 VercodeOperation:{field}" #: ../fdroidserver/lint.py #, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "无效的 VercodeOperation:{invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "无效的应用 ID {appid}" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" msgstr "无效的布尔值'%s'" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "无效的项目符号列表" #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" msgstr "已发布文件的名称无效: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" msgstr "ndk 无效:构建中的条目:“{ndk}”" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " msgstr "无效的重定向至非 HTTPS: {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" msgstr "无效的scrlib元数据:'{file}'不存在" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" msgstr "无效的 srclib 元数据:无法解析“{file}”" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" msgstr "无效的 srclib 元数据:“{file}”中的未知键“{key}”" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" msgstr "无法验证 JAR 签名:{path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" msgstr "已验证的 JAR 签名:{path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" msgstr "Java JAR 文件" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" msgstr "未找到 Java JDK!安装在标准位置或设置java_paths!" #: ../fdroidserver/scanner.py msgid "Java compiled class" msgstr "Java 编译类" #: ../fdroidserver/signindex.py msgid "" "Java jarsigner not found! Install in standard location or set java_paths!" msgstr "未找到 Java jarsigner!安装在标准位置或设置java_paths!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" msgstr "HTML src 属性中的 Javascript" #: ../fdroidserver/build.py #, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" msgstr "保持失败的生成“{apkfilename}”" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "签名密钥的密钥库:\t" #: ../fdroidserver/lint.py #, python-brace-format msgid "" "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" msgstr "" "最后使用的提交 '{commit}' 看起来像一个标签,但 UpdateCheckMode 是 '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" msgstr "Liberapay 捐赠方式属于 Liberapay: 字段" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted (dry run)" msgstr "列出将被重新设定格式的文件 (dry run)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "包含在 f-droid.org URL 中的区域设置" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" msgstr "异常时中止编译" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." msgstr "格式错误的存储库镜像。" #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" msgstr "格式错误的服务器网络根行:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" msgstr "达到 ZIP 文件中的最大递归深度:%s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "镜像完整存储库和存档,所有文件类型。" #: ../fdroidserver/gpgsign.py msgid "Missing output directory" msgstr "缺少输出目录" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" msgstr "将负面特征声明移动到本地化文件:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "config.yml 中既没有设置“repo_pubkey”也没有设置“keystorepass”" #: ../fdroidserver/verify.py #, python-format msgid "No APK for package: %s" msgstr "没有 APK 安装包: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "未找到 Android SDK!" #: ../fdroidserver/install.py msgid "No attached devices found" msgstr "未找到连接的设备" #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "URL 中没有指纹。" #: ../fdroidserver/common.py msgid "No git submodules available" msgstr "没有可用的 git 子模块" #: ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "找不到任何 gradle 项目。指定 --subdir?" #: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "未找到任何信息。" #: ../fdroidserver/checkupdates.py msgid "No matching tags found" msgstr "未找到匹配的标签" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." msgstr "在 {0} 中找不到最低 SDK 版本,使用默认值 (3)。" #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "不需要说明该应用是自由软件" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" msgstr "不需要说明该应用是用于安卓的" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "未设置选项!编辑您的 config.yml 以设置以下至少一个:" #: ../fdroidserver/common.py msgid "No packages specified" msgstr "未指定包" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" msgstr "%s 没有可用的签名 APK" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" msgstr "无签名输出目录 - 无任何操作" #: ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" msgstr "在 {path} 中找不到签名证书" #: ../fdroidserver/common.py #, python-format msgid "No such package: %s" msgstr "没有这样的包:%s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" msgstr "应用程序 {appid} 没有此类版本代码 {versionCode}" #: ../fdroidserver/checkupdates.py msgid "No tags found" msgstr "未找到标签" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" msgstr "没有未签名的目录 - 无操作" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "不是有效的大小定义:“{}”" #: ../fdroidserver/signindex.py msgid "Nothing to do" msgstr "无操作" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." msgstr "对 {appid} 无任何可操作。" #: ../fdroidserver/init.py msgid "Now set these in config.yml:" msgstr "现在在 config.yml 中设置这些:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" msgstr "OBB 文件的版本代码({integer})比任何 APK 都要新:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" msgstr "OBB 文件名必须以“main.”或“patch.”开头:" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" msgstr "OBB 的软件包名称与受支持的 APK 不匹配:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "脱机计算机,跳过 git 镜像生成直到 `fdroid deploy`" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "图形仅支持 PNG 和 JPEG,发现:{path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "仅输出与 Play Store 的差异" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "仅处理使用自动更新的应用" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "OpenCollective 捐赠方法属于 OpenCollective: 字段" #: /usr/lib/python3.11/optparse.py msgid "Options" msgstr "选项" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "将 JSON 报告输出到以 APK 命名的文件。" #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." msgstr "将 JSON 输出到标准输出。" #: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py #: ../fdroidserver/publish.py ../fdroidserver/signindex.py #: ../fdroidserver/update.py msgid "Outputting JSON" msgstr "输出 JSON" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "项目总体许可证。" #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "从元数据覆盖 {apkfilename} 中的空白版本名称:{version}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "包“{appid}”已经存在" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" msgstr "在“{path}”处解析清单" #: ../fdroidserver/common.py msgid "Password required with username" msgstr "需要密码和用户名" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "主Android项目子目录的路径(如果不是根目录)." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" msgstr "Android SDK 路径(有时在 ANDROID_HOME 中设置)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" msgstr "使用的 git 资源库路径在日志上" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" msgstr "资源库签名密钥的密钥存储(keystore)路径" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "将秘密变量打印到终端以便于复制/粘贴" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" msgstr "ZIP 文件问题:%s,错误 %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" msgstr "'{path}' 处的 xml 问题" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" msgstr "处理自动更新" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" msgstr "处理 {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" msgstr "处理 {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" msgstr "为索引文件生成人类可读的XML/JSON" #: ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "项目 URL 导入位置。" #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" msgstr "应避免使用标点符号" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" msgstr "拖送日志至 git 远程资源库" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing binary transparency log to {url}" msgstr "正推送二进制文件透明日志到{url}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" msgstr "正在推送至 {url}" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" msgstr "快速新建存储库" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" msgstr "读取全部元数据文件并退出" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" msgstr "读取 '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "" "Reading packageName/versionCode/versionName failed, APK invalid: " "'{apkfilename}'" msgstr "" "读取 packageName/versionCode/versionName 失败,APK 无效:'{apkfilename}'" #: ../fdroidserver/common.py #, python-brace-format msgid "" "Reading packageName/versionCode/versionName failed,APK invalid: " "'{apkfilename}'" msgstr "" "读取 packageName/versionCode/versionName 失败,APK 无效:'{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" msgstr "从缓存读取 {apkfilename}" #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "删除指定文件" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" msgstr "删除 {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "重命名文件名不符合 package.name_123.apk 的 APK 文件" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" msgstr "RepoTrunk 更新模式仅对 git-svn 存储库有意义" #: ../fdroidserver/build.py msgid "" "Reset and create a brand new build server, even if the existing one appears " "to be ok." msgstr "即使已有服务器看起来运行正常,请重置并创建一个全新的编译服务器。" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" msgstr "使用提供的 debug.keystore 重签名 {apkfilename}" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" msgstr "对超过像素大小上限的全部图标进行尺寸调整,然后退出" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" msgstr "仅输出警告和出错信息" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "重写所有元数据文件" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" msgstr "重写 '{appid}'" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" msgstr "在具有未提交更改的 git 存储库上运行" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "运行“重写元数据”(rewritemeta)修复格式" #: ../fdroidserver/deploy.py msgid "Running first pass with MD5 checking disabled" msgstr "禁用 MD5 检查并运行第一遍" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" msgstr "在 {path} 中运行 wget" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" msgstr "{url} 的 SHA-256 与条目不匹配!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "扫描产生的 APK(s) 是否有已知的非自由类。" #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" msgstr "扫描一个应用的源代码" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {apk}" msgstr "扫描仪发现了 {count} 个问题,扫描对象 {apk}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" msgstr "扫描仪在 {appid} 中发现 {count} 个问题:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" msgstr "扫描仪在 {appid}:{versionCode} 中发现 {count} 个问题:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "扫描仪发现 {} 个问题" #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "使用 dexdump 扫描 APK 以查找已知的非自由类。" #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" msgstr "设置 NDK {release} ({version})" #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "使用以下方法将时钟设置为该时间:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" msgstr "在存档旧版本之前,在存储库中设置最大版本数" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" msgstr "将打开文件限制设置为 {integer}" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" msgstr "为每日构建存储库设置应用构建" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " msgstr "设置打开文件限制失败: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" msgstr "为此构建设置 {0} 秒超时" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "对包进行签名并将其加入存储库" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" msgstr "签名使用 update --nosign 创建的索引" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" msgstr "跳过二进制源码扫描和其他问题" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "跳过签名无效的“{apkfilename}”!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" msgstr "跳过 GitLab 页面镜像,因为存储库太大(> %.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" msgstr "跳过 {appid} 的索引生成" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" msgstr "跳过 {apkfilename} ,签名无效!" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" msgstr "正在跳过 {appid}:已禁用" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" msgstr "指定资源库同步的本地文件夹" #: ../fdroidserver/deploy.py msgid "Specify an identity file to provide to SSH for rsyncing" msgstr "指定 rsync 同步时 SSH 所用的标识文件" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." msgstr "指定要使用的调试密钥库文件。" #: ../fdroidserver/common.py msgid "Spew out even more information than normal" msgstr "比一般情况输出更多的信息" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" msgstr "从 {apkfilename} 中剥离神秘签名" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" msgstr "摘要“%s”只是应用程序的名称" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" msgstr "长度摘要 {length} 超过 {limit} 字符限制" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" msgstr "系统时钟早于 {path} 中的日期!" #: ../fdroidserver/checkupdates.py msgid "" "Tags update mode only works for git, hg, bzr and git-svn repositories " "currently" msgstr "标签更新模式目前仅适用于 git、hg、bzr 和 git-svn 存储库" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "git-svn 中使用的标记更新模式,但未使用标记设置存储库" #: ../fdroidserver/build.py msgid "" "Test mode - put output in the tmp directory only, and always build, even if " "the output already exists." msgstr "测试模式:仅将输出保存至 tmp 目录,即使输出已存在,仍然编译。" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" msgstr "OBB 版本号必须位于“{name}”之后:" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" msgstr "资源库基 URL的日志(默认为 https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" msgstr "写入镜像的目录" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" msgstr "要包含在存储库中的文件(path 或 glob)" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." msgstr "存储库的指纹不匹配。" #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" msgstr "local_copy_dir“{path}”的根目录不存在!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" msgstr "存在密钥别名冲突 - 发布已停止" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." msgstr "这些是已从主存储库存档的应用。" #: ../fdroidserver/common.py msgid "" "This is a repository of apps to be used with F-Droid. Applications in this " "repository are either official binaries built by the original application " "developers, or are binaries built from source by the admin of f-droid.org " "using the tools on https://gitlab.com/fdroid." msgstr "" "这是一个与F-Droid一起使用的应用的存储库。这个存储库中的应用要么是原应用开发者" "构建的官方二进制文件,要么是 f-droid.org 的管理员使用 https://gitlab.com/" "fdroid 上的工具从源代码构建而来的二进制文件。" #: ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "此存储库已具有本地元数据:%s" #: ../fdroidserver/init.py #, python-format msgid "" "To complete the setup, add your APKs to \"%s\"\n" "then run \"fdroid update -c; fdroid update\". You might also want to edit\n" "\"config.yml\" to set the URL, repo name, and more. You should also set up\n" "a signing key (a temporary one might have been automatically generated).\n" "\n" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" "要完成设置,请将您的 APK 添加到“%s”\n" "然后运行“FDrod 更新 -C;FDroid更新”。 您可能还想编辑\n" "“config.yml”来设置 URL、存储库名称等。 您还应该设置\n" "签名密钥(可能已自动生成临时密钥)。\n" "\n" "更多信息: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "和 https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py msgid "" "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config." "yml!" msgstr "" "要使用 awsbucket,还必须在 config.yml 中设置 awssecretkey 和 awsaccesskeyid!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "网址必须以 https:// 或 http:// 开头" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" msgstr "不应使用 URL 缩短器" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" msgstr "描述中的网址 {url}:{error}" #: ../fdroidserver/lint.py msgid "" "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from " "https://spdx.org/license-list" msgstr "" "意外的许可证标签“{}”!仅使用来自 https://spdx.org/license-list 的 FSF 或 OSI " "批准的标签" #: ../fdroidserver/lint.py msgid "" "Unexpected license tag \"{}\"! Only use license tags configured in your " "config file" msgstr "意外的许可证标签“{}”!仅使用配置文件中配置的许可证标记" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" msgstr "意外的符号链接目标:{link} -> {target}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" msgstr "{configname} 中的未知条目 {key}" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "发生未知异常!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" msgstr "在构建版本 '{versionName}' 中出现了未知文件 '{filename}'" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" msgstr "未知元数据格式:%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" msgstr "未知元数据格式:{path} (使用:*.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " msgstr "未知版本的 aapt,可能会导致问题: " #: ../fdroidserver/lint.py msgid "Unnecessary leading space" msgstr "不必要的前置空格" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" msgstr "不必要的尾随空格" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" msgstr "'{path}' 中存在无法识别的应用栏目 '{fieldname}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "'{path}' 中有无法识别的构建 flag '{build_flag}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" msgstr "存储库图形不支持的文件类型“{extension}”" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" msgstr "发现不支持的图形文件:{path}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" msgstr "%s 处未使用的扩展库" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" msgstr "%s 处未使用的文件" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" msgstr "未使用的扫描删除路径: %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" msgstr "未使用的扫描忽略路径: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" msgstr "解压缩到 %s" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "更新新包的存储库信息" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" msgstr "更新 URL 的二进制透明度日志" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData 具有无效的 URL:{url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "" "UpdateCheckData must match the version code as integer (\\d or [0-9]): " "{codeex}" msgstr "UpdateCheckData 必须以整数(\\d 或 [0-9])的形式匹配版本代码:{codeex}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" msgstr "UpdateCheckData必须使用HTTPS URL:{url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData 不是有效的网址:{url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "" "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" msgstr "上传 {apkfilename} 到 androidobservatory.org" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" msgstr "上传 {apkfilename} 到 virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "Usage" msgstr "使用" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "Usage: %s\n" msgstr "用法:%s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" #: ../fdroidserver/build.py msgid "Use build server" msgstr "使用编译服务器" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" msgstr "对于新添加的 APK 文件,使用来自 APK 文件的时间,而非当前时间" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." msgstr "" #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "使用 APK 签名 v2" #: ../fdroidserver/common.py msgid "Using APK Signature v3" msgstr "使用 APK 签名 v3" #: ../fdroidserver/common.py msgid "" "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" msgstr "使用 {path} 中的 androguard" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" msgstr "" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" msgstr "正使用 s3cmd 与 {url} 同步" #: ../fdroidserver/__main__.py msgid "Valid commands are:" msgstr "有效的命令为:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." msgstr "和本地缓存的副本进行验证,而不是重新下载。" #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" msgstr "验证已下载包的完整性" #: ../fdroidserver/index.py msgid "Verifying index signature:" msgstr "验证目录签名中:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "" "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload " "{path}." msgstr "" #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "警告元数据中可能存在的错误" #: ../fdroidserver/update.py msgid "" "When configured for signed indexes, create only unsigned indexes at this " "stage" msgstr "如果已配置为使用签名索引,该阶段仅创建未签名索引" #: ../fdroidserver/lint.py msgid "" "When linting the entire repository yamllint is disabled by default. This " "option forces yamllint regardless." msgstr "" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "生成密钥时使用了X.509 ‘可识别名’" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" msgstr "" #: ../fdroidserver/scanner.py msgid "ZIP file archive" msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "模糊的选项:%(option)s 可以相配 %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "模糊的选项:%s(%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "要操作的文件的应用ID" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" msgstr "带APPID[:VERCODE]格式可选的versionCode的应用 ID" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" msgstr "" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" msgstr "" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "无法打开 '%(filename)s':%(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" msgstr "" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" msgstr "正在克隆 {url}" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" msgstr "复杂" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "有冲突的选项字串:%s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser alias: %s" msgstr "有冲突的子解析器别名:%s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser: %s" msgstr "有冲突的子解析器:%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" msgstr "无法解析 '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "" #: ../fdroidserver/scanner.py msgid "downloading '{}'" msgstr "正在下载 '{}'" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" msgstr "从 '{}' 下载扫描仪特征失败了" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" msgstr "用法:fdroid [-h|--help|--version] []" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" msgstr "" #: /usr/lib/python3.11/optparse.py msgid "floating-point" msgstr "" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "将元数据错误(默认)强制设为警告,或忽略。" #: ../fdroidserver/common.py msgid "git svn clone failed" msgstr "" #: ../fdroidserver/scanner.py msgid "gzip file archive" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "" #: ../fdroidserver/index.py msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "" "invalid option string %(option)r: must start with a character " "%(prefix_chars)r" msgstr "" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "" "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "local_copy_dir未以“ fdroid”结尾,也许你指的是:“ {path}”" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" msgstr "local_copy_dir必须为绝对路径!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" msgstr "local_copy_dir必须是目录,不能是文件!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" msgstr "" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" msgstr "" #: ../fdroidserver/signatures.py msgid "no APK supplied" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" msgstr "没有此选项:%s" #: ../fdroidserver/__main__.py msgid "no version info found!" msgstr "没有找到版本信息!" #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "没有找到版本信息" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" msgstr "" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" msgstr "未知的选项 -%s" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" msgstr "选项 -%s 需要参数" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "选项 --%s 不能有参数" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "选项 --%s 不是一个唯一前缀" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" msgstr "无法识别选项 -%s" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s requires argument" msgstr "选项 --%s 需要参数" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "可选参数" #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "选项" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" msgstr "正在覆盖现有{path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "位置参数" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" msgstr "" #: ../fdroidserver/build.py msgid "reference binary missing signature" msgstr "" #: ../fdroidserver/signatures.py #, python-brace-format msgid "" "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-" "https-check): {apkfilename}" msgstr "" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." msgstr "" #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" msgstr "" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" msgstr "显示程序的版本号并退出" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" msgstr "显示本帮助信息并退出" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." msgstr "" #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" msgstr "" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" msgstr "" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" msgstr "" #: ../fdroidserver/scanner.py msgid "static library" msgstr "" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "需要此下参数:%s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "未预期的选项字符串:%s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "未识别的参数:%s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "{config_file} 的文件权限不安全 ( 应该设为0600 ) !" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "用法: " #: ../fdroidserver/deploy.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" msgstr "正在用Apache libcloud同步{url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" msgstr[0] "" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" msgstr "{appid}来自{path}不是一个有效的Android应用ID!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid}来自{path}不是一个有效的Java安装包名称!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" msgstr "" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" msgstr "{appid}缺失了{name}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" msgstr "" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" msgstr "{appid}:{field}必须为‘{type}’,但它是‘{fieldtype}!’" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" msgstr "{appid}:{field}必须为‘{type}’,但它是‘{fieldtype}’!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be list or string, found: {value}" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" msgstr "" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" msgstr "{path} 不存在!通过运行以下命令创建它:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" msgstr "{path}的大小为零!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path}的大小超过200MB,请手动上传:{url}" #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" msgstr "{path}:{error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url}不是以“fdroid”结尾的,请检查链接路径!" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url}不是以“http”为开头!" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" msgstr[0] "" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/locale/zh_Hant/0000755000175000017500000000000014620351546015642 5ustar00hanshans././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.888382 fdroidserver-2.3a1/locale/zh_Hant/LC_MESSAGES/0000755000175000017500000000000014620351546017427 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/locale/zh_Hant/LC_MESSAGES/fdroidserver.po0000644000175000017500000025442414620351225022472 0ustar00hanshans# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # Jeff Huang , 2020. # Hans-Christoph Steiner , 2020, 2021, 2022, 2024. # NightFeather , 2020. # ifurther , 2021. # Stiffen , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Chinese (Traditional) \n" "Language: zh_Hant\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" "\n" "SSH 公鑰被用來作為部署密鑰:" #: ../fdroidserver/nightly.py #, python-brace-format msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" "\n" "{path} DEBUG_KEYSTORE 祕密變數的編碼為:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s 1/\" 沒有符合的中介資料檔案!" #: ../fdroidserver/index.py #, fuzzy, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" msgstr "local_copy_dir \"{path}\" 根目錄不存在!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\" 已經安裝在 {dev} 上了。" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" msgstr "\"{path}\" 包含過時的 {name} ({version})" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" msgstr "\"{path}\" 包含近期的 {name} ({version})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" msgstr "有 \"{path}\" 存在,但是沒有安裝 s3cmd!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" msgstr "\"{path}\" 不是可接受的格式,轉換成: metadata/*.yml" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" 不是一個有效的網址!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" msgstr[0] "%(option)s 的選項需要 %(number)d 參數" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, fuzzy, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: 錯誤: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" msgstr "發現 %d 個問題" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, fuzzy msgid "%prog [options]" msgstr "%prog [選項]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" msgstr "%r 不可呼叫" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" msgstr "" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" msgstr "" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" msgstr "%s 為不可編譯欄位" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" msgstr "%s 選項不帶值" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "config.yml 找不到 'keypass'!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "沒有'keystore', 而且'smartcardoptions'是空的!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "config.yml 找不到 'keystore'!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "config.yml 找不到 'keystorepass'!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "config.yml 找不到 'repo_keyalias'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "這些地方的 '必填' 為無效引數" #: ../fdroidserver/common.py #, fuzzy msgid "'sdk_path' not set in config.yml!" msgstr "'config.yml' 未設定 'sdk_path'!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' 太過老舊,fdroid 需要 build-tools-{version} 或以上版本!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" msgstr "'{field}' 將會隨機排列!如果次序重很重要,請使用 () 或 []符號!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" msgstr "'{path}' 無法執行!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "{appid} 的 {value}' 為無效 {field}。正規表遠格式:{pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" msgstr "{appid} 檢查更新失敗:{error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() 未定義" #: ../fdroidserver/lint.py msgid "/issues is missing" msgstr "/issues 有遺漏" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" msgstr "需要 URL 作為參數!" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "在軟體庫中加入使用 GnuPG 套件包的 gpg 簽署" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" msgstr "增加一個軟體庫的簽署金鑰到未簽署的金鑰庫中" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" msgstr "為 APK 建立缺少的骨幹中介資料檔案" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" msgstr "只為 {name} 新增軟體庫" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" msgstr "在金鑰庫裡軟體庫簽署金鑰的別名" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" msgstr "" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "允許為初始匯入指定不同的校訂(或 git 分支)" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" msgstr "另外鏡像完整的檔案區段" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" msgstr "還要提醒格式化問題,如 rewritemeta -l" #: ../fdroidserver/scanner.py #, fuzzy msgid "Android AAR library" msgstr "Android AAR 庫" #: ../fdroidserver/scanner.py #, fuzzy msgid "Android APK file" msgstr "Android APK 文件" #: ../fdroidserver/scanner.py #, fuzzy msgid "Android DEX code" msgstr "Android DEX 碼" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" msgstr "在{path}找不到Android SDK!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" msgstr "Android SDK 路徑 '{path}' 不存在!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" msgstr "Android SDK 路徑 '{path}' 不是目錄資料夾!" #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Android SDK tool {cmd} not found!" msgstr "找到 Android SDK 工具 {cmd} 了!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" msgstr "應用軟體在 '{repo}' 倉庫,但有一個 {url} 連結" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "不必附加上 .git" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" msgstr "以無效的簽名歸檔 {apkfilename}!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" msgstr "" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "基本的 URL 到鏡像,可以包含索引簽署金鑰使用查詢字串:?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" msgstr "分支 '{branch}' 被用於建立 '{versionName}'的提交" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" msgstr "分支 '{branch}' 用於 srclib '{srclib}' 的提交" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "Broken symlink: {path}" msgstr "無效的連結:{path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" msgstr "從原始程式碼編譯成套裝軟體" #: ../fdroidserver/build.py msgid "Build all applications available" msgstr "構建所有可用的應用程式" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" msgstr "由`fdroid import` 產生編譯 - 已移除取消線" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" msgstr "構建詮釋資料 git 倉庫有未遞交的變更!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" msgstr "只構建每個套件包的最後版本" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" msgstr "軟體庫的編譯依照 \"%s\" 與此設定:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" msgstr "" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "掃描時由於 {} 出錯,無法進行編譯" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" msgstr "無法重寫到 \"{path}\"" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "'%s' 類別無效" #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "類別未設定" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "檢查應用程式更新" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "檢查 {appid} 的歸檔 - APKs:{integer},keepversions:{keep},archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "清除更新 - 不使用快取,重新處理全部的 APK" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "以逗號分隔類別清單。" #: ../fdroidserver/__main__.py #, fuzzy, python-format msgid "Command '%s' not recognised.\n" msgstr "無法識別指令 '%s' 。\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" msgstr "提交變更" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" msgstr "" #: ../fdroidserver/__main__.py #, fuzzy msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "衝突的參數:無法同時使用 '--verbose' 和 '--quiet' 參數。" #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" msgstr "衝突的配置文件! 使用新文件 {newfile}, 忽略舊文件 {oldfile} !" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "在您的系統上找不到 '{command}'" #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Could not find latest version code" msgstr "找不到最新版的代碼" #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Could not find latest version name" msgstr "找不到最新的版本名稱" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" msgstr "無法找到 {path} 來移除" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " msgstr "無法開啟 APK 檔{path}案作分析 : " #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "無法解析大小 (\"{size}\") , \"{type}\" 是錯的" #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Couldn't find Application ID" msgstr "找不到應用的 ID" #: ../fdroidserver/checkupdates.py #, fuzzy msgid "Couldn't find any version information" msgstr "找不到最新版本名稱" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "找不到包 ID" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" msgstr "拒絕覆寫現有的簽署金鑰設定!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" msgstr "建立新容器 \"{name}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." msgstr "正在建立組態 s3cmd 的 \"{path}\"。" #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "建立日誌目錄" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" msgstr "建立新的 S3 bucket:{url}" #: ../fdroidserver/publish.py msgid "Creating output directory" msgstr "建立輸出目錄" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" msgstr "用此密鑰 (SHA256) 來建立簽署的索引:" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" msgstr "建立臨時目錄" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" msgstr "建立未簽署的索引以準備予以簽署" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" msgstr "目前版本碼 {cv} 小於最早構建的登錄項目 {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" msgstr "DEBUG_KEYSTORE 未作設定或是不完整" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" msgstr "從軟體庫刪除缺少中介資料的 APK 和/或 OBB" #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" msgstr "正在刪除檔案, 軟體庫已經滿了({size} / {limit})" #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" msgstr "正在刪除 git-mirror 的歷史檔案, 軟體庫已經滿了 ({size} / {limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" msgstr "刪除未知的檔案:{path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" msgstr "描述 '%s' 僅為此應用的摘要" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" msgstr "描述中出現重覆行" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" msgstr "描述中有一個列表 (%s) 但它並未被編排 (*) 或作編號 (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" msgstr "描述的長度 {length} 已超過 {limit} 個字符限制" #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Do not add 'disable:' to the generated build entries" msgstr "不要在生成的編譯路徑中添加 'disable:'" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" msgstr "不要部署新檔案到倉庫中" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" msgstr "不要在 URL 中包含 \"{path}\"!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" msgstr "不要為 Android SDK 的路徑提示,只提示失敗的" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" msgstr "不要移除從金鑰儲存生成的私密金鑰" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" msgstr "不要建立 tarball,在測試一個構建時很有用處" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" msgstr "不要更新軟體庫,在沒有網路連線時測試構建很有用" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" msgstr "不使用 rsync 檢驗和" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "下載小型軟體庫完整的鏡像" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" msgstr "" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "下載軟體庫已失敗過一次,尚未重試。" #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" msgstr "{url} 下載失敗,錯誤訊息 {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" msgstr "" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" msgstr "'{field}' 有重複的連結:{url}" #: ../fdroidserver/__main__.py #, fuzzy msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ERROR: 子命令 \"server\" 已經被移除了, 請使用 \"deploy\" !" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" "錯誤:此命令絕不該用於鏡像 f-droid.org!\n" "完整的 f-droid.org 鏡像需要超過 200GB。" #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "出錯:未支援 CI 類型,歡迎補強!" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" #: ../fdroidserver/__main__.py #, fuzzy, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." msgstr "編碼已被設置為 '{enc}' fdroid 可能出現了編碼問題。 為了達到較好的效果, 請將編碼設置為 'UTF-8'。" #: ../fdroidserver/init.py #, python-format msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" "請在此輸入 Android SDK (%s) 的路徑:\n" "> " #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Environment variable {var} from {configname} is not set!" msgstr "配置文件 {configname} 中的 環境變量 {var} 還沒有設置 !" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "在接取軟體庫的地址時出錯" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" msgstr "" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "自 APKs 捽取出簽名" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "Failed copying {path}: {error}" msgstr "讀取路徑 {path} 失敗:錯誤訊息{error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" msgstr "'{apkfilename}' 無法抓取簽名:錯誤訊息{error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" msgstr "讀取 {path} 失敗:錯誤訊息{error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" msgstr "{path} 無法調整大小:錯誤訊息 {error}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" msgstr "無法建立 S3 bucket : {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" msgstr "無法取得 APK 資訊,刪除 {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" msgstr "無法取得 APK 資訊,略過 {path}" #: ../fdroidserver/update.py #, fuzzy msgid "Failed to get APK signing key fingerprint" msgstr "無法取得 APK 單號資訊" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" msgstr "無法在 {dev} 安裝 '{apkfilename}':{error}" #: ../fdroidserver/common.py msgid "Failed to sign application" msgstr "無法簽署應用程式" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" msgstr "從 VM 提取 buildserverid:{buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" msgstr "抓取 '{apkfilename}' 的簽署資料 -> '{sigdir}'" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "File disappeared while processing it: {path}" msgstr "檔案 「{path}」在處理過程中消失了" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py #: ../fdroidserver/update.py msgid "Finished" msgstr "已完成" #: ../fdroidserver/lint.py #, fuzzy msgid "Flattr donation methods belong in the FlattrID: field" msgstr "Flattr 捐款方式在 FlattrID 標誌下" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "禁用 HTML 標籤" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." msgstr "強制停用應用程式的構建,並且忽視掃描問題而繼續。只允許在測試模式下。" #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" msgstr "在 {0} 秒超時後強制停止構建!" #: ../fdroidserver/scanner.py #, fuzzy msgid "Force scan of disabled apps and builds." msgstr "強制掃描被禁用的軟體和二進制檔案 。" #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" msgstr "找到 \"{path}\" 圖像不包含 \"{name}\" 應用的中介資料!" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "找到了 \"{name}\" 的錯誤的籌款檔案 \"{path}\":" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" msgstr "引數中找到無效的 appids" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "有些應用的版本代號無效" #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" msgstr "{path} 找到多筆簽名證書" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" msgstr "{appid} 找到多件中介資料檔案" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." msgstr "軟體庫找到多份簽署證書。" #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." msgstr "軟體庫查無簽名證書。" #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" msgstr "%s 中找到 non-file" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" msgstr "" #: ../fdroidserver/scanner.py #, fuzzy, python-brace-format msgid "Found {count} problems in {filename}" msgstr "在 {filename} 發現{count} 個問題" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" msgstr "為 {appid} 建立缺少的骨幹中介資料檔案" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" msgstr "Git '%s' 還原失敗" #: ../fdroidserver/common.py msgid "Git clean failed" msgstr "Git 清理失敗" #: ../fdroidserver/common.py msgid "Git fetch failed" msgstr "Git 抓取失敗" #: ../fdroidserver/common.py #, fuzzy msgid "Git prune failed" msgstr "Git 重置失敗" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Git 遠端 set-head 失敗: \"%s\"" #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Git 重置失敗" #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Git 子模組同步失敗" #: ../fdroidserver/common.py msgid "Git submodule update failed" msgstr "Git 子模組更新失敗" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" msgstr "HTTPS 必須與 Subversion 網址一起使用!" #: ../fdroidserver/deploy.py #, fuzzy msgid "If a git mirror gets to big, allow the archive to be deleted" msgstr "如果一個 git mirror 變得太大, 允許刪除該 git mirror 的檔案" #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format msgid "If this upload fails, try manually uploading to {url}" msgstr "如果本次上傳失敗, 嘗試手動上傳至 {url}" #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." msgstr "忽略 '{metapath}' 中的 '{field}' , 因為它已經過時了。" #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "忽略文檔 FUNDING.yml , 文檔大小超過 2048: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" msgstr "" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "忽略無中介資料的套件包: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" msgstr "忽略 {apkfilename} 陳舊的緩存資料" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" msgstr "包含 APKs 其簽名為有弱點的演算法,如 MD5" #: ../fdroidserver/mirror.py #, fuzzy msgid "Include the PGP signature .asc files in the mirror" msgstr "在鏡像中加入 PGP 簽名和 .asc 文檔" #: ../fdroidserver/mirror.py #, fuzzy msgid "Include the build logs in the mirror" msgstr "在鏡像中加入編譯紀錄" #: ../fdroidserver/mirror.py #, fuzzy msgid "Include the source tarballs in the mirror" msgstr "在鏡像中加入軟體的源代碼包" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" msgstr "" #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "初始化子模組" #: ../fdroidserver/install.py msgid "Install all signed applications available" msgstr "安裝所有已簽署可用的應用程式" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" msgstr "在裝置上安裝構建套件包" #: ../fdroidserver/install.py #, fuzzy, python-format msgid "Installing %s..." msgstr "正在安裝中 %s…" #: ../fdroidserver/install.py #, fuzzy, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." msgstr "正在將軟體 '{apkfilename}' 安裝到設備 {dev} 上 ..." #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" msgstr "與軟體庫 HTTP 伺服器互動" #: ../fdroidserver/update.py msgid "Invalid APK" msgstr "無效的 APK" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" msgstr "無效的 VercodeOperation:{field}" #: ../fdroidserver/lint.py #, fuzzy, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "無效的 VercodeOperation:{invalid_ops}" #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Invalid application ID {appid}" msgstr "無效的 application ID {appid}" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" msgstr "無效的布林 '%s'" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "無效的排序列表" #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" msgstr "無效的已發佈檔案名稱:%s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " msgstr "無效的重新導向到非 HTTPS:{before}->{after}。 " #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" msgstr "無效的 scrlib metadata: 檔案 '{file}' 不存在" #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" msgstr "無效的 scrlib metadata: 無法解析檔案 '{file}'" #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" msgstr "無效的 scrlib metadata: 檔案 '{file}' 裡有未知的密鑰 '{key}'" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" msgstr "JAR 簽名驗證失敗:{path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" msgstr "JAR 簽名已驗證:{path}" #: ../fdroidserver/scanner.py #, fuzzy msgid "Java JAR file" msgstr "Java JAR 檔案" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" msgstr "找不到 Java JDK!請安裝在標準的位置或是設定 java_paths!" #: ../fdroidserver/scanner.py #, fuzzy msgid "Java compiled class" msgstr "Java .class 檔案" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" msgstr "找不到 Java jarsigner!請安裝在標準的位置或是設定 java_paths!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" msgstr "JavaScript 在 HTML src 的屬性" #: ../fdroidserver/build.py #, fuzzy, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" msgstr "讀取 minSdkVersion 失敗:\"{apkfilename}\"" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "金鑰庫的簽署金鑰:\t" #: ../fdroidserver/lint.py #, fuzzy, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" msgstr "最近採用的提交 '{commit}' 似乎是一個標籤,但是更新的檢查模式為 '{ucm}'" #: ../fdroidserver/lint.py #, fuzzy msgid "Liberapay donation methods belong in the Liberapay: field" msgstr "Liberapay 捐款方式在 LiberapayID 標誌下" #: ../fdroidserver/rewritemeta.py #, fuzzy msgid "List files that would be reformatted (dry run)" msgstr "列出將重新格式化的檔案" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "在 f-droid.org 網址中已含括區域" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" msgstr "異常時停止做構建" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." msgstr "軟體庫鏡像異常。" #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" msgstr "異常的 serverwebroot 行:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" msgstr "" #: ../fdroidserver/mirror.py #, fuzzy msgid "Mirror the full repo and archive, all file types." msgstr "保存整個軟體庫和檔案的副本, 所有的檔案格式 。" #: ../fdroidserver/gpgsign.py msgid "Missing output directory" msgstr "輸出目錄消失" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" msgstr "" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" #: ../fdroidserver/verify.py #, fuzzy, python-format msgid "No APK for package: %s" msgstr "無此套件包:%s" #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "未找到 Android SDK!" #: ../fdroidserver/install.py msgid "No attached devices found" msgstr "查無附加的設備" #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "在 URL 無指紋。" #: ../fdroidserver/common.py msgid "No git submodules available" msgstr "無可用的 git 子模組" #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "No gradle project could be found. Specify --subdir?" msgstr "找不到任何 gradle 專案。 需要用參數 '--subdir' 指定子目錄嗎?" #: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "查無資訊。" #: ../fdroidserver/checkupdates.py #, fuzzy msgid "No matching tags found" msgstr "查無資訊" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." msgstr "" #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "不必要指明的應用程式為自由軟體" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" msgstr "不必指明該應用為 Android 版本" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "未設定選項!編輯 config.yml 檔,其中至少要設定一個:" #: ../fdroidserver/common.py msgid "No packages specified" msgstr "未指定套件" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" msgstr "%s 沒有已簽署的 APK" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" msgstr "輸出目錄無簽署 - 無須採取動作" #: ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" msgstr "{path} 找不到簽署證書" #: ../fdroidserver/common.py #, python-format msgid "No such package: %s" msgstr "無此套件包:%s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" msgstr "應用 {appid} 無版本代號 {versionCode}" #: ../fdroidserver/checkupdates.py #, fuzzy msgid "No tags found" msgstr "查無附加的設備" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" msgstr "無未簽署目錄 - 無須採取行動" #: ../fdroidserver/common.py #, fuzzy msgid "Not a valid size definition: \"{}\"" msgstr "檔案大小的定義是無效的: \"{}\"" #: ../fdroidserver/signindex.py msgid "Nothing to do" msgstr "無須採取動作" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." msgstr "{appid} 無須採取行動." #: ../fdroidserver/init.py msgid "Now set these in config.yml:" msgstr "現在設定這些在 config.yml 中:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" msgstr "比起任何 APK,OBB 檔案有較新的版本代號 ({integer}):" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" msgstr "OBB 檔名的前綴須為 \"main.\" 或 \"patch.\":" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" msgstr "OBB 的套件包名稱與支援的 APK 並不相符:" #: ../fdroidserver/deploy.py #, fuzzy msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "因為機器是離線的, 跳過 git mirror 的生成直到 `fdroid deploy`" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "圖像僅支援 PNG 和 JPEG,可在下方找到:{path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "僅印出與 Play Store 的不同處" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "只處理具有自動更新的應用程式" #: ../fdroidserver/lint.py #, fuzzy msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "OpenCollective 的捐款方式在 OpenCollective: 的標誌下面" #: /usr/lib/python3.11/optparse.py #, fuzzy msgid "Options" msgstr "選項" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "將 json 報告輸出到以 APK 命名的檔案。" #: ../fdroidserver/scanner.py #, fuzzy msgid "Output JSON to stdout." msgstr "輸出 JSON 到 stdout 。" #: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py #: ../fdroidserver/publish.py ../fdroidserver/signindex.py #: ../fdroidserver/update.py #, fuzzy msgid "Outputting JSON" msgstr "正在導出 JSON 中" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "該專案的整體授權。" #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "覆蓋在 {apkfilename} 中的空白 versionName 從詮釋資料:{version}" #: ../fdroidserver/import_subcommand.py #, fuzzy, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "軟體 \"{appid}\" 已經存在了" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" msgstr "解析 '{path}' 的單號" #: ../fdroidserver/common.py msgid "Password required with username" msgstr "用戶名稱須有密碼" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "如果不在根目錄下,路徑為 android 主要專案的子目錄。" #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" msgstr "Android SDK 的路徑(有時在 ANDROID_HOME 中設定)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" msgstr "到 git 軟體庫的路徑用在日誌" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" msgstr "給軟體庫簽署金鑰的金鑰庫路徑" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "在終端機顥示祕密變數以便於複製/貼上" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" msgstr "'{path}' 的 xml 有問題" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" msgstr "處理自動更新" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" msgstr "處理 {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" msgstr "處理 {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" msgstr "產生可讀懂的 XML/JSON 格式以進行檔案索引" #: ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "要導入的專案網址。" #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" msgstr "標點應予避免" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" msgstr "將日誌推送到 git 遠端軟體庫" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing binary transparency log to {url}" msgstr "推二進制的透明日誌到{url}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" msgstr "發佈到 {url}" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" msgstr "快速啟動新的儲存庫" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" msgstr "讀取所有的中介資料檔案並退出" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" msgstr "讀取 '{config_file}' 中" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" msgstr "讀取套件名稱/版本代碼/版本名稱 失敗,APK 無效:'{apkfilename}'" #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" msgstr "讀取套件名稱/版本代碼/版本名稱 失敗,APK 無效:'{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" msgstr "從緩存讀取 {apkfilename}" #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "移除指定檔案" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" msgstr "" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "為不符合 package.name_123.apk 格式的 APK 檔案更名" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" msgstr "" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." msgstr "即使現有的伺服器明顯是好的,仍重置並建立一個新的構建伺服器。" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" msgstr "用提供的 debug.keystore 放棄 {apkfilename}" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" msgstr "重設超過最大像素的所有圖示之尺寸並且退出" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" msgstr "將輸出限定為警告和錯誤" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "重寫所有的中介資料檔案" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" msgstr "重覆寫入 '{appid}'" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" msgstr "在有未遞交變更的 git 倉庫上執行" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "執行 rewritemeta 到固定格式" #: ../fdroidserver/deploy.py msgid "Running first pass with MD5 checking disabled" msgstr "關閉 MD5 檢查以執行首次通過" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" msgstr "在 {path} 裡執行 wget" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" msgstr "" #: ../fdroidserver/build.py #, fuzzy msgid "Scan the resulting APK(s) for known non-free classes." msgstr "在生成的 APK 檔案中掃描已知的閉源軟體 。" #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" msgstr "掃描套件包的原始碼" #: ../fdroidserver/scanner.py #, fuzzy, python-brace-format msgid "Scanner found {count} problems in {apk}" msgstr "掃瞄器在 {apk} 發現{count} 個問題" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" msgstr "掃瞄器在 {appid} 發現{count} 個問題:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" msgstr "掃瞄器在 {appid} 發現 {count} 個問題:{versionCode}:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "掃瞄器發現 {} 問題" #: ../fdroidserver/scanner.py #, fuzzy msgid "Scanning APK with dexdump for known non-free classes." msgstr "在生成的 APK 檔案中掃描已知的閉源軟體 。" #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" msgstr "" #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "設定時鐘到那時使用:" #: ../fdroidserver/nightly.py #, fuzzy msgid "Set maximum releases in repo before older ones are archived" msgstr "先設置軟體庫的軟體最大釋出數, 再將舊軟體歸檔" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" msgstr "設定開啟的檔案限制為 {integer}" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" msgstr "為非正式編譯庫建立一個應用編譯" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " msgstr "設定開啟檔案的限制失敗: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" msgstr "為此構建設定 {0} 秒後超時" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "簽署並放置套件包在軟體庫中" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" msgstr "簽署使用更新建立的索引 --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" msgstr "跳過掃描二進制碼和其它問題的原始碼" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "略過帶無效簽署的 '{apkfilename}'!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" msgstr "略過 {appid} 的索引產生" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" msgstr "略過無效簽名的 {apkfilename}!" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" msgstr "略過 {appid}:關閉" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" msgstr "指定要將軟體庫同步到本地的資料夾" #: ../fdroidserver/deploy.py msgid "Specify an identity file to provide to SSH for rsyncing" msgstr "指定一個身份檔案以提供給 SSH 進行 rsync" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." msgstr "指定要使用哪個除錯金鑰庫檔。" #: ../fdroidserver/common.py msgid "Spew out even more information than normal" msgstr "傾湧出比正常情況下更多的資訊" #: ../fdroidserver/nightly.py #, fuzzy, python-brace-format msgid "Stripping mystery signature from {apkfilename}" msgstr "正從軟體 {apkfilename} 除去未知的簽名" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" msgstr "摘要 '%s' 僅是應用程式的名稱" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" msgstr "摘要的長度 {length} 超過了字符 {limit} 限制" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" msgstr "在 {path} 中的系統時鐘比日期早!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" msgstr "" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "測試模式 - 將輸出只放在 tmp 目錄中,即使輸出已經存在,仍然構建。" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" msgstr "OBB 版本程式碼須在 \"{name}\" 之後:" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" msgstr "軟體庫日誌的總部網址(預設:https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" msgstr "寫入目錄的鏡像到" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" msgstr "包含在此軟體庫的檔案 (path 或 glob)" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." msgstr "軟體庫的指紋並不相符。" #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" msgstr "local_copy_dir \"{path}\" 根目錄不存在!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" msgstr "發生主要別名衝突 - 發佈中止" #: ../fdroidserver/common.py #, fuzzy msgid "These are the apps that have been archived from the main repo." msgstr "這些是從主軟體庫中歸檔的軟體。" #: ../fdroidserver/common.py #, fuzzy msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "這是一個和 F-Droid 配套使用的軟體庫。此軟體庫中包含由程式原開發者編譯製作而成的二進制包和由 fdroid.org 的管理員使用 https://gitlab.com/fdroid 上的開發者工具編譯製作而成的二進制包。" #: ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "這個軟體庫已有本地的中介資料:%s" #: ../fdroidserver/init.py #, python-format msgid "" "To complete the setup, add your APKs to \"%s\"\n" "then run \"fdroid update -c; fdroid update\". You might also want to edit\n" "\"config.yml\" to set the URL, repo name, and more. You should also set up\n" "a signing key (a temporary one might have been automatically generated).\n" "\n" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "要使用 awsbucket, awssecretkey 與 awsaccesskeyid 必須在 config.yml 進行設定!" #: ../fdroidserver/lint.py #, fuzzy msgid "URL must start with https:// or http://" msgstr "URL 必須由 https:// 和 http:// 起頭" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" msgstr "不應使用 URL 縮短網址" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" msgstr "描述中的 URL {url} : {error}" #: ../fdroidserver/lint.py #, fuzzy msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" msgstr "這個許可證標籤不符合預期 \"{}\"! 只能使用 https://spdx.org/license-list 上的,經過 FSF 或 OSI 驗證的許可證標籤啦。" #: ../fdroidserver/lint.py #, fuzzy msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "這個許可證標籤不符合預期 \"{}\"! 只能使用你的配置文檔裡面配置好的許可證標籤啦" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" msgstr "" #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Unknown entry {key} in {configname}" msgstr "配置文檔 {configname} 裡面登記的密鑰 {key} 是未知的" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "發現未知的異常!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" msgstr "在 '{versionName}' 編譯出現不明的檔案 '{filename}'" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" msgstr "未知的中介資料格式:%s" #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" msgstr "Metadata 的格式是未知的: 路徑: {path} (使用: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " msgstr "不明的 aapt 版本,可能會出問題: " #: ../fdroidserver/lint.py msgid "Unnecessary leading space" msgstr "不必要的前導空間" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" msgstr "不必要的尾隨空間" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" msgstr "在 '{path}' 中無法辨識的 app 欄位 '{fieldname}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "在 '{path}' 中無法辨識的構建旗標 '{build_flag}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" msgstr "用於軟體庫的圖片,不支援的檔案類型 \"{extension}\"" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" msgstr "找到不支援的圖形檔案:{path}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" msgstr "在 %s 未使用的 extlib" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" msgstr "在 %s 未使用的檔案" #: ../fdroidserver/scanner.py #, fuzzy, python-format msgid "Unused scandelete path: %s" msgstr "路徑: %s 被標記為掃描並刪除,但並未執行" #: ../fdroidserver/scanner.py #, fuzzy, python-format msgid "Unused scanignore path: %s" msgstr "檔案路徑: %s 被標記為不掃描,但並未出現" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" msgstr "" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "為新的套件包更新軟體庫資訊" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" msgstr "為網址更新二進制的透明日誌" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData 有無效的 URL:{url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" msgstr "UpdateCheckData 必須使用 HTTPS URL:{url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData 不是有效的 URL:{url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py #, fuzzy msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName 已經被設定成已知的 application id - 它可以被移除" #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" msgstr "正在將軟體檔案 {apkfilename} 上傳到 androidobservatory.org" #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format msgid "Uploading {apkfilename} to virustotal" msgstr "正在將軟體檔案 {apkfilename} 上傳到 virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "Usage" msgstr "使用方法" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "Usage: %s\n" msgstr "使用方法:%s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "使用 /HEAD 取代 /master 來指向默認分支的一個檔案" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "利用`fdroid update -c` 指令來建立。" #: ../fdroidserver/build.py msgid "Use build server" msgstr "使用構建伺服器" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" msgstr "使用來自 APK 的日期,而不是新增之 APK 目前的時間" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." msgstr "使用 \"{path}\" 對 s3cmd 組態。" #: ../fdroidserver/common.py #, fuzzy msgid "Using APK Signature v2" msgstr "使用 APK Signature v2" #: ../fdroidserver/common.py #, fuzzy msgid "Using APK Signature v3" msgstr "使用 APK Signature v3" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "使用 Java 的 jarsigner,這並不建議用於驗證 APK!使用 apksigner" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" msgstr "使用從「{path}」而來的 androguard" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" msgstr "" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" msgstr "使用現有的金鑰庫 \"{path}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" msgstr "使用 s3cmd 來同步:{url}" #: ../fdroidserver/__main__.py msgid "Valid commands are:" msgstr "有效的指令是:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." msgstr "使用本機快取複本來驗證而非重新下載。" #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" msgstr "驗證下載套裝軟體的完整性" #: ../fdroidserver/index.py msgid "Verifying index signature:" msgstr "正在驗證索引簽名:" #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "VirusTotal API key 無法上傳大於 32MB 的檔案, 選擇使用 {url} 來上傳檔案 {path} 。" #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "關於中介資料可能錯誤的警告" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "當已組態為簽名的索引時,只能在此階段建立無簽名的索引" #: ../fdroidserver/lint.py #, fuzzy msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "在默認情況下, 檢查整個軟體庫中的可疑代碼時不會檢查 yaml 檔案 (yamllint) 。 使用本選項將會忽略默認選項,在檢查整個軟體庫中的可疑代碼時強制檢查 yaml 檔案 (yamllint) 。" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "產生金鑰時使用 X.509 的'專有名稱'" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" msgstr "可以使用 ANDROID_HOME 來設定 SDK 的路徑,i.e.:" #: ../fdroidserver/scanner.py #, fuzzy msgid "ZIP file archive" msgstr "ZIP 壓縮檔案" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" msgstr "添增 IdentityFile 到 {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" msgstr "添加到 {name}:{path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "模糊選項:%(option)s 可以相配 %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "不明確的選項:%s (%s?)" #: ../fdroidserver/common.py #, fuzzy msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner 不見了 , 我們需要用它來生成數字簽名 !" #: ../fdroidserver/common.py #, fuzzy msgid "apksigner not found, it's required for signing!" msgstr "apksigner 不見了 , 我們需要用它來生成數字簽名 !" #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py #, fuzzy msgid "application ID of file to operate on" msgstr "從檔案的 application ID 著手" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py #, fuzzy msgid "application ID with optional versionCode in the form APPID[:VERCODE]" msgstr "application ID 具有任選的 versionCode 在此的格式為 APPID [:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "引數 \"-\" 為帶 %r 模式" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" msgstr "" #: ../fdroidserver/nightly.py #, fuzzy msgid "attempting bare SSH connection to test deploy key:" msgstr "試圖用裸的 ssh 連線來測試佈署金鑰:" #: ../fdroidserver/common.py #, fuzzy msgid "can not parse scrlib spec (not a string): '{}'" msgstr "無法解析 scrlib spec (不是字符): '{}'" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "無法打開 '%(filename)s':%(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" msgstr "" #: ../fdroidserver/build.py #, fuzzy, python-brace-format msgid "cannot find required srclibs: \"{path}\"" msgstr "找不到必須的 scrlibs: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "無法有多個子解析器引數" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "無法合併動作 - 二個群體被命名為 %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" msgstr "無法發佈更新,是否正確地設定了佈署金鑰?" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" msgstr "複製 {url}" #: ../fdroidserver/__main__.py #, fuzzy msgid "commands from plugin modules:" msgstr "來自插換式模塊的命令:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" msgstr "複雜" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "相衝突的選項字串:%s" #: /usr/lib/python3.11/argparse.py #, fuzzy, python-format msgid "conflicting subparser alias: %s" msgstr "相衝突的選項字串:%s" #: /usr/lib/python3.11/argparse.py #, fuzzy, python-format msgid "conflicting subparser: %s" msgstr "相衝突的選項字串:%s" #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format msgid "could not parse '{path}'" msgstr "無法解析 '{path}'" #: ../fdroidserver/common.py #, fuzzy msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "無法解析 scrlib spec (沒有指定參考文獻): '{}'" #: ../fdroidserver/common.py #, fuzzy msgid "could not parse srclib spec (too many '@' signs): '{}'" msgstr "無法解析 scrlib spec (符號 '@' 出現太多次了): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" msgstr "已建立 {path}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" msgstr "刪除:repo/{apkfilename}" #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "deployed process log {path} to {dest}" msgstr "將進程日誌 {path} 部署到 {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest= 如 %r 選項為必須" #: ../fdroidserver/scanner.py msgid "downloading '{}'" msgstr "" #: ../fdroidserver/scanner.py #, fuzzy msgid "downloading scanner signatures from '{}' failed" msgstr "正從軟體 {apkfilename} 除去未知的簽名" #: ../fdroidserver/scanner.py #, fuzzy msgid "executable binary, possibly code" msgstr "可執行二進制檔案, 估計是代碼" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "預期的 %s 引數" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "預期至少有一個引數" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "最多一個引數" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "預期有一個引數" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" msgstr "用法:fdroid [-h|--help|--version] <命令> []" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" msgstr "" #: /usr/lib/python3.11/optparse.py msgid "floating-point" msgstr "浮點" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "強制中介資料錯誤(預設值)作警告或忽略。" #: ../fdroidserver/common.py msgid "git svn clone failed" msgstr "Git svn 複製失敗" #: ../fdroidserver/scanner.py #, fuzzy msgid "gzip file archive" msgstr "gzip 壓縮檔案" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "被忽略的明確引數 %r" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 必須要有簽名, 使用 `fdroid signindex`來建立一組簽名!" #: ../fdroidserver/index.py #, fuzzy msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 必須要有簽名, 使用 `fdroid signindex`來建立一組簽名!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" msgstr "整數" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "無效 %(type)s 值:%(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "無效選項:%(value)r (選取自 %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "無效 conflict_resolution 值:%r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "無效的選項字串 %(option)r:必須以字符 %(prefix_chars)r為起頭" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "local_copy_dir 未以 \"fdroid\"結尾,也許你指示的是: \"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" msgstr "local_copy_dir 必須為絕對路徑!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" msgstr "local_copy_dir 為目錄,不是檔案!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" msgstr "鏡像 '%s' 並不是以 'fdroid' 作結尾!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "相互獨佔的引數必須為可選的" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" msgstr "" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" msgstr "在 {appid} 中沒有 \"icon\"" #: ../fdroidserver/signatures.py msgid "no APK supplied" msgstr "無 APK 被供應" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" msgstr "沒這樣的選項:%s" #: ../fdroidserver/__main__.py msgid "no version info found!" msgstr "未發現版本資訊!" #: ../fdroidserver/checkupdates.py #, fuzzy msgid "no version information found" msgstr "未發現版本資訊" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "不許可帶引數 %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "引數 %s 必須要有一個" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" msgstr "只接受字串,列表和元組" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "選項 %s: 如果真要安裝全部的簽署應用, 請使用 --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "選項 %s: 無效的 %s 值: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "選項 %s: 無效選項: %r (選自 %s )" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" msgstr "不能識別選項 -%s" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" msgstr "選項 -%s 需要參數" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "選項 --%s 不能有參數" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "選項 --%s 不是單獨的字首" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" msgstr "不能識別選項 --%s" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s requires argument" msgstr "選項 --%s 需要參數" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "可選參數" #: /usr/lib/python3.11/argparse.py #, fuzzy msgid "options" msgstr "選項" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" msgstr "覆寫現有的 {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "位置參數" #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "process log deploy {path} to {dest} failed!" msgstr "將進程日誌 {path} 部署到 {dest} 但失敗了!" #: ../fdroidserver/build.py msgid "reference binary missing signature" msgstr "" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" msgstr "拒絕透過不安全的 HTTP 連線下載 (使用 HTTPS 或指明 --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, fuzzy, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." msgstr "軟體庫圖標 (repo_icon)\"repo/icons/%s\" 不存在, 正在生成佔位用的圖標。" #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" msgstr "" #: ../fdroidserver/metadata.py #, fuzzy msgid "ruamel.yaml not installed, can not write metadata." msgstr "因為沒有設置 ruamel.yaml, 無法寫入 metadata 。" #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd 同步索引 {path} 到 {url} 並刪除" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" #: ../fdroidserver/scanner.py #, fuzzy msgid "shared library" msgstr "共享庫 (shared library)" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" msgstr "顯示程式的版本號碼並離開" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" msgstr "顯示此說明訊息並離開" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." msgstr "簽署 APK, 可由檔案路徑或是 HTTPS 網址." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" msgstr "跳過部署完整構建紀錄:紀錄內容為空" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" msgstr "跳過部署完整構建紀錄:未在設定中啟用" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" msgstr "略過來源 tarball: {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" msgstr "srclibs 缺失名稱或 @" #: ../fdroidserver/scanner.py #, fuzzy msgid "static library" msgstr "靜態庫 (static library)" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "需要下列參數:%s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "非預期選項字串: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "不明解析器 %(parser_name)r (選項: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "無法辨識的引數:%s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "'{config_file}' 檔案不安全的權限(應為 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "使用方法: " #: ../fdroidserver/deploy.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" msgstr "使用 Apache libcloud 來同步 {url}" #: ../fdroidserver/deploy.py #, fuzzy msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "因為 virustotal.com 正在限制收到請求的頻率, 這邊正在等待中, 過一會再試 ..." #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" msgstr[0] "{0} 應用, {1} 主要別名" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) 沒有中介資料!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" msgstr "{apkfilename} 有多個 {name} 檔案,看起來可能是主金鑰洩漏了!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "{apkfilename} AndroidManifest.xml 有一個無效的日期: " #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "軟體 {appid} 沒有名字! 使用 application ID 代替。" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" msgstr "來自路徑 {path} 的 {appid} 並不是一個有效的 android application ID!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "來自 {path} 的 {appid} 並不是一個有效的 Java 套件名稱!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" msgstr "" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" msgstr "{appid} 缺少 {name}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" msgstr "{appid}: 不明的 extlib {path} 編譯在 '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" msgstr "{appid}:沒有指定構建,在目前的原始碼狀態執行" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" msgstr "{appid}:{field} 必須是一個 '{type}',但它是一個 '{fieldtype}!'" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" msgstr "{appid}:{field} 必須是一個 '{type}',但它是一個 '{fieldtype}'!" #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} 必須是整數, 找到: {value}" #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format msgid "{build_flag} must be list or string, found: {value}" msgstr "{build_flag} 必須是整數, 找到: {value}" #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format msgid "{file} is blank or corrupt!" msgstr "檔案 {file} 是空的或損壞的 !" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" 不存在! 請檢查 \"config.yml\"." #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" msgstr "檔案 {oldfile} 已經過時了, 請使用檔案 {newfile}" #: ../fdroidserver/import_subcommand.py #, fuzzy, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "路徑 {path} 已存在, 忽略導入的結果!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" msgstr "\"{path}\" 不存在!經由執行建立它:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} 有不正確的檔案簽章「{pattern}」,可能是 Janus 漏洞!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" msgstr "{path} 為零尺寸!" #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" msgstr "檔案 {path} 大於 200MB , 手動上傳: {url}" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{path}: {error}" msgstr "讀取路徑 {path} 失敗:錯誤訊息{error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} 未以 \"fdroid\" 結尾,檢查 URL 路徑!" #: ../fdroidserver/import_subcommand.py #, fuzzy, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url} 未以 \"http\" 起頭 !" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" msgstr[0] "{} 編譯失敗" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} 編譯成功" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/makebuildserver0000755000175000017500000004434514620351225016126 0ustar00hanshans#!/usr/bin/env python3 import os import re import requests import stat import sys import shutil import subprocess import vagrant import hashlib import yaml import json import logging from clint.textui import progress from optparse import OptionParser import fdroidserver.tail import fdroidserver.vmtools parser = OptionParser() parser.add_option('-v', '--verbose', action="count", dest='verbosity', default=1, help="Spew out even more information than normal") parser.add_option('-q', action='store_const', const=0, dest='verbosity') parser.add_option("-c", "--clean", action="store_true", default=False, help="Build from scratch, rather than attempting to update the existing server") parser.add_option('--skip-box-verification', action="store_true", default=False, help="""Skip verifying the downloaded base box.""") parser.add_option('--skip-cache-update', action="store_true", default=False, help="""Skip downloading and checking cache.""" """This assumes that the cache is already downloaded completely.""") parser.add_option('--copy-caches-from-host', action="store_true", default=False, help="""Copy gradle and pip caches into the buildserver VM""") parser.add_option('--keep-box-file', action="store_true", default=False, help="""Box file will not be deleted after adding it to box storage""" """ (KVM-only).""") options, args = parser.parse_args() logformat = '%(levelname)s: %(message)s' loglevel = logging.DEBUG if options.verbosity == 1: loglevel = logging.INFO elif options.verbosity <= 0: loglevel = logging.WARNING logging.basicConfig(format=logformat, level=loglevel) tail = None BASEBOX_DEFAULT = 'debian/bookworm64' BASEBOX_VERSION_DEFAULT = "12.20231211.1" BASEBOX_CHECKSUMS = { "12.20231211.1": { "libvirt": { "box.img": "80b048312c423b7fbbbac934c348f9a29bdf2f98fae96dd13b3af70ddfe7f12a", "Vagrantfile": "f9c6fcbb47a4d0d33eb066859c8e87efd642287a638bd7da69a9e7a6f25fec47", "metadata.json": "9d717678c19bb81d077e4e7eeb3602c168b6568cc38fee8fd3aa9d8f3cfe639b", }, "virtualbox": { "box.ovf": "8ad49ba600fbd1027e35c8fd41d37383c04bad30fdbafa860a29911d207a3e7b", "box.vmdk": "57602a776860805e82bd3f61cdca9711f39781011db0f8f1dee9b2a614b2c889", "Vagrantfile": "0bbc2ae97668d8da27ab97b766752dcd0bf9e41900e21057de15a58ee7fae47d", "metadata.json": "ffdaa989f2f6932cd8042e1102371f405cc7ad38e324210a1326192e4689e83a", } }, } configfile = 'buildserver/Vagrantfile.yaml' if not os.path.exists(configfile): logging.warning('%s does not exist, copying template file.' % configfile) shutil.copy('examples/Vagrantfile.yaml', configfile) with open(configfile) as fp: config = yaml.safe_load(fp) if not isinstance(config, dict): logging.info("config is empty or not a dict, using default.") config = {} with open('buildserver/Vagrantfile') as fp: m = re.search(r"""\.vm\.box\s*=\s*["'](.*)["']""", fp.read()) if not m: logging.error('Cannot find box name in buildserver/Vagrantfile!') sys.exit(1) config['basebox'] = m.group(1) config['basebox_version'] = BASEBOX_VERSION_DEFAULT config['cachedir'] = os.path.join(os.getenv('HOME'), '.cache', 'fdroidserver') show_config_deprecation = False if os.path.exists('makebuildserver.config.py'): show_config_deprecation = True logging.error('makebuildserver.config.py exists!') elif os.path.exists('makebs.config.py'): show_config_deprecation = True # this is the old name for the config file logging.error('makebs.config.py exists!') if show_config_deprecation: logging.error('Config is via %s and command line flags.' % configfile) parser.print_help() sys.exit(1) logging.debug("Vagrantfile.yaml parsed -> %s", json.dumps(config, indent=4, sort_keys=True)) # Update cached files. if not os.path.exists(config['cachedir']): os.makedirs(config['cachedir'], 0o755) logging.debug('created cachedir {} because it did not exists.'.format(config['cachedir'])) if config['vm_provider'] == 'libvirt': tmp = config['cachedir'] while tmp != '/': mode = os.stat(tmp).st_mode if not (stat.S_IXUSR & mode and stat.S_IXGRP & mode and stat.S_IXOTH & mode): logging.critical('ERROR: %s will not be accessible to the VM! To fix, run:', tmp) logging.critical(' chmod a+X %s', tmp) sys.exit(1) tmp = os.path.dirname(tmp) logging.debug('cache dir %s is accessible for libvirt vm.', config['cachedir']) CACHE_FILES = [ ('https://services.gradle.org/distributions/gradle-6.8.3-bin.zip', '7faa7198769f872826c8ef4f1450f839ec27f0b4d5d1e51bade63667cbccd205'), ('https://services.gradle.org/distributions/gradle-7.0.2-bin.zip', '0e46229820205440b48a5501122002842b82886e76af35f0f3a069243dca4b3c'), ] def sha256_for_file(path): with open(path, 'rb') as f: s = hashlib.sha256() while True: data = f.read(4096) if not data: break s.update(data) return s.hexdigest() def verify_file_sha256(path, sha256): if sha256_for_file(path) != sha256: logging.critical("File verification for '{path}' failed! " "expected sha256 checksum: {checksum}" .format(path=path, checksum=sha256)) sys.exit(1) else: logging.debug("sucessfully verifyed file '{path}' " "('{checksum}')".format(path=path, checksum=sha256)) def get_vagrant_home(): return os.environ.get('VAGRANT_HOME', os.path.join(os.path.expanduser('~'), '.vagrant.d')) def run_via_vagrant_ssh(v, cmdlist): if (isinstance(cmdlist, str) or isinstance(cmdlist, bytes)): cmd = cmdlist else: cmd = ' '.join(cmdlist) v._run_vagrant_command(['ssh', '-c', cmd]) def update_cache(cachedir): count_files = 0 for srcurl, shasum in CACHE_FILES: filename = os.path.basename(srcurl) local_filename = os.path.join(cachedir, filename) count_files = count_files + 1 if os.path.exists(local_filename): if sha256_for_file(local_filename) == shasum: logging.info("\t...shasum verified for '{filename}'\t({filecounter} of {filesum} files)".format(filename=local_filename, filecounter=count_files, filesum=len(CACHE_FILES))) continue local_length = os.path.getsize(local_filename) else: local_length = -1 resume_header = {} download = True try: r = requests.head(srcurl, allow_redirects=True, timeout=60) if r.status_code == 200: content_length = int(r.headers.get('content-length')) else: content_length = local_length # skip the download except requests.exceptions.RequestException as e: content_length = local_length # skip the download logging.warn('%s', e) if local_length == content_length: download = False elif local_length > content_length: logging.info('deleting corrupt file from cache: %s', local_filename) os.remove(local_filename) logging.info("Downloading %s to cache", filename) elif local_length > -1 and local_length < content_length: logging.info("Resuming download of %s", local_filename) resume_header = {'Range': 'bytes=%d-%d' % (local_length, content_length)} else: logging.info("Downloading %s to cache", filename) if download: r = requests.get(srcurl, headers=resume_header, stream=True, allow_redirects=True, timeout=60) content_length = int(r.headers.get('content-length')) with open(local_filename, 'ab') as f: for chunk in progress.bar(r.iter_content(chunk_size=65536), expected_size=(content_length / 65536) + 1): if chunk: # filter out keep-alive new chunks f.write(chunk) v = sha256_for_file(local_filename) if v == shasum: logging.info("\t...shasum verified for '{filename}'\t({filecounter} of {filesum} files)".format(filename=local_filename, filecounter=count_files, filesum=len(CACHE_FILES))) else: logging.critical("Invalid shasum of '%s' detected for %s", v, local_filename) os.remove(local_filename) sys.exit(1) def debug_log_vagrant_vm(vm_dir, config): if options.verbosity >= 3: _vagrant_dir = os.path.join(vm_dir, '.vagrant') logging.debug('check %s dir exists? -> %r', _vagrant_dir, os.path.isdir(_vagrant_dir)) logging.debug('> vagrant status') subprocess.call(['vagrant', 'status'], cwd=vm_dir) logging.debug('> vagrant box list') subprocess.call(['vagrant', 'box', 'list']) if config['vm_provider'] == 'libvirt': logging.debug('> virsh -c qmeu:///system list --all') subprocess.call(['virsh', '-c', 'qemu:///system', 'list', '--all']) domain = 'buildserver_default' logging.debug('> virsh -c qemu:///system snapshot-list %s', domain) subprocess.call(['virsh', '-c', 'qemu:///system', 'snapshot-list', domain]) def main(): global config, tail if options.skip_cache_update: logging.info('skipping cache update and verification...') else: update_cache(config['cachedir']) # use VirtualBox software virtualization if hardware is not available, # like if this is being run in kvm or some other VM platform, like # http://jenkins.debian.net, the values are 'on' or 'off' if config.get('hwvirtex') != 'off' and os.path.exists('/proc/cpuinfo'): with open('/proc/cpuinfo') as f: contents = f.read() if 'vmx' in contents or 'svm' in contents: logging.debug('found \'vmx\' or \'svm\' in /proc/cpuinfo -> hwvirtex = \'on\'') else: logging.error('hwvirtex = \'on\' and no \'vmx\' or \'svm\' found in /proc/cpuinfo!') sys.exit(1) serverdir = os.path.join(os.getcwd(), 'buildserver') logfilename = os.path.join(serverdir, 'up.log') if not os.path.exists(logfilename): open(logfilename, 'a').close() # create blank file log_cm = vagrant.make_file_cm(logfilename) v = vagrant.Vagrant(root=serverdir, out_cm=log_cm, err_cm=log_cm) # https://phoenhex.re/2018-03-25/not-a-vagrant-bug os_env = os.environ.copy() os_env['VAGRANT_DISABLE_VBOXSYMLINKCREATE'] = '1' v.env = os_env if options.verbosity >= 2: tail = fdroidserver.tail.Tail(logfilename) tail.start() vm = fdroidserver.vmtools.get_build_vm(serverdir, provider=config['vm_provider']) if options.clean: vm.destroy() # Check if selected provider is supported if config['vm_provider'] not in ['libvirt', 'virtualbox']: logging.critical("Currently selected VM provider '{vm_provider}' " "is not supported. (please choose from: " "virtualbox, libvirt)" .format(vm_provider=config['cm_provider'])) sys.exit(1) # Download and verify pre-built Vagrant boxes if not options.skip_box_verification: buildserver_not_created = any([True for x in v.status() if x.state == 'not_created' and x.name == 'default']) if buildserver_not_created or options.clean: # make vagrant download and add basebox target_basebox_installed = any([x for x in v.box_list() if x.name == config['basebox'] and x.provider == config['vm_provider'] and x.version == config['basebox_version']]) if not target_basebox_installed: cmd = [shutil.which('vagrant'), 'box', 'add', config['basebox'], '--box-version=' + config['basebox_version'], '--provider=' + config['vm_provider']] ret_val = subprocess.call(cmd) if ret_val != 0: logging.critical("downloading basebox '{box}' " "({provider}, version {version}) failed." .format(box=config['basebox'], provider=config['vm_provider'], version=config['basebox_version'])) sys.exit(1) # verify box if config['basebox_version'] not in BASEBOX_CHECKSUMS: logging.critical("can not verify '{box}', " "unknown basebox version '{version}'" .format(box=config['basebox'], version=config['basebox_version'])) sys.exit(1) for filename, sha256 in BASEBOX_CHECKSUMS[config['basebox_version']][config['vm_provider']].items(): verify_file_sha256(os.path.join(get_vagrant_home(), 'boxes', config['basebox'].replace('/', '-VAGRANTSLASH-'), config['basebox_version'], config['vm_provider'], filename), sha256) logging.info("successfully verified: '{box}' " "({provider}, version {version})" .format(box=config['basebox'], provider=config['vm_provider'], version=config['basebox_version'])) else: logging.debug('using unverified basebox ...') logging.info("Configuring build server VM") debug_log_vagrant_vm(serverdir, config) try: v.up(provision=True) except subprocess.CalledProcessError: debug_log_vagrant_vm(serverdir, config) logging.error("'vagrant up' failed. Consult %s", logfilename) sys.exit(1) if options.copy_caches_from_host: ssh_config = v.ssh_config() user = re.search(r'User ([^ \n]+)', ssh_config).group(1) hostname = re.search(r'HostName ([^ \n]+)', ssh_config).group(1) port = re.search(r'Port ([0-9]+)', ssh_config).group(1) key = re.search(r'IdentityFile ([^ \n]+)', ssh_config).group(1) for d in ('.m2', '.gradle/caches', '.gradle/wrapper', '.pip_download_cache'): fullpath = os.path.join(os.getenv('HOME'), d) os.system('date') print('rsyncing', fullpath, 'into VM') if os.path.isdir(fullpath): ssh_command = ' '.join(('ssh -i {0} -p {1}'.format(key, port), '-o StrictHostKeyChecking=no', '-o UserKnownHostsFile=/dev/null', '-o LogLevel=FATAL', '-o IdentitiesOnly=yes', '-o PasswordAuthentication=no')) # TODO vagrant 1.5+ provides `vagrant rsync` run_via_vagrant_ssh(v, ['cd ~ && test -d', d, '|| mkdir -p', d]) subprocess.call(['rsync', '-ax', '--delete', '-e', ssh_command, fullpath + '/', user + '@' + hostname + ':~/' + d + '/']) # this file changes every time but should not be cached run_via_vagrant_ssh(v, ['rm', '-f', '~/.gradle/caches/modules-2/modules-2.lock']) run_via_vagrant_ssh(v, ['rm', '-fr', '~/.gradle/caches/*/plugin-resolution/']) logging.info("Stopping build server VM") v.halt() logging.info("Packaging") boxfile = os.path.join(os.getcwd(), 'buildserver.box') if os.path.exists(boxfile): os.remove(boxfile) v.package(output=boxfile) logging.info("Adding box") vm.box_add('buildserver', boxfile, force=True) if 'buildserver' not in subprocess.check_output(['vagrant', 'box', 'list']).decode('utf-8'): logging.critical('could not add box \'%s\' as \'buildserver\', terminating', boxfile) sys.exit(1) # Boxes are stored in two places when using vagrant-libvirt: # # 1. `vagrant box add` -> ~/.vagrant.d/boxes/buildserver/0/libvirt/ # 2. `vagrant up` -> /var/lib/libvirt/images/buildserver_vagrant_box_image_0_box.img # # If the second box is not cleaned up, then `fdroid build` will # continue to use that one from the second location, thereby # ignoring the updated one at the first location. This process # keeps the second one around until the new box is ready in case # `fdroid build` is using it while this script is running. img = 'buildserver_vagrant_box_image_0_box.img' if os.path.exists(os.path.join('/var/lib/libvirt/images', img)): subprocess.call( ['virsh', '-c', 'qemu:///system', 'vol-delete', '--pool', 'default', '--vol', img] ) if not options.keep_box_file: logging.debug("""box added to vagrant, removing generated box file '%s'""", boxfile) os.remove(boxfile) # This was needed just to create the box, after that, it is unused. vm.destroy() if __name__ == '__main__': if not os.path.exists('makebuildserver') and not os.path.exists('buildserver'): logging.critical('This must be run as ./makebuildserver in fdroidserver.git!') sys.exit(1) if os.path.isfile('/usr/bin/systemd-detect-virt'): try: virt = subprocess.check_output('/usr/bin/systemd-detect-virt').strip().decode('utf-8') except subprocess.CalledProcessError: virt = 'none' if virt in ('qemu', 'kvm', 'bochs'): logging.info('Running in a VM guest, defaulting to QEMU/KVM via libvirt') config['vm_provider'] = 'libvirt' elif virt != 'none': logging.info('Running in an unsupported VM guest (%s)!', virt) logging.debug('detected virt: %s', virt) try: main() finally: if tail is not None: tail.stop() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/pyproject.toml0000644000175000017500000001223214620351225015716 0ustar00hanshans # We ignore the following PEP8 warnings # * E123: closing bracket does not match indentation of opening bracket's line # - Broken if multiple indentation levels start on a single line # * E203: whitespace before ':' # - E203 is not PEP 8 compliant and conflict with black # * E402: module level import not at top of file # - The tests use a little hack in order to cleanly import the # fdroidserver package locally like a regular package. pep8 doesn't # see that, so this makes pep8 skip E402 on the test files that need # that hack. # * E501: line too long (82 > 79 characters) # - Recommended for readability but not enforced # - Some lines are awkward to wrap around a char limit # * W503: line break before binary operator # - Quite pedantic [tool.autopep8] ignore = "E123,E203,E402,E501,W503" [tool.black] skip-string-normalization = true target-version = ["py38"] include = '(^fdroid|\.pyi?|\.TestCase)$' # These files will never be included in black runs. To run black on # one of thes files, remove it from this list. force-exclude = '''( \.direnv|\.eggs|\.git|\.hg|\.mypy_cache|\.nox|\.svn|\.tox|\.venv|venv|_build|buck-out|build|dist|__pypackages__ | docs/source/conf\.py | examples/fdroid_export_keystore_to_nitrokey\.py | examples/fdroid_exportkeystore\.py | examples/fdroid_fetchsrclibs\.py | examples/fdroid_nitrokeyimport\.py | fdroidserver/__init__\.py | fdroidserver/__main__\.py | fdroidserver/apksigcopier\.py | fdroidserver/looseversion\.py | fdroidserver/build\.py | fdroidserver/checkupdates\.py | fdroidserver/common\.py | fdroidserver/import_subcommand\.py | fdroidserver/index\.py | fdroidserver/metadata\.py | fdroidserver/nightly\.py | fdroidserver/publish\.py | fdroidserver/scanner\.py | fdroidserver/update\.py | fdroidserver/vmtools\.py | locale/pick-complete-translations\.py | tests/config\.py | tests/extra/manual-vmtools-test\.py | tests/gradle-release-checksums\.py | tests/openssl-version-check-test\.py | tests/valid-package-names/test\.py | tests/checkupdates\.TestCase | tests/common\.TestCase | tests/publish\.TestCase | tests/signatures\.TestCase | tests/update\.TestCase )$''' [tool.mypy] python_version = "3.9" files = "fdroidserver" # exclude vendored files exclude = "fdroidserver/(apksigcopier|looseversion).py" # this is de-facto the linter setting for this file warn_unused_configs = true # TODO: we should either upgrade the used packages to a version which includes type hints OR install/write stub packages for these libraries. # Further details here: https://mypy.readthedocs.io/en/stable/running_mypy.html#missing-type-hints-for-third-party-library ignore_missing_imports = true # ignore the [no-redef] errors, as they collide with the bandit "# nosec" exclusion (common.py) # unfortunately both tools expect their ignore flag as a comment in the same line # [misc] is ignored for the "incompatible import" # [arg-type] is ignored because when there are missing envs, everything will crash, not just the types disable_error_code = "no-redef, misc, arg-type" [tool.pylint.main] # Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the # number of processors available to use, and will cap the count on Windows to # avoid hangs. jobs = 4 # Minimum Python version to use for version dependent checks. Will default to the # version used to run pylint. py-version = "3.9" # Files or directories to be skipped. They should be base names, not paths. ignore = ["apksigcopier.py", "looseversion.py"] [tool.pylint.basic] # Good variable names which should always be accepted, separated by a comma. good-names = ["i", "j", "k", "ex", "Run", "f", "fp"] [tool.pylint."messages control"] # Only show warnings with the listed confidence levels. Leave empty to show all. # Valid levels: HIGH, CONTROL_FLOW, INFERENCE, INFERENCE_FAILURE, UNDEFINED. confidence = ["HIGH", "INFERENCE"] # Disable the message, report, category or checker with the given id(s). You can # either give multiple identifiers separated by comma (,) or put this option # multiple times (only on the command line, not in the configuration file where # it should appear only once). You can also use "--disable=all" to disable # everything first and then re-enable specific checks. For example, if you want # to run only the similarities checker, you can use "--disable=all # --enable=similarities". If you want to run only the classes checker, but have # no Warning level messages displayed, use "--disable=all --enable=classes # --disable=W". # TODO many of these could be fixed if someone wants to spend the time disable = [ "broad-exception-caught", "broad-exception-raised", "invalid-name", "missing-class-docstring", "missing-function-docstring", "missing-module-docstring", "no-else-continue", "no-else-raise", "no-else-return", "subprocess-run-check", "use-dict-literal", ] [tool.pylint.miscellaneous] # List of note tags to take in consideration, separated by a comma. notes = ["FIXME", "XXX", "TODO"] [tool.pylint.refactoring] # Maximum number of nested blocks for function / method body max-nested-blocks = 5 [tool.pylint.format] # Maximum number of characters on a single line. max-line-length = 88 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/setup.cfg0000644000175000017500000000140314620351546014627 0ustar00hanshans[metadata] license_file = LICENSE [aliases] release = versioncheck sdist [extract_messages] keywords = _ charset = UTF-8 sort_output = true no_location = true add-comments = true output_file = locale/fdroidserver.pot msgid-bugs-address = https://gitlab.com/fdroid/fdroidserver/issues [update_catalog] output_dir = locale input_file = locale/fdroidserver.pot [init_catalog] input_file = locale/fdroidserver.pot output_dir = locale [compile_catalog] domain = fdroidserver directory = locale [pycodestyle] ignore = E123,E203,E402,E501,W503 max-line-length = 88 [flake8] ignore = E123,E203,E402,E501,W503 max-line-length = 88 [pydocstyle] ignore = D100,D101,D102,D103,D104,D105,D106,D107,D203,D212,D213,D402,D413,D415,D416,D417 [egg_info] tag_build = tag_date = 0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/setup.py0000755000175000017500000001001414620351225014513 0ustar00hanshans#!/usr/bin/env python3 import re import subprocess import sys from setuptools import Command from setuptools import setup from setuptools.command.install import install class VersionCheckCommand(Command): """Make sure git tag and version match before uploading.""" user_options = [] def initialize_options(self): """Abstract method that is required to be overwritten.""" def finalize_options(self): """Abstract method that is required to be overwritten.""" def run(self): version = self.distribution.get_version() version_git = ( subprocess.check_output(['git', 'describe', '--tags', '--always']) .rstrip() .decode('utf-8') ) if version != version_git: print( 'ERROR: Release version mismatch! setup.py (%s) does not match git (%s)' % (version, version_git) ) sys.exit(1) print('Upload using: twine upload --sign dist/fdroidserver-%s.tar.gz' % version) class InstallWithCompile(install): def run(self): from babel.messages.frontend import compile_catalog compiler = compile_catalog(self.distribution) option_dict = self.distribution.get_option_dict('compile_catalog') compiler.domain = [option_dict['domain'][1]] compiler.directory = option_dict['directory'][1] compiler.run() super().run() def get_data_files(): data_files = [] with open('MANIFEST.in') as fp: data = fp.read() data_files.append( ('share/doc/fdroidserver/examples', re.findall(r'include (examples/.*)', data)) ) data_files.append( ('share/doc/fdroidserver/examples', ['buildserver/config.buildserver.yml']) ) for d in re.findall(r'include (locale/.*)/fdroidserver\.po', data): data_files.append(('share/' + d, [d + '/fdroidserver.mo'])) return data_files with open("README.md", "r") as fh: long_description = fh.read() setup( name='fdroidserver', version='2.3a1', description='F-Droid Server Tools', long_description=long_description, long_description_content_type='text/markdown', author='The F-Droid Project', author_email='team@f-droid.org', url='https://f-droid.org', license='AGPL-3.0', packages=['fdroidserver', 'fdroidserver.asynchronousfilereader'], entry_points={'console_scripts': ['fdroid=fdroidserver.__main__:main']}, data_files=get_data_files(), python_requires='>=3.9', cmdclass={ 'versioncheck': VersionCheckCommand, 'install': InstallWithCompile, }, setup_requires=[ 'babel', ], install_requires=[ 'appdirs', 'androguard >= 3.3.5', 'asn1crypto', 'clint', 'defusedxml', 'GitPython', 'oscrypto', 'paramiko', 'Pillow', 'apache-libcloud >= 0.14.1', 'python-vagrant', 'PyYAML', 'qrcode', 'ruamel.yaml >= 0.15, < 0.17.22', 'requests >= 2.5.2, != 2.11.0, != 2.12.2, != 2.18.0', 'sdkmanager >= 0.6.4', 'yamllint', ], # Some requires are only needed for very limited cases: # * biplist is only used for parsing Apple .ipa files # * pycountry is only for linting config/mirrors.yml extras_require={ 'optional': ['biplist', 'pycountry'], 'test': ['pyjks', 'html5print'], 'docs': [ 'sphinx', 'numpydoc', 'pydata_sphinx_theme', 'pydocstyle', ], }, classifiers=[ 'Development Status :: 4 - Beta', 'Intended Audience :: Developers', 'Intended Audience :: Information Technology', 'Intended Audience :: System Administrators', 'Intended Audience :: Telecommunications Industry', 'License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)', 'Operating System :: POSIX', 'Operating System :: MacOS :: MacOS X', 'Operating System :: Unix', 'Topic :: Utilities', ], ) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8923821 fdroidserver-2.3a1/tests/0000755000175000017500000000000014620351546014152 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/IsMD5Disabled.java0000644000175000017500000000135614620351225017325 0ustar00hanshans import java.security.Security; import java.util.Locale; public class IsMD5Disabled { public static void main(String[] args) throws Exception { String daString = Security.getProperty("jdk.jar.disabledAlgorithms"); String[] algorithms = daString.trim().split(","); boolean isMD5Disabled = true; for (String alg : algorithms) { if (alg.trim().toLowerCase(Locale.US).startsWith("md5")) { isMD5Disabled = false; } } if (isMD5Disabled) { System.out.println("MD5 in jdk.jar.disabledAlgorithms: " + daString); } else { System.out.println("MD5 allowed for JAR signatures: " + daString); System.exit(1); } } } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/Norway_bouvet_europe_2.obf.zip0000644000175000017500000002770314620351225022111 0ustar00hanshansPKaQNorway_bouvet_europe_2.obf} XG6|k7 @H 5L8I$DAQ{26YqW( n+ F#;U̝;}t8uSUN};&P}y66_W|4k|B& qT(gH0*5g$$\EyMqg&yɻ٪)A6oUqth/CfyS|L)vsPq>~>|gc~F7Ƕܤ?_@047fxM0ڸdm o9#U}FriҔoOTXbØ O l= XOnBzm=ZZ?d8hU1xh[f*Y _ V;3!(`斛:+μ4YD/Ɇf"3|'s#!%?+h;;+7ėQ^}gO?Ҷ:ʤʸzY[Wk~`ccc:l46Dww_}ϳ;K`([iT UC={a ? WD?W" \q D*H_81\a{z1ѕ(E# ^ E)P=X8ĪK("RzE).gb^#XxTx畢X|sXFx^+Kdz^6V)Jx^oTl"n">^/KQsJTWWK+zxae4]E> =*J6X/QsH.JGQ͊HjS$Uwv|Iźl2Zc.QGPO߈]#s)AGA_ GP*U>eAEP%h2\49/q#ˊh6_.()8SlsHUS̗)b嘧HRs.H#ɧDG2N%!K"|Oh%mqs6Sh5uStb5gcha:F}V(ZU|0Wn\^#q(LuS'1]7Ps2kL[5O}-5gQ|rM\dLR7I ݤ||V*Ie1y}A[ )s/k4]my䱢AX'sjNL[ [I>fns#1[ ji\E3С^rʮ{lt'k$lT%%NGFIC|Q#7iFviQʮ^a,ϑ6*lfFl|4"?D\|'"6fPELm8Μh}uyg^Ǚq_g8m&'՜^(P+fΠ縆lC5LtKu9ӳ)I? bqzùOnq|&>V|޶.lz(u%nح]GT^oD(CKt<7tlwLmdF{<5tK;#K$&=ri\-Zf nF m׎֣CGUWgWN m@gP"bF_׿*;?|G%o?3]4q' |톣(8f !$Skj'a"M& oGPb`7XGEKA`琀k}cR#΂)`"I\p_/c\xp8u@G<©k3'0ҥ 6wv޽ ]?=8}|;[dߍ7r|2?tXVwuy@^f3#1Ral8M \Fx=m`P32Pq t`VG`=܋V(` A6֠3@AFpmWj ~ `-] BN2;It ̧Q* -) -^'a&ŗ3D{@}>?MMPՁS4y9q`RX~LX{?T1-@M!}SK87&Dq۹Kl x8x394sg2*: ΃&Xp|m|B5LKp%pf2Fn#7>p 8 3`zWKp:īO4{C{'پ?Y~Cd_@vH\pH|;x P >C ^[1v~:h!0s%"GRNe"@*4&l=y{:jگ?yS&?Yk*22|-lA kpN췻E%;rKa;Z<trX~vsQlv"VMWY#Oa_c]&v/ɻ#O?? 24W[5Hi&fW}{?|6++%f5zJ. N".GK|5DQ.+A9\ g|SP9QlI)&ҡt(9I  ,~b݂[?.fkNpCt ;a7شL*قd̡՛ &VQjFvr.q fq2cQӽ+Bt>ɰBCM Jҹ|TBL)p4ʔ5l"-A <'zP-rogNz!Nsrq(MH`(Wt4y=sQ%l (t.[OZDfʹ"\jJ>*˩P.ej"K$TDz+er;EKP1tLJ$zLbUʨP&(d Q1<it4@52SS8%XOTiYF.tm(]B *0(փ^r߃;&Xp7مϬ5`!6ba,A9NtG-h]ӨbXG<l !p<| (݇L - KC% x}z?}v9AL 7̀L}I!JϹT2UtdPG8~QOqq̐YK?utS`p3=;+@oWnn<9 br@D'^{h8cwodJlōzDmR_3'tJe`9獰`%FC$0ڤ{>ZN+wR= r/V`h@a^&M 45%k> #3#fG]2S " ܿ@?}4mCo. <eLN{M,]r"sa ֠7GwbTA |{ F n9$Y".{!89i0D:Nu*qF;r& Ѥ*y|LUx ie!J w3W5dfj+gG 1j&m p8U->1gc8$IvQ'ZG}P tqFw %EXOUt* }Fa)9RT'4[gQk|@r=8 :HE=$CZSQo@,c)z$st_ X~<߆xFʚ͡''eF?b>4X[`#ICrg/75{_FfO6I{>`n8w <yD {aoL,-o܂\.NC=n$<?tQ1.3\QF,A pCYF﮼SlHe9Eyܘ`p*o0KiƭKëaQ;U5': ܤ21Y\T]i܆NܲD7rF[ z ='+groO&i&I)A34^>7/N "iBkBL {M?P (9!}4 _)د dgӅ|yjҴk|yl?h[ḱ9“]zO7o[|"OC~MfrK/F;דE'ƋIk"=L&>mhnECaOnє.8Qt;ϙLϳ "5?@3WӪ('Oo?r:43՗ڇ^}ڊd֔o\"SՓH>L~,h?nOPHf@__p9|ƺ zQig0鏾A&}( {NH@` $tyi| ԏgGy|@$Hf "hx޸ٹtYiPҁa--<>gt0,i_,34p V^!L73CZRs4 ^Zy2u ftݥdH4hp?&|7wY>!VFA'8AN@PWV" b& Gڥts#Np`̈́Qk8V{2fXm%33_osx̶>-vXEuKv:EuqD]W63 -YԅÚxisVҕIcJCIv_=A-A"#eⷰ~e~+{W:,mz>!Yۙc<_tVf3F㒬Ev3ƩCǺY%opͳʟG+\׸>O󸻙vGn7χ·%Cl7#;-8 &,#~8@&8 L|  fIKvU|afk /1<>Ap1k"&GZ0fhElg6_a_r;ȗkx- B& xȺ܇߈.qg5r&%/p,9A_ɯ,er:8 <Z*0I0*[`)kq Bs_B܀qAU|,Z"n^ADĚTe# &"[A牗Ίndx̋L?¯ߵͰLHS _I~؊_=΃ݸ=6?;z3r׾?*uu,| _ױO,M;_/ثT'8kx?x"*)t)sfZ2K)* Sm:w7ůϣss Wze1N.|.w[$ҿۮviA%uA L̫iڑWp3HƠ?3 mͻ1}[},6RqÔ_3a(%e ȥ^ RY+6v&ͅmTrVG`4 m}2&v[ XǠE ?|?s]·{5upk4qeR),m?>bu zڈμX](Ȫ #ɝwe;5Zѧnr}g1IK)T6gIX;ySb7Ϋq18I|͚fM_Y2kjߋDs5nɚ6u6OD+S2T`QD$?"Y<:>}I;go5y`[C7~:` I險M޻Jmܷny[ӕWIT͕s#c"]02H<) c8JV?噬ﳴ>˴'{,Ӧt]]uYomii\JMk?vHNteRfYYET7Mz1(Ixhć׃n]Ɋo~ !%!=v]5n7+談>X%K{"id.uHOׯCOkkkmNO D:^ "G%ss7qzHn"K`MCwF%V3my&,9a|,g s dmp Ot$u`'4sDE`я_o,p|4ûE-]9lG}: 1 :uluʄYfZ 2^Lx^G1F'x@Gme؞zx09WEej W2hV 2f3s3Cme⇴̖\R*?n]:]D]КW7@k{hT<E0_b ;]3hzQNc(+C;@ ]\@+ vݘXK-lk@'K >t6v(~Dqx,=dMAO7;22dB3[-x^ UȤMU=E-G(SgۀP.@L)$\+tlzԁdƜsڊ6K=` om%XL]x|4_Kڌ8 RETi50Jľd=E8)Nh'ݺ' -p҃empқp 8iNy 'o^^F #v.8`P&F'] !t%%,*9<`4L8h>gĖ,` PF]`]+@ވro}}t>rn\.;2= =0zpl?p*>)'=.=6»Dxy瀓Acn|p`ĭO6U=?Y3iAǧh r=gd~4yY.u/ʵ]/vꭟv Hx|!<U pw<@.cKڣv;nۥ|-M-`E.loQ~E(E:ɣ6U jWt:FK;7N˓\V-rݦJ >6tCC V;'Y:,-mf5kzRgd[@XB9N;TbڸJҎ"Mi\x\^Lw0':1?yĜ+[GD)͉1-1XEXEɦ˲9 \2ƤpuCh!.rxTDu}m-WF7w`4g**~)ΣO=.>%TfI) Yj2%%e6ɑC$'DGr)&b-`9,/O:WZ-hN1v$qL?_esbT~ u‹l)O3wk{+eŢS0I|RTjݔ\i"_a(OQ$N)xTH.H:Y%t 2RuM{PtOsf̷vj˷z1FJהo3kuFuٔ yXgTELzO%Ψn3`ΨיLLc[8|~+~f yʀ2B?T7/66Wdw7g`Yӣ1X0n'Y}'rͿ~g\eiqU+W+[[ZO]zfI4|TV\7, - >A/B,f:R`xW؉򆟋'gB&J#X7ceMY[x-3? OM |h4'[LE$˾I3\M%Wə&e Aþ RQwEACD@ĕd*[Y@x bD A< -/W!X¾$r bg"+wO'3Tx:9f@ #1, bG"!*8L(#PL)Ub"J s`K ](0+X(^P{L(VL(6۩2,j]3mlT[U+M**5= DApAq(7ʉyd Duܠr 6UA4w-ʠ:ӺfKu|H' wEM8ʏ^huި2,3.ʹiZr^*ّvTW[U+`;nIiLjv,7ˤѺê}wv>V;۶x+QvNJe5ʒn e8T"-i REsV@fnҶֺP7Pgn]R6%lD"b~iW| 24]Limf Vq%t$ -y%'ScV*mZѺ+iZwm/mm?vv`U6j*9mj0ִM2YWаzZ :ErF[U7Mj?w[OHxlIvHb[K{F pS(C2N o;..OݦXM;r̀W>jWvi.Lv軴S}ԥtMs'mL\a_nӼMښ;ZbW:p@~e;%& F nVcafW:&3|nۯUNi];M&6z!2=Ʒ!LB٭bݤEye +tl]`NW tg]UdAbe2r*%>CLP0,4pR@>t t/br:kdOgGÅpcdQ…v˽CuᇺvƏ Q\&;oZd@Y@E%1Ʒh*׹ŧ}RطΈ0tuؼԳ~uZz2hBuA}I6$J)@8խ$m,adKб p:E:'/=JYWpJ7 @ů,?3Ȭc>Aozg5Mሼ-ϒUC ]o5t_'ÿ~KͅsMII^'BbD~+ V|ڳL1]+OeL_5D?5hB[5,M[I،dU o.Pdqu ֵB5%C&.h?͏Kb0-ZgZɶژü{ ݫi%K#N1EHRbp0{݋dG!i~4w"ej65I3M@^}e$;H%m %̴_i/ s&YGߒ۾0F#_^>:"C|,0%C& tZERґ2i|M{`"rajRV:+MOJgh^nѐt=tė #0* {mt^: NL}A'utZ|g<|2<ӛqH &[C%r PK*;.C.4xPKaQ*;.C.4xANorway_bouvet_europe_2.obfMap, Roads, POI, Transport, Address data for Norway bouvet europePK$/././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/SANAPPSI.RSA0000644000175000017500000000773414620351225015744 0ustar00hanshans0 *H 01 0 +0  *H 00j 0  *H 0c10U SanDisk Corporation10U SanDisk Mobile Signing1"0 USanDisk Mobile Signing CA0 110921092417Z 360921092417Z0t10U SanDisk Corporation10U SanDisk AndroidApp1705U.SanDisk AndroidApp PROD Signer 001 Certificate00  *H 0̧&_n氢7H bXﷃw7ZЅ|hw}j/)EWSTm%.c9P?$K!L P#=9~-׭Q @(00 U0Um‘FG}(џ7M-80LgɄGy C3~>}-TPu:d)bA7o'+з(s9"ii7\qgl{관V!P:[JcP%'4MM#pCfiB~rcb]0ԅ)$$)<צ^M!^gf\cFW- U߼}RewJtc}.&PxljTdS" it-LiXIwؕTZBsUq[ 9_'c{elb3 2Ma b|ծ[ehd{pBVBDŽx]`+ G}P:$_Ʒs~kz]KJIQumYWG 8y"xϖV/3ij?YXRDt6:Gڥfb/v:3zK0Y00 ޮE<E0  *H  0Y10U  SanDisk MNO1#0!U SanDisk MNO Trust Platform10USanDisk MNO Root CA0 100907064954Z 300906064954Z0Y10U  SanDisk MNO1#0!U SanDisk MNO Trust Platform10USanDisk MNO Root CA0"0  *H 0 s^vRg9Ƚy\vBՌCT=@-? x87vf藦"#Զ.ڔu MͶK%ci#@yܜ\\^mϚ DnH"h54>#&k#IQux 䇹O pR<0϶l0ðEBY! tFрf ɁHAüLf }1.^֐;Ls n3. C]E;Ycvb⪞)ǤBڿ=fuioLCRN:6;y6K0h.6+<Y\z8y'3ݻ6J洪ȄAWd GhZώa7ѧM_t~b/ڟ ?9 <qͻ6wpmF/\!tPڗ)&̣1(֡5c1)l`~L$Ls޻"2w00Ugy8^v r^E0U#0gy8^v r^E][0Y10U  SanDisk MNO1#0!U SanDisk MNO Trust Platform10USanDisk MNO Root CA ޮE<E0 U00 U0  *H  h#mrTځ̠s0 O4U6g͚^,] ${M^>ߪ`eRBKM!W2 i:]0i[ٳGb,?e/IwƬ.p﯒2fsd3X&v[:u Ö5%5`VA/߄ PKdz(PKexKQ *)META-INF/buildserverid 8`tOy;8[t82PKQ *)PKexKZF[))META-INF/fdroidserverid Hu`³Fnsg$:0[~PKZF[))PKexK(QncAndroidManifest.xmlSnAn v51AHـE +P0R[0cK$.!B>#|xCĎ]3]3!<- qωow(`x@;L|%%>_1y.zhbmTCft:Oh~AE/G.#xXaLuQj}-5.? mfc;T7h1:Ot br3ؤRcrutlID1An_U{ZqIkI6Mz6HNU5洉-Zl^NJ1ӒuT26F1OP: Iwm>3onw{Sg-'cWHnt4;UtS??PUq]w xÀ  J)/ObWͅ&9O9-pG䡜<$왺qV/w +9z88f{['7͘_lne[pj3Zy==kgqVoyG/gT /d0w˗0|oUPK(QncPKexKG*B_res/layout/main.xmlNBAz @cie t>&+%B@EioK>&&p/r7'3sf U $ =iY9`1 x/ | jIHuІ]K]hLג}}>עs삫0ꮉGTK)lS7*' z^ci׮*ܡkTUNԗUx^WU.u2؏t5?ݑ.=MM워}cV&ۉ:mbo"~Bom?oP#mRHIj6Z UU_J+>TM+EJT U}}HZCTk7ަؿ{=;q\;e-?@h?+=Wb/4hyQԳG@Ҿ5"| 2c=D[]' BzlZ! `Up 7kMuq-p N9!7u ΃/o_@8L0& Hd%_Wx@ha0&X_]Oacj:C`/x SH QaH.}E*& 6 @;=[6A'RCa<A?8Br<)=c~EN@W\wDU?>tq.tAOB?s~9]5j Ō<C@q!M*Y%jRsBd*Rҕ+٠d=J{c5֕*Sүd@hXH/ YKSBдutZ! !tV5E|O!H4&dN@6I9s"<9 ٪ڷa#b~2oZ>hJR}D^39$hp4߀] zPyM )?1KÿU ~*FOL|Jw_=ױt5+>Zc̋ârXO<"^roTIKTyZNz%J6+ɿ/!BD M"]Ț~Lz͈ eo?zyFQv[YеViա^h 0.zZ d݋0v߂{M% _T96ߐpXkUTZ*Tue!HC3X>l "t^?<ؐZ]vm"Z7AgאmơA;N}\_3\=]7ZѝSL.4ل;b;{Cv&5s|Es$p|pjj'NMM'NOO$;:}(yGbbcNc N8`|nf0168Gnr`>ߛ5meÐu Vkik_\-E`;xUF-mYn!*T89t"U,mG~i0oyx`ҵlwW;*~Er:9c"1"6Ierm=;ZW) wZv323K39LΘ"_nj9o?ne/ !-qә^0 S֥EIbeLtLckeƉ 6Rb{l<*!wz%aE7I wˮOe$c8FM`bz,A<|&}zv2FY)l838yg'GPXZZ3F3|H9Zu}+}(q)ϬҹBt)Pk+UXyx,F3yɃ'?|@:?̤ @#:ٹE@.XPKuti` %;eFy![-HSCΙ¦-K <{n?&V$h.Y1n̢Sӂ QrA!2H^ȑ.j`Ak33RٓEBL-=;:^yEr<20M[YǑ7nޤ,أ.h+3gElch,Ҁߗ^ Z䤇δypG0%5iz桒2VRN&fm[-o:nmyCBAC-j0_&J,׿XQ~zE͊PK PKjd{K;META-INF/MANIFEST.MFPKjd{K΄h}META-INF/E63748F8.SFPKjd{Kdz(CMETA-INF/E63748F8.RSAPKexKQ *)META-INF/buildserveridPKexKZF[))META-INF/fdroidserveridPKexK(QncAndroidManifest.xmlPKexKG*B_Y res/layout/main.xmlPK !92 resources.arscPKexK  classes.dexPK K"././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/aosp_testkey_debug.keystore0000644000175000017500000000477514620351225021630 0ustar00hanshansandroiddebugkeyz8!M00 +*龨]ڽxQ}K2ЊۑHo+QDۖpQB2<}:f|*5^dZG Ιz2%CmњPBxײJ%k'xKQ8ӟ6^&VZ(J4~aE89RY^E\J<Oal;^4p aPtҝ/4E̎C[Er7^`9Ǯ^9}-H?bMrdIIڸPaԒuCy{߬(Zki{eey6 n^҆ns~ݜkc%9e6O$|3t6Ɠ- A393F1iZ(W`|o`OyRn`XFÿ(ײ)a(Pdn:|BI\$f 0=TxV~Onzx>4a 8LauU':P  Kܢw#bDIRMfR]Zrmg{LL-e߳zo{ief2 |ݰ]1/&]A8wv7BefN` R;ǰ|<(зӇoeǒ \_J$?1Q }lvDRљcU(+ Y=F?Xf[v˶ed+\s$5*żh{?ք=烌ń\$pjwb56O%->w'85,sC孼!sHhoJҊ5X^5{3BX.50900 n0  *H 01 0 UUS10U California10U Mountain View10U Android10U Android10UAndroid1"0  *H  android@android.com0 080229013346Z 350717013346Z01 0 UUS10U California10U Mountain View10U Android10U Android10UAndroid1"0  *H  android@android.com0 0  *H  0֓ $b%>>l輨kxn l5Y>wC=KdVg0xCLrF!8N¾8Ϗ0ЧJP" P2j3Y榔,򄠤fz;1 :g7./dnmBX Dlø$XH%dOޘ(wHgjT TȻGU3ko̎iȢЎx& ?r}<rߛ8[j00UHYV=',Ft ʌ0U#0HYV=',Ft ʌ01 0 UUS10U California10U Mountain View10U Android10U Android10UAndroid1"0  *H  android@android.com n0 U00  *H zPAQګ[vZ'´O" Z-rl inݮ)E,K~~, NSU$V"@-uZB`S]41$"F6,*^0j/b-'`;,T |6BqRx^#~D10yU#BZ@7@"Za{IO Lԙ8jߑHNm}/I y |7 @m:֥.ks kS1ܥFd[;0#Pnm,fRN{4et{ί !9<ި33(y>Zbct=QZ1?NP&dz+?={HdnU~ʯuKmjzM=t}۬(yE&˶l֖"ߐ>c6w铫j=);7%ڠbd-eU|-ۚus.o?Ga+= n.?f|jؕpZ𻓫cr~g-Ga&\Vc+׳Vr5MAYb\G'PKʔgPKmZT+org.bitbucket.tickytacky.mirrormirror_1.apkYuTU۷t DRݝF$)[{W}73Ysͽ7s@EETއ\ +"$%',+$'%.Cq[x}I Dey,t"uMvl2''3? A_`'Qӝ*፥S]8lz@w;VEli%J =nmqSly8]IGHQѠi]yK'޷Yai;kIզ! rbNlQM*Uw.~4"\ɣNfUbS-xp-eAK5E"p[Sh`xĈc$7HGd#Io6 `ԟTcA#7X88Y@6÷ -5w G9=GvL^|mH~qg7}B\7vʬNܗO m4Jӥb'/c2ҍ\3L'K_2\2{Ms fCVXSTӑ^\"{߿U\MxOĺ@َ:Zb}Й{mN^a!Ӂ ABhvӰ{ZD *dP̲='!PW8Gg\1,Ȑ9Gwocs$~Q_"!c,jan2r`ejLGD |pנBwmj.x'b~y~Wf{ix&,7ZA2lC*{uJ!LJX}ftU[[&UIF@[G75铝[tΌ`gK7h478L/mG%4z`E^Oնs$oޝ[>_k_&ІM ji^:bFvW8Aw:͐f/<#Ж;o0"6d=c6R>BͩpbY+ZZc,3g|+}vJϲYb^yĄlNk$DImJ́ v 6<|n:NfΆd({OٺeןƓ.婖}޷좞=y4FQe!M;vdٍFnUK~zh[aVg"5-/KEy>N +s8ܲ>X w]H\txV KˊVR1ΓsTUTn6){VHv4l:)ƙȜ av{7^;t}z<|\np.]z\wv^ ZfdRa9;ܖ?edžh] XI%|7u`6t892Zڂ\m1 B$$,f\Ks1юӊ2zPfgZѓY\-IEb# V0g}ʭ[F~k !&MDe 2Xgꬮy NqzY UFHm#kP<n}f6wyT ߲ )f/\bj00`wrόk xvٚC,Md m-Lo i|li M|RҨpIԶ >gM䷶, Vz(-EH Čİl .T\{: o*ҏIY_߫ke8GE(iY:'nD>FsI]1p 9Kp>/[ZRcQ_-GPDsSaSq{8qdh1 n"F _|uӪWK ϮfsS֙B'սYnn-󝹏U$칄sm(^x>up(hӛ䥜YwrTa16E19,l$+R{a3Iz˫TsbDFaE,Ҽ7ڕ݀˸jK5aJrJJ8~Bl̩u)nssYGSmS%G.52I|s/L)F)*o1DQ쎶ȦHZ y4[4S1UK-51OފRH,o6EbA<[2R6[V8SH#`/RN*L.A#?+>Hf *l-@: l:%%)k-oQK HvvݛxoґZ+D==E,YRbr~ qLh`=MQֆ`bʚL{tkBcsKnY0~\3I4ue펫|0A*6DUps)Iq%crls/ESq0_**|1> 9^@Abǜ-JEYmU6{y|RHEWd/*@Nxb`|ÂFPR!|Wfj/cSUץ wUUNF4ʫLHMQ;F3orm=JD۬%ЄztV}z}(rrM/ceLO*pƽpȢ0u>( wUy/3GM2[n#hFgrxw]3 =`e7K(NfoSbԘt. Vaq XLssTNlqF:o,ߋêw l^[!yX)ylØi=1{'XA4@635JfR =άNwͭ!{59ZZ[%7ONj:nBSזF24UKC˪켦qG>x0lswc 8"K„ʹsk-+I{x ߚ'ɐK kp=;#qOdo OӐ5W-UM۔gedCPnP+GXaǧ d_)Dr`AXz]C&0۱Z`7p|VBrvjң_Ƃ{GKwYt\f;j$-!:U mic|m9 ׁwXh/;>P7ZGo#eNF[i{<8S9V #sL s}m+r>!` ]yOS h5/z6tW{ӕ(H+ gxd9&\f5ġޢϋ䉍95ǂyA Vnwjّ$Fy omm_! iU ™7- oCHEbGn}GDhܒnIt:|DHõRS@!iVk`X+_lbq$|4(˦}ڗVef,g969ѿ U-.w {SK؊V6D~uNes$1H$~@k`fK(78<A`9᭺ '>3vH;)U0VbFw#63K"?NE"rMI*v=Gg\FAL긑&vh ~J WH yEM'~o(H}lxM1|J%z.Pxm?`u=:3^;27< ͌!7H{WP `8x?*;0?r3ğF_~)@-:o[ٟmc_W?>H /g0_TPK7[cPKmZT5/META-INF/52ED4B12.SF]n@$6t-x!qEBP` 0qO_bmj9999E`(EnHME!E .ׅd -p, lN9Ճ!%͌L/dp/닂n<0pRREzQp` vT_!a0loGyUtښ8<2?7su;e|'JyTq\8C0ɏ?Ƀu'naK53ߡ3yM"VT4?:ڞUʑٻPooPKmZTqMETA-INF/52ED4B12.RSA3hbejhδ%Π%ѐۀUIqAS&M'03121e W Ԣh(`-Rb 4(,R_h 'kdd`bdahhdhj%kbi`ih cDŌ M @q.&FFG?x/[}/~t=Gٝ>{4 MԬ&wIy4ͤ[.%?4/ଔBウZΰJ{{i._>i N<,}RO9ԬeE\ΗrLwVLszAo趓~ )%nf6ⷷ&?V1X܈ۺi eS{g'K5o˵ϧ0 (b9JE#ׯ,鸺t73#bEyY`򱈱* δe[Ƚ\-Aa7b[sEzڙeSm.W}gٚm+ޥڌdsݸ&֌;aՇ͂UTSܜYz/3H=]qiOvjk7kғzcv؉kR\b͓˸[{jvv*g*9'=).9mF[qZ)ǭ_7C^K*/)Xu\vA;7Z.5ucO|p,NCdz _'p6ھ1W :Vze*s!b,Rw dld.tt1}N.Ya~<|\R O[^7?#TOwsޅgm|X O$l^L_GMG*mf,IS>նݻ1 )DrÅ]/pYM)őPKmZT[ODMETA-INF/MANIFEST.MF]Ao0; ;)31^Z:-E~d[2='_"RMR"$̷\05 ӈPE|k2i]],ɚC[$#|yY\ a]|wp$dDo 'QyK1>Yy7{.rp((.ztEN ؋ ~ "y+!xOn7gq_;Ysy֧ { qso1,( {`kUJoֽƵ1)rp00ɠ_S0  *H  0!10U F-Droid1 0 Usova0 220428112157Z 490913112157Z0!10U F-Droid1 0 Usova0"0  *H 0 \P$?A,ϻkB5Pf6|mb'n)6cS6sEXpOoߙU:ԇ]aԾvd'%pWf l2|+7 m ܪf@.7[N5pj"aˁKYKz0V*'S(X- ?B0Kkc3.DddW'xpD6CZC׮ tդu!00U]#TOQgڱոm}0  *H  8r.+ivue>$ۙ"2Awo`βm>eC\Fǫ2 i@ /xZ@kJ-#p(7HA9빳~e]6;v^t 27o3sct8   j{u1q/MsR-HQ-*[!_ ptaǭF5x*0Dy ï_>v97JVbڦ=O>+[iLqV ɬPwa Q4_WxV kKPFA q۰g '#ril~?}ElhIr$HUv] x_6* /&0"0  *H 0 \P$?A,ϻkB5Pf6|mb'n)6cS6sEXpOoߙU:ԇ]aԾvd'%pWf l2|+7 m ܪf@.7[N5pj"aˁKYKz0V*'S(X- ?B0Kkc3.DddW'xpD6CZC׮ tդu{hSso),( {`kUJoֽƵ1)rp00ɠ_S0  *H  0!10U F-Droid1 0 Usova0 220428112157Z 490913112157Z0!10U F-Droid1 0 Usova0"0  *H 0 \P$?A,ϻkB5Pf6|mb'n)6cS6sEXpOoߙU:ԇ]aԾvd'%pWf l2|+7 m ܪf@.7[N5pj"aˁKYKz0V*'S(X- ?B0Kkc3.DddW'xpD6CZC׮ tդu!00U]#TOQgڱոm}0  *H  8r.+ivue>$ۙ"2Awo`βm>eC\Fǫ2 i@ /xZ@kJ-#p(7HA9빳~e]6;v^t 27o3sct8 PIS@SrŲ1LjRjHN{ n,IDƔH (~B١MJ6Q- 1I6ݴ=04 BjHd&H@Ik" <+LS<~͔:4+V'rKfBr/ 3H1kL@=Hm Y?Q*u B7,lJYW5 eϨNR6y6`ҸC&0"0  *H 0 \P$?A,ϻkB5Pf6|mb'n)6cS6sEXpOoߙU:ԇ]aԾvd'%pWf l2|+7 m ܪf@.7[N5pj"aˁKYKz0V*'S(X- ?B0Kkc3.DddW'xpD6CZC׮ tդuwerBAPK Sig Block 42PKmZT|o classes.dexPK mZT3TTresources.arscPKmZTʔgeAndroidManifest.xmlPKmZT7[c+zorg.bitbucket.tickytacky.mirrormirror_1.apkPKmZT5/zMETA-INF/52ED4B12.SFPKmZTq META-INF/52ED4B12.RSAPKmZT[OD!%META-INF/MANIFEST.MFPK@././@PaxHeader0000000000000000000000000000017300000000000010216 xustar00101 path=fdroidserver-2.3a1/tests/bad-unicode-πÇÇ现代通用字-български-عربي1.apk 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/bad-unicode-????????-?????????-????1.apk0000644000175000017500000002631714620351225021767 0ustar00hanshansPKAHDy+AndroidManifest.xmlKo[UNbHqrc'~\ǏѴ@*iEҰp:džU5kKuP5 ?ss=gwf{sDũ&*Sv#; t Qաcg/T݀ЗЏ?D( }5o("jA'/Sw(2D ݅c 4!\R5ۂ[*^cȱ Ft^Ѡ7)kwUWA}M>TOsI֐j+?DS>g t[ZgglgTC̾t%v.9RV*{݃&}9ޣ RUDa))k*S 5VUs h:xlU#%J K#!);΁k >K^bgv]vOyW]ki׶yx,3¥C_>ۈڢ눋C(#t*AGnci\G &]U>uӸ;6-vb߆T|F0їsf̌qazN4#f|Gs}G$߈& 'Lq9Cr BI(-CYbs~=z75;*C7$}d9Dbs?(xAՉk΋-b57!yTgǤhylJ,^cu7uSFP[cCo;n ([c0Ѝ?"܏zcTcϺ󉋏K¾njx57'9gy IMm^r֜6탷 7m|b^GKh<3;r- oIl|$Ŗ֘7X}>7)%oi-uߺoYx/i-w*"gy<^XxxE5^+Wxe˳sxFz+;gxwooa^PKDy+PK AH=-res/drawable/ic_launcher.pngPNG  IHDRw=LIDATHǥyPuƟ{².˲ 8ႈ 628yr OCM5V^ʡbY"0,,{DPXϟ>ߋ4zљp a22x@-q &6'xnب4Ռs-<!a^zD\W6=YMQ2ɗw|՟-f̶vJA؜s1Ym®n>/]ҹr8୔@(r1.}j:Oi> DowJ'CRRVJ eMPy|{|7sRNQy(KNnቹM{p՝Ғ6Q:h++-LxȄsՆIT~M≹\{V{TTX@vL (Ćyq]zAnBFZmHocs  Çd6ihh CCfQ!j2OPSեlUY G?15t"GUˢy*(M6\$""DJiujdo5GcF^G"@ Vx\|T$SgOt ::erOK\]Ϟb¶hӫnZ>5^7 S~6B3Щb#RجJ[ =64%1N ('5+٥bvTD%W< `y*VnJK6͵[h8l3PA$M;QZ1[,U3|.nlIuG2 3 eb2V'0`ę&Uڂg ,.!蒎Q1 F|UJvuӆaL06 cLzN׎zXYٹLGBr8#0LmMOS7onDVv͞} DLژ.C{e 󳵴&cY,ZKSiZ=I`҇6%]Nm},ŅU5SN܈mݷ<65}E޷'0CקԄf.̙3;EnK=_d*/r.Ѵ#>)?/Ԟ H\o7aU%(|${hjǜIL~ cS/LҘPPX"1sgsLuP!!"@&849^1|'3}ȕs_-]$IVM1,,D-aEDA̤rIENDB`PKAHS Lres/layout/activity_main.xmluN@=[$BHA"5%$ 'Ql*x$ G;es;wofw} ƘMCt- G«& 99w%fmF)B[nTχUПg!F$~"u.m*~RUx:R}o{EO١R3~`)6d?Tޟ#]{ȣ>64u6Z?p̑?gqդ~,ᛙPKS LPK AHresources.arsc (0<xres/drawable/ic_launcher.pngres/layout/activity_main.xml&urzip-sNIl(uW[-1J;30@A:8-91(J1234Settings Hello world! info.guardianproject.urzip l, 0attrdrawablelayoutstring08Ln ic_launcher activity_mainapp_nameaction_settings hello_worldH\L4H\L4HT4 PKAHl/cH classes.dex l[uw//)R$u%YCuEKÎءؖe[$JM]җ,AdnlA IF!q [[lٖaڵCVt]6 {tV[tE =H]+[ ?=,8K۷Ro}>yDc]/Vh6RKDHڇAH'Z efS81GWYQ3&ʁ*8.'wOh%j :9$x;S)(x|ִ_?yp |:{ ypg_Ou$`l[$8 yp | *x5[=pSh d@]`Lx< /??p( @.U 9023CnpS`Ti[7߀8(&ʂ.N 5m` u`=6!OF(6] vN$~|E_b*ГJ:i*u]|Ry;Ji*O O^eoSuU!S<*ƽN\ֻO(/`з}o@PNϺ>%U~ʔ^9-*檗EstTGRLjX*y !b!!WżtFi|1FBjdtMDdDCFhA'>+J|}r-JJ*٦$JhZ2d BfBv)igW?,d2Ag, N䧕|N(߉CBaO){ qm=Mc:B&F)eqvD՘~T=|_2I)ּlU2Aϊ}8kdĹ#Dgl"ܣa%%eB! _ӻ%Ϗ`ݼn/U&m0 K]rh]ҷ q%ώyHϟ;!sV?m|{"SK@@}KuXt93< ߀MF쪨 mK!bvn/+ /$|T)j8~v~{1<&Qde”4-n޷WD|\щ{UQnΜB2Xek=nvG6 :+5+a6۵wF3`;ɀ&R>⡡ό^-jc͑ۅ^ BۃҞ9wd,-|s'ޣPyn c9ebbx?%0-j-W0`|J5}ZOF o'ge)i)3H]{j-֬."1=b"?B]r{fLL2T͆=&|xK> k=EQ10n6VM.ֻuڴҙ65c+VHY~pELFGVc]O"N\U JnTr@Jz.ae"Rv|w z?b}@h ZU lUKib#İw[Ůؙ'sO-JiwnhSY^j]u[ כIcS|[t,g۳"ixrEl $$1&69MWKna.Gv[t>[W"O TG;%qPTJ͘TEe۷VTj*UE~$V7&cXcXɃ\@xڌr!RS$w5bB]L OfE(.83M"p)\+x[$c.0B`v 4 6Q Q$ɿ0HD:e:Sgei]ܱ۟f΃:]X\aXX۵Fހ #4ĸ>^Ft$Kq+vfszYEnyNgK'YzR6ԵG٦~ C;HS,qHa=;iݸֱ' c ,=1ƽaCukV.mHruxouag6I;(C1 S M>CPDuηdӄ8y BBp=Zw7:L'% "c"2RQ <ڟ Gr$Z `% h(`$z27PF(D7%L?BB?9`{O{SA8 O'< -5j_9Axw6G8,8 b @0hvS'^w1m6]:e5DKOܹԎ< <{&B;Leoέj,9x";$s$>檊^=֛V_s\Ξ+磨vWb,"9 0#|l~⥝݃eͿyg4`HpA__)uV0icၬ7]ئ1_ >cv)i*c2>ұ,ChJi 7a _^kmv$*eǒzNPIc*1 clpIV@Iq0&s8mFJg]:Ψ^[F,t$M -~0ٕQ^hk5qHLw1[~q1{}=t1w' C+EjUʯ,wG7Z!6g[1K;co;pm(['}Ȟ}*nY=2p)[Y7"kdc .!.LiL 0 BouL#X#|1⚍,>0@TvVʪ ;(lZZ#ӺW7l+>c o"<VzezJ(qeo9/ ")oxlxv ~7FF>[_CR g5(&hL:g3igit@ڦ ݴ鞶QI۰ujaL8)gNTd3VhGkmrqA|۾tPc!\J*L1W_cǥ`ޑ! _JJ?ubC# ϝ;.NN&FP4~R! s>#g07e?amʺb}.Za"V1Mwgۥɤ_>uKZaOnMAgI5x\Ķ_(˖Ïeuwnd^:v(Tzg˨ <'Ee;t)]#gw5/]5|iFg~[dS7PK^ uPKAHDy+AndroidManifest.xmlPK AH=-res/drawable/ic_launcher.pngPKAHS L res/layout/activity_main.xmlPK AH resources.arscPKAHl/cH Pclasses.dexPKAH/%t/ META-INF/MANIFEST.MFPKAHr5!META-INF/CERT.SFPKAH^ u"META-INF/CERT.RSAPK *././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8923821 fdroidserver-2.3a1/tests/build-tools/0000755000175000017500000000000014620351546016407 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8923821 fdroidserver-2.3a1/tests/build-tools/17.0.0/0000755000175000017500000000000014620351546017132 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/17.0.0/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001411514620351225025166 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission:'android.permission.ACCESS_NETWORK_STATE' uses-permission:'android.permission.CALL_PHONE' uses-permission:'android.permission.READ_CONTACTS' uses-permission:'android.permission.READ_SMS' uses-permission:'android.permission.READ_PHONE_STATE' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' uses-permission:'android.permission.RECEIVE_MMS' uses-permission:'android.permission.RECEIVE_SMS' uses-permission:'android.permission.SEND_SMS' uses-permission:'android.permission.WAKE_LOCK' uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE' uses-permission:'android.permission.WRITE_SMS' uses-permission:'com.android.vending.BILLING' uses-permission:'android.permission.INTERNET' uses-permission:'com.sec.android.provider.badge.permission.READ' uses-permission:'com.sec.android.provider.badge.permission.WRITE' uses-permission:'com.htc.launcher.permission.READ_SETTINGS' uses-permission:'com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission:'com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission:'com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission:'com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission:'com.majeur.launcher.permission.UPDATE_BADGE' uses-permission:'com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission:'com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission:'com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission:'android.permission.READ_APP_BADGE' uses-permission:'com.oppo.launcher.permission.READ_SETTINGS' uses-permission:'com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission:'me.everything.badger.permission.BADGE_COUNT_READ' uses-permission:'me.everything.badger.permission.BADGE_COUNT_WRITE' application-label:'QKSMS' application-label-da:'QKSMS' application-label-fa:'QKSMS' application-label-ja:'QKSMS' application-label-de:'QKSMS' application-label-ne:'QKSMS' application-label-th:'QKSMS' application-label-zh:'QKSMS' application-label-fi:'QKSMS' application-label-hi:'QKSMS' application-label-vi:'QKSMS' application-label-sk:'QKSMS' application-label-uk:'QKSMS' application-label-nl:'QKSMS' application-label-pl:'QKSMS' application-label-tl:'QKSMS' application-label-bn:'QKSMS' application-label-in:'QKSMS' application-label-ko:'QKSMS' application-label-no:'QKSMS' application-label-ro:'QKSMS' application-label-ar:'QKSMS' application-label-fr:'QKSMS' application-label-hr:'QKSMS' application-label-sr:'QKSMS' application-label-tr:'QKSMS' application-label-ur:'QKSMS' application-label-cs:'QKSMS' application-label-es:'QKSMS' application-label-it:'QKSMS' application-label-lt:'QKSMS' application-label-pt:'QKSMS' application-label-hu:'QKSMS' application-label-ru:'QKSMS' application-label-sv:'QKSMS' application-label-iw:'QKSMS' application-label-zh_CN:'QKSMS' application-label-pt_BR:'QKSMS' application-label-ca:'QKSMS' application-label-ka:'QKSMS' application-label-pa:'QKSMS' application-label-ta:'QKSMS' application-label-nb:'QKSMS' application-label-be:'QKSMS' application-label-te:'QKSMS' application-label-af:'QKSMS' application-label-bg:'QKSMS' application-label-si:'QKSMS' application-label-kk:'QKSMS' application-label-mk:'QKSMS' application-label-el:'QKSMS' application-label-gl:'QKSMS' application-label-ml:'QKSMS' application-label-sl:'QKSMS' application-label-am:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-mn:'QKSMS' application-label-lo:'QKSMS' application-label-sq:'QKSMS' application-label-mr:'QKSMS' application-label-or:'QKSMS' application-label-as:'QKSMS' application-label-bs:'QKSMS' application-label-is:'QKSMS' application-label-ms:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-gu:'QKSMS' application-label-zu:'QKSMS' application-label-lv:'QKSMS' application-label-sw:'QKSMS' application-label-hy:'QKSMS' application-label-ky:'QKSMS' application-label-my:'QKSMS' application-label-az:'QKSMS' application-label-uz:'QKSMS' application-label-en_CA:'QKSMS' application-label-fr_CA:'QKSMS' application-label-en_GB:'QKSMS' application-label-en_XC:'QKSMS' application-label-zh_HK:'QKSMS' application-label-en_IN:'QKSMS' application-label-es_US:'QKSMS' application-label-pt_PT:'QKSMS' application-label-en_AU:'QKSMS' application-label-zh_TW:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission:'android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.telephony' uses-implied-feature:'android.hardware.telephony','requested a telephony-related permission or feature' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main app-widget other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'da' 'fa' 'ja' 'de' 'ne' 'th' 'zh' 'fi' 'hi' 'vi' 'sk' 'uk' 'nl' 'pl' 'tl' 'bn' 'in' 'ko' 'no' 'ro' 'ar' 'fr' 'hr' 'sr' 'tr' 'ur' 'cs' 'es' 'it' 'lt' 'pt' 'hu' 'ru' 'sv' 'iw' 'zh_CN' 'pt_BR' 'ca' 'ka' 'pa' 'ta' 'nb' 'be' 'te' 'af' 'bg' 'si' 'kk' 'mk' 'el' 'gl' 'ml' 'sl' 'am' 'km' 'kn' 'mn' 'lo' 'sq' 'mr' 'or' 'as' 'bs' 'is' 'ms' 'et' 'eu' 'gu' 'zu' 'lv' 'sw' 'hy' 'ky' 'my' 'az' 'uz' 'en_CA' 'fr_CA' 'en_GB' 'en_XC' 'zh_HK' 'en_IN' 'es_US' 'pt_PT' 'en_AU' 'zh_TW' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/17.0.0/aapt-output-com.politedroid_3.txt0000644000175000017500000000245614620351225025472 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' sdkVersion:'3' uses-permission:'android.permission.READ_CALENDAR' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.WRITE_EXTERNAL_STORAGE','targetSdkVersion < 4' uses-permission:'android.permission.READ_PHONE_STATE' uses-implied-permission:'android.permission.READ_PHONE_STATE','targetSdkVersion < 4' uses-permission:'android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/17.0.0/aapt-output-com.politedroid_4.txt0000644000175000017500000000245614620351225025473 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' sdkVersion:'3' uses-permission:'android.permission.READ_CALENDAR' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.WRITE_EXTERNAL_STORAGE','targetSdkVersion < 4' uses-permission:'android.permission.READ_PHONE_STATE' uses-implied-permission:'android.permission.READ_PHONE_STATE','targetSdkVersion < 4' uses-permission:'android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/17.0.0/aapt-output-com.politedroid_5.txt0000644000175000017500000000163114620351225025466 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' sdkVersion:'3' targetSdkVersion:'10' uses-permission:'android.permission.READ_CALENDAR' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/17.0.0/aapt-output-com.politedroid_6.txt0000644000175000017500000000165114620351225025471 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' sdkVersion:'14' targetSdkVersion:'21' uses-permission:'android.permission.READ_CALENDAR' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/17.0.0/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000264214620351225027637 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' sdkVersion:'18' targetSdkVersion:'27' uses-permission:'android.permission.INTERNET' uses-permission:'android.permission.ACCESS_NETWORK_STATE' uses-permission:'android.permission.ACCESS_WIFI_STATE' uses-permission:'android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission:'android.permission.INTERNET' uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE' uses-feature-not-required:'android.software.leanback' uses-feature-not-required:'android.hardware.touchscreen' application-label:'Duplicate Permisssions' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='Duplicate Permisssions' icon='res/drawable/ic_launcher.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission:'android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.wifi' uses-implied-feature:'android.hardware.wifi','requested android.permission.ACCESS_WIFI_STATE, android.permission.CHANGE_WIFI_STATE, or android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/17.0.0/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000152014620351225030007 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/17.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000117314620351225030124 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' sdkVersion:'24' targetSdkVersion:'25' uses-permission:'android.permission.WAKE_LOCK' application-label:'Caffeine Tile' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='Caffeine Tile' icon='res/drawable/ic_coffee_on.xml' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/17.0.0/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000246614620351225027163 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' uses-feature-not-required:'android.hardware.telephony' uses-feature-not-required:'android.hardware.wifi' uses-feature-not-required:'android.hardware.touchscreen' uses-feature-not-required:'android.hardware.nfc' uses-feature-not-required:'android.hardware.bluetooth' uses-permission:'android.permission.INTERNET' uses-permission:'android.permission.ACCESS_NETWORK_STATE' uses-permission:'android.permission.ACCESS_WIFI_STATE' uses-permission:'android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission:'android.permission.CHANGE_NETWORK_STATE' uses-permission:'android.permission.CHANGE_WIFI_STATE' uses-permission:'android.permission.BLUETOOTH' uses-permission:'android.permission.BLUETOOTH_ADMIN' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' uses-permission:'android.permission.NFC' application-label:'OBB Main Old Version' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Old Version' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/17.0.0/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000127014620351225027130 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/17.0.0/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000127014620351225027132 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/17.0.0/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000127014620351225027134 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/17.0.0/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000120614620351225027013 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/17.0.0/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000121114620351225026503 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' sdkVersion:'8' targetSdkVersion:'28' uses-permission:'android.permission.VIBRATE' application-label:'DroidTR keyboard' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR keyboard' icon='res/drawable/ic_launcher.png' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main ime supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/17.0.0/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000273014620351225025544 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' sdkVersion:'8' targetSdkVersion:'18' uses-permission:'android.permission.RECEIVE_SMS' uses-permission:'android.permission.SEND_SMS' uses-permission:'android.permission.READ_CONTACTS' uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE' uses-permission:'android.permission.VIBRATE' application-label:'Battery level' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='Battery level' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission:'android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.telephony' uses-implied-feature:'android.hardware.telephony','requested a telephony-related permission or feature' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8923821 fdroidserver-2.3a1/tests/build-tools/18.1.1/0000755000175000017500000000000014620351546017135 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/18.1.1/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001411514620351225025171 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission:'android.permission.ACCESS_NETWORK_STATE' uses-permission:'android.permission.CALL_PHONE' uses-permission:'android.permission.READ_CONTACTS' uses-permission:'android.permission.READ_SMS' uses-permission:'android.permission.READ_PHONE_STATE' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' uses-permission:'android.permission.RECEIVE_MMS' uses-permission:'android.permission.RECEIVE_SMS' uses-permission:'android.permission.SEND_SMS' uses-permission:'android.permission.WAKE_LOCK' uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE' uses-permission:'android.permission.WRITE_SMS' uses-permission:'com.android.vending.BILLING' uses-permission:'android.permission.INTERNET' uses-permission:'com.sec.android.provider.badge.permission.READ' uses-permission:'com.sec.android.provider.badge.permission.WRITE' uses-permission:'com.htc.launcher.permission.READ_SETTINGS' uses-permission:'com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission:'com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission:'com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission:'com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission:'com.majeur.launcher.permission.UPDATE_BADGE' uses-permission:'com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission:'com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission:'com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission:'android.permission.READ_APP_BADGE' uses-permission:'com.oppo.launcher.permission.READ_SETTINGS' uses-permission:'com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission:'me.everything.badger.permission.BADGE_COUNT_READ' uses-permission:'me.everything.badger.permission.BADGE_COUNT_WRITE' application-label:'QKSMS' application-label-da:'QKSMS' application-label-fa:'QKSMS' application-label-ja:'QKSMS' application-label-de:'QKSMS' application-label-ne:'QKSMS' application-label-th:'QKSMS' application-label-zh:'QKSMS' application-label-fi:'QKSMS' application-label-hi:'QKSMS' application-label-vi:'QKSMS' application-label-sk:'QKSMS' application-label-uk:'QKSMS' application-label-nl:'QKSMS' application-label-pl:'QKSMS' application-label-tl:'QKSMS' application-label-bn:'QKSMS' application-label-in:'QKSMS' application-label-ko:'QKSMS' application-label-no:'QKSMS' application-label-ro:'QKSMS' application-label-ar:'QKSMS' application-label-fr:'QKSMS' application-label-hr:'QKSMS' application-label-sr:'QKSMS' application-label-tr:'QKSMS' application-label-ur:'QKSMS' application-label-cs:'QKSMS' application-label-es:'QKSMS' application-label-it:'QKSMS' application-label-lt:'QKSMS' application-label-pt:'QKSMS' application-label-hu:'QKSMS' application-label-ru:'QKSMS' application-label-sv:'QKSMS' application-label-iw:'QKSMS' application-label-zh_CN:'QKSMS' application-label-pt_BR:'QKSMS' application-label-ca:'QKSMS' application-label-ka:'QKSMS' application-label-pa:'QKSMS' application-label-ta:'QKSMS' application-label-nb:'QKSMS' application-label-be:'QKSMS' application-label-te:'QKSMS' application-label-af:'QKSMS' application-label-bg:'QKSMS' application-label-si:'QKSMS' application-label-kk:'QKSMS' application-label-mk:'QKSMS' application-label-el:'QKSMS' application-label-gl:'QKSMS' application-label-ml:'QKSMS' application-label-sl:'QKSMS' application-label-am:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-mn:'QKSMS' application-label-lo:'QKSMS' application-label-sq:'QKSMS' application-label-mr:'QKSMS' application-label-or:'QKSMS' application-label-as:'QKSMS' application-label-bs:'QKSMS' application-label-is:'QKSMS' application-label-ms:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-gu:'QKSMS' application-label-zu:'QKSMS' application-label-lv:'QKSMS' application-label-sw:'QKSMS' application-label-hy:'QKSMS' application-label-ky:'QKSMS' application-label-my:'QKSMS' application-label-az:'QKSMS' application-label-uz:'QKSMS' application-label-en_CA:'QKSMS' application-label-fr_CA:'QKSMS' application-label-en_GB:'QKSMS' application-label-en_XC:'QKSMS' application-label-zh_HK:'QKSMS' application-label-en_IN:'QKSMS' application-label-es_US:'QKSMS' application-label-pt_PT:'QKSMS' application-label-en_AU:'QKSMS' application-label-zh_TW:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission:'android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.telephony' uses-implied-feature:'android.hardware.telephony','requested a telephony-related permission or feature' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main app-widget other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'da' 'fa' 'ja' 'de' 'ne' 'th' 'zh' 'fi' 'hi' 'vi' 'sk' 'uk' 'nl' 'pl' 'tl' 'bn' 'in' 'ko' 'no' 'ro' 'ar' 'fr' 'hr' 'sr' 'tr' 'ur' 'cs' 'es' 'it' 'lt' 'pt' 'hu' 'ru' 'sv' 'iw' 'zh_CN' 'pt_BR' 'ca' 'ka' 'pa' 'ta' 'nb' 'be' 'te' 'af' 'bg' 'si' 'kk' 'mk' 'el' 'gl' 'ml' 'sl' 'am' 'km' 'kn' 'mn' 'lo' 'sq' 'mr' 'or' 'as' 'bs' 'is' 'ms' 'et' 'eu' 'gu' 'zu' 'lv' 'sw' 'hy' 'ky' 'my' 'az' 'uz' 'en_CA' 'fr_CA' 'en_GB' 'en_XC' 'zh_HK' 'en_IN' 'es_US' 'pt_PT' 'en_AU' 'zh_TW' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/18.1.1/aapt-output-com.politedroid_3.txt0000644000175000017500000000245614620351225025475 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' sdkVersion:'3' uses-permission:'android.permission.READ_CALENDAR' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.WRITE_EXTERNAL_STORAGE','targetSdkVersion < 4' uses-permission:'android.permission.READ_PHONE_STATE' uses-implied-permission:'android.permission.READ_PHONE_STATE','targetSdkVersion < 4' uses-permission:'android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/18.1.1/aapt-output-com.politedroid_4.txt0000644000175000017500000000245614620351225025476 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' sdkVersion:'3' uses-permission:'android.permission.READ_CALENDAR' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.WRITE_EXTERNAL_STORAGE','targetSdkVersion < 4' uses-permission:'android.permission.READ_PHONE_STATE' uses-implied-permission:'android.permission.READ_PHONE_STATE','targetSdkVersion < 4' uses-permission:'android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/18.1.1/aapt-output-com.politedroid_5.txt0000644000175000017500000000163114620351225025471 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' sdkVersion:'3' targetSdkVersion:'10' uses-permission:'android.permission.READ_CALENDAR' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/18.1.1/aapt-output-com.politedroid_6.txt0000644000175000017500000000165114620351225025474 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' sdkVersion:'14' targetSdkVersion:'21' uses-permission:'android.permission.READ_CALENDAR' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/18.1.1/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000264214620351225027642 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' sdkVersion:'18' targetSdkVersion:'27' uses-permission:'android.permission.INTERNET' uses-permission:'android.permission.ACCESS_NETWORK_STATE' uses-permission:'android.permission.ACCESS_WIFI_STATE' uses-permission:'android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission:'android.permission.INTERNET' uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE' uses-feature-not-required:'android.software.leanback' uses-feature-not-required:'android.hardware.touchscreen' application-label:'Duplicate Permisssions' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='Duplicate Permisssions' icon='res/drawable/ic_launcher.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission:'android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.wifi' uses-implied-feature:'android.hardware.wifi','requested android.permission.ACCESS_WIFI_STATE, android.permission.CHANGE_WIFI_STATE, or android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/18.1.1/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000152014620351225030012 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/18.1.1/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000117314620351225030127 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' sdkVersion:'24' targetSdkVersion:'25' uses-permission:'android.permission.WAKE_LOCK' application-label:'Caffeine Tile' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='Caffeine Tile' icon='res/drawable/ic_coffee_on.xml' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/18.1.1/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000246614620351225027166 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' uses-feature-not-required:'android.hardware.telephony' uses-feature-not-required:'android.hardware.wifi' uses-feature-not-required:'android.hardware.touchscreen' uses-feature-not-required:'android.hardware.nfc' uses-feature-not-required:'android.hardware.bluetooth' uses-permission:'android.permission.INTERNET' uses-permission:'android.permission.ACCESS_NETWORK_STATE' uses-permission:'android.permission.ACCESS_WIFI_STATE' uses-permission:'android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission:'android.permission.CHANGE_NETWORK_STATE' uses-permission:'android.permission.CHANGE_WIFI_STATE' uses-permission:'android.permission.BLUETOOTH' uses-permission:'android.permission.BLUETOOTH_ADMIN' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' uses-permission:'android.permission.NFC' application-label:'OBB Main Old Version' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Old Version' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/18.1.1/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000127014620351225027133 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/18.1.1/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000127014620351225027135 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/18.1.1/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000127014620351225027137 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/18.1.1/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000120614620351225027016 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/18.1.1/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000121114620351225026506 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' sdkVersion:'8' targetSdkVersion:'28' uses-permission:'android.permission.VIBRATE' application-label:'DroidTR keyboard' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR keyboard' icon='res/drawable/ic_launcher.png' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main ime supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/18.1.1/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000273014620351225025547 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' sdkVersion:'8' targetSdkVersion:'18' uses-permission:'android.permission.RECEIVE_SMS' uses-permission:'android.permission.SEND_SMS' uses-permission:'android.permission.READ_CONTACTS' uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE' uses-permission:'android.permission.VIBRATE' application-label:'Battery level' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='Battery level' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission:'android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.telephony' uses-implied-feature:'android.hardware.telephony','requested a telephony-related permission or feature' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8923821 fdroidserver-2.3a1/tests/build-tools/19.0.0/0000755000175000017500000000000014620351546017134 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.0.0/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001411514620351225025170 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission:'android.permission.ACCESS_NETWORK_STATE' uses-permission:'android.permission.CALL_PHONE' uses-permission:'android.permission.READ_CONTACTS' uses-permission:'android.permission.READ_SMS' uses-permission:'android.permission.READ_PHONE_STATE' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' uses-permission:'android.permission.RECEIVE_MMS' uses-permission:'android.permission.RECEIVE_SMS' uses-permission:'android.permission.SEND_SMS' uses-permission:'android.permission.WAKE_LOCK' uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE' uses-permission:'android.permission.WRITE_SMS' uses-permission:'com.android.vending.BILLING' uses-permission:'android.permission.INTERNET' uses-permission:'com.sec.android.provider.badge.permission.READ' uses-permission:'com.sec.android.provider.badge.permission.WRITE' uses-permission:'com.htc.launcher.permission.READ_SETTINGS' uses-permission:'com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission:'com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission:'com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission:'com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission:'com.majeur.launcher.permission.UPDATE_BADGE' uses-permission:'com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission:'com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission:'com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission:'android.permission.READ_APP_BADGE' uses-permission:'com.oppo.launcher.permission.READ_SETTINGS' uses-permission:'com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission:'me.everything.badger.permission.BADGE_COUNT_READ' uses-permission:'me.everything.badger.permission.BADGE_COUNT_WRITE' application-label:'QKSMS' application-label-da:'QKSMS' application-label-fa:'QKSMS' application-label-ja:'QKSMS' application-label-de:'QKSMS' application-label-ne:'QKSMS' application-label-th:'QKSMS' application-label-zh:'QKSMS' application-label-fi:'QKSMS' application-label-hi:'QKSMS' application-label-vi:'QKSMS' application-label-sk:'QKSMS' application-label-uk:'QKSMS' application-label-nl:'QKSMS' application-label-pl:'QKSMS' application-label-tl:'QKSMS' application-label-bn:'QKSMS' application-label-in:'QKSMS' application-label-ko:'QKSMS' application-label-no:'QKSMS' application-label-ro:'QKSMS' application-label-ar:'QKSMS' application-label-fr:'QKSMS' application-label-hr:'QKSMS' application-label-sr:'QKSMS' application-label-tr:'QKSMS' application-label-ur:'QKSMS' application-label-cs:'QKSMS' application-label-es:'QKSMS' application-label-it:'QKSMS' application-label-lt:'QKSMS' application-label-pt:'QKSMS' application-label-hu:'QKSMS' application-label-ru:'QKSMS' application-label-sv:'QKSMS' application-label-iw:'QKSMS' application-label-zh_CN:'QKSMS' application-label-pt_BR:'QKSMS' application-label-ca:'QKSMS' application-label-ka:'QKSMS' application-label-pa:'QKSMS' application-label-ta:'QKSMS' application-label-nb:'QKSMS' application-label-be:'QKSMS' application-label-te:'QKSMS' application-label-af:'QKSMS' application-label-bg:'QKSMS' application-label-si:'QKSMS' application-label-kk:'QKSMS' application-label-mk:'QKSMS' application-label-el:'QKSMS' application-label-gl:'QKSMS' application-label-ml:'QKSMS' application-label-sl:'QKSMS' application-label-am:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-mn:'QKSMS' application-label-lo:'QKSMS' application-label-sq:'QKSMS' application-label-mr:'QKSMS' application-label-or:'QKSMS' application-label-as:'QKSMS' application-label-bs:'QKSMS' application-label-is:'QKSMS' application-label-ms:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-gu:'QKSMS' application-label-zu:'QKSMS' application-label-lv:'QKSMS' application-label-sw:'QKSMS' application-label-hy:'QKSMS' application-label-ky:'QKSMS' application-label-my:'QKSMS' application-label-az:'QKSMS' application-label-uz:'QKSMS' application-label-en_CA:'QKSMS' application-label-fr_CA:'QKSMS' application-label-en_GB:'QKSMS' application-label-en_XC:'QKSMS' application-label-zh_HK:'QKSMS' application-label-en_IN:'QKSMS' application-label-es_US:'QKSMS' application-label-pt_PT:'QKSMS' application-label-en_AU:'QKSMS' application-label-zh_TW:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission:'android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.telephony' uses-implied-feature:'android.hardware.telephony','requested a telephony-related permission or feature' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main app-widget other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'da' 'fa' 'ja' 'de' 'ne' 'th' 'zh' 'fi' 'hi' 'vi' 'sk' 'uk' 'nl' 'pl' 'tl' 'bn' 'in' 'ko' 'no' 'ro' 'ar' 'fr' 'hr' 'sr' 'tr' 'ur' 'cs' 'es' 'it' 'lt' 'pt' 'hu' 'ru' 'sv' 'iw' 'zh_CN' 'pt_BR' 'ca' 'ka' 'pa' 'ta' 'nb' 'be' 'te' 'af' 'bg' 'si' 'kk' 'mk' 'el' 'gl' 'ml' 'sl' 'am' 'km' 'kn' 'mn' 'lo' 'sq' 'mr' 'or' 'as' 'bs' 'is' 'ms' 'et' 'eu' 'gu' 'zu' 'lv' 'sw' 'hy' 'ky' 'my' 'az' 'uz' 'en_CA' 'fr_CA' 'en_GB' 'en_XC' 'zh_HK' 'en_IN' 'es_US' 'pt_PT' 'en_AU' 'zh_TW' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.0.0/aapt-output-com.politedroid_3.txt0000644000175000017500000000245614620351225025474 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' sdkVersion:'3' uses-permission:'android.permission.READ_CALENDAR' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.WRITE_EXTERNAL_STORAGE','targetSdkVersion < 4' uses-permission:'android.permission.READ_PHONE_STATE' uses-implied-permission:'android.permission.READ_PHONE_STATE','targetSdkVersion < 4' uses-permission:'android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.0.0/aapt-output-com.politedroid_4.txt0000644000175000017500000000245614620351225025475 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' sdkVersion:'3' uses-permission:'android.permission.READ_CALENDAR' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.WRITE_EXTERNAL_STORAGE','targetSdkVersion < 4' uses-permission:'android.permission.READ_PHONE_STATE' uses-implied-permission:'android.permission.READ_PHONE_STATE','targetSdkVersion < 4' uses-permission:'android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.0.0/aapt-output-com.politedroid_5.txt0000644000175000017500000000163114620351225025470 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' sdkVersion:'3' targetSdkVersion:'10' uses-permission:'android.permission.READ_CALENDAR' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.0.0/aapt-output-com.politedroid_6.txt0000644000175000017500000000165114620351225025473 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' sdkVersion:'14' targetSdkVersion:'21' uses-permission:'android.permission.READ_CALENDAR' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.0.0/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000264214620351225027641 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' sdkVersion:'18' targetSdkVersion:'27' uses-permission:'android.permission.INTERNET' uses-permission:'android.permission.ACCESS_NETWORK_STATE' uses-permission:'android.permission.ACCESS_WIFI_STATE' uses-permission:'android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission:'android.permission.INTERNET' uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE' uses-feature-not-required:'android.software.leanback' uses-feature-not-required:'android.hardware.touchscreen' application-label:'Duplicate Permisssions' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='Duplicate Permisssions' icon='res/drawable/ic_launcher.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission:'android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.wifi' uses-implied-feature:'android.hardware.wifi','requested android.permission.ACCESS_WIFI_STATE, android.permission.CHANGE_WIFI_STATE, or android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.0.0/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000152014620351225030011 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000117314620351225030126 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' sdkVersion:'24' targetSdkVersion:'25' uses-permission:'android.permission.WAKE_LOCK' application-label:'Caffeine Tile' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='Caffeine Tile' icon='res/drawable/ic_coffee_on.xml' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.0.0/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000246614620351225027165 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' uses-feature-not-required:'android.hardware.telephony' uses-feature-not-required:'android.hardware.wifi' uses-feature-not-required:'android.hardware.touchscreen' uses-feature-not-required:'android.hardware.nfc' uses-feature-not-required:'android.hardware.bluetooth' uses-permission:'android.permission.INTERNET' uses-permission:'android.permission.ACCESS_NETWORK_STATE' uses-permission:'android.permission.ACCESS_WIFI_STATE' uses-permission:'android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission:'android.permission.CHANGE_NETWORK_STATE' uses-permission:'android.permission.CHANGE_WIFI_STATE' uses-permission:'android.permission.BLUETOOTH' uses-permission:'android.permission.BLUETOOTH_ADMIN' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' uses-permission:'android.permission.NFC' application-label:'OBB Main Old Version' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Old Version' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.0.0/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000127014620351225027132 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.0.0/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000127014620351225027134 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.0.0/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000127014620351225027136 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.0.0/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000120614620351225027015 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.0.0/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000121114620351225026505 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' sdkVersion:'8' targetSdkVersion:'28' uses-permission:'android.permission.VIBRATE' application-label:'DroidTR keyboard' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR keyboard' icon='res/drawable/ic_launcher.png' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main ime supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.0.0/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000273014620351225025546 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' sdkVersion:'8' targetSdkVersion:'18' uses-permission:'android.permission.RECEIVE_SMS' uses-permission:'android.permission.SEND_SMS' uses-permission:'android.permission.READ_CONTACTS' uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE' uses-permission:'android.permission.VIBRATE' application-label:'Battery level' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='Battery level' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission:'android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.telephony' uses-implied-feature:'android.hardware.telephony','requested a telephony-related permission or feature' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8923821 fdroidserver-2.3a1/tests/build-tools/19.1.0/0000755000175000017500000000000014620351546017135 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.1.0/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001411514620351225025171 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission:'android.permission.ACCESS_NETWORK_STATE' uses-permission:'android.permission.CALL_PHONE' uses-permission:'android.permission.READ_CONTACTS' uses-permission:'android.permission.READ_SMS' uses-permission:'android.permission.READ_PHONE_STATE' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' uses-permission:'android.permission.RECEIVE_MMS' uses-permission:'android.permission.RECEIVE_SMS' uses-permission:'android.permission.SEND_SMS' uses-permission:'android.permission.WAKE_LOCK' uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE' uses-permission:'android.permission.WRITE_SMS' uses-permission:'com.android.vending.BILLING' uses-permission:'android.permission.INTERNET' uses-permission:'com.sec.android.provider.badge.permission.READ' uses-permission:'com.sec.android.provider.badge.permission.WRITE' uses-permission:'com.htc.launcher.permission.READ_SETTINGS' uses-permission:'com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission:'com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission:'com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission:'com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission:'com.majeur.launcher.permission.UPDATE_BADGE' uses-permission:'com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission:'com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission:'com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission:'android.permission.READ_APP_BADGE' uses-permission:'com.oppo.launcher.permission.READ_SETTINGS' uses-permission:'com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission:'me.everything.badger.permission.BADGE_COUNT_READ' uses-permission:'me.everything.badger.permission.BADGE_COUNT_WRITE' application-label:'QKSMS' application-label-da:'QKSMS' application-label-fa:'QKSMS' application-label-ja:'QKSMS' application-label-de:'QKSMS' application-label-ne:'QKSMS' application-label-th:'QKSMS' application-label-zh:'QKSMS' application-label-fi:'QKSMS' application-label-hi:'QKSMS' application-label-vi:'QKSMS' application-label-sk:'QKSMS' application-label-uk:'QKSMS' application-label-nl:'QKSMS' application-label-pl:'QKSMS' application-label-tl:'QKSMS' application-label-bn:'QKSMS' application-label-in:'QKSMS' application-label-ko:'QKSMS' application-label-no:'QKSMS' application-label-ro:'QKSMS' application-label-ar:'QKSMS' application-label-fr:'QKSMS' application-label-hr:'QKSMS' application-label-sr:'QKSMS' application-label-tr:'QKSMS' application-label-ur:'QKSMS' application-label-cs:'QKSMS' application-label-es:'QKSMS' application-label-it:'QKSMS' application-label-lt:'QKSMS' application-label-pt:'QKSMS' application-label-hu:'QKSMS' application-label-ru:'QKSMS' application-label-sv:'QKSMS' application-label-iw:'QKSMS' application-label-zh_CN:'QKSMS' application-label-pt_BR:'QKSMS' application-label-ca:'QKSMS' application-label-ka:'QKSMS' application-label-pa:'QKSMS' application-label-ta:'QKSMS' application-label-nb:'QKSMS' application-label-be:'QKSMS' application-label-te:'QKSMS' application-label-af:'QKSMS' application-label-bg:'QKSMS' application-label-si:'QKSMS' application-label-kk:'QKSMS' application-label-mk:'QKSMS' application-label-el:'QKSMS' application-label-gl:'QKSMS' application-label-ml:'QKSMS' application-label-sl:'QKSMS' application-label-am:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-mn:'QKSMS' application-label-lo:'QKSMS' application-label-sq:'QKSMS' application-label-mr:'QKSMS' application-label-or:'QKSMS' application-label-as:'QKSMS' application-label-bs:'QKSMS' application-label-is:'QKSMS' application-label-ms:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-gu:'QKSMS' application-label-zu:'QKSMS' application-label-lv:'QKSMS' application-label-sw:'QKSMS' application-label-hy:'QKSMS' application-label-ky:'QKSMS' application-label-my:'QKSMS' application-label-az:'QKSMS' application-label-uz:'QKSMS' application-label-en_CA:'QKSMS' application-label-fr_CA:'QKSMS' application-label-en_GB:'QKSMS' application-label-en_XC:'QKSMS' application-label-zh_HK:'QKSMS' application-label-en_IN:'QKSMS' application-label-es_US:'QKSMS' application-label-pt_PT:'QKSMS' application-label-en_AU:'QKSMS' application-label-zh_TW:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission:'android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.telephony' uses-implied-feature:'android.hardware.telephony','requested a telephony-related permission or feature' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main app-widget other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'da' 'fa' 'ja' 'de' 'ne' 'th' 'zh' 'fi' 'hi' 'vi' 'sk' 'uk' 'nl' 'pl' 'tl' 'bn' 'in' 'ko' 'no' 'ro' 'ar' 'fr' 'hr' 'sr' 'tr' 'ur' 'cs' 'es' 'it' 'lt' 'pt' 'hu' 'ru' 'sv' 'iw' 'zh_CN' 'pt_BR' 'ca' 'ka' 'pa' 'ta' 'nb' 'be' 'te' 'af' 'bg' 'si' 'kk' 'mk' 'el' 'gl' 'ml' 'sl' 'am' 'km' 'kn' 'mn' 'lo' 'sq' 'mr' 'or' 'as' 'bs' 'is' 'ms' 'et' 'eu' 'gu' 'zu' 'lv' 'sw' 'hy' 'ky' 'my' 'az' 'uz' 'en_CA' 'fr_CA' 'en_GB' 'en_XC' 'zh_HK' 'en_IN' 'es_US' 'pt_PT' 'en_AU' 'zh_TW' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.1.0/aapt-output-com.politedroid_3.txt0000644000175000017500000000245614620351225025475 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' sdkVersion:'3' uses-permission:'android.permission.READ_CALENDAR' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.WRITE_EXTERNAL_STORAGE','targetSdkVersion < 4' uses-permission:'android.permission.READ_PHONE_STATE' uses-implied-permission:'android.permission.READ_PHONE_STATE','targetSdkVersion < 4' uses-permission:'android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.1.0/aapt-output-com.politedroid_4.txt0000644000175000017500000000245614620351225025476 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' sdkVersion:'3' uses-permission:'android.permission.READ_CALENDAR' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.WRITE_EXTERNAL_STORAGE','targetSdkVersion < 4' uses-permission:'android.permission.READ_PHONE_STATE' uses-implied-permission:'android.permission.READ_PHONE_STATE','targetSdkVersion < 4' uses-permission:'android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.1.0/aapt-output-com.politedroid_5.txt0000644000175000017500000000163114620351225025471 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' sdkVersion:'3' targetSdkVersion:'10' uses-permission:'android.permission.READ_CALENDAR' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.1.0/aapt-output-com.politedroid_6.txt0000644000175000017500000000165114620351225025474 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' sdkVersion:'14' targetSdkVersion:'21' uses-permission:'android.permission.READ_CALENDAR' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.1.0/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000264214620351225027642 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' sdkVersion:'18' targetSdkVersion:'27' uses-permission:'android.permission.INTERNET' uses-permission:'android.permission.ACCESS_NETWORK_STATE' uses-permission:'android.permission.ACCESS_WIFI_STATE' uses-permission:'android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission:'android.permission.INTERNET' uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE' uses-feature-not-required:'android.software.leanback' uses-feature-not-required:'android.hardware.touchscreen' application-label:'Duplicate Permisssions' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='Duplicate Permisssions' icon='res/drawable/ic_launcher.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission:'android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.wifi' uses-implied-feature:'android.hardware.wifi','requested android.permission.ACCESS_WIFI_STATE, android.permission.CHANGE_WIFI_STATE, or android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.1.0/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000152014620351225030012 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.1.0/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000117314620351225030127 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' sdkVersion:'24' targetSdkVersion:'25' uses-permission:'android.permission.WAKE_LOCK' application-label:'Caffeine Tile' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='Caffeine Tile' icon='res/drawable/ic_coffee_on.xml' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.1.0/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000246614620351225027166 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' uses-feature-not-required:'android.hardware.telephony' uses-feature-not-required:'android.hardware.wifi' uses-feature-not-required:'android.hardware.touchscreen' uses-feature-not-required:'android.hardware.nfc' uses-feature-not-required:'android.hardware.bluetooth' uses-permission:'android.permission.INTERNET' uses-permission:'android.permission.ACCESS_NETWORK_STATE' uses-permission:'android.permission.ACCESS_WIFI_STATE' uses-permission:'android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission:'android.permission.CHANGE_NETWORK_STATE' uses-permission:'android.permission.CHANGE_WIFI_STATE' uses-permission:'android.permission.BLUETOOTH' uses-permission:'android.permission.BLUETOOTH_ADMIN' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' uses-permission:'android.permission.NFC' application-label:'OBB Main Old Version' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Old Version' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.1.0/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000127014620351225027133 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.1.0/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000127014620351225027135 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.1.0/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000127014620351225027137 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.1.0/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000120614620351225027016 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.1.0/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000121114620351225026506 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' sdkVersion:'8' targetSdkVersion:'28' uses-permission:'android.permission.VIBRATE' application-label:'DroidTR keyboard' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR keyboard' icon='res/drawable/ic_launcher.png' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main ime supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/19.1.0/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000273014620351225025547 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' sdkVersion:'8' targetSdkVersion:'18' uses-permission:'android.permission.RECEIVE_SMS' uses-permission:'android.permission.SEND_SMS' uses-permission:'android.permission.READ_CONTACTS' uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE' uses-permission:'android.permission.VIBRATE' application-label:'Battery level' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='Battery level' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission:'android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.telephony' uses-implied-feature:'android.hardware.telephony','requested a telephony-related permission or feature' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8923821 fdroidserver-2.3a1/tests/build-tools/20.0.0/0000755000175000017500000000000014620351546017124 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/20.0.0/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001411514620351225025160 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission:'android.permission.ACCESS_NETWORK_STATE' uses-permission:'android.permission.CALL_PHONE' uses-permission:'android.permission.READ_CONTACTS' uses-permission:'android.permission.READ_SMS' uses-permission:'android.permission.READ_PHONE_STATE' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' uses-permission:'android.permission.RECEIVE_MMS' uses-permission:'android.permission.RECEIVE_SMS' uses-permission:'android.permission.SEND_SMS' uses-permission:'android.permission.WAKE_LOCK' uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE' uses-permission:'android.permission.WRITE_SMS' uses-permission:'com.android.vending.BILLING' uses-permission:'android.permission.INTERNET' uses-permission:'com.sec.android.provider.badge.permission.READ' uses-permission:'com.sec.android.provider.badge.permission.WRITE' uses-permission:'com.htc.launcher.permission.READ_SETTINGS' uses-permission:'com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission:'com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission:'com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission:'com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission:'com.majeur.launcher.permission.UPDATE_BADGE' uses-permission:'com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission:'com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission:'com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission:'android.permission.READ_APP_BADGE' uses-permission:'com.oppo.launcher.permission.READ_SETTINGS' uses-permission:'com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission:'me.everything.badger.permission.BADGE_COUNT_READ' uses-permission:'me.everything.badger.permission.BADGE_COUNT_WRITE' application-label:'QKSMS' application-label-da:'QKSMS' application-label-fa:'QKSMS' application-label-ja:'QKSMS' application-label-de:'QKSMS' application-label-ne:'QKSMS' application-label-th:'QKSMS' application-label-zh:'QKSMS' application-label-fi:'QKSMS' application-label-hi:'QKSMS' application-label-vi:'QKSMS' application-label-sk:'QKSMS' application-label-uk:'QKSMS' application-label-nl:'QKSMS' application-label-pl:'QKSMS' application-label-tl:'QKSMS' application-label-bn:'QKSMS' application-label-in:'QKSMS' application-label-ko:'QKSMS' application-label-no:'QKSMS' application-label-ro:'QKSMS' application-label-ar:'QKSMS' application-label-fr:'QKSMS' application-label-hr:'QKSMS' application-label-sr:'QKSMS' application-label-tr:'QKSMS' application-label-ur:'QKSMS' application-label-cs:'QKSMS' application-label-es:'QKSMS' application-label-it:'QKSMS' application-label-lt:'QKSMS' application-label-pt:'QKSMS' application-label-hu:'QKSMS' application-label-ru:'QKSMS' application-label-sv:'QKSMS' application-label-iw:'QKSMS' application-label-zh_CN:'QKSMS' application-label-pt_BR:'QKSMS' application-label-ca:'QKSMS' application-label-ka:'QKSMS' application-label-pa:'QKSMS' application-label-ta:'QKSMS' application-label-nb:'QKSMS' application-label-be:'QKSMS' application-label-te:'QKSMS' application-label-af:'QKSMS' application-label-bg:'QKSMS' application-label-si:'QKSMS' application-label-kk:'QKSMS' application-label-mk:'QKSMS' application-label-el:'QKSMS' application-label-gl:'QKSMS' application-label-ml:'QKSMS' application-label-sl:'QKSMS' application-label-am:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-mn:'QKSMS' application-label-lo:'QKSMS' application-label-sq:'QKSMS' application-label-mr:'QKSMS' application-label-or:'QKSMS' application-label-as:'QKSMS' application-label-bs:'QKSMS' application-label-is:'QKSMS' application-label-ms:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-gu:'QKSMS' application-label-zu:'QKSMS' application-label-lv:'QKSMS' application-label-sw:'QKSMS' application-label-hy:'QKSMS' application-label-ky:'QKSMS' application-label-my:'QKSMS' application-label-az:'QKSMS' application-label-uz:'QKSMS' application-label-en_CA:'QKSMS' application-label-fr_CA:'QKSMS' application-label-en_GB:'QKSMS' application-label-en_XC:'QKSMS' application-label-zh_HK:'QKSMS' application-label-en_IN:'QKSMS' application-label-es_US:'QKSMS' application-label-pt_PT:'QKSMS' application-label-en_AU:'QKSMS' application-label-zh_TW:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission:'android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.telephony' uses-implied-feature:'android.hardware.telephony','requested a telephony-related permission or feature' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main app-widget other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'da' 'fa' 'ja' 'de' 'ne' 'th' 'zh' 'fi' 'hi' 'vi' 'sk' 'uk' 'nl' 'pl' 'tl' 'bn' 'in' 'ko' 'no' 'ro' 'ar' 'fr' 'hr' 'sr' 'tr' 'ur' 'cs' 'es' 'it' 'lt' 'pt' 'hu' 'ru' 'sv' 'iw' 'zh_CN' 'pt_BR' 'ca' 'ka' 'pa' 'ta' 'nb' 'be' 'te' 'af' 'bg' 'si' 'kk' 'mk' 'el' 'gl' 'ml' 'sl' 'am' 'km' 'kn' 'mn' 'lo' 'sq' 'mr' 'or' 'as' 'bs' 'is' 'ms' 'et' 'eu' 'gu' 'zu' 'lv' 'sw' 'hy' 'ky' 'my' 'az' 'uz' 'en_CA' 'fr_CA' 'en_GB' 'en_XC' 'zh_HK' 'en_IN' 'es_US' 'pt_PT' 'en_AU' 'zh_TW' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/20.0.0/aapt-output-com.politedroid_3.txt0000644000175000017500000000245614620351225025464 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' sdkVersion:'3' uses-permission:'android.permission.READ_CALENDAR' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.WRITE_EXTERNAL_STORAGE','targetSdkVersion < 4' uses-permission:'android.permission.READ_PHONE_STATE' uses-implied-permission:'android.permission.READ_PHONE_STATE','targetSdkVersion < 4' uses-permission:'android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/20.0.0/aapt-output-com.politedroid_4.txt0000644000175000017500000000245614620351225025465 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' sdkVersion:'3' uses-permission:'android.permission.READ_CALENDAR' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.WRITE_EXTERNAL_STORAGE','targetSdkVersion < 4' uses-permission:'android.permission.READ_PHONE_STATE' uses-implied-permission:'android.permission.READ_PHONE_STATE','targetSdkVersion < 4' uses-permission:'android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/20.0.0/aapt-output-com.politedroid_5.txt0000644000175000017500000000163114620351225025460 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' sdkVersion:'3' targetSdkVersion:'10' uses-permission:'android.permission.READ_CALENDAR' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/20.0.0/aapt-output-com.politedroid_6.txt0000644000175000017500000000165114620351225025463 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' sdkVersion:'14' targetSdkVersion:'21' uses-permission:'android.permission.READ_CALENDAR' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/20.0.0/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000264214620351225027631 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' sdkVersion:'18' targetSdkVersion:'27' uses-permission:'android.permission.INTERNET' uses-permission:'android.permission.ACCESS_NETWORK_STATE' uses-permission:'android.permission.ACCESS_WIFI_STATE' uses-permission:'android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission:'android.permission.INTERNET' uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE' uses-feature-not-required:'android.software.leanback' uses-feature-not-required:'android.hardware.touchscreen' application-label:'Duplicate Permisssions' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='Duplicate Permisssions' icon='res/drawable/ic_launcher.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission:'android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.wifi' uses-implied-feature:'android.hardware.wifi','requested android.permission.ACCESS_WIFI_STATE, android.permission.CHANGE_WIFI_STATE, or android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/20.0.0/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000152014620351225030001 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/20.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000117314620351225030116 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' sdkVersion:'24' targetSdkVersion:'25' uses-permission:'android.permission.WAKE_LOCK' application-label:'Caffeine Tile' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='Caffeine Tile' icon='res/drawable/ic_coffee_on.xml' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/20.0.0/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000246614620351225027155 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' uses-feature-not-required:'android.hardware.telephony' uses-feature-not-required:'android.hardware.wifi' uses-feature-not-required:'android.hardware.touchscreen' uses-feature-not-required:'android.hardware.nfc' uses-feature-not-required:'android.hardware.bluetooth' uses-permission:'android.permission.INTERNET' uses-permission:'android.permission.ACCESS_NETWORK_STATE' uses-permission:'android.permission.ACCESS_WIFI_STATE' uses-permission:'android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission:'android.permission.CHANGE_NETWORK_STATE' uses-permission:'android.permission.CHANGE_WIFI_STATE' uses-permission:'android.permission.BLUETOOTH' uses-permission:'android.permission.BLUETOOTH_ADMIN' uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED' uses-permission:'android.permission.NFC' application-label:'OBB Main Old Version' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Old Version' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/20.0.0/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000127014620351225027122 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/20.0.0/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000127014620351225027124 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/20.0.0/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000127014620351225027126 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/20.0.0/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000120614620351225027005 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/20.0.0/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000121114620351225026475 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' sdkVersion:'8' targetSdkVersion:'28' uses-permission:'android.permission.VIBRATE' application-label:'DroidTR keyboard' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR keyboard' icon='res/drawable/ic_launcher.png' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main ime supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/20.0.0/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000273014620351225025536 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' sdkVersion:'8' targetSdkVersion:'18' uses-permission:'android.permission.RECEIVE_SMS' uses-permission:'android.permission.SEND_SMS' uses-permission:'android.permission.READ_CONTACTS' uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE' uses-permission:'android.permission.VIBRATE' application-label:'Battery level' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='Battery level' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission:'android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE' uses-feature:'android.hardware.telephony' uses-implied-feature:'android.hardware.telephony','requested a telephony-related permission or feature' uses-feature:'android.hardware.touchscreen' uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8963823 fdroidserver-2.3a1/tests/build-tools/21.1.1/0000755000175000017500000000000014620351546017127 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.1/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001460314620351225025165 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' platformBuildVersionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.CALL_PHONE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.READ_SMS' uses-permission: name='android.permission.READ_PHONE_STATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.RECEIVE_MMS' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_SMS' uses-permission: name='com.android.vending.BILLING' uses-permission: name='android.permission.INTERNET' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission: name='com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission: name='com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission: name='com.majeur.launcher.permission.UPDATE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='android.permission.READ_APP_BADGE' uses-permission: name='com.oppo.launcher.permission.READ_SETTINGS' uses-permission: name='com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_WRITE' application-label:'QKSMS' application-label-da:'QKSMS' application-label-fa:'QKSMS' application-label-ja:'QKSMS' application-label-de:'QKSMS' application-label-ne:'QKSMS' application-label-th:'QKSMS' application-label-zh:'QKSMS' application-label-fi:'QKSMS' application-label-hi:'QKSMS' application-label-vi:'QKSMS' application-label-sk:'QKSMS' application-label-uk:'QKSMS' application-label-nl:'QKSMS' application-label-pl:'QKSMS' application-label-tl:'QKSMS' application-label-bn:'QKSMS' application-label-in:'QKSMS' application-label-ko:'QKSMS' application-label-no:'QKSMS' application-label-ro:'QKSMS' application-label-ar:'QKSMS' application-label-fr:'QKSMS' application-label-hr:'QKSMS' application-label-sr:'QKSMS' application-label-tr:'QKSMS' application-label-ur:'QKSMS' application-label-cs:'QKSMS' application-label-es:'QKSMS' application-label-it:'QKSMS' application-label-lt:'QKSMS' application-label-pt:'QKSMS' application-label-hu:'QKSMS' application-label-ru:'QKSMS' application-label-sv:'QKSMS' application-label-iw:'QKSMS' application-label-zh-CN:'QKSMS' application-label-pt-BR:'QKSMS' application-label-ca:'QKSMS' application-label-ka:'QKSMS' application-label-pa:'QKSMS' application-label-ta:'QKSMS' application-label-nb:'QKSMS' application-label-be:'QKSMS' application-label-te:'QKSMS' application-label-af:'QKSMS' application-label-bg:'QKSMS' application-label-si:'QKSMS' application-label-kk:'QKSMS' application-label-mk:'QKSMS' application-label-el:'QKSMS' application-label-gl:'QKSMS' application-label-ml:'QKSMS' application-label-sl:'QKSMS' application-label-am:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-mn:'QKSMS' application-label-lo:'QKSMS' application-label-sq:'QKSMS' application-label-mr:'QKSMS' application-label-or:'QKSMS' application-label-sr-Latn:'QKSMS' application-label-as:'QKSMS' application-label-bs:'QKSMS' application-label-is:'QKSMS' application-label-ms:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-gu:'QKSMS' application-label-zu:'QKSMS' application-label-lv:'QKSMS' application-label-sw:'QKSMS' application-label-hy:'QKSMS' application-label-ky:'QKSMS' application-label-my:'QKSMS' application-label-az:'QKSMS' application-label-uz:'QKSMS' application-label-en-CA:'QKSMS' application-label-fr-CA:'QKSMS' application-label-en-GB:'QKSMS' application-label-en-XC:'QKSMS' application-label-zh-HK:'QKSMS' application-label-en-IN:'QKSMS' application-label-es-US:'QKSMS' application-label-pt-PT:'QKSMS' application-label-en-AU:'QKSMS' application-label-zh-TW:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' provides-component:'app-widget' main other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'da' 'fa' 'ja' 'de' 'ne' 'th' 'zh' 'fi' 'hi' 'vi' 'sk' 'uk' 'nl' 'pl' 'tl' 'bn' 'in' 'ko' 'no' 'ro' 'ar' 'fr' 'hr' 'sr' 'tr' 'ur' 'cs' 'es' 'it' 'lt' 'pt' 'hu' 'ru' 'sv' 'iw' 'zh-CN' 'pt-BR' 'ca' 'ka' 'pa' 'ta' 'nb' 'be' 'te' 'af' 'bg' 'si' 'kk' 'mk' 'el' 'gl' 'ml' 'sl' 'am' 'km' 'kn' 'mn' 'lo' 'sq' 'mr' 'or' 'sr-Latn' 'as' 'bs' 'is' 'ms' 'et' 'eu' 'gu' 'zu' 'lv' 'sw' 'hy' 'ky' 'my' 'az' 'uz' 'en-CA' 'fr-CA' 'en-GB' 'en-XC' 'zh-HK' 'en-IN' 'es-US' 'pt-PT' 'en-AU' 'zh-TW' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.1/aapt-output-com.politedroid_3.txt0000644000175000017500000000263014620351225025461 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.1/aapt-output-com.politedroid_4.txt0000644000175000017500000000263014620351225025462 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.1/aapt-output-com.politedroid_5.txt0000644000175000017500000000171214620351225025463 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' platformBuildVersionName='' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.1/aapt-output-com.politedroid_6.txt0000644000175000017500000000174714620351225025474 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.1/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000270314620351225027632 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label:'Duplicate Permisssions' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='Duplicate Permisssions' icon='res/drawable/ic_launcher.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.1/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000160214620351225030005 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.1/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000125314620351225030120 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-label:'Caffeine Tile' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='Caffeine Tile' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.1/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000230714620351225027152 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.NFC' application-label:'OBB Main Old Version' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Old Version' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.1/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000135214620351225027126 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.1/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000135214620351225027130 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.1/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000135214620351225027132 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.1/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000127014620351225027011 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.1/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000131114620351225026501 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' platformBuildVersionName='' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label:'DroidTR keyboard' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR keyboard' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.1/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000312214620351225025535 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' platformBuildVersionName='' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-label:'Battery level' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='Battery level' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8963823 fdroidserver-2.3a1/tests/build-tools/21.1.2/0000755000175000017500000000000014620351546017130 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.2/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001460314620351225025166 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' platformBuildVersionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.CALL_PHONE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.READ_SMS' uses-permission: name='android.permission.READ_PHONE_STATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.RECEIVE_MMS' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_SMS' uses-permission: name='com.android.vending.BILLING' uses-permission: name='android.permission.INTERNET' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission: name='com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission: name='com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission: name='com.majeur.launcher.permission.UPDATE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='android.permission.READ_APP_BADGE' uses-permission: name='com.oppo.launcher.permission.READ_SETTINGS' uses-permission: name='com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_WRITE' application-label:'QKSMS' application-label-da:'QKSMS' application-label-fa:'QKSMS' application-label-ja:'QKSMS' application-label-de:'QKSMS' application-label-ne:'QKSMS' application-label-th:'QKSMS' application-label-zh:'QKSMS' application-label-fi:'QKSMS' application-label-hi:'QKSMS' application-label-vi:'QKSMS' application-label-sk:'QKSMS' application-label-uk:'QKSMS' application-label-nl:'QKSMS' application-label-pl:'QKSMS' application-label-tl:'QKSMS' application-label-bn:'QKSMS' application-label-in:'QKSMS' application-label-ko:'QKSMS' application-label-no:'QKSMS' application-label-ro:'QKSMS' application-label-ar:'QKSMS' application-label-fr:'QKSMS' application-label-hr:'QKSMS' application-label-sr:'QKSMS' application-label-tr:'QKSMS' application-label-ur:'QKSMS' application-label-cs:'QKSMS' application-label-es:'QKSMS' application-label-it:'QKSMS' application-label-lt:'QKSMS' application-label-pt:'QKSMS' application-label-hu:'QKSMS' application-label-ru:'QKSMS' application-label-sv:'QKSMS' application-label-iw:'QKSMS' application-label-zh-CN:'QKSMS' application-label-pt-BR:'QKSMS' application-label-ca:'QKSMS' application-label-ka:'QKSMS' application-label-pa:'QKSMS' application-label-ta:'QKSMS' application-label-nb:'QKSMS' application-label-be:'QKSMS' application-label-te:'QKSMS' application-label-af:'QKSMS' application-label-bg:'QKSMS' application-label-si:'QKSMS' application-label-kk:'QKSMS' application-label-mk:'QKSMS' application-label-el:'QKSMS' application-label-gl:'QKSMS' application-label-ml:'QKSMS' application-label-sl:'QKSMS' application-label-am:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-mn:'QKSMS' application-label-lo:'QKSMS' application-label-sq:'QKSMS' application-label-mr:'QKSMS' application-label-or:'QKSMS' application-label-sr-Latn:'QKSMS' application-label-as:'QKSMS' application-label-bs:'QKSMS' application-label-is:'QKSMS' application-label-ms:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-gu:'QKSMS' application-label-zu:'QKSMS' application-label-lv:'QKSMS' application-label-sw:'QKSMS' application-label-hy:'QKSMS' application-label-ky:'QKSMS' application-label-my:'QKSMS' application-label-az:'QKSMS' application-label-uz:'QKSMS' application-label-en-CA:'QKSMS' application-label-fr-CA:'QKSMS' application-label-en-GB:'QKSMS' application-label-en-XC:'QKSMS' application-label-zh-HK:'QKSMS' application-label-en-IN:'QKSMS' application-label-es-US:'QKSMS' application-label-pt-PT:'QKSMS' application-label-en-AU:'QKSMS' application-label-zh-TW:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' provides-component:'app-widget' main other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'da' 'fa' 'ja' 'de' 'ne' 'th' 'zh' 'fi' 'hi' 'vi' 'sk' 'uk' 'nl' 'pl' 'tl' 'bn' 'in' 'ko' 'no' 'ro' 'ar' 'fr' 'hr' 'sr' 'tr' 'ur' 'cs' 'es' 'it' 'lt' 'pt' 'hu' 'ru' 'sv' 'iw' 'zh-CN' 'pt-BR' 'ca' 'ka' 'pa' 'ta' 'nb' 'be' 'te' 'af' 'bg' 'si' 'kk' 'mk' 'el' 'gl' 'ml' 'sl' 'am' 'km' 'kn' 'mn' 'lo' 'sq' 'mr' 'or' 'sr-Latn' 'as' 'bs' 'is' 'ms' 'et' 'eu' 'gu' 'zu' 'lv' 'sw' 'hy' 'ky' 'my' 'az' 'uz' 'en-CA' 'fr-CA' 'en-GB' 'en-XC' 'zh-HK' 'en-IN' 'es-US' 'pt-PT' 'en-AU' 'zh-TW' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.2/aapt-output-com.politedroid_3.txt0000644000175000017500000000263014620351225025462 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.2/aapt-output-com.politedroid_4.txt0000644000175000017500000000263014620351225025463 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.2/aapt-output-com.politedroid_5.txt0000644000175000017500000000171214620351225025464 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' platformBuildVersionName='' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.2/aapt-output-com.politedroid_6.txt0000644000175000017500000000174714620351225025475 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.2/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000270314620351225027633 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label:'Duplicate Permisssions' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='Duplicate Permisssions' icon='res/drawable/ic_launcher.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.2/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000160214620351225030006 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.2/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000125314620351225030121 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-label:'Caffeine Tile' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='Caffeine Tile' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.2/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000230714620351225027153 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.NFC' application-label:'OBB Main Old Version' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Old Version' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.2/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000135214620351225027127 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.2/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000135214620351225027131 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.2/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000135214620351225027133 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.2/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000127014620351225027012 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.2/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000131114620351225026502 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' platformBuildVersionName='' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label:'DroidTR keyboard' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR keyboard' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/21.1.2/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000312214620351225025536 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' platformBuildVersionName='' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-label:'Battery level' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='Battery level' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8963823 fdroidserver-2.3a1/tests/build-tools/22.0.0/0000755000175000017500000000000014620351546017126 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.0/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001460314620351225025164 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' platformBuildVersionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.CALL_PHONE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.READ_SMS' uses-permission: name='android.permission.READ_PHONE_STATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.RECEIVE_MMS' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_SMS' uses-permission: name='com.android.vending.BILLING' uses-permission: name='android.permission.INTERNET' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission: name='com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission: name='com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission: name='com.majeur.launcher.permission.UPDATE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='android.permission.READ_APP_BADGE' uses-permission: name='com.oppo.launcher.permission.READ_SETTINGS' uses-permission: name='com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_WRITE' application-label:'QKSMS' application-label-da:'QKSMS' application-label-fa:'QKSMS' application-label-ja:'QKSMS' application-label-de:'QKSMS' application-label-ne:'QKSMS' application-label-th:'QKSMS' application-label-zh:'QKSMS' application-label-fi:'QKSMS' application-label-hi:'QKSMS' application-label-vi:'QKSMS' application-label-sk:'QKSMS' application-label-uk:'QKSMS' application-label-nl:'QKSMS' application-label-pl:'QKSMS' application-label-tl:'QKSMS' application-label-bn:'QKSMS' application-label-in:'QKSMS' application-label-ko:'QKSMS' application-label-no:'QKSMS' application-label-ro:'QKSMS' application-label-ar:'QKSMS' application-label-fr:'QKSMS' application-label-hr:'QKSMS' application-label-sr:'QKSMS' application-label-tr:'QKSMS' application-label-ur:'QKSMS' application-label-cs:'QKSMS' application-label-es:'QKSMS' application-label-it:'QKSMS' application-label-lt:'QKSMS' application-label-pt:'QKSMS' application-label-hu:'QKSMS' application-label-ru:'QKSMS' application-label-sv:'QKSMS' application-label-iw:'QKSMS' application-label-zh-CN:'QKSMS' application-label-pt-BR:'QKSMS' application-label-ca:'QKSMS' application-label-ka:'QKSMS' application-label-pa:'QKSMS' application-label-ta:'QKSMS' application-label-nb:'QKSMS' application-label-be:'QKSMS' application-label-te:'QKSMS' application-label-af:'QKSMS' application-label-bg:'QKSMS' application-label-si:'QKSMS' application-label-kk:'QKSMS' application-label-mk:'QKSMS' application-label-el:'QKSMS' application-label-gl:'QKSMS' application-label-ml:'QKSMS' application-label-sl:'QKSMS' application-label-am:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-mn:'QKSMS' application-label-lo:'QKSMS' application-label-sq:'QKSMS' application-label-mr:'QKSMS' application-label-or:'QKSMS' application-label-sr-Latn:'QKSMS' application-label-as:'QKSMS' application-label-bs:'QKSMS' application-label-is:'QKSMS' application-label-ms:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-gu:'QKSMS' application-label-zu:'QKSMS' application-label-lv:'QKSMS' application-label-sw:'QKSMS' application-label-hy:'QKSMS' application-label-ky:'QKSMS' application-label-my:'QKSMS' application-label-az:'QKSMS' application-label-uz:'QKSMS' application-label-en-CA:'QKSMS' application-label-fr-CA:'QKSMS' application-label-en-GB:'QKSMS' application-label-en-XC:'QKSMS' application-label-zh-HK:'QKSMS' application-label-en-IN:'QKSMS' application-label-es-US:'QKSMS' application-label-pt-PT:'QKSMS' application-label-en-AU:'QKSMS' application-label-zh-TW:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' provides-component:'app-widget' main other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'da' 'fa' 'ja' 'de' 'ne' 'th' 'zh' 'fi' 'hi' 'vi' 'sk' 'uk' 'nl' 'pl' 'tl' 'bn' 'in' 'ko' 'no' 'ro' 'ar' 'fr' 'hr' 'sr' 'tr' 'ur' 'cs' 'es' 'it' 'lt' 'pt' 'hu' 'ru' 'sv' 'iw' 'zh-CN' 'pt-BR' 'ca' 'ka' 'pa' 'ta' 'nb' 'be' 'te' 'af' 'bg' 'si' 'kk' 'mk' 'el' 'gl' 'ml' 'sl' 'am' 'km' 'kn' 'mn' 'lo' 'sq' 'mr' 'or' 'sr-Latn' 'as' 'bs' 'is' 'ms' 'et' 'eu' 'gu' 'zu' 'lv' 'sw' 'hy' 'ky' 'my' 'az' 'uz' 'en-CA' 'fr-CA' 'en-GB' 'en-XC' 'zh-HK' 'en-IN' 'es-US' 'pt-PT' 'en-AU' 'zh-TW' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.0/aapt-output-com.politedroid_3.txt0000644000175000017500000000263014620351225025460 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.0/aapt-output-com.politedroid_4.txt0000644000175000017500000000263014620351225025461 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.0/aapt-output-com.politedroid_5.txt0000644000175000017500000000171214620351225025462 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' platformBuildVersionName='' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.0/aapt-output-com.politedroid_6.txt0000644000175000017500000000174714620351225025473 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.0/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000314314620351225027630 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label:'Duplicate Permisssions' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='Duplicate Permisssions' icon='res/drawable/ic_launcher.png' banner='res/drawable/banner.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.software.leanback' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.0/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000160214620351225030004 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000125314620351225030117 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-label:'Caffeine Tile' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='Caffeine Tile' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.0/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000277114620351225027156 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.NFC' application-label:'OBB Main Old Version' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Old Version' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' uses-feature-not-required: name='android.hardware.bluetooth' uses-feature-not-required: name='android.hardware.nfc' uses-feature-not-required: name='android.hardware.telephony' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.hardware.wifi' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.0/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000135214620351225027125 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.0/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000135214620351225027127 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.0/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000135214620351225027131 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.0/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000127014620351225027010 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.0/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000131114620351225026500 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' platformBuildVersionName='' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label:'DroidTR keyboard' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR keyboard' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.0/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000312214620351225025534 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' platformBuildVersionName='' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-label:'Battery level' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='Battery level' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8963823 fdroidserver-2.3a1/tests/build-tools/22.0.1/0000755000175000017500000000000014620351546017127 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.1/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001460314620351225025165 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' platformBuildVersionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.CALL_PHONE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.READ_SMS' uses-permission: name='android.permission.READ_PHONE_STATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.RECEIVE_MMS' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_SMS' uses-permission: name='com.android.vending.BILLING' uses-permission: name='android.permission.INTERNET' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission: name='com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission: name='com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission: name='com.majeur.launcher.permission.UPDATE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='android.permission.READ_APP_BADGE' uses-permission: name='com.oppo.launcher.permission.READ_SETTINGS' uses-permission: name='com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_WRITE' application-label:'QKSMS' application-label-da:'QKSMS' application-label-fa:'QKSMS' application-label-ja:'QKSMS' application-label-de:'QKSMS' application-label-ne:'QKSMS' application-label-th:'QKSMS' application-label-zh:'QKSMS' application-label-fi:'QKSMS' application-label-hi:'QKSMS' application-label-vi:'QKSMS' application-label-sk:'QKSMS' application-label-uk:'QKSMS' application-label-nl:'QKSMS' application-label-pl:'QKSMS' application-label-tl:'QKSMS' application-label-bn:'QKSMS' application-label-in:'QKSMS' application-label-ko:'QKSMS' application-label-no:'QKSMS' application-label-ro:'QKSMS' application-label-ar:'QKSMS' application-label-fr:'QKSMS' application-label-hr:'QKSMS' application-label-sr:'QKSMS' application-label-tr:'QKSMS' application-label-ur:'QKSMS' application-label-cs:'QKSMS' application-label-es:'QKSMS' application-label-it:'QKSMS' application-label-lt:'QKSMS' application-label-pt:'QKSMS' application-label-hu:'QKSMS' application-label-ru:'QKSMS' application-label-sv:'QKSMS' application-label-iw:'QKSMS' application-label-zh-CN:'QKSMS' application-label-pt-BR:'QKSMS' application-label-ca:'QKSMS' application-label-ka:'QKSMS' application-label-pa:'QKSMS' application-label-ta:'QKSMS' application-label-nb:'QKSMS' application-label-be:'QKSMS' application-label-te:'QKSMS' application-label-af:'QKSMS' application-label-bg:'QKSMS' application-label-si:'QKSMS' application-label-kk:'QKSMS' application-label-mk:'QKSMS' application-label-el:'QKSMS' application-label-gl:'QKSMS' application-label-ml:'QKSMS' application-label-sl:'QKSMS' application-label-am:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-mn:'QKSMS' application-label-lo:'QKSMS' application-label-sq:'QKSMS' application-label-mr:'QKSMS' application-label-or:'QKSMS' application-label-sr-Latn:'QKSMS' application-label-as:'QKSMS' application-label-bs:'QKSMS' application-label-is:'QKSMS' application-label-ms:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-gu:'QKSMS' application-label-zu:'QKSMS' application-label-lv:'QKSMS' application-label-sw:'QKSMS' application-label-hy:'QKSMS' application-label-ky:'QKSMS' application-label-my:'QKSMS' application-label-az:'QKSMS' application-label-uz:'QKSMS' application-label-en-CA:'QKSMS' application-label-fr-CA:'QKSMS' application-label-en-GB:'QKSMS' application-label-en-XC:'QKSMS' application-label-zh-HK:'QKSMS' application-label-en-IN:'QKSMS' application-label-es-US:'QKSMS' application-label-pt-PT:'QKSMS' application-label-en-AU:'QKSMS' application-label-zh-TW:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' provides-component:'app-widget' main other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'da' 'fa' 'ja' 'de' 'ne' 'th' 'zh' 'fi' 'hi' 'vi' 'sk' 'uk' 'nl' 'pl' 'tl' 'bn' 'in' 'ko' 'no' 'ro' 'ar' 'fr' 'hr' 'sr' 'tr' 'ur' 'cs' 'es' 'it' 'lt' 'pt' 'hu' 'ru' 'sv' 'iw' 'zh-CN' 'pt-BR' 'ca' 'ka' 'pa' 'ta' 'nb' 'be' 'te' 'af' 'bg' 'si' 'kk' 'mk' 'el' 'gl' 'ml' 'sl' 'am' 'km' 'kn' 'mn' 'lo' 'sq' 'mr' 'or' 'sr-Latn' 'as' 'bs' 'is' 'ms' 'et' 'eu' 'gu' 'zu' 'lv' 'sw' 'hy' 'ky' 'my' 'az' 'uz' 'en-CA' 'fr-CA' 'en-GB' 'en-XC' 'zh-HK' 'en-IN' 'es-US' 'pt-PT' 'en-AU' 'zh-TW' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.1/aapt-output-com.politedroid_3.txt0000644000175000017500000000263014620351225025461 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.1/aapt-output-com.politedroid_4.txt0000644000175000017500000000263014620351225025462 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.1/aapt-output-com.politedroid_5.txt0000644000175000017500000000171214620351225025463 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' platformBuildVersionName='' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.1/aapt-output-com.politedroid_6.txt0000644000175000017500000000174714620351225025474 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.1/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000314314620351225027631 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label:'Duplicate Permisssions' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='Duplicate Permisssions' icon='res/drawable/ic_launcher.png' banner='res/drawable/banner.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.software.leanback' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.1/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000160214620351225030005 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000125314620351225030120 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-label:'Caffeine Tile' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='Caffeine Tile' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.1/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000277114620351225027157 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.NFC' application-label:'OBB Main Old Version' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Old Version' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' uses-feature-not-required: name='android.hardware.bluetooth' uses-feature-not-required: name='android.hardware.nfc' uses-feature-not-required: name='android.hardware.telephony' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.hardware.wifi' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.1/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000135214620351225027126 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.1/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000135214620351225027130 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.1/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000135214620351225027132 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.1/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000127014620351225027011 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.1/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000131114620351225026501 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' platformBuildVersionName='' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label:'DroidTR keyboard' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR keyboard' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/22.0.1/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000312214620351225025535 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' platformBuildVersionName='' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-label:'Battery level' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='Battery level' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8963823 fdroidserver-2.3a1/tests/build-tools/23.0.0/0000755000175000017500000000000014620351546017127 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.0/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001460314620351225025165 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' platformBuildVersionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.CALL_PHONE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.READ_SMS' uses-permission: name='android.permission.READ_PHONE_STATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.RECEIVE_MMS' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_SMS' uses-permission: name='com.android.vending.BILLING' uses-permission: name='android.permission.INTERNET' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission: name='com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission: name='com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission: name='com.majeur.launcher.permission.UPDATE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='android.permission.READ_APP_BADGE' uses-permission: name='com.oppo.launcher.permission.READ_SETTINGS' uses-permission: name='com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_WRITE' application-label:'QKSMS' application-label-da:'QKSMS' application-label-fa:'QKSMS' application-label-ja:'QKSMS' application-label-de:'QKSMS' application-label-ne:'QKSMS' application-label-th:'QKSMS' application-label-zh:'QKSMS' application-label-fi:'QKSMS' application-label-hi:'QKSMS' application-label-vi:'QKSMS' application-label-sk:'QKSMS' application-label-uk:'QKSMS' application-label-nl:'QKSMS' application-label-pl:'QKSMS' application-label-tl:'QKSMS' application-label-bn:'QKSMS' application-label-in:'QKSMS' application-label-ko:'QKSMS' application-label-no:'QKSMS' application-label-ro:'QKSMS' application-label-ar:'QKSMS' application-label-fr:'QKSMS' application-label-hr:'QKSMS' application-label-sr:'QKSMS' application-label-tr:'QKSMS' application-label-ur:'QKSMS' application-label-cs:'QKSMS' application-label-es:'QKSMS' application-label-it:'QKSMS' application-label-lt:'QKSMS' application-label-pt:'QKSMS' application-label-hu:'QKSMS' application-label-ru:'QKSMS' application-label-sv:'QKSMS' application-label-iw:'QKSMS' application-label-zh-CN:'QKSMS' application-label-pt-BR:'QKSMS' application-label-ca:'QKSMS' application-label-ka:'QKSMS' application-label-pa:'QKSMS' application-label-ta:'QKSMS' application-label-nb:'QKSMS' application-label-be:'QKSMS' application-label-te:'QKSMS' application-label-af:'QKSMS' application-label-bg:'QKSMS' application-label-si:'QKSMS' application-label-kk:'QKSMS' application-label-mk:'QKSMS' application-label-el:'QKSMS' application-label-gl:'QKSMS' application-label-ml:'QKSMS' application-label-sl:'QKSMS' application-label-am:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-mn:'QKSMS' application-label-lo:'QKSMS' application-label-sq:'QKSMS' application-label-mr:'QKSMS' application-label-or:'QKSMS' application-label-sr-Latn:'QKSMS' application-label-as:'QKSMS' application-label-bs:'QKSMS' application-label-is:'QKSMS' application-label-ms:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-gu:'QKSMS' application-label-zu:'QKSMS' application-label-lv:'QKSMS' application-label-sw:'QKSMS' application-label-hy:'QKSMS' application-label-ky:'QKSMS' application-label-my:'QKSMS' application-label-az:'QKSMS' application-label-uz:'QKSMS' application-label-en-CA:'QKSMS' application-label-fr-CA:'QKSMS' application-label-en-GB:'QKSMS' application-label-en-XC:'QKSMS' application-label-zh-HK:'QKSMS' application-label-en-IN:'QKSMS' application-label-es-US:'QKSMS' application-label-pt-PT:'QKSMS' application-label-en-AU:'QKSMS' application-label-zh-TW:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' provides-component:'app-widget' main other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'da' 'fa' 'ja' 'de' 'ne' 'th' 'zh' 'fi' 'hi' 'vi' 'sk' 'uk' 'nl' 'pl' 'tl' 'bn' 'in' 'ko' 'no' 'ro' 'ar' 'fr' 'hr' 'sr' 'tr' 'ur' 'cs' 'es' 'it' 'lt' 'pt' 'hu' 'ru' 'sv' 'iw' 'zh-CN' 'pt-BR' 'ca' 'ka' 'pa' 'ta' 'nb' 'be' 'te' 'af' 'bg' 'si' 'kk' 'mk' 'el' 'gl' 'ml' 'sl' 'am' 'km' 'kn' 'mn' 'lo' 'sq' 'mr' 'or' 'sr-Latn' 'as' 'bs' 'is' 'ms' 'et' 'eu' 'gu' 'zu' 'lv' 'sw' 'hy' 'ky' 'my' 'az' 'uz' 'en-CA' 'fr-CA' 'en-GB' 'en-XC' 'zh-HK' 'en-IN' 'es-US' 'pt-PT' 'en-AU' 'zh-TW' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.0/aapt-output-com.politedroid_3.txt0000644000175000017500000000263014620351225025461 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.0/aapt-output-com.politedroid_4.txt0000644000175000017500000000263014620351225025462 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.0/aapt-output-com.politedroid_5.txt0000644000175000017500000000171214620351225025463 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' platformBuildVersionName='' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.0/aapt-output-com.politedroid_6.txt0000644000175000017500000000174714620351225025474 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.0/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000314314620351225027631 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label:'Duplicate Permisssions' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='Duplicate Permisssions' icon='res/drawable/ic_launcher.png' banner='res/drawable/banner.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.software.leanback' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.0/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000160214620351225030005 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000125314620351225030120 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-label:'Caffeine Tile' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='Caffeine Tile' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.0/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000277114620351225027157 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.NFC' application-label:'OBB Main Old Version' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Old Version' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' uses-feature-not-required: name='android.hardware.bluetooth' uses-feature-not-required: name='android.hardware.nfc' uses-feature-not-required: name='android.hardware.telephony' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.hardware.wifi' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.0/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000135214620351225027126 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.0/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000135214620351225027130 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.0/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000135214620351225027132 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.0/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000127014620351225027011 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.0/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000131114620351225026501 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' platformBuildVersionName='' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label:'DroidTR keyboard' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR keyboard' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.0/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000312214620351225025535 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' platformBuildVersionName='' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-label:'Battery level' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='Battery level' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8963823 fdroidserver-2.3a1/tests/build-tools/23.0.1/0000755000175000017500000000000014620351546017130 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.1/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001460314620351225025166 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' platformBuildVersionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.CALL_PHONE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.READ_SMS' uses-permission: name='android.permission.READ_PHONE_STATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.RECEIVE_MMS' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_SMS' uses-permission: name='com.android.vending.BILLING' uses-permission: name='android.permission.INTERNET' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission: name='com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission: name='com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission: name='com.majeur.launcher.permission.UPDATE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='android.permission.READ_APP_BADGE' uses-permission: name='com.oppo.launcher.permission.READ_SETTINGS' uses-permission: name='com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_WRITE' application-label:'QKSMS' application-label-da:'QKSMS' application-label-fa:'QKSMS' application-label-ja:'QKSMS' application-label-de:'QKSMS' application-label-ne:'QKSMS' application-label-th:'QKSMS' application-label-zh:'QKSMS' application-label-fi:'QKSMS' application-label-hi:'QKSMS' application-label-vi:'QKSMS' application-label-sk:'QKSMS' application-label-uk:'QKSMS' application-label-nl:'QKSMS' application-label-pl:'QKSMS' application-label-tl:'QKSMS' application-label-bn:'QKSMS' application-label-in:'QKSMS' application-label-ko:'QKSMS' application-label-no:'QKSMS' application-label-ro:'QKSMS' application-label-ar:'QKSMS' application-label-fr:'QKSMS' application-label-hr:'QKSMS' application-label-sr:'QKSMS' application-label-tr:'QKSMS' application-label-ur:'QKSMS' application-label-cs:'QKSMS' application-label-es:'QKSMS' application-label-it:'QKSMS' application-label-lt:'QKSMS' application-label-pt:'QKSMS' application-label-hu:'QKSMS' application-label-ru:'QKSMS' application-label-sv:'QKSMS' application-label-iw:'QKSMS' application-label-zh-CN:'QKSMS' application-label-pt-BR:'QKSMS' application-label-ca:'QKSMS' application-label-ka:'QKSMS' application-label-pa:'QKSMS' application-label-ta:'QKSMS' application-label-nb:'QKSMS' application-label-be:'QKSMS' application-label-te:'QKSMS' application-label-af:'QKSMS' application-label-bg:'QKSMS' application-label-si:'QKSMS' application-label-kk:'QKSMS' application-label-mk:'QKSMS' application-label-el:'QKSMS' application-label-gl:'QKSMS' application-label-ml:'QKSMS' application-label-sl:'QKSMS' application-label-am:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-mn:'QKSMS' application-label-lo:'QKSMS' application-label-sq:'QKSMS' application-label-mr:'QKSMS' application-label-or:'QKSMS' application-label-sr-Latn:'QKSMS' application-label-as:'QKSMS' application-label-bs:'QKSMS' application-label-is:'QKSMS' application-label-ms:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-gu:'QKSMS' application-label-zu:'QKSMS' application-label-lv:'QKSMS' application-label-sw:'QKSMS' application-label-hy:'QKSMS' application-label-ky:'QKSMS' application-label-my:'QKSMS' application-label-az:'QKSMS' application-label-uz:'QKSMS' application-label-en-CA:'QKSMS' application-label-fr-CA:'QKSMS' application-label-en-GB:'QKSMS' application-label-en-XC:'QKSMS' application-label-zh-HK:'QKSMS' application-label-en-IN:'QKSMS' application-label-es-US:'QKSMS' application-label-pt-PT:'QKSMS' application-label-en-AU:'QKSMS' application-label-zh-TW:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' provides-component:'app-widget' main other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'da' 'fa' 'ja' 'de' 'ne' 'th' 'zh' 'fi' 'hi' 'vi' 'sk' 'uk' 'nl' 'pl' 'tl' 'bn' 'in' 'ko' 'no' 'ro' 'ar' 'fr' 'hr' 'sr' 'tr' 'ur' 'cs' 'es' 'it' 'lt' 'pt' 'hu' 'ru' 'sv' 'iw' 'zh-CN' 'pt-BR' 'ca' 'ka' 'pa' 'ta' 'nb' 'be' 'te' 'af' 'bg' 'si' 'kk' 'mk' 'el' 'gl' 'ml' 'sl' 'am' 'km' 'kn' 'mn' 'lo' 'sq' 'mr' 'or' 'sr-Latn' 'as' 'bs' 'is' 'ms' 'et' 'eu' 'gu' 'zu' 'lv' 'sw' 'hy' 'ky' 'my' 'az' 'uz' 'en-CA' 'fr-CA' 'en-GB' 'en-XC' 'zh-HK' 'en-IN' 'es-US' 'pt-PT' 'en-AU' 'zh-TW' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.1/aapt-output-com.politedroid_3.txt0000644000175000017500000000263014620351225025462 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.1/aapt-output-com.politedroid_4.txt0000644000175000017500000000263014620351225025463 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.1/aapt-output-com.politedroid_5.txt0000644000175000017500000000171214620351225025464 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' platformBuildVersionName='' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.1/aapt-output-com.politedroid_6.txt0000644000175000017500000000174714620351225025475 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.1/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000314314620351225027632 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label:'Duplicate Permisssions' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='Duplicate Permisssions' icon='res/drawable/ic_launcher.png' banner='res/drawable/banner.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.software.leanback' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.1/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000160214620351225030006 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000125314620351225030121 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-label:'Caffeine Tile' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='Caffeine Tile' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.1/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000277114620351225027160 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.NFC' application-label:'OBB Main Old Version' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Old Version' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' uses-feature-not-required: name='android.hardware.bluetooth' uses-feature-not-required: name='android.hardware.nfc' uses-feature-not-required: name='android.hardware.telephony' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.hardware.wifi' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.1/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000135214620351225027127 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.1/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000135214620351225027131 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.1/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000135214620351225027133 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.1/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000127014620351225027012 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.1/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000131114620351225026502 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' platformBuildVersionName='' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label:'DroidTR keyboard' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR keyboard' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.1/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000312214620351225025536 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' platformBuildVersionName='' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-label:'Battery level' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='Battery level' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9083827 fdroidserver-2.3a1/tests/build-tools/23.0.2/0000755000175000017500000000000014620351546017131 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.2/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001460314620351225025167 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' platformBuildVersionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.CALL_PHONE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.READ_SMS' uses-permission: name='android.permission.READ_PHONE_STATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.RECEIVE_MMS' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_SMS' uses-permission: name='com.android.vending.BILLING' uses-permission: name='android.permission.INTERNET' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission: name='com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission: name='com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission: name='com.majeur.launcher.permission.UPDATE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='android.permission.READ_APP_BADGE' uses-permission: name='com.oppo.launcher.permission.READ_SETTINGS' uses-permission: name='com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_WRITE' application-label:'QKSMS' application-label-da:'QKSMS' application-label-fa:'QKSMS' application-label-ja:'QKSMS' application-label-de:'QKSMS' application-label-ne:'QKSMS' application-label-th:'QKSMS' application-label-zh:'QKSMS' application-label-fi:'QKSMS' application-label-hi:'QKSMS' application-label-vi:'QKSMS' application-label-sk:'QKSMS' application-label-uk:'QKSMS' application-label-nl:'QKSMS' application-label-pl:'QKSMS' application-label-tl:'QKSMS' application-label-bn:'QKSMS' application-label-in:'QKSMS' application-label-ko:'QKSMS' application-label-no:'QKSMS' application-label-ro:'QKSMS' application-label-ar:'QKSMS' application-label-fr:'QKSMS' application-label-hr:'QKSMS' application-label-sr:'QKSMS' application-label-tr:'QKSMS' application-label-ur:'QKSMS' application-label-cs:'QKSMS' application-label-es:'QKSMS' application-label-it:'QKSMS' application-label-lt:'QKSMS' application-label-pt:'QKSMS' application-label-hu:'QKSMS' application-label-ru:'QKSMS' application-label-sv:'QKSMS' application-label-iw:'QKSMS' application-label-zh-CN:'QKSMS' application-label-pt-BR:'QKSMS' application-label-ca:'QKSMS' application-label-ka:'QKSMS' application-label-pa:'QKSMS' application-label-ta:'QKSMS' application-label-nb:'QKSMS' application-label-be:'QKSMS' application-label-te:'QKSMS' application-label-af:'QKSMS' application-label-bg:'QKSMS' application-label-si:'QKSMS' application-label-kk:'QKSMS' application-label-mk:'QKSMS' application-label-el:'QKSMS' application-label-gl:'QKSMS' application-label-ml:'QKSMS' application-label-sl:'QKSMS' application-label-am:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-mn:'QKSMS' application-label-lo:'QKSMS' application-label-sq:'QKSMS' application-label-mr:'QKSMS' application-label-or:'QKSMS' application-label-sr-Latn:'QKSMS' application-label-as:'QKSMS' application-label-bs:'QKSMS' application-label-is:'QKSMS' application-label-ms:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-gu:'QKSMS' application-label-zu:'QKSMS' application-label-lv:'QKSMS' application-label-sw:'QKSMS' application-label-hy:'QKSMS' application-label-ky:'QKSMS' application-label-my:'QKSMS' application-label-az:'QKSMS' application-label-uz:'QKSMS' application-label-en-CA:'QKSMS' application-label-fr-CA:'QKSMS' application-label-en-GB:'QKSMS' application-label-en-XC:'QKSMS' application-label-zh-HK:'QKSMS' application-label-en-IN:'QKSMS' application-label-es-US:'QKSMS' application-label-pt-PT:'QKSMS' application-label-en-AU:'QKSMS' application-label-zh-TW:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' provides-component:'app-widget' main other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'da' 'fa' 'ja' 'de' 'ne' 'th' 'zh' 'fi' 'hi' 'vi' 'sk' 'uk' 'nl' 'pl' 'tl' 'bn' 'in' 'ko' 'no' 'ro' 'ar' 'fr' 'hr' 'sr' 'tr' 'ur' 'cs' 'es' 'it' 'lt' 'pt' 'hu' 'ru' 'sv' 'iw' 'zh-CN' 'pt-BR' 'ca' 'ka' 'pa' 'ta' 'nb' 'be' 'te' 'af' 'bg' 'si' 'kk' 'mk' 'el' 'gl' 'ml' 'sl' 'am' 'km' 'kn' 'mn' 'lo' 'sq' 'mr' 'or' 'sr-Latn' 'as' 'bs' 'is' 'ms' 'et' 'eu' 'gu' 'zu' 'lv' 'sw' 'hy' 'ky' 'my' 'az' 'uz' 'en-CA' 'fr-CA' 'en-GB' 'en-XC' 'zh-HK' 'en-IN' 'es-US' 'pt-PT' 'en-AU' 'zh-TW' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.2/aapt-output-com.politedroid_3.txt0000644000175000017500000000263014620351225025463 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.2/aapt-output-com.politedroid_4.txt0000644000175000017500000000263014620351225025464 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.2/aapt-output-com.politedroid_5.txt0000644000175000017500000000171214620351225025465 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' platformBuildVersionName='' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.2/aapt-output-com.politedroid_6.txt0000644000175000017500000000174714620351225025476 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.2/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000314314620351225027633 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label:'Duplicate Permisssions' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='Duplicate Permisssions' icon='res/drawable/ic_launcher.png' banner='res/drawable/banner.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.software.leanback' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.2/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000160214620351225030007 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.2/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000125314620351225030122 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-label:'Caffeine Tile' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='Caffeine Tile' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.2/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000277114620351225027161 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.NFC' application-label:'OBB Main Old Version' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Old Version' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' uses-feature-not-required: name='android.hardware.bluetooth' uses-feature-not-required: name='android.hardware.nfc' uses-feature-not-required: name='android.hardware.telephony' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.hardware.wifi' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.2/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000135214620351225027130 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.2/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000135214620351225027132 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.2/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000135214620351225027134 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.2/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000127014620351225027013 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.2/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000131114620351225026503 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' platformBuildVersionName='' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label:'DroidTR keyboard' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR keyboard' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.2/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000312214620351225025537 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' platformBuildVersionName='' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-label:'Battery level' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='Battery level' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9083827 fdroidserver-2.3a1/tests/build-tools/23.0.3/0000755000175000017500000000000014620351546017132 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.3/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001460314620351225025170 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' platformBuildVersionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.CALL_PHONE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.READ_SMS' uses-permission: name='android.permission.READ_PHONE_STATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.RECEIVE_MMS' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_SMS' uses-permission: name='com.android.vending.BILLING' uses-permission: name='android.permission.INTERNET' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission: name='com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission: name='com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission: name='com.majeur.launcher.permission.UPDATE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='android.permission.READ_APP_BADGE' uses-permission: name='com.oppo.launcher.permission.READ_SETTINGS' uses-permission: name='com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_WRITE' application-label:'QKSMS' application-label-da:'QKSMS' application-label-fa:'QKSMS' application-label-ja:'QKSMS' application-label-de:'QKSMS' application-label-ne:'QKSMS' application-label-th:'QKSMS' application-label-zh:'QKSMS' application-label-fi:'QKSMS' application-label-hi:'QKSMS' application-label-vi:'QKSMS' application-label-sk:'QKSMS' application-label-uk:'QKSMS' application-label-nl:'QKSMS' application-label-pl:'QKSMS' application-label-tl:'QKSMS' application-label-bn:'QKSMS' application-label-in:'QKSMS' application-label-ko:'QKSMS' application-label-no:'QKSMS' application-label-ro:'QKSMS' application-label-ar:'QKSMS' application-label-fr:'QKSMS' application-label-hr:'QKSMS' application-label-sr:'QKSMS' application-label-tr:'QKSMS' application-label-ur:'QKSMS' application-label-cs:'QKSMS' application-label-es:'QKSMS' application-label-it:'QKSMS' application-label-lt:'QKSMS' application-label-pt:'QKSMS' application-label-hu:'QKSMS' application-label-ru:'QKSMS' application-label-sv:'QKSMS' application-label-iw:'QKSMS' application-label-zh-CN:'QKSMS' application-label-pt-BR:'QKSMS' application-label-ca:'QKSMS' application-label-ka:'QKSMS' application-label-pa:'QKSMS' application-label-ta:'QKSMS' application-label-nb:'QKSMS' application-label-be:'QKSMS' application-label-te:'QKSMS' application-label-af:'QKSMS' application-label-bg:'QKSMS' application-label-si:'QKSMS' application-label-kk:'QKSMS' application-label-mk:'QKSMS' application-label-el:'QKSMS' application-label-gl:'QKSMS' application-label-ml:'QKSMS' application-label-sl:'QKSMS' application-label-am:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-mn:'QKSMS' application-label-lo:'QKSMS' application-label-sq:'QKSMS' application-label-mr:'QKSMS' application-label-or:'QKSMS' application-label-sr-Latn:'QKSMS' application-label-as:'QKSMS' application-label-bs:'QKSMS' application-label-is:'QKSMS' application-label-ms:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-gu:'QKSMS' application-label-zu:'QKSMS' application-label-lv:'QKSMS' application-label-sw:'QKSMS' application-label-hy:'QKSMS' application-label-ky:'QKSMS' application-label-my:'QKSMS' application-label-az:'QKSMS' application-label-uz:'QKSMS' application-label-en-CA:'QKSMS' application-label-fr-CA:'QKSMS' application-label-en-GB:'QKSMS' application-label-en-XC:'QKSMS' application-label-zh-HK:'QKSMS' application-label-en-IN:'QKSMS' application-label-es-US:'QKSMS' application-label-pt-PT:'QKSMS' application-label-en-AU:'QKSMS' application-label-zh-TW:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' provides-component:'app-widget' main other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'da' 'fa' 'ja' 'de' 'ne' 'th' 'zh' 'fi' 'hi' 'vi' 'sk' 'uk' 'nl' 'pl' 'tl' 'bn' 'in' 'ko' 'no' 'ro' 'ar' 'fr' 'hr' 'sr' 'tr' 'ur' 'cs' 'es' 'it' 'lt' 'pt' 'hu' 'ru' 'sv' 'iw' 'zh-CN' 'pt-BR' 'ca' 'ka' 'pa' 'ta' 'nb' 'be' 'te' 'af' 'bg' 'si' 'kk' 'mk' 'el' 'gl' 'ml' 'sl' 'am' 'km' 'kn' 'mn' 'lo' 'sq' 'mr' 'or' 'sr-Latn' 'as' 'bs' 'is' 'ms' 'et' 'eu' 'gu' 'zu' 'lv' 'sw' 'hy' 'ky' 'my' 'az' 'uz' 'en-CA' 'fr-CA' 'en-GB' 'en-XC' 'zh-HK' 'en-IN' 'es-US' 'pt-PT' 'en-AU' 'zh-TW' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.3/aapt-output-com.politedroid_3.txt0000644000175000017500000000263014620351225025464 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.3/aapt-output-com.politedroid_4.txt0000644000175000017500000000263014620351225025465 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.3/aapt-output-com.politedroid_5.txt0000644000175000017500000000171214620351225025466 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' platformBuildVersionName='' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.3/aapt-output-com.politedroid_6.txt0000644000175000017500000000174714620351225025477 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.3/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000343014620351225027633 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission-sdk-23: name='android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS' maxSdkVersion='27' uses-permission-sdk-23: name='android.permission.REQUEST_INSTALL_PACKAGES' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label:'Duplicate Permisssions' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='Duplicate Permisssions' icon='res/drawable/ic_launcher.png' banner='res/drawable/banner.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.software.leanback' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.3/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000160214620351225030010 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.3/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000125314620351225030123 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-label:'Caffeine Tile' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='Caffeine Tile' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.3/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000322614620351225027156 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission-sdk-23: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission-sdk-23: name='android.permission.WRITE_SETTINGS' maxSdkVersion='25' uses-permission: name='android.permission.NFC' application-label:'OBB Main Old Version' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Old Version' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' uses-feature-not-required: name='android.hardware.bluetooth' uses-feature-not-required: name='android.hardware.nfc' uses-feature-not-required: name='android.hardware.telephony' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.hardware.wifi' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.3/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000135214620351225027131 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.3/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000135214620351225027133 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.3/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000135214620351225027135 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.3/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000127014620351225027014 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.3/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000131114620351225026504 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' platformBuildVersionName='' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label:'DroidTR keyboard' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR keyboard' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/23.0.3/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000312214620351225025540 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' platformBuildVersionName='' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-label:'Battery level' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='Battery level' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9083827 fdroidserver-2.3a1/tests/build-tools/24.0.0/0000755000175000017500000000000014620351546017130 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.0/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001454114620351225025167 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' platformBuildVersionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.CALL_PHONE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.READ_SMS' uses-permission: name='android.permission.READ_PHONE_STATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.RECEIVE_MMS' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_SMS' uses-permission: name='com.android.vending.BILLING' uses-permission: name='android.permission.INTERNET' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission: name='com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission: name='com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission: name='com.majeur.launcher.permission.UPDATE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='android.permission.READ_APP_BADGE' uses-permission: name='com.oppo.launcher.permission.READ_SETTINGS' uses-permission: name='com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_WRITE' application-label-af:'QKSMS' application-label-am:'QKSMS' application-label-ar:'QKSMS' application-label-as:'QKSMS' application-label-az:'QKSMS' application-label-be:'QKSMS' application-label-bg:'QKSMS' application-label-bn:'QKSMS' application-label-bs:'QKSMS' application-label-ca:'QKSMS' application-label-cs:'QKSMS' application-label-da:'QKSMS' application-label-de:'QKSMS' application-label-el:'QKSMS' application-label-en-AU:'QKSMS' application-label-en-CA:'QKSMS' application-label-en-GB:'QKSMS' application-label-en-IN:'QKSMS' application-label-en-XC:'QKSMS' application-label-es:'QKSMS' application-label-es-US:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-fa:'QKSMS' application-label-fi:'QKSMS' application-label-fr:'QKSMS' application-label-fr-CA:'QKSMS' application-label-gl:'QKSMS' application-label-gu:'QKSMS' application-label-hi:'QKSMS' application-label-hr:'QKSMS' application-label-hu:'QKSMS' application-label-hy:'QKSMS' application-label-in:'QKSMS' application-label-is:'QKSMS' application-label-it:'QKSMS' application-label-iw:'QKSMS' application-label-ja:'QKSMS' application-label-ka:'QKSMS' application-label-kk:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-ko:'QKSMS' application-label-ky:'QKSMS' application-label-lo:'QKSMS' application-label-lt:'QKSMS' application-label-lv:'QKSMS' application-label-mk:'QKSMS' application-label-ml:'QKSMS' application-label-mn:'QKSMS' application-label-mr:'QKSMS' application-label-ms:'QKSMS' application-label-my:'QKSMS' application-label-nb:'QKSMS' application-label-ne:'QKSMS' application-label-nl:'QKSMS' application-label-no:'QKSMS' application-label-or:'QKSMS' application-label-pa:'QKSMS' application-label-pl:'QKSMS' application-label-pt:'QKSMS' application-label-pt-BR:'QKSMS' application-label-pt-PT:'QKSMS' application-label-ro:'QKSMS' application-label-ru:'QKSMS' application-label-si:'QKSMS' application-label-sk:'QKSMS' application-label-sl:'QKSMS' application-label-sq:'QKSMS' application-label-sr:'QKSMS' application-label-sr-Latn:'QKSMS' application-label-sv:'QKSMS' application-label-sw:'QKSMS' application-label-ta:'QKSMS' application-label-te:'QKSMS' application-label-th:'QKSMS' application-label-tl:'QKSMS' application-label-tr:'QKSMS' application-label-uk:'QKSMS' application-label-ur:'QKSMS' application-label-uz:'QKSMS' application-label-vi:'QKSMS' application-label-zh:'QKSMS' application-label-zh-CN:'QKSMS' application-label-zh-HK:'QKSMS' application-label-zh-TW:'QKSMS' application-label-zu:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' provides-component:'app-widget' main other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: 'af' 'am' 'ar' 'as' 'az' 'be' 'bg' 'bn' 'bs' 'ca' 'cs' 'da' 'de' 'el' 'en-AU' 'en-CA' 'en-GB' 'en-IN' 'en-XC' 'es' 'es-US' 'et' 'eu' 'fa' 'fi' 'fr' 'fr-CA' 'gl' 'gu' 'hi' 'hr' 'hu' 'hy' 'in' 'is' 'it' 'iw' 'ja' 'ka' 'kk' 'km' 'kn' 'ko' 'ky' 'lo' 'lt' 'lv' 'mk' 'ml' 'mn' 'mr' 'ms' 'my' 'nb' 'ne' 'nl' 'no' 'or' 'pa' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'si' 'sk' 'sl' 'sq' 'sr' 'sr-Latn' 'sv' 'sw' 'ta' 'te' 'th' 'tl' 'tr' 'uk' 'ur' 'uz' 'vi' 'zh' 'zh-CN' 'zh-HK' 'zh-TW' 'zu' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.0/aapt-output-com.politedroid_3.txt0000644000175000017500000000254314620351225025465 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.0/aapt-output-com.politedroid_4.txt0000644000175000017500000000254314620351225025466 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.0/aapt-output-com.politedroid_5.txt0000644000175000017500000000162514620351225025467 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' platformBuildVersionName='' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.0/aapt-output-com.politedroid_6.txt0000644000175000017500000000166214620351225025471 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.0/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000334614620351225027637 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission-sdk-23: name='android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS' maxSdkVersion='27' uses-permission-sdk-23: name='android.permission.REQUEST_INSTALL_PACKAGES' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='أذونات مكررة' icon='res/drawable/ic_launcher.png' banner='res/drawable/banner.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.software.leanback' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.0/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000132714620351225030012 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000116414620351225030122 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.0/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000312114620351225027146 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission-sdk-23: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission-sdk-23: name='android.permission.WRITE_SETTINGS' maxSdkVersion='25' uses-permission: name='android.permission.NFC' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' uses-feature-not-required: name='android.hardware.bluetooth' uses-feature-not-required: name='android.hardware.nfc' uses-feature-not-required: name='android.hardware.telephony' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.hardware.wifi' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.0/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000124314620351225027126 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.0/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000124314620351225027130 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.0/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000124314620351225027132 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.0/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000122114620351225027006 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.0/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000123214620351225026504 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' platformBuildVersionName='' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR Klavye' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.0/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000303314620351225025537 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' platformBuildVersionName='' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9123828 fdroidserver-2.3a1/tests/build-tools/24.0.1/0000755000175000017500000000000014620351546017131 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.1/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001454114620351225025170 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' platformBuildVersionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.CALL_PHONE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.READ_SMS' uses-permission: name='android.permission.READ_PHONE_STATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.RECEIVE_MMS' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_SMS' uses-permission: name='com.android.vending.BILLING' uses-permission: name='android.permission.INTERNET' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission: name='com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission: name='com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission: name='com.majeur.launcher.permission.UPDATE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='android.permission.READ_APP_BADGE' uses-permission: name='com.oppo.launcher.permission.READ_SETTINGS' uses-permission: name='com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_WRITE' application-label-af:'QKSMS' application-label-am:'QKSMS' application-label-ar:'QKSMS' application-label-as:'QKSMS' application-label-az:'QKSMS' application-label-be:'QKSMS' application-label-bg:'QKSMS' application-label-bn:'QKSMS' application-label-bs:'QKSMS' application-label-ca:'QKSMS' application-label-cs:'QKSMS' application-label-da:'QKSMS' application-label-de:'QKSMS' application-label-el:'QKSMS' application-label-en-AU:'QKSMS' application-label-en-CA:'QKSMS' application-label-en-GB:'QKSMS' application-label-en-IN:'QKSMS' application-label-en-XC:'QKSMS' application-label-es:'QKSMS' application-label-es-US:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-fa:'QKSMS' application-label-fi:'QKSMS' application-label-fr:'QKSMS' application-label-fr-CA:'QKSMS' application-label-gl:'QKSMS' application-label-gu:'QKSMS' application-label-hi:'QKSMS' application-label-hr:'QKSMS' application-label-hu:'QKSMS' application-label-hy:'QKSMS' application-label-in:'QKSMS' application-label-is:'QKSMS' application-label-it:'QKSMS' application-label-iw:'QKSMS' application-label-ja:'QKSMS' application-label-ka:'QKSMS' application-label-kk:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-ko:'QKSMS' application-label-ky:'QKSMS' application-label-lo:'QKSMS' application-label-lt:'QKSMS' application-label-lv:'QKSMS' application-label-mk:'QKSMS' application-label-ml:'QKSMS' application-label-mn:'QKSMS' application-label-mr:'QKSMS' application-label-ms:'QKSMS' application-label-my:'QKSMS' application-label-nb:'QKSMS' application-label-ne:'QKSMS' application-label-nl:'QKSMS' application-label-no:'QKSMS' application-label-or:'QKSMS' application-label-pa:'QKSMS' application-label-pl:'QKSMS' application-label-pt:'QKSMS' application-label-pt-BR:'QKSMS' application-label-pt-PT:'QKSMS' application-label-ro:'QKSMS' application-label-ru:'QKSMS' application-label-si:'QKSMS' application-label-sk:'QKSMS' application-label-sl:'QKSMS' application-label-sq:'QKSMS' application-label-sr:'QKSMS' application-label-sr-Latn:'QKSMS' application-label-sv:'QKSMS' application-label-sw:'QKSMS' application-label-ta:'QKSMS' application-label-te:'QKSMS' application-label-th:'QKSMS' application-label-tl:'QKSMS' application-label-tr:'QKSMS' application-label-uk:'QKSMS' application-label-ur:'QKSMS' application-label-uz:'QKSMS' application-label-vi:'QKSMS' application-label-zh:'QKSMS' application-label-zh-CN:'QKSMS' application-label-zh-HK:'QKSMS' application-label-zh-TW:'QKSMS' application-label-zu:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' provides-component:'app-widget' main other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: 'af' 'am' 'ar' 'as' 'az' 'be' 'bg' 'bn' 'bs' 'ca' 'cs' 'da' 'de' 'el' 'en-AU' 'en-CA' 'en-GB' 'en-IN' 'en-XC' 'es' 'es-US' 'et' 'eu' 'fa' 'fi' 'fr' 'fr-CA' 'gl' 'gu' 'hi' 'hr' 'hu' 'hy' 'in' 'is' 'it' 'iw' 'ja' 'ka' 'kk' 'km' 'kn' 'ko' 'ky' 'lo' 'lt' 'lv' 'mk' 'ml' 'mn' 'mr' 'ms' 'my' 'nb' 'ne' 'nl' 'no' 'or' 'pa' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'si' 'sk' 'sl' 'sq' 'sr' 'sr-Latn' 'sv' 'sw' 'ta' 'te' 'th' 'tl' 'tr' 'uk' 'ur' 'uz' 'vi' 'zh' 'zh-CN' 'zh-HK' 'zh-TW' 'zu' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.1/aapt-output-com.politedroid_3.txt0000644000175000017500000000254314620351225025466 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.1/aapt-output-com.politedroid_4.txt0000644000175000017500000000254314620351225025467 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.1/aapt-output-com.politedroid_5.txt0000644000175000017500000000162514620351225025470 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' platformBuildVersionName='' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.1/aapt-output-com.politedroid_6.txt0000644000175000017500000000166214620351225025472 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.1/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000334614620351225027640 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission-sdk-23: name='android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS' maxSdkVersion='27' uses-permission-sdk-23: name='android.permission.REQUEST_INSTALL_PACKAGES' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='أذونات مكررة' icon='res/drawable/ic_launcher.png' banner='res/drawable/banner.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.software.leanback' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.1/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000132714620351225030013 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000116414620351225030123 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.1/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000312114620351225027147 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission-sdk-23: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission-sdk-23: name='android.permission.WRITE_SETTINGS' maxSdkVersion='25' uses-permission: name='android.permission.NFC' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' uses-feature-not-required: name='android.hardware.bluetooth' uses-feature-not-required: name='android.hardware.nfc' uses-feature-not-required: name='android.hardware.telephony' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.hardware.wifi' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.1/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000124314620351225027127 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.1/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000124314620351225027131 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.1/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000124314620351225027133 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.1/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000122114620351225027007 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.1/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000123214620351225026505 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' platformBuildVersionName='' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR Klavye' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.1/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000303314620351225025540 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' platformBuildVersionName='' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' uses-feature: name='android.hardware.touchscreen' uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9123828 fdroidserver-2.3a1/tests/build-tools/24.0.2/0000755000175000017500000000000014620351546017132 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.2/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001453514620351225025174 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' platformBuildVersionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.CALL_PHONE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.READ_SMS' uses-permission: name='android.permission.READ_PHONE_STATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.RECEIVE_MMS' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_SMS' uses-permission: name='com.android.vending.BILLING' uses-permission: name='android.permission.INTERNET' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission: name='com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission: name='com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission: name='com.majeur.launcher.permission.UPDATE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='android.permission.READ_APP_BADGE' uses-permission: name='com.oppo.launcher.permission.READ_SETTINGS' uses-permission: name='com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_WRITE' application-label-af:'QKSMS' application-label-am:'QKSMS' application-label-ar:'QKSMS' application-label-as:'QKSMS' application-label-az:'QKSMS' application-label-be:'QKSMS' application-label-bg:'QKSMS' application-label-bn:'QKSMS' application-label-bs:'QKSMS' application-label-ca:'QKSMS' application-label-cs:'QKSMS' application-label-da:'QKSMS' application-label-de:'QKSMS' application-label-el:'QKSMS' application-label-en-AU:'QKSMS' application-label-en-CA:'QKSMS' application-label-en-GB:'QKSMS' application-label-en-IN:'QKSMS' application-label-en-XC:'QKSMS' application-label-es:'QKSMS' application-label-es-US:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-fa:'QKSMS' application-label-fi:'QKSMS' application-label-fr:'QKSMS' application-label-fr-CA:'QKSMS' application-label-gl:'QKSMS' application-label-gu:'QKSMS' application-label-hi:'QKSMS' application-label-hr:'QKSMS' application-label-hu:'QKSMS' application-label-hy:'QKSMS' application-label-in:'QKSMS' application-label-is:'QKSMS' application-label-it:'QKSMS' application-label-iw:'QKSMS' application-label-ja:'QKSMS' application-label-ka:'QKSMS' application-label-kk:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-ko:'QKSMS' application-label-ky:'QKSMS' application-label-lo:'QKSMS' application-label-lt:'QKSMS' application-label-lv:'QKSMS' application-label-mk:'QKSMS' application-label-ml:'QKSMS' application-label-mn:'QKSMS' application-label-mr:'QKSMS' application-label-ms:'QKSMS' application-label-my:'QKSMS' application-label-nb:'QKSMS' application-label-ne:'QKSMS' application-label-nl:'QKSMS' application-label-no:'QKSMS' application-label-or:'QKSMS' application-label-pa:'QKSMS' application-label-pl:'QKSMS' application-label-pt:'QKSMS' application-label-pt-BR:'QKSMS' application-label-pt-PT:'QKSMS' application-label-ro:'QKSMS' application-label-ru:'QKSMS' application-label-si:'QKSMS' application-label-sk:'QKSMS' application-label-sl:'QKSMS' application-label-sq:'QKSMS' application-label-sr:'QKSMS' application-label-sr-Latn:'QKSMS' application-label-sv:'QKSMS' application-label-sw:'QKSMS' application-label-ta:'QKSMS' application-label-te:'QKSMS' application-label-th:'QKSMS' application-label-tl:'QKSMS' application-label-tr:'QKSMS' application-label-uk:'QKSMS' application-label-ur:'QKSMS' application-label-uz:'QKSMS' application-label-vi:'QKSMS' application-label-zh:'QKSMS' application-label-zh-CN:'QKSMS' application-label-zh-HK:'QKSMS' application-label-zh-TW:'QKSMS' application-label-zu:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' provides-component:'app-widget' main other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: 'af' 'am' 'ar' 'as' 'az' 'be' 'bg' 'bn' 'bs' 'ca' 'cs' 'da' 'de' 'el' 'en-AU' 'en-CA' 'en-GB' 'en-IN' 'en-XC' 'es' 'es-US' 'et' 'eu' 'fa' 'fi' 'fr' 'fr-CA' 'gl' 'gu' 'hi' 'hr' 'hu' 'hy' 'in' 'is' 'it' 'iw' 'ja' 'ka' 'kk' 'km' 'kn' 'ko' 'ky' 'lo' 'lt' 'lv' 'mk' 'ml' 'mn' 'mr' 'ms' 'my' 'nb' 'ne' 'nl' 'no' 'or' 'pa' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'si' 'sk' 'sl' 'sq' 'sr' 'sr-Latn' 'sv' 'sw' 'ta' 'te' 'th' 'tl' 'tr' 'uk' 'ur' 'uz' 'vi' 'zh' 'zh-CN' 'zh-HK' 'zh-TW' 'zu' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.2/aapt-output-com.politedroid_3.txt0000644000175000017500000000253714620351225025472 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.2/aapt-output-com.politedroid_4.txt0000644000175000017500000000253714620351225025473 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.2/aapt-output-com.politedroid_5.txt0000644000175000017500000000162114620351225025465 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' platformBuildVersionName='' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.2/aapt-output-com.politedroid_6.txt0000644000175000017500000000165614620351225025476 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.2/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000334614620351225027641 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission-sdk-23: name='android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS' maxSdkVersion='27' uses-permission-sdk-23: name='android.permission.REQUEST_INSTALL_PACKAGES' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='أذونات مكررة' icon='res/drawable/ic_launcher.png' banner='res/drawable/banner.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.software.leanback' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.2/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000132314620351225030010 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.2/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000116014620351225030120 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.2/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000312114620351225027150 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission-sdk-23: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission-sdk-23: name='android.permission.WRITE_SETTINGS' maxSdkVersion='25' uses-permission: name='android.permission.NFC' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' uses-feature-not-required: name='android.hardware.bluetooth' uses-feature-not-required: name='android.hardware.nfc' uses-feature-not-required: name='android.hardware.telephony' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.hardware.wifi' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.2/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000123714620351225027133 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.2/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000123714620351225027135 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.2/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000123714620351225027137 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.2/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000121514620351225027013 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.2/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000122614620351225026511 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' platformBuildVersionName='' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR Klavye' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.2/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000302714620351225025544 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' platformBuildVersionName='' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9123828 fdroidserver-2.3a1/tests/build-tools/24.0.3/0000755000175000017500000000000014620351546017133 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.3/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001453514620351225025175 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' platformBuildVersionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.CALL_PHONE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.READ_SMS' uses-permission: name='android.permission.READ_PHONE_STATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.RECEIVE_MMS' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_SMS' uses-permission: name='com.android.vending.BILLING' uses-permission: name='android.permission.INTERNET' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission: name='com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission: name='com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission: name='com.majeur.launcher.permission.UPDATE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='android.permission.READ_APP_BADGE' uses-permission: name='com.oppo.launcher.permission.READ_SETTINGS' uses-permission: name='com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_WRITE' application-label-af:'QKSMS' application-label-am:'QKSMS' application-label-ar:'QKSMS' application-label-as:'QKSMS' application-label-az:'QKSMS' application-label-be:'QKSMS' application-label-bg:'QKSMS' application-label-bn:'QKSMS' application-label-bs:'QKSMS' application-label-ca:'QKSMS' application-label-cs:'QKSMS' application-label-da:'QKSMS' application-label-de:'QKSMS' application-label-el:'QKSMS' application-label-en-AU:'QKSMS' application-label-en-CA:'QKSMS' application-label-en-GB:'QKSMS' application-label-en-IN:'QKSMS' application-label-en-XC:'QKSMS' application-label-es:'QKSMS' application-label-es-US:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-fa:'QKSMS' application-label-fi:'QKSMS' application-label-fr:'QKSMS' application-label-fr-CA:'QKSMS' application-label-gl:'QKSMS' application-label-gu:'QKSMS' application-label-hi:'QKSMS' application-label-hr:'QKSMS' application-label-hu:'QKSMS' application-label-hy:'QKSMS' application-label-in:'QKSMS' application-label-is:'QKSMS' application-label-it:'QKSMS' application-label-iw:'QKSMS' application-label-ja:'QKSMS' application-label-ka:'QKSMS' application-label-kk:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-ko:'QKSMS' application-label-ky:'QKSMS' application-label-lo:'QKSMS' application-label-lt:'QKSMS' application-label-lv:'QKSMS' application-label-mk:'QKSMS' application-label-ml:'QKSMS' application-label-mn:'QKSMS' application-label-mr:'QKSMS' application-label-ms:'QKSMS' application-label-my:'QKSMS' application-label-nb:'QKSMS' application-label-ne:'QKSMS' application-label-nl:'QKSMS' application-label-no:'QKSMS' application-label-or:'QKSMS' application-label-pa:'QKSMS' application-label-pl:'QKSMS' application-label-pt:'QKSMS' application-label-pt-BR:'QKSMS' application-label-pt-PT:'QKSMS' application-label-ro:'QKSMS' application-label-ru:'QKSMS' application-label-si:'QKSMS' application-label-sk:'QKSMS' application-label-sl:'QKSMS' application-label-sq:'QKSMS' application-label-sr:'QKSMS' application-label-sr-Latn:'QKSMS' application-label-sv:'QKSMS' application-label-sw:'QKSMS' application-label-ta:'QKSMS' application-label-te:'QKSMS' application-label-th:'QKSMS' application-label-tl:'QKSMS' application-label-tr:'QKSMS' application-label-uk:'QKSMS' application-label-ur:'QKSMS' application-label-uz:'QKSMS' application-label-vi:'QKSMS' application-label-zh:'QKSMS' application-label-zh-CN:'QKSMS' application-label-zh-HK:'QKSMS' application-label-zh-TW:'QKSMS' application-label-zu:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' provides-component:'app-widget' main other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: 'af' 'am' 'ar' 'as' 'az' 'be' 'bg' 'bn' 'bs' 'ca' 'cs' 'da' 'de' 'el' 'en-AU' 'en-CA' 'en-GB' 'en-IN' 'en-XC' 'es' 'es-US' 'et' 'eu' 'fa' 'fi' 'fr' 'fr-CA' 'gl' 'gu' 'hi' 'hr' 'hu' 'hy' 'in' 'is' 'it' 'iw' 'ja' 'ka' 'kk' 'km' 'kn' 'ko' 'ky' 'lo' 'lt' 'lv' 'mk' 'ml' 'mn' 'mr' 'ms' 'my' 'nb' 'ne' 'nl' 'no' 'or' 'pa' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'si' 'sk' 'sl' 'sq' 'sr' 'sr-Latn' 'sv' 'sw' 'ta' 'te' 'th' 'tl' 'tr' 'uk' 'ur' 'uz' 'vi' 'zh' 'zh-CN' 'zh-HK' 'zh-TW' 'zu' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.3/aapt-output-com.politedroid_3.txt0000644000175000017500000000253714620351225025473 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.3/aapt-output-com.politedroid_4.txt0000644000175000017500000000253714620351225025474 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.3/aapt-output-com.politedroid_5.txt0000644000175000017500000000162114620351225025466 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' platformBuildVersionName='' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.3/aapt-output-com.politedroid_6.txt0000644000175000017500000000165614620351225025477 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.3/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000334614620351225027642 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission-sdk-23: name='android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS' maxSdkVersion='27' uses-permission-sdk-23: name='android.permission.REQUEST_INSTALL_PACKAGES' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='أذونات مكررة' icon='res/drawable/ic_launcher.png' banner='res/drawable/banner.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.software.leanback' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.3/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000132314620351225030011 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.3/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000116014620351225030121 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.3/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000312114620351225027151 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission-sdk-23: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission-sdk-23: name='android.permission.WRITE_SETTINGS' maxSdkVersion='25' uses-permission: name='android.permission.NFC' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' uses-feature-not-required: name='android.hardware.bluetooth' uses-feature-not-required: name='android.hardware.nfc' uses-feature-not-required: name='android.hardware.telephony' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.hardware.wifi' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.3/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000123714620351225027134 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.3/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000123714620351225027136 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.3/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000123714620351225027140 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.3/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000121514620351225027014 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.3/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000122614620351225026512 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' platformBuildVersionName='' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR Klavye' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/24.0.3/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000302714620351225025545 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' platformBuildVersionName='' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9123828 fdroidserver-2.3a1/tests/build-tools/25.0.0/0000755000175000017500000000000014620351546017131 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.0/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001453514620351225025173 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' platformBuildVersionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.CALL_PHONE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.READ_SMS' uses-permission: name='android.permission.READ_PHONE_STATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.RECEIVE_MMS' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_SMS' uses-permission: name='com.android.vending.BILLING' uses-permission: name='android.permission.INTERNET' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission: name='com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission: name='com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission: name='com.majeur.launcher.permission.UPDATE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='android.permission.READ_APP_BADGE' uses-permission: name='com.oppo.launcher.permission.READ_SETTINGS' uses-permission: name='com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_WRITE' application-label-af:'QKSMS' application-label-am:'QKSMS' application-label-ar:'QKSMS' application-label-as:'QKSMS' application-label-az:'QKSMS' application-label-be:'QKSMS' application-label-bg:'QKSMS' application-label-bn:'QKSMS' application-label-bs:'QKSMS' application-label-ca:'QKSMS' application-label-cs:'QKSMS' application-label-da:'QKSMS' application-label-de:'QKSMS' application-label-el:'QKSMS' application-label-en-AU:'QKSMS' application-label-en-CA:'QKSMS' application-label-en-GB:'QKSMS' application-label-en-IN:'QKSMS' application-label-en-XC:'QKSMS' application-label-es:'QKSMS' application-label-es-US:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-fa:'QKSMS' application-label-fi:'QKSMS' application-label-fr:'QKSMS' application-label-fr-CA:'QKSMS' application-label-gl:'QKSMS' application-label-gu:'QKSMS' application-label-hi:'QKSMS' application-label-hr:'QKSMS' application-label-hu:'QKSMS' application-label-hy:'QKSMS' application-label-in:'QKSMS' application-label-is:'QKSMS' application-label-it:'QKSMS' application-label-iw:'QKSMS' application-label-ja:'QKSMS' application-label-ka:'QKSMS' application-label-kk:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-ko:'QKSMS' application-label-ky:'QKSMS' application-label-lo:'QKSMS' application-label-lt:'QKSMS' application-label-lv:'QKSMS' application-label-mk:'QKSMS' application-label-ml:'QKSMS' application-label-mn:'QKSMS' application-label-mr:'QKSMS' application-label-ms:'QKSMS' application-label-my:'QKSMS' application-label-nb:'QKSMS' application-label-ne:'QKSMS' application-label-nl:'QKSMS' application-label-no:'QKSMS' application-label-or:'QKSMS' application-label-pa:'QKSMS' application-label-pl:'QKSMS' application-label-pt:'QKSMS' application-label-pt-BR:'QKSMS' application-label-pt-PT:'QKSMS' application-label-ro:'QKSMS' application-label-ru:'QKSMS' application-label-si:'QKSMS' application-label-sk:'QKSMS' application-label-sl:'QKSMS' application-label-sq:'QKSMS' application-label-sr:'QKSMS' application-label-sr-Latn:'QKSMS' application-label-sv:'QKSMS' application-label-sw:'QKSMS' application-label-ta:'QKSMS' application-label-te:'QKSMS' application-label-th:'QKSMS' application-label-tl:'QKSMS' application-label-tr:'QKSMS' application-label-uk:'QKSMS' application-label-ur:'QKSMS' application-label-uz:'QKSMS' application-label-vi:'QKSMS' application-label-zh:'QKSMS' application-label-zh-CN:'QKSMS' application-label-zh-HK:'QKSMS' application-label-zh-TW:'QKSMS' application-label-zu:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' provides-component:'app-widget' main other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: 'af' 'am' 'ar' 'as' 'az' 'be' 'bg' 'bn' 'bs' 'ca' 'cs' 'da' 'de' 'el' 'en-AU' 'en-CA' 'en-GB' 'en-IN' 'en-XC' 'es' 'es-US' 'et' 'eu' 'fa' 'fi' 'fr' 'fr-CA' 'gl' 'gu' 'hi' 'hr' 'hu' 'hy' 'in' 'is' 'it' 'iw' 'ja' 'ka' 'kk' 'km' 'kn' 'ko' 'ky' 'lo' 'lt' 'lv' 'mk' 'ml' 'mn' 'mr' 'ms' 'my' 'nb' 'ne' 'nl' 'no' 'or' 'pa' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'si' 'sk' 'sl' 'sq' 'sr' 'sr-Latn' 'sv' 'sw' 'ta' 'te' 'th' 'tl' 'tr' 'uk' 'ur' 'uz' 'vi' 'zh' 'zh-CN' 'zh-HK' 'zh-TW' 'zu' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.0/aapt-output-com.politedroid_3.txt0000644000175000017500000000253714620351225025471 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.0/aapt-output-com.politedroid_4.txt0000644000175000017500000000253714620351225025472 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.0/aapt-output-com.politedroid_5.txt0000644000175000017500000000162114620351225025464 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' platformBuildVersionName='' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.0/aapt-output-com.politedroid_6.txt0000644000175000017500000000165614620351225025475 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.0/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000334614620351225027640 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission-sdk-23: name='android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS' maxSdkVersion='27' uses-permission-sdk-23: name='android.permission.REQUEST_INSTALL_PACKAGES' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='أذونات مكررة' icon='res/drawable/ic_launcher.png' banner='res/drawable/banner.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.software.leanback' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.0/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000132314620351225030007 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000116014620351225030117 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.0/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000312114620351225027147 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission-sdk-23: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission-sdk-23: name='android.permission.WRITE_SETTINGS' maxSdkVersion='25' uses-permission: name='android.permission.NFC' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' uses-feature-not-required: name='android.hardware.bluetooth' uses-feature-not-required: name='android.hardware.nfc' uses-feature-not-required: name='android.hardware.telephony' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.hardware.wifi' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.0/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000123714620351225027132 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.0/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000123714620351225027134 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.0/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000123714620351225027136 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.0/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000121514620351225027012 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.0/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000122614620351225026510 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' platformBuildVersionName='' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR Klavye' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.0/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000302714620351225025543 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' platformBuildVersionName='' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9123828 fdroidserver-2.3a1/tests/build-tools/25.0.1/0000755000175000017500000000000014620351546017132 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.1/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001453514620351225025174 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' platformBuildVersionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.CALL_PHONE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.READ_SMS' uses-permission: name='android.permission.READ_PHONE_STATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.RECEIVE_MMS' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_SMS' uses-permission: name='com.android.vending.BILLING' uses-permission: name='android.permission.INTERNET' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission: name='com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission: name='com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission: name='com.majeur.launcher.permission.UPDATE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='android.permission.READ_APP_BADGE' uses-permission: name='com.oppo.launcher.permission.READ_SETTINGS' uses-permission: name='com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_WRITE' application-label-af:'QKSMS' application-label-am:'QKSMS' application-label-ar:'QKSMS' application-label-as:'QKSMS' application-label-az:'QKSMS' application-label-be:'QKSMS' application-label-bg:'QKSMS' application-label-bn:'QKSMS' application-label-bs:'QKSMS' application-label-ca:'QKSMS' application-label-cs:'QKSMS' application-label-da:'QKSMS' application-label-de:'QKSMS' application-label-el:'QKSMS' application-label-en-AU:'QKSMS' application-label-en-CA:'QKSMS' application-label-en-GB:'QKSMS' application-label-en-IN:'QKSMS' application-label-en-XC:'QKSMS' application-label-es:'QKSMS' application-label-es-US:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-fa:'QKSMS' application-label-fi:'QKSMS' application-label-fr:'QKSMS' application-label-fr-CA:'QKSMS' application-label-gl:'QKSMS' application-label-gu:'QKSMS' application-label-hi:'QKSMS' application-label-hr:'QKSMS' application-label-hu:'QKSMS' application-label-hy:'QKSMS' application-label-in:'QKSMS' application-label-is:'QKSMS' application-label-it:'QKSMS' application-label-iw:'QKSMS' application-label-ja:'QKSMS' application-label-ka:'QKSMS' application-label-kk:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-ko:'QKSMS' application-label-ky:'QKSMS' application-label-lo:'QKSMS' application-label-lt:'QKSMS' application-label-lv:'QKSMS' application-label-mk:'QKSMS' application-label-ml:'QKSMS' application-label-mn:'QKSMS' application-label-mr:'QKSMS' application-label-ms:'QKSMS' application-label-my:'QKSMS' application-label-nb:'QKSMS' application-label-ne:'QKSMS' application-label-nl:'QKSMS' application-label-no:'QKSMS' application-label-or:'QKSMS' application-label-pa:'QKSMS' application-label-pl:'QKSMS' application-label-pt:'QKSMS' application-label-pt-BR:'QKSMS' application-label-pt-PT:'QKSMS' application-label-ro:'QKSMS' application-label-ru:'QKSMS' application-label-si:'QKSMS' application-label-sk:'QKSMS' application-label-sl:'QKSMS' application-label-sq:'QKSMS' application-label-sr:'QKSMS' application-label-sr-Latn:'QKSMS' application-label-sv:'QKSMS' application-label-sw:'QKSMS' application-label-ta:'QKSMS' application-label-te:'QKSMS' application-label-th:'QKSMS' application-label-tl:'QKSMS' application-label-tr:'QKSMS' application-label-uk:'QKSMS' application-label-ur:'QKSMS' application-label-uz:'QKSMS' application-label-vi:'QKSMS' application-label-zh:'QKSMS' application-label-zh-CN:'QKSMS' application-label-zh-HK:'QKSMS' application-label-zh-TW:'QKSMS' application-label-zu:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' provides-component:'app-widget' main other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: 'af' 'am' 'ar' 'as' 'az' 'be' 'bg' 'bn' 'bs' 'ca' 'cs' 'da' 'de' 'el' 'en-AU' 'en-CA' 'en-GB' 'en-IN' 'en-XC' 'es' 'es-US' 'et' 'eu' 'fa' 'fi' 'fr' 'fr-CA' 'gl' 'gu' 'hi' 'hr' 'hu' 'hy' 'in' 'is' 'it' 'iw' 'ja' 'ka' 'kk' 'km' 'kn' 'ko' 'ky' 'lo' 'lt' 'lv' 'mk' 'ml' 'mn' 'mr' 'ms' 'my' 'nb' 'ne' 'nl' 'no' 'or' 'pa' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'si' 'sk' 'sl' 'sq' 'sr' 'sr-Latn' 'sv' 'sw' 'ta' 'te' 'th' 'tl' 'tr' 'uk' 'ur' 'uz' 'vi' 'zh' 'zh-CN' 'zh-HK' 'zh-TW' 'zu' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.1/aapt-output-com.politedroid_3.txt0000644000175000017500000000253714620351225025472 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.1/aapt-output-com.politedroid_4.txt0000644000175000017500000000253714620351225025473 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.1/aapt-output-com.politedroid_5.txt0000644000175000017500000000162114620351225025465 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' platformBuildVersionName='' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.1/aapt-output-com.politedroid_6.txt0000644000175000017500000000165614620351225025476 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.1/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000334614620351225027641 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission-sdk-23: name='android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS' maxSdkVersion='27' uses-permission-sdk-23: name='android.permission.REQUEST_INSTALL_PACKAGES' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='أذونات مكررة' icon='res/drawable/ic_launcher.png' banner='res/drawable/banner.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.software.leanback' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.1/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000132314620351225030010 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000116014620351225030120 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.1/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000312114620351225027150 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission-sdk-23: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission-sdk-23: name='android.permission.WRITE_SETTINGS' maxSdkVersion='25' uses-permission: name='android.permission.NFC' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' uses-feature-not-required: name='android.hardware.bluetooth' uses-feature-not-required: name='android.hardware.nfc' uses-feature-not-required: name='android.hardware.telephony' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.hardware.wifi' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.1/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000123714620351225027133 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.1/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000123714620351225027135 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.1/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000123714620351225027137 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.1/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000121514620351225027013 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.1/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000122614620351225026511 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' platformBuildVersionName='' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR Klavye' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.1/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000302714620351225025544 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' platformBuildVersionName='' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9123828 fdroidserver-2.3a1/tests/build-tools/25.0.2/0000755000175000017500000000000014620351546017133 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.2/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001453514620351225025175 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' platformBuildVersionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.CALL_PHONE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.READ_SMS' uses-permission: name='android.permission.READ_PHONE_STATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.RECEIVE_MMS' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_SMS' uses-permission: name='com.android.vending.BILLING' uses-permission: name='android.permission.INTERNET' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission: name='com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission: name='com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission: name='com.majeur.launcher.permission.UPDATE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='android.permission.READ_APP_BADGE' uses-permission: name='com.oppo.launcher.permission.READ_SETTINGS' uses-permission: name='com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_WRITE' application-label-af:'QKSMS' application-label-am:'QKSMS' application-label-ar:'QKSMS' application-label-as:'QKSMS' application-label-az:'QKSMS' application-label-be:'QKSMS' application-label-bg:'QKSMS' application-label-bn:'QKSMS' application-label-bs:'QKSMS' application-label-ca:'QKSMS' application-label-cs:'QKSMS' application-label-da:'QKSMS' application-label-de:'QKSMS' application-label-el:'QKSMS' application-label-en-AU:'QKSMS' application-label-en-CA:'QKSMS' application-label-en-GB:'QKSMS' application-label-en-IN:'QKSMS' application-label-en-XC:'QKSMS' application-label-es:'QKSMS' application-label-es-US:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-fa:'QKSMS' application-label-fi:'QKSMS' application-label-fr:'QKSMS' application-label-fr-CA:'QKSMS' application-label-gl:'QKSMS' application-label-gu:'QKSMS' application-label-hi:'QKSMS' application-label-hr:'QKSMS' application-label-hu:'QKSMS' application-label-hy:'QKSMS' application-label-in:'QKSMS' application-label-is:'QKSMS' application-label-it:'QKSMS' application-label-iw:'QKSMS' application-label-ja:'QKSMS' application-label-ka:'QKSMS' application-label-kk:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-ko:'QKSMS' application-label-ky:'QKSMS' application-label-lo:'QKSMS' application-label-lt:'QKSMS' application-label-lv:'QKSMS' application-label-mk:'QKSMS' application-label-ml:'QKSMS' application-label-mn:'QKSMS' application-label-mr:'QKSMS' application-label-ms:'QKSMS' application-label-my:'QKSMS' application-label-nb:'QKSMS' application-label-ne:'QKSMS' application-label-nl:'QKSMS' application-label-no:'QKSMS' application-label-or:'QKSMS' application-label-pa:'QKSMS' application-label-pl:'QKSMS' application-label-pt:'QKSMS' application-label-pt-BR:'QKSMS' application-label-pt-PT:'QKSMS' application-label-ro:'QKSMS' application-label-ru:'QKSMS' application-label-si:'QKSMS' application-label-sk:'QKSMS' application-label-sl:'QKSMS' application-label-sq:'QKSMS' application-label-sr:'QKSMS' application-label-sr-Latn:'QKSMS' application-label-sv:'QKSMS' application-label-sw:'QKSMS' application-label-ta:'QKSMS' application-label-te:'QKSMS' application-label-th:'QKSMS' application-label-tl:'QKSMS' application-label-tr:'QKSMS' application-label-uk:'QKSMS' application-label-ur:'QKSMS' application-label-uz:'QKSMS' application-label-vi:'QKSMS' application-label-zh:'QKSMS' application-label-zh-CN:'QKSMS' application-label-zh-HK:'QKSMS' application-label-zh-TW:'QKSMS' application-label-zu:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' provides-component:'app-widget' main other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: 'af' 'am' 'ar' 'as' 'az' 'be' 'bg' 'bn' 'bs' 'ca' 'cs' 'da' 'de' 'el' 'en-AU' 'en-CA' 'en-GB' 'en-IN' 'en-XC' 'es' 'es-US' 'et' 'eu' 'fa' 'fi' 'fr' 'fr-CA' 'gl' 'gu' 'hi' 'hr' 'hu' 'hy' 'in' 'is' 'it' 'iw' 'ja' 'ka' 'kk' 'km' 'kn' 'ko' 'ky' 'lo' 'lt' 'lv' 'mk' 'ml' 'mn' 'mr' 'ms' 'my' 'nb' 'ne' 'nl' 'no' 'or' 'pa' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'si' 'sk' 'sl' 'sq' 'sr' 'sr-Latn' 'sv' 'sw' 'ta' 'te' 'th' 'tl' 'tr' 'uk' 'ur' 'uz' 'vi' 'zh' 'zh-CN' 'zh-HK' 'zh-TW' 'zu' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.2/aapt-output-com.politedroid_3.txt0000644000175000017500000000253714620351225025473 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.2/aapt-output-com.politedroid_4.txt0000644000175000017500000000253714620351225025474 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.2/aapt-output-com.politedroid_5.txt0000644000175000017500000000162114620351225025466 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' platformBuildVersionName='' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.2/aapt-output-com.politedroid_6.txt0000644000175000017500000000165614620351225025477 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.2/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000334614620351225027642 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission-sdk-23: name='android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS' maxSdkVersion='27' uses-permission-sdk-23: name='android.permission.REQUEST_INSTALL_PACKAGES' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='أذونات مكررة' icon='res/drawable/ic_launcher.png' banner='res/drawable/banner.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.software.leanback' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.2/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000132314620351225030011 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.2/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000116014620351225030121 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.2/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000312114620351225027151 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission-sdk-23: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission-sdk-23: name='android.permission.WRITE_SETTINGS' maxSdkVersion='25' uses-permission: name='android.permission.NFC' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' uses-feature-not-required: name='android.hardware.bluetooth' uses-feature-not-required: name='android.hardware.nfc' uses-feature-not-required: name='android.hardware.telephony' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.hardware.wifi' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.2/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000123714620351225027134 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.2/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000123714620351225027136 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.2/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000123714620351225027140 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.2/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000121514620351225027014 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.2/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000122614620351225026512 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' platformBuildVersionName='' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR Klavye' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.2/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000302714620351225025545 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' platformBuildVersionName='' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9123828 fdroidserver-2.3a1/tests/build-tools/25.0.3/0000755000175000017500000000000014620351546017134 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.3/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001453514620351225025176 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' platformBuildVersionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.CALL_PHONE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.READ_SMS' uses-permission: name='android.permission.READ_PHONE_STATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.RECEIVE_MMS' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_SMS' uses-permission: name='com.android.vending.BILLING' uses-permission: name='android.permission.INTERNET' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission: name='com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission: name='com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission: name='com.majeur.launcher.permission.UPDATE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='android.permission.READ_APP_BADGE' uses-permission: name='com.oppo.launcher.permission.READ_SETTINGS' uses-permission: name='com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_WRITE' application-label-af:'QKSMS' application-label-am:'QKSMS' application-label-ar:'QKSMS' application-label-as:'QKSMS' application-label-az:'QKSMS' application-label-be:'QKSMS' application-label-bg:'QKSMS' application-label-bn:'QKSMS' application-label-bs:'QKSMS' application-label-ca:'QKSMS' application-label-cs:'QKSMS' application-label-da:'QKSMS' application-label-de:'QKSMS' application-label-el:'QKSMS' application-label-en-AU:'QKSMS' application-label-en-CA:'QKSMS' application-label-en-GB:'QKSMS' application-label-en-IN:'QKSMS' application-label-en-XC:'QKSMS' application-label-es:'QKSMS' application-label-es-US:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-fa:'QKSMS' application-label-fi:'QKSMS' application-label-fr:'QKSMS' application-label-fr-CA:'QKSMS' application-label-gl:'QKSMS' application-label-gu:'QKSMS' application-label-hi:'QKSMS' application-label-hr:'QKSMS' application-label-hu:'QKSMS' application-label-hy:'QKSMS' application-label-in:'QKSMS' application-label-is:'QKSMS' application-label-it:'QKSMS' application-label-iw:'QKSMS' application-label-ja:'QKSMS' application-label-ka:'QKSMS' application-label-kk:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-ko:'QKSMS' application-label-ky:'QKSMS' application-label-lo:'QKSMS' application-label-lt:'QKSMS' application-label-lv:'QKSMS' application-label-mk:'QKSMS' application-label-ml:'QKSMS' application-label-mn:'QKSMS' application-label-mr:'QKSMS' application-label-ms:'QKSMS' application-label-my:'QKSMS' application-label-nb:'QKSMS' application-label-ne:'QKSMS' application-label-nl:'QKSMS' application-label-no:'QKSMS' application-label-or:'QKSMS' application-label-pa:'QKSMS' application-label-pl:'QKSMS' application-label-pt:'QKSMS' application-label-pt-BR:'QKSMS' application-label-pt-PT:'QKSMS' application-label-ro:'QKSMS' application-label-ru:'QKSMS' application-label-si:'QKSMS' application-label-sk:'QKSMS' application-label-sl:'QKSMS' application-label-sq:'QKSMS' application-label-sr:'QKSMS' application-label-sr-Latn:'QKSMS' application-label-sv:'QKSMS' application-label-sw:'QKSMS' application-label-ta:'QKSMS' application-label-te:'QKSMS' application-label-th:'QKSMS' application-label-tl:'QKSMS' application-label-tr:'QKSMS' application-label-uk:'QKSMS' application-label-ur:'QKSMS' application-label-uz:'QKSMS' application-label-vi:'QKSMS' application-label-zh:'QKSMS' application-label-zh-CN:'QKSMS' application-label-zh-HK:'QKSMS' application-label-zh-TW:'QKSMS' application-label-zu:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' provides-component:'app-widget' main other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: 'af' 'am' 'ar' 'as' 'az' 'be' 'bg' 'bn' 'bs' 'ca' 'cs' 'da' 'de' 'el' 'en-AU' 'en-CA' 'en-GB' 'en-IN' 'en-XC' 'es' 'es-US' 'et' 'eu' 'fa' 'fi' 'fr' 'fr-CA' 'gl' 'gu' 'hi' 'hr' 'hu' 'hy' 'in' 'is' 'it' 'iw' 'ja' 'ka' 'kk' 'km' 'kn' 'ko' 'ky' 'lo' 'lt' 'lv' 'mk' 'ml' 'mn' 'mr' 'ms' 'my' 'nb' 'ne' 'nl' 'no' 'or' 'pa' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'si' 'sk' 'sl' 'sq' 'sr' 'sr-Latn' 'sv' 'sw' 'ta' 'te' 'th' 'tl' 'tr' 'uk' 'ur' 'uz' 'vi' 'zh' 'zh-CN' 'zh-HK' 'zh-TW' 'zu' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.3/aapt-output-com.politedroid_3.txt0000644000175000017500000000253714620351225025474 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.3/aapt-output-com.politedroid_4.txt0000644000175000017500000000253714620351225025475 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.3/aapt-output-com.politedroid_5.txt0000644000175000017500000000162114620351225025467 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' platformBuildVersionName='' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.3/aapt-output-com.politedroid_6.txt0000644000175000017500000000165614620351225025500 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.3/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000341414620351225027637 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission-sdk-23: name='android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS' maxSdkVersion='27' uses-permission-sdk-23: name='android.permission.REQUEST_INSTALL_PACKAGES' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='أذونات مكررة' icon='res/drawable/ic_launcher.png' banner='res/drawable/banner.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='18' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='18' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.software.leanback' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.3/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000132314620351225030012 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.3/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000116014620351225030122 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.3/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000312114620351225027152 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission-sdk-23: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission-sdk-23: name='android.permission.WRITE_SETTINGS' maxSdkVersion='25' uses-permission: name='android.permission.NFC' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' uses-feature-not-required: name='android.hardware.bluetooth' uses-feature-not-required: name='android.hardware.nfc' uses-feature-not-required: name='android.hardware.telephony' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.hardware.wifi' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.3/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000123714620351225027135 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.3/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000123714620351225027137 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.3/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000123714620351225027141 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.3/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000121514620351225027015 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-icon-160:'res/drawable/ic_launcher.png' application: label='' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.3/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000122614620351225026513 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' platformBuildVersionName='' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR Klavye' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/25.0.3/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000302714620351225025546 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' platformBuildVersionName='' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9163828 fdroidserver-2.3a1/tests/build-tools/26.0.0/0000755000175000017500000000000014620351546017132 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.0/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001457714620351225025202 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' platformBuildVersionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.CALL_PHONE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.READ_SMS' uses-permission: name='android.permission.READ_PHONE_STATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.RECEIVE_MMS' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_SMS' uses-permission: name='com.android.vending.BILLING' uses-permission: name='android.permission.INTERNET' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission: name='com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission: name='com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission: name='com.majeur.launcher.permission.UPDATE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='android.permission.READ_APP_BADGE' uses-permission: name='com.oppo.launcher.permission.READ_SETTINGS' uses-permission: name='com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_WRITE' application-label:'QKSMS' application-label-af:'QKSMS' application-label-am:'QKSMS' application-label-ar:'QKSMS' application-label-as:'QKSMS' application-label-az:'QKSMS' application-label-be:'QKSMS' application-label-bg:'QKSMS' application-label-bn:'QKSMS' application-label-bs:'QKSMS' application-label-ca:'QKSMS' application-label-cs:'QKSMS' application-label-da:'QKSMS' application-label-de:'QKSMS' application-label-el:'QKSMS' application-label-en-AU:'QKSMS' application-label-en-CA:'QKSMS' application-label-en-GB:'QKSMS' application-label-en-IN:'QKSMS' application-label-en-XC:'QKSMS' application-label-es:'QKSMS' application-label-es-US:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-fa:'QKSMS' application-label-fi:'QKSMS' application-label-fr:'QKSMS' application-label-fr-CA:'QKSMS' application-label-gl:'QKSMS' application-label-gu:'QKSMS' application-label-hi:'QKSMS' application-label-hr:'QKSMS' application-label-hu:'QKSMS' application-label-hy:'QKSMS' application-label-in:'QKSMS' application-label-is:'QKSMS' application-label-it:'QKSMS' application-label-iw:'QKSMS' application-label-ja:'QKSMS' application-label-ka:'QKSMS' application-label-kk:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-ko:'QKSMS' application-label-ky:'QKSMS' application-label-lo:'QKSMS' application-label-lt:'QKSMS' application-label-lv:'QKSMS' application-label-mk:'QKSMS' application-label-ml:'QKSMS' application-label-mn:'QKSMS' application-label-mr:'QKSMS' application-label-ms:'QKSMS' application-label-my:'QKSMS' application-label-nb:'QKSMS' application-label-ne:'QKSMS' application-label-nl:'QKSMS' application-label-no:'QKSMS' application-label-or:'QKSMS' application-label-pa:'QKSMS' application-label-pl:'QKSMS' application-label-pt:'QKSMS' application-label-pt-BR:'QKSMS' application-label-pt-PT:'QKSMS' application-label-ro:'QKSMS' application-label-ru:'QKSMS' application-label-si:'QKSMS' application-label-sk:'QKSMS' application-label-sl:'QKSMS' application-label-sq:'QKSMS' application-label-sr:'QKSMS' application-label-sr-Latn:'QKSMS' application-label-sv:'QKSMS' application-label-sw:'QKSMS' application-label-ta:'QKSMS' application-label-te:'QKSMS' application-label-th:'QKSMS' application-label-tl:'QKSMS' application-label-tr:'QKSMS' application-label-uk:'QKSMS' application-label-ur:'QKSMS' application-label-uz:'QKSMS' application-label-vi:'QKSMS' application-label-zh:'QKSMS' application-label-zh-CN:'QKSMS' application-label-zh-HK:'QKSMS' application-label-zh-TW:'QKSMS' application-label-zu:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' provides-component:'app-widget' main other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'af' 'am' 'ar' 'as' 'az' 'be' 'bg' 'bn' 'bs' 'ca' 'cs' 'da' 'de' 'el' 'en-AU' 'en-CA' 'en-GB' 'en-IN' 'en-XC' 'es' 'es-US' 'et' 'eu' 'fa' 'fi' 'fr' 'fr-CA' 'gl' 'gu' 'hi' 'hr' 'hu' 'hy' 'in' 'is' 'it' 'iw' 'ja' 'ka' 'kk' 'km' 'kn' 'ko' 'ky' 'lo' 'lt' 'lv' 'mk' 'ml' 'mn' 'mr' 'ms' 'my' 'nb' 'ne' 'nl' 'no' 'or' 'pa' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'si' 'sk' 'sl' 'sq' 'sr' 'sr-Latn' 'sv' 'sw' 'ta' 'te' 'th' 'tl' 'tr' 'uk' 'ur' 'uz' 'vi' 'zh' 'zh-CN' 'zh-HK' 'zh-TW' 'zu' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.0/aapt-output-com.politedroid_3.txt0000644000175000017500000000262414620351225025467 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.0/aapt-output-com.politedroid_4.txt0000644000175000017500000000262414620351225025470 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.0/aapt-output-com.politedroid_5.txt0000644000175000017500000000170614620351225025471 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' platformBuildVersionName='' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.0/aapt-output-com.politedroid_6.txt0000644000175000017500000000174314620351225025473 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.0/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000347614620351225027645 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission-sdk-23: name='android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS' maxSdkVersion='27' uses-permission-sdk-23: name='android.permission.REQUEST_INSTALL_PACKAGES' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label:'Duplicate Permisssions' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='Duplicate Permisssions' icon='res/drawable/ic_launcher.png' banner='res/drawable/banner.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='18' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='18' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.software.leanback' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.0/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000157614620351225030022 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000124714620351225030126 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-label:'Caffeine Tile' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='Caffeine Tile' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.0/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000322614620351225027156 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission-sdk-23: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission-sdk-23: name='android.permission.WRITE_SETTINGS' maxSdkVersion='25' uses-permission: name='android.permission.NFC' application-label:'OBB Main Old Version' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Old Version' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' uses-feature-not-required: name='android.hardware.bluetooth' uses-feature-not-required: name='android.hardware.nfc' uses-feature-not-required: name='android.hardware.telephony' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.hardware.wifi' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.0/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000134614620351225027134 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.0/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000134614620351225027136 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.0/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000134614620351225027140 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.0/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000126414620351225027017 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.0/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000130514620351225026507 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' platformBuildVersionName='' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label:'DroidTR keyboard' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR keyboard' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.0/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000311614620351225025543 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' platformBuildVersionName='' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-label:'Battery level' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='Battery level' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9163828 fdroidserver-2.3a1/tests/build-tools/26.0.1/0000755000175000017500000000000014620351546017133 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.1/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001457714620351225025203 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' platformBuildVersionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.CALL_PHONE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.READ_SMS' uses-permission: name='android.permission.READ_PHONE_STATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.RECEIVE_MMS' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_SMS' uses-permission: name='com.android.vending.BILLING' uses-permission: name='android.permission.INTERNET' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission: name='com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission: name='com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission: name='com.majeur.launcher.permission.UPDATE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='android.permission.READ_APP_BADGE' uses-permission: name='com.oppo.launcher.permission.READ_SETTINGS' uses-permission: name='com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_WRITE' application-label:'QKSMS' application-label-af:'QKSMS' application-label-am:'QKSMS' application-label-ar:'QKSMS' application-label-as:'QKSMS' application-label-az:'QKSMS' application-label-be:'QKSMS' application-label-bg:'QKSMS' application-label-bn:'QKSMS' application-label-bs:'QKSMS' application-label-ca:'QKSMS' application-label-cs:'QKSMS' application-label-da:'QKSMS' application-label-de:'QKSMS' application-label-el:'QKSMS' application-label-en-AU:'QKSMS' application-label-en-CA:'QKSMS' application-label-en-GB:'QKSMS' application-label-en-IN:'QKSMS' application-label-en-XC:'QKSMS' application-label-es:'QKSMS' application-label-es-US:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-fa:'QKSMS' application-label-fi:'QKSMS' application-label-fr:'QKSMS' application-label-fr-CA:'QKSMS' application-label-gl:'QKSMS' application-label-gu:'QKSMS' application-label-hi:'QKSMS' application-label-hr:'QKSMS' application-label-hu:'QKSMS' application-label-hy:'QKSMS' application-label-in:'QKSMS' application-label-is:'QKSMS' application-label-it:'QKSMS' application-label-iw:'QKSMS' application-label-ja:'QKSMS' application-label-ka:'QKSMS' application-label-kk:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-ko:'QKSMS' application-label-ky:'QKSMS' application-label-lo:'QKSMS' application-label-lt:'QKSMS' application-label-lv:'QKSMS' application-label-mk:'QKSMS' application-label-ml:'QKSMS' application-label-mn:'QKSMS' application-label-mr:'QKSMS' application-label-ms:'QKSMS' application-label-my:'QKSMS' application-label-nb:'QKSMS' application-label-ne:'QKSMS' application-label-nl:'QKSMS' application-label-no:'QKSMS' application-label-or:'QKSMS' application-label-pa:'QKSMS' application-label-pl:'QKSMS' application-label-pt:'QKSMS' application-label-pt-BR:'QKSMS' application-label-pt-PT:'QKSMS' application-label-ro:'QKSMS' application-label-ru:'QKSMS' application-label-si:'QKSMS' application-label-sk:'QKSMS' application-label-sl:'QKSMS' application-label-sq:'QKSMS' application-label-sr:'QKSMS' application-label-sr-Latn:'QKSMS' application-label-sv:'QKSMS' application-label-sw:'QKSMS' application-label-ta:'QKSMS' application-label-te:'QKSMS' application-label-th:'QKSMS' application-label-tl:'QKSMS' application-label-tr:'QKSMS' application-label-uk:'QKSMS' application-label-ur:'QKSMS' application-label-uz:'QKSMS' application-label-vi:'QKSMS' application-label-zh:'QKSMS' application-label-zh-CN:'QKSMS' application-label-zh-HK:'QKSMS' application-label-zh-TW:'QKSMS' application-label-zu:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' provides-component:'app-widget' main other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'af' 'am' 'ar' 'as' 'az' 'be' 'bg' 'bn' 'bs' 'ca' 'cs' 'da' 'de' 'el' 'en-AU' 'en-CA' 'en-GB' 'en-IN' 'en-XC' 'es' 'es-US' 'et' 'eu' 'fa' 'fi' 'fr' 'fr-CA' 'gl' 'gu' 'hi' 'hr' 'hu' 'hy' 'in' 'is' 'it' 'iw' 'ja' 'ka' 'kk' 'km' 'kn' 'ko' 'ky' 'lo' 'lt' 'lv' 'mk' 'ml' 'mn' 'mr' 'ms' 'my' 'nb' 'ne' 'nl' 'no' 'or' 'pa' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'si' 'sk' 'sl' 'sq' 'sr' 'sr-Latn' 'sv' 'sw' 'ta' 'te' 'th' 'tl' 'tr' 'uk' 'ur' 'uz' 'vi' 'zh' 'zh-CN' 'zh-HK' 'zh-TW' 'zu' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.1/aapt-output-com.politedroid_3.txt0000644000175000017500000000262414620351225025470 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.1/aapt-output-com.politedroid_4.txt0000644000175000017500000000262414620351225025471 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.1/aapt-output-com.politedroid_5.txt0000644000175000017500000000170614620351225025472 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' platformBuildVersionName='' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.1/aapt-output-com.politedroid_6.txt0000644000175000017500000000174314620351225025474 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.1/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000347614620351225027646 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission-sdk-23: name='android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS' maxSdkVersion='27' uses-permission-sdk-23: name='android.permission.REQUEST_INSTALL_PACKAGES' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label:'Duplicate Permisssions' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='Duplicate Permisssions' icon='res/drawable/ic_launcher.png' banner='res/drawable/banner.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='18' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='18' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.software.leanback' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.1/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000157614620351225030023 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000124714620351225030127 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-label:'Caffeine Tile' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='Caffeine Tile' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.1/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000322614620351225027157 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission-sdk-23: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission-sdk-23: name='android.permission.WRITE_SETTINGS' maxSdkVersion='25' uses-permission: name='android.permission.NFC' application-label:'OBB Main Old Version' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Old Version' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' uses-feature-not-required: name='android.hardware.bluetooth' uses-feature-not-required: name='android.hardware.nfc' uses-feature-not-required: name='android.hardware.telephony' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.hardware.wifi' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.1/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000134614620351225027135 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.1/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000134614620351225027137 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.1/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000134614620351225027141 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.1/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000126414620351225027020 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.1/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000130514620351225026510 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' platformBuildVersionName='' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label:'DroidTR keyboard' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR keyboard' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.1/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000311614620351225025544 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' platformBuildVersionName='' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-label:'Battery level' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='Battery level' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9163828 fdroidserver-2.3a1/tests/build-tools/26.0.2/0000755000175000017500000000000014620351546017134 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.2/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001457714620351225025204 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' platformBuildVersionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.CALL_PHONE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.READ_SMS' uses-permission: name='android.permission.READ_PHONE_STATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.RECEIVE_MMS' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_SMS' uses-permission: name='com.android.vending.BILLING' uses-permission: name='android.permission.INTERNET' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission: name='com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission: name='com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission: name='com.majeur.launcher.permission.UPDATE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='android.permission.READ_APP_BADGE' uses-permission: name='com.oppo.launcher.permission.READ_SETTINGS' uses-permission: name='com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_WRITE' application-label:'QKSMS' application-label-af:'QKSMS' application-label-am:'QKSMS' application-label-ar:'QKSMS' application-label-as:'QKSMS' application-label-az:'QKSMS' application-label-be:'QKSMS' application-label-bg:'QKSMS' application-label-bn:'QKSMS' application-label-bs:'QKSMS' application-label-ca:'QKSMS' application-label-cs:'QKSMS' application-label-da:'QKSMS' application-label-de:'QKSMS' application-label-el:'QKSMS' application-label-en-AU:'QKSMS' application-label-en-CA:'QKSMS' application-label-en-GB:'QKSMS' application-label-en-IN:'QKSMS' application-label-en-XC:'QKSMS' application-label-es:'QKSMS' application-label-es-US:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-fa:'QKSMS' application-label-fi:'QKSMS' application-label-fr:'QKSMS' application-label-fr-CA:'QKSMS' application-label-gl:'QKSMS' application-label-gu:'QKSMS' application-label-hi:'QKSMS' application-label-hr:'QKSMS' application-label-hu:'QKSMS' application-label-hy:'QKSMS' application-label-in:'QKSMS' application-label-is:'QKSMS' application-label-it:'QKSMS' application-label-iw:'QKSMS' application-label-ja:'QKSMS' application-label-ka:'QKSMS' application-label-kk:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-ko:'QKSMS' application-label-ky:'QKSMS' application-label-lo:'QKSMS' application-label-lt:'QKSMS' application-label-lv:'QKSMS' application-label-mk:'QKSMS' application-label-ml:'QKSMS' application-label-mn:'QKSMS' application-label-mr:'QKSMS' application-label-ms:'QKSMS' application-label-my:'QKSMS' application-label-nb:'QKSMS' application-label-ne:'QKSMS' application-label-nl:'QKSMS' application-label-no:'QKSMS' application-label-or:'QKSMS' application-label-pa:'QKSMS' application-label-pl:'QKSMS' application-label-pt:'QKSMS' application-label-pt-BR:'QKSMS' application-label-pt-PT:'QKSMS' application-label-ro:'QKSMS' application-label-ru:'QKSMS' application-label-si:'QKSMS' application-label-sk:'QKSMS' application-label-sl:'QKSMS' application-label-sq:'QKSMS' application-label-sr:'QKSMS' application-label-sr-Latn:'QKSMS' application-label-sv:'QKSMS' application-label-sw:'QKSMS' application-label-ta:'QKSMS' application-label-te:'QKSMS' application-label-th:'QKSMS' application-label-tl:'QKSMS' application-label-tr:'QKSMS' application-label-uk:'QKSMS' application-label-ur:'QKSMS' application-label-uz:'QKSMS' application-label-vi:'QKSMS' application-label-zh:'QKSMS' application-label-zh-CN:'QKSMS' application-label-zh-HK:'QKSMS' application-label-zh-TW:'QKSMS' application-label-zu:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' provides-component:'app-widget' main other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'af' 'am' 'ar' 'as' 'az' 'be' 'bg' 'bn' 'bs' 'ca' 'cs' 'da' 'de' 'el' 'en-AU' 'en-CA' 'en-GB' 'en-IN' 'en-XC' 'es' 'es-US' 'et' 'eu' 'fa' 'fi' 'fr' 'fr-CA' 'gl' 'gu' 'hi' 'hr' 'hu' 'hy' 'in' 'is' 'it' 'iw' 'ja' 'ka' 'kk' 'km' 'kn' 'ko' 'ky' 'lo' 'lt' 'lv' 'mk' 'ml' 'mn' 'mr' 'ms' 'my' 'nb' 'ne' 'nl' 'no' 'or' 'pa' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'si' 'sk' 'sl' 'sq' 'sr' 'sr-Latn' 'sv' 'sw' 'ta' 'te' 'th' 'tl' 'tr' 'uk' 'ur' 'uz' 'vi' 'zh' 'zh-CN' 'zh-HK' 'zh-TW' 'zu' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.2/aapt-output-com.politedroid_3.txt0000644000175000017500000000262414620351225025471 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.2/aapt-output-com.politedroid_4.txt0000644000175000017500000000262414620351225025472 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.2/aapt-output-com.politedroid_5.txt0000644000175000017500000000170614620351225025473 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' platformBuildVersionName='' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.2/aapt-output-com.politedroid_6.txt0000644000175000017500000000174314620351225025475 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.2/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000347614620351225027647 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission-sdk-23: name='android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS' maxSdkVersion='27' uses-permission-sdk-23: name='android.permission.REQUEST_INSTALL_PACKAGES' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label:'Duplicate Permisssions' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='Duplicate Permisssions' icon='res/drawable/ic_launcher.png' banner='res/drawable/banner.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='18' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='18' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.software.leanback' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.2/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000157614620351225030024 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.2/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000124714620351225030130 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-label:'Caffeine Tile' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='Caffeine Tile' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.2/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000322614620351225027160 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission-sdk-23: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission-sdk-23: name='android.permission.WRITE_SETTINGS' maxSdkVersion='25' uses-permission: name='android.permission.NFC' application-label:'OBB Main Old Version' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Old Version' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' uses-feature-not-required: name='android.hardware.bluetooth' uses-feature-not-required: name='android.hardware.nfc' uses-feature-not-required: name='android.hardware.telephony' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.hardware.wifi' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.2/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000134614620351225027136 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.2/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000134614620351225027140 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.2/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000134614620351225027142 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.2/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000126414620351225027021 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.2/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000130514620351225026511 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' platformBuildVersionName='' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label:'DroidTR keyboard' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR keyboard' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.2/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000311614620351225025545 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' platformBuildVersionName='' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-label:'Battery level' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='Battery level' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9163828 fdroidserver-2.3a1/tests/build-tools/26.0.3/0000755000175000017500000000000014620351546017135 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.3/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001457714620351225025205 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' platformBuildVersionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.CALL_PHONE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.READ_SMS' uses-permission: name='android.permission.READ_PHONE_STATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.RECEIVE_MMS' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_SMS' uses-permission: name='com.android.vending.BILLING' uses-permission: name='android.permission.INTERNET' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission: name='com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission: name='com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission: name='com.majeur.launcher.permission.UPDATE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='android.permission.READ_APP_BADGE' uses-permission: name='com.oppo.launcher.permission.READ_SETTINGS' uses-permission: name='com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_WRITE' application-label:'QKSMS' application-label-af:'QKSMS' application-label-am:'QKSMS' application-label-ar:'QKSMS' application-label-as:'QKSMS' application-label-az:'QKSMS' application-label-be:'QKSMS' application-label-bg:'QKSMS' application-label-bn:'QKSMS' application-label-bs:'QKSMS' application-label-ca:'QKSMS' application-label-cs:'QKSMS' application-label-da:'QKSMS' application-label-de:'QKSMS' application-label-el:'QKSMS' application-label-en-AU:'QKSMS' application-label-en-CA:'QKSMS' application-label-en-GB:'QKSMS' application-label-en-IN:'QKSMS' application-label-en-XC:'QKSMS' application-label-es:'QKSMS' application-label-es-US:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-fa:'QKSMS' application-label-fi:'QKSMS' application-label-fr:'QKSMS' application-label-fr-CA:'QKSMS' application-label-gl:'QKSMS' application-label-gu:'QKSMS' application-label-hi:'QKSMS' application-label-hr:'QKSMS' application-label-hu:'QKSMS' application-label-hy:'QKSMS' application-label-in:'QKSMS' application-label-is:'QKSMS' application-label-it:'QKSMS' application-label-iw:'QKSMS' application-label-ja:'QKSMS' application-label-ka:'QKSMS' application-label-kk:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-ko:'QKSMS' application-label-ky:'QKSMS' application-label-lo:'QKSMS' application-label-lt:'QKSMS' application-label-lv:'QKSMS' application-label-mk:'QKSMS' application-label-ml:'QKSMS' application-label-mn:'QKSMS' application-label-mr:'QKSMS' application-label-ms:'QKSMS' application-label-my:'QKSMS' application-label-nb:'QKSMS' application-label-ne:'QKSMS' application-label-nl:'QKSMS' application-label-no:'QKSMS' application-label-or:'QKSMS' application-label-pa:'QKSMS' application-label-pl:'QKSMS' application-label-pt:'QKSMS' application-label-pt-BR:'QKSMS' application-label-pt-PT:'QKSMS' application-label-ro:'QKSMS' application-label-ru:'QKSMS' application-label-si:'QKSMS' application-label-sk:'QKSMS' application-label-sl:'QKSMS' application-label-sq:'QKSMS' application-label-sr:'QKSMS' application-label-sr-Latn:'QKSMS' application-label-sv:'QKSMS' application-label-sw:'QKSMS' application-label-ta:'QKSMS' application-label-te:'QKSMS' application-label-th:'QKSMS' application-label-tl:'QKSMS' application-label-tr:'QKSMS' application-label-uk:'QKSMS' application-label-ur:'QKSMS' application-label-uz:'QKSMS' application-label-vi:'QKSMS' application-label-zh:'QKSMS' application-label-zh-CN:'QKSMS' application-label-zh-HK:'QKSMS' application-label-zh-TW:'QKSMS' application-label-zu:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' provides-component:'app-widget' main other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'af' 'am' 'ar' 'as' 'az' 'be' 'bg' 'bn' 'bs' 'ca' 'cs' 'da' 'de' 'el' 'en-AU' 'en-CA' 'en-GB' 'en-IN' 'en-XC' 'es' 'es-US' 'et' 'eu' 'fa' 'fi' 'fr' 'fr-CA' 'gl' 'gu' 'hi' 'hr' 'hu' 'hy' 'in' 'is' 'it' 'iw' 'ja' 'ka' 'kk' 'km' 'kn' 'ko' 'ky' 'lo' 'lt' 'lv' 'mk' 'ml' 'mn' 'mr' 'ms' 'my' 'nb' 'ne' 'nl' 'no' 'or' 'pa' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'si' 'sk' 'sl' 'sq' 'sr' 'sr-Latn' 'sv' 'sw' 'ta' 'te' 'th' 'tl' 'tr' 'uk' 'ur' 'uz' 'vi' 'zh' 'zh-CN' 'zh-HK' 'zh-TW' 'zu' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.3/aapt-output-com.politedroid_3.txt0000644000175000017500000000262414620351225025472 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.3/aapt-output-com.politedroid_4.txt0000644000175000017500000000262414620351225025473 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.3/aapt-output-com.politedroid_5.txt0000644000175000017500000000170614620351225025474 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' platformBuildVersionName='' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.3/aapt-output-com.politedroid_6.txt0000644000175000017500000000174314620351225025476 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.3/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000347614620351225027650 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission-sdk-23: name='android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS' maxSdkVersion='27' uses-permission-sdk-23: name='android.permission.REQUEST_INSTALL_PACKAGES' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label:'Duplicate Permisssions' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='Duplicate Permisssions' icon='res/drawable/ic_launcher.png' banner='res/drawable/banner.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='18' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='18' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.software.leanback' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.3/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000157614620351225030025 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.3/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000124714620351225030131 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-label:'Caffeine Tile' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='Caffeine Tile' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.3/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000322614620351225027161 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission-sdk-23: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission-sdk-23: name='android.permission.WRITE_SETTINGS' maxSdkVersion='25' uses-permission: name='android.permission.NFC' application-label:'OBB Main Old Version' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Old Version' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' uses-feature-not-required: name='android.hardware.bluetooth' uses-feature-not-required: name='android.hardware.nfc' uses-feature-not-required: name='android.hardware.telephony' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.hardware.wifi' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.3/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000134614620351225027137 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.3/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000134614620351225027141 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.3/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000134614620351225027143 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.3/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000126414620351225027022 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.3/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000130514620351225026512 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' platformBuildVersionName='' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label:'DroidTR keyboard' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR keyboard' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/26.0.3/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000311614620351225025546 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' platformBuildVersionName='' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-label:'Battery level' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='Battery level' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9163828 fdroidserver-2.3a1/tests/build-tools/27.0.0/0000755000175000017500000000000014620351546017133 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.0/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001457714620351225025203 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' platformBuildVersionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.CALL_PHONE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.READ_SMS' uses-permission: name='android.permission.READ_PHONE_STATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.RECEIVE_MMS' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_SMS' uses-permission: name='com.android.vending.BILLING' uses-permission: name='android.permission.INTERNET' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission: name='com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission: name='com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission: name='com.majeur.launcher.permission.UPDATE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='android.permission.READ_APP_BADGE' uses-permission: name='com.oppo.launcher.permission.READ_SETTINGS' uses-permission: name='com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_WRITE' application-label:'QKSMS' application-label-af:'QKSMS' application-label-am:'QKSMS' application-label-ar:'QKSMS' application-label-as:'QKSMS' application-label-az:'QKSMS' application-label-be:'QKSMS' application-label-bg:'QKSMS' application-label-bn:'QKSMS' application-label-bs:'QKSMS' application-label-ca:'QKSMS' application-label-cs:'QKSMS' application-label-da:'QKSMS' application-label-de:'QKSMS' application-label-el:'QKSMS' application-label-en-AU:'QKSMS' application-label-en-CA:'QKSMS' application-label-en-GB:'QKSMS' application-label-en-IN:'QKSMS' application-label-en-XC:'QKSMS' application-label-es:'QKSMS' application-label-es-US:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-fa:'QKSMS' application-label-fi:'QKSMS' application-label-fr:'QKSMS' application-label-fr-CA:'QKSMS' application-label-gl:'QKSMS' application-label-gu:'QKSMS' application-label-hi:'QKSMS' application-label-hr:'QKSMS' application-label-hu:'QKSMS' application-label-hy:'QKSMS' application-label-in:'QKSMS' application-label-is:'QKSMS' application-label-it:'QKSMS' application-label-iw:'QKSMS' application-label-ja:'QKSMS' application-label-ka:'QKSMS' application-label-kk:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-ko:'QKSMS' application-label-ky:'QKSMS' application-label-lo:'QKSMS' application-label-lt:'QKSMS' application-label-lv:'QKSMS' application-label-mk:'QKSMS' application-label-ml:'QKSMS' application-label-mn:'QKSMS' application-label-mr:'QKSMS' application-label-ms:'QKSMS' application-label-my:'QKSMS' application-label-nb:'QKSMS' application-label-ne:'QKSMS' application-label-nl:'QKSMS' application-label-no:'QKSMS' application-label-or:'QKSMS' application-label-pa:'QKSMS' application-label-pl:'QKSMS' application-label-pt:'QKSMS' application-label-pt-BR:'QKSMS' application-label-pt-PT:'QKSMS' application-label-ro:'QKSMS' application-label-ru:'QKSMS' application-label-si:'QKSMS' application-label-sk:'QKSMS' application-label-sl:'QKSMS' application-label-sq:'QKSMS' application-label-sr:'QKSMS' application-label-sr-Latn:'QKSMS' application-label-sv:'QKSMS' application-label-sw:'QKSMS' application-label-ta:'QKSMS' application-label-te:'QKSMS' application-label-th:'QKSMS' application-label-tl:'QKSMS' application-label-tr:'QKSMS' application-label-uk:'QKSMS' application-label-ur:'QKSMS' application-label-uz:'QKSMS' application-label-vi:'QKSMS' application-label-zh:'QKSMS' application-label-zh-CN:'QKSMS' application-label-zh-HK:'QKSMS' application-label-zh-TW:'QKSMS' application-label-zu:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' provides-component:'app-widget' main other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'af' 'am' 'ar' 'as' 'az' 'be' 'bg' 'bn' 'bs' 'ca' 'cs' 'da' 'de' 'el' 'en-AU' 'en-CA' 'en-GB' 'en-IN' 'en-XC' 'es' 'es-US' 'et' 'eu' 'fa' 'fi' 'fr' 'fr-CA' 'gl' 'gu' 'hi' 'hr' 'hu' 'hy' 'in' 'is' 'it' 'iw' 'ja' 'ka' 'kk' 'km' 'kn' 'ko' 'ky' 'lo' 'lt' 'lv' 'mk' 'ml' 'mn' 'mr' 'ms' 'my' 'nb' 'ne' 'nl' 'no' 'or' 'pa' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'si' 'sk' 'sl' 'sq' 'sr' 'sr-Latn' 'sv' 'sw' 'ta' 'te' 'th' 'tl' 'tr' 'uk' 'ur' 'uz' 'vi' 'zh' 'zh-CN' 'zh-HK' 'zh-TW' 'zu' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.0/aapt-output-com.politedroid_3.txt0000644000175000017500000000262414620351225025470 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.0/aapt-output-com.politedroid_4.txt0000644000175000017500000000262414620351225025471 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.0/aapt-output-com.politedroid_5.txt0000644000175000017500000000170614620351225025472 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' platformBuildVersionName='' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.0/aapt-output-com.politedroid_6.txt0000644000175000017500000000174314620351225025474 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.0/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000347614620351225027646 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission-sdk-23: name='android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS' maxSdkVersion='27' uses-permission-sdk-23: name='android.permission.REQUEST_INSTALL_PACKAGES' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label:'Duplicate Permisssions' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='Duplicate Permisssions' icon='res/drawable/ic_launcher.png' banner='res/drawable/banner.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='18' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='18' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.software.leanback' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.0/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000157614620351225030023 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000124714620351225030127 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-label:'Caffeine Tile' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='Caffeine Tile' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.0/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000322614620351225027157 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission-sdk-23: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission-sdk-23: name='android.permission.WRITE_SETTINGS' maxSdkVersion='25' uses-permission: name='android.permission.NFC' application-label:'OBB Main Old Version' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Old Version' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' uses-feature-not-required: name='android.hardware.bluetooth' uses-feature-not-required: name='android.hardware.nfc' uses-feature-not-required: name='android.hardware.telephony' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.hardware.wifi' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.0/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000134614620351225027135 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.0/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000134614620351225027137 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.0/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000134614620351225027141 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.0/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000126414620351225027020 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.0/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000130514620351225026510 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' platformBuildVersionName='' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label:'DroidTR keyboard' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR keyboard' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.0/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000311614620351225025544 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' platformBuildVersionName='' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-label:'Battery level' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='Battery level' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9163828 fdroidserver-2.3a1/tests/build-tools/27.0.1/0000755000175000017500000000000014620351546017134 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.1/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001457714620351225025204 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' platformBuildVersionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.CALL_PHONE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.READ_SMS' uses-permission: name='android.permission.READ_PHONE_STATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.RECEIVE_MMS' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_SMS' uses-permission: name='com.android.vending.BILLING' uses-permission: name='android.permission.INTERNET' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission: name='com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission: name='com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission: name='com.majeur.launcher.permission.UPDATE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='android.permission.READ_APP_BADGE' uses-permission: name='com.oppo.launcher.permission.READ_SETTINGS' uses-permission: name='com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_WRITE' application-label:'QKSMS' application-label-af:'QKSMS' application-label-am:'QKSMS' application-label-ar:'QKSMS' application-label-as:'QKSMS' application-label-az:'QKSMS' application-label-be:'QKSMS' application-label-bg:'QKSMS' application-label-bn:'QKSMS' application-label-bs:'QKSMS' application-label-ca:'QKSMS' application-label-cs:'QKSMS' application-label-da:'QKSMS' application-label-de:'QKSMS' application-label-el:'QKSMS' application-label-en-AU:'QKSMS' application-label-en-CA:'QKSMS' application-label-en-GB:'QKSMS' application-label-en-IN:'QKSMS' application-label-en-XC:'QKSMS' application-label-es:'QKSMS' application-label-es-US:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-fa:'QKSMS' application-label-fi:'QKSMS' application-label-fr:'QKSMS' application-label-fr-CA:'QKSMS' application-label-gl:'QKSMS' application-label-gu:'QKSMS' application-label-hi:'QKSMS' application-label-hr:'QKSMS' application-label-hu:'QKSMS' application-label-hy:'QKSMS' application-label-in:'QKSMS' application-label-is:'QKSMS' application-label-it:'QKSMS' application-label-iw:'QKSMS' application-label-ja:'QKSMS' application-label-ka:'QKSMS' application-label-kk:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-ko:'QKSMS' application-label-ky:'QKSMS' application-label-lo:'QKSMS' application-label-lt:'QKSMS' application-label-lv:'QKSMS' application-label-mk:'QKSMS' application-label-ml:'QKSMS' application-label-mn:'QKSMS' application-label-mr:'QKSMS' application-label-ms:'QKSMS' application-label-my:'QKSMS' application-label-nb:'QKSMS' application-label-ne:'QKSMS' application-label-nl:'QKSMS' application-label-no:'QKSMS' application-label-or:'QKSMS' application-label-pa:'QKSMS' application-label-pl:'QKSMS' application-label-pt:'QKSMS' application-label-pt-BR:'QKSMS' application-label-pt-PT:'QKSMS' application-label-ro:'QKSMS' application-label-ru:'QKSMS' application-label-si:'QKSMS' application-label-sk:'QKSMS' application-label-sl:'QKSMS' application-label-sq:'QKSMS' application-label-sr:'QKSMS' application-label-sr-Latn:'QKSMS' application-label-sv:'QKSMS' application-label-sw:'QKSMS' application-label-ta:'QKSMS' application-label-te:'QKSMS' application-label-th:'QKSMS' application-label-tl:'QKSMS' application-label-tr:'QKSMS' application-label-uk:'QKSMS' application-label-ur:'QKSMS' application-label-uz:'QKSMS' application-label-vi:'QKSMS' application-label-zh:'QKSMS' application-label-zh-CN:'QKSMS' application-label-zh-HK:'QKSMS' application-label-zh-TW:'QKSMS' application-label-zu:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' provides-component:'app-widget' main other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'af' 'am' 'ar' 'as' 'az' 'be' 'bg' 'bn' 'bs' 'ca' 'cs' 'da' 'de' 'el' 'en-AU' 'en-CA' 'en-GB' 'en-IN' 'en-XC' 'es' 'es-US' 'et' 'eu' 'fa' 'fi' 'fr' 'fr-CA' 'gl' 'gu' 'hi' 'hr' 'hu' 'hy' 'in' 'is' 'it' 'iw' 'ja' 'ka' 'kk' 'km' 'kn' 'ko' 'ky' 'lo' 'lt' 'lv' 'mk' 'ml' 'mn' 'mr' 'ms' 'my' 'nb' 'ne' 'nl' 'no' 'or' 'pa' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'si' 'sk' 'sl' 'sq' 'sr' 'sr-Latn' 'sv' 'sw' 'ta' 'te' 'th' 'tl' 'tr' 'uk' 'ur' 'uz' 'vi' 'zh' 'zh-CN' 'zh-HK' 'zh-TW' 'zu' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.1/aapt-output-com.politedroid_3.txt0000644000175000017500000000262414620351225025471 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.1/aapt-output-com.politedroid_4.txt0000644000175000017500000000262414620351225025472 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.1/aapt-output-com.politedroid_5.txt0000644000175000017500000000170614620351225025473 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' platformBuildVersionName='' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.1/aapt-output-com.politedroid_6.txt0000644000175000017500000000174314620351225025475 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.1/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000347614620351225027647 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission-sdk-23: name='android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS' maxSdkVersion='27' uses-permission-sdk-23: name='android.permission.REQUEST_INSTALL_PACKAGES' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label:'Duplicate Permisssions' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='Duplicate Permisssions' icon='res/drawable/ic_launcher.png' banner='res/drawable/banner.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='18' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='18' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.software.leanback' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.1/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000157614620351225030024 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000124714620351225030130 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-label:'Caffeine Tile' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='Caffeine Tile' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.1/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000322614620351225027160 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission-sdk-23: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission-sdk-23: name='android.permission.WRITE_SETTINGS' maxSdkVersion='25' uses-permission: name='android.permission.NFC' application-label:'OBB Main Old Version' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Old Version' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' uses-feature-not-required: name='android.hardware.bluetooth' uses-feature-not-required: name='android.hardware.nfc' uses-feature-not-required: name='android.hardware.telephony' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.hardware.wifi' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.1/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000134614620351225027136 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.1/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000134614620351225027140 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.1/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000134614620351225027142 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.1/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000126414620351225027021 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.1/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000130514620351225026511 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' platformBuildVersionName='' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label:'DroidTR keyboard' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR keyboard' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.1/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000311614620351225025545 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' platformBuildVersionName='' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-label:'Battery level' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='Battery level' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9163828 fdroidserver-2.3a1/tests/build-tools/27.0.2/0000755000175000017500000000000014620351546017135 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.2/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001457714620351225025205 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' platformBuildVersionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.CALL_PHONE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.READ_SMS' uses-permission: name='android.permission.READ_PHONE_STATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.RECEIVE_MMS' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_SMS' uses-permission: name='com.android.vending.BILLING' uses-permission: name='android.permission.INTERNET' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission: name='com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission: name='com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission: name='com.majeur.launcher.permission.UPDATE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='android.permission.READ_APP_BADGE' uses-permission: name='com.oppo.launcher.permission.READ_SETTINGS' uses-permission: name='com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_WRITE' application-label:'QKSMS' application-label-af:'QKSMS' application-label-am:'QKSMS' application-label-ar:'QKSMS' application-label-as:'QKSMS' application-label-az:'QKSMS' application-label-be:'QKSMS' application-label-bg:'QKSMS' application-label-bn:'QKSMS' application-label-bs:'QKSMS' application-label-ca:'QKSMS' application-label-cs:'QKSMS' application-label-da:'QKSMS' application-label-de:'QKSMS' application-label-el:'QKSMS' application-label-en-AU:'QKSMS' application-label-en-CA:'QKSMS' application-label-en-GB:'QKSMS' application-label-en-IN:'QKSMS' application-label-en-XC:'QKSMS' application-label-es:'QKSMS' application-label-es-US:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-fa:'QKSMS' application-label-fi:'QKSMS' application-label-fr:'QKSMS' application-label-fr-CA:'QKSMS' application-label-gl:'QKSMS' application-label-gu:'QKSMS' application-label-hi:'QKSMS' application-label-hr:'QKSMS' application-label-hu:'QKSMS' application-label-hy:'QKSMS' application-label-in:'QKSMS' application-label-is:'QKSMS' application-label-it:'QKSMS' application-label-iw:'QKSMS' application-label-ja:'QKSMS' application-label-ka:'QKSMS' application-label-kk:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-ko:'QKSMS' application-label-ky:'QKSMS' application-label-lo:'QKSMS' application-label-lt:'QKSMS' application-label-lv:'QKSMS' application-label-mk:'QKSMS' application-label-ml:'QKSMS' application-label-mn:'QKSMS' application-label-mr:'QKSMS' application-label-ms:'QKSMS' application-label-my:'QKSMS' application-label-nb:'QKSMS' application-label-ne:'QKSMS' application-label-nl:'QKSMS' application-label-no:'QKSMS' application-label-or:'QKSMS' application-label-pa:'QKSMS' application-label-pl:'QKSMS' application-label-pt:'QKSMS' application-label-pt-BR:'QKSMS' application-label-pt-PT:'QKSMS' application-label-ro:'QKSMS' application-label-ru:'QKSMS' application-label-si:'QKSMS' application-label-sk:'QKSMS' application-label-sl:'QKSMS' application-label-sq:'QKSMS' application-label-sr:'QKSMS' application-label-sr-Latn:'QKSMS' application-label-sv:'QKSMS' application-label-sw:'QKSMS' application-label-ta:'QKSMS' application-label-te:'QKSMS' application-label-th:'QKSMS' application-label-tl:'QKSMS' application-label-tr:'QKSMS' application-label-uk:'QKSMS' application-label-ur:'QKSMS' application-label-uz:'QKSMS' application-label-vi:'QKSMS' application-label-zh:'QKSMS' application-label-zh-CN:'QKSMS' application-label-zh-HK:'QKSMS' application-label-zh-TW:'QKSMS' application-label-zu:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' provides-component:'app-widget' main other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'af' 'am' 'ar' 'as' 'az' 'be' 'bg' 'bn' 'bs' 'ca' 'cs' 'da' 'de' 'el' 'en-AU' 'en-CA' 'en-GB' 'en-IN' 'en-XC' 'es' 'es-US' 'et' 'eu' 'fa' 'fi' 'fr' 'fr-CA' 'gl' 'gu' 'hi' 'hr' 'hu' 'hy' 'in' 'is' 'it' 'iw' 'ja' 'ka' 'kk' 'km' 'kn' 'ko' 'ky' 'lo' 'lt' 'lv' 'mk' 'ml' 'mn' 'mr' 'ms' 'my' 'nb' 'ne' 'nl' 'no' 'or' 'pa' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'si' 'sk' 'sl' 'sq' 'sr' 'sr-Latn' 'sv' 'sw' 'ta' 'te' 'th' 'tl' 'tr' 'uk' 'ur' 'uz' 'vi' 'zh' 'zh-CN' 'zh-HK' 'zh-TW' 'zu' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.2/aapt-output-com.politedroid_3.txt0000644000175000017500000000262414620351225025472 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.2/aapt-output-com.politedroid_4.txt0000644000175000017500000000262414620351225025473 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.2/aapt-output-com.politedroid_5.txt0000644000175000017500000000170614620351225025474 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' platformBuildVersionName='' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.2/aapt-output-com.politedroid_6.txt0000644000175000017500000000174314620351225025476 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.2/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000347614620351225027650 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission-sdk-23: name='android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS' maxSdkVersion='27' uses-permission-sdk-23: name='android.permission.REQUEST_INSTALL_PACKAGES' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label:'Duplicate Permisssions' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='Duplicate Permisssions' icon='res/drawable/ic_launcher.png' banner='res/drawable/banner.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='18' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='18' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.software.leanback' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.2/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000157614620351225030025 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.2/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000124714620351225030131 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-label:'Caffeine Tile' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='Caffeine Tile' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.2/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000322614620351225027161 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission-sdk-23: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission-sdk-23: name='android.permission.WRITE_SETTINGS' maxSdkVersion='25' uses-permission: name='android.permission.NFC' application-label:'OBB Main Old Version' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Old Version' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' uses-feature-not-required: name='android.hardware.bluetooth' uses-feature-not-required: name='android.hardware.nfc' uses-feature-not-required: name='android.hardware.telephony' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.hardware.wifi' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.2/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000134614620351225027137 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.2/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000134614620351225027141 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.2/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000134614620351225027143 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.2/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000126414620351225027022 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.2/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000130514620351225026512 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' platformBuildVersionName='' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label:'DroidTR keyboard' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR keyboard' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.2/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000311614620351225025546 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' platformBuildVersionName='' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-label:'Battery level' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='Battery level' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9163828 fdroidserver-2.3a1/tests/build-tools/27.0.3/0000755000175000017500000000000014620351546017136 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.3/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001457714620351225025206 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' platformBuildVersionName='3.4.3' sdkVersion:'21' targetSdkVersion:'28' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.CALL_PHONE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.READ_SMS' uses-permission: name='android.permission.READ_PHONE_STATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.RECEIVE_MMS' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_SMS' uses-permission: name='com.android.vending.BILLING' uses-permission: name='android.permission.INTERNET' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission: name='com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission: name='com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission: name='com.majeur.launcher.permission.UPDATE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='android.permission.READ_APP_BADGE' uses-permission: name='com.oppo.launcher.permission.READ_SETTINGS' uses-permission: name='com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_WRITE' application-label:'QKSMS' application-label-af:'QKSMS' application-label-am:'QKSMS' application-label-ar:'QKSMS' application-label-as:'QKSMS' application-label-az:'QKSMS' application-label-be:'QKSMS' application-label-bg:'QKSMS' application-label-bn:'QKSMS' application-label-bs:'QKSMS' application-label-ca:'QKSMS' application-label-cs:'QKSMS' application-label-da:'QKSMS' application-label-de:'QKSMS' application-label-el:'QKSMS' application-label-en-AU:'QKSMS' application-label-en-CA:'QKSMS' application-label-en-GB:'QKSMS' application-label-en-IN:'QKSMS' application-label-en-XC:'QKSMS' application-label-es:'QKSMS' application-label-es-US:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-fa:'QKSMS' application-label-fi:'QKSMS' application-label-fr:'QKSMS' application-label-fr-CA:'QKSMS' application-label-gl:'QKSMS' application-label-gu:'QKSMS' application-label-hi:'QKSMS' application-label-hr:'QKSMS' application-label-hu:'QKSMS' application-label-hy:'QKSMS' application-label-in:'QKSMS' application-label-is:'QKSMS' application-label-it:'QKSMS' application-label-iw:'QKSMS' application-label-ja:'QKSMS' application-label-ka:'QKSMS' application-label-kk:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-ko:'QKSMS' application-label-ky:'QKSMS' application-label-lo:'QKSMS' application-label-lt:'QKSMS' application-label-lv:'QKSMS' application-label-mk:'QKSMS' application-label-ml:'QKSMS' application-label-mn:'QKSMS' application-label-mr:'QKSMS' application-label-ms:'QKSMS' application-label-my:'QKSMS' application-label-nb:'QKSMS' application-label-ne:'QKSMS' application-label-nl:'QKSMS' application-label-no:'QKSMS' application-label-or:'QKSMS' application-label-pa:'QKSMS' application-label-pl:'QKSMS' application-label-pt:'QKSMS' application-label-pt-BR:'QKSMS' application-label-pt-PT:'QKSMS' application-label-ro:'QKSMS' application-label-ru:'QKSMS' application-label-si:'QKSMS' application-label-sk:'QKSMS' application-label-sl:'QKSMS' application-label-sq:'QKSMS' application-label-sr:'QKSMS' application-label-sr-Latn:'QKSMS' application-label-sv:'QKSMS' application-label-sw:'QKSMS' application-label-ta:'QKSMS' application-label-te:'QKSMS' application-label-th:'QKSMS' application-label-tl:'QKSMS' application-label-tr:'QKSMS' application-label-uk:'QKSMS' application-label-ur:'QKSMS' application-label-uz:'QKSMS' application-label-vi:'QKSMS' application-label-zh:'QKSMS' application-label-zh-CN:'QKSMS' application-label-zh-HK:'QKSMS' application-label-zh-TW:'QKSMS' application-label-zu:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' provides-component:'app-widget' main other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'af' 'am' 'ar' 'as' 'az' 'be' 'bg' 'bn' 'bs' 'ca' 'cs' 'da' 'de' 'el' 'en-AU' 'en-CA' 'en-GB' 'en-IN' 'en-XC' 'es' 'es-US' 'et' 'eu' 'fa' 'fi' 'fr' 'fr-CA' 'gl' 'gu' 'hi' 'hr' 'hu' 'hy' 'in' 'is' 'it' 'iw' 'ja' 'ka' 'kk' 'km' 'kn' 'ko' 'ky' 'lo' 'lt' 'lv' 'mk' 'ml' 'mn' 'mr' 'ms' 'my' 'nb' 'ne' 'nl' 'no' 'or' 'pa' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'si' 'sk' 'sl' 'sq' 'sr' 'sr-Latn' 'sv' 'sw' 'ta' 'te' 'th' 'tl' 'tr' 'uk' 'ur' 'uz' 'vi' 'zh' 'zh-CN' 'zh-HK' 'zh-TW' 'zu' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.3/aapt-output-com.politedroid_3.txt0000644000175000017500000000262414620351225025473 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.3/aapt-output-com.politedroid_4.txt0000644000175000017500000000262414620351225025474 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' platformBuildVersionName='' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.3/aapt-output-com.politedroid_5.txt0000644000175000017500000000170614620351225025475 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' platformBuildVersionName='' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.3/aapt-output-com.politedroid_6.txt0000644000175000017500000000174314620351225025477 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.3/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000347614620351225027651 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission-sdk-23: name='android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS' maxSdkVersion='27' uses-permission-sdk-23: name='android.permission.REQUEST_INSTALL_PACKAGES' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label:'Duplicate Permisssions' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='Duplicate Permisssions' icon='res/drawable/ic_launcher.png' banner='res/drawable/banner.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='18' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='18' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.software.leanback' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.3/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000157614620351225030026 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.3/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000124714620351225030132 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-label:'Caffeine Tile' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='Caffeine Tile' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.3/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000322614620351225027162 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission-sdk-23: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission-sdk-23: name='android.permission.WRITE_SETTINGS' maxSdkVersion='25' uses-permission: name='android.permission.NFC' application-label:'OBB Main Old Version' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Old Version' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' uses-feature-not-required: name='android.hardware.bluetooth' uses-feature-not-required: name='android.hardware.nfc' uses-feature-not-required: name='android.hardware.telephony' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.hardware.wifi' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.3/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000134614620351225027140 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.3/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000134614620351225027142 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.3/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000134614620351225027144 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.3/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000126414620351225027023 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.3/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000130514620351225026513 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' platformBuildVersionName='' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label:'DroidTR keyboard' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR keyboard' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/27.0.3/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000311614620351225025547 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' platformBuildVersionName='' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-label:'Battery level' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='Battery level' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.920383 fdroidserver-2.3a1/tests/build-tools/28.0.0/0000755000175000017500000000000014620351546017134 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.0/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001466414620351225025201 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' platformBuildVersionName='3.4.3' compileSdkVersion='28' compileSdkVersionCodename='9' sdkVersion:'21' targetSdkVersion:'28' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.CALL_PHONE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.READ_SMS' uses-permission: name='android.permission.READ_PHONE_STATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.RECEIVE_MMS' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_SMS' uses-permission: name='com.android.vending.BILLING' uses-permission: name='android.permission.INTERNET' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission: name='com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission: name='com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission: name='com.majeur.launcher.permission.UPDATE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='android.permission.READ_APP_BADGE' uses-permission: name='com.oppo.launcher.permission.READ_SETTINGS' uses-permission: name='com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_WRITE' application-label:'QKSMS' application-label-af:'QKSMS' application-label-am:'QKSMS' application-label-ar:'QKSMS' application-label-as:'QKSMS' application-label-az:'QKSMS' application-label-be:'QKSMS' application-label-bg:'QKSMS' application-label-bn:'QKSMS' application-label-bs:'QKSMS' application-label-ca:'QKSMS' application-label-cs:'QKSMS' application-label-da:'QKSMS' application-label-de:'QKSMS' application-label-el:'QKSMS' application-label-en-AU:'QKSMS' application-label-en-CA:'QKSMS' application-label-en-GB:'QKSMS' application-label-en-IN:'QKSMS' application-label-en-XC:'QKSMS' application-label-es:'QKSMS' application-label-es-US:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-fa:'QKSMS' application-label-fi:'QKSMS' application-label-fr:'QKSMS' application-label-fr-CA:'QKSMS' application-label-gl:'QKSMS' application-label-gu:'QKSMS' application-label-hi:'QKSMS' application-label-hr:'QKSMS' application-label-hu:'QKSMS' application-label-hy:'QKSMS' application-label-in:'QKSMS' application-label-is:'QKSMS' application-label-it:'QKSMS' application-label-iw:'QKSMS' application-label-ja:'QKSMS' application-label-ka:'QKSMS' application-label-kk:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-ko:'QKSMS' application-label-ky:'QKSMS' application-label-lo:'QKSMS' application-label-lt:'QKSMS' application-label-lv:'QKSMS' application-label-mk:'QKSMS' application-label-ml:'QKSMS' application-label-mn:'QKSMS' application-label-mr:'QKSMS' application-label-ms:'QKSMS' application-label-my:'QKSMS' application-label-nb:'QKSMS' application-label-ne:'QKSMS' application-label-nl:'QKSMS' application-label-no:'QKSMS' application-label-or:'QKSMS' application-label-pa:'QKSMS' application-label-pl:'QKSMS' application-label-pt:'QKSMS' application-label-pt-BR:'QKSMS' application-label-pt-PT:'QKSMS' application-label-ro:'QKSMS' application-label-ru:'QKSMS' application-label-si:'QKSMS' application-label-sk:'QKSMS' application-label-sl:'QKSMS' application-label-sq:'QKSMS' application-label-sr:'QKSMS' application-label-sr-Latn:'QKSMS' application-label-sv:'QKSMS' application-label-sw:'QKSMS' application-label-ta:'QKSMS' application-label-te:'QKSMS' application-label-th:'QKSMS' application-label-tl:'QKSMS' application-label-tr:'QKSMS' application-label-uk:'QKSMS' application-label-ur:'QKSMS' application-label-uz:'QKSMS' application-label-vi:'QKSMS' application-label-zh:'QKSMS' application-label-zh-CN:'QKSMS' application-label-zh-HK:'QKSMS' application-label-zh-TW:'QKSMS' application-label-zu:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' provides-component:'app-widget' main other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'af' 'am' 'ar' 'as' 'az' 'be' 'bg' 'bn' 'bs' 'ca' 'cs' 'da' 'de' 'el' 'en-AU' 'en-CA' 'en-GB' 'en-IN' 'en-XC' 'es' 'es-US' 'et' 'eu' 'fa' 'fi' 'fr' 'fr-CA' 'gl' 'gu' 'hi' 'hr' 'hu' 'hy' 'in' 'is' 'it' 'iw' 'ja' 'ka' 'kk' 'km' 'kn' 'ko' 'ky' 'lo' 'lt' 'lv' 'mk' 'ml' 'mn' 'mr' 'ms' 'my' 'nb' 'ne' 'nl' 'no' 'or' 'pa' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'si' 'sk' 'sl' 'sq' 'sr' 'sr-Latn' 'sv' 'sw' 'ta' 'te' 'th' 'tl' 'tr' 'uk' 'ur' 'uz' 'vi' 'zh' 'zh-CN' 'zh-HK' 'zh-TW' 'zu' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.0/aapt-output-com.politedroid_3.txt0000644000175000017500000000257014620351225025471 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.0/aapt-output-com.politedroid_4.txt0000644000175000017500000000257014620351225025472 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.0/aapt-output-com.politedroid_5.txt0000644000175000017500000000165214620351225025473 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.0/aapt-output-com.politedroid_6.txt0000644000175000017500000000174314620351225025475 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.0/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000347614620351225027647 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission-sdk-23: name='android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS' maxSdkVersion='27' uses-permission-sdk-23: name='android.permission.REQUEST_INSTALL_PACKAGES' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label:'Duplicate Permisssions' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='Duplicate Permisssions' icon='res/drawable/ic_launcher.png' banner='res/drawable/banner.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='18' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='18' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.software.leanback' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.0/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000157614620351225030024 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000124714620351225030130 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-label:'Caffeine Tile' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='Caffeine Tile' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.0/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000322614620351225027160 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission-sdk-23: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission-sdk-23: name='android.permission.WRITE_SETTINGS' maxSdkVersion='25' uses-permission: name='android.permission.NFC' application-label:'OBB Main Old Version' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Old Version' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' uses-feature-not-required: name='android.hardware.bluetooth' uses-feature-not-required: name='android.hardware.nfc' uses-feature-not-required: name='android.hardware.telephony' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.hardware.wifi' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.0/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000134614620351225027136 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.0/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000134614620351225027140 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.0/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000134614620351225027142 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.0/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000126414620351225027021 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.0/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000133614620351225026515 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' compileSdkVersion='28' compileSdkVersionCodename='9' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label:'DroidTR keyboard' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR keyboard' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.0/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000306214620351225025545 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-label:'Battery level' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='Battery level' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.920383 fdroidserver-2.3a1/tests/build-tools/28.0.1/0000755000175000017500000000000014620351546017135 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.1/aapt-output-com.moez.QKSMS_182.txt0000644000175000017500000001466414620351225025202 0ustar00hanshanspackage: name='com.moez.QKSMS' versionCode='182' versionName='3.4.3' platformBuildVersionName='3.4.3' compileSdkVersion='28' compileSdkVersionCodename='9' sdkVersion:'21' targetSdkVersion:'28' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.CALL_PHONE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.READ_SMS' uses-permission: name='android.permission.READ_PHONE_STATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='android.permission.RECEIVE_MMS' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_SMS' uses-permission: name='com.android.vending.BILLING' uses-permission: name='android.permission.INTERNET' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE' uses-permission: name='com.sonymobile.home.permission.PROVIDER_INSERT_BADGE' uses-permission: name='com.anddoes.launcher.permission.UPDATE_COUNT' uses-permission: name='com.majeur.launcher.permission.UPDATE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='android.permission.READ_APP_BADGE' uses-permission: name='com.oppo.launcher.permission.READ_SETTINGS' uses-permission: name='com.oppo.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_WRITE' application-label:'QKSMS' application-label-af:'QKSMS' application-label-am:'QKSMS' application-label-ar:'QKSMS' application-label-as:'QKSMS' application-label-az:'QKSMS' application-label-be:'QKSMS' application-label-bg:'QKSMS' application-label-bn:'QKSMS' application-label-bs:'QKSMS' application-label-ca:'QKSMS' application-label-cs:'QKSMS' application-label-da:'QKSMS' application-label-de:'QKSMS' application-label-el:'QKSMS' application-label-en-AU:'QKSMS' application-label-en-CA:'QKSMS' application-label-en-GB:'QKSMS' application-label-en-IN:'QKSMS' application-label-en-XC:'QKSMS' application-label-es:'QKSMS' application-label-es-US:'QKSMS' application-label-et:'QKSMS' application-label-eu:'QKSMS' application-label-fa:'QKSMS' application-label-fi:'QKSMS' application-label-fr:'QKSMS' application-label-fr-CA:'QKSMS' application-label-gl:'QKSMS' application-label-gu:'QKSMS' application-label-hi:'QKSMS' application-label-hr:'QKSMS' application-label-hu:'QKSMS' application-label-hy:'QKSMS' application-label-in:'QKSMS' application-label-is:'QKSMS' application-label-it:'QKSMS' application-label-iw:'QKSMS' application-label-ja:'QKSMS' application-label-ka:'QKSMS' application-label-kk:'QKSMS' application-label-km:'QKSMS' application-label-kn:'QKSMS' application-label-ko:'QKSMS' application-label-ky:'QKSMS' application-label-lo:'QKSMS' application-label-lt:'QKSMS' application-label-lv:'QKSMS' application-label-mk:'QKSMS' application-label-ml:'QKSMS' application-label-mn:'QKSMS' application-label-mr:'QKSMS' application-label-ms:'QKSMS' application-label-my:'QKSMS' application-label-nb:'QKSMS' application-label-ne:'QKSMS' application-label-nl:'QKSMS' application-label-no:'QKSMS' application-label-or:'QKSMS' application-label-pa:'QKSMS' application-label-pl:'QKSMS' application-label-pt:'QKSMS' application-label-pt-BR:'QKSMS' application-label-pt-PT:'QKSMS' application-label-ro:'QKSMS' application-label-ru:'QKSMS' application-label-si:'QKSMS' application-label-sk:'QKSMS' application-label-sl:'QKSMS' application-label-sq:'QKSMS' application-label-sr:'QKSMS' application-label-sr-Latn:'QKSMS' application-label-sv:'QKSMS' application-label-sw:'QKSMS' application-label-ta:'QKSMS' application-label-te:'QKSMS' application-label-th:'QKSMS' application-label-tl:'QKSMS' application-label-tr:'QKSMS' application-label-uk:'QKSMS' application-label-ur:'QKSMS' application-label-uz:'QKSMS' application-label-vi:'QKSMS' application-label-zh:'QKSMS' application-label-zh-CN:'QKSMS' application-label-zh-HK:'QKSMS' application-label-zh-TW:'QKSMS' application-label-zu:'QKSMS' application-icon-120:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-160:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-240:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-320:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-480:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-640:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-xxxhdpi-v26/ic_launcher.xml' application: label='QKSMS' icon='res/mipmap-xxxhdpi-v26/ic_launcher.xml' launchable-activity: name='com.moez.QKSMS.feature.main.MainActivity' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' provides-component:'app-widget' main other-activities other-receivers other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'af' 'am' 'ar' 'as' 'az' 'be' 'bg' 'bn' 'bs' 'ca' 'cs' 'da' 'de' 'el' 'en-AU' 'en-CA' 'en-GB' 'en-IN' 'en-XC' 'es' 'es-US' 'et' 'eu' 'fa' 'fi' 'fr' 'fr-CA' 'gl' 'gu' 'hi' 'hr' 'hu' 'hy' 'in' 'is' 'it' 'iw' 'ja' 'ka' 'kk' 'km' 'kn' 'ko' 'ky' 'lo' 'lt' 'lv' 'mk' 'ml' 'mn' 'mr' 'ms' 'my' 'nb' 'ne' 'nl' 'no' 'or' 'pa' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'si' 'sk' 'sl' 'sq' 'sr' 'sr-Latn' 'sv' 'sw' 'ta' 'te' 'th' 'tl' 'tr' 'uk' 'ur' 'uz' 'vi' 'zh' 'zh-CN' 'zh-HK' 'zh-TW' 'zu' densities: '120' '160' '240' '320' '480' '640' '65534' native-code: 'arm64-v8a' 'armeabi-v7a' 'mips' 'x86' 'x86_64' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.1/aapt-output-com.politedroid_3.txt0000644000175000017500000000257014620351225025472 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.1/aapt-output-com.politedroid_4.txt0000644000175000017500000000257014620351225025473 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.1/aapt-output-com.politedroid_5.txt0000644000175000017500000000165214620351225025474 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.1/aapt-output-com.politedroid_6.txt0000644000175000017500000000174314620351225025476 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.1/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000347614620351225027650 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission-sdk-23: name='android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS' maxSdkVersion='27' uses-permission-sdk-23: name='android.permission.REQUEST_INSTALL_PACKAGES' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label:'Duplicate Permisssions' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='Duplicate Permisssions' icon='res/drawable/ic_launcher.png' banner='res/drawable/banner.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='18' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='18' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.software.leanback' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.1/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000157614620351225030025 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000124714620351225030131 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-label:'Caffeine Tile' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='Caffeine Tile' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.1/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000322614620351225027161 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission-sdk-23: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission-sdk-23: name='android.permission.WRITE_SETTINGS' maxSdkVersion='25' uses-permission: name='android.permission.NFC' application-label:'OBB Main Old Version' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Old Version' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' uses-feature-not-required: name='android.hardware.bluetooth' uses-feature-not-required: name='android.hardware.nfc' uses-feature-not-required: name='android.hardware.telephony' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.hardware.wifi' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.1/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000134614620351225027137 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.1/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000134614620351225027141 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.1/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000134614620351225027143 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.1/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000126414620351225027022 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.1/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000133614620351225026516 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' compileSdkVersion='28' compileSdkVersionCodename='9' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label:'DroidTR keyboard' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR keyboard' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.1/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000306214620351225025546 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-label:'Battery level' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='Battery level' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.920383 fdroidserver-2.3a1/tests/build-tools/28.0.2/0000755000175000017500000000000014620351546017136 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.2/aapt-output-com.politedroid_3.txt0000644000175000017500000000257014620351225025473 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.2/aapt-output-com.politedroid_4.txt0000644000175000017500000000257014620351225025474 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.2/aapt-output-com.politedroid_5.txt0000644000175000017500000000165214620351225025475 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.2/aapt-output-com.politedroid_6.txt0000644000175000017500000000174314620351225025477 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.2/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000347614620351225027651 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission-sdk-23: name='android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS' maxSdkVersion='27' uses-permission-sdk-23: name='android.permission.REQUEST_INSTALL_PACKAGES' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label:'Duplicate Permisssions' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='Duplicate Permisssions' icon='res/drawable/ic_launcher.png' banner='res/drawable/banner.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='18' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='18' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.software.leanback' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.2/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000157614620351225030026 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.2/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000124714620351225030132 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-label:'Caffeine Tile' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='Caffeine Tile' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.2/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000322614620351225027162 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission-sdk-23: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission-sdk-23: name='android.permission.WRITE_SETTINGS' maxSdkVersion='25' uses-permission: name='android.permission.NFC' application-label:'OBB Main Old Version' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Old Version' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' uses-feature-not-required: name='android.hardware.bluetooth' uses-feature-not-required: name='android.hardware.nfc' uses-feature-not-required: name='android.hardware.telephony' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.hardware.wifi' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.2/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000134614620351225027140 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.2/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000134614620351225027142 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.2/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000134614620351225027144 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.2/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000126414620351225027023 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.2/aapt-output-org.droidtr.keyboard_34.txt0000644000175000017500000000133614620351225026517 0ustar00hanshanspackage: name='org.droidtr.keyboard' versionCode='34' versionName='5.5' compileSdkVersion='28' compileSdkVersionCodename='9' sdkVersion:'8' targetSdkVersion:'28' uses-permission: name='android.permission.VIBRATE' application-label:'DroidTR keyboard' application-label-tr:'DroidTR Klavye' application-icon-160:'res/drawable/ic_launcher.png' application: label='DroidTR keyboard' icon='res/drawable/ic_launcher.png' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' provides-component:'ime' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'tr' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.2/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000306214620351225025547 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-label:'Battery level' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='Battery level' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.920383 fdroidserver-2.3a1/tests/build-tools/28.0.3/0000755000175000017500000000000014620351546017137 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.3/aapt-output-com.example.test.helloworld_1.txt0000644000175000017500000000121714620351225027734 0ustar00hanshanspackage: name='com.example.test.helloworld' versionCode='1' versionName='1.0' compileSdkVersion='28' compileSdkVersionCodename='9' sdkVersion:'18' targetSdkVersion:'28' application-label:'HelloWorld' application: label='HelloWorld' icon='' launchable-activity: name='com.example.test.helloworld.MainActivity' label='' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' '480' '640' '65534' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.3/aapt-output-com.politedroid_3.txt0000644000175000017500000000257014620351225025474 0ustar00hanshanspackage: name='com.politedroid' versionCode='3' versionName='1.2' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.3/aapt-output-com.politedroid_4.txt0000644000175000017500000000257014620351225025475 0ustar00hanshanspackage: name='com.politedroid' versionCode='4' versionName='1.3' sdkVersion:'3' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.3/aapt-output-com.politedroid_5.txt0000644000175000017500000000165214620351225025476 0ustar00hanshanspackage: name='com.politedroid' versionCode='5' versionName='1.4' sdkVersion:'3' targetSdkVersion:'10' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application-icon-320:'res/drawable-xhdpi/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.3/aapt-output-com.politedroid_6.txt0000644000175000017500000000174314620351225025500 0ustar00hanshanspackage: name='com.politedroid' versionCode='6' versionName='1.5' platformBuildVersionName='5.0.1-1624448' sdkVersion:'14' targetSdkVersion:'21' uses-permission: name='android.permission.READ_CALENDAR' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' application-label:'Polite Droid' application-icon-120:'res/drawable-ldpi-v4/icon.png' application-icon-160:'res/drawable-mdpi-v4/icon.png' application-icon-240:'res/drawable-hdpi-v4/icon.png' application-icon-320:'res/drawable-xhdpi-v4/icon.png' application: label='Polite Droid' icon='res/drawable-mdpi-v4/icon.png' launchable-activity: name='com.politedroid.Preferences' label='Polite Droid' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240' '320' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.3/aapt-output-duplicate.permisssions_9999999.txt0000644000175000017500000000347614620351225027652 0ustar00hanshanspackage: name='duplicate.permisssions' versionCode='9999999' versionName='' platformBuildVersionName='6.0-2704002' sdkVersion:'18' targetSdkVersion:'27' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.INTERNET' uses-permission-sdk-23: name='android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS' maxSdkVersion='27' uses-permission-sdk-23: name='android.permission.REQUEST_INSTALL_PACKAGES' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='18' application-label:'Duplicate Permisssions' application-label-ar:'أذونات مكررة' application-icon-160:'res/drawable/ic_launcher.png' application: label='Duplicate Permisssions' icon='res/drawable/ic_launcher.png' banner='res/drawable/banner.png' application-debuggable launchable-activity: name='info.guardianproject.urzip.MainActivity' label='Duplicate Permisssions' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='18' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='18' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.software.leanback' uses-feature: name='android.hardware.wifi' uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, and requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'ar' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.3/aapt-output-info.guardianproject.urzip_100.txt0000644000175000017500000000157614620351225030027 0ustar00hanshanspackage: name='info.guardianproject.urzip' versionCode='100' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.3/aapt-output-info.zwanenburg.caffeinetile_4.txt0000644000175000017500000000124714620351225030133 0ustar00hanshanspackage: name='info.zwanenburg.caffeinetile' versionCode='4' versionName='1.3' platformBuildVersionName='7.1.1' sdkVersion:'24' targetSdkVersion:'25' uses-permission: name='android.permission.WAKE_LOCK' application-label:'Caffeine Tile' application-icon-160:'res/drawable/ic_coffee_on.xml' application: label='Caffeine Tile' icon='res/drawable/ic_coffee_on.xml' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' other-activities other-services supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.3/aapt-output-no.min.target.sdk_987.txt0000644000175000017500000000231614620351225026027 0ustar00hanshanspackage: name='no.min.target.sdk' versionCode='987' versionName='1.2-fake' platformBuildVersionName='6.0-2704002' application-label:'No minSdkVersion or targetSdkVersion' application-icon-160:'res/drawable/ic_launcher.png' application: label='No minSdkVersion or targetSdkVersion' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='No minSdkVersion or targetSdkVersion' icon='' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_PHONE_STATE' uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'normal' supports-any-density: 'false' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.3/aapt-output-obb.main.oldversion_1444412523.txt0000644000175000017500000000322614620351225027163 0ustar00hanshanspackage: name='obb.main.oldversion' versionCode='1444412523' versionName='0.1' platformBuildVersionName='7.0.0' sdkVersion:'4' targetSdkVersion:'18' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' maxSdkVersion='22' uses-permission: name='android.permission.ACCESS_WIFI_STATE' uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE' uses-permission: name='android.permission.CHANGE_NETWORK_STATE' uses-permission: name='android.permission.CHANGE_WIFI_STATE' uses-permission: name='android.permission.BLUETOOTH' uses-permission: name='android.permission.BLUETOOTH_ADMIN' maxSdkVersion='18' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission-sdk-23: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission-sdk-23: name='android.permission.WRITE_SETTINGS' maxSdkVersion='25' uses-permission: name='android.permission.NFC' application-label:'OBB Main Old Version' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Old Version' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Old Version' icon='' feature-group: label='' uses-feature-not-required: name='android.hardware.bluetooth' uses-feature-not-required: name='android.hardware.nfc' uses-feature-not-required: name='android.hardware.telephony' uses-feature-not-required: name='android.hardware.touchscreen' uses-feature-not-required: name='android.hardware.wifi' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.3/aapt-output-obb.main.twoversions_1101613.txt0000644000175000017500000000134614620351225027141 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101613' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.3/aapt-output-obb.main.twoversions_1101615.txt0000644000175000017500000000134614620351225027143 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101615' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.3/aapt-output-obb.main.twoversions_1101617.txt0000644000175000017500000000134614620351225027145 0ustar00hanshanspackage: name='obb.main.twoversions' versionCode='1101617' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'OBB Main Two Versions' application-icon-160:'res/drawable/ic_launcher.png' application: label='OBB Main Two Versions' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='OBB Main Two Versions' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.3/aapt-output-obb.mainpatch.current_1619.txt0000644000175000017500000000126414620351225027024 0ustar00hanshanspackage: name='obb.mainpatch.current' versionCode='1619' versionName='0.1' platformBuildVersionName='4.3.1-1425645' sdkVersion:'4' targetSdkVersion:'18' application-label:'urzip' application-icon-160:'res/drawable/ic_launcher.png' application: label='urzip' icon='res/drawable/ic_launcher.png' launchable-activity: name='info.guardianproject.urzip.MainActivity' label='urzip' icon='' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/28.0.3/aapt-output-souch.smsbypass_9.txt0000644000175000017500000000306214620351225025550 0ustar00hanshanspackage: name='souch.smsbypass' versionCode='9' versionName='0.9' install-location:'internalOnly' sdkVersion:'8' targetSdkVersion:'18' uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.SEND_SMS' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.VIBRATE' application-label:'Battery level' application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png' application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png' application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png' application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png' application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png' application: label='Battery level' icon='res/drawable-mdpi-v4/ic_launcher.png' launchable-activity: name='souch.smsbypass.BatteryFacade' label='' icon='' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' uses-feature: name='android.hardware.telephony' uses-implied-feature: name='android.hardware.telephony' reason='requested a telephony permission' main other-activities other-receivers supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '160' '213' '240' '320' '480' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build-tools/generate.sh0000755000175000017500000000120514620351225020530 0ustar00hanshans#!/bin/sh set -e set -x testsdir=$(cd $(dirname $0); pwd)/.. for apk in $testsdir/repo/*.apk /tmp/fdroid/repo/presentation-noAnalytics-release-unsigned.apk; do cd $ANDROID_HOME/build-tools for f in [1-9]*.*; do test -e $f/aapt || continue logdir=$testsdir/build-tools/$f test -e $logdir || mkdir $logdir packageName=`28.0.1/aapt dump badging "$apk" | sed -En "s,^package: name='([^']+)'.*,\1,p"` versionCode=`28.0.1/aapt dump badging "$apk" | sed -En "s,.*versionCode='([0-9]*)'.*,\1,p"` $f/aapt dump badging "$apk" > $logdir/aapt-output-${packageName}_${versionCode}.txt done done ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/build.TestCase0000755000175000017500000012662414620351225016716 0ustar00hanshans#!/usr/bin/env python3 # http://www.drdobbs.com/testing/unit-testing-with-python/240165163 import inspect import logging import os import shutil import sys import tempfile import textwrap import unittest import yaml from pathlib import Path from unittest import mock localmodule = os.path.realpath( os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') ) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) from testcommon import TmpCwd import fdroidserver.build import fdroidserver.common import fdroidserver.metadata import fdroidserver.scanner import fdroidserver.vmtools from testcommon import mkdtemp, parse_args_for_test class FakeProcess: output = 'fake output' returncode = 0 def __init__(self, args, **kwargs): print('FakeFDroidPopen', args, kwargs) class Options: keep_when_not_allowed = False class BuildTest(unittest.TestCase): '''fdroidserver/build.py''' def setUp(self): logging.basicConfig(level=logging.DEBUG) self.basedir = os.path.join(localmodule, 'tests') os.chdir(self.basedir) fdroidserver.common.config = None fdroidserver.build.config = None fdroidserver.build.options = None self._td = mkdtemp() self.testdir = self._td.name def tearDown(self): os.chdir(self.basedir) self._td.cleanup() def create_fake_android_home(self, d): os.makedirs(os.path.join(d, 'build-tools'), exist_ok=True) os.makedirs(os.path.join(d, 'platform-tools'), exist_ok=True) os.makedirs(os.path.join(d, 'tools'), exist_ok=True) def test_get_apk_metadata(self): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.build.config = config try: config['aapt'] = fdroidserver.common.find_sdk_tools_cmd('aapt') except fdroidserver.exception.FDroidException: pass # aapt is not required if androguard is present testcases = [ ( 'repo/obb.main.twoversions_1101613.apk', 'obb.main.twoversions', 1101613, '0.1', None, ), ( 'org.bitbucket.tickytacky.mirrormirror_1.apk', 'org.bitbucket.tickytacky.mirrormirror', 1, '1.0', None, ), ( 'org.bitbucket.tickytacky.mirrormirror_2.apk', 'org.bitbucket.tickytacky.mirrormirror', 2, '1.0.1', None, ), ( 'org.bitbucket.tickytacky.mirrormirror_3.apk', 'org.bitbucket.tickytacky.mirrormirror', 3, '1.0.2', None, ), ( 'org.bitbucket.tickytacky.mirrormirror_4.apk', 'org.bitbucket.tickytacky.mirrormirror', 4, '1.0.3', None, ), ( 'org.dyndns.fules.ck_20.apk', 'org.dyndns.fules.ck', 20, 'v1.6pre2', [ 'arm64-v8a', 'armeabi', 'armeabi-v7a', 'mips', 'mips64', 'x86', 'x86_64', ], ), ('urzip.apk', 'info.guardianproject.urzip', 100, '0.1', None), ('urzip-badcert.apk', 'info.guardianproject.urzip', 100, '0.1', None), ('urzip-badsig.apk', 'info.guardianproject.urzip', 100, '0.1', None), ('urzip-release.apk', 'info.guardianproject.urzip', 100, '0.1', None), ( 'urzip-release-unsigned.apk', 'info.guardianproject.urzip', 100, '0.1', None, ), ('repo/com.politedroid_3.apk', 'com.politedroid', 3, '1.2', None), ('repo/com.politedroid_4.apk', 'com.politedroid', 4, '1.3', None), ('repo/com.politedroid_5.apk', 'com.politedroid', 5, '1.4', None), ('repo/com.politedroid_6.apk', 'com.politedroid', 6, '1.5', None), ( 'repo/duplicate.permisssions_9999999.apk', 'duplicate.permisssions', 9999999, '', None, ), ( 'repo/info.zwanenburg.caffeinetile_4.apk', 'info.zwanenburg.caffeinetile', 4, '1.3', None, ), ( 'repo/obb.main.oldversion_1444412523.apk', 'obb.main.oldversion', 1444412523, '0.1', None, ), ( 'repo/obb.mainpatch.current_1619_another-release-key.apk', 'obb.mainpatch.current', 1619, '0.1', None, ), ( 'repo/obb.mainpatch.current_1619.apk', 'obb.mainpatch.current', 1619, '0.1', None, ), ( 'repo/obb.main.twoversions_1101613.apk', 'obb.main.twoversions', 1101613, '0.1', None, ), ( 'repo/obb.main.twoversions_1101615.apk', 'obb.main.twoversions', 1101615, '0.1', None, ), ( 'repo/obb.main.twoversions_1101617.apk', 'obb.main.twoversions', 1101617, '0.1', None, ), ( 'repo/urzip-; Рахма́, [rɐxˈmanʲɪnəf] سيرجي_رخمانينوف 谢·.apk', 'info.guardianproject.urzip', 100, '0.1', None, ), ] for apkfilename, appid, versionCode, versionName, nativecode in testcases: app = fdroidserver.metadata.App() app.id = appid build = fdroidserver.metadata.Build() build.buildjni = ['yes'] if nativecode else build.buildjni build.versionCode = versionCode build.versionName = versionName vc, vn = fdroidserver.build.get_metadata_from_apk(app, build, apkfilename) self.assertEqual(versionCode, vc) self.assertEqual(versionName, vn) @mock.patch('fdroidserver.common.get_apk_id') @mock.patch('fdroidserver.build.FDroidPopen') @mock.patch('fdroidserver.common.is_debuggable_or_testOnly', lambda f: False) @mock.patch('fdroidserver.common.get_native_code', lambda f: 'x86') def test_build_local_maven(self, fake_FDroidPopen, fake_get_apk_id): """Test build_local() with a maven project""" # pylint: disable=unused-argument def _side_effect(cmd, cwd=None): p = mock.MagicMock() p.output = '[INFO] fake apkbuilder target/no.apk' with open(os.path.join(self.testdir, 'target', 'no.apk'), 'w') as fp: fp.write('placeholder') p.returncode = 0 return p fake_FDroidPopen.side_effect = _side_effect os.chdir(self.testdir) os.mkdir('target') config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.build.config = config fdroidserver.build.options = mock.Mock() fdroidserver.build.options.scan_binary = False fdroidserver.build.options.notarball = True fdroidserver.build.options.skipscan = False app = fdroidserver.metadata.App() app.id = 'mocked.app.id' build = fdroidserver.metadata.Build() build.commit = '1.0' build.versionCode = 1 build.versionName = '1.0' fake_get_apk_id.side_effect = lambda f: ( app.id, build.versionCode, build.versionName, ) vcs = mock.Mock() build.maven = 'yes@..' fdroidserver.build.build_local( app, build, vcs, build_dir=self.testdir, output_dir=self.testdir, log_dir=os.getcwd(), srclib_dir=None, extlib_dir=None, tmp_dir=None, force=False, onserver=True, refresh=False, ) build.maven = 'yes' fdroidserver.build.build_local( app, build, vcs, build_dir=self.testdir, output_dir=self.testdir, log_dir=os.getcwd(), srclib_dir=None, extlib_dir=None, tmp_dir=None, force=False, onserver=True, refresh=False, ) @mock.patch('sdkmanager.build_package_list', lambda use_net: None) def test_build_local_ndk(self): """Test if `fdroid build` detects installed NDKs and auto-installs when missing""" with tempfile.TemporaryDirectory() as testdir, TmpCwd( testdir ), tempfile.TemporaryDirectory() as sdk_path: config = {'ndk_paths': {}, 'sdk_path': sdk_path} fdroidserver.common.config = config fdroidserver.build.config = config fdroidserver.build.options = mock.Mock() fdroidserver.build.options.scan_binary = False fdroidserver.build.options.notarball = True fdroidserver.build.options.skipscan = True app = fdroidserver.metadata.App() app.id = 'mocked.app.id' build = fdroidserver.metadata.Build() build.commit = '1.0' build.output = app.id + '.apk' build.versionCode = 1 build.versionName = '1.0' build.ndk = 'r21e' # aka 21.4.7075529 ndk_version = '21.4.7075529' ndk_dir = Path(config['sdk_path']) / 'ndk' / ndk_version vcs = mock.Mock() def make_fake_apk(output, build): with open(build.output, 'w') as fp: fp.write('APK PLACEHOLDER') return output # pylint: disable=unused-argument def fake_sdkmanager_install(to_install, android_home=None): ndk_dir.mkdir(parents=True) self.assertNotEqual(ndk_version, to_install) # converts r21e to version with (ndk_dir / 'source.properties').open('w') as fp: fp.write('Pkg.Revision = %s\n' % ndk_version) # use "as _ignored" just to make a pretty layout with mock.patch( 'fdroidserver.common.replace_build_vars', wraps=make_fake_apk ) as _ignored, mock.patch( 'fdroidserver.common.get_native_code', return_value='x86' ) as _ignored, mock.patch( 'fdroidserver.common.get_apk_id', return_value=(app.id, build.versionCode, build.versionName), ) as _ignored, mock.patch( 'fdroidserver.common.sha256sum', return_value='ad7ce5467e18d40050dc51b8e7affc3e635c85bd8c59be62de32352328ed467e', ) as _ignored, mock.patch( 'fdroidserver.common.is_debuggable_or_testOnly', return_value=False, ) as _ignored, mock.patch( 'fdroidserver.build.FDroidPopen', FakeProcess ) as _ignored, mock.patch( 'sdkmanager.install', wraps=fake_sdkmanager_install ) as _ignored: _ignored # silence the linters with self.assertRaises( fdroidserver.exception.FDroidException, msg="No NDK setup, `fdroid build` should fail with error", ): fdroidserver.build.build_local( app, build, vcs, build_dir=testdir, output_dir=testdir, log_dir=None, srclib_dir=None, extlib_dir=None, tmp_dir=None, force=False, onserver=False, refresh=False, ) # now run `fdroid build --onserver` print('now run `fdroid build --onserver`') self.assertFalse(ndk_dir.exists()) self.assertFalse('r21e' in config['ndk_paths']) self.assertFalse(ndk_version in config['ndk_paths']) fdroidserver.build.build_local( app, build, vcs, build_dir=testdir, output_dir=testdir, log_dir=os.getcwd(), srclib_dir=None, extlib_dir=None, tmp_dir=None, force=False, onserver=True, refresh=False, ) self.assertTrue(ndk_dir.exists()) self.assertTrue(os.path.exists(config['ndk_paths'][ndk_version])) # All paths in the config must be strings, never pathlib.Path instances self.assertIsInstance(config['ndk_paths'][ndk_version], str) @mock.patch('sdkmanager.build_package_list', lambda use_net: None) @mock.patch('fdroidserver.build.FDroidPopen', FakeProcess) @mock.patch('fdroidserver.common.get_native_code', lambda _ignored: 'x86') @mock.patch('fdroidserver.common.is_debuggable_or_testOnly', lambda _ignored: False) @mock.patch( 'fdroidserver.common.sha256sum', lambda f: 'ad7ce5467e18d40050dc51b8e7affc3e635c85bd8c59be62de32352328ed467e', ) def test_build_local_ndk_some_installed(self): """Test if `fdroid build` detects installed NDKs and auto-installs when missing""" with tempfile.TemporaryDirectory() as testdir, TmpCwd( testdir ), tempfile.TemporaryDirectory() as sdk_path: ndk_r24 = os.path.join(sdk_path, 'ndk', '24.0.8215888') os.makedirs(ndk_r24) with open(os.path.join(ndk_r24, 'source.properties'), 'w') as fp: fp.write('Pkg.Revision = 24.0.8215888\n') config = {'ndk_paths': {'r24': ndk_r24}, 'sdk_path': sdk_path} fdroidserver.common.config = config fdroidserver.build.config = config fdroidserver.build.options = mock.Mock() fdroidserver.build.options.scan_binary = False fdroidserver.build.options.notarball = True fdroidserver.build.options.skipscan = True app = fdroidserver.metadata.App() app.id = 'mocked.app.id' build = fdroidserver.metadata.Build() build.commit = '1.0' build.output = app.id + '.apk' build.versionCode = 1 build.versionName = '1.0' build.ndk = 'r21e' # aka 21.4.7075529 ndk_version = '21.4.7075529' ndk_dir = Path(config['sdk_path']) / 'ndk' / ndk_version vcs = mock.Mock() def make_fake_apk(output, build): with open(build.output, 'w') as fp: fp.write('APK PLACEHOLDER') return output # pylint: disable=unused-argument def fake_sdkmanager_install(to_install, android_home=None): ndk_dir.mkdir(parents=True) self.assertNotEqual(ndk_version, to_install) # converts r21e to version with (ndk_dir / 'source.properties').open('w') as fp: fp.write('Pkg.Revision = %s\n' % ndk_version) # use "as _ignored" just to make a pretty layout with mock.patch( 'fdroidserver.common.replace_build_vars', wraps=make_fake_apk ) as _ignored, mock.patch( 'fdroidserver.common.get_apk_id', return_value=(app.id, build.versionCode, build.versionName), ) as _ignored, mock.patch( 'sdkmanager.install', wraps=fake_sdkmanager_install ) as _ignored: _ignored # silence the linters self.assertFalse(ndk_dir.exists()) self.assertFalse('r21e' in config['ndk_paths']) self.assertFalse(ndk_version in config['ndk_paths']) fdroidserver.build.build_local( app, build, vcs, build_dir=testdir, output_dir=testdir, log_dir=os.getcwd(), srclib_dir=None, extlib_dir=None, tmp_dir=None, force=False, onserver=True, refresh=False, ) self.assertTrue(ndk_dir.exists()) self.assertTrue(os.path.exists(config['ndk_paths'][ndk_version])) def test_build_local_clean(self): """Test if `fdroid build` cleans ant and gradle build products""" os.chdir(self.testdir) config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.build.config = config fdroidserver.build.options = mock.Mock() fdroidserver.build.options.scan_binary = False fdroidserver.build.options.notarball = True fdroidserver.build.options.skipscan = False app = fdroidserver.metadata.App() app.id = 'mocked.app.id' build = fdroidserver.metadata.Build() build.commit = '1.0' build.output = app.id + '.apk' build.scandelete = ['baz.so'] build.scanignore = ['foo.aar'] build.versionCode = 1 build.versionName = '1.0' vcs = mock.Mock() os.mkdir('reports') os.mkdir('target') for f in ('baz.so', 'foo.aar', 'gradle-wrapper.jar'): with open(f, 'w') as fp: fp.write('placeholder') self.assertTrue(os.path.exists(f)) os.mkdir('build') os.mkdir('build/reports') with open('build.gradle', 'w', encoding='utf-8') as fp: fp.write('// placeholder') os.mkdir('bin') os.mkdir('gen') with open('build.xml', 'w', encoding='utf-8') as fp: fp.write( textwrap.dedent( """ """ ) ) def make_fake_apk(output, build): with open(build.output, 'w') as fp: fp.write('APK PLACEHOLDER') return output with mock.patch('fdroidserver.common.replace_build_vars', wraps=make_fake_apk): with mock.patch('fdroidserver.common.get_native_code', return_value='x86'): with mock.patch( 'fdroidserver.common.get_apk_id', return_value=(app.id, build.versionCode, build.versionName), ): with mock.patch( 'fdroidserver.common.is_debuggable_or_testOnly', return_value=False, ): fdroidserver.build.build_local( app, build, vcs, build_dir=self.testdir, output_dir=self.testdir, log_dir=None, srclib_dir=None, extlib_dir=None, tmp_dir=None, force=False, onserver=False, refresh=False, ) self.assertTrue(os.path.exists('foo.aar')) self.assertTrue(os.path.isdir('build')) self.assertTrue(os.path.isdir('reports')) self.assertTrue(os.path.isdir('target')) self.assertFalse(os.path.exists('baz.so')) self.assertFalse(os.path.exists('bin')) self.assertFalse(os.path.exists('build/reports')) self.assertFalse(os.path.exists('gen')) self.assertFalse(os.path.exists('gradle-wrapper.jar')) def test_scan_with_extlib(self): os.chdir(self.testdir) os.mkdir("build") config = fdroidserver.common.read_config() config['sdk_path'] = os.getenv('ANDROID_HOME') config['ndk_paths'] = {'r10d': os.getenv('ANDROID_NDK_HOME')} fdroidserver.common.config = config app = fdroidserver.metadata.App() app.id = 'com.gpl.rpg.AndorsTrail' build = fdroidserver.metadata.Build() build.commit = 'master' build.androidupdate = ['no'] os.makedirs("extlib/android") # write a fake binary jar file the scanner should definitely error on with open('extlib/android/android-support-v4r11.jar', 'wb') as file: file.write( b'PK\x03\x04\x14\x00\x08\x00\x08\x00-\x0eiA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00\x04\x00META-INF/\xfe\xca\x00\x00\x03\x00PK\x07\x08\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00' ) class FakeVcs: # no need to change to the correct commit here def gotorevision(self, rev, refresh=True): pass def getsrclib(self): return None def deinitsubmodules(self): pass # Test we trigger a scanner error without extlibs build.extlibs = [] os.makedirs('build/libs') shutil.copy('extlib/android/android-support-v4r11.jar', 'build/libs') fdroidserver.common.prepare_source( FakeVcs(), app, build, "build", "ignore", "extlib" ) count = fdroidserver.scanner.scan_source("build", build) self.assertEqual(1, count, "Should produce a scanner error without extlib") # Now try again as an extlib build.extlibs = ['android/android-support-v4r11.jar'] fdroidserver.common.prepare_source( FakeVcs(), app, build, "build", "ignore", "extlib" ) count = fdroidserver.scanner.scan_source("build", build) self.assertEqual(0, count, "Shouldn't error on jar from extlib") def test_failed_verifies_are_not_in_unsigned(self): os.chdir(self.testdir) sdk_path = os.path.join(self.testdir, 'android-sdk') self.create_fake_android_home(sdk_path) with open('config.yml', 'w') as fp: yaml.dump({'sdk_path': sdk_path, 'keep_when_not_allowed': True}, fp) os.chmod('config.yml', 0o600) fdroidserver.build.config = fdroidserver.common.read_config() os.mkdir('metadata') appid = 'info.guardianproject.checkey' metadata_file = os.path.join('metadata', appid + '.yml') shutil.copy(os.path.join(self.basedir, metadata_file), 'metadata') with open(metadata_file) as fp: app = fdroidserver.metadata.App(yaml.safe_load(fp)) app['RepoType'] = 'git' app[ 'Binaries' ] = 'https://example.com/fdroid/repo/info.guardianproject.checkey_%v.apk' build = fdroidserver.metadata.Build( { 'versionCode': 123, 'versionName': '1.2.3', 'commit': '1.2.3', 'disable': False, } ) app['Builds'] = [build] fdroidserver.metadata.write_metadata(metadata_file, app) os.makedirs(os.path.join('unsigned', 'binaries')) production_result = os.path.join( 'unsigned', '%s_%d.apk' % (appid, build['versionCode']) ) production_compare_file = os.path.join( 'unsigned', 'binaries', '%s_%d.binary.apk' % (appid, build['versionCode']) ) os.makedirs(os.path.join('tmp', 'binaries')) test_result = os.path.join('tmp', '%s_%d.apk' % (appid, build['versionCode'])) test_compare_file = os.path.join( 'tmp', 'binaries', '%s_%d.binary.apk' % (appid, build['versionCode']) ) with mock.patch( 'fdroidserver.common.force_exit', lambda *args: None ) as a, mock.patch( 'fdroidserver.common.get_android_tools_version_log', lambda: 'fake' ) as b, mock.patch( 'fdroidserver.common.FDroidPopen', FakeProcess ) as c, mock.patch( 'fdroidserver.build.FDroidPopen', FakeProcess ) as d, mock.patch( 'fdroidserver.build.trybuild', lambda *args: True ) as e, mock.patch( 'fdroidserver.net.download_file', lambda *args, **kwargs: None ) as f: a, b, c, d, e, f # silence linters' "unused" warnings with mock.patch('sys.argv', ['fdroid build', appid]): # successful comparison open(production_result, 'w').close() open(production_compare_file, 'w').close() with mock.patch('fdroidserver.common.verify_apks', lambda *args: None): fdroidserver.build.main() self.assertTrue(os.path.exists(production_result)) self.assertTrue(os.path.exists(production_compare_file)) # failed comparison open(production_result, 'w').close() open(production_compare_file, 'w').close() with mock.patch( 'fdroidserver.common.verify_apks', lambda *args: 'failed' ): fdroidserver.build.main() self.assertFalse(os.path.exists(production_result)) self.assertFalse(os.path.exists(production_compare_file)) with mock.patch('sys.argv', ['fdroid build', '--test', appid]): # successful comparison open(test_result, 'w').close() open(test_compare_file, 'w').close() with mock.patch('fdroidserver.common.verify_apks', lambda *args: None): fdroidserver.build.main() self.assertTrue(os.path.exists(test_result)) self.assertTrue(os.path.exists(test_compare_file)) self.assertFalse(os.path.exists(production_result)) self.assertFalse(os.path.exists(production_compare_file)) # failed comparison open(test_result, 'w').close() open(test_compare_file, 'w').close() with mock.patch( 'fdroidserver.common.verify_apks', lambda *args: 'failed' ): fdroidserver.build.main() self.assertTrue(os.path.exists(test_result)) self.assertFalse(os.path.exists(test_compare_file)) self.assertFalse(os.path.exists(production_result)) self.assertFalse(os.path.exists(production_compare_file)) def test_failed_allowedapksigningkeys_are_not_in_unsigned(self): os.chdir(self.testdir) os.mkdir('metadata') appid = 'info.guardianproject.checkey' metadata_file = os.path.join('metadata', appid + '.yml') shutil.copy(os.path.join(self.basedir, metadata_file), 'metadata') with open(metadata_file) as fp: app = fdroidserver.metadata.App(yaml.safe_load(fp)) app['RepoType'] = 'git' app[ 'Binaries' ] = 'https://example.com/fdroid/repo/info.guardianproject.checkey_%v.apk' build = fdroidserver.metadata.Build( { 'versionCode': 123, 'versionName': '1.2.3', 'commit': '1.2.3', 'disable': False, } ) app['Builds'] = [build] expected_key = 'a' * 64 bogus_key = 'b' * 64 app['AllowedAPKSigningKeys'] = [expected_key] fdroidserver.metadata.write_metadata(metadata_file, app) os.makedirs(os.path.join('unsigned', 'binaries')) production_result = os.path.join( 'unsigned', '%s_%d.apk' % (appid, build['versionCode']) ) production_compare_file = os.path.join( 'unsigned', 'binaries', '%s_%d.binary.apk' % (appid, build['versionCode']) ) os.makedirs(os.path.join('tmp', 'binaries')) test_result = os.path.join('tmp', '%s_%d.apk' % (appid, build['versionCode'])) test_compare_file = os.path.join( 'tmp', 'binaries', '%s_%d.binary.apk' % (appid, build['versionCode']) ) with mock.patch( 'fdroidserver.common.force_exit', lambda *args: None ) as a, mock.patch( 'fdroidserver.common.get_android_tools_version_log', lambda: 'fake' ) as b, mock.patch( 'fdroidserver.common.FDroidPopen', FakeProcess ) as c, mock.patch( 'fdroidserver.build.FDroidPopen', FakeProcess ) as d, mock.patch( 'fdroidserver.build.trybuild', lambda *args: True ) as e, mock.patch( 'fdroidserver.net.download_file', lambda *args, **kwargs: None ) as f: a, b, c, d, e, f # silence linters' "unused" warnings with mock.patch('sys.argv', ['fdroid build', appid]): # successful comparison, successful signer open(production_result, 'w').close() open(production_compare_file, 'w').close() with mock.patch( 'fdroidserver.common.verify_apks', lambda *args: None ) as g, mock.patch( 'fdroidserver.common.apk_signer_fingerprint', lambda *args: expected_key, ) as h: g, h fdroidserver.build.main() self.assertTrue(os.path.exists(production_result)) self.assertTrue(os.path.exists(production_compare_file)) # successful comparison, failed signer open(production_result, 'w').close() open(production_compare_file, 'w').close() with mock.patch( 'fdroidserver.common.verify_apks', lambda *args: None ) as g, mock.patch( 'fdroidserver.common.apk_signer_fingerprint', lambda *args: bogus_key, ) as h: g, h fdroidserver.build.main() self.assertFalse(os.path.exists(production_result)) self.assertFalse(os.path.exists(production_compare_file)) # failed comparison open(production_result, 'w').close() open(production_compare_file, 'w').close() with mock.patch( 'fdroidserver.common.verify_apks', lambda *args: 'failed' ): fdroidserver.build.main() self.assertFalse(os.path.exists(production_result)) self.assertFalse(os.path.exists(production_compare_file)) with mock.patch('sys.argv', ['fdroid build', '--test', appid]): # successful comparison, successful signer open(test_result, 'w').close() open(test_compare_file, 'w').close() with mock.patch( 'fdroidserver.common.verify_apks', lambda *args: None ) as g, mock.patch( 'fdroidserver.common.apk_signer_fingerprint', lambda *args: expected_key, ) as h: g, h fdroidserver.build.main() self.assertTrue(os.path.exists(test_result)) self.assertTrue(os.path.exists(test_compare_file)) self.assertFalse(os.path.exists(production_result)) self.assertFalse(os.path.exists(production_compare_file)) # successful comparison, failed signer open(test_result, 'w').close() open(test_compare_file, 'w').close() with mock.patch( 'fdroidserver.common.verify_apks', lambda *args: None ) as g, mock.patch( 'fdroidserver.common.apk_signer_fingerprint', lambda *args: bogus_key, ) as h: g, h fdroidserver.build.main() self.assertTrue(os.path.exists(test_result)) self.assertFalse(os.path.exists(test_compare_file)) self.assertFalse(os.path.exists(production_result)) self.assertFalse(os.path.exists(production_compare_file)) # failed comparison open(test_result, 'w').close() open(test_compare_file, 'w').close() with mock.patch( 'fdroidserver.common.verify_apks', lambda *args: 'failed' ): fdroidserver.build.main() self.assertTrue(os.path.exists(test_result)) self.assertFalse(os.path.exists(test_compare_file)) self.assertFalse(os.path.exists(production_result)) self.assertFalse(os.path.exists(production_compare_file)) @mock.patch('fdroidserver.vmtools.get_build_vm') @mock.patch('fdroidserver.vmtools.get_clean_builder') @mock.patch('paramiko.SSHClient') @mock.patch('subprocess.check_output') def test_build_server_cmdline( self, subprocess_check_output, paramiko_SSHClient, fdroidserver_vmtools_get_clean_builder, fdroidserver_vmtools_get_build_vm, ): """Test command line flags passed to the buildserver""" global cmdline_args test_flag = ['', False] def _exec_command(args): flag = test_flag[0] if test_flag[1]: self.assertTrue(flag in args, flag + ' should be present') else: self.assertFalse(flag in args, flag + ' should not be present') os.chdir(self.testdir) os.mkdir('tmp') chan = mock.MagicMock() chan.exec_command = _exec_command chan.recv_exit_status = lambda: 0 transport = mock.MagicMock() transport.open_session = mock.Mock(return_value=chan) sshs = mock.MagicMock() sshs.get_transport = mock.Mock(return_value=transport) paramiko_SSHClient.return_value = sshs subprocess_check_output.return_value = ( b'0123456789abcdef0123456789abcdefcafebabe' ) fdroidserver_vmtools_get_clean_builder.side_effect = lambda s: { 'hostname': 'example.com', 'idfile': '/path/to/id/file', 'port': 123, 'user': 'fake', } fdroidserver.common.config = {'sdk_path': '/fake/android/sdk/path'} fdroidserver.build.options = mock.MagicMock() vcs = mock.Mock() vcs.getsrclib = mock.Mock(return_value=None) app = fdroidserver.metadata.App() app['metadatapath'] = 'metadata/fake.id.yml' app['id'] = 'fake.id' app['RepoType'] = 'git' build = fdroidserver.metadata.Build( { 'versionCode': 123, 'versionName': '1.2.3', 'commit': '1.2.3', 'disable': False, } ) app['Builds'] = [build] test_flag = ('--on-server', True) fdroidserver.build.build_server(app, build, vcs, '', '', '', False) self.assertTrue(fdroidserver_vmtools_get_build_vm.called) for force in (True, False): test_flag = ('--force', force) fdroidserver.build.build_server(app, build, vcs, '', '', '', force) fdroidserver.build.options.notarball = True test_flag = ('--no-tarball', True) fdroidserver.build.build_server(app, build, vcs, '', '', '', False) fdroidserver.build.options.notarball = False test_flag = ('--no-tarball', False) fdroidserver.build.build_server(app, build, vcs, '', '', '', False) fdroidserver.build.options.skipscan = False test_flag = ('--scan-binary', True) fdroidserver.build.build_server(app, build, vcs, '', '', '', False) fdroidserver.build.options.skipscan = True test_flag = ('--scan-binary', False) fdroidserver.build.build_server(app, build, vcs, '', '', '', False) test_flag = ('--skip-scan', True) fdroidserver.build.build_server(app, build, vcs, '', '', '', False) @mock.patch('fdroidserver.vmtools.get_build_vm') @mock.patch('fdroidserver.vmtools.get_clean_builder') @mock.patch('paramiko.SSHClient') @mock.patch('subprocess.check_output') @mock.patch('fdroidserver.common.getsrclib') @mock.patch('fdroidserver.common.prepare_source') @mock.patch('fdroidserver.build.build_local') @mock.patch('fdroidserver.common.get_android_tools_version_log', lambda: 'versions') @mock.patch('fdroidserver.common.deploy_build_log_with_rsync', lambda a, b, c: None) def test_build_server_no_local_prepare( self, build_build_local, common_prepare_source, common_getsrclib, subprocess_check_output, paramiko_SSHClient, fdroidserver_vmtools_get_clean_builder, fdroidserver_vmtools_get_build_vm, ): """srclibs Prepare: should only be executed in the buildserver""" def _exec_command(args): print('chan.exec_command', args) def _getsrclib( spec, srclib_dir, basepath=False, raw=False, prepare=True, preponly=False, refresh=True, build=None, ): name, ref = spec.split('@') libdir = os.path.join(srclib_dir, name) os.mkdir(libdir) self.assertFalse(prepare, 'Prepare: scripts should never run on host') return name, None, libdir # TODO os.chdir(self.testdir) chan = mock.MagicMock() chan.exec_command = _exec_command chan.recv_exit_status = lambda: 0 transport = mock.MagicMock() transport.open_session = mock.Mock(return_value=chan) sshs = mock.MagicMock() sshs.get_transport = mock.Mock(return_value=transport) paramiko_SSHClient.return_value = sshs subprocess_check_output.return_value = ( b'0123456789abcdef0123456789abcdefcafebabe' ) fdroidserver_vmtools_get_clean_builder.side_effect = lambda s: { 'hostname': 'example.com', 'idfile': '/path/to/id/file', 'port': 123, 'user': 'fake', } fdroidserver.metadata.srclibs = { 'flutter': { 'RepoType': 'git', 'Repo': 'https://github.com/flutter/flutter', } } os.mkdir('srclibs') with open('srclibs/flutter.yml', 'w') as fp: yaml.dump(fdroidserver.metadata.srclibs, fp) common_getsrclib.side_effect = _getsrclib options = mock.MagicMock() options.force = False options.notarball = True options.onserver = False options.refresh = False options.scan_binary = False options.server = True options.skipscan = True options.test = False options.verbose = True fdroidserver.build.options = options fdroidserver.build.config = {'sdk_path': '/fake/android/sdk/path'} vcs = mock.Mock() vcs.getsrclib = mock.Mock(return_value=None) app = fdroidserver.metadata.App() app['metadatapath'] = 'metadata/fake.id.yml' app['id'] = 'fake.id' app['RepoType'] = 'git' spec = 'flutter@v1.7.8' build = fdroidserver.metadata.Build( { 'versionCode': 123, 'versionName': '1.2.3', 'commit': '1.2.3', 'disable': False, 'srclibs': [spec], } ) app['Builds'] = [build] build_dir = 'build' srclib_dir = os.path.join(build_dir, 'srclib') extlib_dir = os.path.join(build_dir, 'extlib') os.mkdir('tmp') os.mkdir(build_dir) os.mkdir(srclib_dir) fdroidserver.build.trybuild( app, build, build_dir, 'unsigned', 'logs', None, srclib_dir, extlib_dir, 'tmp', 'repo', vcs, options.test, options.server, options.force, options.onserver, options.refresh, ) common_getsrclib.assert_called_once_with( spec, srclib_dir, basepath=True, prepare=False ) common_prepare_source.assert_not_called() build_build_local.assert_not_called() def test_keep_when_not_allowed_default(self): self.assertFalse(fdroidserver.build.keep_when_not_allowed()) def test_keep_when_not_allowed_config_true(self): fdroidserver.build.config = {'keep_when_not_allowed': True} self.assertTrue(fdroidserver.build.keep_when_not_allowed()) def test_keep_when_not_allowed_config_false(self): fdroidserver.build.config = {'keep_when_not_allowed': False} self.assertFalse(fdroidserver.build.keep_when_not_allowed()) def test_keep_when_not_allowed_options_true(self): fdroidserver.build.options = Options fdroidserver.build.options.keep_when_not_allowed = True self.assertTrue(fdroidserver.build.keep_when_not_allowed()) def test_keep_when_not_allowed_options_false(self): fdroidserver.build.options = Options fdroidserver.build.options.keep_when_not_allowed = False self.assertFalse(fdroidserver.build.keep_when_not_allowed()) def test_keep_when_not_allowed_options_true_override_config(self): fdroidserver.build.options = Options fdroidserver.build.options.keep_when_not_allowed = True fdroidserver.build.config = {'keep_when_not_allowed': False} self.assertTrue(fdroidserver.build.keep_when_not_allowed()) def test_keep_when_not_allowed_options_default_does_not_override(self): fdroidserver.build.options = Options fdroidserver.build.options.keep_when_not_allowed = False fdroidserver.build.config = {'keep_when_not_allowed': True} self.assertTrue(fdroidserver.build.keep_when_not_allowed()) def test_keep_when_not_allowed_all_true(self): fdroidserver.build.options = Options fdroidserver.build.options.keep_when_not_allowed = True fdroidserver.build.config = {'keep_when_not_allowed': True} self.assertTrue(fdroidserver.build.keep_when_not_allowed()) def test_keep_when_not_allowed_all_false(self): fdroidserver.build.options = Options fdroidserver.build.options.keep_when_not_allowed = False fdroidserver.build.config = {'keep_when_not_allowed': False} self.assertFalse(fdroidserver.build.keep_when_not_allowed()) if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) import argparse parser = argparse.ArgumentParser() parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(BuildTest)) unittest.main(failfast=False) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/check-fdroid-apk0000755000175000017500000004364414620351225017200 0ustar00hanshans#!/bin/bash # # Download and verify that the FDroid.apk is signed by the right PGP # key. The gpg key model is to trust only the key that is included in # this script, so there is a test to check that it is starting with an # empty keyring. # # To be run in a daily cronjob at a random time of day, e.g.: # # 0 0 * * * perl -le 'sleep rand 86400'; ./check-fdroid-apk # # One instance of this is here: # https://verification.f-droid.org/check-fdroid-apk/ set -e curl="curl --user-agent F-Droid" gpg="gpg" if [ "$1" = "-v" ]; then set -x verbose=true else curl="$curl --silent" gpg="$gpg --quiet" verbose=false fi test -e /tmp/.testfiles || mkdir /tmp/.testfiles dldir=`mktemp -d /tmp/.testfiles/run-tests.XXXX` export GNUPGHOME="$dldir" key="${dldir}/key.asc" apk="${dldir}/FDroid.apk" asc="${apk}.asc" log=/var/www/html/check-fdroid-apk/`date +%s`.txt $curl --user-agent F-Droid https://f-droid.org/FDroid.apk > $apk $curl --user-agent F-Droid https://f-droid.org/FDroid.apk.asc > $asc fingerprint=37D2C98789D8311948394E3E41E7044E1DBA2E89 cat > $key <<- EOF -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1 Comment: GPG for Android - https://guardianproject.info/code/gnupg/ mQINBFNaZBcBEADVyvgks2gjG9VrHPvulVH62pzN2LpiD7lqLhAtpXSN/ZNgtkYp HbRJfRcuZzBUVGhuMqIRb8/B4OY19zonHazstZAywD2ojToC0os0hxLDU2H7jVnh HzsAuEkPR4hpzsftia0fzD4IlomQ0zP/C5K9wth2Cw+GFmxhI1aBZcrxVJhuVLpe wSRShUva2iYNUIPvq02xFhTWwoIpRxGHeT/XdLEi+IHu031v3mlM5vU5zbI1UFMb I7AnNByHfuKQ6PiDOyp14QzCw57bgAS8aRB9UK6e1xsVOVYIGNKs9xnErdYKJ295 DAxn/nHD+oaoVHP/NhuMmcNKK52vjG5HeZykHNqn5GAJ4uPFspWxRNCF+PnEnc28 EGGYql5U3jbIwmcZnVkKRahYRmf5ZRMyXroloeDARvCj7nS89Dg7QAd1rI8r2PzY eIbyjrKTOiXUWc6N/07k6k1qfzQuMuBnzAnYxUxs5js2kQSZ8SYdZBmWOjUIWA/E /HmzGFEfH7+SgjhQPjb56JnUunhma1p+JF9ZfnvDQArE0D5rBQkDqa4Z7VJtBFzO ASUMB0EzKlCBN2g7KWljwbMF6XzCTkMPmbPHLiN1XoxwiBozBPtnBxPEoz+E0dIU BaIg79nq5f3hwWsFTWfyJ9fEfiL0hg4kydUnRMT0Ww9Xf8vWWLp06Wq0fQARAQAB tBtGLURyb2lkIDxhZG1pbkBmLWRyb2lkLm9yZz6IRgQQEQIABgUCU1y+cwAKCRCx l/qOkBw134THAJwOo/3U+tzdQbAvP+NL086c06MkAgCghhLAHhimF7A4D9tsei8f KTC51OeJAjgEEwECACIFAlNaZBcCGwEGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheA AAoJEEHnBE4dui6JMKUQAKq7//PyLxhBzLy2tT05T1FJygddhyq94xZg1QgWhbDn VNslk+eNwSxnp1LPf7QswM/1R4UgEzaJ8h3a/iMoAOYoX/leAepNSx9VxlnByPu7 heN6B+c61nYpV6nQ9vYwI3FiEvcHs2vxmPw1YijtlumMHcpr7gXAWgqSveRBArEv uqoPLPizYOJfh84NhV9uEethSWkaoM0XtXVmaDXOFmmkvsgqDxFZf5jU4RQnrxek aGGokhs7BCZ+Dvawnw1Cu5eP+gscbSammAtbprRmALf5EcFhlF4Ifr9vvytJd4pj MRmXm4PfKekyOmj8pPN+2dWXUiEwNpr7dwN19WhlyW1vEXJg1/RD6IO2hrV854oJ J6mVGO2RWA5exipDNPYffxEGTnMREQxoKLV6lo5imNoOvoPOoLm1k90COxX9d8IE puRw4S5KwkIhlqMYR3YYC1jgJl8eJz/3yPdv3FqBYWGObz1n64JWTjqAQkYeAPno mJJ77uv47jXbH5+IaM6NrZCxT6RD0s3FMzuROQyTwB4WZqNjTdL8X3Hc6ljlWRvA IqiI3jtSGmVB2ObaCykZCbh0T2PMZC0Hzw+XidUtuusK5IVKYzJ7j4pnqxM/a8WE dc8dZ3V+tEuaW37/4hi4jJD6t2mthQinLO+knaaap+hR9kG84hxAdH+QRN8t6dLQ iQIcBBABCAAGBQJTx4GFAAoJENqfSjoH9uwMBrYP/1Xy0rMk/az9txAPTnWNRIog JNM0Pz+VCdIbaEr3t3qhQvQ7zU+q62IrMPNjFYQGpPd9wyMvnVEZeZwcMyK3pV2S bUebdSbP3HjvtbhvG9vzf1+/mxUGFmlJiFCBS7yUr32zKQrgnCcfrqpSwby7bx8/ MRfsjvWQybfwK6Eu5mzVtnocfP9JuVrrI5/5Unq/kEuChOq2s+vkLhpfHUs2LxEO kU3w4HIgP+8GyuhypAYPb8ep3QqOim74BeP3vtnFcKjhgVvqMJa1782HeDcaY06C OZ81tP74q/dvvOm1cdy9OS4iodZ259tsc6giUsKomvILL4w2H5BE/IQpQ0oReYxB QY/cRgR5yy22ejVuFbkDnbWJGheQyCYmqH7LVLHqNKpATCL9n7Pc6JDZOkaIc4Oy taj9WNuLC5OZvjwTghPafjJ9OjieWQ9qMjTbl4CpIE1RHuoaP5GXqyOBZ+lNdI1N mW6zY5z5mTOCnfe7LSDimvhBucr4+7V2bTEhjbd1MxVgcpHWADlJilnCtbqKcgnw c9zAkKlLi3aeJMGnFEcmfN4fXKFU6OHqjENK/sEmP+OPuiclTvVLrbdhedNJBXVA nefQoKxLnx6XvFl6SqkZkGPBZhkPQIA0RgHf8Dfd/nptv2fIwO+CSmC9i5spuYiW qCLb6HZ4bWi9P72uM1/AiQEcBBABAgAGBQJUqn2PAAoJEBbqRqHogcqp3f4IAMDu 7DbToHQvtdmDpt8UnaiHf57JEUMinsMUADSuoc6XtzcYXHujdEkXqwEy/3zOciJq 41ESk3mjZH/uQhoJ7gdJIb3qQHmZZEXvdwj5TR/u4kdh3CcXPbsDDb84njZU4UA5 /wQlRoBzKkPPFBAqZuxdqblgkNQIG+yWpFcNKp7XXPXrA4PMFH74EuAoFZGgwgK6 egCPTOSStcDFfZS8wBPMuCl+dSD+nTrukwyyvZdKfO3QtsEQasm7D+uHCR2q+CFg ecCiVpERfuFQRA5nF3WOnhzZksyLVeA95par/BivYAFlQFEF9Kyop+qt6s9nlI/C vfuYawtbUEufr2rBTCWJAhwEEAEIAAYFAlTKEKEACgkQq9c4M6WG0OaexA//clx7 uW4EW8MHjSfIMN064aJeSFSbNg6g+HGGk9xtnxufuTkQzTtpO/qm1YSYyVTKtr0h cqFXA8f+umUm51HnpyDvmEnAaagoHgc4v7as6vMR83bXVN81o4FEP/DIyEBKlexZ a4z4RddPt4WpsXyzSFKjHQDgVuI12A17QVFfRSbz3bzJffu8zVFPn/7szlq97M09 OXuf8AgHhkWjWGrqPMFywGReT5pVqkbuQ/PSQKlGCLeUN/lwBcQZQ8UjyOeNMUq0 n2BA2qCuqAffbJrHE+RkvM4eKv1sB12SPHgzwWj5tT9TsKz4T7zvMu7RYW06mg2k SD0Yu5Hh0VPO7nnlDMcm33MLbFLF+sOGfGEDwPM5YbnHFgc6QBIZtBZSpgt7c1Cj IMHEAcsVNLH01z5tJK2Z6eg8tOaDMXWTVGTAO2IIrOmzIMBUSMzUtOINeiwVW8Hh qOBS+O4pUe0WL7dJ4GiJcugXWIToJBOIuYNkRr4kewetcHKDP8ym8e8DIj7Kx4ud 5VAtYFWkth0WlB3hcrh9M8Dkci3ruJQScwb5w0jPM/S6FwC7HMRB203m0B+eNsVW AnOZVgP/TpDnLjivdcAD6/vrF4P/UyV2vRuk2uw/eyzeqm6+ILXHSKRjjO7qZOiY ktEMjgFqlQjzqFujm8ZBB010HKAGGD/xfZQIch6JAhwEEAEIAAYFAlVPORkACgkQ JxvgDae9vcK9fxAAwa1pwEs8cPpo5MO5yi0gHCpRKJ4fNWQEYgSyxW78yhf2E544 d00E0xDcQI16y0CfvS/yO/71IKQVgdypYLUNaaIFrIgM9ZMrwWV5GJ55+5ffWB3g gSaWM+Ge8WcSsxIHLoTtsPSNo8JHjhlR65Hnpp/riXfl+FQnujz77QZ3/tGeuWtn g4QQjI0+xEYTBy5brRcbTScgw0jmfZfLrxGAiGV1oxydYhN9QYx0CLQU5NfXOFqA WjcfnB9ydMIgVTIF0AL1UDHik/wZBo3KKPJdDHzB+lpW7+bHxNd9wxYoMGzrxjI7 RdNRGkZGDsF27V4lv5d+duc7Drt9RIZjD2Q7LU/01aHIJ5ZktAAzTFkU++kc9BOa GBvE+Kbg4oCigD6ek5FT1Fc8UjuKkP74fIbBnm5Y2UT03rSa/Tj+lp0z6LfAhclE W0vz0p3ucD4NIVDsys9fpxmRRJROot8nn8cnD3lCAafHzqkCkIZ49G7RM7YVq64w HujaP+twBAGCwmlFv+z7z/Gg4xA20BuGk3PkASw1LRjxm9Y6qkp2HBoQORq5Os6D M9G11vcFd28VE6dupkp+SMCKwzMlSsnc7fFW/Im3wfTPJzbUAnAdxYADr0DGPplp m493mRi/rdJJ02CT9NBvHS7P0+kTmBX3IC3uBnPZKnhqHireBGQZvrySglqJAZwE EAEKAAYFAldKCa0ACgkQEIERPFzvsNBvBgv+I3C4rh32FEUvTBQIlLePIO0Z2dr1 ODO7hUf/HJzBbsZCVeRhq3x5nFH7F4301Sgn5NhkRYcjjKzTChqmzw7oX7i/kUpT kufH3SMHvS927Nep5dPB5a/RM6fO0mNmuV/uGzIIa/FcOv4x7gaH5iW5sqY7TBQA f33u1HQiRC0IRPCFOk1S9XV4bI8uApSQ1I5orAG/HKhxNVtCNPBOjGWva856Q8UM K0RMIqo5kzUAriQJRF7ktpJH26OUPAt8TbNo1AzEEMYCX3J6Ic6o1KRQTz2ejLCV HfTXXZF5Cc7wdDRfcP/T79uwAhhGsd001ejICmWkdLyEOpsGFMXYHJexTyvXuOjo psNHy4Bthq5Q2g1Iyi/mKGSlRaJW2KjOVhDcY9tdvyFtxsL5q7k/Fq0myItr6Kom i4O/xZr0vkEzxxvgr2zktPGwtdEgsGK07c7bAGDlXUJEEFq+8ikJdOwO+HDCMXFg /msY/1f12wv69oxlE2uS0pGQoPK+4ZD7K3GYiQIcBBABCgAGBQJWcwGtAAoJEAQ2 PoNkKGsHmcMP/2KkBlV+yzCs0lmkGfFS4v7p4UUa3mXyJ0NTge3m1A20NCE5XJF8 NsHQkJ84bhT7LZYS+GKj7uok9AwzdOU4TtTtF4PuLoc08A7ZPM6r6Z9Jw2ZsHFZ/ nLyXK1R9GaFWHE0SAB4JUqL6jqH1A+UCqtSQp0SHTkSp8+EyGrugphKN0EfoCUET RKX2S7f5gjccYPC7x0dAt4r8Ejk0t+IKOLhFGQC6NiGnxZKDC6wOsM2350de9zmg D7UEQt0Eam6JV7ntCRHWOtlK4yQiNsE++DHKEO0qSKzXF8+shMcBLWHtsRV/bgw6 PZmkg2dhTa0imSynkZIcJWQ62ZuFkoOC4vjelRQTgaFKgYi9rc4OyQV+UCTZ4HPH FCOcUtjv1KzcYWCPUI3eKOQSt7gKRWy8zLbQKw/6st/xBFAK8D3jWVcnLAqXkv32 8sSPAKN7ucW5SpOBmegNSo/Os8g6eQLLECz9Qt/Z03zcdg3J6jlk4qGSdU57pgHP Li0ZMQVcIhlIl+i3G3QT/V5W1nrOm4tzLFn55hjvWVlVxIpvCucfykp6XunZ3nq9 5aoa/9L0qUMd4v2J8mYCxYiG6Ce6brtIHBcOB0Uff0kjeIr4FjvpGG1d1PwggX6k IzWXu8m6dqKHN9lU9z4TVz0PsYP5/jOfZlLezP3CHAI1a1gKqCn095N2iQIcBBAB CgAGBQJWtHkgAAoJEHtW9SVs1DX9bTkP/iPbNKCIrx4veg57YSoHlSjMjRRNHbwL wSv5ag7Qdxq2HYBS0xksB/i0IcgJUipH8EVR272ny0SSKa0iwoO5EklLqqpRZAYU Mmh9vrEewOO6m1eDNSKrID3hdWRioBFhevztml+KF/SuKybDM39H72YdVg4ACbLY UQOy+h2hGAkb4pjn9oh67nCQH0FsA6usE1JI9zAqTJvlVW61CSok8bl9in6gzy2a iXOdmkhQoMYbCCCx9vSQPriVMzdHAkDxlNOqIDmolk8BJpTAwcpL7YeoAKW4Bf+D r35RlQTWQdBj19alofOORhXfw+qpdaynbl5ytFmBntgEU3IE0mBM1Da6RClLiXe6 wxn4khQpEhk5dPuSrcWma7+nkwCbCG+vfLqZ79702KTiZAPTZYArT7IvyfJi3NTL iQNxJ4qTQrucTUS9OCFEyH7P6uXeYvyI0B/7a7j7BKBKNZf5xCteJSESxyiBJRH7 eei/ytuHp+cZWzsZfWxSujeXgxyOF98tQ85UnTkVPcP8VqMKRxqIpg6WBFUSgQC6 gj7FIyoi0suuuDFXMSecHSpGjHNDv/720BEeMhCm9uwKhFo1Ak6FRuEjwVYP36ZZ slnhacMvYdS6M793kgzdicWWMhB1FXbAYTAkAPysn8Hao5FesOO6XrwoBym7Ohb/ ApWB5OraQfqriQIcBBABCgAGBQJW+oANAAoJEF0nuel13sQTyTEP/A+kQ6mswLIF 3xGSaNH3pX+S2kDbSHMf8J8lbvX73yRHGZYZlpm88A9kF86fMfqPy8tyBnfpYDt0 ShkZbLoaMUOAQvge7cMBdC4UKLmkHggt2MnR0kYd+JJHD18N8YTet3VVaKOVId2s hhlpGFFVBN/EyItfkM81R7O4cuxLIRuBuT0mhi/tdrZguWNhEZ/n4ETUmGiwd4+X yBOuZHouLZsTob74Igp/symrVY2CLCwc540VbSyEWxVQrRxA6VgUyicyPNaQMwI1 OftaVOzr74VxHlgtMrj4HSjQnZNrR7eVRhQmIvIVKWnPoxWQgf/MFitsd1avsfsR 6cwueTp5OFzXXKhjKXOZ0e+ZFGJIH+oVBGDk2I6tFGDGtTnrcccG+ed359bHBETX tkeDJ/3gz4m5uRdIUNZXkd6I2lgFr5ZGXPDBlsJuqWRKzdtkycHPM2M+0xuBUTKR XGSyL2FDwbMNwisUZZ7LzHG8iy0VOxcmbwRyTPDKRHVQ2lf3xWQX9hiM+lsQLhVi /eZNupnPx9Drant0+xMzS1ZqsgkmW117eMQ2Lm+/A8F4T0SO85/hRRmXOVIbxNgF 4U5jh0AtVyJ1AAyoHIen7n2wRR9NVVz3Ob+Fb/jSe52KbJmaxV5HhadQ3KfdtEhL RvRGxMUbYuMyE/Z9Ap2ggIhZeSiDQfJkiQIcBBABCgAGBQJXf9K5AAoJEELZgcCG uDsgpDgQALsXQ7X1mpMrOb+2xy84jyp32s387g2OinkzZuuniuuhZjKsA5LWwzJH li/h1Gm+OPBbS6v6pcmJnAniusLDI//DJ/wX9SWNJ9CCCwsnjaWQyj1xXFDdzuWh 9z5socPWgWDkcubX45oNfCf0mdZS/+UsSXh8rdB6CghXvvsSwqDtjhj6caKTwa62 4RDb+IoExazUj1iUkAf+Nea6YlsqO56KDBrsH8/FICT8XSoPwHTxWQ2RN9840nAQ J3FV2Xr7EN1bwMOQzf3Nr3pbKXnCekTS4dgQTFPM9cFYxb3QuuzDHkzafmqfCaK3 IgoQshjh7XYSp1joBLzu6YDNyBQgHImhoKcdq0LK8ichorq9tXhBBTw62eCfWVRo 4M66W7s7jFUc4TvxV9MGq3SWeMy3mrrdb12UO7jJGXgLlTW8I+O+AyKCcNPbdVcB cbBThUToGLdO8vH8nR7wG6+sQPl6eLDHh5w0uvelfg5vww0f1P0S1fvrWfzn+1cH oSGwZSrc736aFDjpusO9Bf7fTs7CyOmwYAVTs9kUQ9BCTP6+JpnR9oPgO/gm+Pp8 UkwZ2KfkxqvxRsxEDRPj8CSn3xogITBrri3g7YQ6t4cDfDEyAlBB/UalD+ljgxNp 5RB36tV59jKCTe0aohRgKMGAxKaublm+Zq+uJ7VLzDObV0waaKVUiQEcBBABCgAG BQJYe8KZAAoJEJAzkqtkuEQDA7EH/ittNLlu5s1+v4sjtDZvCHAseI5lrKEl1VHD Ba+geRyCXLAnJEAeaX1RxbIisM3omqLaQVkeJlQMDY9K/prGdgrkn4g6E4cX1qhC HIub/+xJtn5woYOBNAB4AQ21SkzUrW9ZEnujKvFaGclY7UoKKTQ1naDKFUsHvlzO fYWhi1dZOFS0mVsCVCo2+2qg6H+xfa5bmZqtkCNZbt0sOLWeBE8uLR24Ph9CLVt0 dL8rGb7fPECcWprlmf5GMLY3ok2zn5yjizyywrRMEDQQIb7ptLVtMkt38NJvYB7J 0pUS0SgH+MtWjWL238vwIzkbv+KIU3T9KMn4U/gfv9GRK/o8AW+JARwEEAEKAAYF AlifPWMACgkQHnSXejBY2HDczgf+N60hU21BgAj51/vS7NbN1eOpP7RS42bPSvxw EEgsy7IjEs7iICHJluWw7HM23U/jS4mlLV7qMqtCQDud5/3Jdz65d0QQxHRFmn3P BEu5w7QuZNEdGuu1EiGd8ROFi9IUOaJZlofrJASM9ywuxXzrB2hbmvt6RgjL4QC/ MqnvOFNBfCnw4mGhHn/B0MzIuNfyAD9SdnrrVWG06AE2DLKUkbTPkgwKmfPyTmdr kvDArz5CuWcOP5mc/kAM0BkakVW3Or67NIHzY1FqrCe5ZkDxcH7LqL7FfJyIBacL fASSpat954dGPWaY2YT+/Lp5JWVvg05AiQqnSOuO/V44Uig7QYkBHAQQAQoABgUC WKBTEwAKCRAiHht3HJDjc4V9CACcFsJE8LYXPRO5pg8YYpU7B8mUBYzRBlanEMgx eVdrT7QKB0FHZ2z9symplIITWPqaPnvnpy5U6KCnyiBcY0wXIZxwpOv1dU2zA0/i TqgUeSeZjRXeprcq7GKB0sRpOsoXT7WHbuaw8IOnQhXzZFAY6ivlZOk11wOE52Em xaQu9CD7KXYA8dAdIaZhZHvB1bSBS4yCCmZWs0qJJeMIQtaSmnszDjh/EWcK/81u HWHLhtYLBFM3Dh7jQ9KYCSdrG/M0p0cjmf6u5I0T0ErEH0ZJ0Uu7JXsNCMcdLM0O f3ghRveNEbqYprhDgdO3KuoLtC9RfZIWL8O5Po7qwUryq8N7iQEcBBABCgAGBQJY o0I8AAoJEAxiweouthhKMTQIANLPwq/565sklgMdeyuxWxk2XdHwjRuG14JRxowQ 1KYlwLAn/vKOi3o47w3njs/gxYLHFTfDc0LbKlIjt7nMhUBE6GL/sU5lZml8LXzz 8T5rEUWCysijXs2j8DITqhKVtYxW5Kayiuihcx991Idy2f5pBlUB/2V52/+aKB0M 04hOw7oBP9Z9MIDCYkMtru1Qk5I76SebtUbZFg5GyTj5Jc9U/l3h50JoYwm6r7t3 OceJVseDrptRARddxBF1l4adbRTuy4sx2UyRLtb9GN75Zz14bWBXXGxEi4NUBgix lqE69Q8ZjM6cnGqP+MJJDxEZZ6LUbYLZrNCT8Wwu8fz/r96JAhwEEAEKAAYFAlit m0gACgkQs7BCH0A9GPTNkRAAqiYKOMA6ZPks+h/SObsUg+MVlNB83zD8lRZ5sGK4 Bg9MLmp3FSewzVhcRRcQN2cxJ8REuDjxMg7Qv/6YuTTkWnvXdE+Y3dZxvtLyLyNv gpPIWJJRPTm0Q36NEy8g925oY/pmY5eIWkPQPda3S3E7pL/ULnc4i/VmdRHGna45 t6x4a6mU3n1Zu/i/eNrkbu5unXMdOXcgmvHgSUfcp0qCsuvdenCn9AHPJVUymPJT algyIRaFiQH/U8uiR3FIPqLGzU1RzgFIjSqEB9d8yknK8udzZW4azC2HSdWJWBTd r6yLsw6xAWR1gk90TBYic8v/loig9w9+rI/eQc63yQPLMoYdDqO0Tbm3uirURI/5 CnAZ0+thh1PNhfu5Xi5ZTmQJOXI0DTThoq9SfMzGvz97MpDpd9bSfq9QDx3o33KR qFSWL2jt9eqSxNIM41Y71VbMP5UxjV0J1+9uXrW2n8Q/VmRfTf/j8/oVQGG3n6A4 VJREq547bCbA9dSUS/xtwQjUoys2vxsgOkyNQNGi3LwERRnvNBGg3e2zyqMegqmI BQdc+ylR2IU/Ve2RMyI9CY0TD+haMRiOurrzGWWyXJxMw0tU4/NWtTGsxaAH0ML8 lRlqIa7oGITlJn2GngTWSZkr2axZbdu2V29Rkjde9vsUyIzPCDeZU22mI6/GCqie gu+JAhwEEAEKAAYFAlitplsACgkQZ3hMjjSDhOEn1RAAkaXYRQOIlC0X3CJ6ByJq 19KiypSZzl9bC56iXIpKx4fD+btXtu7/9pd0b/dSn16fkzNXf+kY50eHwkSGMmCl EQ5GGVDtNSdw6dE9uPbuTgBJWiPLyCfinsZQ9AFTpOcaKy8q4Clj7B8tpW77jDzj ojww7Bbqk9Fs4acSgdIm77jBkWiWbpXBO2kX8UL27uHCCwmzgHjXzsIVR4BBCbc0 SQ9Ty5ukcJQCchfjvtyRmSl5MOPFgtfFd+0uIxmFzfv1Z9vkO+MRRBm/CZ0YVPXt DZcFNB7JVcL8WQ8HyLlq/5gfrkmN8RzSEvGplQ4Q2AvXB4CyDvr1quTzzxX3uTao N6xWvQlSDpIOPkh5+MpWmnyY76FzuRiI34DL8z8hNZ6JypG4ls1YUJdWtq5B2Ws7 hazUt2YvHlQIf6HWMx/MEGco2MCfHlyr8sQHmyDlPBKHk2o1u3PJzHWH6SUy9nbk tZ3GSGGhfMcAi6U5MUtqKIW0/W6GutgbpAXKgrEN+PTIC+WhZcZoCW1Bd6ieoj6F M+fy+vqAd8CaIqKrhYbj6GiU62L4N0xmKMLAZYIYrUAC/EsRncJwBy3W+clw2w4N noUj0qblCGTcTeLBLACGIN1ZqRdpyaohotiJl3eRbh2k/kgPdnfDz6/OSdcNiXzR OG1a0KuHNQqKL82QhErMKVWJAhwEEAEKAAYFAljKce4ACgkQBPXYN3EqM85QLRAA vt0+OImADndNXZwps+j3xLa/yE4fTo2LiVXW7viW8gLeqO8UwUEwmELVnqGmseQn bvRU0/YzYRrxXceUvK1iQP/cFsdi7041Z58qMabboJV/1CqrsbBssQnLCwBF9gGD IYAkVJS/zQH0vqGF/EJAsKJ0nFpT4N6AxxuMYWShHMgQP2z4ooMGU4krTtNpp6Tz 8B5Y8l0a61SeoN60KfPrKXwRybCHepPW6nYfl00CSzu39jzz9DzKV52DKDjET8oo 4rxpcvsALRxAEAGaJUFxDcFx5DJv5+nJ7SIm986FM9hW39ik1PzMzzyvedF3+ZSQ l+ptcJN/1uac7r3sHNsm0VvMoo94gKMuIKN7eoM6QZGkTgsXy4Uqk6w5GTG7gGn9 UoQU5PLqIuTnqCYh+WyYI9HxhhyeSjJZLoonYqf/6WHo4lhWW6nlHeyj4dXT/2Vt KJxdSVWRlPrDnDaV9ZIqQ+5uOYXVQB+3ozPg4lVkeBbnjGlCjzb4qLSrzBduv7QO wTUe0jWoktH0xhkuUegvD8KU1NyKNnpMGN2aFYPQ2Ysqwb5ZgrJ+/ixvOw1/m+nF DT1nmJ+G2x6MNVk4aqsAoiDaz05Dr/FgXZhGfaeThDaR9L8ZN/LslMYne7gf9DgJ i4NMNoo2QkVX4ebqX5QAEwUaDCeXG5sewbRguie2/FOJAhwEEAEKAAYFAljfFskA CgkQPKgmyw9M8oikEg//edhVp4Okh0oolhkfoFXS4QvMT9OoYy9q/7V552qOhQOg Q8Rhe7S/+VKSAr3Flju2xjlmDV6YFWn9+Kv18LzpAIo5jcp7QEPmD5qGHxLYd98r h1d7o8sVMe6Wm1tClYqvEfaHZSJTRgTW9XZDfAWQkSNLanxbh9vsArP1bJYqp+m9 XBkHuewCwwMyU3ziqG4wBntBCOeyh/iODWHMKsIxjW5RXAklGTvZI1KyIYwHDkaw Ivm5RoN9aZ2WENGndc3eOdpyK/oaevsSzgzwtZqFsQjtq4mB1TFe66Vj3CsIe34r f09zkNBQiwZezPqm80OaohkF9t2YXo6N7fQV4ssSzFzLWsZp6N3iNASp4/DF74DT 9tLPh4IxcB74oeAqMlybr+8LpIRh/Nt+z7GKNbofnm0SVJXDEzAAdUnXlvlky1Ri 4xNr3MtTSKAOkdS0iIBPlmNipNstVBrFWSh848/i09cuXdm4/UqDEMFpUsH9atkt DGJEwus28keTB2swbY1c5GDNlwmlEJeSk4oKJHLuY6yyESj0i7v8M66AW0lpx4ff lyFDrR9d70IDwMUuKARd7RSlGpoe21SI8ET5/bIEvRag+NWQGFyrA4Fi1A/HvFa9 N9ozD4ceVV0XdmBZqf72Ma4DpPw2rS+kJY/yoRbYwo22Jv+4osfyBTG0gMkAu5mJ AZwEEAEKAAYFAlmHsA4ACgkQZ3uh8LVwoUY+OAv+MO/VcUq0xLtO5qefJ7w5dpWl AF7PNjsiQVJK2ACV60mhrF7UcY8OnvNGspET80Cl4wWyXybpTrvG29sPY2DFtr6j 5uZH7a+ElEtq1L5SYMBpzTo1CmNFT4BFKS1BHBQCmxKz8cX3KNp2gjSTlH9zz6Sj x1o2hlQkgSMX9UmfCx3Bcjat4kpxZiF89obHYNg80VN6zvUTzUwZCzSOU1vBJz2o 0ZHjclfQPr0+OUVrdNqqZ7xAMMdDz3Yyf+7uPR7njLMxtCNkvggPNGkBAmiA1jrv y+WnSR/COV6OY93N9gVECXaq7ZaPDqSCnOPbQ0+UIyi7zUvCQjhM3lEB0xUjFWM1 xz2BEl+SURs/0H+lf0gOID6RiSsvRhBRkfrL9D8dAKSgQ+jFDktyjrbFC6NupCC2 5J4PpZx0LmbbQuD1EDBl/eEQFtLBbot+7YS4+/xIO1inKfxxKjU9ln2IF7aYgukw 7y3DtA5i0Fc6OY4Fp4jZ3QTqFsIsZMeg/La/urDWiQIcBBABCgAGBQJZtcGfAAoJ EGKrbC2pNmtMrvoP/jr9mDhMBzXE9/JPuAM2BFFS/XgUdHmu7jaJPsWyuAgzkkjD hydC7FSKlxWOrrWt8z6IeKoWnhCxoDThi45LgMwBnEnJc7je3PpXCkoGtw5/rkvL ApCDHDELYsTvyZotv/t+iTWzbuweEZrQpWI9nKC7u9UNd4NdBEXQPPhiS9DnyYAR b9K0TKpTC1HPT2hQt4AmpRkB3QaXYvi0FT4Q5ZliWIs7MZe5+l7SQ9FZo1TjXQZi z0BmWt4zsHPbiHsk0p1O+P+4UrN3dco5vRR6mvhsjrC1T+K1UsP3Hf2pKLFMyftc PKPy6NgBUicbUNQa/LKb5E3GsPRunDkpi0/YOzs5I6eolSZWNclTRwezboTfW2FD jHZmTSyQH/RIccyyDRUwbEQJLVfBQLGmdWJOM8qVgzuZI8FqkJh73tUrZch1eGrR 1svoBIoiIc9ZpcqcwmLR8OsXgS585eUoSK/Z8/Z6KN2xkVOVAUbWZeyslk9gd6nj nInGAywwtdeZbiIwqsNKTokA7qQnxmtuPCB4mdusHmucZdAF49+oDpo3FiAeA7FU YLC/SOl4+Vdv6I76ov4Yica1YubhA75fWyAH/R5ut5olKoA7yG8MxIjyotU/Lc65 IHAkOKzxVI4BvTZGq49kO5VJZWfHHe2DW5oSGQwhyJAQvGHUH8DsGmq9VwGmuQGN BFNaZOIBDACgUf89FucUHUG7+L/YgLAIcYveoLia34qYPWcUzPMEH/bItXjLKmb/ f+m6+Ddv9NGl3N68IWFil6YohcyWwuo41XBEAxBn2U8Pe1Q+IVrj9e0dG8n0gWGk VO+xVRsVjSUm7NW7ruIC1kap93KAg19ctoDW/vTuso71IjWERzoUXpf6+Yrlicit LofFNTOACl8DARnEjxfyxve+YkFrGhKTWlyLHG/j0I69hgvdjqUIWMfZhItJz1/0 Ci+04rFujx6s5N6txliEiy31EpVJVkCF5lv6hJOrRQReXyesZOiCvKsXJTo8inU6 2zn5CnYL2ocqTDBOoY7rR9zkJ70OUBgLI+1zfbpAqm5m9uXJUEg8KRd2UlSJ7xFL 3Gouidf6QsUDmj4JPuC8ZhTzve+hGX7n68Kn2k13PHH/SJqC/IyfRSLgg4o273Ho Rlo3YyW8Z4emmXxmS11r3VALshcOMzdXK08y2GxEPivDK9x1MJlcxe858xGQDp1u P/oTS1muPWsAEQEAAYkDxAQYAQIADwUCU1pk4gIbAgUJCWYBgAGpCRBB5wROHbou icDdIAQZAQIABgUCU1pk4gAKCRB6Ap5U3V3OemEVC/9Br6DDPHc51pG3XzugBHOO w4UmZGQsiRnjc/F1pmXuijMiC26LUsv0+b63GH7FaKeiWKwGqzU4w1qcbj2BR86h w+JZM0nmH5lAoMMZ6Gp0twWPKELpVo6jSvtvpCAZZukTL2sYmUbEXFgo5XYu/slI KHGYfRSznXd+/pevUQAkU/ptqu2fJ2piME5gK9anD6a208WazwtZgzRd+89EroTX q+/lwSLmUpVJlGaca0kGEKqCSfHuUvtrmLjsWvpc1k+WspIRyJd8mh+bz4jV0cJI rxhPPTKSM7FaZcM3Z5bfGfkFBnfcGH+l8Br5wsU/eOP4l7RPodNbUWm+A+1l9kyS U8yTkN21WEp/u1FO+4BW7KhVKtYylSR8OsIsHQBTYr0JRFe+iQ6CcYAyLex4/AMA i9wF1Kf0Wb0huyEefogykxfZ8tyFxNrx5rN71OZHmNAbb1QBDUOCXmy+exPTZkUu 8ea5BMx9fv69wy7SSmdvPad15QW8fQJB4KknaCLnF54nSRAAwxf/3qRGPh3O0aW2 OYOmLv5g7eFIT2oZ1Hvcq3/5vCLKBCRkFghx2Bak4NUi91xFMkUDOTkdoYzp77pF q6CEzI43EiVQwtTaDbPZj43jx7U2/NMW3DBY1ciNvjPWItkCbqj8Kv4/zQQlbA73 QmnhHk/i3VNzY8Kx07Vv+8tYjw1lt9g7vkn+roH6kPgF6KxrmhYtk7FJ9ndXpumm nq3vK6m0iWGvnP0SNAXYw0o6scE1g2Sa7eqOU23T4DX2CiX3QZ2dG+tVRG1jtn0C 60BcfqXwSzmtpeu+thUjxNvPrnQYcSk5xRX6xbNNREuBHeQvYK6Mc6ybD7Lxdnrg iFZ5EoRQSmfbld6h9HVbHh5q8BKbifa7TeAA+R1z5dmuGIsPUzEPqrNavgiHPWOL XvdSyoBRj9f32oY60zqBEjvFbauvIFer3AIsIMTY2DWO0L0aq6Vb4KZMDERrkphT nWDUluvavGIsct8jVUsVnZmBVCm4WM3OnxbJZnxkU+FmOoQNzfamSEX/0cp32o4l Z4oi31R3uv/ZmkKS+T/v4gnGJdwklgLMMoMUFYUMbGP677P5jw5dUT2x5J7JT4Lb ea4V2MH3zNDt68YecYp3JXNapmQtw++5ax/yM6qNNDo9udM+UEOXn1Qg+AaDEUTX PYPIpki7GlneBtU5NYsYb2Muo6+5AY0EU1plMQEMALyM42uovSAmEiKnc+tuC8wi wBw9wCvGUCTGvrk+YVlA3YkfcJGUxSP7DkIgufScdw6e3NizhLiQpygM54VVmBK0 XmUmVvXc5OJOwFXHTHt5pX6HdL52fZ1AkGu5BJZdMzPq9zJruNszYTAkTk5fsU0a LHnYQnSwn5nIbOWhvFjYng8cYaQdAbGRE1SdOEBBoRhgaoqA+axpZO51og9le2wb Ij4y+ZbC3o80mX4UezYTu4d6jspzHhjuBPthdEhqQRxSy0VPEjOGIoMVbrIs5RKp hNFinLtKNb2ZJyjm1fViNi1+9lgrHOt5aQgAXiWlpsdijxsxiX4p7V3KHZu4vz1P AAl3Q1OJkvF6InNX8NPxf4hjMkA7gbacCJrtGkkVF5JlxK2eLA/QDlI9L7W0Q4G8 p6yrZ47+6CyKLwinB84kUDRBkL4Zt5gPf0rcPhfZ6IWsOkikFNGJejxvqO6aYC8J K5DVGdmZFwkycT96qnaEe6IoD5Dj/gJj5ZN/N+DbUQARAQABiQIlBBgBAgAPBQJT WmUxAhsMBQkJZgGAAAoJEEHnBE4dui6Js9AP/At2ag6h8PFPM33n1NN4eVMuP+Zh 8EknXzSdtSBwtdjaod1wkgo/D/uN6S5EBC2CZlg7bTxClZatKCY3lkn/osjf/yui rjWlAPZqw4PRVS0/nrkrkZkWL3IvXuW+rhpqP9Ktt+sYjm+eiIXuF0geN34p8SW0 g5+mVxE3Fje8HTtTsWbJpd0oTK4JI6qYmsER+ansZIknW9QhEyvAUGTWpks+Z2D6 XoV6JqEsvAs8M3PaA/e/+22iM0OIa4z+OeV1SYM9vyhCZCNNtBO/d1vsFi9Ig1d4 aAK+5Lc+9XjxzCaw7DJUyfZFYc/hJHpMMW0cfOjgfUdEqoXp5YuLUeZT5laDx38H eNUgVQfa6UJPCWgG5uNNxvdmHw49OYdfVf/GPqBv/wZKke1FRrBD82kfDRvmmGNH +w6vxaGxv/LEK/h7KUKN5adFGTH1qli7bophgwjmDYhDBwQQ3NckYXQIwKIcSPvo Kn1OkQT5DwROLk8r7RPwNxf4b1/rJ/1XAfLk/fLpiN0CraiY2Jq4f033z+9CfPO0 mYjk7nL5JYVkfXjThCF9f52gRVS6kktN67IGaayi8pgKgj4f/K4U3p0uAUgKNj4l +TdCymiiEvhqE6EHxGfmJaUh9IofIaqiURzZGxQ8FN1BuIvJtU4SbEyTGXaB5Ys9 893KN8JX2ozmsF4k =w75J -----END PGP PUBLIC KEY BLOCK----- EOF ! $gpg --list-keys | grep pub $gpg --import $key $gpg --list-key --fingerprint | tr -d '[:space:]' | grep $fingerprint > /dev/null echo ${fingerprint}:6: | $gpg --import-ownertrust > /dev/null 2>&1 sha256=`sha256sum $apk` echo $sha256 >> $log touch ${log}.${sha256} if $gpg --batch --trust-model always --verify $asc $apk >> $log 2>&1; then rm -rf $dldir else echo Failed to verify $apk touch ${log}.failed fi ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/checkupdates.TestCase0000755000175000017500000003171314620351225020254 0ustar00hanshans#!/usr/bin/env python3 # http://www.drdobbs.com/testing/unit-testing-with-python/240165163 import logging import os import sys import unittest from unittest import mock from pathlib import Path localmodule = Path(__file__).resolve().parent.parent print('localmodule: ' + str(localmodule)) if localmodule not in sys.path: sys.path.insert(0, str(localmodule)) import fdroidserver.checkupdates import fdroidserver.metadata from fdroidserver.exception import FDroidException class CheckupdatesTest(unittest.TestCase): '''fdroidserver/checkupdates.py''' def setUp(self): logging.basicConfig(level=logging.DEBUG) self.basedir = localmodule / 'tests' os.chdir(self.basedir) def test_autoupdatemode_no_suffix(self): fdroidserver.checkupdates.config = {} app = fdroidserver.metadata.App() app.id = 'loop.starts.shooting' app.metadatapath = 'metadata/' + app.id + '.yml' app.CurrentVersion = '1.1.8-fdroid' app.CurrentVersionCode = 10108 app.UpdateCheckMode = 'HTTP' app.AutoUpdateMode = 'Version %v' build = fdroidserver.metadata.Build() build.versionCode = app.CurrentVersionCode build.versionName = app.CurrentVersion app['Builds'].append(build) with mock.patch( 'fdroidserver.checkupdates.check_http', lambda app: ('1.1.9', 10109) ): with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()): with mock.patch('subprocess.call', lambda cmd: 0): fdroidserver.checkupdates.checkupdates_app(app, auto=True) build = app['Builds'][-1] self.assertEqual(build.versionName, '1.1.9') self.assertEqual(build.commit, '1.1.9') with mock.patch( 'fdroidserver.checkupdates.check_http', lambda app: ('1.7.9', 10107) ): with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()): with mock.patch('subprocess.call', lambda cmd: 0): with self.assertRaises(FDroidException): fdroidserver.checkupdates.checkupdates_app(app, auto=True) build = app['Builds'][-1] self.assertEqual(build.versionName, '1.1.9') self.assertEqual(build.commit, '1.1.9') def test_autoupdatemode_suffix(self): fdroidserver.checkupdates.config = {} app = fdroidserver.metadata.App() app.id = 'loop.starts.shooting' app.metadatapath = 'metadata/' + app.id + '.yml' app.CurrentVersion = '1.1.8-fdroid' app.CurrentVersionCode = 10108 app.UpdateCheckMode = 'HTTP' app.AutoUpdateMode = r'Version +.%c-fdroid v%v_%c' build = fdroidserver.metadata.Build() build.versionCode = app.CurrentVersionCode build.versionName = app.CurrentVersion app['Builds'].append(build) with mock.patch( 'fdroidserver.checkupdates.check_http', lambda app: ('1.1.9', 10109) ): with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()): with mock.patch('subprocess.call', lambda cmd: 0): fdroidserver.checkupdates.checkupdates_app(app, auto=True) build = app['Builds'][-1] self.assertEqual(build.versionName, '1.1.9.10109-fdroid') self.assertEqual(build.commit, 'v1.1.9_10109') def test_autoupdate_multi_variants(self): fdroidserver.checkupdates.config = {} app = fdroidserver.metadata.App() app.id = 'loop.starts.shooting' app.metadatapath = 'metadata/' + app.id + '.yml' app.CurrentVersion = '1.1.8' app.CurrentVersionCode = 101083 app.UpdateCheckMode = 'Tags' app.AutoUpdateMode = r'Version' app.VercodeOperation = [ "10*%c+1", "10*%c+3", ] build = fdroidserver.metadata.Build() build.versionCode = app.CurrentVersionCode - 2 build.versionName = app.CurrentVersion build.gradle = ["arm"] app['Builds'].append(build) build = fdroidserver.metadata.Build() build.versionCode = app.CurrentVersionCode build.versionName = app.CurrentVersion build.gradle = ["x86"] app['Builds'].append(build) with mock.patch( 'fdroidserver.checkupdates.check_tags', lambda app, pattern: ('1.1.9', 10109, 'v1.1.9'), ): with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()): with mock.patch('subprocess.call', lambda cmd: 0): fdroidserver.checkupdates.checkupdates_app(app, auto=True) build = app['Builds'][-2] self.assertEqual(build.versionName, '1.1.9') self.assertEqual(build.versionCode, 101091) self.assertEqual(build.gradle, ["arm"]) build = app['Builds'][-1] self.assertEqual(build.versionName, '1.1.9') self.assertEqual(build.versionCode, 101093) self.assertEqual(build.gradle, ["x86"]) self.assertEqual(app.CurrentVersion, '1.1.9') self.assertEqual(app.CurrentVersionCode, 101093) def test_checkupdates_app_http(self): fdroidserver.checkupdates.config = {} app = fdroidserver.metadata.App() app.id = 'loop.starts.shooting' app.metadatapath = 'metadata/' + app.id + '.yml' app.CurrentVersionCode = 10108 app.UpdateCheckMode = 'HTTP' app.UpdateCheckData = 'mock' with mock.patch( 'fdroidserver.checkupdates.check_http', lambda app: (None, 'bla') ): with self.assertRaises(FDroidException): fdroidserver.checkupdates.checkupdates_app(app, auto=True) with mock.patch( 'fdroidserver.checkupdates.check_http', lambda app: ('1.1.9', 10109) ): with mock.patch( 'fdroidserver.metadata.write_metadata', mock.Mock() ) as wrmock: with mock.patch('subprocess.call', lambda cmd: 0): fdroidserver.checkupdates.checkupdates_app(app, auto=True) wrmock.assert_called_with(app.metadatapath, app) def test_checkupdates_app_tags(self): fdroidserver.checkupdates.config = {} app = fdroidserver.metadata.App() app.id = 'loop.starts.shooting' app.metadatapath = 'metadata/' + app.id + '.yml' app.CurrentVersion = '1.1.8' app.CurrentVersionCode = 10108 app.UpdateCheckMode = 'Tags' app.AutoUpdateMode = 'Version' build = fdroidserver.metadata.Build() build.versionCode = app.CurrentVersionCode build.versionName = app.CurrentVersion app['Builds'].append(build) with mock.patch( 'fdroidserver.checkupdates.check_tags', lambda app, pattern: (None, 'bla', None), ): with self.assertRaises(FDroidException): fdroidserver.checkupdates.checkupdates_app(app, auto=True) with mock.patch( 'fdroidserver.checkupdates.check_tags', lambda app, pattern: ('1.1.9', 10109, 'v1.1.9'), ): with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()): with mock.patch('subprocess.call', lambda cmd: 0): fdroidserver.checkupdates.checkupdates_app(app, auto=True) build = app['Builds'][-1] self.assertEqual(build.versionName, '1.1.9') self.assertEqual(build.commit, 'v1.1.9') def test_check_http(self): app = fdroidserver.metadata.App() app.id = 'loop.starts.shooting' app.metadatapath = 'metadata/' + app.id + '.yml' app.CurrentVersionCode = 10108 app.UpdateCheckMode = 'HTTP' app.UpdateCheckData = r'https://a.net/b.txt|c(.*)|https://d.net/e.txt|v(.*)' app.UpdateCheckIgnore = 'beta' respmock = mock.Mock() respmock.read = lambda: 'v1.1.9\nc10109'.encode('utf-8') with mock.patch('urllib.request.urlopen', lambda a, b, c: respmock): vername, vercode = fdroidserver.checkupdates.check_http(app) self.assertEqual(vername, '1.1.9') self.assertEqual(vercode, 10109) def test_check_http_blocks_unknown_schemes(self): app = fdroidserver.metadata.App() for scheme in ('file', 'ssh', 'http', ';pwn'): app.id = scheme faked = scheme + '://fake.url/for/testing/scheme' app.UpdateCheckData = faked + '|ignored|' + faked + '|ignored' app.metadatapath = 'metadata/' + app.id + '.yml' with self.assertRaises(FDroidException): fdroidserver.checkupdates.check_http(app) def test_check_http_ignore(self): app = fdroidserver.metadata.App() app.id = 'loop.starts.shooting' app.metadatapath = 'metadata/' + app.id + '.yml' app.CurrentVersionCode = 10108 app.UpdateCheckMode = 'HTTP' app.UpdateCheckData = r'https://a.net/b.txt|c(.*)|https://d.net/e.txt|v(.*)' app.UpdateCheckIgnore = 'beta' respmock = mock.Mock() respmock.read = lambda: 'v1.1.9-beta\nc10109'.encode('utf-8') with mock.patch('urllib.request.urlopen', lambda a, b, c: respmock): vername, vercode = fdroidserver.checkupdates.check_http(app) self.assertEqual(vername, None) def test_check_tags_data(self): app = fdroidserver.metadata.App() app.id = 'loop.starts.shooting' app.metadatapath = 'metadata/' + app.id + '.yml' app.RepoType = 'git' app.CurrentVersionCode = 10108 app.UpdateCheckMode = 'Tags' app.UpdateCheckData = r'b.txt|c(.*)|e.txt|v(.*)' vcs = mock.Mock() vcs.latesttags.return_value = ['1.1.9', '1.1.8'] with mock.patch( 'pathlib.Path.read_text', lambda a: 'v1.1.9\nc10109' ) as _ignored, mock.patch.object( Path, 'is_file' ) as mock_path, mock.patch('fdroidserver.common.getvcs', return_value=vcs): _ignored # silence the linters mock_path.is_file.return_falue = True vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) self.assertEqual(vername, '1.1.9') self.assertEqual(vercode, 10109) app.UpdateCheckData = r'b.txt|c(.*)|.|v(.*)' with mock.patch( 'pathlib.Path.read_text', lambda a: 'v1.1.0\nc10109' ) as _ignored, mock.patch.object( Path, 'is_file' ) as mock_path, mock.patch('fdroidserver.common.getvcs', return_value=vcs): _ignored # silence the linters mock_path.is_file.return_falue = True vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) self.assertEqual(vername, '1.1.0') self.assertEqual(vercode, 10109) app.UpdateCheckData = r'b.txt|c(.*)||' with mock.patch( 'pathlib.Path.read_text', lambda a: 'v1.1.9\nc10109' ) as _ignored, mock.patch.object( Path, 'is_file' ) as mock_path, mock.patch('fdroidserver.common.getvcs', return_value=vcs): _ignored # silence the linters mock_path.is_file.return_falue = True vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) self.assertEqual(vername, '1.1.9') self.assertEqual(vercode, 10109) vcs.latesttags.return_value = ['Android-1.1.0', '1.1.8'] app.UpdateCheckData = r'b.txt|c(.*)||Android-([\d.]+)' with mock.patch( 'pathlib.Path.read_text', lambda a: 'v1.1.9\nc10109' ) as _ignored, mock.patch.object( Path, 'is_file' ) as mock_path, mock.patch('fdroidserver.common.getvcs', return_value=vcs): _ignored # silence the linters mock_path.is_file.return_falue = True vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) self.assertEqual(vername, '1.1.0') self.assertEqual(vercode, 10109) app.UpdateCheckData = r'|\+(\d+)||Android-([\d.]+)' vcs.latesttags.return_value = ['Android-1.1.0+1'] with mock.patch('fdroidserver.common.getvcs', return_value=vcs): vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) self.assertEqual(vername, '1.1.0') self.assertEqual(vercode, 1) app.UpdateCheckData = '|||' vcs.latesttags.return_value = ['2'] with mock.patch('fdroidserver.common.getvcs', return_value=vcs): vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) self.assertEqual(vername, '2') self.assertEqual(vercode, 2) if __name__ == "__main__": import argparse from testcommon import parse_args_for_test parser = argparse.ArgumentParser() parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(CheckupdatesTest)) unittest.main(failfast=False) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/com.fake.IpaApp_1000000000001.ipa0000644000175000017500000000327214620351225021020 0ustar00hanshansPK VPayload/UX _>d_>dPKVPayload/IpaApp.app/PKVTCPayload/IpaApp.app/Info.plistTI@qPqA""ZamN[hLQkě'hԋ&Ĩ4y}Su-Se FcۯC>bcƎ?abr)SM1sT:`ን׬]˯ްqyŊe}׊A'WYOl[8C+CG0D >F_a],9uD=2iKj#Zm9>)삚 UJ}E`ݹW2'\!R q!=$i잃2uY` QFMd#oOֺ[WQ_ !CXTЛWW)v=]^ ˨WЦ2Up+M!hK3!rEr]P2Cqm2V`;]u»; mw@B,車aG9 qSah8@k+[1ލ!]k,=cDYk G4ב ;`*3 jN S}q?C)?`s2܋v4k>h"qXCJ'Q.p%ɐ*` CzeUhYvvUSS3SڟЖ p QjʟC y,DqWYum;ӄGTȩr&H\)nSEڎFL]Bewd^B* $Qb鏎X>fCmnhzq#m%W W,ܿʲg-TՇ=rOߑaˍ=?GDvFӑˑ'בpaD!!.7{3G.ŜC%X|]-GOFG/EDE?G"X,3b'bWbc7c_,͐KE$헐T#itN }JW$hy#_ J~-ɟ/q9>(ćGgW77EZ(D_3׿PK V @APayload/UX_>d_>dPK?V$A6Payload/IpaApp.app/ Xrgk1gk1PK?VTC$ gPayload/IpaApp.app/Info.plist Xrgk1gk1PK././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/common.TestCase0000755000175000017500000043741014620351225017105 0ustar00hanshans#!/usr/bin/env python3 # http://www.drdobbs.com/testing/unit-testing-with-python/240165163 import difflib import git import glob import importlib import inspect import json import logging import os import re import ruamel.yaml import shutil import subprocess import sys import tempfile import time import unittest import textwrap import yaml import gzip from argparse import ArgumentParser from zipfile import BadZipFile, ZipFile from unittest import mock from pathlib import Path localmodule = os.path.realpath( os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') ) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) import fdroidserver.index import fdroidserver.signindex import fdroidserver.common import fdroidserver.metadata from testcommon import TmpCwd, mkdtemp, parse_args_for_test from fdroidserver.common import ANTIFEATURES_CONFIG_NAME, CATEGORIES_CONFIG_NAME from fdroidserver.exception import FDroidException, VCSException,\ MetaDataException, VerificationException from fdroidserver.looseversion import LooseVersion def _mock_common_module_options_instance(): """Helper method to deal with difficult visibility of the module-level options.""" fdroidserver.common.options = mock.Mock() fdroidserver.common.options.verbose = False class CommonTest(unittest.TestCase): '''fdroidserver/common.py''' def setUp(self): logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger('androguard.axml') logger.setLevel(logging.INFO) # tame the axml debug messages self.basedir = os.path.join(localmodule, 'tests') self.tmpdir = os.path.abspath(os.path.join(self.basedir, '..', '.testfiles')) if not os.path.exists(self.tmpdir): os.makedirs(self.tmpdir) os.chdir(self.basedir) # these are declared as None at the top of the module file fdroidserver.common.config = None fdroidserver.common.options = None fdroidserver.metadata.srclibs = None self._td = mkdtemp() self.testdir = self._td.name def tearDown(self): fdroidserver.common.config = None fdroidserver.common.options = None os.chdir(self.basedir) self._td.cleanup() if os.path.exists(self.tmpdir): shutil.rmtree(self.tmpdir) def test_parse_human_readable_size(self): for k, v in ( (9827, 9827), (123.456, 123), ('123b', 123), ('1.2', 1), ('10.43 KiB', 10680), ('11GB', 11000000000), ('59kb', 59000), ('343.1 mb', 343100000), ('99.9GiB', 107266808217), ('1MB', 1000000), ): self.assertEqual(fdroidserver.common.parse_human_readable_size(k), v) for v in ((12, 123), '0xfff', [], None, '12,123', '123GG', '982374bb', self): with self.assertRaises(ValueError): fdroidserver.common.parse_human_readable_size(v) def test_assert_config_keystore(self): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with self.assertRaises(FDroidException): fdroidserver.common.assert_config_keystore({}) with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): c = { 'repo_keyalias': 'localhost', 'keystore': 'keystore.jks', 'keystorepass': '12345', 'keypass': '12345', } with open('keystore.jks', 'w'): pass fdroidserver.common.assert_config_keystore(c) def _set_build_tools(self): build_tools = os.path.join( fdroidserver.common.config['sdk_path'], 'build-tools' ) if os.path.exists(build_tools): for f in sorted(os.listdir(build_tools), reverse=True): versioned = os.path.join(build_tools, f) if os.path.isdir(versioned) and os.path.isfile( os.path.join(versioned, 'apksigner') ): break return True else: print('no build-tools found: ' + build_tools) return False def _find_all(self): tools = ['aapt', 'adb', 'jarsigner'] if os.path.exists(os.path.join(os.getenv('ANDROID_HOME'), 'tools', 'android')): tools.append('android') for cmd in tools: try: path = fdroidserver.common.find_sdk_tools_cmd(cmd) self.assertTrue(os.path.exists(path)) self.assertTrue(os.path.isfile(path)) except fdroidserver.exception.FDroidException: pass @unittest.skipUnless(os.getenv('ANDROID_HOME'), "Needs ANDROID_HOME env var") def test_find_sdk_tools_cmd(self): fdroidserver.common.config = dict() # TODO add this once everything works without sdk_path set in config # self._find_all() sdk_path = os.getenv('ANDROID_HOME') if os.path.exists(sdk_path): fdroidserver.common.config['sdk_path'] = sdk_path build_tools = os.path.join(sdk_path, 'build-tools') if self._set_build_tools() or os.path.exists('/usr/bin/aapt'): self._find_all() else: print('no build-tools found: ' + build_tools) def test_find_java_root_path(self): os.chdir(self.tmpdir) all_pathlists = [ ( [ # Debian '/usr/lib/jvm/java-1.5.0-gcj-5-amd64', '/usr/lib/jvm/java-8-openjdk-amd64', '/usr/lib/jvm/java-1.8.0-openjdk-amd64', ], '/usr/lib/jvm/java-8-openjdk-amd64', ), ( [ # OSX '/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk', '/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk', '/System/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk', ], '/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk', ), ] for pathlist, choice in all_pathlists: # strip leading / to make relative paths to test without root pathlist = [p[1:] for p in pathlist] # create test file used in common._add_java_paths_to_config() for p in pathlist: if p.startswith('/System') or p.startswith('/Library'): basedir = os.path.join(p, 'Contents', 'Home', 'bin') else: basedir = os.path.join(p, 'bin') os.makedirs(basedir) open(os.path.join(basedir, 'javac'), 'w').close() config = dict() config['java_paths'] = dict() fdroidserver.common._add_java_paths_to_config(pathlist, config) self.assertEqual(config['java_paths']['8'], choice[1:]) def test_is_debuggable_or_testOnly(self): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config # these are set debuggable testfiles = [] testfiles.append(os.path.join(self.basedir, 'urzip.apk')) testfiles.append(os.path.join(self.basedir, 'urzip-badsig.apk')) testfiles.append(os.path.join(self.basedir, 'urzip-badcert.apk')) for apkfile in testfiles: self.assertTrue( fdroidserver.common.is_debuggable_or_testOnly(apkfile), "debuggable APK state was not properly parsed!", ) # these are set NOT debuggable testfiles = [] testfiles.append(os.path.join(self.basedir, 'urzip-release.apk')) testfiles.append(os.path.join(self.basedir, 'urzip-release-unsigned.apk')) testfiles.append(os.path.join(self.basedir, 'v2.only.sig_2.apk')) for apkfile in testfiles: self.assertFalse( fdroidserver.common.is_debuggable_or_testOnly(apkfile), "debuggable APK state was not properly parsed!", ) VALID_STRICT_PACKAGE_NAMES = [ "An.stop", "SpeedoMeterApp.main", "a2dp.Vol", "au.com.darkside.XServer", "click.dummer.UartSmartwatch", "com.Bisha.TI89EmuDonation", "com.MarcosDiez.shareviahttp", "com.Pau.ImapNotes2", "com.app.Zensuren", "com.darshancomputing.BatteryIndicator", "com.geecko.QuickLyric", "com.genonbeta.TrebleShot", "com.gpl.rpg.AndorsTrail", "com.hobbyone.HashDroid", "com.moez.QKSMS", "com.platypus.SAnd", "com.prhlt.aemus.Read4SpeechExperiments", "de.syss.MifareClassicTool", "org.fdroid.fdroid", "org.f_droid.fdr0ID", ] def test_is_valid_package_name(self): for name in self.VALID_STRICT_PACKAGE_NAMES + [ "_SpeedoMeterApp.main", "05041684efd9b16c2888b1eddbadd0359f655f311b89bdd1737f560a10d20fb8", ]: self.assertTrue( fdroidserver.common.is_valid_package_name(name), "{0} should be a valid package name".format(name), ) for name in [ "0rg.fdroid.fdroid", ".f_droid.fdr0ID", "trailingdot.", "org.fdroid/fdroid", "/org.fdroid.fdroid", ]: self.assertFalse( fdroidserver.common.is_valid_package_name(name), "{0} should not be a valid package name".format(name), ) def test_is_strict_application_id(self): """see also tests/valid-package-names/""" for name in self.VALID_STRICT_PACKAGE_NAMES: self.assertTrue( fdroidserver.common.is_strict_application_id(name), "{0} should be a strict application id".format(name), ) for name in [ "0rg.fdroid.fdroid", ".f_droid.fdr0ID", "oneword", "trailingdot.", "cafebabe", "org.fdroid/fdroid", "/org.fdroid.fdroid", "_SpeedoMeterApp.main", "05041684efd9b16c2888b1eddbadd0359f655f311b89bdd1737f560a10d20fb8", ]: self.assertFalse( fdroidserver.common.is_strict_application_id(name), "{0} should not be a strict application id".format(name), ) def test_prepare_sources(self): testint = 99999999 teststr = 'FAKE_STR_FOR_TESTING' shutil.copytree( os.path.join(self.basedir, 'source-files'), os.path.join(self.tmpdir, 'source-files'), ) fdroidclient_testdir = os.path.join( self.tmpdir, 'source-files', 'fdroid', 'fdroidclient' ) config = dict() config['sdk_path'] = os.getenv('ANDROID_HOME') config['ndk_paths'] = {'r10d': os.getenv('ANDROID_NDK_HOME')} fdroidserver.common.config = config app = fdroidserver.metadata.App() app.id = 'org.fdroid.froid' build = fdroidserver.metadata.Build() build.commit = 'master' build.forceversion = True build.forcevercode = True build.gradle = ['yes'] build.target = 'android-' + str(testint) build.versionName = teststr build.versionCode = testint class FakeVcs: # no need to change to the correct commit here def gotorevision(self, rev, refresh=True): pass # no srclib info needed, but it could be added... def getsrclib(self): return None def deinitsubmodules(self): pass fdroidserver.common.prepare_source(FakeVcs(), app, build, fdroidclient_testdir, fdroidclient_testdir, fdroidclient_testdir) fdroidclient_testdir = Path(fdroidclient_testdir) build_gradle = fdroidclient_testdir / 'build.gradle' filedata = build_gradle.read_text(encoding='utf-8') self.assertIsNotNone( re.search(r"\s+compileSdkVersion %s\s+" % testint, filedata) ) androidmanifest_xml = fdroidclient_testdir / 'AndroidManifest.xml' filedata = androidmanifest_xml.read_text(encoding='utf-8') self.assertIsNone(re.search('android:debuggable', filedata)) self.assertIsNotNone( re.search('android:versionName="%s"' % build.versionName, filedata) ) self.assertIsNotNone( re.search('android:versionCode="%s"' % build.versionCode, filedata) ) @unittest.skipIf(os.name == 'nt', "`fdroid build` assumes POSIX scripting") def test_prepare_sources_with_prebuild_subdir(self): app_build_dir = os.path.join(self.testdir, 'build', 'com.example') shutil.copytree( os.path.join(self.basedir, 'source-files', 'fdroid', 'fdroidclient'), app_build_dir, ) subdir = 'baz/bar' subdir_path = Path(app_build_dir) / subdir subdir_path.mkdir(parents=True, exist_ok=True) build_gradle = subdir_path / 'build.gradle' build_gradle.write_text('// just a test placeholder', encoding='utf-8') config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config _mock_common_module_options_instance() srclibname = 'FakeSrcLib' srclib_testdir = os.path.join(self.testdir, 'build', 'srclib') os.makedirs(os.path.join(srclib_testdir, srclibname, 'testdirshouldexist')) fdroidserver.metadata.srclibs = { srclibname: { 'RepoType': 'git', 'Repo': 'https://example.com/foo/fakesrclib', 'Subdir': None, 'Prepare': None, } } app = fdroidserver.metadata.App() app.id = 'app.has.srclibs' build = fdroidserver.metadata.Build() build.commit = 'master' build.gradle = ['yes'] build.prebuild = ['test -d $$FakeSrcLib$$/testdirshouldexist'] # actual test condition build.srclibs = [srclibname + '@1.2.3'] build.subdir = subdir build.versionCode = 0xCAFE build.versionName = 'vCAFE' class FakeVcs: # no need to change to the correct commit here def gotorevision(self, rev, refresh=True): pass # no srclib info needed, but it could be added... def getsrclib(self): return None def deinitsubmodules(self): pass fdroidserver.common.prepare_source(FakeVcs(), app, build, app_build_dir, srclib_testdir, app_build_dir, onserver=True, refresh=False) # do not clone in this test def test_prepare_sources_refresh(self): _mock_common_module_options_instance() packageName = 'org.fdroid.ci.test.app' os.chdir(self.tmpdir) os.mkdir('build') os.mkdir('metadata') # use a local copy if available to avoid hitting the network tmprepo = os.path.join(self.basedir, 'tmp', 'importer') if os.path.exists(tmprepo): git_url = tmprepo else: git_url = 'https://gitlab.com/fdroid/ci-test-app.git' metadata = dict() metadata['Description'] = 'This is just a test app' metadata['RepoType'] = 'git' metadata['Repo'] = git_url with open(os.path.join('metadata', packageName + '.yml'), 'w') as fp: yaml.dump(metadata, fp) gitrepo = os.path.join(self.tmpdir, 'build', packageName) vcs0 = fdroidserver.common.getvcs('git', git_url, gitrepo) vcs0.gotorevision('0.3', refresh=True) vcs1 = fdroidserver.common.getvcs('git', git_url, gitrepo) vcs1.gotorevision('0.3', refresh=False) def test_setup_vcs_srclib(self): app = fdroidserver.metadata.App( { 'RepoType': 'srclib', 'Repo': 'TransportsRennes', } ) srclib = { 'RepoType': 'git', 'Repo': 'https://github.com/ybonnel/TransportsRennes', } fdroidserver.metadata.srclibs = {'TransportsRennes': srclib} vcs, build_dir = fdroidserver.common.setup_vcs(app) self.assertIsNotNone(vcs) self.assertEqual(build_dir, Path('build/srclib/TransportsRennes')) def test_getvcs_srclib(self): vcstype = 'srclib' remote = 'TransportsRennes' local = 'build/srclib/' + remote fdroidserver.metadata.srclibs = { remote: { 'RepoType': 'git', 'Repo': 'https://github.com/ybonnel/TransportsRennes', } } self.assertIsNotNone(fdroidserver.common.getvcs(vcstype, remote, local)) self.assertIsNotNone(fdroidserver.common.getvcs(vcstype, Path(remote), local)) self.assertIsNotNone(fdroidserver.common.getvcs(vcstype, remote, Path(local))) self.assertIsNotNone(fdroidserver.common.getvcs( vcstype, Path(remote), Path(local) )) with self.assertRaises(VCSException): fdroidserver.common.getvcs(vcstype, remote, 'bad') with self.assertRaises(VCSException): fdroidserver.common.getvcs(vcstype, remote, Path('bad')) with self.assertRaises(VCSException): fdroidserver.common.getvcs(vcstype, Path(remote), 'bad') with self.assertRaises(VCSException): fdroidserver.common.getvcs(vcstype, Path(remote), Path('bad')) def test_fdroid_popen_stderr_redirect(self): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config _mock_common_module_options_instance() commands = ['sh', '-c', 'echo stdout message && echo stderr message 1>&2'] p = fdroidserver.common.FDroidPopen(commands) self.assertEqual(p.output, 'stdout message\nstderr message\n') p = fdroidserver.common.FDroidPopen(commands, stderr_to_stdout=False) self.assertEqual(p.output, 'stdout message\n') def test_signjar(self): _mock_common_module_options_instance() config = fdroidserver.common.read_config() config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') fdroidserver.common.config = config fdroidserver.signindex.config = config sourcedir = os.path.join(self.basedir, 'signindex') with tempfile.TemporaryDirectory( prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir ) as testsdir: for f in ('testy.jar', 'guardianproject.jar'): sourcefile = os.path.join(sourcedir, f) testfile = os.path.join(testsdir, f) shutil.copy(sourcefile, testsdir) fdroidserver.signindex.sign_jar(testfile, use_old_algs=True) # these should be resigned, and therefore different self.assertNotEqual( open(sourcefile, 'rb').read(), open(testfile, 'rb').read() ) def test_verify_apk_signature(self): _mock_common_module_options_instance() config = fdroidserver.common.read_config() fdroidserver.common.config = config self.assertTrue(fdroidserver.common.verify_apk_signature('bad-unicode-πÇÇ现代通用字-български-عربي1.apk')) if 'apksigner' in fdroidserver.common.config: # apksigner considers MD5 signatures valid self.assertTrue(fdroidserver.common.verify_apk_signature('org.bitbucket.tickytacky.mirrormirror_1.apk')) self.assertTrue(fdroidserver.common.verify_apk_signature('org.bitbucket.tickytacky.mirrormirror_2.apk')) self.assertTrue(fdroidserver.common.verify_apk_signature('org.bitbucket.tickytacky.mirrormirror_3.apk')) self.assertTrue(fdroidserver.common.verify_apk_signature('org.bitbucket.tickytacky.mirrormirror_4.apk')) else: self.assertFalse(fdroidserver.common.verify_apk_signature('org.bitbucket.tickytacky.mirrormirror_1.apk')) self.assertFalse(fdroidserver.common.verify_apk_signature('org.bitbucket.tickytacky.mirrormirror_2.apk')) self.assertFalse(fdroidserver.common.verify_apk_signature('org.bitbucket.tickytacky.mirrormirror_3.apk')) self.assertFalse(fdroidserver.common.verify_apk_signature('org.bitbucket.tickytacky.mirrormirror_4.apk')) self.assertTrue(fdroidserver.common.verify_apk_signature('org.dyndns.fules.ck_20.apk')) self.assertTrue(fdroidserver.common.verify_apk_signature('urzip.apk')) self.assertFalse(fdroidserver.common.verify_apk_signature('urzip-badcert.apk')) self.assertFalse(fdroidserver.common.verify_apk_signature('urzip-badsig.apk')) self.assertTrue(fdroidserver.common.verify_apk_signature('urzip-release.apk')) self.assertFalse(fdroidserver.common.verify_apk_signature('urzip-release-unsigned.apk')) def test_verify_old_apk_signature(self): _mock_common_module_options_instance() config = fdroidserver.common.read_config() config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') fdroidserver.common.config = config try: fdroidserver.common.verify_deprecated_jar_signature('bad-unicode-πÇÇ现代通用字-български-عربي1.apk') fdroidserver.common.verify_deprecated_jar_signature('org.bitbucket.tickytacky.mirrormirror_1.apk') fdroidserver.common.verify_deprecated_jar_signature('org.bitbucket.tickytacky.mirrormirror_2.apk') fdroidserver.common.verify_deprecated_jar_signature('org.bitbucket.tickytacky.mirrormirror_3.apk') fdroidserver.common.verify_deprecated_jar_signature('org.bitbucket.tickytacky.mirrormirror_4.apk') fdroidserver.common.verify_deprecated_jar_signature('org.dyndns.fules.ck_20.apk') fdroidserver.common.verify_deprecated_jar_signature('urzip.apk') fdroidserver.common.verify_deprecated_jar_signature('urzip-release.apk') except VerificationException: self.fail("failed to jarsigner failed to verify an old apk") self.assertRaises(VerificationException, fdroidserver.common.verify_deprecated_jar_signature, 'urzip-badcert.apk') self.assertRaises(VerificationException, fdroidserver.common.verify_deprecated_jar_signature, 'urzip-badsig.apk') self.assertRaises(VerificationException, fdroidserver.common.verify_deprecated_jar_signature, 'urzip-release-unsigned.apk') def test_verify_jar_signature(self): """Sign entry.jar and make sure it validates""" config = fdroidserver.common.read_config() config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') config['keystore'] = os.path.join(self.basedir, 'keystore.jks') config['repo_keyalias'] = 'sova' config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' fdroidserver.common.config = config fdroidserver.signindex.config = config repo_dir = Path(self.testdir) / 'repo' repo_dir.mkdir() shutil.copy('repo/entry.json', repo_dir) shutil.copy('repo/index-v2.json', repo_dir) os.chdir(self.testdir) fdroidserver.signindex.sign_index('repo', 'entry.json') fdroidserver.common.verify_jar_signature('repo/entry.jar') def test_verify_jar_signature_fails(self): """Test verify_jar_signature fails on unsigned and deprecated algorithms""" config = fdroidserver.common.read_config() config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') fdroidserver.common.config = config source_dir = os.path.join(self.basedir, 'signindex') for f in ('unsigned.jar', 'testy.jar', 'guardianproject.jar', 'guardianproject-v1.jar'): testfile = os.path.join(source_dir, f) with self.assertRaises(fdroidserver.index.VerificationException): fdroidserver.common.verify_jar_signature(testfile) def test_verify_deprecated_jar_signature(self): config = fdroidserver.common.read_config() config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') fdroidserver.common.config = config source_dir = os.path.join(self.basedir, 'signindex') for f in ('testy.jar', 'guardianproject.jar'): testfile = os.path.join(source_dir, f) fdroidserver.common.verify_deprecated_jar_signature(testfile) testfile = os.path.join(source_dir, 'unsigned.jar') with self.assertRaises(fdroidserver.index.VerificationException): fdroidserver.common.verify_deprecated_jar_signature(testfile) def test_verify_apks(self): config = fdroidserver.common.read_config() fdroidserver.common.config = config _mock_common_module_options_instance() sourceapk = os.path.join(self.basedir, 'urzip.apk') copyapk = os.path.join(self.testdir, 'urzip-copy.apk') shutil.copy(sourceapk, copyapk) self.assertTrue(fdroidserver.common.verify_apk_signature(copyapk)) self.assertIsNone( fdroidserver.common.verify_apks(sourceapk, copyapk, self.tmpdir) ) unsignedapk = os.path.join(self.testdir, 'urzip-unsigned.apk') with ZipFile(sourceapk, 'r') as apk: with ZipFile(unsignedapk, 'w') as testapk: for info in apk.infolist(): if not info.filename.startswith('META-INF/'): testapk.writestr(info, apk.read(info.filename)) self.assertIsNone( fdroidserver.common.verify_apks(sourceapk, unsignedapk, self.tmpdir) ) twosigapk = os.path.join(self.testdir, 'urzip-twosig.apk') otherapk = ZipFile(os.path.join(self.basedir, 'urzip-release.apk'), 'r') with ZipFile(sourceapk, 'r') as apk: with ZipFile(twosigapk, 'w') as testapk: for info in apk.infolist(): testapk.writestr(info, apk.read(info.filename)) if info.filename.startswith('META-INF/'): testapk.writestr(info.filename, otherapk.read(info.filename)) otherapk.close() self.assertFalse(fdroidserver.common.verify_apk_signature(twosigapk)) self.assertIsNone(fdroidserver.common.verify_apks(sourceapk, twosigapk, self.tmpdir)) def test_get_certificate_with_chain_sandisk(self): """Test that APK signatures with a cert chain are parsed like apksigner. SanDisk signs their APKs with a X.509 certificate chain of trust, so there are actually three certificates included. apksigner only cares about the certificate in the chain that actually signs the manifest. The correct value comes from: apksigner verify --print-certs 883cbdae7aeb2e4b122e8ee8d89966c7062d0d49107a130235fa220a5b994a79.apk """ cert = fdroidserver.common.get_certificate( signature_block_file=Path('SANAPPSI.RSA').read_bytes(), signature_file=Path('SANAPPSI.SF').read_bytes(), ) self.assertEqual( 'ea0abbf2a142e4b167405d516b2cc408c4af4b29cd50ba281aa4470d4aab3e53', fdroidserver.common.signer_fingerprint(cert), ) def test_write_to_config(self): with tempfile.TemporaryDirectory() as tmpPath: cfgPath = os.path.join(tmpPath, 'config.py') with open(cfgPath, 'w') as f: f.write( textwrap.dedent( """\ # abc # test = 'example value' default_me= '%%%' # comment do_not_touch = "good value" default_me="!!!" key="123" # inline""" ) ) cfg = {'key': '111', 'default_me_orig': 'orig'} fdroidserver.common.write_to_config(cfg, 'key', config_file=cfgPath) fdroidserver.common.write_to_config(cfg, 'default_me', config_file=cfgPath) fdroidserver.common.write_to_config(cfg, 'test', value='test value', config_file=cfgPath) fdroidserver.common.write_to_config(cfg, 'new_key', value='new', config_file=cfgPath) with open(cfgPath, 'r') as f: self.assertEqual( f.read(), textwrap.dedent( """\ # abc test = 'test value' default_me = 'orig' # comment do_not_touch = "good value" key = "111" # inline new_key = "new" """ ), ) def test_write_to_config_when_empty(self): with tempfile.TemporaryDirectory() as tmpPath: cfgPath = os.path.join(tmpPath, 'config.py') with open(cfgPath, 'w') as f: pass fdroidserver.common.write_to_config({}, 'key', 'val', cfgPath) with open(cfgPath, 'r') as f: self.assertEqual( f.read(), textwrap.dedent( """\ key = "val" """ ), ) def test_apk_name_regex(self): good = [ 'urzipπÇÇπÇÇ现代汉语通用字българскиعربي1234ö_-123456.apk', 'urzipπÇÇπÇÇ现代汉语通用字българскиعربي1234ö_123456_abcdef0.apk', 'urzip_-123456.apk', 'a0_0.apk', 'Z0_0.apk', 'a0_0_abcdef0.apk', 'a_a_a_a_0_abcdef0.apk', 'a_____0.apk', 'a_____123456_abcdef0.apk', 'org.fdroid.fdroid_123456.apk', # valid, but "_99999" is part of packageName rather than versionCode 'org.fdroid.fdroid_99999_123456.apk', # should be valid, but I can't figure out the regex since \w includes digits # 'πÇÇπÇÇ现代汉语通用字българскиعربي1234ö_0_123bafd.apk', ] for name in good: m = fdroidserver.common.APK_NAME_REGEX.match(name) self.assertIsNotNone(m) self.assertIn(m.group(2), ('-123456', '0', '123456')) self.assertIn(m.group(3), ('abcdef0', None)) bad = [ 'urzipπÇÇπÇÇ现代汉语通用字българскиعربي1234ö_123456_abcdefg.apk', 'urzip-_-198274.apk', 'urzip-_0_123bafd.apk', 'no spaces allowed_123.apk', '0_0.apk', '0_0_abcdef0.apk', ] for name in bad: self.assertIsNone(fdroidserver.common.APK_NAME_REGEX.match(name)) def test_standard_file_name_regex(self): good = [ 'urzipπÇÇπÇÇ现代汉语通用字българскиعربي1234ö_-123456.mp3', 'urzipπÇÇπÇÇ现代汉语通用字българскиعربي1234ö_123456.mov', 'Document_-123456.pdf', 'WTF_0.MOV', 'Z0_0.ebk', 'a_a_a_a_0.txt', 'org.fdroid.fdroid.privileged.ota_123456.zip', 'πÇÇπÇÇ现代汉语通用字българскиعربي1234ö_0.jpeg', 'a_____0.PNG', # valid, but "_99999" is part of packageName rather than versionCode 'a_____99999_123456.zip', 'org.fdroid.fdroid_99999_123456.zip', ] for name in good: m = fdroidserver.common.STANDARD_FILE_NAME_REGEX.match(name) self.assertIsNotNone(m) self.assertIn(m.group(2), ('-123456', '0', '123456')) bad = [ 'urzipπÇÇπÇÇ现代汉语通用字българскиعربي1234ö_abcdefg.JPEG', 'urzip-_-198274.zip', 'urzip-_123bafd.pdf', 'no spaces allowed_123.foobar', 'a_____0.', ] for name in bad: self.assertIsNone(fdroidserver.common.STANDARD_FILE_NAME_REGEX.match(name)) def test_apk_signer_fingerprint(self): # fingerprints fetched with: keytool -printcert -file ____.RSA testapks = (('repo/obb.main.oldversion_1444412523.apk', '818e469465f96b704e27be2fee4c63ab9f83ddf30e7a34c7371a4728d83b0bc1'), ('repo/obb.main.twoversions_1101613.apk', '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6'), ('repo/obb.main.twoversions_1101617.apk', '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6')) for apkfile, keytoolcertfingerprint in testapks: self.assertEqual(keytoolcertfingerprint, fdroidserver.common.apk_signer_fingerprint(apkfile)) def test_apk_signer_fingerprint_short(self): # fingerprints fetched with: keytool -printcert -file ____.RSA testapks = (('repo/obb.main.oldversion_1444412523.apk', '818e469'), ('repo/obb.main.twoversions_1101613.apk', '32a2362'), ('repo/obb.main.twoversions_1101617.apk', '32a2362')) for apkfile, keytoolcertfingerprint in testapks: self.assertEqual(keytoolcertfingerprint, fdroidserver.common.apk_signer_fingerprint_short(apkfile)) def test_find_apksigner_system_package_default_path(self): """apksigner should be automatically used from the PATH""" usr_bin_apksigner = '/usr/bin/apksigner' if not os.path.isfile(usr_bin_apksigner): self.skipTest('SKIPPING since %s is not installed!' % usr_bin_apksigner) with mock.patch.dict(os.environ, clear=True): os.environ['PATH'] = '/usr/local/bin:/usr/bin:/bin' config = {} fdroidserver.common.find_apksigner(config) self.assertEqual(usr_bin_apksigner, config.get('apksigner')) def test_find_apksigner_config_overrides(self): """apksigner should come from config before any auto-detection""" os.chdir(self.tmpdir) android_home = os.path.join(self.tmpdir, 'ANDROID_HOME') do_not_use = os.path.join(android_home, 'build-tools', '30.0.3', 'apksigner') os.makedirs(os.path.dirname(do_not_use)) with open(do_not_use, 'w') as fp: fp.write('#!/bin/sh\ndate\n') os.chmod(do_not_use, 0o0755) apksigner = os.path.join(self.tmpdir, 'apksigner') config = {'apksigner': apksigner} with mock.patch.dict(os.environ, clear=True): os.environ['ANDROID_HOME'] = android_home os.environ['PATH'] = '%s:/usr/local/bin:/usr/bin:/bin' % android_home fdroidserver.common.find_apksigner(config) self.assertEqual(apksigner, config.get('apksigner')) def test_find_apksigner_prefer_path(self): """apksigner should come from PATH before ANDROID_HOME""" os.chdir(self.tmpdir) apksigner = os.path.join(self.tmpdir, 'apksigner') with open(apksigner, 'w') as fp: fp.write('#!/bin/sh\ndate\n') os.chmod(apksigner, 0o0755) android_home = os.path.join(self.tmpdir, 'ANDROID_HOME') do_not_use = os.path.join(android_home, 'build-tools', '30.0.3', 'apksigner') os.makedirs(os.path.dirname(do_not_use)) with open(do_not_use, 'w') as fp: fp.write('#!/bin/sh\ndate\n') os.chmod(do_not_use, 0o0755) config = {'sdk_path': android_home} with mock.patch.dict(os.environ, clear=True): os.environ['ANDROID_HOME'] = android_home os.environ['PATH'] = '%s:/usr/local/bin:/usr/bin:/bin' % os.path.dirname(apksigner) fdroidserver.common.find_apksigner(config) self.assertEqual(apksigner, config.get('apksigner')) def test_find_apksigner_prefer_newest(self): """apksigner should be the newest available in ANDROID_HOME""" os.chdir(self.tmpdir) android_home = os.path.join(self.tmpdir, 'ANDROID_HOME') apksigner = os.path.join(android_home, 'build-tools', '30.0.3', 'apksigner') os.makedirs(os.path.dirname(apksigner)) with open(apksigner, 'w') as fp: fp.write('#!/bin/sh\necho 30.0.3\n') os.chmod(apksigner, 0o0755) do_not_use = os.path.join(android_home, 'build-tools', '29.0.3', 'apksigner') os.makedirs(os.path.dirname(do_not_use)) with open(do_not_use, 'w') as fp: fp.write('#!/bin/sh\necho 29.0.3\n') os.chmod(do_not_use, 0o0755) config = {'sdk_path': android_home} with mock.patch.dict(os.environ, clear=True): os.environ['PATH'] = '/fake/path/to/avoid/conflicts' fdroidserver.common.find_apksigner(config) self.assertEqual(apksigner, config.get('apksigner')) def test_find_apksigner_system_package_android_home(self): """Test that apksigner v30 or newer is found""" os.chdir(self.tmpdir) android_home = os.getenv('ANDROID_HOME') if not android_home or not os.path.isdir(android_home): self.skipTest('SKIPPING since ANDROID_HOME (%s) is not a dir!' % android_home) build_tools = glob.glob(os.path.join(android_home, 'build-tools', '*', 'apksigner')) if not build_tools: self.skipTest('SKIPPING since ANDROID_HOME (%s) build-tools has no apksigner!' % android_home) min_version = fdroidserver.common.MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION version = '0' for bt in sorted(build_tools): v = bt.split('/')[-2] if v == 'debian': continue if LooseVersion(version) < LooseVersion(v): version = v if LooseVersion(version) < LooseVersion(min_version): self.skipTest('SKIPPING since build-tools %s or higher is required!' % min_version) fdroidserver.common.config = {'sdk_path': android_home} with mock.patch.dict(os.environ, clear=True): os.environ['PATH'] = '/fake/path/to/avoid/conflicts' config = fdroidserver.common.read_config() fdroidserver.common.find_apksigner(config) self.assertEqual( os.path.join(android_home, 'build-tools'), os.path.dirname(os.path.dirname(config.get('apksigner'))), ) def test_sign_apk(self): _mock_common_module_options_instance() config = fdroidserver.common.read_config() if 'apksigner' not in config: self.skipTest('SKIPPING test_sign_apk, apksigner not installed!') config['keyalias'] = 'sova' config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' config['keystore'] = os.path.join(self.basedir, 'keystore.jks') fdroidserver.common.config = config fdroidserver.signindex.config = config unsigned = os.path.join(self.testdir, 'urzip-release-unsigned.apk') signed = os.path.join(self.testdir, 'urzip-release.apk') shutil.copy(os.path.join(self.basedir, 'urzip-release-unsigned.apk'), self.testdir) self.assertFalse(fdroidserver.common.verify_apk_signature(unsigned)) fdroidserver.common.sign_apk(unsigned, signed, config['keyalias']) self.assertTrue(os.path.isfile(signed)) self.assertFalse(os.path.isfile(unsigned)) self.assertTrue(fdroidserver.common.verify_apk_signature(signed)) # now sign an APK with minSdkVersion >= 18 unsigned = os.path.join(self.testdir, 'duplicate.permisssions_9999999-unsigned.apk') signed = os.path.join(self.testdir, 'duplicate.permisssions_9999999.apk') shutil.copy( os.path.join(self.basedir, 'repo', 'duplicate.permisssions_9999999.apk'), os.path.join(unsigned), ) fdroidserver.common.apk_strip_v1_signatures(unsigned, strip_manifest=True) fdroidserver.common.sign_apk(unsigned, signed, config['keyalias']) self.assertTrue(os.path.isfile(signed)) self.assertFalse(os.path.isfile(unsigned)) self.assertTrue(fdroidserver.common.verify_apk_signature(signed)) self.assertEqual('18', fdroidserver.common.get_androguard_APK(signed).get_min_sdk_version()) shutil.copy(os.path.join(self.basedir, 'minimal_targetsdk_30_unsigned.apk'), self.testdir) unsigned = os.path.join(self.testdir, 'minimal_targetsdk_30_unsigned.apk') signed = os.path.join(self.testdir, 'minimal_targetsdk_30.apk') self.assertFalse(fdroidserver.common.verify_apk_signature(unsigned)) fdroidserver.common.sign_apk(unsigned, signed, config['keyalias']) self.assertTrue(os.path.isfile(signed)) self.assertFalse(os.path.isfile(unsigned)) self.assertTrue(fdroidserver.common.verify_apk_signature(signed)) # verify it has a v2 signature self.assertTrue(fdroidserver.common.get_androguard_APK(signed).is_signed_v2()) shutil.copy(os.path.join(self.basedir, 'no_targetsdk_minsdk30_unsigned.apk'), self.testdir) unsigned = os.path.join(self.testdir, 'no_targetsdk_minsdk30_unsigned.apk') signed = os.path.join(self.testdir, 'no_targetsdk_minsdk30_signed.apk') fdroidserver.common.sign_apk(unsigned, signed, config['keyalias']) self.assertTrue(fdroidserver.common.verify_apk_signature(signed)) self.assertTrue(fdroidserver.common.get_androguard_APK(signed).is_signed_v2()) shutil.copy(os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk'), self.testdir) unsigned = os.path.join(self.testdir, 'no_targetsdk_minsdk1_unsigned.apk') signed = os.path.join(self.testdir, 'no_targetsdk_minsdk1_signed.apk') self.assertFalse(fdroidserver.common.verify_apk_signature(unsigned)) fdroidserver.common.sign_apk(unsigned, signed, config['keyalias']) self.assertTrue(os.path.isfile(signed)) self.assertFalse(os.path.isfile(unsigned)) self.assertTrue(fdroidserver.common.verify_apk_signature(signed)) @unittest.skipIf(os.getuid() == 0, 'This is meaningless when run as root') def test_sign_apk_fail(self): _mock_common_module_options_instance() config = fdroidserver.common.read_config() if 'apksigner' not in config: self.skipTest('SKIPPING test_sign_apk_fail, apksigner not installed!') config['keyalias'] = 'sova' config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' config['keystore'] = os.path.join(self.basedir, 'keystore.jks') fdroidserver.common.config = config fdroidserver.signindex.config = config unsigned = os.path.join(self.testdir, 'urzip-release-unsigned.apk') signed = os.path.join(self.testdir, 'urzip-release.apk') shutil.copy(os.path.join(self.basedir, 'urzip-release-unsigned.apk'), self.testdir) os.chmod(unsigned, 0o000) with self.assertRaises(fdroidserver.exception.BuildException): fdroidserver.common.sign_apk(unsigned, signed, config['keyalias']) os.chmod(unsigned, 0o777) self.assertTrue(os.path.isfile(unsigned)) self.assertFalse(os.path.isfile(signed)) def test_sign_apk_corrupt(self): _mock_common_module_options_instance() config = fdroidserver.common.read_config() if 'apksigner' not in config: self.skipTest('SKIPPING test_sign_apk_corrupt, apksigner not installed!') config['keyalias'] = 'sova' config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' config['keystore'] = os.path.join(self.basedir, 'keystore.jks') fdroidserver.common.config = config fdroidserver.signindex.config = config unsigned = os.path.join(self.testdir, 'urzip-release-unsigned.apk') signed = os.path.join(self.testdir, 'urzip-release.apk') with open(unsigned, 'w') as fp: fp.write('this is a corrupt APK') with self.assertRaises(fdroidserver.exception.BuildException): fdroidserver.common.sign_apk(unsigned, signed, config['keyalias']) self.assertTrue(os.path.isfile(unsigned)) self.assertFalse(os.path.isfile(signed)) @unittest.skipUnless( os.path.exists('tests/SystemWebView-repack.apk'), "file too big for sdist" ) def test_resign_apk(self): """When using apksigner, it should resign signed APKs""" _mock_common_module_options_instance() config = fdroidserver.common.read_config() if 'apksigner' not in config: self.skipTest('SKIPPING test_resign_apk, apksigner not installed!') config['keyalias'] = 'sova' config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' config['keystore'] = os.path.join(self.basedir, 'keystore.jks') fdroidserver.common.config = config fdroidserver.signindex.config = config os.chdir(self.tmpdir) os.mkdir('unsigned') os.mkdir('repo') for apk in ( 'org.bitbucket.tickytacky.mirrormirror_4.apk', 'v2.only.sig_2.apk', 'SystemWebView-repack.apk', ): original = os.path.join(self.basedir, apk) unsigned = os.path.join('unsigned', apk) resign = os.path.join('repo', apk) shutil.copy(original, unsigned) fdroidserver.common.sign_apk(unsigned, resign, config['keyalias']) self.assertTrue( fdroidserver.common.verify_apk_signature(resign), apk + " verifies" ) self.assertTrue(os.path.isfile(resign)) self.assertFalse(os.path.isfile(unsigned)) self.assertNotEqual( fdroidserver.common.get_first_signer_certificate(original), fdroidserver.common.get_first_signer_certificate(resign) ) def test_get_apk_id(self): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config self._set_build_tools() try: config['aapt'] = fdroidserver.common.find_sdk_tools_cmd('aapt') except fdroidserver.exception.FDroidException: pass # aapt is not required if androguard is present testcases = [ ('repo/obb.main.twoversions_1101613.apk', 'obb.main.twoversions', 1101613, '0.1'), ('org.bitbucket.tickytacky.mirrormirror_1.apk', 'org.bitbucket.tickytacky.mirrormirror', 1, '1.0'), ('org.bitbucket.tickytacky.mirrormirror_2.apk', 'org.bitbucket.tickytacky.mirrormirror', 2, '1.0.1'), ('org.bitbucket.tickytacky.mirrormirror_3.apk', 'org.bitbucket.tickytacky.mirrormirror', 3, '1.0.2'), ('org.bitbucket.tickytacky.mirrormirror_4.apk', 'org.bitbucket.tickytacky.mirrormirror', 4, '1.0.3'), ('org.dyndns.fules.ck_20.apk', 'org.dyndns.fules.ck', 20, 'v1.6pre2'), ('issue-1128-min-sdk-30-poc.apk', 'org.fdroid.ci', 1, '1.0'), ('issue-1128-poc1.apk', 'android.appsecurity.cts.tinyapp', 10, '1.0'), ('issue-1128-poc2.apk', 'android.appsecurity.cts.tinyapp', 10, '1.0'), ('issue-1128-poc3a.apk', 'android.appsecurity.cts.tinyapp', 10, '1.0'), ('issue-1128-poc3b.apk', 'android.appsecurity.cts.tinyapp', 10, '1.0'), ('urzip.apk', 'info.guardianproject.urzip', 100, '0.1'), ('urzip-badcert.apk', 'info.guardianproject.urzip', 100, '0.1'), ('urzip-badsig.apk', 'info.guardianproject.urzip', 100, '0.1'), ('urzip-release.apk', 'info.guardianproject.urzip', 100, '0.1'), ('urzip-release-unsigned.apk', 'info.guardianproject.urzip', 100, '0.1'), ('repo/com.politedroid_3.apk', 'com.politedroid', 3, '1.2'), ('repo/com.politedroid_4.apk', 'com.politedroid', 4, '1.3'), ('repo/com.politedroid_5.apk', 'com.politedroid', 5, '1.4'), ('repo/com.politedroid_6.apk', 'com.politedroid', 6, '1.5'), ('repo/duplicate.permisssions_9999999.apk', 'duplicate.permisssions', 9999999, ''), ('repo/info.zwanenburg.caffeinetile_4.apk', 'info.zwanenburg.caffeinetile', 4, '1.3'), ('repo/obb.main.oldversion_1444412523.apk', 'obb.main.oldversion', 1444412523, '0.1'), ('repo/obb.mainpatch.current_1619_another-release-key.apk', 'obb.mainpatch.current', 1619, '0.1'), ('repo/obb.mainpatch.current_1619.apk', 'obb.mainpatch.current', 1619, '0.1'), ('repo/obb.main.twoversions_1101613.apk', 'obb.main.twoversions', 1101613, '0.1'), ('repo/obb.main.twoversions_1101615.apk', 'obb.main.twoversions', 1101615, '0.1'), ('repo/obb.main.twoversions_1101617.apk', 'obb.main.twoversions', 1101617, '0.1'), ('repo/urzip-; Рахма́, [rɐxˈmanʲɪnəf] سيرجي_رخمانينوف 谢·.apk', 'info.guardianproject.urzip', 100, '0.1'), ] for apkfilename, appid, versionCode, versionName in testcases: a, vc, vn = fdroidserver.common.get_apk_id(apkfilename) self.assertEqual(appid, a, 'androguard appid parsing failed for ' + apkfilename) self.assertEqual(versionName, vn, 'androguard versionName parsing failed for ' + apkfilename) self.assertEqual(versionCode, vc, 'androguard versionCode parsing failed for ' + apkfilename) if 'aapt' in config: a, vc, vn = fdroidserver.common.get_apk_id_aapt(apkfilename) self.assertEqual(appid, a, 'aapt appid parsing failed for ' + apkfilename) self.assertEqual(versionCode, vc, 'aapt versionCode parsing failed for ' + apkfilename) self.assertEqual(versionName, vn, 'aapt versionName parsing failed for ' + apkfilename) def test_get_apk_id_bad_apk(self): """get_apk_id should never return None on error, only raise exceptions""" with self.assertRaises(KeyError): fdroidserver.common.get_apk_id('Norway_bouvet_europe_2.obf.zip') shutil.copy('Norway_bouvet_europe_2.obf.zip', self.tmpdir) os.chdir(self.tmpdir) with ZipFile('Norway_bouvet_europe_2.obf.zip', 'a') as zipfp: zipfp.writestr('AndroidManifest.xml', 'not a manifest') with self.assertRaises(KeyError): fdroidserver.common.get_apk_id('Norway_bouvet_europe_2.obf.zip') def test_get_apk_id_bad_path(self): with self.assertRaises(FDroidException): fdroidserver.common.get_apk_id('nope') def test_get_apk_id_api_call(self): self.assertEqual( ('info.guardianproject.urzip', 100, '0.1'), fdroidserver.common.get_apk_id('urzip.apk'), ) def test_get_apk_id_bad_zip(self): os.chdir(self.tmpdir) badzip = 'badzip.apk' with open(badzip, 'w') as fp: fp.write('not a ZIP') with self.assertRaises(BadZipFile): fdroidserver.common.get_apk_id(badzip) def test_get_apk_id_aapt_regex(self): files = glob.glob(os.path.join(self.basedir, 'build-tools', '[1-9]*.*', '*.txt')) self.assertNotEqual(0, len(files)) for f in files: appid, versionCode = os.path.splitext(os.path.basename(f))[0][12:].split('_') with open(f, encoding='utf-8') as fp: m = fdroidserver.common.APK_ID_TRIPLET_REGEX.match(fp.read()) if m: self.assertEqual(appid, m.group(1)) self.assertEqual(versionCode, m.group(2)) else: self.fail('could not parse aapt output: {}'.format(f)) def test_get_native_code(self): testcases = [ ('repo/obb.main.twoversions_1101613.apk', []), ('org.bitbucket.tickytacky.mirrormirror_1.apk', []), ('org.bitbucket.tickytacky.mirrormirror_2.apk', []), ('org.bitbucket.tickytacky.mirrormirror_3.apk', []), ('org.bitbucket.tickytacky.mirrormirror_4.apk', []), ('org.dyndns.fules.ck_20.apk', ['arm64-v8a', 'armeabi', 'armeabi-v7a', 'mips', 'mips64', 'x86', 'x86_64']), ('urzip.apk', []), ('urzip-badcert.apk', []), ('urzip-badsig.apk', []), ('urzip-release.apk', []), ('urzip-release-unsigned.apk', []), ('repo/com.politedroid_3.apk', []), ('repo/com.politedroid_4.apk', []), ('repo/com.politedroid_5.apk', []), ('repo/com.politedroid_6.apk', []), ('repo/duplicate.permisssions_9999999.apk', []), ('repo/info.zwanenburg.caffeinetile_4.apk', []), ('repo/obb.main.oldversion_1444412523.apk', []), ('repo/obb.mainpatch.current_1619_another-release-key.apk', []), ('repo/obb.mainpatch.current_1619.apk', []), ('repo/obb.main.twoversions_1101613.apk', []), ('repo/obb.main.twoversions_1101615.apk', []), ('repo/obb.main.twoversions_1101617.apk', []), ('repo/urzip-; Рахма́, [rɐxˈmanʲɪnəf] سيرجي_رخمانينوف 谢·.apk', []), ] for apkfilename, native_code in testcases: nc = fdroidserver.common.get_native_code(apkfilename) self.assertEqual(native_code, nc) def test_get_sdkversions_androguard(self): """This is a sanity test that androguard isn't broken""" def get_minSdkVersion(apkfile): apk = fdroidserver.common.get_androguard_APK(apkfile) return fdroidserver.common.get_min_sdk_version(apk) def get_targetSdkVersion(apkfile): apk = fdroidserver.common.get_androguard_APK(apkfile) return apk.get_effective_target_sdk_version() self.assertEqual(4, get_minSdkVersion('bad-unicode-πÇÇ现代通用字-български-عربي1.apk')) self.assertEqual(30, get_minSdkVersion('issue-1128-min-sdk-30-poc.apk')) self.assertEqual(29, get_minSdkVersion('issue-1128-poc1.apk')) self.assertEqual(29, get_minSdkVersion('issue-1128-poc2.apk')) self.assertEqual(23, get_minSdkVersion('issue-1128-poc3a.apk')) self.assertEqual(23, get_minSdkVersion('issue-1128-poc3b.apk')) self.assertEqual(14, get_minSdkVersion('org.bitbucket.tickytacky.mirrormirror_1.apk')) self.assertEqual(14, get_minSdkVersion('org.bitbucket.tickytacky.mirrormirror_2.apk')) self.assertEqual(14, get_minSdkVersion('org.bitbucket.tickytacky.mirrormirror_3.apk')) self.assertEqual(14, get_minSdkVersion('org.bitbucket.tickytacky.mirrormirror_4.apk')) self.assertEqual(7, get_minSdkVersion('org.dyndns.fules.ck_20.apk')) self.assertEqual(4, get_minSdkVersion('urzip.apk')) self.assertEqual(4, get_minSdkVersion('urzip-badcert.apk')) self.assertEqual(4, get_minSdkVersion('urzip-badsig.apk')) self.assertEqual(4, get_minSdkVersion('urzip-release.apk')) self.assertEqual(4, get_minSdkVersion('urzip-release-unsigned.apk')) self.assertEqual(27, get_minSdkVersion('v2.only.sig_2.apk')) self.assertEqual(3, get_minSdkVersion('repo/com.politedroid_3.apk')) self.assertEqual(3, get_minSdkVersion('repo/com.politedroid_4.apk')) self.assertEqual(3, get_minSdkVersion('repo/com.politedroid_5.apk')) self.assertEqual(14, get_minSdkVersion('repo/com.politedroid_6.apk')) self.assertEqual(4, get_minSdkVersion('repo/obb.main.oldversion_1444412523.apk')) self.assertEqual(4, get_minSdkVersion('repo/obb.mainpatch.current_1619_another-release-key.apk')) self.assertEqual(4, get_minSdkVersion('repo/obb.mainpatch.current_1619.apk')) self.assertEqual(4, get_minSdkVersion('repo/obb.main.twoversions_1101613.apk')) self.assertEqual(4, get_minSdkVersion('repo/obb.main.twoversions_1101615.apk')) self.assertEqual(4, get_minSdkVersion('repo/obb.main.twoversions_1101617.apk')) self.assertEqual(4, get_minSdkVersion('repo/urzip-; Рахма́, [rɐxˈmanʲɪnəf] سيرجي_رخمانينوف 谢·.apk')) self.assertEqual(30, get_targetSdkVersion('minimal_targetsdk_30_unsigned.apk')) self.assertEqual(1, get_targetSdkVersion('no_targetsdk_minsdk1_unsigned.apk')) self.assertEqual(30, get_targetSdkVersion('no_targetsdk_minsdk30_unsigned.apk')) def test_apk_release_name(self): appid, vercode, sigfp = fdroidserver.common.apk_parse_release_filename('com.serwylo.lexica_905.apk') self.assertEqual(appid, 'com.serwylo.lexica') self.assertEqual(vercode, 905) self.assertEqual(sigfp, None) appid, vercode, sigfp = fdroidserver.common.apk_parse_release_filename('com.serwylo.lexica_905_c82e0f6.apk') self.assertEqual(appid, 'com.serwylo.lexica') self.assertEqual(vercode, 905) self.assertEqual(sigfp, 'c82e0f6') appid, vercode, sigfp = fdroidserver.common.apk_parse_release_filename('beverly_hills-90210.apk') self.assertEqual(appid, None) self.assertEqual(vercode, None) self.assertEqual(sigfp, None) def test_metadata_find_developer_signature(self): sig = fdroidserver.common.metadata_find_developer_signature('org.smssecure.smssecure') self.assertEqual('b30bb971af0d134866e158ec748fcd553df97c150f58b0a963190bbafbeb0868', sig) def test_parse_xml(self): manifest = Path('source-files/fdroid/fdroidclient/AndroidManifest.xml') parsed = fdroidserver.common.parse_xml(manifest) self.assertIsNotNone(parsed) self.assertEqual(str(type(parsed)), "") def test_parse_androidmanifests(self): app = fdroidserver.metadata.App() app.id = 'org.fdroid.fdroid' paths = [ Path('source-files/fdroid/fdroidclient/AndroidManifest.xml'), Path('source-files/fdroid/fdroidclient/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) self.assertEqual(('0.94-test', 940, 'org.fdroid.fdroid'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() app.AutoName = 'android-chat' app.RepoType = 'git' url = 'https://github.com/wildfirechat/android-chat.git' app.SourceCode = url.rstrip('.git') app.Repo = url paths = [ Path('source-files/cn.wildfirechat.chat/avenginekit/build.gradle'), Path('source-files/cn.wildfirechat.chat/build.gradle'), Path('source-files/cn.wildfirechat.chat/client/build.gradle'), Path('source-files/cn.wildfirechat.chat/client/src/main/AndroidManifest.xml'), Path('source-files/cn.wildfirechat.chat/emojilibrary/build.gradle'), Path('source-files/cn.wildfirechat.chat/gradle/build_libraries.gradle'), Path('source-files/cn.wildfirechat.chat/imagepicker/build.gradle'), Path('source-files/cn.wildfirechat.chat/mars-core-release/build.gradle'), Path('source-files/cn.wildfirechat.chat/push/build.gradle'), Path('source-files/cn.wildfirechat.chat/settings.gradle'), Path('source-files/cn.wildfirechat.chat/chat/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) self.assertEqual(('0.6.9', 23, 'cn.wildfirechat.chat'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() app.Repo = 'https://github.com/Integreight/1Sheeld-Android-App' paths = [ Path('source-files/com.integreight.onesheeld/pagerIndicator/src/main/AndroidManifest.xml'), Path('source-files/com.integreight.onesheeld/pagerIndicator/build.gradle'), Path('source-files/com.integreight.onesheeld/oneSheeld/src/main/AndroidManifest.xml'), Path('source-files/com.integreight.onesheeld/oneSheeld/build.gradle'), Path('source-files/com.integreight.onesheeld/localeapi/src/main/AndroidManifest.xml'), Path('source-files/com.integreight.onesheeld/localeapi/build.gradle'), Path('source-files/com.integreight.onesheeld/build.gradle'), Path('source-files/com.integreight.onesheeld/settings.gradle'), Path('source-files/com.integreight.onesheeld/quickReturnHeader/src/main/AndroidManifest.xml'), Path('source-files/com.integreight.onesheeld/quickReturnHeader/build.gradle'), Path('source-files/com.integreight.onesheeld/pullToRefreshlibrary/src/main/AndroidManifest.xml'), Path('source-files/com.integreight.onesheeld/pullToRefreshlibrary/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) self.assertEqual(('1.9.0', 170521, 'com.integreight.onesheeld'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() app.id = 'dev.patrickgold.florisboard' paths = [ Path('source-files/dev.patrickgold.florisboard/app/build.gradle.kts'), ] for path in paths: self.assertTrue(os.path.isfile(path)) self.assertEqual(('0.3.10', 29, 'dev.patrickgold.florisboard'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() app.id = 'com.ubergeek42.WeechatAndroid' paths = [ Path('source-files/com.ubergeek42.WeechatAndroid/app/build.gradle.kts'), Path('source-files/com.ubergeek42.WeechatAndroid/app/src/main/res/values/strings.xml'), ] for path in paths: self.assertTrue(os.path.isfile(path)) self.assertEqual(('1.8.1', 10801, None), fdroidserver.common.parse_androidmanifests(paths, app)) def test_parse_androidmanifests_ignore(self): app = fdroidserver.metadata.App() app.id = 'org.fdroid.fdroid' app.UpdateCheckIgnore = '-test' paths = [ Path('source-files/fdroid/fdroidclient/AndroidManifest.xml'), Path('source-files/fdroid/fdroidclient/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) self.assertEqual(('Ignore', None, 'org.fdroid.fdroid'), fdroidserver.common.parse_androidmanifests(paths, app)) def test_parse_androidmanifests_with_flavor(self): app = fdroidserver.metadata.App() build = fdroidserver.metadata.Build() build.gradle = ['devVersion'] app['Builds'] = [build] app.id = 'org.fdroid.fdroid.dev' paths = [ Path('source-files/fdroid/fdroidclient/AndroidManifest.xml'), Path('source-files/fdroid/fdroidclient/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) self.assertEqual(('0.95-dev', 949, 'org.fdroid.fdroid.dev'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() build = fdroidserver.metadata.Build() build.gradle = ['free'] app['Builds'] = [build] app.id = 'eu.siacs.conversations' paths = [ Path('source-files/eu.siacs.conversations/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) self.assertEqual(('1.23.1', 245, 'eu.siacs.conversations'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() build = fdroidserver.metadata.Build() build.gradle = ['generic'] app['Builds'] = [build] app.id = 'com.nextcloud.client' paths = [ Path('source-files/com.nextcloud.client/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) self.assertEqual(('2.0.0', 20000099, 'com.nextcloud.client'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() build = fdroidserver.metadata.Build() build.gradle = ['versionDev'] app['Builds'] = [build] app.id = 'com.nextcloud.android.beta' paths = [ Path('source-files/com.nextcloud.client/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) self.assertEqual(('20171223', 20171223, 'com.nextcloud.android.beta'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() build = fdroidserver.metadata.Build() build.gradle = ['standard'] app['Builds'] = [build] app.id = 'at.bitfire.davdroid' paths = [ Path('source-files/at.bitfire.davdroid/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) self.assertEqual(('1.9.8.1-ose', 197, 'at.bitfire.davdroid'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() build = fdroidserver.metadata.Build() build.gradle = ['libre'] app['Builds'] = [build] app.id = 'com.kunzisoft.fdroidtest.applicationidsuffix.libre' paths = [ Path('source-files/com.kunzisoft.testcase/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) self.assertEqual(('1.0-libre', 1, 'com.kunzisoft.fdroidtest.applicationidsuffix.libre'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() build = fdroidserver.metadata.Build() build.gradle = ['pro'] app['Builds'] = [build] app.id = 'com.kunzisoft.fdroidtest.applicationidsuffix.pro' paths = [ Path('source-files/com.kunzisoft.testcase/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) self.assertEqual(('20180430-pro', 20180430, 'com.kunzisoft.fdroidtest.applicationidsuffix.pro'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() build = fdroidserver.metadata.Build() build.gradle = ['free'] app['Builds'] = [build] app.id = 'com.kunzisoft.fdroidtest.applicationidsuffix' paths = [ Path('source-files/com.kunzisoft.testcase/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) self.assertEqual(('1.0-free', 1, 'com.kunzisoft.fdroidtest.applicationidsuffix'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() build = fdroidserver.metadata.Build() build.gradle = ['underscore'] app['Builds'] = [build] app.id = 'com.kunzisoft.fdroidtest.applicationidsuffix.underscore' paths = [ Path('source-files/com.kunzisoft.testcase/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) self.assertEqual(('20180430-underscore', 20180430, 'com.kunzisoft.fdroidtest.applicationidsuffix.underscore'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() build = fdroidserver.metadata.Build() build.gradle = ['underscore_first'] app['Builds'] = [build] app.id = 'com.kunzisoft.fdroidtest.applicationidsuffix.underscore_first' paths = [ Path('source-files/com.kunzisoft.testcase/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) self.assertEqual(('1.0', 1, 'com.kunzisoft.fdroidtest.applicationidsuffix.underscore_first'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() build = fdroidserver.metadata.Build() build.gradle = ['fdroid'] app['Builds'] = [build] app.id = 'com.github.jameshnsears.quoteunquote' paths = [ Path('source-files/com.github.jameshnsears.quoteunquote/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) self.assertEqual(('2.5.2-fdroid', 73, 'com.github.jameshnsears.quoteunquote'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() build = fdroidserver.metadata.Build() build.gradle = ['fdroidFlavor'] app['Builds'] = [build] app.id = 'com.jens.automation2' paths = [ Path('source-files/com.jens.automation2/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) self.assertEqual(('1.6.34-fdroid', 105, 'com.jens.automation2'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() build = fdroidserver.metadata.Build() build.gradle = ['VAR', 'prod'] app['Builds'] = [build] app.id = 'de.varengold.activeTAN' paths = [ Path('source-files/de.varengold.activeTAN/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) self.assertEqual(('2021-06-30', 34, 'de.varengold.activeTAN'), fdroidserver.common.parse_androidmanifests(paths, app)) def test_get_all_gradle_and_manifests(self): """Test whether the function works with relative and absolute paths""" a = fdroidserver.common.get_all_gradle_and_manifests(Path('source-files/cn.wildfirechat.chat')) paths = [ 'avenginekit/build.gradle', 'build.gradle', 'chat/build.gradle', 'client/build.gradle', 'client/src/main/AndroidManifest.xml', 'emojilibrary/build.gradle', 'gradle/build_libraries.gradle', 'imagepicker/build.gradle', 'mars-core-release/build.gradle', 'push/build.gradle', 'settings.gradle', ] paths = [Path('source-files/cn.wildfirechat.chat') / path for path in paths] self.assertEqual(sorted(paths), sorted(a)) abspath = Path(self.basedir) / 'source-files/realm' p = fdroidserver.common.get_all_gradle_and_manifests(abspath) self.assertEqual(1, len(p)) self.assertTrue(p[0].is_relative_to(abspath)) def test_get_gradle_subdir(self): subdirs = { 'cn.wildfirechat.chat': 'chat', 'com.anpmech.launcher': 'app', 'org.tasks': 'app', 'ut.ewh.audiometrytest': 'app', 'org.noise_planet.noisecapture': 'app', } for k, v in subdirs.items(): build_dir = Path('source-files') / k paths = fdroidserver.common.get_all_gradle_and_manifests(build_dir) logging.info(paths) subdir = fdroidserver.common.get_gradle_subdir(build_dir, paths) self.assertEqual(v, str(subdir)) def test_parse_srclib_spec_good(self): self.assertEqual(fdroidserver.common.parse_srclib_spec('osmand-external-skia@android/oreo'), ('osmand-external-skia', 'android/oreo', None, None)) self.assertEqual(fdroidserver.common.parse_srclib_spec('1:appcompat@v7'), ('appcompat', 'v7', '1', None)) self.assertEqual(fdroidserver.common.parse_srclib_spec('1:Support/v7/appcompat@android-4.4_r1.1'), ('Support', 'android-4.4_r1.1', '1', 'v7/appcompat')) def test_parse_srclib_spec_many_ats(self): self.assertEqual( fdroidserver.common.parse_srclib_spec('foo@@v2'), ('foo', '@v2', None, None) ) self.assertEqual( fdroidserver.common.parse_srclib_spec('bar@2@f'), ('bar', '2@f', None, None) ) def test_parse_srclib_spec_none(self): with self.assertRaises(MetaDataException): fdroidserver.common.parse_srclib_spec(None) def test_parse_srclib_spec_no_ref(self): with self.assertRaises(MetaDataException): fdroidserver.common.parse_srclib_spec('no-ref') with self.assertRaises(MetaDataException): fdroidserver.common.parse_srclib_spec('noref@') def test_parse_srclib_spec_no_name(self): with self.assertRaises(MetaDataException): fdroidserver.common.parse_srclib_spec('@ref') def test_remove_signing_keys(self): shutil.copytree( os.path.join(self.basedir, 'source-files'), os.path.join(self.tmpdir, 'source-files'), ) os.chdir(self.tmpdir) with_signingConfigs = [ 'source-files/com.seafile.seadroid2/app/build.gradle', 'source-files/eu.siacs.conversations/build.gradle', 'source-files/info.guardianproject.ripple/build.gradle', 'source-files/open-keychain/open-keychain/build.gradle', 'source-files/open-keychain/open-keychain/OpenKeychain/build.gradle', 'source-files/org.tasks/app/build.gradle.kts', 'source-files/osmandapp/osmand/build.gradle', 'source-files/ut.ewh.audiometrytest/app/build.gradle', ] for f in with_signingConfigs: build_dir = os.path.join(*f.split(os.sep)[:2]) if not os.path.isdir(build_dir): continue fdroidserver.common.remove_signing_keys(build_dir) fromfile = os.path.join(self.basedir, f) with open(f) as fp: content = fp.read() if 'signingConfig' in content: with open(f) as fp: b = fp.readlines() with open(fromfile) as fp: a = fp.readlines() diff = difflib.unified_diff(a, b, fromfile, f) sys.stdout.writelines(diff) self.assertFalse(True) do_not_modify = [ 'source-files/Zillode/syncthing-silk/build.gradle', 'source-files/at.bitfire.davdroid/build.gradle', 'source-files/com.kunzisoft.testcase/build.gradle', 'source-files/com.nextcloud.client/build.gradle', 'source-files/fdroid/fdroidclient/build.gradle', 'source-files/firebase-suspect/app/build.gradle', 'source-files/firebase-suspect/build.gradle', 'source-files/firebase-allowlisted/app/build.gradle', 'source-files/firebase-allowlisted/build.gradle', 'source-files/org.mozilla.rocket/app/build.gradle', 'source-files/realm/react-native/android/build.gradle', 'triple-t-2/build/org.piwigo.android/app/build.gradle', ] for f in do_not_modify: build_dir = os.path.join(*f.split(os.sep)[:2]) if not os.path.isdir(build_dir): continue fdroidserver.common.remove_signing_keys(build_dir) fromfile = os.path.join(self.basedir, f) with open(fromfile) as fp: a = fp.readlines() with open(f) as fp: b = fp.readlines() diff = list(difflib.unified_diff(a, b, fromfile, f)) self.assertEqual(0, len(diff), 'This file should not have been modified:\n' + ''.join(diff)) def test_calculate_math_string(self): self.assertEqual(1234, fdroidserver.common.calculate_math_string('1234')) self.assertEqual((1 + 1) * 2, fdroidserver.common.calculate_math_string('(1 + 1) * 2')) self.assertEqual((1 - 1) * 2 + 3 * 1 - 1, fdroidserver.common.calculate_math_string('(1 - 1) * 2 + 3 * 1 - 1')) self.assertEqual(0 - 12345, fdroidserver.common.calculate_math_string('0 - 12345')) self.assertEqual(0xffff, fdroidserver.common.calculate_math_string('0xffff')) self.assertEqual(0xcafe * 123, fdroidserver.common.calculate_math_string('0xcafe * 123')) self.assertEqual(-1, fdroidserver.common.calculate_math_string('-1')) with self.assertRaises(SyntaxError): fdroidserver.common.calculate_math_string('__import__("urllib")') with self.assertRaises(SyntaxError): fdroidserver.common.calculate_math_string('self') with self.assertRaises(SyntaxError): fdroidserver.common.calculate_math_string('Ox9()') with self.assertRaises(SyntaxError): fdroidserver.common.calculate_math_string('1+1; print(1)') with self.assertRaises(SyntaxError): fdroidserver.common.calculate_math_string('1-1 # no comment') def test_calculate_IPFS_cid_with_no_tool(self): fdroidserver.common.config = {'ipfs_cid': None} self.assertIsNone(fdroidserver.common.calculate_IPFS_cid('urzip.apk')) self.assertIsNone(fdroidserver.common.calculate_IPFS_cid('FileDoesNotExist')) @unittest.skipUnless(shutil.which('ipfs_cid'), 'calculate_IPFS_cid needs ipfs_cid') def test_calculate_IPFS_cid(self): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config self.assertIsNone(fdroidserver.common.calculate_IPFS_cid('FileDoesNotExist')) self.assertEqual( fdroidserver.common.calculate_IPFS_cid('urzip.apk'), "bafybeigmtgrwyvj77jaflje2rf533haeqtpu2wtwsctryjusjnsawacsam", ) def test_deploy_build_log_with_rsync_with_id_file(self): mocklogcontent = bytes( textwrap.dedent( """\ build started building... build completed profit!""" ), 'utf-8', ) fdroidserver.common.options = mock.Mock() fdroidserver.common.options.verbose = False fdroidserver.common.options.quiet = False fdroidserver.common.config = {} fdroidserver.common.config['serverwebroot'] = [ {'url': 'example.com:/var/www/fdroid/'}, {'url': 'example.com:/var/www/fbot/'}, ] fdroidserver.common.config['deploy_process_logs'] = True fdroidserver.common.config['identity_file'] = 'ssh/id_rsa' assert_subprocess_call_iteration = 0 def assert_subprocess_call(cmd): nonlocal assert_subprocess_call_iteration logging.debug(cmd) if assert_subprocess_call_iteration == 0: self.assertListEqual(['rsync', '--archive', '--delete-after', '--safe-links', '-e', 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ssh/id_rsa', cmd[6], 'example.com:/var/www/fdroid/repo/'], cmd) self.assertTrue(cmd[6].endswith('/com.example.app_4711.log.gz')) with gzip.open(cmd[6], 'r') as f: self.assertTrue(f.read(), mocklogcontent) elif assert_subprocess_call_iteration == 1: self.assertListEqual(['rsync', '--archive', '--delete-after', '--safe-links', '-e', 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ssh/id_rsa', cmd[6], 'example.com:/var/www/fbot/repo/'], cmd) self.assertTrue(cmd[6].endswith('/com.example.app_4711.log.gz')) with gzip.open(cmd[6], 'r') as f: self.assertTrue(f.read(), mocklogcontent) else: self.fail('unexpected subprocess.call invocation ({})' .format(assert_subprocess_call_iteration)) assert_subprocess_call_iteration += 1 return 0 with mock.patch('subprocess.call', side_effect=assert_subprocess_call): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): fdroidserver.common.deploy_build_log_with_rsync( 'com.example.app', 4711, mocklogcontent) expected_log_path = os.path.join(tmpdir, 'repo', 'com.example.app_4711.log.gz') self.assertTrue(os.path.isfile(expected_log_path)) with gzip.open(expected_log_path, 'r') as f: self.assertEqual(f.read(), mocklogcontent) def test_deploy_status_json(self): os.chdir(self.tmpdir) fakesubcommand = 'fakesubcommand' fake_timestamp = 1234567890 fakeserver = 'example.com:/var/www/fbot/' expected_dir = os.path.join(self.tmpdir, fakeserver.replace(':', ''), 'repo', 'status') fdroidserver.common.options = mock.Mock() fdroidserver.common.config = {} fdroidserver.common.config['serverwebroot'] = [{'url': fakeserver}] fdroidserver.common.config['identity_file'] = 'ssh/id_rsa' def assert_subprocess_call(cmd): dest_path = os.path.join(self.tmpdir, cmd[-1].replace(':', '')) if not os.path.exists(dest_path): os.makedirs(dest_path) return subprocess.run(cmd[:-1] + [dest_path]).returncode with mock.patch('subprocess.call', side_effect=assert_subprocess_call): with mock.patch.object(sys, 'argv', ['fdroid ' + fakesubcommand]): output = fdroidserver.common.setup_status_output(time.localtime(fake_timestamp)) self.assertFalse(os.path.exists(os.path.join(expected_dir, 'running.json'))) with mock.patch.object(sys, 'argv', ['fdroid ' + fakesubcommand]): fdroidserver.common.write_status_json(output) self.assertFalse(os.path.exists(os.path.join(expected_dir, fakesubcommand + '.json'))) fdroidserver.common.config['deploy_process_logs'] = True output = fdroidserver.common.setup_status_output(time.localtime(fake_timestamp)) expected_path = os.path.join(expected_dir, 'running.json') self.assertTrue(os.path.isfile(expected_path)) with open(expected_path) as fp: data = json.load(fp) self.assertEqual(fake_timestamp * 1000, data['startTimestamp']) self.assertFalse('endTimestamp' in data) testvalue = 'asdfasd' output['testvalue'] = testvalue fdroidserver.common.write_status_json(output) expected_path = os.path.join(expected_dir, fakesubcommand + '.json') self.assertTrue(os.path.isfile(expected_path)) with open(expected_path) as fp: data = json.load(fp) self.assertEqual(fake_timestamp * 1000, data['startTimestamp']) self.assertTrue('endTimestamp' in data) self.assertEqual(testvalue, output.get('testvalue')) def test_string_is_integer(self): self.assertTrue(fdroidserver.common.string_is_integer('0x10')) self.assertTrue(fdroidserver.common.string_is_integer('010')) self.assertTrue(fdroidserver.common.string_is_integer('123')) self.assertFalse(fdroidserver.common.string_is_integer('0xgg')) self.assertFalse(fdroidserver.common.string_is_integer('01g')) self.assertFalse(fdroidserver.common.string_is_integer('o123')) def test_version_code_string_to_int(self): self.assertEqual(16, fdroidserver.common.version_code_string_to_int('0x10')) self.assertEqual(198712389, fdroidserver.common.version_code_string_to_int('198712389')) self.assertEqual(8, fdroidserver.common.version_code_string_to_int('0o10')) self.assertEqual(10, fdroidserver.common.version_code_string_to_int('010')) self.assertEqual(123, fdroidserver.common.version_code_string_to_int('0000123')) self.assertEqual(-42, fdroidserver.common.version_code_string_to_int('-42')) def test_getsrclibvcs(self): fdroidserver.metadata.srclibs = {'somelib': {'RepoType': 'git'}, 'yeslib': {'RepoType': 'hg'}, 'nolib': {'RepoType': 'git-svn'}} self.assertEqual(fdroidserver.common.getsrclibvcs('somelib'), 'git') self.assertEqual(fdroidserver.common.getsrclibvcs('yeslib'), 'hg') self.assertEqual(fdroidserver.common.getsrclibvcs('nolib'), 'git-svn') with self.assertRaises(VCSException): fdroidserver.common.getsrclibvcs('nonexistentlib') def test_getsrclib_not_found(self): fdroidserver.common.config = {'sdk_path': '', 'java_paths': {}} fdroidserver.metadata.srclibs = {} with self.assertRaisesRegex(VCSException, 'srclib SDL not found.'): fdroidserver.common.getsrclib('SDL@release-2.0.3', 'srclib') def test_getsrclib_gotorevision_raw(self): fdroidserver.common.config = {'sdk_path': '', 'java_paths': {}} fdroidserver.metadata.srclibs = {'SDL': {'RepoType': 'git', 'Repo': ''}} vcs = mock.Mock() with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): os.makedirs(os.path.join('srclib', 'SDL')) with mock.patch('fdroidserver.common.getvcs', return_value=vcs): ret = fdroidserver.common.getsrclib('SDL', 'srclib', raw=True) self.assertEqual(vcs.srclib, ('SDL', None, 'srclib/SDL')) self.assertEqual(ret, vcs) def test_getsrclib_gotorevision_ref(self): fdroidserver.common.config = {'sdk_path': '', 'java_paths': {}} fdroidserver.metadata.srclibs = {'ACRA': {'RepoType': 'git', 'Repo': 'https://github.com/ACRA/acra.git', 'Subdir': None, 'Prepare': None}} vcs = mock.Mock() skm = mock.Mock() dfm = mock.Mock() with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): os.makedirs(os.path.join('srclib', 'ACRA')) with mock.patch('fdroidserver.common.getvcs', return_value=vcs): with mock.patch('fdroidserver.common.remove_signing_keys', skm): with mock.patch('fdroidserver.common.remove_debuggable_flags', dfm): ret = fdroidserver.common.getsrclib('ACRA@acra-4.6.2', 'srclib') self.assertEqual(vcs.srclib, ('ACRA', None, 'srclib/ACRA')) vcs.gotorevision.assert_called_once_with('acra-4.6.2', True) skm.assert_called_once_with('srclib/ACRA') dfm.assert_called_once_with('srclib/ACRA') self.assertEqual(ret, ('ACRA', None, 'srclib/ACRA')) def test_run_yamllint_wellformed(self): try: import yamllint.config yamllint.config # make pyflakes ignore this except ImportError: self.skipTest('yamllint not installed') with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with open('wellformed.yml', 'w') as f: f.write( textwrap.dedent( '''\ yaml: file: - for - test purposeses: true ''' ) ) result = fdroidserver.common.run_yamllint('wellformed.yml') self.assertEqual(result, '') def test_run_yamllint_malformed(self): try: import yamllint.config yamllint.config # make pyflakes ignore this except ImportError: self.skipTest('yamllint not installed') with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with open('malformed.yml', 'w') as f: f.write( textwrap.dedent( '''\ yaml: - that fails - test ''' ) ) result = fdroidserver.common.run_yamllint('malformed.yml') self.assertIsNotNone(result) self.assertNotEqual(result, '') def test_with_no_config(self): """It should set defaults if no config file is found""" os.chdir(self.tmpdir) self.assertFalse(os.path.exists('config.yml')) self.assertFalse(os.path.exists('config.py')) config = fdroidserver.common.read_config() self.assertFalse(config.get('update_stats')) self.assertIsNotNone(config.get('char_limits')) def test_with_zero_size_config(self): """It should set defaults if config file has nothing in it""" os.chdir(self.tmpdir) open('config.yml', 'w').close() self.assertTrue(os.path.exists('config.yml')) self.assertFalse(os.path.exists('config.py')) config = fdroidserver.common.read_config() self.assertFalse(config.get('update_stats')) self.assertIsNotNone(config.get('char_limits')) def test_with_config_yml(self): """Make sure it is possible to use config.yml alone.""" os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: fp.write('apksigner: yml') self.assertTrue(os.path.exists('config.yml')) self.assertFalse(os.path.exists('config.py')) config = fdroidserver.common.read_config() self.assertEqual('yml', config.get('apksigner')) def test_with_config_yml_utf8(self): """Make sure it is possible to use config.yml in UTF-8 encoding.""" os.chdir(self.tmpdir) teststr = '/πÇÇ现代通用字-български-عربي1/ö/yml' with open('config.yml', 'w', encoding='utf-8') as fp: fp.write('apksigner: ' + teststr) self.assertTrue(os.path.exists('config.yml')) self.assertFalse(os.path.exists('config.py')) config = fdroidserver.common.read_config() self.assertEqual(teststr, config.get('apksigner')) def test_with_config_yml_utf8_as_ascii(self): """Make sure it is possible to use config.yml Unicode encoded as ASCII.""" os.chdir(self.tmpdir) teststr = '/πÇÇ现代通用字-български-عربي1/ö/yml' with open('config.yml', 'w') as fp: yaml.dump({'apksigner': teststr}, fp) self.assertTrue(os.path.exists('config.yml')) self.assertFalse(os.path.exists('config.py')) config = fdroidserver.common.read_config() self.assertEqual(teststr, config.get('apksigner')) def test_with_config_yml_with_env_var(self): """Make sure it is possible to use config.yml alone.""" os.chdir(self.tmpdir) with mock.patch.dict(os.environ): os.environ['SECRET'] = 'mysecretpassword' with open('config.yml', 'w') as fp: fp.write("""keypass: {'env': 'SECRET'}""") self.assertTrue(os.path.exists('config.yml')) self.assertFalse(os.path.exists('config.py')) config = fdroidserver.common.read_config() self.assertEqual(os.getenv('SECRET', 'fail'), config.get('keypass')) def test_with_config_yml_is_dict(self): os.chdir(self.tmpdir) Path('config.yml').write_text('apksigner = /placeholder/path') with self.assertRaises(TypeError): fdroidserver.common.read_config() def test_with_config_yml_is_not_mixed_type(self): os.chdir(self.tmpdir) Path('config.yml').write_text('k: v\napksigner = /placeholder/path') with self.assertRaises(yaml.scanner.ScannerError): fdroidserver.common.read_config() def test_with_config_py(self): """Make sure it is still possible to use config.py alone.""" os.chdir(self.tmpdir) with open('config.py', 'w') as fp: fp.write('apksigner = "py"') self.assertFalse(os.path.exists('config.yml')) self.assertTrue(os.path.exists('config.py')) config = fdroidserver.common.read_config() self.assertEqual("py", config.get('apksigner')) def test_config_perm_warning(self): """Exercise the code path that issues a warning about unsafe permissions.""" os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: fp.write('keystore: foo.jks') self.assertTrue(os.path.exists(fp.name)) os.chmod(fp.name, 0o666) fdroidserver.common.read_config() os.remove(fp.name) fdroidserver.common.config = None with open('config.py', 'w') as fp: fp.write('keystore = "foo.jks"') self.assertTrue(os.path.exists(fp.name)) os.chmod(fp.name, 0o666) fdroidserver.common.read_config() def test_with_both_config_yml_py(self): """If config.yml and config.py are present, config.py should be ignored.""" os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: fp.write('apksigner: yml') with open('config.py', 'w') as fp: fp.write('apksigner = "py"') self.assertTrue(os.path.exists('config.yml')) self.assertTrue(os.path.exists('config.py')) config = fdroidserver.common.read_config() self.assertEqual('yml', config.get('apksigner')) def test_config_repo_url(self): """repo_url ends in /repo, archive_url ends in /archive.""" os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: fp.write('repo_url: https://MyFirstFDroidRepo.org/fdroid/repo\n') fp.write('archive_url: https://MyFirstFDroidRepo.org/fdroid/archive') config = fdroidserver.common.read_config() self.assertEqual('https://MyFirstFDroidRepo.org/fdroid/repo', config.get('repo_url')) self.assertEqual('https://MyFirstFDroidRepo.org/fdroid/archive', config.get('archive_url')) def test_config_repo_url_extra_slash(self): """repo_url ends in /repo, archive_url ends in /archive.""" os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: fp.write('repo_url: https://MyFirstFDroidRepo.org/fdroid/repo/') with self.assertRaises(FDroidException): fdroidserver.common.read_config() def test_config_repo_url_not_repo(self): """repo_url ends in /repo, archive_url ends in /archive.""" os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: fp.write('repo_url: https://MyFirstFDroidRepo.org/fdroid/foo') with self.assertRaises(FDroidException): fdroidserver.common.read_config() def test_config_archive_url_extra_slash(self): """repo_url ends in /repo, archive_url ends in /archive.""" os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: fp.write('archive_url: https://MyFirstFDroidRepo.org/fdroid/archive/') with self.assertRaises(FDroidException): fdroidserver.common.read_config() def test_config_archive_url_not_repo(self): """repo_url ends in /repo, archive_url ends in /archive.""" os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: fp.write('archive_url: https://MyFirstFDroidRepo.org/fdroid/foo') with self.assertRaises(FDroidException): fdroidserver.common.read_config() def test_write_to_config_yml(self): os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: fp.write('apksigner: yml') self.assertTrue(os.path.exists(fp.name)) self.assertFalse(os.path.exists('config.py')) config = fdroidserver.common.read_config() self.assertFalse('keypass' in config) self.assertEqual('yml', config.get('apksigner')) fdroidserver.common.write_to_config(config, 'keypass', 'mysecretpassword') with open(fp.name) as fp: print(fp.read()) fdroidserver.common.config = None config = fdroidserver.common.read_config() self.assertEqual('mysecretpassword', config['keypass']) def test_write_to_config_py(self): os.chdir(self.tmpdir) with open('config.py', 'w') as fp: fp.write('apksigner = "py"') self.assertTrue(os.path.exists(fp.name)) self.assertFalse(os.path.exists('config.yml')) config = fdroidserver.common.read_config() self.assertFalse('keypass' in config) self.assertEqual('py', config.get('apksigner')) fdroidserver.common.write_to_config(config, 'keypass', 'mysecretpassword') fdroidserver.common.config = None config = fdroidserver.common.read_config() self.assertEqual('mysecretpassword', config['keypass']) def test_config_dict_with_int_keys(self): os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: fp.write('java_paths:\n 8: /usr/lib/jvm/java-8-openjdk\n') self.assertTrue(os.path.exists(fp.name)) self.assertFalse(os.path.exists('config.py')) config = fdroidserver.common.read_config() self.assertEqual('/usr/lib/jvm/java-8-openjdk', config.get('java_paths', {}).get('8')) @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) def test_test_sdk_exists_fails_on_bad_sdk_path(self): config = {'sdk_path': 'nothinghere'} self.assertFalse(fdroidserver.common.test_sdk_exists(config)) @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) def test_test_sdk_exists_fails_on_empty(self): self.assertFalse(fdroidserver.common.test_sdk_exists(dict())) @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) def test_test_sdk_exists_fails_on_non_existent(self): config = {'sdk_path': os.path.join(self.testdir, 'non_existent')} self.assertFalse(fdroidserver.common.test_sdk_exists(config)) @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) def test_test_sdk_exists_fails_on_file(self): f = os.path.join(self.testdir, 'testfile') open(f, 'w').close() config = {'sdk_path': f} self.assertFalse(fdroidserver.common.test_sdk_exists(config)) @mock.patch.dict(os.environ, {'PATH': '/nonexistent'}, clear=True) def test_test_sdk_exists_valid_apksigner_in_config(self): apksigner = os.path.join( self.testdir, 'build-tools', fdroidserver.common.MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION, 'apksigner', ) os.makedirs(os.path.dirname(apksigner)) with open(apksigner, 'w') as fp: fp.write('#!/bin/sh\ndate\n') os.chmod(apksigner, 0o0755) config = {'apksigner': apksigner} self.assertTrue(fdroidserver.common.test_sdk_exists(config)) @mock.patch.dict(os.environ, {'PATH': '/nonexistent'}, clear=True) def test_test_sdk_exists_old_apksigner_in_config(self): apksigner = os.path.join(self.testdir, 'build-tools', '28.0.0', 'apksigner') os.makedirs(os.path.dirname(apksigner)) with open(apksigner, 'w') as fp: fp.write('#!/bin/sh\ndate\n') os.chmod(apksigner, 0o0755) config = {'apksigner': apksigner} self.assertFalse(fdroidserver.common.test_sdk_exists(config)) @mock.patch.dict(os.environ, {'PATH': '/nonexistent'}, clear=True) def test_test_sdk_exists_with_valid_apksigner(self): apksigner = ( Path(self.testdir) / 'build-tools' / fdroidserver.common.MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION / 'apksigner' ) apksigner.parent.mkdir(parents=True) apksigner.write_text('#!/bin/sh\ndate\n') apksigner.chmod(0o0755) config = {'sdk_path': self.testdir} self.assertTrue(fdroidserver.common.test_sdk_exists(config)) @mock.patch.dict(os.environ, {'PATH': '/nonexistent'}, clear=True) def test_test_sdk_exists_with_old_apksigner(self): apksigner = Path(self.testdir) / 'build-tools' / '17.0.0' / 'apksigner' apksigner.parent.mkdir(parents=True) apksigner.write_text('#!/bin/sh\ndate\n') apksigner.chmod(0o0755) config = {'sdk_path': self.testdir} self.assertFalse(fdroidserver.common.test_sdk_exists(config)) def test_loading_config_buildserver_yml(self): """Smoke check to make sure this file is properly parsed""" os.chdir(self.tmpdir) shutil.copy(os.path.join(self.basedir, '..', 'buildserver', 'config.buildserver.yml'), 'config.yml') self.assertFalse(os.path.exists('config.py')) fdroidserver.common.read_config() def test_setup_status_output(self): os.chdir(self.tmpdir) start_timestamp = time.gmtime() subcommand = 'test' fakecmd = ['fdroid ' + subcommand, '--option'] sys.argv = fakecmd fdroidserver.common.config = dict() fdroidserver.common.setup_status_output(start_timestamp) with open(os.path.join('repo', 'status', 'running.json')) as fp: data = json.load(fp) self.assertFalse(os.path.exists('.git')) self.assertFalse('fdroiddata' in data) self.assertEqual(fakecmd, data['commandLine']) self.assertEqual(subcommand, data['subcommand']) def test_setup_status_output_in_git_repo(self): os.chdir(self.tmpdir) logging.getLogger('git.cmd').setLevel(logging.INFO) git_repo = git.Repo.init(self.tmpdir) file_in_git = 'README.md' with open(file_in_git, 'w') as fp: fp.write('this is just a test') git_repo.git.add(all=True) git_repo.index.commit("update README") start_timestamp = time.gmtime() fakecmd = ['fdroid test2', '--option'] sys.argv = fakecmd fdroidserver.common.config = dict() fdroidserver.common.setup_status_output(start_timestamp) with open(os.path.join('repo', 'status', 'running.json')) as fp: data = json.load(fp) self.assertTrue(os.path.exists('.git')) self.assertIsNotNone(re.match(r'[0-9a-f]{40}', data['fdroiddata']['commitId']), 'Must be a valid git SHA1 commit ID!') self.assertFalse(data['fdroiddata']['isDirty']) self.assertEqual(fakecmd, data['commandLine']) self.assertEqual([], data['fdroiddata']['untrackedFiles']) dirtyfile = 'dirtyfile' with open(dirtyfile, 'w', encoding='utf-8') as fp: fp.write('this is just a test') with open(file_in_git, 'a', encoding='utf-8') as fp: fp.write('\nappend some stuff') self.assertEqual([], data['fdroiddata']['modifiedFiles']) fdroidserver.common.setup_status_output(start_timestamp) with open(os.path.join('repo', 'status', 'running.json')) as fp: data = json.load(fp) self.assertTrue(data['fdroiddata']['isDirty']) self.assertEqual([file_in_git], data['fdroiddata']['modifiedFiles']) self.assertEqual([dirtyfile, 'repo/status/running.json'], data['fdroiddata']['untrackedFiles']) def test_get_app_display_name(self): testvalue = 'WIN!' for app in [ {'Name': testvalue}, {'AutoName': testvalue}, {'id': testvalue}, {'id': 'a', 'localized': {'de-AT': {'name': testvalue}}}, {'id': 'a', 'localized': { 'de-AT': {'name': 'nope'}, 'en-US': {'name': testvalue}, }}, {'AutoName': 'ignore me', 'Name': testvalue, 'id': 'nope'}, {'AutoName': testvalue, 'id': 'nope'}]: self.assertEqual(testvalue, fdroidserver.common.get_app_display_name(app)) @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) def test_get_android_tools_versions(self): sdk_path = os.path.join(self.basedir, 'get_android_tools_versions/android-sdk') config = { 'ndk_paths': {'r10e': os.path.join(sdk_path, '..', 'android-ndk-r10e')}, 'sdk_path': sdk_path, } fdroidserver.common.config = config fdroidserver.common.fill_config_defaults(config) components = fdroidserver.common.get_android_tools_versions() expected = ( ('../android-ndk-r10e', 'r10e'), ('ndk-bundle', '21.4.7075529'), ('ndk/11.2.2725575', '11.2.2725575'), ('ndk/17.2.4988734', '17.2.4988734'), ('ndk/21.3.6528147', '21.3.6528147'), ('patcher/v4', '1'), ('platforms/android-30', '3'), ('skiaparser/1', '6'), ('tools', '26.1.1'), ) self.assertSequenceEqual(expected, sorted(components)) @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) def test_get_android_tools_versions_no_ndk(self): with tempfile.TemporaryDirectory() as tmpdir: sdk_path = Path(tmpdir) / 'get_android_tools_versions' shutil.copytree( os.path.join(self.basedir, 'get_android_tools_versions'), sdk_path ) shutil.rmtree(sdk_path / 'android-ndk-r10e') shutil.rmtree(sdk_path / 'android-sdk/ndk') shutil.rmtree(sdk_path / 'android-sdk/ndk-bundle') fdroidserver.common.config = {'sdk_path': str(sdk_path)} components = fdroidserver.common.get_android_tools_versions() expected = ( ('android-sdk/patcher/v4', '1'), ('android-sdk/platforms/android-30', '3'), ('android-sdk/skiaparser/1', '6'), ('android-sdk/tools', '26.1.1'), ) self.assertSequenceEqual(expected, sorted(components)) def test_read_pkg_args(self): allow_vercodes = False self.assertEqual( {'org.fdroid.fdroid': []}, fdroidserver.common.read_pkg_args(['org.fdroid.fdroid'], allow_vercodes), ) self.assertNotEqual( {'com.example': [123456]}, fdroidserver.common.read_pkg_args(['com.example:123456'], allow_vercodes), ) allow_vercodes = True self.assertEqual( {'org.fdroid.fdroid': []}, fdroidserver.common.read_pkg_args(['org.fdroid.fdroid'], allow_vercodes), ) self.assertEqual( {'com.example': [123456]}, fdroidserver.common.read_pkg_args(['com.example:123456'], allow_vercodes), ) self.assertEqual( {'org.debian_kit': [6]}, fdroidserver.common.read_pkg_args(['org.debian_kit_6.apk'], allow_vercodes), ) appid_versionCode_pairs = ( 'org.fdroid.fdroid:1', 'com.example:12345', 'com.example:67890', ) self.assertEqual( {'com.example': [12345, 67890], 'org.fdroid.fdroid': [1]}, fdroidserver.common.read_pkg_args(appid_versionCode_pairs, allow_vercodes), ) appid_versionCode_pairs = ( 'com.example:67890', 'org.c_base.c_beam_29.apk', ) self.assertEqual( {'com.example': [67890], 'org.c_base.c_beam': [29]}, fdroidserver.common.read_pkg_args(appid_versionCode_pairs, allow_vercodes), ) def test_apk_strip_v1_signatures(self): before = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk') after = os.path.join(self.testdir, 'after.apk') shutil.copy(before, after) fdroidserver.common.apk_strip_v1_signatures(after, strip_manifest=False) def test_metadata_find_developer_signing_files(self): appid = 'org.smssecure.smssecure' self.assertIsNone( fdroidserver.common.metadata_find_developer_signing_files(appid, 133) ) vc = '135' self.assertEqual( ( os.path.join('metadata', appid, 'signatures', vc, '28969C09.RSA'), os.path.join('metadata', appid, 'signatures', vc, '28969C09.SF'), os.path.join('metadata', appid, 'signatures', vc, 'MANIFEST.MF'), None, ), fdroidserver.common.metadata_find_developer_signing_files(appid, vc), ) vc = '134' self.assertEqual( ( os.path.join('metadata', appid, 'signatures', vc, '28969C09.RSA'), os.path.join('metadata', appid, 'signatures', vc, '28969C09.SF'), os.path.join('metadata', appid, 'signatures', vc, 'MANIFEST.MF'), None, ), fdroidserver.common.metadata_find_developer_signing_files(appid, vc), ) @mock.patch('sdkmanager.build_package_list', lambda use_net: None) def test_auto_install_ndk(self): """Test all possible field data types for build.ndk""" fdroidserver.common.config = {'sdk_path': self.testdir} sdk_path = self.testdir build = fdroidserver.metadata.Build() none_entry = mock.Mock() with mock.patch('sdkmanager.install', none_entry): fdroidserver.common.auto_install_ndk(build) none_entry.assert_not_called() empty_list = mock.Mock() build.ndk = [] with mock.patch('sdkmanager.install', empty_list): fdroidserver.common.auto_install_ndk(build) empty_list.assert_not_called() release_entry = mock.Mock() build.ndk = 'r21e' with mock.patch('sdkmanager.install', release_entry): fdroidserver.common.auto_install_ndk(build) release_entry.assert_called_once_with('ndk;r21e', sdk_path) revision_entry = mock.Mock() build.ndk = '21.4.7075529' with mock.patch('sdkmanager.install', revision_entry): fdroidserver.common.auto_install_ndk(build) revision_entry.assert_called_once_with('ndk;21.4.7075529', sdk_path) list_entry = mock.Mock() calls = [] build.ndk = ['r10e', '11.0.2655954', 'r12b', 'r21e'] for n in build.ndk: calls.append(mock.call(f'ndk;{n}', sdk_path)) with mock.patch('sdkmanager.install', list_entry): fdroidserver.common.auto_install_ndk(build) list_entry.assert_has_calls(calls) @unittest.skipIf(importlib.util.find_spec('sdkmanager') is None, 'needs sdkmanager') @mock.patch('sdkmanager.build_package_list', lambda use_net: None) @mock.patch('sdkmanager._install_zipball_from_cache', lambda a, b: None) @mock.patch('sdkmanager._generate_package_xml', lambda a, b, c: None) def test_auto_install_ndk_mock_dl(self): """Test NDK installs by actually calling sdkmanager""" import sdkmanager import pkg_resources sdkmanager_version = LooseVersion( pkg_resources.get_distribution('sdkmanager').version ) if sdkmanager_version < LooseVersion('0.6.4'): raise unittest.SkipTest('needs fdroid sdkmanager >= 0.6.4') fdroidserver.common.config = {'sdk_path': 'placeholder'} build = fdroidserver.metadata.Build() url = 'https://dl.google.com/android/repository/android-ndk-r24-linux.zip' path = sdkmanager.get_cachedir() / os.path.basename(url) sdkmanager.packages = { ('ndk', '24.0.8215888'): url, ('ndk', 'r24'): url, } build.ndk = 'r24' firstrun = mock.Mock() with mock.patch('sdkmanager.download_file', firstrun): fdroidserver.common.auto_install_ndk(build) firstrun.assert_called_once_with(url, path) build.ndk = '24.0.8215888' secondrun = mock.Mock() with mock.patch('sdkmanager.download_file', secondrun): fdroidserver.common.auto_install_ndk(build) secondrun.assert_called_once_with(url, path) @unittest.skip("This test downloads and unzips a 1GB file.") def test_install_ndk(self): """NDK r10e is a special case since its missing source.properties""" config = {'sdk_path': self.tmpdir} fdroidserver.common.config = config fdroidserver.common._install_ndk('r10e') r10e = os.path.join(self.tmpdir, 'ndk', 'r10e') self.assertEqual('r10e', fdroidserver.common.get_ndk_version(r10e)) fdroidserver.common.fill_config_defaults(config) self.assertEqual({'r10e': r10e}, config['ndk_paths']) def test_fill_config_defaults(self): """Test the auto-detection of NDKs installed in standard paths""" ndk_bundle = os.path.join(self.tmpdir, 'ndk-bundle') os.makedirs(ndk_bundle) with open(os.path.join(ndk_bundle, 'source.properties'), 'w') as fp: fp.write('Pkg.Desc = Android NDK\nPkg.Revision = 17.2.4988734\n') config = {'sdk_path': self.tmpdir} fdroidserver.common.fill_config_defaults(config) self.assertEqual({'17.2.4988734': ndk_bundle}, config['ndk_paths']) r21e = os.path.join(self.tmpdir, 'ndk', '21.4.7075529') os.makedirs(r21e) with open(os.path.join(r21e, 'source.properties'), 'w') as fp: fp.write('Pkg.Desc = Android NDK\nPkg.Revision = 21.4.7075529\n') config = {'sdk_path': self.tmpdir} fdroidserver.common.fill_config_defaults(config) self.assertEqual( {'17.2.4988734': ndk_bundle, '21.4.7075529': r21e}, config['ndk_paths'], ) r10e = os.path.join(self.tmpdir, 'ndk', 'r10e') os.makedirs(r10e) with open(os.path.join(r10e, 'RELEASE.TXT'), 'w') as fp: fp.write('r10e-rc4 (64-bit)\n') config = {'sdk_path': self.tmpdir} fdroidserver.common.fill_config_defaults(config) self.assertEqual( {'r10e': r10e, '17.2.4988734': ndk_bundle, '21.4.7075529': r21e}, config['ndk_paths'], ) @unittest.skipIf(not os.path.isdir('/usr/lib/jvm/default-java'), 'uses Debian path') def test_fill_config_defaults_java(self): """Test the auto-detection of Java installed in standard paths""" config = {'sdk_path': self.tmpdir} fdroidserver.common.fill_config_defaults(config) java_paths = [] # use presence of javac to make sure its JDK not just JRE for f in glob.glob('/usr/lib/jvm/java-*-openjdk-*/bin/javac'): jdk = os.path.dirname(os.path.dirname(f)) if not os.path.islink(jdk): java_paths.append(jdk) self.assertEqual( len(java_paths), len(config['java_paths']) ) for f in config['java_paths'].values(): self.assertTrue(f in java_paths) self.assertTrue(isinstance(f, str)) # paths in config must be str @mock.patch.dict(os.environ, clear=True) def test_sdk_path_in_config_must_be_strings(self): """All paths in config must be strings, and never pathlib.Path instances""" os.environ['PATH'] = '/usr/bin:/usr/sbin' config = {'sdk_path': Path('/opt/android-sdk')} fdroidserver.common.fill_config_defaults(config) build = fdroidserver.metadata.Build() with self.assertRaises(TypeError): fdroidserver.common.set_FDroidPopen_env(build) @mock.patch.dict(os.environ, clear=True) def test_ndk_paths_in_config_must_be_strings(self): """All paths in config must be strings, and never pathlib.Path instances""" fdroidserver.common.config = { 'ndk_paths': {'r21d': Path('/opt/android-sdk/ndk/r21d')} } build = fdroidserver.metadata.Build() build.ndk = 'r21d' os.environ['PATH'] = '/usr/bin:/usr/sbin' with self.assertRaises(TypeError): fdroidserver.common.set_FDroidPopen_env(build) @mock.patch.dict(os.environ, clear=True) def test_FDroidPopen_envs_paths_can_be_pathlib(self): _mock_common_module_options_instance() os.environ['PATH'] = '/usr/bin:/usr/sbin' envs = {'PATHLIB': Path('/pathlib/path'), 'STRING': '/string/path'} p = fdroidserver.common.FDroidPopen(['/bin/sh', '-c', 'export'], envs=envs) self.assertIn('/string/path', p.output) self.assertIn('/pathlib/path', p.output) def test_vcs_git_latesttags(self): tags = [ "1.1.1", "2.2.2", "v3.0", "0.0.4", "0.5.0-beta", "666(6)", "seven", ] with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): repo = git.Repo.init(Path.cwd()) f = Path("test") date = 10 ** 9 for tag in tags: date += 1 f.write_text(tag) repo.index.add([str(f)]) repo.index.commit(tag, commit_date=str(date) + " +0000") repo.create_tag(tag) vcs = fdroidserver.common.vcs_git(None, Path.cwd()) self.assertEqual(vcs.latesttags(), tags[::-1]) def test_vcs_git_getref(self): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): repo = git.Repo.init(Path.cwd()) tag = "1.1.1" f = Path("test") f.write_text(tag) repo.index.add([str(f)]) repo.index.commit("foo") repo.create_tag(tag) vcs = fdroidserver.common.vcs_git(None, Path.cwd()) self.assertIsNotNone(vcs.getref("1.1.1")) self.assertIsNone(vcs.getref("invalid")) def test_get_release_filename(self): app = fdroidserver.metadata.App() app.id = 'test.app' build = fdroidserver.metadata.Build() build.versionCode = 123 build.output = 'build/apk/*' self.assertEqual( fdroidserver.common.get_release_filename(app, build), "%s_%s.apk" % (app.id, build.versionCode), ) build.output = 'build/apk/*.zip' self.assertEqual( fdroidserver.common.get_release_filename(app, build), "%s_%s.zip" % (app.id, build.versionCode), ) build.output = 'build/apk/*.apk' self.assertEqual( fdroidserver.common.get_release_filename(app, build), "%s_%s.apk" % (app.id, build.versionCode), ) build.output = 'build/apk/*.apk' self.assertEqual( fdroidserver.common.get_release_filename(app, build, 'exe'), "%s_%s.exe" % (app.id, build.versionCode), ) def test_no_zero_length_ndk_path_prefixes(self): fdroidserver.common.config = {'ndk_paths': {}} build = fdroidserver.metadata.Build() with mock.patch.dict(os.environ, clear=True): os.environ['PATH'] = '/usr/bin:/usr/sbin' fdroidserver.common.set_FDroidPopen_env(build) self.assertNotIn('', os.getenv('PATH').split(os.pathsep)) def test_is_repo_file(self): is_repo_file = fdroidserver.common.is_repo_file self.assertFalse(is_repo_file('does-not-exist')) with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): Path('repo').mkdir() repo_files = [ 'repo/com.example.test.helloworld_1.apk', 'repo/com.politedroid_6.apk', 'repo/duplicate.permisssions_9999999.apk', 'repo/fake.ota.update_1234.zip', 'repo/info.guardianproject.index-v1.jar_123.apk', 'repo/info.zwanenburg.caffeinetile_4.apk', 'repo/main.1101613.obb.main.twoversions.obb', ] index_files = [ 'repo/entry.jar', 'repo/entry.json', 'repo/index-v1.jar', 'repo/index-v1.json', 'repo/index-v2.json', 'repo/index.css', 'repo/index.html', 'repo/index.jar', 'repo/index.png', 'repo/index.xml', ] for f in repo_files + index_files: open(f, 'w').close() repo_dirs = [ 'repo/com.politedroid', 'repo/info.guardianproject.index-v1.jar', 'repo/status', ] for d in repo_dirs: os.mkdir(d) for f in repo_files: self.assertTrue(os.path.exists(f), f + ' was created') self.assertTrue(is_repo_file(f), f + ' is repo file') for f in index_files: self.assertTrue(os.path.exists(f), f + ' was created') self.assertFalse(is_repo_file(f), f + ' is repo file') gpg_signed = [ 'repo/entry.json', 'repo/index-v1.json', 'repo/index-v2.json', ] self.assertEqual( (f in gpg_signed or is_repo_file(f, for_gpg_signing=False)), is_repo_file(f, for_gpg_signing=True), f + ' gpg signable?', ) for d in repo_dirs: self.assertTrue(os.path.exists(d), d + ' was created') self.assertFalse(is_repo_file(d), d + ' not repo file') def test_get_apksigner_smartcardoptions(self): os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: d = { 'smartcardoptions': '-storetype PKCS11' ' -providerName SunPKCS11-OpenSC' ' -providerClass sun.security.pkcs11.SunPKCS11' ' -providerArg opensc-fdroid.cfg' } yaml.dump(d, fp) config = fdroidserver.common.read_config() fdroidserver.common.config = config self.assertTrue(isinstance(d['smartcardoptions'], str)) self.assertTrue(isinstance(config['smartcardoptions'], list)) self.assertEqual( [ '--ks-type', 'PKCS11', '--provider-class', 'sun.security.pkcs11.SunPKCS11', '--provider-arg', 'opensc-fdroid.cfg', ], fdroidserver.common.get_apksigner_smartcardoptions( config['smartcardoptions'] ), ) def test_get_smartcardoptions_list(self): os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: fp.write( textwrap.dedent( """ smartcardoptions: - -storetype - PKCS11 - -providerName - SunPKCS11-OpenSC - -providerClass - sun.security.pkcs11.SunPKCS11 - -providerArg - opensc-fdroid.cfg """ ) ) config = fdroidserver.common.read_config() fdroidserver.common.config = config self.assertTrue(isinstance(config['smartcardoptions'], list)) self.assertEqual( [ '-storetype', 'PKCS11', '-providerName', 'SunPKCS11-OpenSC', '-providerClass', 'sun.security.pkcs11.SunPKCS11', '-providerArg', 'opensc-fdroid.cfg', ], config['smartcardoptions'], ) def test_get_smartcardoptions_spaces(self): os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: fp.write( textwrap.dedent( """smartcardoptions: | -storetype PKCS11 -providerClass sun.security.pkcs11.SunPKCS11 -providerArg /etc/pkcs11_java.cfg """ ) ) config = fdroidserver.common.read_config() fdroidserver.common.config = config self.assertTrue(isinstance(config['smartcardoptions'], list)) self.assertEqual( [ '-storetype', 'PKCS11', '-providerClass', 'sun.security.pkcs11.SunPKCS11', '-providerArg', '/etc/pkcs11_java.cfg', ], config['smartcardoptions'], ) def test_get_smartcardoptions_config_py(self): os.chdir(self.tmpdir) with open('config.py', 'w') as fp: fp.write( textwrap.dedent( """ smartcardoptions = ''' \t-storetype\tPKCS11 \t-providerClass\tsun.security.pkcs11.SunPKCS11 \t-providerArg\t/etc/pkcs11_java.cfg ''' """ ) ) config = fdroidserver.common.read_config() fdroidserver.common.config = config self.assertEqual( [ '-storetype', 'PKCS11', '-providerClass', 'sun.security.pkcs11.SunPKCS11', '-providerArg', '/etc/pkcs11_java.cfg', ], config['smartcardoptions'], ) def test_load_localized_config(self): """It should load""" antiFeatures = fdroidserver.common.load_localized_config( ANTIFEATURES_CONFIG_NAME, 'repo' ) self.assertEqual( [ 'Ads', 'DisabledAlgorithm', 'KnownVuln', 'NSFW', 'NoSourceSince', 'NonFreeAdd', 'NonFreeAssets', 'NonFreeDep', 'NonFreeNet', 'Tracking', 'UpstreamNonFree', ], list(antiFeatures.keys()), ) self.assertEqual( ['de', 'en-US', 'fa', 'ro', 'zh-rCN'], list(antiFeatures['Ads']['description'].keys()), ) self.assertEqual( ['en-US'], list(antiFeatures['NoSourceSince']['description'].keys()), ) # it should have copied the icon files into place for v in antiFeatures.values(): p = Path(os.path.dirname(__file__) + '/repo' + v['icon']['en-US']['name']) self.assertTrue(p.exists()) def test_load_localized_config_categories(self): """It should load""" categories = fdroidserver.common.load_localized_config( CATEGORIES_CONFIG_NAME, 'repo' ) self.assertEqual( [ 'Time', 'Development', 'GuardianProject', 'Multimedia', 'Phone & SMS', 'Security', 'System', ], list(categories.keys()), ) self.assertEqual(['en-US'], list(categories['GuardianProject']['name'].keys())) def test_load_localized_config_0_file(self): os.chdir(self.testdir) os.mkdir('config') Path('config/categories.yml').write_text('') with self.assertRaises(TypeError): fdroidserver.common.load_localized_config(CATEGORIES_CONFIG_NAME, 'repo') def test_load_localized_config_string(self): os.chdir(self.testdir) os.mkdir('config') Path('config/categories.yml').write_text('this is a string') with self.assertRaises(TypeError): fdroidserver.common.load_localized_config(CATEGORIES_CONFIG_NAME, 'repo') def test_load_localized_config_list(self): os.chdir(self.testdir) os.mkdir('config') Path('config/categories.yml').write_text('- System') with self.assertRaises(TypeError): fdroidserver.common.load_localized_config(CATEGORIES_CONFIG_NAME, 'repo') def test_config_type_check_config_yml_dict(self): fdroidserver.common.config_type_check('config.yml', dict()) def test_config_type_check_config_yml_list(self): with self.assertRaises(TypeError): fdroidserver.common.config_type_check('config.yml', list()) def test_config_type_check_config_yml_set(self): with self.assertRaises(TypeError): fdroidserver.common.config_type_check('config.yml', set()) def test_config_type_check_config_yml_str(self): with self.assertRaises(TypeError): fdroidserver.common.config_type_check('config.yml', str()) def test_config_type_check_mirrors_list(self): fdroidserver.common.config_type_check('config/mirrors.yml', list()) def test_config_type_check_mirrors_dict(self): with self.assertRaises(TypeError): fdroidserver.common.config_type_check('config/mirrors.yml', dict()) def test_config_type_check_mirrors_set(self): with self.assertRaises(TypeError): fdroidserver.common.config_type_check('config/mirrors.yml', set()) def test_config_type_check_mirrors_str(self): with self.assertRaises(TypeError): fdroidserver.common.config_type_check('config/mirrors.yml', str()) def test_config_serverwebroot_str(self): os.chdir(self.testdir) Path('config.yml').write_text("""serverwebroot: 'foo@example.com:/var/www'""") self.assertEqual( [{'url': 'foo@example.com:/var/www/'}], fdroidserver.common.read_config()['serverwebroot'], ) def test_config_serverwebroot_list(self): os.chdir(self.testdir) Path('config.yml').write_text("""serverwebroot:\n - foo@example.com:/var/www""") self.assertEqual( [{'url': 'foo@example.com:/var/www/'}], fdroidserver.common.read_config()['serverwebroot'], ) def test_config_serverwebroot_dict(self): os.chdir(self.testdir) Path('config.yml').write_text("""serverwebroot:\n - url: 'foo@example.com:/var/www'""") self.assertEqual( [{'url': 'foo@example.com:/var/www/'}], fdroidserver.common.read_config()['serverwebroot'], ) def test_parse_mirrors_config_str(self): s = 'foo@example.com:/var/www' mirrors = ruamel.yaml.YAML(typ='safe').load("""'%s'""" % s) self.assertEqual( [{'url': s}], fdroidserver.common.parse_mirrors_config(mirrors) ) def test_parse_mirrors_config_list(self): s = 'foo@example.com:/var/www' mirrors = ruamel.yaml.YAML(typ='safe').load("""- '%s'""" % s) self.assertEqual( [{'url': s}], fdroidserver.common.parse_mirrors_config(mirrors) ) def test_parse_mirrors_config_dict(self): s = 'foo@example.com:/var/www' mirrors = ruamel.yaml.YAML(typ='safe').load("""- url: '%s'""" % s) self.assertEqual( [{'url': s}], fdroidserver.common.parse_mirrors_config(mirrors) ) APKS_WITH_JAR_SIGNATURES = ( ( 'SpeedoMeterApp.main_1.apk', '2e6b3126fb7e0db6a9d4c2a06df690620655454d6e152cf244cc9efe9787a77d', ), ( 'apk.embedded_1.apk', '764f0eaac0cdcde35023658eea865c4383ab580f9827c62fdd3daf9e654199ee', ), ( 'bad-unicode-πÇÇ现代通用字-български-عربي1.apk', '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', ), ( 'issue-1128-poc3a.apk', '1dbb8be012293e988a0820f7d455b07abd267d2c0b500fc793fcfd80141cb5ce', ), ( 'issue-1128-poc3b.apk', '1dbb8be012293e988a0820f7d455b07abd267d2c0b500fc793fcfd80141cb5ce', ), ( 'janus.apk', 'ebb0fedf1942a099b287c3db00ff732162152481abb2b6c7cbcdb2ba5894a768', ), ( 'org.bitbucket.tickytacky.mirrormirror_1.apk', 'feaa63df35b4635cf091513dfcd6d11209632555efdfc47e33b70d4e4eb5ba28', ), ( 'org.bitbucket.tickytacky.mirrormirror_2.apk', 'feaa63df35b4635cf091513dfcd6d11209632555efdfc47e33b70d4e4eb5ba28', ), ( 'org.bitbucket.tickytacky.mirrormirror_3.apk', 'feaa63df35b4635cf091513dfcd6d11209632555efdfc47e33b70d4e4eb5ba28', ), ( 'org.bitbucket.tickytacky.mirrormirror_4.apk', 'feaa63df35b4635cf091513dfcd6d11209632555efdfc47e33b70d4e4eb5ba28', ), ( 'org.dyndns.fules.ck_20.apk', '9326a2cc1a2f148202bc7837a0af3b81200bd37fd359c9e13a2296a71d342056', ), ( 'org.sajeg.fallingblocks_3.apk', '033389681f4288fdb3e72a28058c8506233ca50de75452ab6c9c76ea1ca2d70f', ), ( 'repo/com.example.test.helloworld_1.apk', 'c3a5ca5465a7585a1bda30218ae4017083605e3576867aa897d724208d99696c', ), ( 'repo/com.politedroid_3.apk', '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', ), ( 'repo/com.politedroid_4.apk', '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', ), ( 'repo/com.politedroid_5.apk', '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', ), ( 'repo/com.politedroid_6.apk', '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', ), ( 'repo/duplicate.permisssions_9999999.apk', '659e1fd284549f70d13fb02c620100e27eeea3420558cce62b0f5d4cf2b77d84', ), ( 'repo/info.zwanenburg.caffeinetile_4.apk', '51cfa5c8a743833ad89acf81cb755936876a5c8b8eca54d1ffdcec0cdca25d0e', ), ( 'repo/no.min.target.sdk_987.apk', '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', ), ( 'repo/obb.main.oldversion_1444412523.apk', '818e469465f96b704e27be2fee4c63ab9f83ddf30e7a34c7371a4728d83b0bc1', ), ( 'repo/obb.main.twoversions_1101613.apk', '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', ), ( 'repo/obb.main.twoversions_1101615.apk', '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', ), ( 'repo/obb.main.twoversions_1101617.apk', '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', ), ( 'repo/obb.mainpatch.current_1619.apk', '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', ), ( 'repo/obb.mainpatch.current_1619_another-release-key.apk', 'ce9e200667f02d96d49891a2e08a3c178870e91853d61bdd33ef5f0b54701aa5', ), ( 'repo/souch.smsbypass_9.apk', 'd3aec784b1fd71549fc22c999789122e3639895db6bd585da5835fbe3db6985c', ), ( 'repo/urzip-; Рахма́, [rɐxˈmanʲɪnəf] سيرجي_رخمانينوف 谢·.apk', '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', ), ( 'repo/v1.v2.sig_1020.apk', '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', ), ( 'urzip-release.apk', '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', ), ( 'urzip.apk', '7eabd8c15de883d1e82b5df2fd4f7f769e498078e9ad6dc901f0e96db77ceac3', ), ) APKS_WITHOUT_JAR_SIGNATURES = ( ( 'issue-1128-poc1.apk', # APK v3 Signature only '1dbb8be012293e988a0820f7d455b07abd267d2c0b500fc793fcfd80141cb5ce', ), ( 'issue-1128-poc2.apk', # APK v3 Signature only '1dbb8be012293e988a0820f7d455b07abd267d2c0b500fc793fcfd80141cb5ce', ), ( 'issue-1128-min-sdk-30-poc.apk', # APK v3 Signature only '09350d5f3460a8a0ea5cf6b68ccd296a58754f7e683ba6aa08c19be8353504f3', ), ( 'v2.only.sig_2.apk', '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', ), ) class SignerExtractionTest(unittest.TestCase): """Test extraction of the signer certificate from JARs and APKs These fingerprints can be confirmed with: apksigner verify --print-certs foo.apk | grep SHA-256 keytool -printcert -file ____.RSA """ def setUp(self): os.chdir(os.path.join(localmodule, 'tests')) self._td = mkdtemp() self.testdir = self._td.name self.apksigner = shutil.which('apksigner') self.keytool = shutil.which('keytool') def tearDown(self): self._td.cleanup() def test_get_first_signer_certificate_with_jars(self): for jar in ( 'signindex/guardianproject-v1.jar', 'signindex/guardianproject.jar', 'signindex/testy.jar', ): outdir = os.path.join(self.testdir, jar[:-4].replace('/', '_')) os.mkdir(outdir) fdroidserver.common.apk_extract_signatures(jar, outdir) certs = glob.glob(os.path.join(outdir, '*.RSA')) with open(certs[0], 'rb') as fp: self.assertEqual( fdroidserver.common.get_certificate(fp.read()), fdroidserver.common.get_first_signer_certificate(jar), ) @unittest.skip("slow and only needed when adding to APKS_WITH_JAR_SIGNATURES") def test_vs_keytool(self): unittest.skipUnless(self.keytool, 'requires keytool to run') pat = re.compile(r'[0-9A-F:]{95}') cmd = [self.keytool, '-printcert', '-jarfile'] for apk, fingerprint in APKS_WITH_JAR_SIGNATURES: o = subprocess.check_output(cmd + [apk], text=True) try: self.assertEqual( fingerprint, pat.search(o).group().replace(':', '').lower(), ) except AttributeError as e: print(e, o) @unittest.skip("slow and only needed when adding to APKS_WITH_JAR_SIGNATURES") def test_vs_apksigner(self): unittest.skipUnless(self.apksigner, 'requires apksigner to run') pat = re.compile(r'\s[0-9a-f]{64}\s') cmd = [self.apksigner, 'verify', '--print-certs'] for apk, fingerprint in APKS_WITH_JAR_SIGNATURES + APKS_WITHOUT_JAR_SIGNATURES: output = subprocess.check_output(cmd + [apk], text=True) self.assertEqual( fingerprint, pat.search(output).group().strip(), apk + " should have matching signer fingerprints", ) def test_apk_signer_fingerprint_with_v1_apks(self): for apk, fingerprint in APKS_WITH_JAR_SIGNATURES: self.assertEqual( fingerprint, fdroidserver.common.apk_signer_fingerprint(apk), f'apk_signer_fingerprint should match stored fingerprint for {apk}', ) def test_apk_signer_fingerprint_without_v1_apks(self): for apk, fingerprint in APKS_WITHOUT_JAR_SIGNATURES: self.assertEqual( fingerprint, fdroidserver.common.apk_signer_fingerprint(apk), f'apk_signer_fingerprint should match stored fingerprint for {apk}', ) def test_get_first_signer_certificate_with_unsigned_jar(self): self.assertIsNone( fdroidserver.common.get_first_signer_certificate('signindex/unsigned.jar') ) def test_apk_extract_fingerprint(self): """Test extraction of JAR signatures (does not cover APK v2+ extraction).""" for apk, fingerprint in APKS_WITH_JAR_SIGNATURES: outdir = os.path.join(self.testdir, apk[:-4].replace('/', '_')) os.mkdir(outdir) try: fdroidserver.common.apk_extract_signatures(apk, outdir) except fdroidserver.apksigcopier.APKSigCopierError: # nothing to test here when this error is thrown continue v1_certs = [str(cert) for cert in Path(outdir).glob('*.[DR]SA')] cert = fdroidserver.common.get_certificate( signature_block_file=Path(v1_certs[0]).read_bytes(), signature_file=Path(v1_certs[0][:-4] + '.SF').read_bytes(), ) self.assertEqual( fingerprint, fdroidserver.common.signer_fingerprint(cert), ) apkobject = fdroidserver.common.get_androguard_APK(apk, skip_analysis=True) v2_certs = apkobject.get_certificates_der_v2() if v2_certs: if v1_certs: self.assertEqual(len(v1_certs), len(v2_certs)) self.assertEqual( fingerprint, fdroidserver.common.signer_fingerprint(v2_certs[0]), ) v3_certs = apkobject.get_certificates_der_v3() if v3_certs: if v2_certs: self.assertEqual(len(v2_certs), len(v3_certs)) self.assertEqual( fingerprint, fdroidserver.common.signer_fingerprint(v3_certs[0]), ) class ConfigOptionsScopeTest(unittest.TestCase): """Test assumptions about variable scope for "config" and "options". The ancient architecture of config and options in fdroidserver has weird issues around unexpected scope, like there are cases where the global config is not the same as the module-level config, and more. This is about describing what is happening, it is not about documenting behaviors that are good design. The config and options handling should really be refactored into a well-known, workable Pythonic pattern. """ def setUp(self): # these are declared as None at the top of the module file fdroidserver.common.config = None fdroidserver.common.options = None def tearDown(self): fdroidserver.common.config = None fdroidserver.common.options = None if 'config' in globals(): global config del config if 'options' in globals(): global options del options def test_parse_args(self): """Test that options is properly set up at the module-level and not global.""" self.assertFalse('options' in globals()) self.assertIsNone(fdroidserver.common.options) parser = ArgumentParser() fdroidserver.common.setup_global_opts(parser) with mock.patch('sys.argv', ['$0']): o = fdroidserver.common.parse_args(parser) self.assertEqual(o, fdroidserver.common.options) # No function should set options as a global, and the global # keyword does not create the variable. global options with self.assertRaises(NameError): options self.assertFalse('options' in globals()) def test_parse_args_without_args(self): """Test that the parsing function works fine when there are no args.""" parser = ArgumentParser() fdroidserver.common.setup_global_opts(parser) with mock.patch('sys.argv', ['$0']): o = fdroidserver.common.parse_args(parser) self.assertFalse(o.verbose) def test_parse_args_with_args(self): parser = ArgumentParser() fdroidserver.common.setup_global_opts(parser) with mock.patch('sys.argv', ['$0', '-v']): o = fdroidserver.common.parse_args(parser) self.assertTrue(o.verbose) def test_get_config(self): """Show how the module-level variables are initialized.""" self.assertTrue('config' not in vars() and 'config' not in globals()) self.assertIsNone(fdroidserver.common.config) config = fdroidserver.common.read_config() self.assertIsNotNone(fdroidserver.common.config) self.assertEqual(dict, type(config)) self.assertEqual(config, fdroidserver.common.config) def test_get_config_global(self): """Test assumptions about variable scope using global keyword.""" global config self.assertTrue('config' not in vars() and 'config' not in globals()) self.assertIsNone(fdroidserver.common.config) c = fdroidserver.common.read_config() self.assertIsNotNone(fdroidserver.common.config) self.assertEqual(dict, type(c)) self.assertEqual(c, fdroidserver.common.config) self.assertTrue( 'config' not in vars() and 'config' not in globals(), "The config should not be set in the global context, only module-level.", ) if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) parser = ArgumentParser() parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(CommonTest)) unittest.main(failfast=False) ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.920383 fdroidserver-2.3a1/tests/config/0000755000175000017500000000000014620351546015417 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/config/antiFeatures.yml0000644000175000017500000000301314620351225020563 0ustar00hanshansAds: description: This app contains advertising icon: ic_antifeature_ads.xml name: Ads DisabledAlgorithm: description: This app has a weak security signature icon: ic_antifeature_disabledalgorithm.xml name: Signed Using An Unsafe Algorithm KnownVuln: description: This app contains a known security vulnerability icon: ic_antifeature_knownvuln.xml name: Known Vulnerability NSFW: description: This app contains content that should not be publicized or visible everywhere icon: ic_antifeature_nsfw.xml name: NSFW NoSourceSince: description: The source code is no longer available, no updates possible. icon: ic_antifeature_nosourcesince.xml name: Newer Source Not Available NonFreeAdd: description: This app promotes non-free add-ons icon: ic_antifeature_nonfreeadd.xml name: Non-Free Addons NonFreeAssets: description: This app contains non-free assets icon: ic_antifeature_nonfreeassets.xml name: Non-Free Assets NonFreeDep: description: This app depends on other non-free apps icon: ic_antifeature_nonfreedep.xml name: Non-Free Dependencies NonFreeNet: description: This app promotes or depends entirely on a non-changeable or non-free network service icon: ic_antifeature_nonfreenet.xml name: Non-Free Network Services Tracking: description: This app tracks and reports your activity icon: ic_antifeature_tracking.xml name: Tracking UpstreamNonFree: description: The upstream source code is not entirely Free icon: ic_antifeature_upstreamnonfree.xml name: Upstream Non-Free ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/config/categories.yml0000644000175000017500000000032014620351225020254 0ustar00hanshansTime: name: Time Development: name: Development GuardianProject: name: Guardian Project Multimedia: name: Multimedia Phone & SMS: name: Phone & SMS Security: name: Security System: name: System ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.920383 fdroidserver-2.3a1/tests/config/de/0000755000175000017500000000000014620351546016007 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/config/de/antiFeatures.yml0000644000175000017500000000316014620351225021156 0ustar00hanshansAds: description: Diese App enthält Werbung icon: ic_antifeature_ads.xml name: Werbung DisabledAlgorithm: description: Diese App hat eine schwache Sicherheitssignatur icon: ic_antifeature_disabledalgorithm.xml name: Mit einem unsicheren Algorithmus signiert KnownVuln: description: Diese App enthält eine bekannte Sicherheitslücke icon: ic_antifeature_knownvuln.xml name: Bekannte Sicherheitslücke NSFW: description: Diese App enthält Inhalte, die nicht überall veröffentlicht oder sichtbar sein sollten icon: ic_antifeature_nsfw.xml name: NSFW NoSourceSince: icon: ic_antifeature_nosourcesince.xml name: Der Quellcode ist nicht mehr erhältlich, keine Aktualisierungen möglich. NonFreeAdd: description: Diese App bewirbt nicht-quelloffene Erweiterungen icon: ic_antifeature_nonfreeadd.xml name: Nicht-quelloffene Erweiterungen NonFreeAssets: description: Diese App enthält nicht-quelloffene Bestandteile icon: ic_antifeature_nonfreeassets.xml name: Nicht-quelloffene Bestandteile NonFreeDep: description: Diese App ist abhängig von anderen nicht-quelloffenen Apps icon: ic_antifeature_nonfreedep.xml name: Nicht-quelloffene Abhängigkeiten NonFreeNet: description: Diese App bewirbt nicht-quelloffene Netzwerkdienste icon: ic_antifeature_nonfreenet.xml name: Nicht-quelloffene Netzwerkdienste Tracking: description: Diese App verfolgt und versendet Ihre Aktivitäten icon: ic_antifeature_tracking.xml name: Tracking UpstreamNonFree: description: Der Originalcode ist nicht völlig quelloffen icon: ic_antifeature_upstreamnonfree.xml name: Originalcode nicht-quelloffen ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.920383 fdroidserver-2.3a1/tests/config/fa/0000755000175000017500000000000014620351546016005 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/config/fa/antiFeatures.yml0000644000175000017500000000364414620351225021163 0ustar00hanshansAds: description: این کاره دارای تبلیغات است icon: ic_antifeature_ads.xml name: تبلیغات DisabledAlgorithm: description: این کاره، امضای امنیتی ضعیفی دارد icon: ic_antifeature_disabledalgorithm.xml name: امضا شده با الگوریتمی ناامن KnownVuln: description: این کاره، آسیب‌پذیری امنیتی شناخته‌شده‌ای دارد icon: ic_antifeature_knownvuln.xml name: آسیب‌پذیری شناخته NSFW: description: این کاره محتوایی دارد که نباید عمومی شده یا همه‌حا نمایان باشد icon: ic_antifeature_nsfw.xml name: NSFW NoSourceSince: icon: ic_antifeature_nosourcesince.xml name: کد مبدأ دیگر در دسترس نیست. به‌روز رسانی ناممکن است. NonFreeAdd: description: این کاره، افزونه‌های ناآزاد را تبلیغ می‌کند icon: ic_antifeature_nonfreeadd.xml name: افزونه‌های ناآزاد NonFreeAssets: description: این کاره دارای بخش‌های ناآزاد است icon: ic_antifeature_nonfreeassets.xml name: بخش‌های ناآزاد NonFreeDep: description: این کاره به دیگر کاره‌های ناآزاد وابسته است icon: ic_antifeature_nonfreedep.xml name: وابستگی‌های ناآزاد NonFreeNet: description: این کاره، خدمات شبکه‌های ناآزاد را ترویج می‌کند icon: ic_antifeature_nonfreenet.xml name: خدمات شبکه‌ای ناآزاد Tracking: description: این کاره، فعّالیتتان را ردیابی و گزارش می‌کند icon: ic_antifeature_tracking.xml name: ردیابی UpstreamNonFree: description: کد مبدأ بالادستی کاملاً آزاد نیست icon: ic_antifeature_upstreamnonfree.xml name: بالادست ناآزاد ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/config/ic_antifeature_ads.xml0000644000175000017500000000303414620351225021744 0ustar00hanshans ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/config/ic_antifeature_disabledalgorithm.xml0000644000175000017500000000441114620351225024653 0ustar00hanshans ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/config/ic_antifeature_knownvuln.xml0000644000175000017500000000260714620351225023243 0ustar00hanshans ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/config/ic_antifeature_nonfreeadd.xml0000644000175000017500000000346614620351225023313 0ustar00hanshans ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/config/ic_antifeature_nonfreeassets.xml0000644000175000017500000000337014620351225024057 0ustar00hanshans ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/config/ic_antifeature_nonfreedep.xml0000644000175000017500000000256414620351225023331 0ustar00hanshans ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/config/ic_antifeature_nonfreenet.xml0000644000175000017500000000573614620351225023353 0ustar00hanshans ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/config/ic_antifeature_nosourcesince.xml0000644000175000017500000000211614620351225024054 0ustar00hanshans ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/config/ic_antifeature_nsfw.xml0000644000175000017500000000154714620351225022161 0ustar00hanshans ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/config/ic_antifeature_tracking.xml0000644000175000017500000000467514620351225023013 0ustar00hanshans ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/config/ic_antifeature_upstreamnonfree.xml0000644000175000017500000000264214620351225024416 0ustar00hanshans ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.920383 fdroidserver-2.3a1/tests/config/ro/0000755000175000017500000000000014620351546016037 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/config/ro/antiFeatures.yml0000644000175000017500000000323414620351225021210 0ustar00hanshansAds: description: Aplicația conține reclamă icon: ic_antifeature_ads.xml name: Reclame DisabledAlgorithm: description: Aplicația are o semnătură slab securizată icon: ic_antifeature_disabledalgorithm.xml name: Algoritm nesigur semnătură KnownVuln: description: Aplicația conține o vulnerabilitate de securitate cunoscută icon: ic_antifeature_knownvuln.xml name: Vulnerabilitate cunoscută NSFW: description: Această aplicație conține conținut care nu ar trebui să fie făcut public sau vizibil peste tot icon: ic_antifeature_nsfw.xml name: NSFW NoSourceSince: icon: ic_antifeature_nosourcesince.xml name: Codul sursă nu mai este disponibil, nu mai există posibilitatea de a actualiza. NonFreeAdd: description: Aplicația promovează anexe ce nu sunt software liber icon: ic_antifeature_nonfreeadd.xml name: Anexe ne-libere NonFreeAssets: description: Aceasta aplicație conține resurse ce nu sunt la disponibile la liber icon: ic_antifeature_nonfreeassets.xml name: Resurse ne-libere NonFreeDep: description: Aplicația depinde de alte aplicații ce nu sunt software liber icon: ic_antifeature_nonfreedep.xml name: Dependențe ne-libere NonFreeNet: description: Aplicația promovează servicii de rețea ce nu sunt accesibile la liber icon: ic_antifeature_nonfreenet.xml name: Servicii de rețea ne-libere Tracking: description: Aplicația îți înregistrează și raportează activitatea undeva icon: ic_antifeature_tracking.xml name: Urmărire UpstreamNonFree: description: Codul sursa originar nu este în totalitatea lui software liber icon: ic_antifeature_upstreamnonfree.xml name: Surse ne-libere ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.920383 fdroidserver-2.3a1/tests/config/zh-rCN/0000755000175000017500000000000014620351546016520 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/config/zh-rCN/antiFeatures.yml0000644000175000017500000000253714620351225021676 0ustar00hanshansAds: description: 此应用包含广告 icon: ic_antifeature_ads.xml name: 广告 DisabledAlgorithm: description: 此应用的安全签名较弱 icon: ic_antifeature_disabledalgorithm.xml name: 使用不安全算法签名 KnownVuln: description: 此应用包含已知的安全漏洞 icon: ic_antifeature_knownvuln.xml name: 含有已知漏洞 NSFW: description: 此应用包含不应宣扬或随处可见的内容 icon: ic_antifeature_nsfw.xml name: NSFW NoSourceSince: icon: ic_antifeature_nosourcesince.xml name: 源代码不再可用,无法更新。 NonFreeAdd: description: 此应用推广非自由的附加组件 icon: ic_antifeature_nonfreeadd.xml name: 非自由附加组件 NonFreeAssets: description: 此应用包含非自由资源 icon: ic_antifeature_nonfreeassets.xml name: 非自由资产 NonFreeDep: description: 此应用依赖于其它非自由应用 icon: ic_antifeature_nonfreedep.xml name: 非自由依赖项 NonFreeNet: description: 此应用推广非自由的网络服务 icon: ic_antifeature_nonfreenet.xml name: 非自由网络服务 Tracking: description: 此应用会记录并报告你的活动 icon: ic_antifeature_tracking.xml name: 跟踪用户 UpstreamNonFree: description: 上游源代码不是完全自由的 icon: ic_antifeature_upstreamnonfree.xml name: 上游代码非自由 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/config.py0000644000175000017500000000222214620351225015761 0ustar00hanshans # TODO convert to config.yml! repo_url = "https://MyFirstFDroidRepo.org/fdroid/repo" repo_name = "My First F-Droid Repo Demo" repo_description = """This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid.""" archive_older = 3 archive_url = "https://f-droid.org/archive" archive_name = "My First F-Droid Archive Demo" archive_description = """ The repository of older versions of applications from the main demo repository. """ make_current_version_link = False repo_keyalias = "sova" keystore = "keystore.jks" keystorepass = "r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=" keypass = "r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=" keydname = "CN=sova, OU=F-Droid" mirrors = ( 'http://foobarfoobarfoobar.onion/fdroid', 'https://foo.bar/fdroid', ) update_stats = True install_list = 'org.adaway' uninstall_list = ('com.android.vending', 'com.facebook.orca', ) repo_key_sha256 = "f49af3f11efddf20dffd70f5e3117b9976674167adca280e6b1932a0601b26f6" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/corrupt-featureGraphic.png0000644000175000017500000154264414620351225021317 0ustar00hanshansPNG  IHDR&_+PzTXtRaw profile type exifxڭir#9sq8`7"̔ƦmJEܼw^G#Nt >?߿˟g=n|?Q +\/EO .&#cQ4^Rڹ_g?j{)5<П+ W׾!?kw{\TuM%GrWxܞWg\|mFT,py~Yb'6~ƸczӔpcK#G1mx:ZKx;й^SGׅt)pZGaesΫhHϗ{DS_%V >'^W|v_">(ܻ耯!Po1c?ǔh]zR9=޼統iF0JCf\O ͒JvZZeYS͵Z[G͖ZnZo͞zzGʨsrɥ'bWZyUW[}57y]w}=-Z2ߪ5g݆P:SO;3/X[n;յOWw-?w-|uwxKIQX́7u@GsT3?"CQ"] Eͱ|B,7c\9tΩuo5ABԧ :cq2t˄\u0vjʶ͟G.._W9ui%;z󕫅j=wja9%?&9 CB~NzCnX >+~?Ǫ [M-bA@@\Vv2DED no 6j@J.ҡra nE%ačLFO[IzZOXwA(_2<)!bߵH0S^hd;_ b`ή*z~,jDU^$cgq9ζ Xbb (u(t80cQcAF3ucb^^َvz lO -!+I!씸<a={j?p)hL7w{g9y؋͆Ũ O4!1s|$l.s& pݑ4ʗ;x)a+@^,oܮ9Y$q| 1f ߝD7lODh XMV Sa] w L֐6(](a<{~_̆Ӡ¬a#Y ξ(~2Yk:Y)`#lU`kH,l8zqQD4i|52as?vHBmջdܔ _4fqkvl^5_Xl -z6]H=bhKyVZV%6w0f'utep( 0xŢ%6daI:Ծ4gEr!Xþ6d9BBf\&@Kȇ+6t&Mxm۠&Z ۠|yc|2oA“+L /`* hɠ{62 pg!= c"#Zpͼ6XAC2fPSzNPA`ӌ&J6oBhbXx ۅh1Ā6$(vg,^Goޢ"a!$@ ÷!bo?b:g! x!DFnH$"b8ȕG2$4 xX,1r;; ]}>r| TWl-_&MJ%i6c5ѰL[@x:0)Dnx=p0lԠpXb %B!'z[ 0!܌Bx0= IV6[!q2gGٶL 2.:;Cc`6yZZFIN2PI;<ka^0qUPHP;(zT`SpYIva0灙EDŽT4%+WV1WM`˲zN(:52z#lM8,Mh9KwV5观or5s$,eG}"If-Q$#9>tҔ᱂1/bu(FZZ|$2 \!oE,1ģSn CYS`lBo%FO;v;M:@%/:6*m mFv97apd2pj EMkdJAXx: kA6Ne( 2SbSH<2q`NYS2ޛ=C%AC\D^UJe0P<{E0>ȁ/m5ؐ FhLOg__jI ^02:2>%(\u yKG!!4b3" Bw127OtP+Ղel8*7 ț)ĩyvrbׇ@jE:*7'+XV,S~]43Q, HnU`AYqh7b? w:Ol Cb:L @^0-jYRV\s'lXT@ aΑD"*Q qi;:Կc5CMIl6JR CA$铪TN di?9#=1r$ϑ@n&\eMA_|"~#/6 2Ԑ {0)H9 eO4~hA_iy'Z렽doG:WF!315_VQZz묓ŤW?*nF6%ǜgP\?-1>ArL^TwM^m `!'U Qlx1ǰ(_^ /HcaPG^'sEmb[gkC m:#IC6͇}:mq& ,YG(5!?X1q2" 3LQ_g[N>j$2'к*!\FLEs A|n|>O h!rUfd)c Cpya~gּ>xqTX|^Q:kTA&pq>1n =Ç>&3"dFs=vR01Gf⾄)e:5:J!mV)vr2&lyBXZI:9V)2QґaE#,ڹĽ%E-l~l"VG QDE,$4僊q?ov˧pCM=:P9 ҀgϾ߆Lzn`DgӎC)%.v8]}li5JDD4%J:ĮIjxk%/} I*|B0LʄlzFRǑM&m{0Xx~Y5-E 8;Hq[Vմ|Em5Ѻh,JE ~DIn_Vk-z5%&M79ڨ>Ǩ#CyKaSnҳ8 JFI^4p;חpھL&hIQCg#hzwaa:w!K{0=99+~T:rJΛēi4 H]&⚇;pymBg< V'M&M4=&ܭHAԨy*%Vpy]`OGOC-qǞb).6,5z>apn%-nkΉT6.Tqׂ4>0n-1Zy jtw IUyZ;[ e$㯷JiIȏ[Η֮oOW3[yHFPbj^!.~ S1mo^ic@U&L¸ڧ OZME*6aO`5CcQZ1܌UE݉&v"4ۈGqa%P&n;2[M>] I$ܭHU,J6ZQxO+Y5X]u4k~XɦQ}#_tg󣕅 IOF&i+M&i Ua\cU/;E]S?vs1SPV1ҵu$s)1I&MRCfM75VMlBiM0 GA*o i8ݔni#q$ŔM 6핮fXS7AZY6> cxzFU,/ֺfjS'ʝWbmv^;$Q/k/jȁ #ckyXf=I95 IrI$)'8.HeuJ@Q\|;ʀi~ZCdI&M M&if¸i7Кa4WI&W,Lu^ wqL i$oB'lMJs'SdI2}kmWeS {g55LByjWB+jhLu5ZԞl#& thܣ2k+ՙMmgqF!֧2 ھIlCR+%c5n"ou.'OB}03Qc&N~ sb+2t.(g.iUg>F]1y5Ʃ:V>T,aOIzʭLyG+ TCtm!=N9" ;|V+&V `#`#UUE[}fae-##؍@>B唫ly,!Ko=ѣZkcԳ1&fuP35_[xje$1Ȋ:Ÿ́RJI4&?tG!:Ew$r5D#x+JBYw:*h% vhv/n$C_8 HTz&8,$ 0C @b,4 65Vڽg\;MgʄO-EI^}W~/צެđ)Uܦ ְQ{ntYO\rLg !QQKF{۞pw!}3~~BnHi=vlV?g-̗u𖍁oG[3w<'sÎMvl`NPHڑ v-NOu|N=BeԗѷG9 !Z2bg,7W]Cjz|-W iRvlKulω\^MA]%P"+yjS0;5I d{9)&ʇVE̒jo~~'#*Q֧e ܑIW29k944{3ȵ{f%+~+ّȱ#"kfЗn4$Ւdl#i%(IY[}C+bTk|<1jics 2Ameo|{B?ӥP 9ljZ|'ve@N sR@Y[HAu m`<,r_1댘j,YOI!>tf f Um6;"CFw;Ez|`ZJ]l#{S1/>M/Tmշi93Vr ) اj _ο_o۳.FiU >nz-wv@}I+Qrt5Qw=AjhrZQZ{+T$2:h^_#D;Z Y p/'EA 2$I ˪}k%z bž7ZA%foϮX"{2nYs8'g&fhWcjJ%/Hxs@찅i[ X5g.>Kgm!FNƼ{!=/CPl˛d ʢ"O}tݳu?ž\*ˠ,3P",S$knPgm&/c!W"avX ` [N%\|Ew C '!wB [<>oI~Y>B䁳yĉPH. LiA qإ2j,&nkVv5A,/_>prc, Ku2PSa.^R)dPZkr 2&{ F٬zpxDT JiJĩ#i]mrPuZeQ{s5jHV$0)&kÔ,r}-O +r'y\=+$} XgnwZNN,Bϟp/KziV1Y zR%EFNA_v0*ryؾ.&)ų%;/ec=*6_ܽ TEjBI۪!ՉltN)@WQs, EUGvJE-Z{jظ4UQ1tƪSm5p뇶9 R}-Oz,B8pW *o1-CLKUejTȃ@p,L5૜%v 5u@zs/HʞFX69U]U 2U:"MǒZ9̼Vq6>ҶsJm2|z9\^NhRnLmWxŃCljN7g|8En‡_B#x]u~$gy(5I4P@@pr TgA `/DHoͧݞzʶjh1K7]@c7E<*33\\ QH u2PuGv2GkhAem !@9T:D,ŃBWP1ciTt2^徱u1}9K%o_K僗M0D Y0/R/G?d\(%% 2SπDU|6HA!E-e k5f U܂}QE >|!8^:" Ye`MG^6S_UHuz 7iCCPsRGB IEC61966-2.1HwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~;xbKGDC pHYs.#.#x?vtIME ,= IDATxڔY$I$p'•p<*0DbW1TȐ|"3>9bbFDF"""| \"ϯ~ DFgy]F9g|ΟO1F FD Ϝ;`@x>g> 1>_?'֛BϵԾzw/2g+;{wF<}̌9 z) cƌ#_~ES?w9>赟tgsGgkgF1F1wﱖs}w-?~8^kran;?{s]<_̳ݷNi>Yss=Ik(3hY}Y!c=o]X`]/XM8ɹ{-Ɏol}&{MFDo &z|g[]u%]ﱿ~象siW{|~lo>ޟ2KqUk3|Ǡtfk=~G׌ayS&ҽqy}ߟsw=[8k3"5泟θ5uf}j]A떌\3GU?D qYw5Wo}&.[3?gSĽA5IA brEkD !3?g#ue;>Z yjĔڪ.!/RsF#\~ P]GRP|+X=+Hg3םrٽG6mv+& g?FLy*sng6vTO5YsF<k~scWk]['0=0ĔZ,{}\>oCɌӍH뼫m{ x>q;g0}\jD`U~?>/s0bJї|O@e"_fjĔB^0M]ܴ ܅m.?cύ8=w4&%Va8~<HyZλS~v bWG{dʡ^7;虔g/Udk)O|HCl}o͓4n@Z3{3sb*9͉4nMiFP{4v֡TzB8#G|ͱE{n3~-:kjn!= q6㮖6>(}~k x4fE"mH`B * =ؾT{[f"dҽ'x;uߧ5^(^W<^,"3x5൸qV {sYѱ(3n#"lDž#KF{3seHSt_[xBLbqפ@^u"8S_dj,HYwVRjq_1z{{6L[HA`~a?{ru}.Lސ~{ͺkc5,v}Ww}Sк5djĊ(~!;4JZC0fp+eF.A@mW=ȵ3)ޤԯwé\:gv]Ry6<E}R`T9?~0qPKc5Og2yݧ`?v6g2 (B!{b<ړ9em` w ܈g&L§I #P2 P`g;ȎtɣMXe^gl*EmNv'p,ۛRRcBj9OH#F9ÝE *LYC gjV0^wByQŽ6=ߦ5lyavg63@y]{A|F* &8^Lb0<˰ ~~ؤ> >߽2qa]>@W^;Ƈ' cV1SnÇy3dz^&F H{߀5?oӏ rPqh_ꠔSx5@.:`0409aͧP&)C9'4A2:f@E 4 *DweQj9f;%5yc^˘[Lm#@Fwid;uF2 Ij:ʸL}Nea¦wV@[孋ٯ>HҦ|伎,V2YZZ} 4;x^ !Pe3.*'1:~c+  |@g(c0 yYy74@)Y6|*ca^%x_w2ާ5?,uKc :e DJ70f65հܹ#WG/'Tpy!y1pYCoY`aTSbY!NA!H|ȴoa9OP+uRbD8Hi((84/pcJBjבZ%*'B,j }dщz"S&]; 3jN ? eQUqd$#FT&> Ia9ϋ(ŏOFo?#~r?į_3~cQLYQ pP,0U3ߵHqm\ 5ڏ#=^nt \"u~;.y2mI6_Q戹\Z):{yl?@`y7U8!g chy(ާ8{7ӢW*h_$P;SIpoAy'=H PAQ a(jH0Pw]Eb7wr>TMawp1,@-R9U!2-Ou4zp\t'\@,ӂA[D^ \HU` 2[w¬B?>q ;} vk>c5s{Sk a7b `]ߧٚ 64YH@* JX[A?V+\!x9L4 v]` HK޸Un:) _vOK̉Xru/ՍI*{y"^]'AsD|ػ2#"qXBY)n9 PtXc;P}wc43are5xt_GJ Ohde>:X<Ѵn>|pn|A~ m4T.ܳǯ?) ^p;Y 1 &gqmB7m>E?ޔX卂Srzs4̜etVzRP''-np] 敧 Ϧd@ra e)#S_*BRFFN332~Wįߓ)i2QdVV toQ0}~_1iJsi*<|0smГ5ЌY,ϊ<y?7'oISi 1exϾ'+aTezM֋xiN7Opg7q4dw!A FStHh.M*Ta}J6era F 8pĀd-LwY#IO*;^Ee0M q|>Dx]L'ҙ2>h(9'Out(yt&O76@7EJ`|z D{ݳ,bSBG>S{j]YwA2XQ l_>'ʐ6HږaXwCLj)y(2ۦ-91(LYqaB&ʂf*#5v6bJ'\0^gy^KޕK4`O&op8U>cLJ!_d[@0oa׽{$PpfZM%A pCXC\u'aN"Ӄ2ӶլHe@qo||HL6PueϠio~>+alH׉CӼ.D?’>L#hO1"rlTf$^-+9a?t˛w1&32t C[eBl33On\kip兎a B Ps>5|(ϩņsA.p ʪZPL4)Ii/WGψFk?f+{ėT1&M%0uMXA6G9pY22 M2#cB NS0YU^.K>N423J*ETz-ʧb4lL3]6N汪$a B,f{žUÚRmXzsPgLf}Ǒs= *- =C> f/ix_Aʀ 1˼ ɞ‡>Ve%z򺐕ʬij5RϹze%MA,sց+mbd:"iBGNS&ᬯҨhuhD 'NXF]:Ȳ  ^#6 {vfJ)zD3Qh942Dʬ*fpWX ξ ,z `>5#sZ4^4T{D =w(؋*m '2L~1lЛK :1цz\u(L>C=G,EsJ=t3jfu %H2{ _GhÔÄv0ܹ?-|nއؗTxPEU`)t6&5 k{NPQ&M9YL̒4ti(r&N ʠhv[10;0~ tt&t`m>\Fxj*n(1jg$u!š WGx"ixGFo] d3ILP0ⅆ↜Q$ iQ'}iQX8¼IicŅ`ӑ^H{.J3JCLС Mr16>f jt&]ǃy@_=4a9U< lԔ1MyK4Q&)R 7m!h@< !KCW!Y?ΖC=49T=D`j@:[eR9AzSafx7COSBs P7)5#Ŧ ){]zB5>GOL1D&)MzqU `s?f55tjNI@ffI;`ʁ49Z{"I;]%ӽ'1#b¸!VTSh-Ks~45-׳6djNa=7^) Ǧ԰%9gV\Dk#L~02D=[΀nK̰Cnaif|F?,2=k|HjWwkgF'@TxH`JF1;sgԽ8z H=Le҈ԐҞO=0򏢞 J/ ilS4 D h|b05Z@'QԘDiQBC'/W,_TEiT7l+E1Q:ql|a,Qd|C ,g/vȄa:9љpy s]8#??#_~wįòQs ;R @u7$d uk6F$tft9%Y ԢN^;I; 2۵Q]cQZfy'YX7 (1nyP\ e= JSSZP>F_9>3j$wF4 C BёchzS%Q!&(U:k"qy1x6@\C:MaEW}s݋9)LJM%4rR>|p7n[ R  'v3uGox-3/lL}EAb 1YFĖ9aO=6D[u4g~k`V#1&q9yz^MFmhe@5{ȧF X)KWi65$Z{F_6#"L-f(#@u/Z+IҒ:ʐ# 9kTvnY»(]pL/ȃ$;ub[h @TCI"zF#INC覝L$ɕsLX:}9ДfT4Mu^$i_.W{E/:i&qs3TX|gȴ$ox"3)4Q΋u'#" qWtq-cXJ_a{4)m]dS R])plA3-J~2ϯ#Ks>I)eZ|nZs5ĬHrdܩ,4˪1ۈ~)Ig1~h g׷}Źq E˨zBGejDm` !O0?D T /W@~4oV'FQpj90@n 4f:d H}3x" 7R3E{>GO$-(ʟeFMvՒ IDATk:L>ytp9cS4Eƙ]PȷI`=Zr3%o3Ӓ$P"Qē̞XNPM9aƕy ]*(1RU3OlmI+6(%|*uWt5Daϑy6ņxTf?GeKP$zj˻g0 1kN<#=>$ w3{똞WA|2g8QI~[ hT/SgwfvDzBHxGzzsTeCωmr6Ytf&YhWSXx@=n};ޖ1O3(O[q84%9?5H M5>HSn2|;sIyEo4q2=f sI"b?ixAS[0Y:)hFÔZzE奈7ȲxR5vf<6>#<}uć&_y1+?^ɑL'RL$|Z4hZCfpS͖r" SUis1j"o#Cp3I W!dwk$Of">~#~7zsu3@/ Se))k.1՘u*~H<%7r^aU7Z {Uj$h[oXaLӸ tħ>l,%-eQvκރv$E:ȓbb5%ݑ|>\#Slm?N!:PȦ T9zL:=T:)ipTFBFz[hS6Zs}H47Hc@:E%V0*CJ 5 j f"~9VrV$ԑ홣ώqD1! Ev?B1ɚ{y)l~OČ".5'i# Q芣4ımS"35M'1Z@5tІ4t3hLCȍQJDQ믊IS<|=ǒI2|o^f]t4#G|Yl̀Цjl)=JJH1IPs7~+RМaȨiµs@'%P9]Z%]Կ¢1mr*߯24;lXaKR(lʱ2}pg16$ն&+P˃9O3{K {pLϥ  a:w?@"#*^"_> WChCj+C*QSr ̻Pv#B"lrP-\wIn#91b!q1h&a#$gC0{ġ>4>#Dֶ/Ks^X#xr QJ"m]š);^栣HRz'M:L Wi_KV,:.lii]YetMCOTq s~Cl c%xZ<,di- t$YyNAz2󙵯 pS0P}Qgim+ Y0ѧVp?2y n=UZ@+mFEw gE_j&4B0*{4e*l\X6'5m|Vl4׍O]|@M#M|bEgFbq2e{4>"0l3x*C#3%ͮҨ7,UȞGB/:B֓^u2.=ƉcygA`7̍FTV)P"Nlf30,%MUa3d3רHa>'Qt ~ɇy yFU4'?IR"w[R%Khe+ 6rH J6Mi@HF6h 'b Iw0Tgi@}x!NsE۔K,fj4"vS EsM)$9Lx I$_-m_e7G2lPV"{`dcNھjg)EV^9ItnjoԒUO KE)LGɌ_Zf$3:DkR9O&Z@yc,0[~0V*zMt1MLR"։(t2:E^)!UJYM`SP# !8'1\zjڴ9+pF?EʻYI u{[ 0!H mk;tKY; BYEPJB/xR+ŜimNCU883Ƚ _31T.;U&L4C,jQ'"%dVͥ) l [szP|0L\hɈrkZTVL/hLo \-bLU t{#*'qY)LKx6/0qԞJ -kFCN~@ӟ=ӘfzV~0S VlAs ^5T#O7Gs0~7IS%aa{%q8?cF*DQSt̥D{2A1tp ZZL|1wO2R)Q@6iW4D&i?Cc넩HiL'lMJwş*"$-DV jfg湒uQćA"'N|2OBӧ4]@AZ=ʵtq7n 6Y7ځ9gOZ,:2G>Zy1H=,;v ;ŇDuegώbF oca,=ݙ2"CWfEZ`Xb d5ND3m=,~0s\AN#+'Gb.$=,:[SYw5M6ʰ1䥴PQx[ A3O#h-R U0MwM̑lP Y5\!C+ll+Y_x\bL|;UZD"!H _WCA m"Zß5pGt&wك+Q&!?P׃F9Mn2x35_1>|O*XxC&ʔ:圢j=ZPlf7K>s s7q$)U56'E`jШLA4{/=bќU2#ڰaK]smU:Б +Yv3[D٫l~ner)ϢsȴzzrܧÞls +'ƂB76Q)F^A5!oAٸWN7)T[eP#~.g93/ko5iRI4g,&Gi;O|Ɏ#A'U(Nڥ5.9*c##K47L=ZEϰHćRZgؿ7'@š_X3B%Z:zXk/ ԺO<2Lہ[tnBŮ^C':7r+_|XbHd45V9N6SatܙW~lFhӈxP6NJuJ zӨ"y3IÚ7kFr  vQy&X0z(=|˛yя$xq^]=sfzӌ 3nZ> ^K46m 2 HcKݎ:8SZJ|6h~y? >N5/2;hSjEqNx2XFZ <0u܍Y!* ѾaVgAZlڜ^tVro4ީcx?"WƀL=s1|#XP4{lٔ)=g{`T5ǜ69ZGC﯆&"OS$~ -y&MS/\{;3  ٭ }#Yk)O# |D7u@Z\ i$ɺ21 #Wh70waW #p !)n ۏ=Q@)`(+OևeÄ\D1lq&-4!> =* ,Ce2 C%UR E]G7Gc+bʯTPFa $4MC %6%3$[ZFeaϚ-Y63ڼK6- %Ip_8Áۦ 4EsahKV1|~g uML|Rn`Yo>^pZ ?n>aLm&yW۟N`|϶%ؚ:ˊwsi.I&wIxj2 oH=Yf(?D7ja!Xnlc͛Nb:ʾ=.;t_*h Qԩ0h20?x_Ui |&ǓA\:w $ye5'SCsFdu0:ʎe`M&WYY ;fQ5ۭH) SX ug]1o`#hBr a7/׽1$x9E־q"f.-xٯu9Fk]E45B{{3y~?t5JsWF e_FvR SO39gS-2Ly]a.4<:G}Z/j 69'I>>{@͂1#ezn?S Cf<C"Sg@%o8 =)&h2zlLH, ̰X}e݈;ݫqv,R9<;&GpƐuga ,.F$0`%*CQt*ϑ\#ʚP[\jJ ŸHrϘ>b N:RYbA&kҙrpsmM IDAT_vM[ґV3VFLf#>'R2冃5vSn]gR.bMT3 6A4=RA{NCнTDN:$C5YޝpΘ+VdDf;WCs I4Fqr6Ȅfw:3K61{cMp5sS#dxob4zКY7O"S9~Xtn.:!sҙImo$c{]C'N>Ph[hR^\>a'򿥂эi6#k>J$*[QF\fjA9"T vB?ZꍆD#Þ=Q@K%yRx=1 B|ɵu=iIVCYA$7/Ԩ`rjM_1YtZp1l3H~ݼ1w2&>` Hn$KнO`J>c ))j#E)=ːD*HR;T"VYfApiMQ##r_v85%}I:+tNͩ7)) 9E%kU)ب]0>>tZ>cH6hf }/QD}l8 [㠕)?@5PZoɔS|f/RΈ{4%H|x {4qa\˃6KmxF@S8:EI&nCD!q M>:Z7UgU2w)}SMw`k%Eۿ?c3EShhІFJ; A,_f4ỌtWS[L~Kt!{4m 㺺iT\@!;ihx$kj ީ'צn9-nKEEqYѫMIor5TMwIhr:\qȤW#\w7>՟9Dc*)s5G@Y!nl jeE=R\Mw;`Ygŵ }&=[ zS\n`;{GVJS1# $n5B2-0n+mi Kԭԏ)@ };?.$h31+6V[r{F׽Y\+._> 9utKޭx1$\5t1ENa5b[rJL {ju}|S|N|*Bit(jvBaRjsG `q:|)z*S1VA.@1@YVBlw~~mSz@ <;Ո큫JΪ՛yp"ZD-BC`duydG͚WtiS H E n;YAd`"n,auS'\?9~NlTCAܼRXs(###~~F5DМ~ϥS),lr_sNPa&LW$8(BvANl.ufK5xbT>gz I4׉( -?N}Z %4{v,4lRpzC2fv';[]YnY% DDcq'a_^sk5h-fڛ "iyم9\̸R*fL'$tCBK|jϤ`tuP*Rw 7*``i"0VܨNL^ "O^"YnnSA6 y>c˧:OEWUPNBbsMMpϚ=-״qM75f\Hz cdNJ>L'7,xU Z3 C49 iu2Z d2Ŀ~g,0sR]>Ys;fVj'4OjLKZ ۫Oo@R[N4 NPis7y \݆k| Sc̒9Ԭk|__1# +F&%euF@aYE{+$.Wl5i n[^ׇ֭)kc*FMnn;4D a瑛@lb <{4A_k;Hs\.pՄ03D>M@o3nIQ6c ]هv[Jfƈ˜P*He DwqFɭ H4֏ezc`?䥒.#)aekꥂVb%u"o{51#g a<<& he~)=7 _l,ƻ ENdg3Ֆu,zm%88*s9YALFdias؃v:,c$i1BƼCKRFhT0yҵ,cmr*feItW›PcsdaTQ$3q+$625f6tB=L] `n'K ZIF1 |ś>c()*眧pn )%3-4'pPa͆4fhdMpfW6x'FR\?A&C'o0++SV2MN/q5:le (oPMbT Qo/M2 bZrp 1qxAgo|;~_㉈7 QC4,l9q.R6bmdjNT/U}欇07iT$}I{)G)M@Ǟ`_<&ȳiF.' MJ72|"ӀU>w~s4Ir z, d5.ݺg6F= 4Q- e tlju$loV؜AtdK lX' 7u U  LZbZNg?7UF哞_:TFyƚ!+}Wj4ejFg , (FdĪ=#ӂK ۿgaThq=p< R:Hwo|лܢEPk>CX rw|;ߕ3e7OY YNṆNmmӻSڹb/G0KvdSbso^JtMItʠ=gۛb)B69jf4"vw; ޱV@ogx|tmnF_9Оm.c,Дe̸:EڞמB)Df )QIm39Eq7f=49MJ1H3./ަGϑ1[S1DĞԐuVj.Ֆ| {PBy7!%odtP#I){.?]w!J~ri@9Ih ڒ\$YR"foqo;,cj0*w3/S=1S_/Yl]4pd]oƒqjG,hV(Pz bK' bޠE7,h2Ժ/I]]Cs{Y -$0v TYΚW֌W]Xc_> ?2%k\* ]55c}Po)[|wG8;2.rƥ ns{^5Y*q ?(zBw%lC@1ªZt9-M9%EHېt3dԨ6j"iF4VQ9h+79;ƈcSTx.d`nZ3*Y`H'OR6k yn ٭SɈNWW.VyL;ZQ7D.0p ?3=gn3)F''}nqq>+ToΤ>,YGSM7;l%giͩ ?&be?>P1aX< x KdtPnfmhdX>5 K&)^ Sh&0jv@ͨp&w1Dk+:HICO5Nt#< Tf#eR 4{N ̆GKroeAEPuy3%PiORwFo<P߰{D GLt'p\#B6.$㿙[y|kHb8 #gxto}߆58_1CϦj~0/C fѸ YlrHurY5}~ϯ'Yw:w$<#yǔ6CB'0sc¤y׹>@60 RKf0"J2>/T7h.Kx= 4i>muwҼr C  V?t&bݐamPg]g>_1't4˚JyyB_A- AX?Fmwr\Ѡ4 ȱ\T7>L=bK(j'ei,䒯9"b%*k-q5>c5#>Ikh 0uiZl`ú Ng){5a6hj %v:=@S^-̅IbcߓS&-i3  n>r2-7<i!n"";xe J/z!2a|*DFs*=T 8bw9H%V?4jas?t%Nsnݨw{U>CM#bI5)-Kё%)N| 2IT68ɛ6 nvB LUy 7CM R.;;ԌR0Ѓ aF; @p~egyu!__A1;}2f5/20}dC_xL,AoߝӔz-bq&T4ԡ÷ X*ޑt ?/uq' pΌ0ad|aD0cwk<@iI:2E:ZI LȞRQPJ5-ء!"?N[jhQtÄ3l2G8?@NfZDq+nV'eCMF_q)B5c22CaX-v5=q]D(uD%7~i8/\"(]T,51~{)tVG`22~bD~Oݗ&q4c$0-A /4x. #Bt=:EFM)]WR'noA~3(|)uhnu9w2s;.Fh ޷n$z5U2}g)e}# A 3=LgC?"D֠je~r)=7SfPĵe>m4T֤J;mu^)TH, [Nh=H*'[4n8oߛL@,۬@s+@G^1s@.hajĀ,1b>fTj~sΚeX}3uOs MKTc|)JF`)FMɻ̚tjqeE|ϡ (Bl&iR}[Ж#/vT3LMrcw/qҬ7\aI5ٛAui0r R 6 |L~27gn89LC##6GYlBl{5udžun8 4{-*8YKqzΌo"yl1,x ޳!SIp3Ⱦ7)Pij)3Itmt`)W3*f8bHIT{q̴;{*I9/ 2(S&goLblWnYH_<14 2LA+RLMVgWU~uAc.KmgƇL)>:i-I M9'Fzl`'d9bȍvHQd @bjG8OdNl,4;)%$ʠKVآjg_w. [ВI|ɷ=%lӔqMκˏbey*;l2v nN) 5nzE:PʚK3D(! IDAT8M9Jc5Kk ZH3x3RRIb^SjӜb,mfH)IW fAc'}g0O+!/E,}|_yxiS`G[h-1` 0')JoFu024 604%KD5z{fvÎX$jSI4 -1"1mß=ܘsP 8uF@(dP7D+pp`(Kʃy j.K\4FzЅ` r32pP[ I?1c8mi&b!v?--:: m&, @TSMe֠)IT DF5cOV{cg d|wH%#2Թ49 &XK%gcFt~K=Fr L=J @ >q3QV( ~u@,traɥ?3I*"&*B݈ hлn J2[jw>y1TlL0s[އrJe'O;!}Wǝd1nqXmgSl&Bĝ(#_ 2iryLL3/.SόQCF՞N3)Ssdxt= l}2N#zgmidDa kkJ6FsîIsl)i .REę $ ߉l'HSNPMYu(AH^5?@$M\!Pv"431)b FsANPzGC<7L%RKx[,"F/ߴF!f ۓ &n.{VLKI:K`t4+➫;j* kB/hl)` >u>ŅǓ)t6OXO7uPgqbwUtMcT="ϳKvotg)Z֞>$ kL)@&cMy7̽'ԯFSKj}ʱ)]lcp=e'3_3לDxbRPsgn/l4,] RjxE7EAy){n\<ħ3,s\c> jM^(44XPpdQ?{oUc͖rjf/i )34F1S$xiٿ<&W#?=\V~'Q,#0\Ϻ AXQzcb1#9wJE bjКES\Rw'J]_Kބ@ CeAI&l.'={4Tĕndvok yOz>xk3M fZMvV.sg1u.̎iڤn&Ǭ4&:?Tcj䕹=)I=2ShG##gͦnjԣ&[8D4D7v|${/}%vBy%'3@i>rpNPXf:FL3U?A˾0 "?ٙL VėS|%M͋LIKP4;ጇ9DM,:>S`}I`.AƖ491 3n:li.T cuച&gPp:fofQ瞧OZ*gt qH&9.MVX14>\!uF;5|{2E:V[Y&37jxa&j"PgP1:58*emS&8.p&4a:VècaSř霕c-\Y n529x.q`@4 q  >2ń7cD|wr>)kSyjYnn^IfiA#YCN^DB^x~#}nYDuOP"h UJ-2n9uaA)rRi(?;g9 sM +Vq'L[̥x[/7cgrJ$U^*w"b|~$7%3< fBOF-=UMKA%C&<|E~~~i!>4n~Aîavt8!➞oOڔ 3mX΢)w͊DS߁} O*b Ivk&kԨh OD"&Ҵ}VM`5YȒ2T qx%Axa`=K[g\q՟PY9iCpMLChMQ NJ`ncF{fPcO 9to\c ބݯb66I5zH_[OƪܞS` {Mg3{Rg܄7tk&:Mϱ$9 Ԇe01ْ丒HGG+юp ~03 93]Y7#I>O.(^s(XWI()^9(EI*k_2\}oOqe쀃BRU@M?8 .]pƥD,mVմ~{6C?O)Ԭ`odI_ lDs>.8`v`njJ b4 B/RʵoDPzSsPHa)ڝٖ垡P߼F=qXо.eYve؍ Oy\<J̔dSQuٮpȹdD 3 8w'/R@9b4 #OUYi7>t,%ZJt朿};f!cN_tie@ghHKyzB4/QCfɫly l^l|bT0G1FX# ӜbbP>7,GWFFwǻ<KX>~sRY] Z+;"$B X8E@3&:O-%0*=b͇eJϳy%RVoHfWo6Q\w|Eao";ce;/q;s8/8ًj/4JR&uw[Osl[xa"m@y8`d/ MBl!w^c*r-c\mi G@ncA*/9|xy d6T ^ԚjfN(ipKh8d@[<̤|ܗn˹, sl_ .7Wzr/C7|5 ^mFP'C_R?'Sb\} ~?5H0fab4>09gZy ̵"71y[}%$O2v;D\1u ˠbWIG]aI/F3/ilGGDjyCʙdOY@Tm~ENFnui $߼L6 |bE~22FW߈o~߄R{~XK`T bHON9ߊuXP^eYI( ó$/UXZ^w jq9(+t)6SՄlR@/aֈ[X u?wAWѡrP^5axu@)3 5A+Et}_w_0wqZ`SnxDUOy.Ф>\<9^+0Տb%WԨ S%MC:R<2b"8rUؓ_$ f l8('C$%|o莳N W{$Y%+Y]*[=$ɂ:^m!DêD%$\*koA&6-!gV)PnMtȉ-Kǃyz6A+F`)7Ya\ :"7xIDRhȥ@!86-iʌޔ&& vZs%j/BCd(JKg * ,Iy.:{@Wp4S ck!g+-Bb7Ujd镭. _YI~~l h$:Q{Ûuϻ|e>;ˈh縿kזSIײy^5*{rwl;7@֧%w)Z5( D9).nYTLC$4Ӛ$ޟn$Y&R\HM,=y%!˾GL9Rx? Rz{{€Wjt2Bnm:KLgc%@W֛Asee: |Z֫z@)!o[ +%H6VQ;؜iLo|*f8!9/eH (6YFnbQMNmmi_v7g@%2AǀjJhX(0 4wIBIIVꟹUg o|v!9 dkdpWQ͎P?iI\VDm:6 Iy.G2%O*Ӻm΋RiMaHc %SZfY HQ~p ) Rԭ{'e3׼FHJ4{ްrVf%g.@|. Bn]aȸ/snks83A^5yrZ,K-gZ+Jj^ګ!eo$ N lfY;M:GgqK%ۄC92زν^ylSPU??OD,@hu9e׷0!zC*uև ="PZ9re.aCqJWI9s| %΋JBÎD2AN~SOVmax}NJJ> 51$aZF#0ngQV;U}zY QCny#UE2{ =RkY`/5ݠ*A||^j\rNg;\)ds&x<*eɺAv8UPOnCKKTJ3f|'/=(<#R{x_ɌbJ8esG9 \!KocsLAMuVgfei1Tt_wA 4e@>gmUSԽUi-d\a.UU-Lxia[u, |cPsg_jo;R;:KXb.egi b'n"x>ޙ*\]y#6Ty8ʊhg!<̺N,@oWREgmpg ^<}^,U6)k5k!S~rly'TdWƙD٬lw־$t`&a%]Rɗb{%]m ] 0CzOٻ}c"WOD?u6tWZThHRc`\E -P=grGq} V~ e}0I |ψ1HNe\Qgby%IA$NfdSCW( p71]=\6MQLJV/gEU(jB>ܴ^Dm`bJs]0?le2E5՝W9 (]X;_] *E3nqzX6gL[gnZ¦MR#Dl!?S;Ն' NA$MR96 4dB+5TWE6eF 3Y)7ϟ\m M)*P@C\Em0|&MaXpy߳hIS@tK7H% ﲗx6HKv>j6oi6K/#z%X(Q4g\zV;k *6[K,RQ+Ob$I%UZ )?"J>2x/Q JT`낕ROQ ^?3WK/0TzvR*{D>U9_1 }?>d,g>$J6?Lm. a*yˆdC04& $-m5& "3  -D 5.rH^͉! Yoy,w?~PIŝP]OvI^| y$Q)oU&& `icY'}tdߜ^;++#Nglg%sȂb; 2MBT@$Y]eʷ$~&;$n{_nU:³ۅXa|"-|||!K@U:jWZ=#m4$q:u%*t.kB%'+ٓP cpnCiw+uɬ (>fR'ͭ⭆\ 9.E#=y#d)aKXty%aYx`4m BN -g?$x{XtV:~c{gmsϘ+5B,.lS;"pWc];f8WtsHuUYI9~=kR~/k׏mgX9,UМjQJU$F*ݻ^4gQfb;,/(tU]wNʣ ED|iz>ݝQ\ ҆*^C=F,c"U@,ԥZUsK8=UT ?.jHPxf/Cz>4 #|sB,NO }>{]f3Vu (PJI>H'ĹTI:̏t{5p@YpMas2@a~8ށ|qVoʉ30&5 2+6koZ#L}OH\ s.y/2VP6CF^c/'Pte$@lk ?z^{Ȟg^VD|^& {^kRf%EKLR5?Xlo|B$퇅ɹ 3#E0ċ+/n˦Ps kUɯНtm 4Ӑ2$IOH.z.޳ʿ)(sI 8Tb.ϫ8>8>@ʕ)삅I;@UU*C/tImy`տ)g lIgfI*e>(d'x=>j7%<ޝ3О0ZQ%M?AyEuRTa8Km ]h-a%fI|Jɔ Ӏ*nmiե̛C!@Qsk]N<,T-(̂*aK²,7"]"G>E}>mɋvK`GXبRbiN!>4Nvb=W9w"UOPWY: w?dP,lj0&z4OVQ&f"4-_2+r6sRR!{ <5'4`@=h?(_70pbI}æȉZфݯd=}TlmQg.TJe5`粀ϽKc 2^sb%‰8p T;v֒rIx!Qb__*@K\U2^oWlҒ#Ffںn{OUŐ| |_5r5i #"!YVKI*9*"&:{jC /!Xf zTW:13.,mɭ%6 6hj,ŕdU,kI}3=w(YBS.j~<Ǥ?;uoݟlRA!&Նu-Ӌu$癒ftղ5B"5{}0ѹ(Vy¬nyKQ]+9w6zH Ny3kz3x[l]i $wއt!.T [ٗc9Ωٱ0mmʜ_1d0ޛUa'0ה9-b= ƌ?ۮ2:OtRhᛂxIrj DL&|&2o +\dϺi:P4Dtii >/ 1,QinoIJeza>3FAN^uq\CigR*_^%q|$S|[Ӭ,\KGxoD1U˿kKtA\X^!\ ckkd7 hF嗜A2E}ŏ!sRHG%H0ߑ8yHt,L!$U;GC`o)7$MFhɺXo;E325_D6$$켪j)v!_+ kŬG_[OTB'S[ |x4bU)$E|!@j[?!ub6+-)MHX7/_J$XcA!rJU-< UoP. b; 9ҺC&Rh7!+y|xX))oPKݫYR{?3}7BKg 45&$8VY (j?bH^ʪ<2lgҐF氤ΐa4h#&/-?7aA@aӚ2WHjlOU\9%0 *AyLN5(/V,BwJS֓F̓E3mbȩ ÿ!iԝ̒!bA0,N- L%X}ݟ0g4aG}-}sJXjWЗު|c& [XW d:M&QegR.ʼi7¯~ă)_VjZ sIv+2xxz  ֈo6s1_y$Or_LZ` TQeTJgS0{|f1-#qi]E jm!-bԑk~Lu#[=no+)PϘ=s` !E:M.)$_'fiRˬ=a d5ӃJ$I+ EכߧXO>Hl`¿V#9L>ChzC8aA&{.{MSyUcha{qŮ]Z?hD!!0XG`{AIȠzb@ʞj K@QՄ+۶_RZF\܆Ix,?\v-4(fj|՘¤@Y &t䕣 UсϚu0HKqkЯ5Rr׹#"@WР ׻J lP5DEHmb(ɀcs/z]ٞ%*VET,(i9^FmAjdW KvgfE TWUk? N'Di)ս@LƁ[M"$IIQ4*ޞPd;+ --^TJ4*otuQA,jqaA5[h[ Z|1e6ZEmA/Qvjx5k+H,P`lQ}kFxlj4pNPZ0g'H Y'c-0(|/ƾw<jI/g*U[/Fxo2M=4WDþ 6'{kOwxJM$\PA\0spGՄ)}p&YkwBN*(+ Ubvˊ!hU4z߉ף{q3Ms񩙍{G|>ʀ<%{ Y?*X-s?Lsd,y |]+<ڨ *Yadz&eґr#+A"UAg931BoLV1Hq7T:Kn6F" $/}@Oi 1FV5NT5Hft3KNB>^ .df(!;̦s}n\HIRTtRQv1{EZ7ZpgyŘ;:nrٕIyU9onnE`!RfB{? A0HS6+ /]W^8NA~̖g-K+$wr&ɵVN~g~:#hAWPKzozW?;z#hg@{c~d=*c+ V}NU2\>gNi %>0d@q}ۧ6 K28?c+.R]:5?N@V糾˃ ٞ.jegPbZm [hBx$ퟶUtx!pf C.H$,yaM^tλHT^(4(:pY9C54ic0J^d`MN5ec*1 :z59TE}AmrBMGRZ%z6 8R>w/˘, h:ȫ _a+B[5Z);ߎb7"Î/ TWT^ [+o+a dɧz;*7N:wha0_hvltז &07^#L?4İ0`|'\|IJ JMI?;fz/]60[24="\C+ZT',< _jԥc_{IvOϸ$ˬGV#W ܿ =H HcI5[ -+Z[y뿶^>@]lUIJ,e(oqO%ﲚ՘m?s'_ϛ_XodeZ ~z{CGճ>96t̤i zx@+HlhHUJ L67TU O2 XNLSZ鹻wzyE\Nw}9PVNE4R\izSK"8W.'H[\R}Jzb K RKOA r^gЌiZlo9 h`)usPfAyvjK P~?*KYVyU|ٗH H7fyfFhxGE{(cR2k#P!C%%C` Uڃy%޺AflӇף\ teY7Ȥ5>P%yCJ}i!J"~/!L!w[}סE,DӬBr`ߤ8z` U% 1walIP Iٓ O vO.rpG)X1Mlg0yr-yQIOxϽz*{% W9@%.(ɃI"' `.^rABطx9'DLg&5y3Ҭ>mV`pErx4 mO$N1-`+1'*6˲s0[r(6.~f%7u'G,֦[i,bp/=ˤ~GuH&qﭧd{eZ M IDAT!P%)6wI,JOr' | VBj}STkeLt. 78-I7g R8=ߕ'zO 2^70TeP4/6>YgjwC$B4tߊჭ'Zda Q AId v\8s)hk4b! ;!Ug(mxސ}|YF{W1.q4O٩<Fo%JT <%&\CjH;dal֖kpӝ^9I_#46"e;'-]k]kUXAձ:4E_šaqhad4dv-* e+3tަg ؀5\քTkJw}sP]EwN[dJX-$h^VoKG=/g*8Re`Y4xnL\ :oʍ[o8<鶧0s(2("utxl9-zL$MB,[Cgk"YM^аjixetrƖw>ZqyU;ߑiL?8^ #Ow52%;jJ&[nX$(/ٙ6{3>V;," WE .2 A%幜 bz6e w0l&$^ɻN t>ѩvҜwϛ"+0r֒vΜ!H*mD)FaMa!#+-Ra8he6DUY1/mJVM(b?IJLNbMiw|yo PB}/wf!lQy1.cY$aҠU?sKLeL]]0Ԙd?M *'9)N\S&Rk)CIvС\z[0+ ,ARZKg17g婝 .҄jW_@[#i"EӎGw(<'BV]l}pHsx8eA*$U*9?w=8a[BWNuh9B=a𒠲9,@Qg~Lad+ULy&v&DKl&j;`Ĩ0~mfI{gdW?+!|\+ 40vkhDSӲr}Q] Lm+-f4BUK)vsR?34Tt$sw=jFHD> bOP:II!+'z8a2fi ZU@6m˗vj4²t@p*T\y>RD/2k:>[䁣{BOW~ -9n J!T4yeiI D€ :E=9!V֐# _4u 0Rjvj~ll޶bJ$7[[jwDo]zHPIg%y GYSzT_>UunKapt륢ϤZ^6[{VD8Ѣx@~XeEKag&E|߳xl^$rQbgCddSو'* )Mu?w-O(c 9[Gjk&zPVz Z/ְ ds#9cʈygt'+@6_^<[J9Ci1PD>/3-]CY͟L3(]H]W |`+`}p~X "K)ȭyϛ]7;QEйr40^`bgsg#ЧxIWr}>dK[(O6 q޿dE ؛EyG z遼-0h*[Juy25m5SNZB2j|&[/@d[E(N~Jy'MxQ7U( M"|]^XĞ|'IѲC?XEt_BmzeF@AZOASfVbINoeȺ*IL Q}7F%4[FTH[#ٟT7U y\$M9-ζ/IJ-O&Z `h132p#gA\Q*;~ȶp%N)Lo u()OG($P. bZncҗ,33R38tWk]..6d]@$ r0(zkxGy~)YΔPNTS"Ɓ:{ @3 Bwd+fqJHs\@rvBZ7UsuTstZ{PYZ2гڔxe- $W'G '">Xb'sǎN1V`[Ҳ286эФ_^(&m~IGr¤)/2",s"Xӥ[wAyr۹N'+?>I *jVAnFr%Deya9As1F,'T\4wLJNަ;3tid{܁)95{fWUeZ(*#?Y(Aal@r\RՓ q\ӘaW- Fhpس.xk p?sݏ$UzgcZj .LF`scs6ˀiYUujϋsڣw+QsJ}F;P=77$0j*.NKp~ &.*:Bm C5΀Zh߯!؜ӧTM 6[1WXwzGmZzG*dz' 9\ V\eSy X(Db;7W0: oeJ,zUiw%B{^mV<{RДWwI2U"ٙa 0Ew"~VM-Kfo[:Ε4gqލN~YR?mH|FٜS$u?{(Kt6Z  {gY3 ; c G7VL4DW'd2ڟ G$.kꀽҡ9J cF u$wrz Z\LxڡL63ĮB)]5Q쓔XfH瓖yACҼk`: C_} ?ːrY|:Y .Q[ׂ8'i Eb<10&[uB5F[}DU%"F|n6Vd$"hz~/b.YB[J /`>ON=oF˸kbu3 NR`(J]v5H1ۙ7|wQY$aD7J`hq mPHH^'0ɯF0)4R49+1ihӖC€D`EZ-"!Lasx^ ?TUyVJ2-aYf 0SV$s Fo_g:+Yj. * :tV\/} :Pv6%gzjQbos& ϝgt{\YC!@Կl675*_ZŧƻO6BꯑFFlc|fhb!Ia*-fb6 E\‰D2{$]_CR&\F#"Bp/k#}9C.#vi`=FrbrvQ{ O9h,Ƞ;)&g1G7e? `}3s=44V3g/{ JA\}0bDD:L6] !,d ?DF_C{;m TC&s|6PqA;Bm5ܸQd-"8Jw>w<<ԄvLG6)Zgÿ Ocg$Y8B0<>\%Y2?]~^FO_<|8$;2,Bvb&V:1mزRP(xq l5"}ibŽeNG珼-N~&?2Z#yYMQ)vwfe6RXL)a0 J׏>'To-v ?$GǦD!qXcE_H- ٲFm ڛakc˿ \q*dc JQf2" T-)*&"N ]yz6NreJ (~Ǫ`s/$(.0 `AG dWx Yq>׭ZU T Q?0!z0SwIaJ\P`?llQ0d|~LfH)̃$~je|) IDAT0M3s^g&Tfv3rR[%,@C]eÓn~ gE<>7;;d|&rT-^${Z@$g +0j75Nv~^/,"톥޹a}pHj.8n+(,Kf@*e _ p13[i rTy3*#K/))q9hCCh TUVdzzrV=/Cga+Y$?YwaX,FMac ]{"wP~rZhW~V6pH.PVq0CZl}dS6IjNe-d&X?|HawɒY^yqoq=28eqJfh*vD|!'3 sg͵_mbaI7J5;DC^hh WxUpr_B$k~,9\Y6 3 Ga: ~I7I&ZcZ8; ;Og0 թu?KZ2`G$2r < R.td؂pX !걮ۀ>Ps%dy Ap1\^jfi%Z(2[:M8CRe4ǫ@MKs\K? +rijA2zya&M5uOI LF`@9!2(^:]UDWe;\B߯uRu\ӋVJʅԐn:ucsp ;mn!MwZ磤t$yx7{OȔ e5r\HGxΈgl״DM/R療oWY6l/wT_o7qO]j)mi5r86C]sb5Ρ7xd ZIt;ǴMig0+p85V23ys#K(1/M*ho_ߨ1 4Q*a;e\J;;_|ωJn+E~}|z/dYk2Y~/3;=s=!,2>_A8sfIn9$ 6)Z3C(ܪMg7Xa p qn;pf^!3vO!́! &Z͔ J¤ v)\VˡoW[>˦"5)!j 4T'Ah =@!x#cay{H0Il_ఋ9 >M SjΦD43!4&K;/ÜP9:E錰UJ}ظj`'Xs?gRj4Z,rv-)^_bA=H%b6q?܃ wwZU/V?{./\âߍ3[hhH6axq^kJfya MWH?% w3_` >vx I?kžȼ^A0mM_~{͖ޙIUx2s/&}iYwR>:HG3gS($C~`Vy׬R0j̕:Jc5y0, ̹ğ 8G3u<ǫ*H$ASGF0xmK Js^JtMDk))s$d #b?ϻv|s9{?hY=dMt{HM2~'GUSey%s1.̟ [*SHu*g86"+[aSnve--uiu.AEX"9߽Ba9vu Sg{lWvGDgi}YS)Q `3tk^9C~ț*\X/GQuy(+zo+)0ك3Шwƒk(-> :V /Yr&K@&Ft1wN3u]b#N Z(rcq; y!H_P*Qf֝.{r&wmd`0αAlHK9 8yN4P ]P!"65kPsYA ݃:I_#26 _ -0/94Csu %ϗfwfGř!d#"ClJ7lgb (\Jy6V_@%qT 99MoТ ]$3鐐0:VDt"Bq59!Q@ZX'u^|ϧ ~wwJaOx{> C^]0%c{2fEX'*j]mO$-VXW -09;gNlQPl y?z.?v F}{ ؛*x>t.P8EK_֫Qԥ!ڢAM6|U5(/_,l .33ޅu&K2"/5\(9 Xtǐ eʼtФgŪp`uNMh5Y~auq(ƽV"RMń~R7֜F ^vnf[(ZVx+W,eE:ْuI Tienhm2}넴=0|şʙߟ'Y9"6Mݠ 7-aISdW~ۡ^n02Jܣ1= Wma6RRpj6:;jtT^^T\=L+F:l3HgZKԧV;R&Orr. Rq=^839'ͧڕ3$4h֑\^ wU,-tzrKVWM\Y4v\;k\3W+1{sʊfulxF3Ӓ_Zjbrq."$$)TJn(hE4hMAOUoˍeȡ zM bԖvixW_܄NRd+??-fW<(|e`^0U=ڠMV*/ˠt0ɺTʡ\K贸1yӂ fc<_g&̜eTaf+=$KJ/ZWsjGހ7<(;"rYhΎ 4U:`aelh":;5TtPLQ\U|_Y!g5#\z^*!WqzL^?N?tkw]Ebq2|j 1o;p[ PcVIJ֑*b[S}i P<Swt߫y V`VC: |HVeB3[FP{2g$0$'l!L` GQXT'-a |he~g[ :^ h;Aі M}\ cӁ-r6լaXh; xl8L]<Ò{?ݏai]vYrWlFl M xM;cj kߟ bY@d9>r ?S"4uH;n.<ڳ$4`Js90li>sL}~u) eARCK5s]M?&:LMDQ.˳Z)4XVV)KO\Oдɤlms2hoUeO٭"Z})\ QRNs%$Wv_`騾wW>ӜZ5 ocUnc,A J,1[ahi S(+D%RLƀ㉥V~ yjF%^pkFg^jkBfsxD۰*EC.z8eD;:gF):F:4$,U1A=gpR 2#ȝ$\P3\{[-ix'$>5&UfGs<~J>x\2Tzw^l Ғ2ʫ.>D "$³c'brK 3=G,yIn 9|Ղ'łk܎<9zT-kAx;lj2=2)\nqģ{א!v@>{ q;pTs^ߛC!G1V  ]Y@hB4rM*`|H!d=[ן bxsnmdΦCfKXO$EV&dFWC Sb^i)R,w̦]d^p9-hp]Ox@L-"z s(Y8zXa0o@Õ[-0'h/da~iM'C&arp'! f'fƛ>҆2{4x_+8d[7!H3Tăm$]LA^}\' Of]%?~.{eol ئ1uL]R^a%&;ԓz!= z ;PG'8<-AoxWC՟T" ʱ7մdno{ߠ%yon@ y^CjO&v 6%I2XfƲ<¤&B:82BfX [*XC8={]ƒ(%"VIUU7:V%`}9,.5= \`]P|Dʝ[}maJtz3zdDjAkh]ѭb.G]-yB\땳wR48-]=ǨiG% e9¦:Xu~.hg,Z J u{[fBNCF'"pq؄U@p@Ȉ#1]ev\nDO3Ĉq/%%?l,l']W{) "-.- Lg6HGNԵ~kC+M:X^ Yd$ uΝkj=ȕ#ߠŶ{3δTgF0mJ,0Rgm۰_qrץ1K9Ȑ•Yt73bkԹ;TT룟}10].h&#!ُAS uyޠY: lzVUJTQK%$} I`ey5Q 'Dޢ»T詭0l.]^ ΂nSޑ/|j1ԺSep}|~Zl%UL/y Ш͋T\β$N^lDHKU" ,:-K*TD!~_3`F̸!.>1T?ҎCK=r)`tm$wfD 2|B, w o*Vik)t@u4UmZ#W^p-B XΒuP>^enWԆEa@qQ6J;rJˊCa}\m = HR)tX+b DIyI('t0(t.PdLe |GAמ?ۊ?l:JE88ߛ@nip b+4ռ6[-"#VpKj {2*f7 h䞤l{lj yn*.LQބ?5睅RJ9M

k(ޤVlmK cVY2pάVrTQHH ۄuX55pȏVr0d^ ǣXs /-{"eeΦ%Ml N,u}{.z'ړ׻Ɏ]\Yyi2u7Gj|"Z;<7D.Wkޟxൖ>r!|y#0ڧRXRygsR2ɅzL34v3!3iGowC"}%0W0YR0h` ;i23U±΂@pf=w]TO"!~e_"þ$v3x3 _p1L\eR6^ 7[*y@C^&8j2#fwxЗ?"0qe4`$xz_\.F8j(KR`~yŸ>:䍅&)*?|;-dG,`3lNH0&BHV1k)Mǰ @'y2sS落3pEwզQޖ<}3bINrh`E Dehga9l њ1=0D~7Z%9Rj3GHn5`-C]hzwYmZmYyfO`Gt xpB6\ } qsn89|蠽BS稴%Dmq[8p~K ||yr f3B%X~/\;>򬵒k:P67Cx%E+Ӗ.!,"qy$7_!'$=èt$Z%2p)+0!*{@yRD R\ @d{B TZv?otlƆnMdخiKn]Vv?~}(9E $Zvq~@2!Vmwo95I)δ|Y n+V*3jrq)\޶L|W!"7B囦e<%1y;Ly gV$`kXa'2L茿[pm(f ³!~⁗EErxXCi_f{CSzq0!?SKu~1} P?3ڗLŗ[<:^o] "{P\L 9iFS+2 Wu[mI/)  E$ "`:$I&t w ))ZI'JS%f=^.N2L(>T` }jw/DK{П]vħC즥obVv~?]_֘bji87 APzCkňXY.zNF(KEa, *`,yfy9JdR_:/<Д4/2t<=AysbGߏd"X %]|9˖+zfFG)6挠j;dK 3 gh9/f=-t"jf[JJ:?<];mzW"7PdUF$[D㒪drR4"F`mP%i Iⅻ<$ Pˀ)F$7[]!F*)ڬp ${?YI?vI*nc (~gB}"l5UVRu/@paoΐ.`jZ!Lꦱm)QB!&K>c؈/ ߣf"}_{r3tsHp ~Ob N9*8 ;-I1 X߯|OrOg1LHi{9GEɿ L{Hٲtkxž NRZpWeaښcTU$dmqc :VGBNH{MZ:ϭn2q}Y;KS$IkK_6x'b9_`WSͬ$JLV+'VVjBjZi(M, TA=^k/;u.&?,+I{MipDXjDf~<֋kSW d}T^tα򱕐t CW~NΎ^գuL*)7DAQ[j5V^AaW1058i\Ixh?m=d80NN\SNd"9cA LO0?[#@B,v3N0c֤FK07-l6_z/Ůgw|-cu-$PYݨGxnѪea@@`e-;>w6ʬ ݔNb{œagU3_&x~ge/NboԺ"1f3NbQXP4>ygDym9M?vhi4>jIU:CM^s&%ؖK{gmhgH fDMxi@p`z>l繫z_&1TVhB-g-Hoh2)@2( ׹)Y,2?"8%GqF\bOAa*yoF??2SY CiJ+wy "ݕ~\,``uȸt)$t7 spEC,ݝw DXw.XLnbRWUV+wX>w0\備ZChVJVY¿rko.ս~~W,k Ed/ ̜>ցy|f"/"՝>$eF$065c\F5t*hq̶JcT !/ko!--[Giev)(b d>EFʛi B)C@e%Gɒ\-=lQ~pOs-Jj O%)h"rgϒ%GYt3sZ${߱`K6tlɴ0N g_owVgjYx_y2-Akk^qf 3et!5dP,mx>k5iyiܪ|IZU}c;}l7) !a %}bMSٕN7nx /EEw;.bK3m89?Wp<ǩŭRuF-m9zW2$< 6WA.D~3/z7gV[kX2 {pӼ*.Y@P-9XB>-`:ih"0)8\i06+ [<[[jFF_|ZA*BRZЗa&f%&;|>w9Adª?xdTW #}ǽOCJ`wBEnO֬dED509F2i87=P&Οnzg-P Ҟ݄*}GR#J ֒E{ԢÛÔ ^m(09/IwTf3?;ٽqzW}`$Lf<z%2VȪءu4k>`t4 /ddX#qLJ=C:3\^Ki9{]/u9-A~P*]@\8Q>SM_ܰ]PSْ?>W8&;\TF=\ @c A߉0ϰޙdj+Gt39-97HaxYmD{Ėz v,$ ndIhJymܚš7\{5ZzdeYYL1"cu=' 8oNFח>]^@jXߥ.AMҏQ+atrp"-i4/ Uo3Bgi#LHg#䱺lJEJkˀW@b( 5zbK5D,}A V_c1/D~P"?eJ2CXq|ߓ|!`ISe V}~pjyR^e2-;T&zf|N! 6@60n'kՒ4= 889<<}ޡK/aOF糌EI̸2C( ^4A%)5n$ԜK@I[$bHKFSkrV9398iҺ&(86&Νxq-ݰ: foIлpzgȌ$B_Gg5I,>k}*,ŒP9n6tցݦKٙ#\"af Ut|D~58*2,%9\UZ#Qd|LĬ>Jz䧧QtJݞ|Pw*竄eODgTB$D9ӧ", AI ۃq/ 1ٞL^p 彉mֲ',G9) }m 8޼[~ 2fPTgBj9܇^͇C-Č߀*-y$[Hb8ox.TtQ$ZYD-dJ&彇3KB&ijvLJuyJw:S4HvABiY8̂ )I+{sx7Up,F$)`-,@ %=^qU _9nBUv ^^Yf{/K99ب~c ]cC׎к5>!6{t:텱;]`9JG!!'Ն/\*DЧ}cQ ּH>ʏ^hZ+@ F%C5{e,5JYziㄫ-|;DmGrޣOTByZZY.j5[CUrx?N0٠ޗD,~rjXOكٗ*P"i*T(1<_Ieu+c@O#ת7hC /V#R 8% IDAT"j_ I9t*@Z:O6@]{fa29~N'kɭ/j+3-co}MÏ>Z,1$g>([Hᶲ E, NU1cO^+ ӅB| QITztߎ*Ve֡Fvy'݈~[@ H2"?^W#jF [_n6KV?֔RFآ2X1bk$},bJ;s Tٞjm[ʸRxzg\jbEgHܭn/tթZY~~h_4{)RS FUȦ$R {3_zl?/$*ush60~N6e>%-'H)AW?a637i1_AZǎ4 5.#YsÃz00D!J]s}ƓH%ɿ1XwXo'w( `Amwe_ tfbL "(P`%=[",agՁ޹-2E[ 9Vr/+rEˊYK! j"=ʇnL2=Jmpۃ%9A@-Q"{ ^=y b?z˺ϼeCj%,> WQ.A:) 7s7:j^,0϶9Tm-vW}y!_ Je@N/0kYBa,KĹt!9Z}<(1U}BvJ2bM,#|ĥ2s.)ʊ9|~\J3.j 8ʣr-/נWcy8oU{P@Wk&I7. `G!szVYTU ֗Bf~5"buְ:dΧ{p@-jM w{] *euH)ԉ(NoȎV@EHvttӋx>ϑc@Ŀ L#ۉ:<~ /{}}^VA }AI[Qks"sz6ĩH==o6LkH[:wS"l %d~WICv srwfxƔ1,^eOې,L#B)e C*/ȭ,Q0{wz:'1y\l,uvrpױ,eV`^ėB/f=@ ^|ITK0E .#>4Bܒh3c|"H~yY*XmH iPOYvZxg-)/ȻϾO?n w`;Y_C=X\njJ?0@%A,Murr{ ԣ\erӟ˷qUCe}>.j ^}B3fCs喝WdYCw D(LvP9)mH(\9͖?T ֓O"/kLVgB)N2 $}fȿ槸%胪0 x䅆TA6im𴱄._^y}5y,n%$w{b;ai ܽd}~>e6z5wR΢uٗPpp !%@GGC PG^B>?UJ2FNIb7[ۗaVV{dxgԠxRhhsW -8^_wA3~+<菝aoi[=O"=$){[2ڔq Ot.1W.rz7~ZHJ!l,0.tq2 fZF @!OBAv}F7U );_Y\ ~7hU3 sҷMϝr#NU$/U#ZF:Rjz0 ,(Ef3gRbH 'nWgJ%=zrFQru|Vfo5 =T)5]Z= a̳R# lI$WTs)Gv"04F9+Zo$3S "['}ŗe=3|/Yך2"%x^,kbce@(*^|=Q/;37 yG\=ADm>,/Chϥe!^0} Z(l Iy:,qlXX( H.n f﹗d0` wOuhKOO[ai^\ʾ]өI zVFu'csOƥmWR# $p{4BO1^#ZX*Y 9$I!m[|*$=_ u{q2.%ʬ`i~wG\#a!0{e`P&K TىMD@Y1dΖ$RB9f}2HkzZ]c4$(Rr)a@Rt '-D쎤9DBĶA++=J2g\C$$ ,-o-KXl?dAޠcE<@K D[m`(\:Z8bXL֪*(y Pe5v5CVQ-B{ғ>}I2w^niٸ”IXİNu MQD [ҁ"5,+z,O ~gjZä ȃ}n+@j^ ܔ$uZXl{30[Rp*MINjٽvIss@f=U 4h?}^րqA{_zPb\v XOSG{'gߝNmbeU7,=;Q3~2c EJ|oWZGF/zeaȡ0Ъ#՟^'De;(;'[[_adL&ghY)ISUKH=YUՊ Ә"êY(kIiQ`XkPCjhhh,Y\ TrcᘃXqU|XGÁAֆzGq8BZ&_YhT]H<^-r ɥhMY1 wfD Ø$saքv!rL“#(*/Ϻ-"ytY-sI_,@]hNvUA 9>ڲۚU  bHw-@:*tO[Af %;ATWʗ4-/>Z?YTVI`QrD-̺V-"(.nrCyo[>[!w+] Sdހ^΄1; נN JO[a@ٵ ֌M,gj {R8U|gI _\7u/r \nke4BDVbca07G9uj'ސZ\" ͆ Cy6 18\+Z+Ҹ|]™>0rnr* 2h  -<_w a-?(5aFldĿ!M0Аd KlHuFvd0A hJG-SN^a(&۟. w a*żMlw|j'K䩄@ _^ !=zr~]s \ 91:T*6X=o_%%=ANGMK j\7%O^TQ}^OhV*Kv0e$~bn߽<\h X`E0cL߻:A=?QOyAI2 55WbrpyR\,ݢeyJ]NbՀB85K)OIm-Da´̩4`b"\TRNAN o{M6% ̲nH:XF/>R,T**\ࠊj  QƠVX$ ~޼ S!k-{|3b8@2}Oz v TtxEgZ~Fְa N/IU,$땬4`P(%RF*L 8L[3dC%Di?dBYS$rzy [Apo+w/I2)*#~^,nSfq-f!xWyNT&R}ީC~j|h& i>~`w*ݚ IDATjBOi`!+ۊyBt T:++,M}!gթ;CRId ;Iɩ qI" :*Lc@<<|bڷ2|uRS(ĬO EPbyd1z8qA\ߺ+#x++!v?qWS +VN!"#r>SHZP%)j%Jbq&q[?23[$bF0C1_y%'Z.409x{}쫫&Ж@{w!{t{ZoO .qIgʿd]Eb@;)s'\Sh2ͮcɅCp[H[2!Jt|;I/oǩC׿[? O:wSsON(F+? ζ`cVRĬdkf$E)v-ÀB Lvg1shӥ6OK] Jv XUЀ@ ͒Y, z>O1 mCgp]iDQzQwUڥ1Ce& aqO41WY̠±ؒ. W0D4`E3 <[ưmx&Kp%>񢘙a+((@C?BRإ!PZݤ&R ɐȒ0/\ ., \@ f0!:gNLB)cqszKyF(9$7T0^LCbSPIV{K}ኼ,G8H >0X΁i'Hnd+-C gLWSzŐe+ZSVWCҕ' #ۊ\^ځ%Ϭ@^?o ]rvQW=kZ~|eR ddXu~!?$'[Z0|B\U5$U!E]ÇzGPepjL]:1+=s?L/u8*8CYw!KYqifYEҏ<^6rSJBΥIkdChE:<00T+pHa>7e} a;\0U:g0!w yǟ{~Ɍ]Z$uq^? _0aDi1q`k6|sɼT-MXƾ/ÔDƠ:ݰw)n+ dm l]Y.tT^0+S0I"}O8 DuV oLeNnjaB3 O5&"{9X ݰyfts_ y_h)8Sbg`d> WGj!ZsF]TxpkrUS^A1? `UP Qz 3M ?Z|웖&šfJ&Ie+0gH<4zeݻs`稃DSe@/!/ 1{ώ>cWmtŐIzb.^탳 fCUW9ti#1&wg^)a_Y.dT9F,T& )rסy|u 9<C3705pdJZ$҅:KmшjR}UYU4%!3q34gCJ11Ҽ(.Hs5zꉐ NHϋ- UK*~6Y$Joכoy~Rɖ2C !輤^Y8wQfNe-:Ox6 TU$#-bRXAZqYVGsK ޢ{`渚T¬>J@M,jûe&ܔ@;Fx;$D^zFUcKϤ+3 , 6lTsc''F 挮 iacDx:*SϿԵRCuݨ$@kU/"_.##f7 =$qޑxoa^H1#SA92և| 'K$&YЊmp_2zg"c [L/]YRXm@׋SZ޺6P􄲑ՌU憼H?ϲV[R;R30 *L2򺐨1iOonܼ\T"e \ZAuXP \N Y2ZU`5 ">.R{PC~?׾nUn'fR2R&9I wm.$f>KNAa(JEx!BHjKZ w`EN ' D|ZC…!@1`;07`< j(Tal2idyQ!gW د^usZ=%04nx/Jl5T ڊjX83ޭiSH ]V˘Uk|Xx. QQQ-ok{eɽWn}$0v5$EUdXi- CCF PyPwpMDT=sA֦Lnnsʻqw+\,Z}v8,8*"_4.-9&fy[RZ_u5~$ScG f "̈́{Xzmb,!|Y)P.,bP rO~|/9+w[[F˪d19d, 6$S*^ye^V6.Ą@`P(/EN oOmEwyxJ^ `N^#|tFkzB%MSaϒ fLUX OۭU@FLjUreܛ8T!Go *Oj1#ǘک![U{.9D+ >épY nWt:#rqbSZ܀Fhf܉f.]/D7v:9}!Ja[ 䣅 N̼lߵ6K91k鵰6Td/dRd&B|ҽb< 6-MG^%.iRW~{ #oj1eb 0%+!:5|FCIA66TI'Vuk:זwK(sv˵5gc_%\uQ/@huW1BߩiEBZ ߝ<wn1,iW=װAFfBC~ /u]~9jpywC癷ihT) j6eL;@4V \m"P %!)Qc˭J'L"|;)?R^&}8P gO@anxmn+ T3BB)P=Wrmh썋5q.g&5Z{2 fIW,5Җ\Ei+P&R({Dmv`)]D˳q7DG\rf%-D?f+}KnplR}6h5/2;i\ʛrYBc9QʣxkS}G&gեq}{6ԚIOiV(OLSGH*.d_ȓHG% S#GAÆW)2e×],0(dx +>īUCË{ ,i꣏'`=/H*=*L?ؑsa<:|sv?F!Aez([Mks@A"[An>?|Qe)QSr>;޹~ e BF`x()okpA^ fh<!?|%Юg γB QHgzlO' Zʀuu>3&m ^~d c$%1kWz_x\r-9IxayHq.T݀\S1=9 9@&G;g\>.Hkaaj9zٱ.jˀ(3NRbI^#s)f27xv+D^p;y,~Ávwlp Hf)m|vH 9Cgμ^0&n@ 43:3nz-P+@`~j4mR_`fQ!JYZ)x vwP]mXvףIٴf~`>ﶝ6. FX@fs!qWhf/=!hq'3035YBe"qD$v=HڠP"3NkƤO6rN"VO SL`\{kKR}˲ 3ӧ4#Pkoe JO4Yc^l]pN`iV6‚-S8ɉ;}s6i?i#[C֙W=eO TU"w9>.q = +/PnxC2'%ufո4Ilš:i QLV*ۂ诡"66S/3=/#"OK :jfH{ Tul=??MML(b9l2}xR|3*Y,=G#3%`'\n߀t W~ֵݶ r(y&r 6C$϶46Oƍ_V*Xz/BqXfYp`+#si6B9y,o94(Sۑ} 6pSܿB)SR!QznJfA!j>A_ܱnho?wШnKD'0VKQ пx+X.If9X'AZ \ ɜCo7M~~:(w#x(y}d)z`L?}>E!CCW~@J]Cbq?#l307WjH!g0?!zFhuL3b&sWT;Ge6 zΟW"F0%n%Lek?~YvBh3t[:}s@ZrVjK1p-[?$p{?jaxUgTR ʔU~~XO3,_0#b]3URZ' TV!YV}KW)2˨=r zXHbr%w=?&-N1;t C gWr2+ uDw@VX )5 ޒA3n ß ?u93%MKT'E|22VR~{A{E'2>[Ɍ̨y[OF._{r|!!L2e@NgfX/n f3yFS~)c.'2ݷTEO~FJ~%Uc .egے}x.\FK8%-dsA'j8;C4Y3FE-7$žF`8Y=OI^M_*R*.GJphg*[@(^f/x#ND\fE~N1?d}<@ϘA|U;;\1|kD2s̨$2'N&uviѤ)?sd=׹Bnʿ?.rryOS+a \vYGc3u}0 }J9Jٛn:j"oe݈U3rd'*c++R9k=]I2S{CI59U_&Ŷ1 ERG²- ֐sѕкT3_$n@LOs򐠘  BS Px zLLf9Ĉ߃[3#j_}aSw"K W|ZTFJƏPݻWp[jt*TޙӒn ,v!6zCDHcU‡yq㬯:p 'a7Y&[|,EOTXM$sH)Y9բ@ˇ pg|\'Dpc=S;/n<;+oF2? `'"~FvZbʸQ#~po!홿,$X/#ȫDJ^4p˘Afe`l&p|ZB.tȠ{+a$T$[v~eLY4q`4PUasʳ4"cnPhf*7̪tYuPpUѷ Q3fb1.O5PlpSR?6)_)3ԫ;@9%cޱb FP!OĸnosO0i< ?0gzmdpX["׷F)[v!8eU[s&âsz";aGrwyI<Ygc|gMxE_/se x6g9Pnw@}Oaig^]g2:}tڱʹss Η[*$.]&ئ}֜V{B_lf??K {'C@?N0P^yS6@wk!!79Àߚ͕ԌYZB buDYշ3(?ϡaA1BpϦZܜ $/ҿfGY :+Mj2$Pv%޿,çj_kDzގoR01;.9.oWlJ[,gHtN16C"e'ȚslCa^tޅ<#\i"e[nkx~miԕ$1\Q2;j?*Zt^hwpT)qSj sOa9Cgde~7Aim/w4d^{;&kz=&Nc^|裕nՏahMi BxZ`u`6ϼTprSU T)-EUa'#lL3 ZbB 9ЌyYΦфyv4۞ry3"\F"i`43B^ΌilnsB㦥0&5NSh̞hne9ق+crt]l٠p%15>(D"'E`%զz:.6F3*)f ]o^UkqˆDo](QfleВR E'$ݥ@M+[ֹɣɒ}AO^nJH77ԸJ"oT+\d0GjZ`4*.,xvL$I HH(GZh[%R{ہ]*\;/N(vJDZ^=PT? ӖR\Yi=V"mϜKMޗ/3e ʯHpAAAgNJ̋^$&z?'3F :ON1F0'J4SAvƮD2?g&q^ĊW!JSs RsIRs!,z^J^5"/f13BZz7=P5[9iĝC iX!Gw}ĕeOKVJי3Vyu/ :3L{WREXRYl; mn_ɿ q .d9~ h&&70L 5 u ~K.941"s6ƕNCk1ekʵ͋N W?l$FX\ĆRW:S <6ef^ߧl+ ,7jfK<(RO3 +IQ{X,I/!)j?bC\'Ʊ)a9=aHEW,?PDd}Fk-<vxaûҞF(׋P$S#Ki\ϺW~ #K#.Ş/ ;K֢~I=֏Z?3?س+g~Vdk1GPD UE SCőEg{s /5аI;z;bbӝv:WLfN~N jo.vVwi+;=_8]PxfCwnӥ=W0$i5D1IuƨVOFނ:zA\J c *pO$m0"Լ 04QT8~ij7Ԥ4j2-Apk 5|$SӴ [B na9S9 qدB䌃쑏gr;Ĕ2?Zf7cnh0uWtA"Lx&zr,Gl:qSf ׵CO6:%5sFS8YhM`D|[V{ ӴoN5ḡ,)d80#~Sshj' ogN_ʽ +'y)]| BҊXC9gfi:.$1|I@Ϋ6 Ӱ<}'L\:߇I]9AG 1r.T:@ hgSQΤ$` @zdخFp@ݷ<ӯu}V9FjAi2`)|6 <ϴX+%$F +cR+!K 2_S:KU}1*fxY1}= `|~1UP#2 ޔLxon|4a-H_qԔ$jpk(I"5Ozrܛ a R=5 |8nAb>imLJoҠ eK9 :+t .ĠP;|o .3eh\6Hq hMPH  qxW *J aSܕ]Ŭ5o~R|律2M`0NzԺmRSsrє/X6V}lHOt٘쯂{~:7̻:/d^=LnΡ3U'9A{I 6 {=<Cf*?,\!_Ԕ^\)hN}N.L>(M@.kQ72 d(4-tTMWt-(韉Mؖj_?Qi5irXMx1.FkOw t#bfֳۅ+W'C; 4)وp@UHtRPj}O׃&IQ3bsf}zfZx-xє  S:1cV*M4jdPA<3er5E Zpe\ћtx$% ~OvF[ptG/15v3LΔeuu_nuFUjk& x*z}WŠ@xg"eD~ b\]~~,r3R@[ )'܆~Bwo-t<)ּ|I G;l8I$A޸i4y?2!T0{sy}-KY&nƒ220faV PC]8z1`C2GrGgAa/,ڌ9@+s&K$izxV/߻ląW#+&s 0-(`Jy9^vML0a&VyBmbֲ<[+8#{V*Qec20/s6x0%`o2>2d 1mZqaL:-QnDRmkͤ\:=ZZxTcuz`=dZ?qY'|ar&L (a~K< -(hī ۃj_8f( U. BCnik8kNF rheS!>H0LMŨRX- ݋ 9v4s O?Y)X6й\~+JCsEh#.fMщY/\riE%V@ Nc|iɋaIqriE*} 윢*\oxjnPG3 qˀv 5=ofNIOCc,2_(Oc}Ϭj(g\6>@k|k,t3m|,gf-`_+ *DgiapB~M9KSa[60&cK!PP[zf$^:t9Z@gxtǫ&ALNNQpLjTB;w)Y>f2 MrشQMybO>ݷ0夓 axY4, ZFѦ2!G!>Dmwt OGD43`)h.x3& 0qCQ/b$j>4 ]&rN9ZtNjOSF5QQI1&Yށ!cex U 91 Xy39a0UN+SF+%?8 `HѶ3#0Y -$%UȭT/bpAfMtZ'FgMX5gP1Fqg3A%1us-~V)C?[IjF7`1ptr&lV;@-uSLY3)iœaJ3u# 3N>Ā0rYfmY{_FXÿ|@5CeMzI0 /KI밻6P|Vu m^5u1ᾖBQuKS&NW|#2Myϟ#ĺ!lE(m̓P5ٰ3*4XUbWJdH xlCo9Ҽ5ZekRV^Rd ng`bqױfZbMY wzqO[ސFXAw<./EX~`~&2v8}PK%s*񀪌ꈙ д;.;>IEL]&:a Ռ jZxA F0/xJcLwF |D 5\ IOFq\oľӫzu 3"ܛRU6_g `l@4<7'"9޽ilUzجãI(` ` 0i,5Q"0kiŖ1m! 7,)> n,>1{ٕf-Zqb$'[Pb6M m23>cgS =fHZA %e,]罸 gSTy?1kzOۄjIt'>cƑ\k >ղs|))hsM=g LOυ4;̨ˆ!-IB2\uXt?Y)>Z IDAT5HG_&=K[?H5x3lTۚ~MbPYʸoXǵ6[MR$Rs7HN8FۃN>{cӼ8M\9o{>:EV\($Br2hE ,H-vM/t+\Dܦ1f* \RG3Ɩ%>V8)Z4Yx79\v{6Auq销jƏ AWtH8Zf8DiY҄ ~)hEkR!NȳƏAѢjMlԧ eN?\id Ž[/$&{7ElN%VeNB:Լ&?>]fwK$hLL1_П_=^Ǒ|_*:_1Oyejy8Z v~;:qNqbj 2Hiu(vNJ߽zͦx{edj.]s/C=Oǣ\l hg> Szోy[:3}9rQIOf;/jr"eCjS6F~4,jew=녢(AsSBTK`w=fՑ磞y6tovig~0^9xg >ir$H5Onq\0EOF\[RX+ 2!hj O1FowW槶[W-k՝cZ36&_cj$g4 )0캙5'q}Y~XGŔzD;T)3DIVq"~Ge'Pf\%++s^#w3Tdг [R~8oM=Ojzju=VU: e/4~ r|{x D]PK.If%M1#gUD6=b %ЉHfh?mcw[z$QYA[hrP:svS_]MOF. %& HD5S@PgBhҺٰqh$UfwQ/hpoR<9v% NӬV)fW&3~n&޼]}GjN(i&N:-"+S!Pv) "?pL`Kʔ6-! |H];7#9@<=p*QOF\PnE(,p(`rl=p*=B^hjyF+$*a.yK}Jf&:W,=W-)1S&qC=gb՘9zo8b >-go4낽"L4hV{A+ BB靧1H OX΍shTfRmRrp%g֥\BN6Mr֐[Pzcn98kfs&k!A3JlgSa_5Q<,aЋwޔ\FQNT@),\9݂5/Gcȅes>o_]to>Ql2nP;U\K;+%$D]@ ޟ.JyBݲxUƗhEL4Qu%9J7g3Zks{ըg_IqGaD13fmsbJ1 h~0XaTJ{ 5ޕK% Ҡft(c[7R4fh}8% + bICKwPJS%BG <1 ڪcjLr&}2|@r9's\g:NMUb ::'L*i“v[B;\oƝ'5*]{*J*?{%0&[QOI"*N26rg`x;/N;ו[+XY̿8bJ7M3اr~c92slgNMcq%ͥ}YFXK%e|&}9\ 3:fOPϘ-5~%Mzd"feeՋܯ<.g8+d{9ğ>ţ&A`Կχʱ#)eAOtil|{]-"JlXR@)=Q߱ n䆳hi3wvyr#͵#yÎ_7hfΛk52fZhrg^F=48ΤMǐO,]/it {|b4b  Q5̋M$9(㇋ŽM+Zۚ4%j" [06dOÄ긌aj$ɓEKM{z c0Bf"O5]p!^iMP1xr10\P-] -7iPW'Ab`&_r~N׽>T( S 7E6Iр6{uڨ2sQw{;?e|5; O?ˎ1kP&5_"x9KEAaHpH0Rnȇ%C b!-:6J4)Mu'3owh!, ( r.r5IzMmO)N>ؔMt9E :E_=6{S!l= nbʠ`ٹuZD)M{W"Sg TY_!|P[kgHiߣ@.Ʈſ$+]ԈdYN<hsgȉcNpVG;nḆ{~ϩH;y>/oӪwu`21Sǖ 5ySLY$YslbLkf˿ςM{v1` r΅^J%).ļf#1!/fe"`A?K+&]zxhӮb%qƮQƢw2PKYZ߫cx]Q47ߺ,sQ4iS !H8#b(b\w Fk5 :衃hŕؔAjS!3AqѓW, B@ T:hUv;uV1T m]a#T3qNoT6Ga\ NV4޷]OEBPl*c) SiۊGƥl|"5犛K~FɨEj2' ȟMF&`nl72sQ]F65exR5)ιu3R+R#JkMWgy j\EcO1>hu1)uʥ<wm][n؈̟(yɶ2ZjP:(swhp ΕJݿϖ) t[k!eЧI6bSE~7{?1ǜ@O 7[uY߻l3K EM+O;D~ yt2Őd [9Gl#)lBbU;5GY5U.洇XTEܓRD#ݔoPp3br5j&-,Z\LyNÞG~dM.5쯝0!W$ݨ& "U13nb^ R;BM)xn>Zx7jE$hqawKIe ASS<&yT#N=fTU`L'%KK>d(.yM&_[c56NHLV߅%$-wv}[d{u:{ hJP<Z0/h\RfF* pێxE#HTbN[\㈑ͅ-΢ukcM'ҧBdL@*^;S?,@D/tFByQ\ĭm~lMrä+ |>^a^򤁛 j\3j2_ }g65J:ZDǖAeh70NOhnD{<'P7nR4[gu22ɉ-:f "H֣acL.42~$2k)tGNfϗI` s? _Y:;Ӧ_~N!~PbT4@]cepD4Q2Gkſ/>wЖWVc_)vEQiD8=+o[:|ހB֒-|>6]vc6υjDhi! >"֟YPT1}F7i50ntM|AJ ?C zeRzs,59;4VKs#=Z{u@N1/ 0UmR$C).,l/e,p77RD-\BjZAimwe6--WY-`Ă}||^C&:LY\D|ʚ$0ԽC\ȣ 4uu/߈p&3%8˕_aXy@Ĉc;.di-e7RsrhVڠ%YłbYZ)g2֘oܵI W% M(ZP[P>d/D nHW77q_"`X&oqJĜ6(C6u R854}XKضư?ϑރ گ0DⓣuPS ৵ zaeS¹oHh Oz6a" ! m4iOj;4/6EڷVz5|ACPw}q4ڿOyzQ=%r{ǥ$~/j9/kYWJJ: "#ȡ0|}Dz# /; F|0r&ēಱ4^yLѶjF Y?`=8^dƑIRR7.LΞ ~&S =r(ɼXc)sҬ6;><{$PGeH:L-"ec[Oʴs3225ke%F5fK$hX}iJL=>YԘ&}Ш֐7%2Ͳ%1؎:hgsv( 7o-ry/!3$Շle*rX1ݎT^ד5痊 P?agoUY- 2ͦ=R&lɘr :U9߯k58ԳP4ͥ7Awm~3տD{#*Dج2͹2P{JȌjVnaQ&=!j_i j|iw9s ȐG5sLu] ]nDd%T+r*>ӳMp)rw}>QBS1^`0#$dy(2|A:,}lvʐ?P8{z2f6Cdo:"zɵ4_h?4BMޠpK ޡW~cSqj .I wSxJDJz(ɏƾ{5\df6x229 f1Z ԷOAۿcͅRbWo}[1ZZcs-R-?ԧdI3qu:Mx99"'#$G烍ޑRH=+V1}ށ RIɆy6Ό"U$cpX<5ׇL/}_9q[n-HFdi}RfIJ~_eCpHFG6+|7NS E7d${ KV07脵sD"9TN,|v2Zfrsp(VE J J f岴N 1n}Lk`LL~h0ڼx1ּ6/[(.]+E4K#$2u^u=Ŝ\&!7QC8)I k<Z6@5*#Õ b2/*h5}SDcE{XŶym߆{]d\*ǐkn,!^N=iGRx뉭fam bKR" 1c::us皜aS &>6R`~ ѝJL_(S))˕LaR1 IDAT}cYL;2-˕2+B!b|M:$XnQ̥9dT/jH]! 7V+0Jw'żh*ukYtje3fD~6er-%  &OKS14C1Wn+"w2y{L#[hYR`2`eA [oeƛ!Lwg. n~Yr.p{?1~˄)ks4 H{yT q> L[?g"*~q!WH TLНHʄC3tl*NU le-i 5x݈m^*/6CQ[K)+14K[![|k[K}w\t.2߿/ZO|vbswq%>ȯ򊿼Ӝ]_"a* SPDjz;H3¯y폓cCcW\" $:ArTtpQeB@Q֦n24 !?O&zC JJ#%L^>n7R̅tt 쉬JW_ 2z lIJ =OoKo)#; U5pPB:¿.v]הZd!` eISv$4#fw"7HN(sΤK=_iF9i/42\H/C!mCL$=$֕rNpL)[THe PCw-o2)| ?͆\'n4k":%fP$Ic]*}O Cɵq Sn@$Iܻ'֙ oAON2||eDњTg6Js{G%i@/l/$EdR}:ͩò/m{:)O7:Qr -69|nաfveyuӰ1Z8ʙ׫ȼ_#h{aiB5֠+?_ *c5pι<0L[C|IQEzm.nfF2%- e "7^H<ty-FYoZiM}` pullXS}Jޖy&H%jTY22ii{^ .]֑pYPN?_Gm6TQvIui HqC+,3+ߖ-iؽi*Y \* @dMULtt'U0'[C2TRI6C$g JuiQN՗ MMݽ~\5m՘"\%>~4e4Eޏ M']DVi6dO<M{kMw;YTVEtcm*z0a)͉!H~ōgdC3qONOgԌ5ֵ>9icy7=~kѰ DuDѨ m(jUw|OQ>czT򛛾,qpaKkC?^AMV7GRP ya[=+W@Cf ή#ctL3G.$&a00>Ox0=hf9z_oo%yI .FC;Ěd6@,>k'gU+}v%iIKr3ف2>7FΉ=XŐ%n:K9M$SZ"2ا3ꣴ?D7uuB&)xKhf_0K$y"4L;8.uυt::%/D4;Eb85ٔErQy]KݗEm i%@W4M4|?~\cERD븂HDedi:^):Fa%{ 6B IX= \:eIH:,2F,9xj ) tҙbq #Eɣ/O\Zw>;G-BPߙ:`bxF&L\*H^jm ?T.z&\K*ŀ& }3\nğ/ˀu V5/jx$s"_ƫp>!+mk 2ڙrdQǽapM5XtwL[ͻ@оBK dG_>tnd7שÜaXi>R#?1 q;#zAg~(.xqo$rD%[^;_.G-mIXS¬|vq{H)ցݖ'@j~F?I3YL'`1ws@{iBJ+[,/.oFտ!(Yڣ@9>,B9f6f7׀RvS-X&ّ2U vD|hLմ`l$vH78.PZ`giM7iMkg$|ocl R!eF:1WPae:SpPOѴ2#a6~  jPKN8M.zE_6fĈ/ WLs}$QSoՐwt iN9SA4J]" lry'E&,2zB+ vO"8545)QR:h.TЍ֤ͦo2A3y$Wze{Ou#E\5U|cߛP64B Wz|{Mcl.gPJ#!F[2.EV} EM-aYSjn5V祭2ٻT)],2nTR^$aS4d':JM`Rywϔ+'P 2-YSP79F9v(m)6'I/ϋ ~R[|T eq1̚jbZtTiW/HXt#.?(sg~HMEO0zf|+hεȤ2ȇgk| k"kpS 4br1dxV45X;-:.VPt#P4#1?vhڄ1ox2%u~`ަii҄pYDM1-Pp..kv.ޖʓH,C7"+!&aϒOE*ڧM;K~DxԲ9TzT9k/{;,ku&S0D2"!s qh.@B5,B%}[1G l"02ieʝ99h^ɒq[84 ]Dũw\0#ϝMU4|ZGb:r.Tܛn ^ߔ5Z_7Uۼ$RD;{z]r ɥ@8B6d MN% >/?L%uQ%YPqyp*rWz'\f$$PnX'xY$bL++Y;7jp$i<vcu~>~dҧS;N*5m<"e ]߸m)࿚68-WTѸyGIZ /0M{$Dڧ,b#*~l#|=}W`F0 EM< ~iHd {;5bE)kwb )+oP٩D[Ԇ*98:{5i/9L1ʸXb_bF0>ϲB2A%g-jq4/awrYc -ë́w"W9#+\E!x؀RvwڿզWzx$ja[4쌀YxZ.Zri_bfTIswCB8" \h^i4D!Z {987C"`]_ڞKׄ/ g1Fol/7jQiÆ'Xଳ &+&lc4JDE}IT#aJ  TuΈI)āyLDI/6ї9L63tCE>f_-6.@Ĥ8YgD`ԓ< ͞KOqt6LI 5kqڿK*rLǂROjtAѥ^bS<܆?AJT7jeBEQf(H1u{h;@(爓(K%=I!Q &m1dcRd e 7810 p∃  fY4|h=.=/ ]#}$Ƀ&?Ni_\ɑۡiU|` +|XVk ȂT@@RuB`{],~51O"J-ҿhn-(F0crج"ioyт#iKY9GM2OClX̚.YW{ެOfA[օ?m\'fVI\Y¶ )D+#۵`_T|Kb_ݠOOT#]{l$+b.lF;8\hoK3sCSE|c]FB~F,-22Q:45L eoTc+XRJ3rQ܍Y|FdJD#N&y^NtA@*E{vuZgsl1}|¹gjS</<]EV io4, 3m@M JXO.bs G{]^|E*Ȩw+AHiZ{hQS`Jnb-keGfJl׵_MlR}Ɗ=ڞc]eկ% =釭nj9ILܯǦ5{#">mYwvҤ)o$XsBu,KgDC 1I?$~q2P9aa buX ѦL8,rB> \@]GE-i[A20 `]v䪄Z3?gFz}&i-<LW@؊{o5 ua5Cg5 ZҠf,̠@CIg21>Ĕn]T'BN-vH&5k2cS2,]D>0eSΉ [90bh2:dRC@텐Rj1p쎚Gw GuMp}*՝ >QgwI3/-Š I8SDhTl˴"()cx̨ӈA+bKDa72v\Trm %'V~ItN ItH7b__P3[xi0Ur;~4#T]9}_fZ %ǐY$o3 \Op*)1/W=V/V謃D,s$܍.Y+ (/ӍL#j@%7I$ev ;GE| Sd9[mqNevm{nS?ឣ7WS"0X,&ɥ' IDATY#w-u 54N{ΤyJd쯗@WSn֌^TŷrF|bž E@ 50GyEUР7XU>dcccs:pgӿX 9PVL̪iȋ`îyn?;I-E'>w`p)zf6z~v7 haT{`ҸJtf\PS(# F] ~u*5:W.NxH:E <La-iByS:NAx^^):ᐔ>\Ó+7_vD}¤aqinչ#vXnNyRR-c4upv{$X$e zmoxW`0KJ9L.W&+Oˍ4ņ*mى9l oϸJ(-&8Cg){]3CW~rõ hF -z{CSYq+ҕr:|;J1΍)i摙bb9oM);Gٱ 0 b~Β|,$o;dӯ_};f@t#<"(f*I(2cIc2n9 pL*AALm$B}1~4a+Kjj.[ Kr~90cFiߴc9_"{I~UՒ/ n8`:@B1dM ;Od^x\@@Lݔ~0/t[B&}0)9;"RII*xZ \wjlft> bċ^h?O3H 5on[v N#f{X@ABXRܮ+]9m^]雤5Ezxl4sS_їa;0#ݵOʻn}8obzHiH4~^x8EF9 3 AqMq9/>ESejE֔c(iA7a̓8.r"?)=sX I:zq]> ⒡tGlS}"i҄ي@,kUro1"ar 8L4 4vdNJoE4u ) ;eq颋QcU/F':- q2uMIFxO`;ߵµƤfӶNNB@QmLsS0cpQ<98"=Ьr9| )IXNs=g89zy&Rϰ`nkP Ӧux󕋠gWn׵֦vRւģ2!(®X#>1UT> IjQEeT\r,Cׇ-92#0B~GQf6:ѮIS}a8u&8fShs6ס4fГH{7c7#JQ2IR/^Xxg|$aJ$Wnl+MfZ@@;;*֬R8ޠ9; 3W>y`1S~vrG㚉/Q¢y-~\Tszzf9JbĐ\jU5 ܄ 1h< Z=@X-`WiשeE*sN#Xz>1`u= )4}-E4;B4.~(?ґ!WҽA([F)J_f`Ɏ1zRl\TtakC+1̿xkRƆҮ:|Z4Ja7g-~D:U2RCfM:=$SYdTWkj75{Qi){f͛$LC<+KS+xFROMΟǽ6BQi1-lMՊSqw8K[Y|Ð #H2S4 ,#8 FCYW[u'6]5SS6;QwyS㱁0~cLL lz׫A{8ߒ 4 Png1alWވ6`gYüp5*ua]{ϳmuI]2}FEQ/9XE`"߆F:Zbnl7#m-|<<;r**~9徆26L!;`k:3ODZw]z7Eq=H&r?>^iS'KKN0C:+j/#ĠϴABGpf8)Z= jחaLA]BI';n$}'d}z2\=0ὐn22@f?5!ū(U(N~}Wz:3s`݄Qz*jAwxpnG4l%tfX$ξ~*Z3~J;ď lrHi!1rOC(0y  v-!"Mr|9]1)hfbRx"*,?˱ڴ 2 &qP:yp{am,7UPfg!_UvF\cVii!0<@0oc/`-R9ԄWz;5|s6T y؛` IFd ]=Fi_:}c58v]sU2/mo=oknE &b\K 16ɒ0I5!K`$$ /6ah 6k^, c[i?T6i+?aC cj)9p:Ms. /3Y1Pq5-OZg1XzZ?dkּIst1ީ̔5}/:-LîLx(y ij'q87ܠ6<4KUXe:lHe[ңP4Às؉L1yh=b h phōjmg)WyR 2aE^l4s|ƒ{zAW5r(&f6ñyNv>*xWSI?z3 C/Fh73166W{Zhڼ} z C18`p `mxS0 4lG"3u$LdDؽK˽Ƃ?k${ՒB}T{zrgd츍}F Bamf(@]tUQ7lzAC #lOLwh UruP#Vp"^}x8D2uɳF =o=]x'/_eҮ /p6Y+KD-_ Z j./?#&7 [&Bzm p1y"`rf;.qqW10վ&Q'19Cz'ɉcE'7 1wWA)^4-22SQ( =P ;FZ g<~qAΣ2 F5KiRwC|/G`:ͤDJ1~dW:^iY}E4PgrpotMⓍXY r\_J| E"w DL"rm?Oq/KҰg"MB3%Es4<$nQd<Ҡ>(@CVc ԕ9%Ș,#b<~^4~AƤz_R$ܧlO@Q }kk7C xғ5qbaG(2Ay`HhWahFkYuSiۯݏǘ2'h" s_y==_y ܟ"KͪЖOn@;R,{TF'n|⫹Kthx T'۔ocR*vmaf@,aX8,E'5OVF.Om3),m&HOnG LN qNե;ȧLWU՞ IDAT&7 m(̳͍}pYĀ?M$Joge#~t 0jH_iK“5S|'aQLiMf2߳Orq Hk I-˾ 5+L<<^4}T R0wIz}#GArӹxiL&!oE}7ϯg=w* ~%=`l:nYxY u<`T+{,I[GIϩG0w3 #%u֑ʌp ǤrkͪCJx>rk1q HkүAB4\2mVh3&Z5Vр3q; nIV°I3>!>Vh8Bn:&"29LlZ)Bnzz/uIX8W 9D7l82|=֬4ɘ<ꓜ&l4AQ*<ᬶncegfa>Ii`W7@46Ϗ^u 4/Mb&r^9Y{I)}T9L\;MH_Όaxp#:rڌ8"Tw;%͠isp1P# 9Kפ䴠J9=fݳ#k15p3aL P'~"G%.8~`;pX)4/^DdH0Dw)',~q'̌13؋VExPȾK`_lF"eщنG3b?ƌsalGE@嗾d1Jټ嚋NU bύz#H5ip.״Il08ɛ>L8~)q4UAu <14KUױO20EqL u E74\o'YjH+Smx540!~aȃ(!{tѐEz&csq}EX6ϼxc!gOD{qxLC;o Ӧf0ؑDہF{du)FSߔ6p;cij㲗vY?Io Ruo/i̿/׽]{~Nxa5(&ʴ&ע4gm̡9}* eN}SY_A(9++7h0Muodc` ؤ4}kXRN_?*FAٙhct@!GazOПuƉ( !2a~tC̳ݥs4uE::uvm53ƘT \ !,Z/6}M(# }P,DFR.hX6uj `RwVH _'zrnk߱LE1!gX.S[rǐ/HQEÇ4>8~chct!DB1\s( '@gI2E}_niOSzg?Cc~>Hw _+&Gx$VώS/aTf oEO/Nm2?ce ȉkLڌ4N2u۽AC~Mss,(W2&5o c$?'Ds8q#cgA4L)wMC 2?(u2܂TizẄ́cfrPk1i Jؘ0lÅ!(4~e3ZHzČʕ-u:kԳr~MrmQ )ƁX{f.M "}MeQHXOF2Ei^I&Րh< ZM/ט Bs.gg K`:`lᬙqqVZOP-ҍn_{0H q8%NzD}@)AbUIO6}EFPvO,; jx1 c[b(:Vݬ7TMII(YTmqPkɠAzSmC+8ۓoBc䔙NzULFCZcb~ksCRx*cGW#1.I#n<$;; I~P{=~8ٱ nPԙ.|wpcRF9GlFԩAbx6b|J'G,뵈tI`J~Qlx|IcY04oIg@#g-I@=Ii˲_#}~ @( A`u܏Vh硝HWG1AgM db!{k"{) ~tqEg)Ba@i*ٲ: $):с soR{KQS@[DLlߠ[[h_C]h=:GG<0ƾϮ3ar3szQC1=lL!:c4;J OaM(ደԆl0F%W8< G *%`MAΖE ypÀ 3|%P(@70Z %E0Y1}V4rH٧aN8M2ʢRi,<ϜZIˀ;bG8g1҇LJ+ ɼLO͔scIk1W۹F|loȡKt=8θ[0"IO85D˞VjCc6{Wu's VE?|%\fZ[;ͨ2މ>7n ]B삛f[|NύK%IҤ:wa~j ?U@ }3h=Xz M|PpRqM]iAts& *$VV|f;(HFx]F? Zx{cds 82Ɵia%{20:pMXj"cTW;klggRFdhrJe!SUӤoXMfd|_OtzBtʴ쬜޹~'|?{ O S^˰=,6hN.,'pf$>)?:=Zp йTv6 N8vUXN6YCJ1xd*8}z9ٞ&$+R* =3=SvXSC`%d@[vn~޻eL9-'فƐjExΎ*OR=*;Ժ.YVp&'@p1+N ~fZf$3m* [ך|5yid̾B:@kۼM5r$-L($#.?yUjYlrt`X˧}[h.7Y4/HSDIو9h051#(1!= ^J'޹$?2j%eEw;((wN7k ~4U BLEmH Lm3&>@D#~ΡFoHxb+$;_t0}?/ҏ~7g%d΅[$Y$R_4gWaS):wҞ=j,&+GdZeЖ1D>T :fPdM٦{-ZhD1MhvŀΦ "Qvo?a_LyoS :r6ST_?Oc4U2Ϻg!5kBӠTc_eқ'NLMrt6t;>0\uQh,qف@Ljqs-d `0HǸP: =.{hhxS5S%me GK]{гD_zP):&7$ݣ9\ p4V(Hl12|@̡C!Q}$0gDdJZ)EMaOXtaZ%-^,u.g"M;)*'@zf*(Alak@ g0Ki24;߷n?L$2 PcJTMD0J43w\d 7ے?%H B9x'nF/)JL7KƦ ʲkɆCz Z cIxjJB'o"d,1R/wGv,!ԥ܎ ؘi< EW0ӴKtxd޳>t9tA'^`j9,_ > Le:wρ١Θlz2:uK`yE6΍j,^#{Icl;7zS S% clyCg8=xwqO?:, 革Atul4˼DSCދ#)HB܂өZ❹bfٗT101Md!h+L8dK>ze{?i' &)/j"!FC*?=Lqk=3VWjuDZK ɞy4JgA o `, 5H2x:LCn@-QI2HVoJ3ף?-p<; R+Ԫgգ _hvr+8 IDATfϡ6O2גZ8-iɣ ="<Z#nXpn~ۚwYf( TҸ0?!otM%Uh:+J2"վ94iIw"B$W  *+POظd݋Lɣsi\픫 4VĐ=|YSzIsfr ,3z_J\IhZRMv*_3^Hg\qm`YL@^uX *˓e J 4'⛖9ЦDj66пΊESx1f;>ʹJfhDѱ8{k{0PswI2P#RJs K }`14Qͺrqz7g3G>Q _/x:_4e2 bp'J'_.Mi5heM8^p|PFUx݇g=خP)ΨI2F$9&F |0OFPY AcD{\#5q5v@#B%G ĄX r)Uώ 89YyZx@h>s!V-8t>CW﷋NLca1ݖQL4{!c.;I&P~.t{r"7Ym@ォF6-~x}4l=kܧ|oIiaȢ}6n'ǩsL.ۼH3ǚSk-@A7N^?JbjLfFRgEx~h_΋,\(k^8Ѷ"3Q0LVH ?ey]" YQ?0\|cr̒drS*vY,( 'fY{HcZ5KK $Bd6ï0)gB"QʞH%:uL}Ng3 ƢHa8z1үFVEܘ- =u쥠Jg1kepɮqTc f}N˱w3B4L_*a{ܘD s(;/PK#՛i5p}IJ5#C+y8%:Ϗ/5BPpZL*i TZz'ݣsUC_ 0x uzhdAjèd뼿:il37wv~Oy]t=/=IiK9 Xc|󬟦=z& !lykFQC)Ѣ 5xowdG;M~N̏ 3uU#CE/-d,H?6ޑFIOme:;PWRXf*J(mn/~- oJ7faǵ]jʵo17۸ylZN {C{6ͺopbu۽Խ>T('m2*X+ 9r@6m z MQv|w+bl&h(eƕ%4˔ϵ ɢP_D11ega.X]^-3Yt8‡o?Cj^o}B 51'9RW"L$/U:6y@8M RK;`@$E4DzI&:1dE_r $d3~!\X p:RxӼB}#B%Q_t'"Zn6g6 -ѵ*A^'^*7y˗ *p1 x^ݣ ~}ݑl:THwD''*-ULat|x}i=R=%$(ov='DUdZ#Z"VnX Ñ| B[F3u % 4;P],.fC-b,< ewꅵC|b:36߽5, THyAu[@|K3Tb#}Α%wfF7 x0$L1orlR ZN܊}=^-Chq@l 6NV7[3)ץK!(.Yd/IX`AZ$~!muzz-4i[G3{: =HyWja\֚$GYzqs &=㊍TWf{R2&IEm N09&d=&?l&iw(J1ћW *Ϡ:XoT==S.+T*f2ȥ0ԩ|^}N+e=,"0#aj !bu!]4}'>0p'wo6 E> ߥVL5DZ }f;C ?2rR)uGh9OIRw|,nFR&| [֔rW]%9^ft7]WLߍAN$Io=j/\fĒ$gk1DLGrT"dZy5 &ɷ9k.13P}BFyIH 'h۳\X CS΂w@av/#gŰ%EG(jZ,Խ#VtN/#ٝ P {2!Ӵ[VK(}.@Eэ`tJ1g2<^p>Hj g{+ +J$6Ƈ׋fNz(bMb E'^3!蠸:^ǂd.="FP IX,]sӨXk9p)9ĹלF;l?42.&^P6OE+uc1yZ>: 䀋ve q+`Yxٚ,hd}aCsM]dQMSL 3^}ƪfŮڔDEQQkyWV@hfT}; -2xYA{e uQ3{{Dc@!4ΐ׃ʿnf闞o+=:Nz_J<;{} X-@YMg9HHI&s~3^&-_maEKb(-ozKgmJW ~4G]{ܩ&e|X_<4OM!'K+cMZ{~6IfC{fnD̪Zu=d(i mvA|1,|Vx# !)V,Fv|v9KBKj%?w &o5Ǒ?i\j374Tn#_A6(ް>  &!3m=Ԡڲ̹(3rQ\k}⻷4t @w52Х2ylnːҝZr$-2쁺4}xr/IRlI5Z@:ƨSp\zUH/(:3)>53 5_@kR롺܅"Eݾq}}ܤ7x;}I)}ݙ608 LJv!Ign,X^SbmbW:5Y{pY@<2A&آl+s4mւ Z]MҎOЦ85tFz=g|;5,^Jo9gͮ;㻏Ѫ"ZKP/ #O]=>=֪43 {/{9Ri`;1;qA*Ts#>.;N'ꔝJk rF\zmqXr0+1o#[ Jq\Xp|`%Ui[Se׀!GxS^6ЭW^滷g1 OJ^e:~ôkKkҠq2\Hs~zj^ w;8pa4ii8X@,)y >'y{AEPA&’49!^9'ۙYC3UH6H6Xe#T{o8a~8;X_2"k&cS.$Mpo \5S=d:Ր„Fy׀(xW2aWP\H$3:ϧ; WadzW" m3.XDm7ÛD*iHGq3&INlE{nTU?쬆dK8*7֪=lhB{ɁѰ!Eзh˝w_mƁRs HVvD,_b!\短[AĥAƗa&YM?-14"0M0sEYu~D cq @n V[оl;2r Q9 12ßWm614KV߳NPk7/3O'WeDî ?cEOٱχcqBNt18J=>>iԷs຅a}ܵ{FiBeW# HcLz|t?T:K @@J+PߥXITV <( 0htY&knTXYަ5ѩzϤ& oKi:@YHvR(TGtQ*3u9J4+Ц[N1*#+0GƣU=Y;ٴ59hój0+Lt&7<1gzT]D-J+{6vɏ#OQo_%m25fG,Ҟ=SjJ%0f6hRF %OrwdISAwWY)MF0B9fX8]GY/|6s7jgwֿ"M|NW2*ed2mڗ#Qq.!H1YWq7vhOeiN|",K%CiTx0!838 +y(P4I4L8c?5)D,֐7@Ui|'o=4e:F9Lx". vfм01a%FQ=C:_xXšo2gt4 vJU6!$ђ2F=Hj"2)1S.!/*Rz`sA={p\bqnbB@iNj=_8ψAnjB))ԨboʂwAؘ̻tHC"oN9:6L9xGyG-ߵ;WYD;O5DC'-/fgS,<|8 !y$a>$ʁnLlDhXiG(4Rg+wꥧŝ=hC'e-m+4#k}.Ev79+"ZpқLe)/576 )S6 ^0$;kQψ YdiVgpX,B7LqNDr}?Х(nв.d=Q`00&J#ͣ? vҼ~[ gidl)5 ¯ Oeu n 0`J}¶I, ii$iR>,f 1P/q.ik*ot=kfRz.ubO\nú_}Y,֤' '=_qcfw ʫig#eDւV&@n|j/񬴖R9:+-Δogk4,@fMX*V;}# Ͻޚ+:爊6UJfuϴqkhxͷ 'T_0o .zй†vfpkWr&ؗ>~J]5r9k _)y98'3>w[jfH^)J0pP6%f%3Z Lj c0KP=X6RSlғQ%ٿiX,ƎJ-~npռI"j4i ɾSPYǭv@Tpϩ$fKrk#z$0YcЖqoQq IDAT%@߶ؠ^={J"-z(fx_ş}_f,ַFW`eFfSN9h{+n`F|>KA?ӵȌ>/rSk]Go%:RR?o| ֓ *;|uQqu\&\-e7Η*dr : ]6sQEI>u@sF8X [)0$qN`pŦXFʹ#]]A>L#DӜJV VSO J{:=jج-zqivdgi y=|N3 t4X~g(g\NK\p,'ad[L7a[L] ]6γ< 'TѓhO r/ hr3k_;8*MtmMG/oN<<{\ 3 MaCx>S{ '^P.b8 n3C4 c~ly*'bwk;BwaFwW~D_c \:Kge#/9W!m%i9A@e/ D^0jؤ}v.S&]/nR[-ᔄȌMv"3,)ozdgVC`YvҔ4.b*n ¦yW}8g2/}Dܿ۸> ,W1%Qt:3\g)N =30[hУa ;k05j *lEw 3>4k3j#8l8'n$}ܮ(4fFeOF4)NbGђp52lN~ |V  ɪ]hx;#7%>,4Dĭyv!t|b 5x&pNM>q!=9i2Ch8 aJWbP,OtvIM Lޢ5Vi F|Jԍz|IRXoҷ]$s3ô+ii/IDKvРW6ilRL\◊ j4t`j$/Zx4b>ܘp J46<OFceh3Xlyٗ" =MVGq)ߢsF;HñIi.RL{B%RK͚7Q;1T 8{t+L+zI7E \l'목|Ca [e2ueOO,EqEn3;1 b#**Luf3Ai- S-8.*xs뜽OD g^Tw/Ɇ1g`}-Ɔ]L>Mjj f>'idhƼǠreN^\w}fqSVV1 $DEتyȤp6V'!knn8#u䑳# {YOXgwi@AJFBCT$dVNh@ GiA,1$,rQ=EƚtΜ;S**J,<âm H| (OQibY 3[QZIRLh4#~+j~!24#\(+86꟝结ؠp3J5WZ΍K[2xϖj:62 Y@{DEƿS|K:~9Lxf$XѠ)ŗb bշEET4iѭdC\Óܾ;foz߂lWu& 83OsЌèVg &2jƬB^D2D*j<~LRPsS0!aՄdV8;M[_P#C ٤ ذ)֥}-rm OsYމ.X4_`0s3Gʜ>~8L=\=.bEtiU["hM ;/!΍[ps1d 5虪!XYhAFiݝr(A]d%&+]mHۼ gY'"` ?s t2:<;4lsŔPz釁ihTTU(S^Gt C㜥}Bd)rHyr |Ui=?@YR}Pi))Lޯz׬8Q JI코@療z 2[ձdyUm'03՘7 Ђ<7`x$JMSMf:9C C҇J5󙸹2^\&عĎ$!hBzW@ϒg*޷q^/hUlI8Gf%/IK괌?b^e;tFCYaƭ+c@5[^)VAϸ.ȠCJ]{vzG&xR(.<(d6)MRG軏VvVht*S/{J"T&ɖrK|]ܯdſ`?:GW~.뱪9C3- Jw(UZ)d(y`슶"5bߗtSz(k8Q%s6*(:5=sT:dX$:m"pV<1S3D覉J48Ԑ3ӕPf52I/af~=8:%wŸ ź&~_ MϞ.uM(zy$Yc-DAr3xveFñ=(2AK7&B<>(I|(tn 1ٲ ]iNnAgIMdZ1 \LRЄr/sGnxwޘPkXpΛ¸g3&86No⤉Єwz ;~^;.uM~úL3<3fNs6ԕ } Y`{ENNBl\ٸDM-f0ߍgbEҒ1w)yOĤH 9ݡiƙ ]yO{όz·3Hvukޑ1%ai/1Qda7|LIHMT^ht@QLWp߭ %6J/,[2M9 0 LCwf,osV}jY]fۧe 1)b2pQgawy"!MDhޢo_=Pܚ8+Jw+ %9W1E߭NxTO)1ѵPVXMco/u7b\?©?ܩτtr[&"s1Fw5mLwN3ENEKN!g+=e]IMo˰K%d ?3)37K8~w',.;KB"*2&V&$rƏ6K(AX?@H%x&ύ oڐ}?d\^({ K"Lr/-q'bQĨRB2z-l ?CM1Qdt087r73ֶKij27?_iJ}3lZ_10gJdz)} N_D٫(%)J73ۤw97#Z%) Rh$Dp&67 tᥲ~t7Y'>j 5i>[B*3LKm[Z7(4r|. ii }4WsC|toZEhtr@Ōv)j1{pQYdQ"_ОSd1F rVoE$mo2/Rx@ݼ 1RA**g3|뒀t@EFɭmm4|r!&RH\Y ^y4qMJ?fhV cpe2M'K² iƜ@< xZ?SQbo)G6- OR iOZJ񏹿tGUh%L:$sF=BX44\ fCc"A9͌L݇SRt[p6 @o9z\i} mǰȂ OWt'kBt<㺅ih ,{(k1M2Ľ^Ab 8ƺLh<W(r L2Uh2;MBkC}_WJPWvmugQ 0 5L#wBPC?/RϚY-Zq4YUŠE)괤qW 1/m" 5E1RSib)ICaśjY‘o7 F8k5w|XdTZ h$0˃/Ni/@.GͅmnS̫J;G͸$06+5)x)i}t&p^Y% 87[4)GĢɱNڃL"I h-o* bof3;uܭݗ>/ ^~ q|ZƀAK#G)<>6h Za&cᥚH^y]mope@7[I RUyON"fםWuw;).DgB㰳5Ԁy=Etrw<0.L\o. cG6a->_4(VLCA@40/?ϳ0Β$fƿ u{B1L{HoTo u5PR,/bM歾gF$NIu^0-3qsaFSⓣ"\h̍uM43ji~Ϟi[VD) 鹔 6t iř:pzNB@|KA+Է#7CvTID~δb F\}L"@O3CI^Tgo[fWɉ4 ӰWàO7aIEkrXf+"~g4H.ӄM x)b 暛t R )sxyT,>\w0KrWUDG[&*3Ox|Po!f";21ž a 6cFt1>Gn%kKhm0A6wCG}xL*7թ$^.i5(\D6-ܣo.s qv~XׯP$.`IAU:6dLQ>znCqH{i&5(LarJsX+/&Up~3̬V PV]7-^;l1ehҁlV\cSEEQg4kTpV04b&^EErwŠ7OjAM#6if\d'S5uEpsFEba .݁'\K-.pm-f(wPd:49o{ ^lh%hθTl%بXM^,Nġaӝ7n;~D!e^'YiyIkSЬ;6Ѯ9E bUQLꦉ"#.PyvvGXIf2bH5xʟCEd8,I9RIg ]ڥLb7]`|u>&t F~8St]Q F=l<TζIIBO=ӶcBq!$6Mjl e&dYi"yZWƍ!Nc)1au0-Ts6\9 {L7ʓZRm]'5( D 3tLzvG3a#j*s}?s % 4] q0`L\D5{㕯41lWw3ɇπs I6;;.Ә ̗$bZ[Xy6ա22JorP?&zK tʟ} ŹyT?FbPI#!5"Bc;x`]!HSw3o8+0@t,B%Q&gΘ.=a}wx_Ϫg%;;eRޗz+5ňD)56tOb(h^]2BC+]$5 h wUMvնFIz]%֓].7MK&X z.JcĊ_Z|y5matzL/ IDATxhF4HBQW9æCc<HiҮ9@Q"S>u?]iAöɈ!y@OVi4ձh59BA)mC&9ǽ`ѓ} =!{*$櫠Y6)شa7L5Lñnkff8b,/Ό˻<yk>QUCFVcAqCB DW#<" KT4^&KLRcճ ud@jTM|u"trb Pz,14/4Ӝn ;S[H%`O^ Giծ^>]w(TOy4A'MFװS=n䄖miǵ,Kޏ]^$\%wZd9DAPLFYK ݼ2=XШoqa%.{P8h ;5AjwR7ћ&AoUfo89\9PsEҍ 60 k\K- 9?>n$I{9ӈ 'VIz{|H.V|wg?^xKpASlA9p ĽRS  I-]kJP^d̞Li%jiR([2BYnڱnpl)BD@B2Q-Լk]1 arI/(ߧϺaE2NW?gf)}۸9`G0rwY)*h4LLT{lC У8!}[lf<j}=̩ 1\,렟a"vKZWTE !v SMaҜ.JWKid̿,f!"ۅՙv|_ <#MĒGj$싍(uݦUdFBBt.ªd* q8>{!Լ(VT[>ξ~FNL,G[IR,x-d"ɠ3$-sVcX0pR%/5|4eS/93=YB=?e;&#;^68le' e뛸tXplf>LgJ:Lz޷[4jȈ=UfH>(RvtNFEIM (u :^Nhdf6Y|QZxu6}6+J['32h_J)O57Go՛-8H}(V΍#Xn0,nզoORehZ zE, zL 4J~  ]d`(eb ) e*GF_}^D_Bv>R3= Y1K*i`XCVemP#Ѽq`X)n$'z+kED;JuTcfؚ8qpB5I6d6Z!^Mph:2wre0e~Q5UG@/޳`_֢[(Jg̩"wjL$P5qAp@ *όaϭ7ic.;Si/+օ40[LJlt"(9%4y+J엝K$ I^%3p3 qy$E6z|--'P _)<#`TWMyF)aYIQnqQهLǸ]J Z0n9A{38a,ۛurO5ՉRq"_ Z^{.^0rE'ER;䤶 詄!Cy}\vֵ $ظzkK=m5w '$0:#iQzi{/qFc¦:mV2nDtɋ1MaђЄbu} j 'Mg #{399Vo&SadOM3 ҠF&2F.B<ݧz X"{(0 $ހ],6BD˃^ ?O T HP3hdt%0_#[坤=qf T6S_?_kܦdݏs7U4 9eaXN8_G?ERQO\XS|e|OP]:5Ós~>GqmH2YUmǫxbM< 3 qcCJ?_:?qn9+b\5n8.]ڮԜY#uߋ,z^Hu˂ I44ㇱ~AƁNo6[đYP?G#UDHܛ} c;k"Z71Ae&b6KF96GXҨP[XV =dQXC:I*s^_!LFr@kzLQ&03=!Ήs,zKeq^&َ2GJ`#0;95%cHژAQ9M*ՈH 0di$>e(z|Xk\SC(( 揹@Y̛AۥS]sѵHue mR ?F5=AM3 ?boܸ y]>w?2Y 6 pǀ'E1bPm6 J3wB*v R.Xr?ifhmgbu1N(R"u3%XZ]^7OEX OBTZ@( Q-J먎bKl%J$}Xk}I-s9<{{yE}N;(Ni6&$nʒsĺ#]"'r ʬ/E-i\5y"N䟊')u3d[@>Eȥw0u?|}"a|R:Ik@byڊL en ϕFHC5El35#ucArEh.,@O$Uㆫ-x>X3j8#E.Zr2@zr{2c^6r}7tAHM&vT"OTdwȴDqeu=ïl: Q{jMT$ 1O!+ XaBEZ]:d|:F۵(@`%@!|Jl,sj=trRUf;,z0.$ Mu|~8_#X{B21Dd.3r6 sGƀc5 fqpccqS}L2X@}:Eo\hSN$`Om6I 8}H:xhL\k>san(%f2#3s!tE:D,Q!W#ŏx9XS4%\K _:f#n^jUFq`|>}5A-4;0|gb3'`@F7 2"'hqN;RK\FQN47>419r"鴀F.]U,Rf>4=se䧇m[S!rU p)v7kٶm[ޛe/2.~zߋnm0S6 Q>/P])j!qZ+|F ufa[ In}ik2-U^UfrƉE0ʘ 2/N8 !GiߚPx#7]8b'd'' K]l${M˝~7 :Mf(c:^M' $bByr&NgPw%O@}u@tr/ z]TcLrNTߍԌVHY&"Rةzl4At(K:h{QĒmr@VyW0O4u %?币=C IDAT1\!uq֯Ҋo *lCFiNMXR\^<yFhNqg%E Yֻ̆Iybmec]↝L0^#X%TMA9S.Ԩ]=^(Z-0 @aH 8ؓWsha٠fe⌗ޔ)no#WHcz:R4 *9#†!< S;Fx sp Ѡd ]J멂z8<$(sBwD]mn>=(ͬ[f/jk٢jI败r!$Oş92 |ؒs;S] qr6-$kٷqD\gk3mv.6!S O0`TYŴnKcU 0U I##` JKȸ"ݻ$P;i(1A:DcTe|V'w1ZS,'g PK;]Iq'w<;iQꜚ:Nrm@ Xf|Ѕ3P;"ȑ(T ]YSE>DdDAv-@أKq&ʚY)#R R g;~gY1s` 7]Pmm܍@fM\(Z\%'%^+WI|:&|c pܲ0e/f " #J)YT\#]ga= J&=Y K OY{3S; ϻyRX-Mn~yo )XA0Oq@@w;O,5kɂȴT*VGɫ Q=f`L`:.eEkHgQ7Tř{rUtKQ`'Uّ2KG B{L9EP sM4)SA!&$kݥ[gasf?>Gwkn }Id1h(p#4[}Q*sR-I`:Ӹu-s(.J+Ϭx۽kn\ׅc`+7zem7 5hmUVjB`kG;{]9.zM)sEq"q2o_o<\ ;֦|鸌,wx?a7yeVe{as2tX=ӹ‚(XtXe1^9oMw&@wCH2.ā0z!Sw6 F_s1MaQF"-siɍu$qD{.Rqa&S.i:g"ݬ[z4.srVF܅ k梒e7"B&M'3(~629UγeF{ e3܌~>.xCNe ⃓كt @3;!澩H d4a23gtjpF" 11:EbS{cCrHˍTr>/[if)}Y(U.B-BCT$/-bM?kH,cN4%gyA?m@|FzقPyx׭\-yWU^T|~rڦ.7X~Ν,SuA͉ڊɜyi2|:;iȭ<YoQ{imM+M )aNb@mdsVRH mQ=  0dZ ^,7!Бr".߮oϓ/Hs1j 4dJt6?FM"ޠ cۘv"} $ wO}Cl(`.9XG^:;9"L <ݵfa'@hXd N^.IUnƒMg !oc_LĆ k 8HQXM2A_ڻ?iV tơj_3 dE,:'ͣ3f DI&gAv, ްQ|ܓW?b.kHѬ)t:I6"X N͊Lt3c#^eT6<*ZYM&ªꂍlE;GEֆolnى;ꋱCJ#>jKo~1ssHUiLӱ|$ՅqSgc~~3hN:' ԤRWp.Z4܅̒g{:5t^dCLXe:= @,EA{Ӌeό:gL'˗j@ ܐgyz! }ǧG8Gd(U5ec v*WqMBfֻOB L#lUyYP_犓AVMȔyqkpX 6LQ!{0FN]ydsk/9WJw,3SATN}*F/I fW.T2rG04(#p2$M~N)Aʲs*^1GLDd f 0q ETOH$+?e:#[&"^hG\R}UPۊ؝sh5m3ڬ_n.G^5Mv +_Sd4(^Or*tӓ,ؤ鞑iUDle`_WGvqxFd O8J:gd)Hd5@Nai~ sڡ7} q5mc7fZTEM}s/Ĝ" t=w]9LQ9YS~xǟ}w=]=cݺ~u]smWmv0EyMsu{7޴7߸mook{텯/n|Ymŋb\w'k HGPFϮLŷ% T4k~B+w/qVy1wքV2DPMoW\"#RVÚs/G+ 0יGv͏ŵ'Pۘz#CB35h+j h[k/H'H43a f< @ŚC);Ѩ8r2bi]c"3Rdv^GB{n=1{ɏCx|{'GzWRWD;ojo+/~^}e{o~^ywd%MK{//~冋2^T 72⭩'ޑ +vEû}.]jlLԜ-#E4x Q,09 Z|-b&Nh"E[ x疌ib1\ \j/H/F^ ␛<$ ScҰ&B"=ȥ鳨 n yv5Ы86O4_hLoqRu+2Zf_nVDz `W)ri81eKZШpf_@ [ NKS8bndPtiLGLp8. ŋ$N$B3z0IV',Js,fEwqPf+Ar{Ҟwf.w^0DA$62pmτ5`JH 0|2N>' $>4/=Gfٱxi,dXf{[c7w`Xs!@+`qZ5aY`l-_.؜0U,IMRQM DD4cCK\/C(]`a:7rh/_ok;;\5XDPL Ps zRa" F9OJ&!6Ȏ(31%[ʌEсvTIߎ(ծw=mi{'n}{~׾_7hoݥX61x.đ IDAT"͒C꼤=OF&:m#^.&q5W[6*$P:4-SK09o8`Ð[( f_`& ]֘xq܍a\ggK=h;<7YXG=hB͋ 8z;ý(,f'lE/2i{{kKm3wX!Z TmЩ9Zӵw!fյNȯlM9Ȁ˰RBI_4؋Ш H􌜥ZȢt jEM|KLa ô>ffcs2 z;t0LQ2Pwl=_#ǒ,Ӌ@z ;ܓc0ZpTeT'D6]xгxiMǓA?QT;:H{,㏮1LdCIȨO qXlrAMvIsj4(" G=($f@RV}]+obxӸd). ߒg4 +Of d@,vmHWǥw\5p#:=S@h7t?.t\e\H3^zi{S?n}?lO'Bƕ͝L;ZeV: TA% 4 -)994v,`khM1KWC<,q~G9E. 'o[ 0GV,>h$:LO &gzxMr"HK`]C3")[mg*sz}Bͱ;x/5U),~\Fa"_9&@{Tf-/N~F;t l+'Tez.8}Pef@n0KcQ&ewbMhޭ[1ɅFAK;?*.4 1Nm&xDkJ:XPl L.y4sr`*f΂]9ǰnzȯ֚¥ғֲd]𝎉gdĄ:-B:忣)*c<9{?nџ'~Sv}/¯{ػ?){[_?ʗvoh@[e:1ᧅQtl\id&ӑ>th}Ht„6 d;>Aَ[rnJR]m3YČ9z{c=5 ,)9`M̻ ) L.Vl3)ǽkT<~o(m%PKRVжj;pv>0Rk49BOh4T-vp ScdxB}strHx8h)j_`RV3ғ^#SgG$\}YbQgſkv'kf"W+!AΒ "[EtX͕O]P*wfx3t13}~ ցS_ I C;QML d,ZC. h260ߣ8#amQ!+ '0BA >>V35)쬝`AZ+j0ӎ,9 zLY^7B2˒9cjbڣyƶ[//o{1{꣟'?G^} 0oҪ/$Шs р8wQ*fNN·Sr*49jzy}w>Ηe&6J>A|XE,s9pXrl^Ql㸫IyLej+N2 R>](e8L㽘LqҁWŻj=+C_9O3f˚ 畦 ;d0]86J> ISc8~VܲMfֻ@^w' J TόOX9МZB#? 5segd9ōp题n1_'1gd#afn!k}|ه? }{]ᗷ{g~~s"n4QDVO]ry(ynvhP !PIB± QN7-'z<6 Vh"ÿ ]iLrL"<ߑ EA93M7 sdRϽxz\(b$5 SRd4-,SSEV&H 2-RbJ[i 9z0&ܚWEh`~hB6vqnug17 KU{[,c U`'6 A cm~Wߟ'ĜhcQN{gA#~ }/xF 4^. XH Y4րU-!DkHB¸Yvg%=$L kQXxk@jsMS]C9= 2@@ U&sr;u .8_61s&=EW@Q Z.]pR҈zpЦ[#9}ݞzv}헻Ï>{7oo_].g4K%8\)VMڶb@bBh)1onepu TpbTnj/i&qUǠ{yu`50$Kg1QMqBuۦ%ni6CkL#<B=;MMqiё&n؉K`q wa,g ?O˹YQ_ }>KsBt63%x=bd0.#xKI#pb#Dz":2E /-T/猆W-Ѥ1I39TeLy^[{xI4hPU_Cel}Imghzd[rd7:s1u^`[Fò&M@:Yw$W4- r/9pNuȹ4tqɱaDyu?jBm,V CWqI[]:6^B'~/Ȼ]gnoyeP 91f,mByP|#_iI0:Vl#A>ETDK ((شQѥK41FB(~ jsCXpm ޑmH'll /:.sL|ҳ\I12[4֖,4QIN1.ˤaC:(ǔQ5.|wzS 1B¡qݲa;]:1X>=M:T$~,c2Sٜ\3+ ývLy 9(QXi%xY:JFE#4Ks9cꩶ]y <,)G""UQt@ocΟMѼyꪎliȉqSs[&cEXĠ{41CczWϩ k˜&2DWSeha 򡩌Tw'K5asf"];GUbMr6TZs?$u qO>/1>8 YS!KΧ8NNa:'輆< =="d[;ː}j~<̺P \?q y E(Etظ,"ydb『KWSϩ6lƏѶ_gM&Mg"PG$Ćp\ExBp3 y)W3fEt/&+Q7^݄bmfФ7B̑*I{/<ߣUЁ~ʰ̉3> 6YSN-{ݟg߶oO|֮_Z{1ЏmWco=Oɜ]]?"MV{"}}m| pֺKRD0AD=rc0>ȃO{c\o-OVu/\ ramkFkHϛ$6dSM7s6 w1#=dj(no}f8L~'Xw)=C8N3ڨz#ғ x',VbȀ LEM][1w67wɐD-!WKpi#. ͠$)พĀWT=)36ۈݱǯ>omkbN euVX`yz&e8mͭMNMt ͭO|8Mqhw>]kgX0gʨ9e=l&5fWy| #wι># H?ezenzy-x NKbp]b̮F/6Td) y9f:ѹ_c?9?/$fOЏO^m{X)UT}fPӴ,$Ic[+k&2* xh+6>}:[Ӹ_< *ïWrbR;yGØ:qzׄ,7^3)HO(FJ4G. -@2^S*[ ӢKAzb8¿sVJa iJd>G "Dq9NyIy/R~ JH%0*˝m5RхɄуŠb2dg.>mi\/t[mjAsANF AjuaCLY3Ұo$1x b0 Y^KˠrulqLG0Wdl(ixj i^ j^0t|V=)H< ybt*"ZkMўwc0t0D5xM)udNÄ, R@R1f3Wx$P|T\>Q4 bʠtmQN\=vugZ$=@?7N+3`۶6\"Qp֥|4^и!9?y`?u{>kW<z){?eo~c-}"- q.;XdxIV Fj_wL\y[4 IDATٜ A9ꁾ4{e ^<j4;.J~;l_Dcax#0YMvi&b&?z;G{<#PQխMSv_q.yGmbi 9E&л:gGX~'ꤑh IiUT@]Lf)\܉"Ƒ6֗ Ȣwf86mG㱖s%`K.%{#z 62q -psəzsc\wfO Qi${4BX=aeM"ض/sa RU9Nԏb[Zl'C?A7 C!3wf*[SRI-ӵif\ql0 NOdMjiT^8$9^c{nɂrAj\,կXbˆϩoh{>=Y<Ǵ{Ēϟmm݃(GjM\N<$FȬ~#%iqgl#M ʛI'+KkcO\}>"^HA!2H"WTМv l;As'F?Ґx,Hڎbmd}* ?R X!e))v b 4xz&/z/ mPSy0J!y:<\o.éf)*VNps-tW)EB>rշ{Կe?W{}?a<93r܈=x(x|>#/8bq9bITXitXIHL Vxr}-dw6@e̐8ѭ ,VLjl(Y+țHӱ4?1cy^EH׊KaS|_ط?^dA/5c3>w]PM#bW :lU7~> AjjE\A:ͅe)i lO4فV>= 捜w/KٺoΖKރ/2v&ls}S32 t~XQDAJv"PH0L X$w X^āka3_\I ǥe(EQx!4R3U:ibx]w^G^uD? TBCpQTVt``lH12;F2Ԗs+km!ˊ a˟L0hnatB|YXL3-Ft7t9,OV04 S k2Vؙ| _G~ڃ>g>y"^y{[o|}nKvyuyްl׶]g>l?N{z=3;^Ρ3ng7#_a'̗sųBzjf94@Oi| W(l׃ W]ƀM䱈>YbZ11 *L ߠX0p3|Oٟ! .F?4`|yb|;Wo ) V*h|VƀO#(a\8֢8K*@ʚ,kN>'i8.Qh! rB_=n'0IQHp/#su005 Db"lbD{;]pXX; $tshzc;txXi{ }9ܛ`J%mg]JqlJ'noABǸΡa :♇3}_ ;uj4!2U7dHqY'H=ɥa8_/)래li}aΪiƮid]lNR¡^tZf}=WGLIcFdd~Eivd ocF:N%e$ST;fcC|E >9"aXL 0Х RF^Heel̂|{~/u{_vÏMnna} =e?7^}a_c22·Zݹt{v߭fQ{'#'?cOEx:5ڭҾG_0S5SܨB|Ci!«8"iRH4%yrQ1_cr$qcXBkN ,ldDQb?/K OJ[SAX#{NrTgSRqhD2Q<2˧{|IC8 įEfQ!dw3bMvc W;  0z'L0:N GKx52g4i OH1h6"u1ÈcBdnfD Wﳈ^ƗmA s2"=spԚhR0Ɣ׫~!Lme- pxXr_Q8P8_<9'B빹iZ"J#[ 3h <d 0| ~S/f1|l/Nah(pڹ~.k x7f@#~?gъXr$fS<hpL ;m6GP"Ns鿍AãХmmo[ϤMC䦱jvg<eh3WM}1;I }S Nu`=Fj8`ǰ6{Vj{$ܮ>($ Ѵ˗Jnڤwe{X8C4m9V (;"A/%!4K33 : vZASt2Bw֖X ]%. l1Q}9x,]aE^hIRfhȊK8"#uNm/ٖ9D|#zhu 2MS)$.AsvC~C-_죟Kv4x;_;?sKvs5xz\Ю68T<;;[7vUkvڋ}Ѿ߶{mch=qkgOm- N[/ .(teiiЬalB#^T'e.\:0w&|BCr I KTf;&ǐe6Ã_.澑#tpP)9sJNdFgThP@Y@;-#OS/sBsB ơn˥0kA,:d07Gxj0϶y<&*c\bf{ fJ ɉהNۋ~4\k{ŭ\/dw<`6N0_[I/ _ nfÓ93cHS?&p{^Z!h0嶘hܚS:a_%$猎`bg7ã`bDƸe莡 NSPcY"tVKc|ْAR]Ҥ`@؀M+G< FN%ӵVk!uCA -\eD@m5lЎ=̫} {Тd4~wKlq=f -v,E3#TtO1u0} U<߯˼v)j㰻5a Q,*hYk [R5p͉2*\N>S e>@~.G ;;5D"k!7? ӈ}wPtkҊ "dX!v&Ckp9ҥ0X "Q>Wzt8ֆ9k9WYn9gEf,fyb3,'NB%EE)$2Nq@He4p643rLv) S$%ESŋq0Nve?v@;onoW޾n|nn^6;U=c9_znn߹훋y赙T&ܽ[on}o7?f/ۇ>wHpȿ+ſ h7, \+\EXKԝRR< RH3K&2TVy~Rx%vQ``:HDF9QѡfY0@HYjx}5"TR1 $ 6~'0dR׎S@O(bk oql`յ]R ̊uB{p0lJ('x,dLҐ0= ~}KXK=%҉qW]gD``iq1]^~k,IP|ω^eX="Q פp[{bfYQGID%W tIheOף\h#ױ9z,Jz6>5xfotLCK'b/5cWcGF7_#?v`h+ߵ?~^zv淬߼bm@ҘKo`l,G4abFܱKh}ko?ٳ?L̏].7~㎽z2oP5"7f ޔQLc`,|ܐ~&Ci`Kϔti$'.̮Vu \mJT&qNәPzv-e!dz B0{ybE-s4 {ga40sjj{23kEHXяY`@ΒQ4chRT[Qt 0Bnz2_R' VUxͭ&.FpL5ٞA$"' k3LnK &M9уFWlJ2F}-(&z<ʋ4=lĘlJqM e:B @+ib eM&Rzhq9ANE̓Q w;52+3yش5)^+jxa1Uw[QG AS_1;œ@ύ]~vd89h9x/I >'_t.9o0ǜh/w!f~{ǁO]oi{|%%-+Z<r&I>A#2t``1L?C¬xt03Џoۖj{L˰ 4J# C}gj(ཡ)4V6![A1+rydqeyg\dc,=vz#d #8wΊF{#L0tLpDk9?I]HKL`긡OAl=v}WM/Dʊ4X8Q\|z8m!Ҕ9'"%Yy ռ1U(/"&9Gkަ]$7infy]p5,i>اӴXi Fj/']mnWXE`xbs^3F?f7=M6<~r>̫@L@@Aj4=Wݳ?ڏ_zk/W7}h7o}wx1*Yxw.}OSQl[]oxj0&s?Wl-{\ZE׾l7ohfudieY]_2@i3]7qu.t`ͥ¢9/!Ro ,V,†AǦY>uh7'0XYt6Xu=iebPйO] wv4:k p@\@NO1aAă!3[S eGS7liԌbi&&@MX`.jAL,S1mWN4R\Dn!'\ɘgZ2/"<4 uI[`Gޥi'0!R-WQy95a ~i[81FɱoںWݒi.@0|! Zpg P@0xV:Tm[v,ڋ(T֖2E8(Rq9~} <\ b9 gOY:V*9r2#@q5Bd" C fY Nukrvz2/p>"f2I24"6b#stÓ OVcŏo7ԤqDf@x?ieu&}}y`Mdy(, -)n;m 8/?$ 'Ȁ; t' w{@[ݶ"ђ5ZI8U{I IDATXEXӫ7{ʏs[{Wgd{s{o}CLL!Y7 U X+n{ :Ji)o p #$,`RAkյ@ǐ.DicF''IS!4PZ՛M)󄫻qlR TRz~@?Բ4k. @KXGy|7,[d}x3o/Otձ e #oT惓ׁA^v}uDjp 4]I=y E!vҺ_o9.챟`<\|^HhT=Bu.OJL$w'J+0y H_Ց]oAx́I'qP9*'Rr@Hk0`@RAo@'($kj)EZ3-`E0? O)V_Ůӫ*+(ܐtNB( c'47,4Tڪl8Tq{%1{TU1D?$qD׏֋ʔnԞeJ ζUy qIILIg+ 'a7`4Oe̴dF֘F~Q-հj: M)u N7p "Ykbm@bY2#M,*9N(&15Fh=lPRm("? 25uҖفI*c1Ù &yCʳKB%^&j'yr-G`tM,#,p)>T22U3ФƸw9ʙ+ȖvCRPMhT(Ns a+"MzKWE=d2⌧^Ge`CqHPqF "?3{c}TI" 8HO |GSul~1L[I/Cl֢mT-O.ɑʛkl vjuںw6*Jz!)U sԃ:Qi}(bAA C6Mxg -7yS[ wŷpaoc)\KFG6ȣ`aoض‡خ,}~WɟxobЎb%Tbh  KF{75pRKL>bq's5?XNc]IXpXmj,ȫf]m?ZvR<.v1>.jjs[c&7;tKMgF [MX(#~vuFI5:}(֬»ދ%F7Acу,dzVHK&#n_vXF G>!u34ɓ<&KJLvB񃰜Tf+b{;NjŔ߻Z )d)u ZgN8P;}07Oд n-9"j @",|;Y,/ܞtNjeo@]sl٧ӣ 3"@ $25" JRLkv G dbj׃jk`v:p1rA89 "nch,e5;O!I*_jڂyz![T6uO&`cM@xhej`7MЕ$ܟ2 RLƭHDijk^ƕϞKa[Nx1 OQ]q nU8pI~f9xS=0M|] \5jMNC2 .17dNEU]2XM9)Rb{K|F@$YuOf#Wʾ c*!"hJ;_S{#M'5D @nj]Mh=!u BsvFۃ*ul&I77v@0 LkA÷<)k%M2ǀY"#YqEl^I3@`kl0 RP㥭UV> AcS(rY .nt]_HZ6o1__ρ@|C8N;ɷ,h'YJ=v=){3"g/OI]V%UŤ;nBաkDQ@@l9S6K4/h^-*teEPO]7_ $qMt9ɒ1ں唩2c6"ScDXA$MTy578Wz=`X˩` 1E5&nLu_pǾ*mzFk8s_X .^_7AT$i,ch Z>^հp2.%(%,=`~yCH۲)*QKS/uش إfʥycmj($Q| 􅲪|L, T&vz*k;0^ES!gb )Ƭm陰 dF5,{%b;B&[[P%x&FK]!?h k͹BJԊiQȨ2G^^ƣK8w<=\ZS_rRyt~gobcBS >5DSqȮfW&6lCY*W.iCa{XTWU_%`%ahLuB3\SvmiKh9] +1C>Rڦ-WJmd]ʩ3)Q'9LԲ}ne3݀?t0= רکIŤZI-k0M2R/jLֺzzK_/OCɦRiދ=^s3I0vuF٨eSK[0+R@rv0g%jh`Kٙ=J[ J-ME>ML՜|Z$ LiT=*WN"1ulɊW~bb1M#5 >6I ҮvTB׉.0S1Ş]Q/ JJ֊PMS35䳡i ˹B?,[Y{N z-F Ug3qvDO 7/mJa ͹98"9P$¦IfCubJ9nRKfy6ϰM@ Zx ؟Ǝ_;̀:W|AvF[L.;d'|Kdh9ңG tIBx)lxO#g𹏄;JhFD]WB6жHq9Ti `'s8%'IZptV( 2f&NEp ]"jGa#W泎bcX_cca.bD]S3[]LJ_to>]>OM JSn1aT0?:n j1yGd{ߐ*U힢S(XL,qE4jgLjMاAG}SZ6mLG rlsx!pl*Y,Ѭ/G'讕%R9z eBn6*ca2d'vQg,XD'(6(-@`[ $4x'b%j!$@p3{"A0"kJ '$e~..-{PE4L]oyةMbI*8S-UA@N0(WJ,`YZr*#JZ)6.š_( V ng3!Mq,<ˋ5^`͟rWp՘,ބe,[s7KJ0=t.oIqd!~(*W_k8$(IH{b8cc1c<A0~S1kc1n~zfiǿ_'`㍟-^oB(rq'MBL Osyv?;5LOuh|lD),UmFjhΟzW#nn fn*FQD0='rM` ԥ pgƕ=*2ڲ"DKuY5PH| ҂T`k*JZtjHU.BQu2E#KInU )gƬ,9I7_vc=T=M S1 lw~T&hRZ*?E0ğT*i/V.,®ٚZyRin=]pN+EA `G(U^2&\è6Ey$c&G̸`E,*.'>.Z]i<r(%cwm yYNUhBK> fﱙpFSg?I^`bT(LذC՟roQ`c2>k?MJ{ S}M7xpK)SBc_6C>{{DK[;lYqfj,J0r0SR>DGwF9ىVfP4NCn3}ݚC{zw"q ؑ<$(bӊ"5Hّ xԌ$m@y#Qgbr:Apښխ(uJ};fxz=ۤ\P p6k8u dXW\_0U!ApP &$c8QL??Q>FYh `t0?o1Uqo.VF,uf \&EK&4KRFQ1xܬHI}gp[ :,GkxXY7LV uh0᬴sc7n6՞'4$p2[X%-֧h5n)ډU%}kvM `@^gRk^)mC(ҞoVNƲ,WM&ϺM3FCm45T˵a #)?}>O~} ?]5ā/?O" U>ODhi6S'M4Vn$ V{S2DRDc]3H{OC2R -YNhLš1MNњf@@ Aupʓ?@"'^hXU+@saQM4 ֬.-<&2yb5; g; ck6)l uJFk`Kz53UasA+Lbbc!&n!e?2]ì`%M~Jb5`|81 99/ H amOt%]QjQlRҥ dЇDǷm&O㴀y Ϋ2 Y<|nMLr"5Zҥ\,iS&u{W!84#lkZ4CSP]Q&QH:gYîJBE+*#0)ևc ۉ6# xH&LLj~gQv< t|GCow VBR-<\b5S〹-0mfwa0Q'^ۓ:Cv4uU)'}w5S3M,s[vֻ釾?5H!Gbz{zWs`,BKuR"ӭՙ'VnHbdr2Д ݜ?̀R4IP?֢Y`k$TPuP04 ђ\W+I{yPJnh4O c^\sZ:-Rm@t.3>((QW.]n5c gX?V)dS-X$ HQ޶8-&"PQy0z_x*&`t(Fv8\q5M^hIR2mK{Ml4\;Iv`$K%;O$([ѫV\U+B@(θaQIc\ls!.3yHe?ur  =EI+9lr$_ys"rlg,V:#L_ij6&:X%?LMFPњAJ iԖ?[5_;q:!z¹6T`zNvF!yȜyzmn<-U)5s {cGkݨ<`<;PB1 F1=džßŭ<]k_y/?pH-mfm,+/_--!z IDATLcbUDv w<%3Xk -Wh ISDN(L<]$%=EwpM 6:!b l=.ԛ:G}"0mM]2+,1C(&44Hk|B ~sꖆFdfHMB+>SUs":K2 oh U3֪4u=eB0L5Q5j7Yi^XsBt Dy(sWe0h%cLy{RV~TRDb}v|V'nb MF!,=҂It஺i,E n#`ԱFJH,5#RNw)㓞-5_ƣT6H5EȚ = r@ٗi}?#EfIdl0T6r[ M_gj'~jṇ;*p ީׁݚwXjܶ5R=ZXWhQ]ZDg*PHAQ~F Afrj,'(X?wK`ma \R 5$<[m,FJ LIrb{\In7rRu&ƌl8C',JׅE|iabR|!*Y>D@eV01Jj jGfHAGP6b ݠ>w-2UX/g9z||OqDjC^ vI}$Ic'p/{"f0=s[B}op 371M)]0 WſW߶1k==w܏x;hд1rO@8yűyj*Ҩ4޳}  YPf(OϤ{YIS"ށ8U93CѺG j޲{Xl'4}Xw(rk oB9;}̬W Le;m:"jxSTv G9-G-}3j%\ Svޤ{Ea ~/S>TJF!jۓ;㍌K C PyybieSef!Ɍ 0cW1&_yMo&I 6}I+KB]IEsȦ}APah]UU:[G9([bɀ*l]~_Gl\:9fCerSіgyցHWre6W+ ;aҮ3%W;c|T%ix<UajA EZ+g`ó3bo5 `*_a&ҹ[:V{P-2]a!^B:4_ չ] D9FWB@G:OBYED쁚Aam;bѢ60ȹװ a O>7YZP]) kIf(`hTVM$CHƝ/@6К;K`և??:sx~:ޠ)z&V2cH̔ȽmpG1v?;0m/B}7f153 U؏~ѼI5aM^PUIW-;}){ßɟ}+O:z{YNeҒaַm4Ԅ @'j<G#>wԑ4NNg/KZ䚫;Ul^~׵7{$?Þ[05xS?ŝO|Kx',2ԧπM<8wxo~[v^a3s{]gb{$(V4.(]l԰P ^  15 9ޠ)FC +]RA&v@Fv_ќ,^^at>Ѽ+h2 ;N/]PD-4zjۂ쌨Tb,l;νba/oxKt?F@tK5ܣBVq%>qOAm3`àCCe)<%5R]|-xGWF:΃aٖ@i/u0ٍ'0p.yr&\yHҬ=*zвG}j]ƘD4SvӇMCnu߃=o;1;^Upc˗t8~\b {#,_?V?k2hY%=0Ki`"Rlvu`f1h`F٦S},M)Fx}7{%GoAq'} @ZB]:[Nokut ɩeov&(l{`kޝk)ʔj4l r IE#QZ6iVY\F'4L2$:24=|t)RvZjD]3&[Bc6}A4(cujY;Ta9~is1 D K7A^]QtF3)mHfL'>A_Yb`b.c$(Y"rlѦESq +"m61I$0c>" 6%4c<6fOST7؎>GzGM-ռeQS!Jv8ٛ(05w?ξ)N|/m+~{@xG`va m㶇>wX|Q'ʛyPg TinCuW7{ÏbuaoA(ZTU4W.Kgƅӯ;{ob~g̾):PEh7duvEi4ՒF(VWŁ^CZ4gtîX{Ʀw"SJ'`+Awg/us)}kcCl t飤Hy(#/'ik-h<%whZ1)L[QVGa`j<}[w`~v-bjz!0K|p >VyT&ߋy݊ŭCo%bh,_O 3fH'bcᄽ$ɥۘ*˸%gm6sx_Ư|+EB8h4:N} oGeQuds+_֖^xLn'Bye* (*SؚTC !=Xر_`Øz+ϿUUբ5{UG#Gz3s}]F\Sɜp<ևR ^Hlf]#_}pˑ{OK$`na ;b[k5SRz^ }̥\]:s~˭w,}8q?pcl'PrtҨYCzlu!Wp[o=15p}.oVl.#\^,=4.^ xo`}v?{?/b,V:q7ڡ;/9sUߘ`z~ށ{0"|rz]>'<l}|qG0eu~lL;3RN19l#vH4LE]|>w`oݰTeCR W躡ԤS;OA([%<{D:Yt:͡xC2JcU+>u͗8E-/ҎVZw1' 0U6'9*5"G^= laۯ ѷ\&s` JFSփ\ *V讒 S`7Eе,Vd:yPQۻ~.B`=ѩhn}ez1 #7૩;Jkl\A.eS-TVߋay)1k]i'UEЉM= %m5DELcwTe\cLvqtBܱ^v2c-UrMzM j1y/pPk5&rR**thh_Äx3uiW(R,%h`"}g/O8_լ >/yt$B+¼} =V!ktڈ'k%G6LW9huC)LEٍ֫l  x()qU#[2&v+b$| o:26O=B3h3 08$!pBV9TڼW͵ϯeA1YI zi ~/' z4{ȽزoG_N=6])F{S bj'pϧ~KغӍ|br'$3y1J ʤ܉gqs[wb`vA lM7݆m7uwIA-bߨm; <ᾏ~[wWtq Ҿ-(@?wW_x _]~.뱥yLT92=Ԩ0IWTjLڊq((]-kJGM,`l^թ B{ew%ӟxfwJOfJ?Eo]{n:P|G_{ Ϟn.eTfsd0Dˑ!~Nf*S}mA+}NCvzQj E-FZ]R-Y rILdps&Kk@O'gfH'P dx#h_[j@"7Hg0HpϾ(Aky5uP^E5qZ^=L|v.6J5eRw4]R3 @(d>nzR{v|zS;r,*1KB:늳AKO}d9{l*}igƗu2:8$ P& 5װb[P<$Mm훌S6TqlƋ\]gE<&Lfr`QLKzD@E k (uΑ}14QL7Us_HA#B!,LM @߸O/m>UL]O⭗^һϚ T$Gp Xcan}|_–]ڕx4V.t2E%%H86 k\< z),؍w4:-; j6ϰrX7eSnicF $Ҥc1'T&`Mj=FDݵHMbkGE{&Xlk瘟,f޵.WKSj(qqW<' Yޟ&ω]TF[w܊[–3\ ?6]P`z(e'# 䵣69B2aj7=54bzh= AUPim|}U,L44+ː 4,l*d,g}A *SՌT[NP R:]kAi]?#=fͫS԰ `z>UZ1쮰H+A/U>%4=m#eܩlbup!ʷXP 37D32a(ep72\/w ~֦0``SDŽ΍躉\bK/uZ\iA0Ri+e+R[Dljn"a/ gZ֪I|jlQM~ްM0Ƞe@CkA۾i_yg!qTeBPIg8`f4w¾0SUWpݭ tU1ban逭;װÿ__FÕVo(ZB dF@/?)8ge\hI -g0yaWpcƶݿkGn4^2 mdv7R-B %6+ӬJltQ~"ɼ™ &̗@ T% 8wCq,=gyR5,u mXtAZCOrꜴ%S?ʾHN}{FAS-3%"J?)&>&#*ZˎSuSm?M20Rz?ILͱN*)7{mKuƺ[:9)"T+`mQL#ܹH r3$}lͼo'f(-= /tJ/7.5<ƅ=xvP%W{u0$Yū8w1;:Zk4S~@/0*c{ͿF\8so<=_p)F^;QQ”><57~Ǹanqfc0kW+:eivBDg9˘_*p#Oanq+%Wh"24bE?.ضcU<νwVC'At`PZ5lZsCܦHܺ׊}^W#q'vV9\1~xq}灕%Y&Ee@F{|HU|3`s 2Z9bضH!Lwo "6`7kXSf\ku N<[dS|- mԡT%PfȽ6alMLև]~=1$>701CQ1)gqmĮ/>>~'uO8GH3;z/<5 H $2Q1RA6 %b~}l R<&I\ૉww4̿[RARM"nAi$zGg|fH 5>= :> " C+$+ҳIFKi Bi?z9ocO|]a:PaT}g[?pZzoTh\^A{hn4qݏR .9 pRD(` 0lvhc0@ҺCgqض{f?!_܊]=w^~RΞ&j3iBPMm,hב`ϡ#ה6| '_{Ǹ|8.xЛBoj3s0[v݊"n8{=qkgH={Ii 8WgGNW (6ϛ^N6Yk 3іJ9_UR rZ)f#ߛ>K!ZZXG>{fA+\-KQ|Q4`F \H46C* nd̅:Хff]J)^Tі)CH䡋L@-A`$`ZR'1JI5ʔZP*\8 Qϝh^zsIqß gO,-Ҵ@[>ȽAB( &a шt\QR%Qd&711gGè 8Ea5$MS  ̥ތFϛ4תy0 bf|)j U!T|ay-m K(mb^w~o5Optx"X?k{]عg/f6ߣcĕ˗ҳey2Su f촽S}AI>iŝ~5j0-)CQSa#Nӟy K.n4u7]YQ7!:s>yã`?5?D]Ll6,jLP}*/s-pBќb1I@lkDgZoҔrLcR_tj1ඉi`MUħkBLK%aze`/K4_1WAZ̴{2WfXm8z㈩ zM"qC]~<Fߝy5Ei 78e&Ym H5E!|i¬ AWaX9L1 ,j#%ke&"/Y`ִSI'ěY9&2ڐ͈6aDj9/3_'L^i>RadͭͿ)簸l{gN'v@N ~nv;>#} ;?\7%\^V`X_YKX:w = }!2[(c~,otXLk97NQcuK+•9Okbϑz}hu%` '[#j'V<ۮ> 7pK\9 NrxSo|'~wޟn(*Vp!*ZS[*y LmS3z/ꦖ /Z䔑[lfT=OL6uk"c}d* ##:j\guGe{畋(uYڎͭVigbH=F1sÚe{"Faf{ow٫^?i|-֮儉oIJMF?Ņ~xx+nTir`T}JFaJ՘1uE~쀑4T,K'bM8*z=$L(b'<ŕf9&w D􉏮hǮfl 㗡nQ &c 0 $@,r"4!%M;5զ)mʬ k(3B_+#3-xJॴUk|;IQM }/ @Rt e 3a:.+:Gw-x$* $!MS5kBRwAdވf0[0d @s & e1`)݄ o@CK|q$!Mȕ r9Ts-iPC1*,c&tZYN ޔE*NfcT0 r P{Q 08wV^5r+2=Aq[ QYZR*7s4h٨0 /֦Nj=5>'}0 ;AXv_o,.z)&Ji[!L/܊~ xCk/ǕKK8xo uL{X[anS} 2qm#7CqznȪw}Ys[v^c]+K(A5qyXUubKaw(0sv^ͣן&?+OSnzFKIIw8.a4Vıqĉk.ß*xi,n߳$ڂ![P/-%4E7, ,' O)Z DIkJ[dRm]L3)"[Gј3ʴsm )}hac7q 2#nSGɝ:Mv:đ~#ضc.#q: t-^ZKgL gVvPe?J>LܴuI_'H Fcd) Qzs(tHM6\Vz¦Mgl%v&[YAC7tRabgsӟ GCBnnf3#ʒ^*5\T { I +6U?7j \qM*GIv)犢d"zW||MrUh=23< cf!ڞMk/ 6(Ij EOq1ILŬQ P`3sxvLgA~Ğ9TF :x#\73g49, CVj{xcS p/]L*2MۍKDQ9 F?_iR)kD4KR28J $(؈GʼеqFk Y)(šN+XG-Ɛ9,P tbѩ}y 78u(.*2'Ni>׸Ryϝā;M7.;ן?pc+C6No)e.bYmQ1 ƱE/fniZۅ4٣ŦQɗG>sC y~,/ ֐4v[2X/MkfaS6 7I˼1>?>R0><&jme5zBO hG(RԚTu4as@r_;mѨRȡH"XoLܾ@ToL0~'213M_-(%oZᮣI<4Ój)PWIkNr-1ndT~Oi lևjO?ԙybBD2( S cr ӛ tQ"w(%>Ժ<gcGu.ӝNtK7=QI{h LU#X4V:LkZ&;Ĩ[T<;QQeEWo ~gKcz6_P Ӄ>ChӖ5j 7h!RI~s}LzmxviW.¥L_{N7sYIQLYͶIlN;=7}zwl&qlڎd'eYP"EQ;A$_93sf}|$>@*%9sfJ%[gс񄸄ɐf5+HDAc:]#DEm33Ts'9wj o*c#}MoƖŒkٸAX{P'{ o^ @Z#]QچEiYkGCcPW߂VV#_SHT RO/z{z}gc(TXulRIc!A%Q_555VT  add]'W1~41UiZyK7cv44LN9=!RL=Re#̙h7 `޲[bסlt:*̵BP@.7I<G)G.{KӿNek4mנ}Νm2u Ȥ+R&11>K=> zpY=#,4(й O旬wQY"!\g־djͨ:FNgb&!|k6v`?~aQ N R*˪0 XvfiA[[f͙9CJi 9 _@_.vDž =8w$G $:6 a'E˷mwUH#`rr##2W|}jלA oƢ0Q{Nx6B̰\@GSlu /]޾ a֜654"ɢP,`ld}} zp?=s+A{O-۾0oA;Ι9mhn&HB>7+ }gpb.\x: ;TK-`*Ng @P8p1c lF,ZԁE`kDJX(`d2/8{W*ʻh 2Q;5i ݟ <41 FEb:6 L橉y=DU}|T dڣ"DIcM MW$*;?Og`+xTc3X3Jl6b ]ziE࿟t]r?^WpU32J:(,}G0q@- dū2Uv I(MIL!B(=+io w$% ]w̫d[Yg5ʣk/4>$)dzj"9 kH$m-A|*>ɘI9`T3~aͦClai Dh&JT"[93wy}W1 D6(7cFMP߿bj*S`N)tJ"`YI1ȇ)d@*SSx K]0sj4]31B)kƦX+D%ߩL}vkB[8wW ?R 3D ՆTZKp{uL^TTc-X~ե I‹ˀ0Pkh]Ea%XdZ;VnFlɉ1?}woE?Mk-V$ äf X/8Llzm]pܸn/]lE8qﮗq\83Gl^2&| ) <^|>&F.r6JA%ZWczuX&/Yue> ;8݇{_Ъ2(=eb<0u* h_-砯+U493%e| tF4LZcxxozQOw*܄Uo†MQ|:87Gck;oN<FO󁄠FO< ܰm;~Tx~F^n66ArVܰ=od)#062JARJk0ņb˶۱ymoM/[mCx內qhҍD$5yW7ODrIo6 ~M߱dw9}0v z4F.@0&~oފѱ4K%7W~|nRhn]u[[nGS˜wv|]'g~v{^%6ᦌ*&'F$<@I 8:DŽu)3AxT#{c\ {9OL;"egGPIrC AM1Lk(=Vd:$ަ}uAfxQ`J,9MRD1Y.<:5$%u cchpAtj.9L\5)$FTc!fA %) cM#S6\AU)JDžrPұ:2Z;EVE(]^Qk$IUq&F+uEϽM:;Ni(B㟯BoQ| C~|tL* Yl-@"/Tg3ߔ@1C u (Ȥ Rm1JDZFPՔ2 !2uߵݧT (f9WJ)!AZи$˷HQAhS|*kdÝ8?)L~QjF&IyضR\Xwӝh$R)P?ݹK F,0C6nێ]TLѤ󩨬UxuaiԷq q5ز4LNj֢Bd |vT_}=Rk Ĵm4gO5:V܌݇ʩAgwյpFJ5pr=:}l^G'utۺ̏adz?D7Q](a<ўP\8ǎNFkqK; w!o^PSpm%Nm $Ү~񞻰mH3ӾlVVo๟^z=^bBLrt> i˝~ Zk4Z;{eN7ګW\͌pC[pļ%ӺO:WaQ*li~0s J<ł-Mb!HXmBq1kNW!swBSx[ O܉KFPϙ4qO6[X'`ޒMx틦'X_koĿ>֌PQuS⠚3^{I=D0`5MЍh5s&8 K a>}45 fDB]LY7ݦD$X:97&{|V65J֐'B']Q:!d'EĔ15B9v&;a0eGp3FPo)pQ QيI$ZEbxz1OCʒNNq7eP0+ DfH4HnJ/hMĴMPK{>n R6oʢ:jTD,q#9#(mN59ڣ'iZV!E܅ۼ@&@b>.Ȉ8+x{iѣ2S'd> )~Pa7h&Z `Xa%v/2n nhqr2֞*1~kٔa|oc#@ө}يFճQ!jB"#PHf]h+jlkng@J T*3))XR!'Rd1?:*rH4]=B0HV My,k˲)I:0kؠ6GWk K ev ZqG~/|3Kvcr Zj!TCa(n g>D`uq=c ͊FcQӔ0oa'a528s)h("+˨3J44Ԣ ߂Gwd:d׾6)T(|͎ʝRZ0T< rXppߛxb`X86oyaݼuiemxWMMT+dlRL}@/gMxZ=^~YL^Ťt&TUVLzqp+(򑑲Ҍ(29غA|oA]yXp)xgfİU>BuYfύ ؆E3)%+CUĤ _HDQ CަPco9'mI)) &&BX-7"a&O9:Wa-o7%=8iDOQc oNȒ%IrBKff#`~zm4O1.ɖwy2GQ?dtۆ_hКIXЛ2 9o{@ fJS(Uh?P`c*_,xlI3KൻogmgH5L.<3}Rh jL⢰q~oɦ#lc3WH J4q-OLIka Fx=7Sͼ X2|Dk ud )I qI&/.sܤylOX1hTI7&f:0jz00c4*]Ϳk5{$ʥ:8!kn??1׾SMTFeϿ/}(P*繂F*9DVDa~#(&L Rm2^A ٨aQKTd4b`x*4]XvST܊[-l>~#_Dȍt0q BFP +@fUKpßkTk@E.IdsP҈|UXj>_?qXcӒ2>su`ŧ~KWGk4e"*;RxL9]"C`' H! -w?3ig-ۑ091c{ "+YHj֬&?x8܏[)A9m: gWm:d$^A6i@n8U`d@ @C"#اf/ŖmwX(3Mb }TL?(~7xZͿ1^kzJ@:ݯZ<_@@?בckj~6?cbb_C;#= kV'ݫq-e;M۶c]>}WZs8$@'cmKV$DNcưiéw>Dڟ` nN| 5=n)!8#JF/0 KiŠ 5R'J5B2a}(&Ay,G9@xt*Xi׌@4)ZT14UrRfr;6^HB3葐!MCDMBEZU#T,N鄐(MRJDT3;xWl(,`[0=xJa6E-!)Ǐ4I8/71(s }ܴi0Pś-ĔXYݴD10f.%( 2ըmʚOO}}gBҁA +o}wѺdû@1ާё! aO|bQ"& L拘G_[(*U w IDAT]@>73PQ, =My8Cr}Xx78Y_8;퉯 _x?|n dPi8ΙeZw.+tc军Q]?5r#؆t lV6`q=<6 g-wcK]*81ӿXhflzߔR5oLATv4|7moZͿ * pZw܏[~?ZVL(!4ƖtNo3ҍ_Ĺs=\5-] Uuhq pgжp9{qd.9{%=wj|䓿>_um=6p3}ְ Q> ħ~?lj_˜(w3k<ܹ}; B`"ѤAn~ߴfaBB)> M-Xf,B9[ Vn5Ҥ$[RX qW&E@Ha',4!i_:f|IʑQaR /M)I-0;t %ѨEb 4x M5.DkP! ]!?6ԕ.iK/n}wtVӤ;EX,kJlW5 lmb |682p~İ*Tm䴊 4d"T!a4I\2p4~AbEb =[ml-&8ױBQx`Ȝ,{8P5Ђ=@zH6chZ)5_DԔnbUl@ 'yͽ09t|rG?_2I;`P6(), @?x$c,^7*V"c1m0Xyhf4 +O67i4*/0ľ丽F°bb!@) ( bԌ;>KH*H& ЩiK&"G\q U5-`!>Ȕ$Ё8ƏHM6g_9޸kKҦX,`bbNȁ8uF\F!/Kn3m6^k6fk5;T&}R0&o)yL0 Eaߓ 7o{/_3*kID}ZXf}YW,191=8zh/.PX;?7ށ -nhi*,>틖"HWr5_=:j6e LM <4ۆdh'[k\0Q֙ė7TdQ!@u,pTq \3teeU^&e9ƹ nьYBUz! H ٰ$7&<|3w^IM_٨G=3DN9o(AѼp H1蒢ZVK 6 Ssdњ:BC`+AI#֘b\h[HB[iWf2$F{Niݤ"V˨S(=J&Ȑ>`Ahj0]"4mcHEy(=%:$?X&≠"u7%JfR $2X 3#;]&GA ٷ Hc@E%#PU?'J)?EdRJ/gd*n~ ӯ`|x0jW*2zgM* ! ad!QP@Tt(0TqfSbV׳i1y#@= 44 mdK̨&D1AuZгXu{~]'aևu?U ƮcNZ%;44cx=HЈ,ۄօSQy EȻs'©ûp!\8{ Ã}ըilXaxfuLوg3W]coM]ᣠ!5v1)|B!>K=p+Zf36n}oSb=>/}a1oM2Uh)Sc݆ScB G/o`0X|p>1e3<׮ѽ7]ZQC8@C#ԡ-{qOyW /H3@u݈)LfR}cLI4wFtXp]c/^i t&ͷރG?\)<,_14 읻8G~B@/x5OBzp]C a -ېOJo=/}Ѯte ~X|ԵEXągw}lMy-[8~h{ ̄ \M%i\eym4A2mI%x lȦmIsIȔ(:}yt*&JMEtC *6I熊pʄA 쪸g$?]4ys pSؔf1߂X $늖#ֹlA2HQE-etZzfD]fx] ΚZZ!rIja 0 ?5f"Y00-\IҨsQvlb,V &"hܢp&XF8/UCc5֟;W0vˁ&=47W` ;ΗI>z@ R2iB45fFW._11~gp/JPU×.t=ch]閻\WTT` w[/{,8'TtƎos,.vELNEM' e^ W>tj~/%dPZc&,]MYR,u0?(.=?11}WqS6|;:S_ 4|J/8\cۑn>}גjhiHJ,^9gQVҨ.u[q}?WֺxkattN" ^}xks? 6o 5WgUUbXa+iRj\Bש#e .^;mʂSz5Kgg.|/<A1Ҏ(>+ʪ겾╗w׾|>4\w#:WBc)ԃS:Fq8Ƌ8y*~Oǔ Oq,R`re>׃|xaLa6tgfe 4{Z64} ̄U%$`bǘӤQèⱍ$|Lu[/<5z"AJqnn{Mg"L5кbiKf"[n"F1Ǵ"lh*i4 Nioi^xfnOkKWQ|YVb^y3 dS$ּĔaC%ҟmc}՘QJ+>uѝ&-b-gSX6L~f$ fh#tM!`'){A{!9%)q"`C5(XUOUi-RΠ Y!PʐaoAPUP!!2 2D,h#@fR Q6"\߭0Z"˘6子Aw[3&F.C IE~1t' 鴎(*T(J ɒ L%d*mwibke,1V迳GI?s5>i"$Tbm~ì>?'=?BqrILC lijI. %=0E'c6H!Rc$8C/9~/ƛnvWYE+6Cc̈X/| gD!?O" sA"֓'djXwek;_zoxT۸A,br^ ϝt<|?[l1oA8_c֚ AI18N8)۲mQ ūnDeevJv`%"qh]mgO7wKB&(ed2T=G?Nڇ0̞4t,_')! 4tmZtUOyF{)ߡ]]]:naܵ ;1ڏ1->Z}>`R7w|G_oԱб`9<ű]}lힲgk7΂ 5hVi4dLc_$$X#0G@gЊ%2;GlmΜ{@jåDM;S XҮ0T- u=o0t$xpJP_Q-m  m-K.@k?wwK*@$+I\X͘4T_%OFP !N!Ttm,Ƿs<Eni1ͬ)@d Rim aUТV2X̛A8jWƇBxcf ն̉ZXmXGip/R,PmvL='PC5An.(jiҘfq _2*aN)?]F_#DOE)cjE~;"&E}O/- L{6ymd0s@@ ҁF:Ȧ%)i㴴"8 He t5r#Q\9ɣ >j\jg[4ݚ\gB"N2E:H,Y5 aBZ (t3mN#wk)+j8i+ᔫ^ JMa?A <4 >,b׏m#?_AEm+fh\^#J3mlO[l\1dSa0`=YutΞ>+SLq+ھ>2gtxO|տ~i]9D!rO#,F' Dg3Re4]p譽;5@ܥ mX-sO1 O~R FE6}pK *9l%ױ  EI &pABri]G`u0&]+7܂ꚩޣ88$7Iyn SF&'/_{\;f ̳e2ĸ9~m݊%+Ceem<#cL{3?=< &F#7֋M F!Uc_8qp7XF _w.GBcV),SLӬV,YM-׎{ :'NrumȞ5:x~24̲+Ѷh%f2}ϝ_?Q$ZkۅǿU oclT[X #ʛy^k;x DGϙx\!|20/Eek *0) D7n}$A8˩va:,;]Bk̤u~?ۯQ@QP "34Sګ{y X{l־;Z }S[KI`lr p~ht⯴J?B~j49yE~x]CgX]k+V;X]3M3E4U 5 R8M; `hi]h5<3)-(8Awf&j< /I"~) %q'/ukq+lỈ/E๺BDsSos-vƏEE6+~w"Ϳ9p"g.]!NX턊U JwDneH$iBlB1}dRT(,f18Ҧ"*Hs"Dk4mbI uKw|o_!SU%Tֶ&x?vy'ӎ@3ʋ$=;>|I4;PT!nB}HS>];UEJJ,\S5=8w{_Dnbժ6^:o+7OX@~b4Ѿ2>ҋ>o-o/^| Zۗz=k7߆)ߡ+xoCE1vX\CR9|W_%WC{?¡;=is 8w$bY߷`PT.]PlOuH=cIN*']Ңȹ/I\98N, w=v-dBAM&%Pޔ:?7+̘l(AJ$S'PNV{l/in?JBI\=A"M等۾XBd lU]t CeG1SgJ#Ixm/i0%%Jt !M9-.84)58dRM):D Jnt"7MG) o#rC@jֿ(O,a&MCP+TP| $5 {"2Taa͕ T9@*he':ۢ< sυTtyM\H67dj}ϧsK @F":.v@"N"B&LP2H'@ithaЪ49]tHGԱʋtsMm,3PX?cﳏad;0PQY|nz2fAw3R&3T" Zh'dDwnH{ɱHBQѻr3xs9~j6J3M:|eȊ܍{vbc!Y+1k|p~b2MHHcRc Ec˜H@n9T/D2b|=F*⿯<.veiX(d/iZ{P6 IDAT€R/yg"6-ٍdy姐":=x}=ݘ6PUU Wۍ{+SvXsc‸KkŁr>#W.[clϱ$Q3TK=x}3SS+يj"Sp,ŕGcS =+)SCҲ& 9mhljf tز)>W"",\59҇(afJ2\' TFKK$\K ϘRpFxhDfz?/&DZpyͨq9!eTSxD ))kvKb$Ɋ%U Mԟ϶~ $(j 7fo&!lI 9'ƕ dxio%I?%+u!Rpne{|)ud%L'L/l#1ik+6!COS:4@!pfN>Mu&SPcA(A7M;dhckX$Ay/ =#Hq W\SR{%7PhNb=oE<->[Ղ92R'Z[2WxPۻvJS4) c_ ؈ 53#@ d@Rtׂ8Dd u-n }U\x7?*1>i@"hS%HdT0* qTIegl8'(p[[A_N"N9R0G1>]WN[xbAJtn VlF*S-|;wg|O>4 =ULwشˡf+Du&[WcU` fC}lTTUCa(k430LveԁW;+hDL|!R*lr;4%8!v*yZYX3l)ZۗyV۔˹G99lGZ~RPĵHSN/ʢa.._:=Ʃf_r {_+j4nǕS6EĜ{+ۂʊ)ã8U|q4s[[Z 8a׷bj,܈3_kU՘3zAf{WΝ9%f崽5GRk|&'&paI`|9 1{%lDMlLNv_>;:Wc#8{T'U5 ROU@שeW5Ui2%22?BC8~hb 09ΔSt$5ͥwXI2nڪhZCf3 FzPZqa xϖBְڙWS\mc]MM "1y43׶@̰_\`vUG -Ӏ@Įh>1dk,iQIʖA*mSkCH׿yeN)ZP3 c')3qb(k[&7"jmfhЩysDDݖћRsP)IщTJiQfeV;54ہmlt͡ - DLs56:mkX5s62Mhg*(2&R8VÏZ^ClBêSՀj& !2J) Ja4Iȅ}B_Dt2!~L@G0>tb8hj[ӱzDn={pFJ>]pE0 l^EdhI0D<Oe+fXйfT5 .`B^Ќ>T:?&#ygbd9(p좂Ă4QY7˚Cgci0Z855H3S .~/H18UH*+m D)]Q#KZrJVs㟹rT^9BsZ痵}=ʇ 7>KN .[lbee5[M@.+mᆚ;XV3".^Fj 8لR 2Ce3 *QU[ :D5ZcKjkLdXҹYrYܫ*˫ajj*QUۀ28!Fu@!?5"0ilS  $tkC;gH/$BPHtL3N"1HHצlsa[ mM8|eFf*еg^/6RImox i7[YBR$Hh.Tg9&9N]%PPP"d2\#}.(Kt! 0蟤SZD)&ohjJ ],(ȠW %,lB7YPgo㯽xDZYp n+%A+1E7e')?{td*\pGb:FIf "EӄM/L"?9ʺ5TjȠ l C B ȍ^B>7sAJ}-9,b.' ?T6xIg+`ѡ>gg11 $2DJFk6X.5;[`@"7v+R<>ҔVV;k&Yӄ hN/s%9ounƺ1ܳ=qh˘щnwL;2SQE;q|&\<Qz:FPK14?m2 T3Vq\<gNĢ5׼9=z&س4JcQ[xͿ{Sy<U5evY=fbJxҙ kKN19w ÌhG)ix٤k`&ϱD5> gO3PQU5ΚT:5WUbrCL d f␛MJaS ݞ/bYVdY%@" _9F]jnEl>@Nͼb4ݓZ,a ZfA`?0Il8W0&B&' hz6BЎ(@N*Zp?'+ˬ"Tx6)~"FO^)Ù:h842pĆ.S4&V/6|ɞ]H8XfAh #HC;-х {`Y#r:Oc1ză)@ a|IКo5Ȉ䆊Rr@DD5ek*p͌4U{"q(FqG$.lD)mYb%l+q/"(Ett8rc3*k=)_N)AygH[3{[i>b4`]kPL2HIdR)fJ HHBBHeʪHef&P*e /S"6wV m#ht9'OBH+(50-,at0ƇL#ݍCwbmѱj˴uh='^p.@ILLL<7&u>2,>߰d&64Gn?5kb h@/.ٽN-+|Gt0ise !Pײد#5E{^}x9a Kk(]Vȿ3ge!_ }&Q1i w}߲eP[_?eWpdk(kHkTԣ 462>RPB0ؒߏ,)Xwk͇5E:g3Ȕ\/틫0Dɏk-3@$R̽0k]pOizKCujje2͵64a*gP p#f^j2n.3|F) Ҿ*%D]b]lHRlD7mօh_W#MڽNGGZ~>:ifVr@&b@)c@}|"zYWҹb-1ڕoFe#q9?'L*}?֌  8!&^])S7&5OAi$AMǯlc˿Z)nM&a'NIf=p?3Ϣ:fרT-_hl5*f!Ɔ.6[a{ÙEFwҥJ蛩M$(ZAJjV8Cc2T…Ob綣scYeq*EuM2MYӟwK ;GCk#\Ow1UW1צa/h b2Yw#E=0w)~Mwbo. 9jRw*wBTCĜU: Nmk^ϒavk;>E6ނ)}=8v Pkkon==8LL~I1#9bq)"Vk5Є7G5(@:u;TD ֖wS3\mle谖]WI 6t?Ҟ"~[O}|ke )/U0, fHG glRn<n uH?gQx<-%}Mh4@oe^c< $ 3RTkOxEh}5`ZU NϱPB 5}XoJ36}\ȧ׼sMࠆR![XGO!(:K 캸C(I+!upschDi)Z 1Sф $若 G7V:Ԙx]鿢4dԜJK+f:]-b+3>Lk磢)A%4thm 5@Z Ɔmb B琀Q?ULM F z%PHw( B`"/N7v,)l Q (rʥdǸTG:44g-B&30TCk%(Ӧ7E&O#EI?)5$5DNҍe+*2Tbr߾Om13 %8Zs\7 2?ADzdk'G1wC11>B3YT֣iVEͷq` T[9(?slu}s/~shthdHQ#RK4G3*pyS1VM5m2I!h4:^'/ uU-}^[_H 8ăc?ox./BAq 2>C}xuD2)4'ʼn̸co, utbݺu:`=h]?91'Jҡ kЫQ\icgi0d $7l6L+ڧ߅Rt^.lwFQ |w'VW+,hͺ("u*d~H)PzIjbV[UZdlʴ (jvފ&Y|kS⤮BlfU\PN2ҟ1@zK@{XF҆X=d0Eꋅ\:^SM$?W^(!ñRٵt1/ H1]t>\ {!<짱q۞e1=ZWps#t 6 6ԊcxO|;?hM.9R{Q#1Z5I7/5TIVA 4WPS&Mx*,o೿KmE혟cѽ\\n7*r{0Zzz+,W0ٕ_|,rE4kR)f;*iqޚe}\A\2jUe$_rBr%f᫢觔dUs|UUC42ar;CG@zoFKRak޲ $&qlz2lj7[c q9𣸖!h7yYJ0`:R,IPh1WCBQ'bCǬuVCd!@0,|K 6|boR41Q&yk%fXfUs^`)?"T IDATL[z&٦_( {J8V#-|ypRQ0HIӝړf(%S~H#& q"uAxƹ H6I ΰЮ$"_ҘD{)_eΙ|kLҬ `8'n^xaJ#"6sP3% c.6Ei``DQ:P{עб4yS u2;1;>޵[V]OxhrRQN ̟S3 fL!%>~$y) &ǔtWtqGyZv-7gQ- Vpd2 g>*`.#DڿA0)dM}̫*9fPhZĊ9"UTk&z8RxIV/0~$굢Ms[k> zHjBy2JsGQz~j?Ľkzt^<3uϪJ+"n^={wdԤp3_N܄`5Jad f iq%L`ibp.ܾ<4 KFڅSUT^jܒ@x,?WLU&Fq{bJlx(u1Σ崒&%UM BJ-ذeDz߾X,8?= s}0?/`ltz>2[03٤g;;}",U5f쥦rP@0@,`R! Wp 8"Ōc0&?7شAJFR$7 VLDj feAZCieĆY<fUCqԀt44v{{N1 9\äif' cIuH'eܗM7RI (st=` QuGRZ Tܞ7\uCUd%mNЅ %M (* AMQb!csJCsȏ ʦ0Ai>X,1cD>~q!F8" ~fѧMǎ?(87jy-]j,lځ͘def&?_'T*lS &ٸd4|. }w4B+k4Wl,B*N./Z(0;aŦNO T\G^l̤XD#ʻCj{b5T+T6ˊtȥ{ӝWCdz wh ?+8djCcoV)UHX;)saKh"A/,֠b<ˁ!H'$Y$PC֙\[ xM!S䙖Fj.X`lt!9v lrD1i!2L}F`9P 7 C^ Ec*K]3\nU51S猛>K 0?5~ؽ0ZpoƣO=WtDQTWz:p HL;[1WZd?[6ZI*l[3I }Z X~-v}( $eLεVe >73alyXQճѨ%rĄezUӗyfrQK2, 1bn|/"= wg?,FU893R&LJQ|~ryw‰כn\EYq =Иw)*rDu9בQRY +\MMV< '}<ߒ¨[Ɋedy[X'6H h7`JMJO>xzPR=+J|RxQ@FO}~Ik\g3-dT;tzi 1XlP55MYujxa{"~>QYI"HS/NЈ:WT4C[j`9sڍrZgY uRf"|L$4~ D?3e%AQ WJI dD?˙t@i.k@ ӄ:m3j I!BsF)īDYDfibVF0yEeMeb#5dd_4*x #WWЎ-{_cX98t;&&R(qa\BuВsЖ֒C{>B--hoɣ5Cɞڨ4_<%*&\0g\!4ګhh4'(q]:σUdZUܙD q\ۺ}&jG+P'Aas,* 8nkއO}O-o> :ɚNK3) CȹE55CkC>FCz0KJ7uyw!Zɡ Ɣv?N%RPe*,#;jL"֪tɷc?[KNғi fgQeL纱rhmBk{ht5Βȵ6ߺFVCWDk0_vX ,'%/jcV)ſN/-`ߣ?|d >ݺEr[3>%-e'lq+`:dqQL^D@m9=bҪMSbMN5"K`*PsTl+lp Ϙl88&MSx#%@PZLY,_fKq dd8kCs,7Y ju/3)3MىX [XU2Y{j``ά(XcB8^Dg Gg~X <0)/j60\PO!,*BU,29{S4i"aΓYtEblK&g#~!mŴ>4Mn>w-93A^ \/HEÌHzcEḫs߸at3 `FMv/~]=xgN말ң4IqLe@y2Yh|CCA}E<}֡ BsEV$n^9¿L^ f7߼}7nf;"ϐ%2Ҵ$˜LWl $5K@=6w ǟ޲\*}I[ϟzO?ilشuZ30/qi6̈́j NrU5E[)\'l$ӆ}Ejj:6SL0SFb*=ԙsaG9J3mۥN̤*PBDz*UbGbo-H6ٮ2Ϭ3\nc[g+ W& ^UR-F mv)H `Ry{{Cg g}ycUp`nU(J1M$LdR\N|D4tJK ZV(`#]y3bC;CDLtIx5ÐD'Tf4tFlAKN8@HtMQnyj"_>? 6P4בa]ܤ\T0{L *Q(fnoU݃[f6^ZPH9/zs+ꩽX~ lލqn*hԫafqzFzJىaܻrμҍ*HbTn4&xu| nS1< F@6H}rn',6mT>b \\+v=Y>J"a ^{.R0 5;F}۰'q?{s s>D2\|k"j*hлs/FXG'EpnsSCwO߲3z"JsciF]>&QUϷ4;pao+͗O #OA>_@Z+ՁC\ȔXT,SQG9e=E{yXse>o狍&)ehBJ48Ϭ5Fz鑡~3kkMMOMm32bI\8mh6s'Sw}S0UBdy$+3' xr[,ӿxP tTYcAK䤋;z#Ék eL 3J@8O¬J%9-ތlb֑dQM} A S"aDv(|xw gK7~N|F!N儙yρRCohE+RTv^5J/fFe.]=jش{n=D816u?rq<'_8g4^{3ylv?yܼr|_BynXBLMttu;EܻBuBS%2̀X|"Zt5u`&t݇M;n>M"ݷs?R'n83jiZ:ѻ݃3=}}ش_ō+07vAdJz- O\G{WYhއ>_8ʟcv 8hDZڻֽsP04roށg>3({6SJjReNE3df׊)Řkgđ׿ח[q+>8yIk[kNcؼcϢ֎G?,:pwkk'G&C[ُ [ǶaObjlowqE& sLeY]4Zwř?hk7S6o߃_y'yS7 ml[wǞ`q E4QL ІxǞvރu}_1Y$poع{76n޶{vugGOo/}omܺz:1d\e~w0xI ݺowIPq܋nbG֍xv"xr IXh~7b Fʹ!Yg}|x1{2^28M &ig}BN `" #3>\KQ_II\j4&'e a0]\F&/5$46}ߴn(8:L{LMB&bH`bAN9V.B؂q9u6hLl:ȹ$` q̖!8sj#sT3)Ba6ɞ΢ 3hdJ*+MCwNf;&fA|b}c  RD'<N%=G25>Y|u b:ÁgcпF? &͓7tr`8V nŽ^xn/BK[ۺ0i6l݅m µ#Bq5#jL7ic%(dǰyAV0ᖯcanNfUR$m̈ZGcӇ?[;f.p^-0jM?Cւ8p mh[_.:ۗN¯-QM IDATDZԴA^cKw:<yA `RhGP07o4pYtv/ awǍK'1~*J׫pm=Y{Fg&w`QőUib d67bߔĎW?zؼcEb޵cfF+\xk7nYT "w#Oaæ-x'155;/bju8|>A[[==X~f0<<"@ h65i2b:þ_57K'm"g\bzn&.=by76s"FnޝAiap=] Xv#:;;ц5XA\8qz;jgVt3rK$B&{?3ENѨq\wm-;%azhlʋ8x ]"@>46oنG8&'&peCq~FC}\b͘zΝ5Lc4{_ xJPtJ?FtIi_$T/j4sl؁AAXZ=ZưbBSU+߷L4Ѷ6Q+f囵Ă~c*=~gA&_QmH:eHO3=`ӯ2CrKlD`czò2#MP @m1}&a&04& <'Po1 *IgIf9[$>cbgd)fRI3-L^oOGM H5N*cq!۵{]Z6a M4&1 83::r# I0XA~nk9>"MĨW0v3hXA޳vǍ19&G{g7nޅԋAwZt `mشux 79j)eLNf3_DOߚUY߾hFMܲ Ba[L f_sA֎䞎޽S)$ehuzS-˘z6w`8ШUF;P{c`O/)ha-8p0PCr9@RZEҕ͊f*R}Tk[d>c&V87^km틯5k7Cqݯ*ܻ~?;`Ǟ}K~~6۸Z<|(+ 9p]--ut-6Uuta89S#Vᢸ(^Uf-ߋ[E7_¯oQ ݹ;jmebV+ۗp-ص vPéC Vttv|7mơǟw#ܴ:=pAKLUsWÏ>zroAֶU޹u ?xt-ALz{nÖm;||[;P)090C`g<щ>Ze[{vލs7bjzc:P*e(g{OM2V)lD頯Ąb023eb- jcA7 ifXE.\3bWFL`nڒU@ƺW^kK^۞A|N9n헿co?{m^ۼ @6UQ{Րi3/:VʤDZ7Wn\lܺ'%J1Zy#nm$FsFfmܯ!ҋ ә tt ;_`nvyVl$NU:h=Y2;nբg LHO3̂sgre0>>62pV1bu Hm4N ÈnJdxH{"倢:W{8$z4>ȊQluҽK~%K!?$_a<! B&ϛL3Vb2>1^C2‰sE ss|U}d̒cwg~`j!t5OֶQzE/պB@uiiaղ4 c$4 YtQIr"ϔ}(3LАyr˹\xs/I3fv8M s]<9"fCJSĽ2r 2}`U Gq%N&`CKkrCmQҐ8cv(|ok/`j A&|g =Qf˞8%7zm>}) _?̐Nk|L#(fj @^=S,7񧘺V;QCNxe^+Ǿs[;g Ͱxۿ'V)G@_q#FJՌ4LTkr8K)%$~/EV[u=4z8*^}8151ߟ5?/ך-ٮ\ 0lfhg'1Z6֜),WUϨV8mKb@*rj%,_&$jMq%q>E陔)GD@Q23u /*Lۥl)C&TR[ C,/n,tVVhFLȒ&GzE93 7ROQmUIK!p:T+U 9S}Im# ={ \'4y!_YP$U8<Ŀ8HbXHm %X+G?k>l6lOan,dш)IYb8Lzo~FG9ٰmUZo:>4sCLkkRRVG@fz9<_F-3W3l|thh׬x3 ?{T0~N=_cf|^G)0k q+(3Ec xqFC.f' C/ aلJUQ +HAD kbxz@i~ڟb]\ef< ~P.mTXXǣO}6,jja^뢭n,U5dg,KMi`t.l۵"Wq‰lSvV^2(J_b 3=uddi6Ѱ8bK;Cșĝw7/uNfB{!_oP.Σ0G֮[cP{{-(O jԹ]4IYs+ۛpW%_#{ߍj )9o\lٱ _"i3g2TofL-uiܞnQH4AX¤xgF3=Rn Hf$+M;c[EC ŷ51'#ԊX5j5'^#BF cbeϺ bF@:7D.!ICRC+2cɆDp"IFc (5F (ŅN @bC |QyaVDcS`fRSA Jm/"#ʎl^u; Sd직C=wsȦI h 0@  i:B|%HEUpx㿰juaǾ0qY\ZNtD˜Ţ sBrG7PU l /"7?yfpzYliQ@yYhsnhm_Z^Ľ̩oR B0jjWiɑZZՇGpkLctqkVfDta30q$rqȈ0LAeRYÖt~o~=I@ߚ7U wIR,UJBd83Yh4jzr8WG^aRM)2e zz÷2'qYԯcuz-Fř>ө8Gc0V$s*dtN2>-3|qM-[=1ݜH$ `+d* /F_;#,$X"բLAGx%3@%<2TvДbx\C$[-S;"f D\@0Ogmj#kҞ@Gڡ d$'sM8OQ mJI+ЎՖAܩEB}ԡ;l4Be3i(IGnPF̃0sSW a']D:Rtk8BYD i !KMK=43n%).E Ct gx1A'.a_+lJj*c2hI0 uQ78ikP]b]D~PCڭU-rf'g17rA#`F7υ0xS5S6{QG[Z|DN+y Hi ME4zzfj̨175aܾ|GGxOB #(%ZX#SS }- =A4j.VP=IH ?);,mFQCq `f4ug0391ܻKN7B^A)d{|?,Hh48(9JqF囧ms>uv7 ^avfB1, v|chmmȵt\Z9|\G*i\;wϞCZPU x13fg09>;>>xqF52Nש+^_ _#1 pyp5df45LOMؑwޫk)Rن4ͶBXǩ^Å3x-򭨔@迬o\\Fq-9q Ƈok.zn{>}|IfFD< H$VfƬ0JTE~qݕ_Fs3S0*_7AC4"^J3{$ 9.]z˅PU=CR=o{.#Pi#{wA/Lwp q:YF?AwF|_뺋w\[ &+A-0ޏ-`.'nn_Z2H4L6Q&-jc>c(D9x߃#zѵN0'BVk:ѻ*#ubY=MK5%M~d^ /2C*Fg`0ٱeU "=0 Ԁ4ZȒU#12]l1KaC3@&6}1/5& ΊoL[L-)&Aќg23a~7%6 P kGf#E2%6a@Vc_õŚMشl܉\0Y̨U+vBDÌi?Ϳ}Ocϡ}#D>F&ڄ|߇h4|,˸s,n]9OcavB%NIDFgOw#5TIdR#RqCoZYH#u IDAT=AQ4`1s#սWq1L.PhӔ4R)a ͉}m4qȋx-r|XI_+*&& pȁϾ qQnCOc \ύ JǸ_ѽn]9N߯i M2޳UTX ={5yU۰=}U38?đodHD:5I tҙwq n؊ |YlݹB!2 ')9ѵr #Cq\:{WΝ] =J,ݽ'GWOd}_hJy5`A4>k8k[{b}ظe{y.ׁ븩O`Ok z N}y!sPN2Ijɘjz0!569x \:ăC=]{'|<NRo18hm\x~'arv2'9!u9ujmm}L `T+e\rCwneZ{ } ݈Bkja ߾0+Oj4Aoр|>) rwq 3=68a5b߹ XFBNMi[~/.*xKP fe*o\on=X$҉~y‰t\`rRAҌsFd:e$u"6H RM4NjzS @⤫D瞢fi?4'ciM#UBnDt;$V0&2e)@4 ?@VoX7u qkJ<_P =88s*c@ ՖC>)y1@cXG#9hsYh  ۞ulm?h5758¿ ;#1c(XTrwtV/3A-ԙWq3/=bUꁕO2 IAR9hDkgrEV~jqQM Z$ "$Gh?jܓ 'G97S)]Yh 9Dryu!/kD"xA> 3؈:kmCt Brf j,f'1;9!͌dP%, c]l hmX)?hQZ.QkXSJ$J.ߊB[r^R)f$^ {Vl5qRhG灙QP-QC1)Q"nה&45r^0~kxϺyPoQ-P&G01r6ߕE8߂[Úгf]Z.a~v3caԪQiLхq(뢭B`^R.TZp'ڇ>d؈(,:Jfv8?=hFk[{ȎpZ=(096{06tIpZý&hiYT_Pvh)p#oڊ5/C>u*f09>Zl5+i#kt;F@n>_@--!٨P)-V-5TN$| ڻ^C4Zf3U ӯIOKhlұ!{MH\ͫ-,?3Yd|qS:D 䤚ujzo!'졈ɢU*a&>s~$ д~d>gתfCl9cUEb~WY窵T1|N5?=K ȵtFVF4#M 9Ji.hF}4 "oZ݇CDߚxK-< ]7{^6j7#lvZ2ӃTu+b~MWz&lf-PfIp#7Ġ3 nKګ!i5uRBH57¤S6{QfEPip3M\;4tʹpSJ]Q ^ұQ$aMAU30w*)>i5 TO:A &(3#k̎3$dJ{Ie0"2܀w00pQ* Me!Y5ZdcI#'Ίnw՚uCQN 2hcc}B5B9Ei-qXb@BjHI?')`IUe0lZ7I}EȖRt@?dتAN_T1ZY8泚KfA*儶4Sdе{:4ufI6rgT Lﳊ!!)?`8&{t}Lm9R~5}B>"_Hf؎k{jdĞ}gfqap-Q![0%.dS$f'j s`Nu}dI`+=Ig$9=h5ϑf,u咄 (EWhRҍ4Ȳ67m 䤇#̤Ĵ"$Pq}&蘤:dwR 7i ecĆp-8 !5I<XJf7l2vaLT^hf,YMMLXiKf%\$YqN!v4TJŁ'>! ]p[:1>2kG#r(lbsÀ9A!s43Z >JSyMйW03|덐1Q.ZZ@RD\DRBV Zy ηPop<p0j?wtiv={ΖFH BV,@H0q&eɅ\ƕJrTRE*$SIaP6"HF@0F3s^o.oΜW~@w_GWTDL+=0="cf;B4ox& ]L&c<2=n^O^)ԱDfck^`ob$~HxPm׊\k[$<2 lbfz8SWL%qSLfqsRoT\^j/Ӄ)ѼIze!fxPh#gBwDNazGnG7V5 kH5V㣱OTBv0Fx@8{P`U3-]}Ьptkҕ4-(X)D.5N@f}jfLf (\ ,Y GAIkÞӴ1 .wù<"Яiuy U&CiS2Lԧ$NXS0 gxgF2C)u:4Ssy:ѣѝUhOэc2bxr'?k9.JFjїR-9r᧴H +A y.4*}sy$hXj3,"tϣZt4-)m_WJ V0-w$gJIq`z-4ߙd91&~˸\l߫\zǘRGF"g.MlI/YiL}wWKZ oq-\y׾O[OH%/1ϘhvU RӍo|ׯ}G{0^H{G|k[~axe~y@Džᾇ_YjEݱwx?_ÝO̽C:i4.p)nAfc~k3䒝Wg I.Z0"iDMԔ..uquq:GgD}Rj])B1茧]…*{Dh[(y1~*=3D,ޗb3sQf"RLż=ӝ(,$;033&3Tȷ&-bkF-06轛^w쳩c{Yݙ8S,KCx!xCs%K˛~]]Af΃+\=Ň#SmMJ\u]>jzdZ7 A E\ԫim٭]ev&L#iEk2MPc&iĀ(dc00RXToW&Ǵ}(w+hJ~ptowNqbuR&u>/m9/Q ͋pFntS| [8d쭽f _ {K N[;_īyϾp׼?mZ`?ó}uy| > ;_b)D5~Wp W@އR^8 ~.o0ªnFДbC ,kBKj( .F.<&*)/xV%H]ub6N YLr@uU>W3zEMb`Zv, &Y֭3)3hD9 E$$p)DmI;N^B ~:\6Qzn:ku.lh@Ag/cEEAWfZAH3!!,/`%er קLX0vIJ j31/M-=0(B qzjKs>V63ׂ s }jވlSnZ2i-m}b4 %fK^Rjpkijd5&w%c]Mu |ywI^$Y"27nj&qwLȵjաgSkJu_o,ާR - DhַϔXM)kg @;V &Zv .BmevJsfb1EߔlXǿ iQ)>[wOlZB2!ɚ#M,FX+]g+r8T0wMR 9VtSLl@+9.:LF;Q0,3ˤg g&7ן}5{gp"z9:V8rm3t { E5yɩtX,~ft'?a]}=.^}gW> %(6lu࿉p=X~ݜ˟>7eA:n~riH{S Ajid&\c9M xт76mB }-96)~c52ɥhSKз\&z:)UdiR ۑ6:.oDHء^^')xci377ӂM*cӻ0b㬚m(-T "jx7ή~A*=j.Rg\K)#^P'҃ /h4hDw:M"7mFXv]nO.j6`[εgc;OH(!>,GߙUX9E} @||#b@ˑ E,M$^FwH,觻F+$ 7O)4Lfަy1!r6\ϳΔRb[/3Xg}4t+VrqII^{%mNnR*HW[:P7|,04~zfVafEab;i,%DF_ӫ%ϭy8gγ*JH$6*S}zӣmIc2mXYQQ-Kk܃eSO]sP"+= դ.ݢ^fOEl*Ϳ4SEn׼i!ͱ BF0O HKzLߥ940=YqqdYvCͱjGF.WG4 $A"͘֊mt@4UH IDATɓjڌfBZlُ8W$Gqx*=46X(E%{9s}WS~:хW&f6N7YNa3 J~|iP 59yYY |:(zn"ܝa( Sq@h +|qpi4YJ!v ܕ *!U!B,D<\ g-[a5*Dyֲ5Jz0E`xhWoq仜=h/ @CnN̯y$A x2`op=H8{?ppp8{h83O&x€݃ϒL!dRo^?S{R=lo~90BOXsZ.YsUz* @4AJSsQVN=Ng`ihG Q ȰT5tg< ;F0uXQNS@BAa*oed7M6Z1IE:ɱtOoZ ̐i댵I"87)G~W<;8{|_}'7tfgIƝ-Մ՜P̼E[xo`&[/ E#W+S? >tepsjTFnR@|Yv=rkԧ:cͅL@ uj#st6 bz?$)[.TL3*/Alaak-ċfϒ\+})Ղ4:ЋY FOaʮŠ't 2. @z\Y8#1|ӻN%-U#LStb&:{濚F-B*ZsPtÉߨ1Œ @dԥϥEVcD]çU,Bx:lgTs[$"|aR.QvBӆ00f!;\:Mki\'ս 1#J"(LqefµQRer%B8}ތ`&-^fߐtzkIJW^P|˖*a WLR$6yU dը>JSL!Urf~ qa46]ˀn9bJb‹|Zeav@RϘ$.[JF^ =gV`H✙/anPJ$tnBze#̾¡Yꅄ{.%{pEՋ+  M564_zG$ 6dqm0U* q:8 oB/`ϒwN&O m3=_d3eFNFLȤF9Gv.w%RK(%n% YFPb$bJTCt8Q#7Ǹ70dW HW# 7+Js5qorp_Uo0`Z_+>u ^x-9͸u&c g'hgά♰Ӎc"e.luɖ+*Z.:$/xk4X]OK}+Rv}w_;ׅ7FSL@fր4<4bc)AV"kh}rB̏v}wX\\`˔-ԅRhGk~ PW? NNZS2-1E|D-^T<0H%v]'Aи?a9X3MS8b6/|k>6Y$Plsa#2f=t"SJ.D \{5-ff8UvYy0r$WItpFu'3bA\.1vցlmh]M Ҕ~C|YaA`=ӡc^o}G o{']{|~7'[׆$!Zkֳ%| lq[I&zs=npđ1}/>N;%읹\Tiqm3 +n3u<'y46,qƲjŀ < Ӆh~<ԡBTeq;zo:nq>sU+bvHy,)&4fMI\۸8׋Y5}zwEqNEbjiz؋ŭ˕-БkkN{WPcS3v07r#^f8ĈŦNjWY.+%7 )Q}viXj拡f2xN52i mdWzv#>xNjo4n Lj:E3GfSVf~;5"czPt8|o3zm1fJuM;'TcLGkgP=GZm(҇khL뢝g輗ϵ#I f$GvL)uzgUnXƙx^-C {Rs$ mpҁYJo>+qx /xO&հДa5OstL/϶ 51oyCv]DQ%bQm)55\'`I *qC-aDo~ u 8w`8&3 `_\EIp?^7(8`MMΙ.C%0Jq`sRɀs!9s&1[DY]rcagU M *-<֧x=‘&Km9evbGrg!m^>ۨbȻ5YzZ^=##59IeKɚi]ev RA׻@2r4Ƣ+3Pْq]R2=(@8BK~fנ^nJ3ս2!A3R̟omL,) ÜUʕOD2:g))ω2׻Yu\'OfiRZmpnnR]hܒ.]x^vel歉pX7ːÖ@,=C)L`@WqeMY8ikHI|!| ci1;חlpưwb2'쀖ٍ ]t1QkMQ䖨ƥuHWVgk~')I8׉.JuOyaTõƈ 103o*Q,\*~[ 42vYڼ*&%>OX@YGd>E_>JBԶ8ZdդP{@}a5;IA89Ýp7q 84,R9KmΌ)ؾ]'0EA y(Hɱ?Gkp%+ W|kܹLCxZlu.nK>m3!YL2a[ӱxJ)T0K : gjRQњsbLGHf`<'22HF06/tӠۭ& Ȳ8ԛr M;nԄҾMS5RHFzc )ώo,5k'iOK7 xuWiY<{3OloEgqKe2/ؤGLja :r-;;4NCQuC9)-"r:2j3s#KMӠR@刅c/FMܕ59TڹBjRj?WIRW;6J{yϓK]1|} 4z[`aՁѡ2%*mۥmmύQUJH+~2,$n hU]V&/)Ъ8Cͪ:uIUoxAjEh)QBjQ4MYJAj z_)LݚJ*7pk߆{ \}ux}=K}Y,MA#V8:L񒀐4 {N7[lr[Sp¥+y׽OM|ÿ׾׃S r뭣cFnV{)gpBsC0dF{&6ɺq 31uP&ixn8v=@51<VTEҜPԛdKܺqNHG!<&MHVELtH 8tZckF{:;.Oew)wD0f`d`TM۱|䒦`oczoԟ/LGU3x*] `1ʙ>ٽɽ:͟YD@ {ܾ}ddWt)3+#V@Z5sMΉ]@f4`.130/'n"Rk\R8ΉL&& T-Ҙ7@j[(2 5̰if̾2VI?(PE29;2_3ڑ,T\< (`i1ґd#: @S=cNTg:UJJIMsm]iv.FHȮ(gC5 ׃h*"DFbbrk_"Vgp/&дw,.?&|I|ቅ*9{d́5m&7!Os[G+qgd=%YO8 oGqtzזMwΆ1Y}G '~ȯwx [*4J"կLNc:/4^qg @zۜ9JO )RMn!u=KwO)ԥ%Q5nm_ .cv_ b1lӒ)ܣ,ToF׭sOlщmcԕēn(X42Zu$нD-;H$K+e"fSu$Z) 3,:GyGgvSJ sVZ; zN ab#mЅ)VY#i h=%ɅFHu^R:}]`6`tMSB;| 'wXx/z\"N f-LǏtd:+VVfd6g^tWj-αg_cef[^9rId bv 70{a1j(Jl$`m\ S7QgY)lE6S//+ZbqejZWTC>qx(sB"v,W0cV3{ g&s!@:aeS@}nwǜ ^V>>6\&:ia5%ԧw?בiIp rjuЅdz PLbj's01 }m?6%M08:ûۦ8kj$A U z4 lWҠlm!Au|\H f hAc^<DM 8&bi zZ-@< x_xw@izo>׾_[}?i?;/-tn0)U™ sa3p7 ~s9^z}xKgU2\i8>=_{ /> ~Lvk"H>Ƈ.42 iձ%>UR($CI6x(u(sriu H )eX-SrZVggv`A8"Ps 1qjeQGP*QBM˜*af|Dji-@sG[FdV4_Q].É֠*5&D#6;&ҪƆrbh*wnf y!( eqʥ0Nʰ 3=u/{yZ{׶ӁQBD4@0!]IOIxmSY!EIR1@'{/Qnr1|, 7P0ϘC3:*D~PN."7!nZHP=JLG˄jmǠs8Fv/7YBZb@P^%A3h!Yb}zZCΞC&KL: 2YOqz734묧(< D S |;׷F}\a 9АY Hi=4 \_S_CXUjJ}>ޭRtz^b1Q3eYw P:lp?߲yW̵bEi)V)v4rb_;cP'~M( \3T}qe֛[0]&]ZZ'J;(GS'aE8q3Xo |TYZl( sԧ%xw.NSx򗚦9G!#(x`z#gk")թ3d"0 ܦ4>`Myk*"ĩts)IiY/~Q:`xvl&$LO lACNnC`1/J/aX~@ M'Mޕ3<03&..86tΉ܇К~a]Fb$F@"]&w6SI!WqcUʍvQ= fÿ^!֑aȦ`-ؠ. R%1d/'Pw/Fr847s aGտփBjrstw.$fnӒtmʳcK+9{ȼi1Wd72iLgΨ-hF2KSn^Ƅ Eri|Ng8 - ;Mw'?xniԆ aYO4pz ͎lS(œ>љۍT{HYo>80>5}2`;tO҆ c ] 'q>>/M'>?_fA$nx/[89>.?0^wߎmݮ_xSlElԁ l^Ko~__}qEt_x ^:gqㅯηN…]'EMòӔhY0U|V 4wՃ9m WS a|\V5 &CIi 9"uäᳯQ'y.f, 29B(QAj)ĕs֚}/N (ذ 8bL`dA{"^t.5z{S6)FLF.MV%P wAr+,Dl+Sk(T2@M*ŵZdl.g,{d3m>߅J{Lpm."1:weq:3ť.O&?ǃRI_^+ov!Ȣ1RĞq(^:v b9-2XRB.̅h)a˴gS:;0lU(VKa z``X)S|K:G2kK޽;6Gq&m| ׎Յ f n  z%=e{!1է4nHA]4yJAU{FJ 4+IY?Cm$SEaLM?ZD Tw}bZ)ĐȥX4Z^kf!S hmn+%Hr襆ŠBG5™C$꺲 C|^81sA|O[g hXin{ `wfoe xs6w Gʪ1>P`R"'}aZogcGw/[Uia7NQ8{ eHipR|@BfXϟ kTdoؘMҙ4q2N-4}4~Ki88\ex%ÝS`12ɰ⋂7̅/gF@Y͝QM{Bɲ0 o[*ChMb3`*VT % H q\RC=w?`@!— )dO"hDRg}\nj84*@%@8 +) VܦL`+d$0u8~xco᷾g^fޟ_y^s!T76&'  iBm&/&9c3XG`hA^.XĈ}V(^v vMTˡ'૟uAD qMࡐ,>M>':M¨BŇ7~^%eqʏ R; SŒš5-J*&;Al0fdVU0gH++G|aF]552 f1Q,uEG ^`'I]ϟG2Z}{(Ed:NaR0(82F"12K-p6u%Gyw} S*+R IPEMM,in<*2N lMyj bEɚ)l1zV!'/5 =a 'KH9D{p L|s.c.u3SNg-_0|VR@p%#|Oxprma^Q]co.^]|2}0N+=:<#\.\r1s1QKWX >͔e&*51YW8π- \FJ8r˴%15ciU2bh|e٥nڦhwLG. R6jSAINX!uѮ֖grwcBCHTudF۩3P\jQ3 ?I45uYL+3j n><8}g/^ṋ/`?O|WOܶ mkqOh1:t4Unq)l-hWU9X/jFIƝ|rׁwG QFGԌn6􀵇8%uj^4c]ډ3_w=4B%'KL|VyHaWc5믻cK9ϔWڡԄvEQ{,VfƘ#35S+k!-MbY!- />s <Z'v w)JD箅i]#Y0P& (^/qRT^iRZ5 CZ-,֙ c,ƚp1WԀAnQ y𤻗OY7-2V*W+jf՟kA3~:8ceiA皆FF>f֐r s3iԡc1iG+MS-Rl\^)>0 Lb$"ƙ/yS.FgcEfsMQ^vBqu{{b胻cCTsȝ#F7et \Ǝs Du5V G{.]uLݒ:,NJx,X'4)NOhlͻ ӻސ0[ӬqthP7"]Ӻ^aod(e?1Uɳmh ,9" {ݮ 4NϖQl`|v0ol;%ܹ8=h,[@lGq>Sj\2YwvE!A\#z\;rxs0?[LC=L6Xzxθ—ċϽ_j1ï;/k8>_ɭgTc JU0%jJH)a 4Ӆ7[lAIJ60 V(;Rũv0),;Ij^ t>&vvċ >SV .dBfg Kͱ_{za$0$|̽hA"`vdpAhgN(ڐ$ۀ]z IDATiB`V_V2>gfCE6t֯KklR޺:xBuRW=2Ęk#sEBʊ]>NU`@p0ww9M=8=haߔF73{`b)`Y`9 $bn>\yS&p\8a}9wBvy-w}t;wۧv;3̼;}ZVKS-5y4f3c#FϝVrF-R.6W }B dwMvTxy٨mY +rmE6Aͱl<; azuhY?=U,LbNzP]&j&#=WEmS[1#͑j`0Ծ5q6J ŧGƷWzҴssO=}泟o: 4G$vA3flf:쌜 MX(iksrrFF{jlL7พ#mz0jսc:9g3t9z.Q*E-9{0H EĻcg:IlwBL#J2R]+Gkb}3i3=yh)EszN{[j7&kr!K:AmC6J3ϲ/#Y0 Rsč HA'7JΌ;NGqȶ m(2,콝}9"ez[Y!t?x`Z)MjӟzFQ>UM7 tf8nl  )ue;klI!#qo2ѹj$z9!bG 3)z1>7 Ml8$+NQ6vBH?"a!CP(/spw|(h׏q м5P_ -l4tsgTN<=vi<2ר69 c}OiM#Gq}t ǔF(92mmsrOɯS_ ^kvП[3O'&Ȗ8*gE~hN"j.b2R7L^cLs1kam. O)P:'%^eX<\^=-]}$UQ^]KF1ZjB?kR샀P|+ 5m ,}V]lj&Eq}s+_ѪȰ>ҺA*_(b1pNE@cRx144LL2~b5G}&NvǰÀ6_T,5* " ޙɣ#d@e٦6.+ܩ[(w0#KÁ}3' LG' ?D:4~ϬY]L#0ORۍ' tY6mcfHjV`O+Mm j.)xָ F2786q;4J1ϙX`,_st #V3=ÇU/Hѣ:y=82< {}8Y˨Et):v1,U2 g/ziAwiMdd+1p`;ؠv<NΘ~ Q'8iD;M~\ <dF卒%#@]V&FcI%埙fkjLmtF|ƙ+ u vX3_`h2v1Z:BLL@Z/gܽiOPȡ\D-ՒGHt̀\ O~/<)<ͧpgwp)|~ [jqL 5)taK/e=,TUJ"ӄ)MXM @+Ǽ#m.eIiŅҽٝ-sz鄦LJvobhG(KHgQ+ɎTϻ4 Y8v&ajH}S/F[,֏XpǙ A>;QG*P>'Go<熐cb1>} R{ihSwe{ASRWdD95vr6zl|feT2Z{D4jص9X#pnkxSRm^t$),#\^mw cQx\e{ ^in{߉/!ҫBz7YL{ZWeUJ@ Clg8׺?d/ú iP'f;T.N$4&tr[Ӂ7DG,bׇ5pp=%VnME??v {ec8xpevOz$=j/O 1Yco!o#z-$Yq)(`b($ M&q>=:Ed搡>h@|F 3}O˵io49GGށXYF\. AD<v)gȿ E; _x ~xgp788s3§?~|2n>n!hy~ ޙyg24aJs?Qi;h`"nU B( g`r-eiJn_K ɼc ֦q$,Z)j! DHdj4g/Lvl3Mݬem^}R:ƆSPx[$ /8$ZQ^Jv%̌dBMIr5Hpk&ţ]t>jPуM֡trunIWPzY \[URe }ChzD5Rq}UpkM0u) ʾ$)+f]s..`@x?2ޅ8Ɯ 8"6>A'1fq# 6- :+6`%u౰|bNHfwKPOh?Lo|d":U.d!2]ajx(^J&ҙx;JǫtPtn泟_ x'o`oogk3^ |Cǧ~'>Ex-S1_f[]-0a$X#] Ԙ-jxcѕy}-i'{L3MNa@'g٨tJ&kUQb'X-t!v"`KYaLm48I:x|G#v[B5п/FޭZG1' BO^XIHĤEo8bThkHbc&/Py)"f΅)jȴh..^/Ҟz> v2X"@|Xw/feR.7գe'ȝ.mmm!;z&1z\zއ1(_fIwaP);%ؑD՚5}w hzԽץ5C@c䎰-ô '70vxX~qOH.u;r\f@paTx5s zN7*TLFơLs70[#V:Qfu#U}4,,'Bcj ߪτ\x]])S9"S^v3FCr؎hM`TWQ)d&>VȰsjBtwS_'x˿Wވ<{Õ^AwǍgc8?s QbHTx()A9;T"kHф?-ESI!p'#K1C ٠Ux9.ż[sf[p .ue8>P#ـ>X7n rvzPfs$Y>Gf%t&1I%S6vʹ5(I[qs1 3v1"'єmy*:~G\BW #s?>,$ QZWk3uG2H 9fb;@  vDC30LGtZr3R:2铭2lB۰NϠ9Ps=H iSCskI"X+m2Xp˙b]M=Z]8|A9 dM=x=A5&gøFpn-&^4wR#X)c 4m,7Wlu]_9٫ .$NN 3?d8Cۛܒ$a~o̩Jj!kD-D lŪʬ Ecnq_e*+}"<͎x~ %^~] <zxӑn)V=~ 7Oှl%.E|`s`bOn|_eΧꎯJ'\^g7|f⽤9#C-!ߢğwJ\ۤnᒯ[J]h7v-O-:!5ZS H?_w7/׿ ~k6?wo_?q8G.0so/'Y^𢈕~[Ӣ:2Ů{E Y|zC%/]eYFon DjStq[7*lm*/U0m!c;zBEwfbh ,8"\Z 2L4%8)F_V Pc{G޺$t64ylrXz%B%:Xg g)G`.pŘQВٚ`yLlN QexNDz3H{tf]`b6)IāB gѦL%VHX'vYʼn?|rHf:/=2gQkW؏u)aPP'nh<:4EkuBCA xxh/9hvٺG3:vzEz:=Ȅ}vqMrI[C'R9u.EEfNn]ć]D|%q52smJPdn٫;~σY"Ψ`i5cm3Z0F*fX ' 퐷Ldfvh9+ $R`b?w+~7_㻿g???۷o_oo|g|?Ϳ¿ϟ{RliYkY”yYIv;& [i擟ǥW'pfj`fb?.Locp6ccdm.( 8ν2:/,5jUBH YP,2 6bMRθR}ow9Jӛ򹯛3IuXhJADNd0d$=W-:0c;gN&w۵- 6^(Jpځ?GĥZu,0ggʧ N.[&NMsꀾ$H_w]Hw)x:iIGI`HnlբZ\r`ft0keo6q9lH$*ȥnf!@u_q*N mHZ[FQ0D7 n7e#>%6N,Kkl4xj`TA1?ueլ2䏲B’W+hx[| Go˗Ox^z/K<|v{nhݟ>޿?? ?P2L4bb\͌48JF4FYI^M,nV!M_tHnרl*֤ˤz]!J\R|w m !7-gmqQGMO{BnXٳo4p\LXt,vA6XEVgbP a)"z%aܛ3GE771V[a 25_]`|xH#!9A/펖4$n]X%bձh|4]LH`î1F9.jv 3KAѫHq"~7f/^}#/滿īƫo Kܞ^$~Ï?OxBl,i'u;lI^3)dɮ"x l f2b5wu5 5R }#̘G85!I"{ٴ:Āem2OMdpeW0HnyDa" wO`mErUi^fh@*VaDoR Z!=1j~ylE$dMWحbHlm5Й&Jז[msA2 !65vӺ߇9v+x dh( $Kǧ?7 M7J=KM<|ĸ#nQ.Q2# \~Cxg*ӽ}VfT$^WRE`Ok:Y\){#3+ODWݯ"a5%/}j^HU]bTTD03M j~qU\Y?Bؾz$oDE&g6Ë(k}Uu}Ë3 E|ܨ͔ DAFR*,Ps{t>^/tyeoi2atԀ\cktu /QD<=+3>QEBb^pG 29W iЩs6Ks :Wv9'~5ގI[4zw$7zVq@U76+'t-:!vP{lz& 3[}5R.q>i\֍R1{D~qQ_a|z,H(!EM8;fge>8TMՠmSI_se9pEZa*ts@d7оh?-=h&aĨ{X< aLLmJ)B.? EPKʶK* ZI)@m]E즷GHfxe 2>;[M}X "I&*"4JVŶgW{V! 8)-q \hjoJ8jf=Hr]n1,iHHFr(WuFrXUH vkŠA$AuЅFM&1jm&n"#[_N]HP6@${KH"G=SVqhv(03Zn`*OۛsY13TtR6o@ "սu#Gf :bw,zŒqePy@ry9Ee[} S xf\ֳzOC_BU`4 O]h{tTI94 /ӬI.fm3Mklٽ_2φz],jS̋5߸mMG #/&sm;,|d8 o[f|v}6.in;l-:b>ʣ`BK,p-8=9vٔpzthzSU'͚j+ ͘eZmj^&smX(`(JTh6Y <F]egn{ V6+3+MMr^.`V5f+T)[|W bÊ~f#sz|Zlt{#ӕj"(6Cw/X4^&Hn uC):8wNlYt?}*)Z\i 1%'\ '#Qv/X kB#ɩ O5fMT~kui${kc1d^qR:HOLNp) l(y CWҡq2CDŽ{ji-bb /m7bqhfuhJecȾͣ>K0z{J5BPg8#:h fe< 8ȜG.kxŽ+Mjg,fP60b^8bn7XJ_n*pu{\|Jɉn,V0h;z%}$=L psQHq (.0$EK"CGɮ &_9"4heuoP(A{IO(ܧ®$k~WJ #82ψ/uN7 s}1ͧY.oW3a䋞uNqɆs*FAT 8JYP_LDXõ=}NV;tie(<<: -) *eo! 8b2,Z,X@p6v?|pك{,Sd^/WdvAOSy3~7x:H%8˫ʣ*z1QyͅbL:\?Hf2j}mՏ'1z,Q#EbVejU7ͿG6t5Z "uyeUe1\JpYGWli66JR"+}&E,PgAw6~-[vrua:c\EQ5L ٰKۚӦ+J\LQPQ~`s%bQH9#U6 >2 01fTѺ<1wU6GQ rQamCvXLMƃ0Xe1/ -^&?4SI)oÞm#W*w gzW#YiitĶ.m`_YKC"mP!kύhaTC~\.jDWNմN!QLF_'wl\D/2CA;g,ͶF93֊ qO \ h}\Brc5hkMۜ}ϤOՎł&xq-c*37{w|HfU-p0dktF~L+fDK[<BlZ`0c&g@L*%]ԝ]i:x~ ӟ1Yke0}zu# UV4hp\bdg^+>6ګJ\B4I YNpe_DP7{s@ (LIߧJvww&3v$Σ"ޢc/`y`{UF_Q|̵v&3'MXqOy]Ev;]jjo8x=Y\6J ,7s ] kkCPv? dz?uǖ]TSL<#3B)mwmJ [υ 4=偂~4vdhD2K$.jtac&lbRLc ?&r[;DΝB{g.qvce#^6Xte-$ت. f`l!VS&PX20Hm #O:N7uoF2K@vcjWsO 2 ?O}jo!)vMR(w,G*WH5Vt[l1 j}͝pYE 4V]i2Mf0BIU+t8$wq:5.ׅ ,/s)I\wfSz#*Rv[t(iδs2b!5Y(eJEy8g~'-ORW+7h̑ۓ N >F5fAh 0l{rjNC⶚3,1iSJQ"P"f}B-3Q+OLkSLS!Ġȉ(A\ ΟeF?or&tmTqw͵xO}]<)DjHPtNUg \F",6&*h\cqRV.mԹK{v;Qҁ3ӡ?y;'29IcOSϽT)2(ї/Ҥt_eb*}5.mldo)2Wu}#YZk9eâ;yT_ v4m}rf2s9-zH ΌOBdiPfǟUri1yE<ݽgQ>d)4*jSZo(qB+n,8˜`\l~CK<@&8:1 "6F^B%niϴ>KZ趄q=IGw@ɦ~WhE2 F6ޓޘ($\L!$lAp5(tWҞ5b>x:͒K8znJSܡMD3"%Z -|.QLi )WaDDO j5}M^Rx>'34M@rFS.4I|wkXeʑBzڐǁvsdcKnD S~Ʉ({+9B2%z?@1hSD+f7jdKGN- -ZGNji錀qhTyyHGi2=6׵ei IDATQ,2#R,OuDp$+@EIVC'"j>&jP*#wyxJ8mkBQ+c}ڦ{,j:S6ϦO,Kz'n?:- HS RO"A=9fG{.km]3͎>dYϺm}pddrYYY EořaMiS t;ȴĘzA0){0iR/(X $)nSE]5,ܣig }=9!JX%׹hӰmu-˺H4-9A3K]4>MaSs!d:!wg4PC+QdJfhL}.;7vf>*>l*ak'c&h^3F+ˏ6D  llO{I3[E7Y<*(0l=5]Mk je p7H)QhaEhn'tP uE6N 痘BL0sj<98m=_S267m(!s'p17{\ARͿ6? /RㄻwI-4&ZkDNy=/l;ĸ)8> _3$>D\$Zx_4._s9L<0CpBcg2'ʝ<Y0j榛dy9MIZdMņ*y$pd6QZ*6p&d[H1uu{C͂? s7kZxF tpEAޥ:6 q&\fy[^>WS\ cC>+5~/UqL tKNCw=3PB1#vIhBTҝj e$@"ɸL'RLkSzsMlZSsɻ xE4IS!) Im7CJ66WMdI]^6#>jФX0x"~Sp ZɠM0ehٙfJ2Ј;Nό r:z$?{mL|:E;JHKni6*똼d7v3bT~=Rt$jl:&bED&ǨA^,H.܏bg0@)g~g :C߮e`Csk*Gsz5gqRNsHRR?Xu*m;G:_fN-ŶS|T8Qd|~>c3$GqAk7;+yv9} ʜ3po<>( 4L/e;; S5^:w~,Q3sc+ wWKT9UY8/h$'m`o`ǔ b]ZlӦ1nEIEVhŸltn\Ӡr0FIcX!b0`i YT`OYcG9 <֥lFtӴj /TRSuN0lZN{8ց=OES!M@TO}ỠQ;7xy(uPJ1]G1w\KQ"yf@ݶXҤ˻e!p$@N& 'ޢ<'l/[W֤6VklW!x,<$ s$yaD 4`4GTh4W) y$fs:@* ~fPiާ ;v6 vRsbct߹x해5\DcI) I2n .I2͡k8L*HKˇELJG&q+rm')l80($M)Tk@ɳ)V܀f &Q k1&fJt<_N+,s.+Ia<2N Æ )2$}UvRUBٿi}(`F5i7EHcY1&)LSf6֔Ո1&O>=)+E48Ԝ]#&>+37TV1^)f+1aaѱ9Z<,G.qVɱ {h ĭ=Iۭn@;3;|'>߉ws?~1]<g$3F\ޮ"! i> +^=p|`ZFO &~4iSArSˍ$f# 4ٷzL(\ZLBYs2M 0&9nd6y*!)xlnVuP ?mwl+'=Xc 51S,*(LmY"iwͬ*T0(}l|4$t۔gyF Ʀ)-E p)NTlU]~I= %S̩Wn3Z[Sqжkth ժqFrfh$g' Ҍݚ_OЯ â.T-bOƌ[ѳ. qD'63OeGgذeD{FMu;iohsEV`GnP|vON̊ $Z?`w^s00&M4}(UVcaeҜEVb'JVmA/rR`71rLnK6.@3aqd%4(3ɵ6* ݘXu\yKqPْ/QJ6M،;՛MX}(:b;e7Cճ d ;nqǭu~z ||%t6>?>>?} }H |GQ4{~3%+xR磌W+@Dq7}48iy1-3Tb/ lA.hEsV;uJ(L( $tM'Fu2uXLy0TZ/wٮU z8́:|MqnIn`yZڕn^}"I+ڞhʔ4J:䇍`JbIySSBMJn !7ݤQEd\$ĐlsPz3s.9h&j;!lhZ0Oq)!Se ]+g'S&Pu1ڛ-ьQ#f2'N,#/ 2Y>hËA_FvF;pkGAق Y_ }:s'&S|ZNo%S=}ʂBFXڮ5((LvQQMșWL w ZV}Z241ceN4k`;\12cM|BR2F؞;[z"MX%) ~m Ok =GABx湠,NJ8!CYmE~ӏ?~~ij|~&>?~]> wC*NC(t)S?hBf *(o&UpMxfPj;Zk~xI!~H~OT-lrVϦ.1ʓUSD7XA\k:8W*RIkЫf'!t|7wm('TF7bh793,MHyAqc"fUh&`BڐF*RHN5=4Up\_#:+u@Be1Dc.]e!d0!gbA_4wMC? $~ed$$3,Įמf! k9ՉFV> -&$-FSZ߆@NԽȅ 384FRE3GAgqi!Sw E9<dP(T!CKȠ:$+5]=4ft'5dY=l7g i{z]3h+ |ڠD :N9̎t!y>M)C/s `ILc5Ad#繨LzP=g s+GI+M6.CBs]Gl?SSez>i $pmxDJHέ6تzR|oH}5Rf5]wjӸm(сtl"knڳAqEܼlg@4O&{ibkӒйsqz$?KLJe;T*zl )7#Fz6+&.Ʌl> x5ۆ7o7y/~WWw7o>S:@s>}?wf#q**~ȁڄxz5h[Pm4I(Ja &K{g9h'Zšs>gԒnqfEf'82sf ݼ65}}"gqI(!VO$eh7cӂg4"gksfӼ) O]+6zLcIn1Z-#L\}6ci޻6_IWЍԛ yq[h3Q{5] xC~ Cס,lwt;3y:Yk(qaY GEMU?kݧrMWc>q1)p^=5tM7:sĢczL8Ft\X D5a>(-60ap몟RC̘kj4j)RaQ DgR$9; ~JkִsCc{Xiޒ;__{Pk;Y-Ny)r-lQi0 WE8g鲧4Qu]1=0#vOҥƞF'  XS}6p>{7hI߀1wZVo?IksMXqj^SGv\HfDA\V,^SۜM'%]% 14WxmOֆDdҘh,^>QVN@[-"G Gj9ܱېE{-ʺb/r["HR<)x+I:\մ:xFM믁"vī '] yxx xGw}<{>=>>}ӣw(,W75Y09 caQ<˝^Րt?f. Tl¼2)r4d,?ÔOb'o'G~b I14m#֒f6Bԁ_I\'Psڭ5F*u{Uq)oN9t[{'ET;=gN{7**[k'#OuM@~j98i7+喐qMof!<ͫ 21QӍQ$7evY #MqN,rl /Ҵ)lPܟIc(̨9I*愝 k1 G{6͒M 1a^+[%xN S*آ3}حcyjn9Zg4fk2D+nX! [)6W:M-OeF*38ս˾X}7%}#w5 A|緵6$}J< _@mMR`cm/d`Qt%in5:ߢhl7bm9wM pCehs1>x9$v`n:(Ku0i^^G+/ĺ< g˛ǼVCTl>$ܤlo<[:3n[/oǔo6x}:G?n[g^~ eq<#g@[;ȿ|-^,#=c&chFCā5Ӫx|p6 SdNh0b;?(d"ub~:*!,a8YsuH.X("Ĺ*-}byMhDWcb{ovDh-mUչ<-%˖ѓcBkoLfNP2f30sFn\I˔Sf- FIW&IɴCZ?Odγ7 Fݜ#!NQ E8*6(8#ܳ`IHA#lrG|J=N;^1{WǤevQ4 ذWU _ f Mƫ5 kRjÌPЄkj0gvԥc3ϤĨTk? 3Ee5HE}`6J(QXGw v]$C'wڊ]ݗ*Wpi2=8 ׺|Ζ~},6pL7wDT+n1;_'y N5*]j3aGP);G$RQ/FK_Kdy͔"?BL}RXlВ4oONyJ fƅ0 {ljrCL!~ps;j7'T5ܞ2n v4t{ۗwoU sj˥SV:bx8v?|L?|~93cD_*2R6̝]LJO矟?9&&S_KOm$HɥjźG8%ыňzk7ĽweVO*b3)MF28P&YTgTxJCr &Ɓ>IһGcdvNpdxLBrO%璳xQb9LHV,bgv85b;c-)~AU:!^(sL7a9@较7M[v_\% 4N۶;iiIq AQjIĒ"IFcIհRoθ~ 34S!|@?T^t_A;t#b+=UAD@ud꿉qT$isuxd磘7F-p=.&B ux9gs;'5ll2Lr IDATTVך6výߓ9t: a,$]Ҥ<eg6<,&%og<'BU&e.yt/ۛ]et&SäpϾx]u9(Dn: ؒI-zd$>L^2FDGh0fS m!pNgEwl>Mt;Hc^#Jy% Y~Y #y i dLq&aY&O9%KvSYz|zΝ9G6@1tB}Kiƅ`3Y4Q=udcu ճWCD2D QJ3'z̵֞o_~mï~xMG9My{wcAapfo;3w>?>'^a c/xؗ_| 7 =Dg'~m4\ίc+tی@1TkZ3>vkcR=WL#D ܅'&@ @9<}n4k ('@꩞Lp4fiGWs~s5QvC2Y]`-T6-i2" :V&/fM!7:90"<:FUd\.+0V SőӚv29>H[Mk5Kc:G1]5pMCGhv҇JRjZ$$bH&n`Zg$|=a(jz`bMVS.bccX,g2؋bۣ4P#q$Z2eFg<<8r;ޤhS_57C`@w>Ѡ9vkIB`dgM"\JrN~ )$ kHŏcH,J:l آjn.k,u׊,Mƫe&)9юyE-s[2I::Or63 >wgf 9H,$i=;ԫhaxJA|ttHX WNIA9$-cyԷM&V'Y0QXi~5]f2t`0 Eϟ㣝FWt MzuR/%$#Pc6D%K{z?Tsh^GL&]!de+"^ #ߙWJfKzaum;)|b(dh߄lf!h: `OZ3A*Z1}[Sƪ9k"/_!~]׿%^|M3g©"!`e%U|OĻw۟oq8Y4&qKuE6` h3ρ?@y:YQ|p^!f#$^n>aMp|Iƒt2 .MqLRQF% |(hy:QsHN].SDO#5O=vۉQ[,ߡ;rQy)L.ld PD{%vm ŏ 8/mf}re_ Vakh lBdh9d1Ɩ~@%ܤ8{cJJF m1?B#K́EH%k|Sι 4k];aXZԴQlSYϴ1Zoʺ&I٦n?6Wq~yaM I'wcsg*cgdx6 l˰s@dtמ&rZEc |jnڠ] ֍E6z$UfFgXEiI|=@̩ܳ*J@Ngq x CAsg'O,GgM 5ڮPŧeGH]wcskkh\u-1GABXx/u&CܑɬY .>&Dc;Szvǭu|oxO#ZBg\@i==Ic|x ?>χOoOif`0RЭ\M#{L:81YēBrXl)*Z,.>T7EjW*3H7 E?x 9rvFa eȥ_!DY*{/Z& \4߃9hCͬP'QD 3[GMG3c <ַhj~^gf;gtoRAj=hwɒ6Y)ŷHE (L6htm`Y2;'DW6WR CPsL,'gCh9ҊMj9 XN^7͖z5\M& " PIXN2RWjL~iH,d@$MY+&Hq klLvYb򱙭}%J۾FOLe&+z!F,^]_9Rq ܧq:z9WL#\ w-8c┥/wlVŷak2_> ¤xZS@,= C 3ˬ-0jC~kBɂ߯͡; ) |Nz nAߣ3錡rb*@?͑Py,v؟h ҟ쨰a<{4' 3sc*+-V9o1 u )쭵dMczq5XQhDIr&bh1>0J1* і:s%k-,Sm8P*] fs5rJԁ&#KK** `1\u㛯_6կ;noE uBjzl$i;-erE }OOg`7vj_QASǟ?N&6AS$=/p.ׁhlm˱7RghP#=s翇jڢ11>S (nƅG#Br6Q7N)~C|&OAF"ʬ?KsMh͸fpi=KIcB؁z,SKї4sMNԔg6y2m^*SaH. $`:W}wZʝJٓ#xkTR[ԤQ\dq/x4n)fƭM.#bdU !GX HޓQXN40~yG<}}giĶ(Bs?ρC?zHJ1riԕQRQ"t&<-K&>Sרi&smЀύn'&}66,G~.N! :aU(Slnot|OL %v4XMjץQe2NQigF%Df\ٽÚc[?[;]{5c>]3i.$у%&~ K~8_q-f;UR8}ЊX[ۧлH[2BʈqP:2mZXyN B)IE58a9v3 `ս老5]? Ojs++%u%,gEޓ4({e˴ϧZ2Qla4,1n)V3ؠ9pkaVy|\6bx^6eG¼'貇seU_|nUjlԭѨ݋QG*թ,H\P'5NJʄ>ɶP YV*(3g4a[b)i_F*-l^L#Vs,5:f ř -#yf=0eftwL^f69?3Zq:̃"G?oQ״4P1끞|Ŝӓ>}߿k}3s&'EC#ۇVm}eҐ.kL-96 J)>¾iB/JX젯ͅy틋X\ Lnf\J KiL.#ɂJȾr;e 0%][~[TOIb"#vx|*ܧs;fG!d F6T@F5Ӂ(آ-;,XͶhIM\͟R;LR4YH#@s-o4z @X#bstȑ|Wee{pzJ+izHy3'SrGW|^0=( ne+.ksE=hCMQP%0IAPt-i2db(\)HEo4gQ O m\'es([-V)ȋ1&J+5*UAu9w2,5BorYA+Y@R;ԨRm/ -C1%rQO-3t^h'}4..ؐR^dwIA8bJe':CgwQ!<NlÀgGᖱ(RG+e>$"SW 0h4b&W->ed(%I( ~9<=߫ 0WC.h}>/GbO#]X<o_?oou45#냚 SL`0:)MvT:4gu\@#hj|Rdw*%ǭ-4eJcXffa^/ml͏"cDRLV*LOMۂ7`0tP 1ef"-qSNBl5#U5# ?Wp'6V¦UǷwj(mz % 3&v&n 0UJ<_@gQBU;ӿ0\.ZrM>LKZ͛OWU[~-9~ . vd[K8+CTmtXl)ֲysDBDD&كB-҄b%pklړhjvcrH#{K;0 I$e`ߒV?')/g}.$H@JrSqƝ$̠+o0QǬG~e"5XSN @scBgyqw_͹gj C jSIzZ>i>Տ??}O,׿a3zEqϾp| e93qr ?{g๏}4$x9%Q.Et*J:h: 幝Ev+4Ғ˜)ss衠&:m]K2%qYnl7)6R$d鹚QF1B>&iL[-F]/:iuH,4唑 bj'4F 7P0L'T Zsp2NVkggň/iKpomn`lk;Z,fC]JAi4%;CCjB$iy.@SpsLD²N7`{SR+WUfTIU=H3fԡӎ[%̥2ws;ny6S7?X]sZ&\m\U9vCǘ8M|P.Yvg-8kDF-2%c|MjQc?#Y)I:tq8|1D.렙69u}b,̀ըwgTyRubTFbǀz5 b/bh E PG%e4%Pdt{L>*H~$Ku.)Ck30:KsPؐE&<֦64Q&OFo{V Ӑq&%&uV4/ӟNÀGHݞ:akN@QIžy6h1En,gڹ #1 ߼%U7<&sU3fg=4Ψ nNM֋W~M? |h_l,f5zո3 S!br9SNhaHNiBu8:s*p :}j3`ź.*X#D!6o4]LQPZLY˲Հn2Y*ݭI*^=iw@M˺ڨQ~%*+OcǙ{A&t v]l={Bכ0IXtA2b4ܤ! DAa3Mo+zvn*TN׼Q #=JU?((X+ngvfM^O&1$%ufw2;6mʂV G UC).R$y᪹IahS#1l9Db2Iyk &tt -ҥ9Y9#RU=G$4.@Gx繩`dj{|8<1XNxae؆EĒ$Å7^M,+5r#O(;gti$"^M|=k3 ̕FyŦyBͧ's]GfV;Hr,]C嗺֪yu:BHU TnF3ERtɲË(WUe5q'69=HLǍ`LגL~ZVҙUa 襗7%l,6_bNFb^IZO BͦmrJkCo?:3SmpCǫWķ!≮ IDAT0,gEbLs#^~ {O^^nx#^i ?!sBU;Y?>)?3Œ:~ 0kQTε GAY}3cA )3X"}Qp/4MTýϮ*8l6O~Q&+6i6:RnUkr#5vq i'<3FkB.Ok*FY-LY3g,  E$KUOvrLHΝ8L\oAz*JAe%,9 1frҿt1W&'/޼ě7S? L|rNC ?>VwA%$ |zmN47V< j7T EQ("ӆP;layihfƒ(1Qۖ"@yH)m ,g0t#Ci`ӟ?ۖ%q$UiyQIT̈03,Pk9vWnW;%gg\J|*5ވHJdZuhJs)h(KnS']"Y>mѕ@r,gkHTbɵIOqc>m5A0--JفT)aAz.-T~z0 %=+e4^tGB<sSfdhgS^\3ѴH N+Rzw]MeG {X (ii.U͜*^c`YspXypJ\pR ُ? ЩTLZvVMo![M]Lu)W~ -mםtGi(Q,8FY qƩljYbեt"d (=CnLjV3,m Dג%Yzn?!:k^>y2uU?IVfxnKy B)˟)3 uEN; {~~5_<FfeA?v@ $]K )->Mi:j&|K> 5Jj٫貖K?Fs-`-QOOhKxp ~xN/?te{?2^3xqԍt*+ ͫs _7׈o39^$\I,ʌ 땷2ܥc J $6`jH3Ծh?TX4~!t:`~j3EYOl//%+{7ehg~VF+ϡI~[(99z.u$o!:g#9+VJ0~TaL* b:EujtO~3pv(iU >a-4 !Ul>Z:QuP:POM{85 N349~uGZFTvm%oIy9~wA WVe #vș(Qqud?I FJSV=gyC[~p媑 ¨idLD49M q r5?kCzJů[Cd|Y$C'#^_"_{Fȁ0WH#A ޴p^G?2E#O_n-~IfwK9(ԧ$KQY-?ڬ INbԿ (cOWA{ 8e#A kWHE;0!cWe4*f?"g#P@kVyRˈ.%sDځȼ?j@|r X27AV}>f>V4?<%,A,H+v[o#Lm(/ )]1Q|߃]0=O*2%*ˢ &C A9S~(f?1C!zl(iHEJy|HEC3L @ TYzx]U=c?!{M[1ߍ鯈>KY{S.GFȧ?q~ϟ#[o#G1MSIQuC+E_! o3T (/;y^Y6̓U|:i }Ԏb[LƨeJ LC}35HO"N($ewOLI,Rl=T9r@:\<>>\WbXr0BCzrp%!,4e}>z97Pe/ ]>sfj3D[OU9]Ý}pKȔPBXK %Mb Dko]2Tҳ@"WXTV ľVa%'@Yo$teޅ_yfa>(6>ɽ&Kߟ"q=t̒jcbR0T4J0eCJ8y?FZz{ru!K G]tȆWyFn4UlmBy½ m֕kN~E#,7 @Cg͂Etk6J_rMT0\d4RR T1̘iG!̇uGFs''Fą`i\dbMwӟ1zUrF:A*uNHdI3m>p;H=!¤/H^EqD @=B>ҧH(lRF!Ag^Kďe姈y|FmY;]92~O˖b1#'CY~f #~:-!j9jCƫ"L]8P堀&b&:&kvhgHW][7s{$ ?Oفx@80' v2FKۜ6ŽyVg42+V2e'"WjE0}I*$9e@Lcu"M(4]ȅ".*} e\jlbK7e0RYc*Sp-"ph PMH Z&q*im?2'~ԛLQ tZ8Ԡ0uQ.<{S!B<'_4Uiv gim@hUmsIlicI7?Zd%N2w>Qz< FJp/a.A5i.!Si~ 8!ׂ|VMg)f:I<Кr=I'`ktsE#M(#_Dj"[533P@]FR93~TIqWI3:8!39]1(7lS5^CWX,F(\z~4xcYUK%5-{00yi<@G=e\YVdXA;[T[2)Zy32`Y]w-CRyyꂀ"ͅxyn΂4-nYͻ[_tgAYԚJ7/6Fw]A詪CSY$K-Hiק= 7W{ n0+,DT.ΨֿM41HY If!+9aTJ5u԰R{GFQ`2t ˶Kn8iBK }/v;Kb6Qs {GJ{ha%}{m>}<±t7N:4/]߄Z@v\䵌\'v L<2P}j/׋ 핯#${A)Ư>ݡ$ }WpĿ}^ngb@N-nMz!Y.pjA{WxC[tD,edޅhhBfNFg<> hlOS#Jja ֘?W԰l*4;2ZS3-G}eF``nAee?;wSmؐ8&(@j5{TAгT8{HXɧ13.O[̕*秞u>cu|ķ>Bni \ƂGeiƐr{Oaz$=`6lFr0\"5?{FA‹ 89czj&RD뀏`#{ZRˮO,КȳB˓\wED}F[weNy! 2G馟Vf@z0`3/X7tYk`erqpwpg )\c!N w?#vj=g8?Vl_`@A/?m 8}x%D̙=⿾!^? AA>^oyo:_# K#j9zLMi]|hWm|{zi.C]H]Y,bʅ>.Lm.4y~tԥ2jzQ=v#M_4xV,eB,%*{T|/A3eO˂(fy>\ppedSЅ1l`D#oW>AY&]H!l׽]H|1R+ KB\5і§\W7 ӴF? yUlIϩ/@ɤ:Lj&pVe+/<^jSF; 1"!5Z$)]B&K1guA]$9 ]O]:tJyz/ `fRH,uvfvNtZ2FEvNapނzo{ e;_grlJokkEtyy^ی[;"gķwėo5_3~)#^UZ -_"[įBw??]_E_n@GPPX \y 9Ʃj:D0B,Ƴ?kDdwrdIJe% RR|$POf#jK͞uHJJJ-O:# VjN2} |,>7c 3,"I󣰮pwT(n2P?ʻrԕvCY' HINԷ0cWm[ ny$7oVAZ[ oT`hK]NST35QGu}&veϑsCʿ{5V抾5["c2=:k55:| ݟA syP QyQ k 8wl}Me?*R%j6&9kͲ`镋wJ6@}ŁY4ɔ!jƁOt٨P YPro魴 HŁFf-i,J?-2 rAԸz/$W 3Xa4eՆ)s}A#:Lj]F\3bst/-b~xs?">}B  ˷o36" 'T {5n2Pk)>&6p&]Zcb;St;KZ020WF+ b6pKUe Tl;`0a6U/`/'[|Pld}5J/[Ev Z51 PA% qHYd!a }o̶?lV,(mV]>Zׇ.UBmyo__"爿ew?\kx=xx%/>GGħ?F|~p@f>6F_O9! 1b</ tnU &7v8r9PK@O XȰ=I؞{hEd>0@'/;m/^Zl.dd9e"%υ;*]X0O2AA?+>܉kݽ~0 \*C>PXw[,;<3`|F2hǛ(ƺպj%:(+UwJhLLۍ[@odLAA-@= 'r6 jJFጢ#Td\$MZ*5P͂Îk @Z;Hć%V=!T}4Wȣ]0.fiܯ0 i&[_$4'7V6ˇS-J2#'#J`({O-f/΁4MSC|׸'K%sg^Ch#-TӼ[uiKtp ,bBeeZV+uZTbm;W<(@,CgajSdȌ^"^Wa}˅scYG;Ō+K 5=㯿"~xyY[o"~5⏯o߮L9/ƟUPMt'|W E_T^I2L ذE<Β#Ie bh-'}>MaHg{ߵs]̈́%G1~ P~R!PyR:,MJa*0LWFg!ՌT8UP ;}7[["6PC.ςuq{pD\G|<Xg&ٱ(ՠ.lk 1T6B~sӦEt,V`=KLA)+-V0Gkf90GOwB/i%x9ε{ xpe߶]+%aK/FgO1d_V=Ypa&sXeXj[ -+[ۧ*ԇ#<!vhj>WЕʴ<13o=D?W S\?5.(ZPυۭġBp  ׼ݗ׏9OԒ*H|z x/;?HȢ1oobՂaߌ9uX*"y~Y 5QCR$Am'= ]*CuVIgr>dIݗ,J;뗜 Yb 5[VKfAP")[.i: iQ=}g`FܤT;TzAA~yֳڨ&\<%Cxm"5VC3lbhŋ \T⣇ S bW}^f+jv>->Ljkglla>!|+s hE=_Gkww`FuIvg?a9c[ 8!SR]OiK (v%R)~wh:>Xcfu#u*W;:f,=P<Pg|uOy![Yt,kwU^ҁ^0gϊQBسJ@mG-JENGtPADwmtrK#Nm['Uɳ3#a:e}zfL\!cÙwu.K1lMI{2UQeT9ih+Uj3X6NWէ{v*덮 ~G%󴖍cɌxY8g(рhڶdjy3?Oўm)ퟙdl,ډx_MyACvaW JP^7Ji-bÙxwY:ZdOQǦ$>]r'+1-QZFv%нi Mj3PO(%eKSV0,PVCf GHK~Lᥝ$({&. ǍP(V!%[.(v6/!VlVSVuiȧx5 凴 'qqUң,uMx6~w2 VM=`P³xN^[!;>9w`_9 b$m@ka(_i'dy{ j@4hxhcQ<,q*u8`I y[5 `5RuP$ڶX\UKxouϓqYH2"&F39' -d?#{cê7K!XĶ$3 i81Jz*ofTlvv<٠ .A;-*9?OZ8Xn6f>H]yPsz-%B2iM 30 +f {oD &kBPeD=b5Nlh邕#OK$5JaYcdt/5 }ּA@XDUqz1Bt>i|Hr\r$>W5P4ٰ>ݓ0( >Kvm-0LI=S7lD^$)~1@gaa4od9GPǦ90ĆQZu]fy A٩]p(υk$ux苩t0&扫HnlⲠ*ұdύ<9"`$3xeQ2/d`CG3S{x SJHx˄䩔EQ=zg*gߪ\sªú}F\3rK\{8(H@3(E/O5<1 b|`Bـκ%nC$Tг]+,f-RfhJ.{zdu~#%'jj=ny)ub'hf*Kե dr/ 2{- 6?lwS}(eh}Ci(g HWU S3HY]4tg0 -|Q6>XGyaZ/ޕO06kj -2:= ({B]a3,#Fg',0:*'~{U6hR"\(6y\GUT5kйu)F/ Uɿ +, En6֜ElH%1zH@:U7"3^sd v)Kh˵?QQfa$kWIvF>EJN)rdlc&)J߭{/H>1Qc˟=`Q֫6$D;aZ/>h],⏠<5zWmNxγ7d%LH{gB!P8ؿ2mhKť陳$RtS\A6hqZ{S~p^pҧHIG23V:Lc`VvHLl,Z(2Xqzgih]]\>Jx꺷eGl0.uOِ밺Uq%_1uIO~*q6KOQR 7zqɔaE-v|w<%][/ BA]|(;c|\[rT,J!5EP|Y$dEj(fB%I4sKbӿ˶4/[gJ(r\*J=%yK-ς|aD5=, p G&GX\Q_S9]ՀO$hf9i?d;3;[ EzpW.{YAՂF/;w*m0cW?)3S)YBj_Cs V.} ]P 0@uN%^lp5dV d>͒͞J^>}˘@#*IZ˗ N^lda-P1a^̛trŧ=aW=[n.`3ЭYeYQ.}zA%~_Z21YeҜ$)/L /۠Wf4fgP/5NnمdIc+?֡V(y|>nkymv΁2T}F kw;#)b 3 CH5#'峊 bnB2G5UAEqJkI LI/퍵cB8iiך AGU;VfC o~u=LcQ`Als*uU͜-UJ?33U2֮@M)&D ]MgGHB=LYrs:F lSEE vlAs(h QVej9/ wZM̵ghW $6)dVm1gv-H}cH5 WMcqVDza|#EҴ9UsűP܁IdO}w`0,|<ŒZlQ pCPM{oXtB66Yç= xݾEJ& %T?`R: ]L' s+ RF"de¥o7Ȱ?t3$X"uHwJG jȏv'L;nN!K8'اx@A*y~[HN EqI;z5ދ=4[&!ˈl9XSZ*I@Un-f|]cMTmwNA$ viASfAR@ޮeȢt`EaiI.$0lH ^ -Eu}eE-v薩vV*I䍆~!&ax F bn ĞLU\=XQUk-)hkƈ} hǂ/dYpjYYWZg&6cW0eLMxLOG_™8c-KvF$4yIBXju86ViNS'| BX]m 65 Ww* O-ߓouxvZXNgGE ilm٪D6L+¢6"MF DUы'ӟ.+:$߇硄F)h]&F#T՞䟹J5+KkkCi=ELsq"#g!C"<.]wWix-3񠼧y]_^8 (CFR6U!bNGSc+ޝg@y'E7RRǣvbϮt+EiKX%9cbqIKqLtT 25\ل bD B%N"T.YGY4ф rZ&l}wt>cPN)@YSi(A -U(T"Tň!:UϟӃ6AVde┬,o,*(fV6Mq':#e_@*hѓ\ 3l;#e^Y(ˌ̅Iz~ 1+?X [@CJށ@R7 R֬Sy ,sG6!dI >̗A9J£٬|њL8xD8tCg);Ɏ{:j֐~Te̬wxM+TKH.smxn'lŊ/Զ2PE vh &I{ 8GCؼm7cIgoᅆC|wm[>=[ۄYR$M0>$AۮJ[A!gyALmd|ʔU%`ajYW|>scd*T3W25RZUKIVbfKS^#cNINJ{+dɏާă R.^o}|c%lh IDATB(*9pݥ[8R dYjX%m9(~&܉ rl9c:LFMjrU{ǨzR.V& ^q.K K;kQ|^f!em<-c,y t+%}i29t'Rv9P:!Td GGk9R4IsgzsJ],eS|s KNq8sO*Z֚qu}C|~xA A'}3;y5K"")r44Ksч$y믆2-BwdSe A ĸ}Qy]:sh+=[Za8H>MrY*40#Lj1b׈IYy.ERO ?\%DyWI36= TƾaH޽PLVhtFpݕ:ͣwlnH gR,[cxf2X-zu=íJƟ6_Hcma5dgƣe4sǹO^/u# f C*'(kvΫ籰sM^Ɩ,(Jul{'o/g7$x4WZ a )۳$=8A4OЕ!ʌW$Z[EҒ*U֮_ `-%l9=Inƫ;Ua72|ꕆp0ge}v#g(!fYL I +R[$ (e #ޑ.bOќ2p=%5R4w <Z|d-̔3v[mDsw4ƗkHF YUIdOH sRkAJ7R1$)YpJ"L_kP\k02E“f5K("  NsQ!?fo_sϙ0%HWU/(Go\㯠|Kw=@/Җ`jK#}ٔet/$ -|#TD h^Hp0͎ï}AEwuXp=r͈]3S|#;ܝU*tBy!\%05J1UQ,, =lak&< 5 hʻ 3u):%KU#H5o9H⧚1Q#yhP}g ֫5[;oilxC|)TYc=j#7R1!,+<\g$Vf[ O-xP1@a\rE:WVa6cL9}w_nZx^U?d*UK7SyI%H0D7"b+JԄ_ݫ:mޭ3c"r#oJ}b^r]߅3%F;U6Tei@MMMn4<% e:< ydA h.y+ƮԃfkÞm0>?eY_d+ʛzxgtēN!e]宍2v&M7sw2L$r+3ی#+LA3̱F3]a}{KJ}ʀ974a)R*7On -[3T~OZZ\ֻϥhR|e^9oX/9 pnߺ;6*@o$3#gy9{NZ Vdz$o y<,r` }R¶YD l5Wޤj&˥wrQݼf HlYԤa55%>p@AV3[*6Wg;r3\ޓ T >R#T(pv>TnPzX.Ѓn0>Ug%`V69J5}j-Yj~5+MR}`8#O Oci=?0 *WX*Qؽ3ϞBDXkPKg-K-ݑfaƏ{BQs1m""{JlU߀רRtX{|'^$=Jo*]}rQ*}+Z|T؜ppW wjv>@\nbI2]m?g"?RKb]Im3ՄE@>zqq^wWY뗗v>onyۋ~IʼF{w ic%h./~c= ^ɼƁ3j\t ZvMZ}U%4MH]lϹ$6$o"DvbBRd7N k'|$6Ւ&wީ m@̼+ W޻ô2Ld ~I ]PRGzC{s~=_ X"r)Œ̒hvX֔皌B Fk@;L>" s+Ҷ UG- FYir^c3Ό:漬 6K/\=ΘY&Tp-X`J;aaMb,΄quYAϵi;a{&+jQOL|0ܯp ꬗ ,?# 1 `.4sɂܖjlda>8#OuD3p_@$`|&QUܗT8}nyj;~98sHǠ`2"n $QgǒJ "ya$\5nr\lr-Ba| Fe HdѲeY6C-Ɲ=yV]&K1㖗-K*D/Y\%>q`s|C'LxF2qk,P[06j 3DLXf6O?+,"?{gՕ'M$BWY`nUTVIom.>'U 㤖y/ @o,I;V4HZ "?ul鼰<@̼%sQ/bT2Sqhz.=ˌl- 9OJ|>ă-Ap;H ZI,N 2bS AGZu]E9]̐lSK}\qg )*B>0%zw\ΩA /gSB< ayƟL*A*,%rqIU-e#&hup [Myۛʡd>gSAJk@UXHvfמZéMŃz?9&Оi ݣ`Ѿ(ĻG|ylmh_I?L@ x =x3ywD/5Aڐ(l D̑ I@{QqyLZ"LN6cDk\~?L"LAfy͵\pe!%ajsUoBŦ\J_K-TI@̤}*S PpLX.0+6o̐%S>^.%9e]]{.׃{<|{`evʔ4@Β`:irI*]rBFVW}Pd)ɳrmj'Pp:M*}=.ڼ|9Ʈa[Tg)?RY lfE HuFK_Kठ) YaC,qGY鬺[ 鈋e8yh@LkX@2()?w< 2  BVXr Ӏ&CCmB6 0eo.yEJIu9>yDtnp/[9GvH/J+Ȩ`¶/Dwٜ'9)dέX!;\Sa f8lYYvzȇY<&ݗt8;:m13B^cYaKsmNjښc*蹘$NU)(@fF9u7Qt+lIZ#FWw^8˭%9#g؝h>^sj3Rwsr]ʝU>Lgqz 60hfwnE,< = q>HY=w}Ryq("Z{ ,tL-9N*4J]]u#h]E6u< fioOgNEELM6.F-QMJ['DTyϘBhw:[bܫu1I9`<ж RZ_ ^ҋ5))x7TémSYz%|<78իڴb؄f]%[H0I~~r4n-\mbg1jJpn& dhb",}CAwJyx д*RyU)//IGSqdv$IM]3?}5kMw#.p\@cG-d%Y}r)<ڽ f*N v?_ |dT 79j$,k 3p!˰`eŞgp҇h,K Cupnɭ>Bet'w :5YZ0&0A @Xj DNj2BK5j&ϓ(~Fp4Xp]=Z^_FJfA)7d թЅ!uDy Uh!U U5Ie'JIy?q|dGVjX'ODhm;=F_b808`*arB%*WP%( 2x Ò__`!d$=M[ZgX>.<гe cIS<%F (,vQvt Zp _8*ӋV=!p 0+˽ %x׹ş!)J/Lھ~^~c3lK3[G.yrwpP`{wPAC EjF3y#<˲MeVp#li 'RZ!hBÔUi[&Ygqrѽ蔌<<  P9 p' z/}#AY.a,LlsKKU} mEWHC;asw4l+ 9mz.rI)4,ŷwo|%?a}x GU]k1__~xm|,͜ɁԬGP-!"̂M+Q]۞d"v?,찝;Ng T8iWGB7|cK;itCPiq`Pa+?2MfiC%-93$"Ved1J.0~u7ABѫL@4_z ̲uNS:]4&eI#\ Όj]u}IG1BNɯ: VM4S0V It3SUH{$%5iJ"q!wn&@M֘걼G?xI6ͩ|?\)}7@=6]Fu2╡;·D#)jcl 3xSOxy~B]YX;s%Q=Nuo2~-o!v['QY SqDf>RU(`DGd߿4]ƺ&2+xB[x[ K,g$1p _/Xu.a,c/XILKZN`vњy9/-Zx[OORW7JX!ȜN1ێ6G|&ׄS'K:=/jn+^AzIH3fĩsRAFʁYw6f\֭=ЌFBD4uղxf iz|o37_">uX'#o+P%f媲\dї?"ψ#()QBOm.vZ4kcȪa?&$`5+N&4Kbj*`w6*Ȭ|6H񬻿|/zưJP<9WM4,dk ?9k`g+^9cr!wH;i(XXwR)j;dNAY+픥T?85;U IDz=7ħ_nj40 Aʕ%xi x_ k%j_@ϔ5TYl$Q+f Z]/%2Ee,9TNqG ]n >>䩕 PjvqbO?Jh!{յN PcN:8}:)B* ܇u2 D<504uCXLH< fKe69f08tAq%%ie3fo+XAuA+g'y(Cb11:,{EASOsvXh\~m܌4O|.&)}EvÓd{,fT >*',sƺ&" 9#φIsD@9K9I6;X6{5fzf&niK3Ӆ|:&2se)<e٥}(L5nEzb3#w[5D4g+Wš %a׾W׼brxK.c- *g+yHbIْxm vZ7 ^Āz#GotCxTaβpv$O14e)j*g Zc= LJ̠(a"UbOd';ϙ @cTMO±n\NOZ"G6n!Z(V!@y緈O_?e9pW&uɫăg1k J#k>τe?rR5: /,R+X.jVnnYq,5z$}fHs,I Y܉Q+ŒjRWy#IIϵ%p]kqZa:Z:A|@4?[ CKn:'nvx)HWOM?b\f b>g|ġbdv4#!-RcI4+,Ӭ!fF"~K:cҗe!kvC Eܑ;Zҷ+L`h\`GR :;g!Ö́-6:娅Ff{/*Ŗϝ. rː߹>4x&S h%SL\:~ oYC94 9ˣ,#ۮa$NIwECl:'qXJCʓq0J`%Cl~҂˄{C(nNiX,V ФJ dkD!v}I7գV]5(ۋU ի`UɩeKBj;5*%DZl&vo`02|黓 <<|+Ux򸞛qq̥^8vQ78=V7Y=I8i @䟳;Q s"T5c ȉ<8bgjו~`[j݂iz(~fP I2e,ixM5K1¬xG_{U=TVfh_[AF`"==G|~o!~9njM*ЊѪ6(rG_" ~[09K&3P5j2OYBCÓU+^zaWC9ӻ/ 捷{I*+ WEKR:) $9v;4wPY9$.KuIsLbU?jH֯Z@VX|'דJ:跏-*Bl N l+,N*)| sJOh߻1U~>xk;a0 0i'y% z߄ıܝ}gV-LlPO6Σp"ZȒ efW5i0ajY^ϦzgV"2"5<R8 x9UZ%ʴhNN8$hoAIKoT%%Üp&^.8G});.QĘ A=N50NAlǬ4І}2d)6<r0:8YM* B!y p @|&WQ] ($?[~ UƥZ*Y[K4EĻxTp+LlYh>lޙHen4bع@ YjGʐ! ݝӞhMuĈi1 N9mMnȢvͨM+\WhOuR`Y<"CÉy O|ft =?|\JI]Yd7RecAs|ЧdV[/q6f R?m)qEpTQ!LriA G뾾g_"^?q.A){&I,9PȬ iΒK]! TUfs7{ybH=}z4jP гg>lͿH<w]ְ p35p_<YȫՂ<'x"4ɓ#Vw'Kм|uk<WC&3GaSf<]TˬXZdx۾;M&SO'Hm43CA?\\7F@ L5 C} x(NSAgk79MP"i((ey voM9SkAct~xHVN8`q|I'3&tTh`jasYu\H#`u>Y3!Փ'2˰4ǹ׏ހ%&f=z%oG;sq`&` -.vV;=rRʘOh0&KG5Z#Sx_\lZ-ú j_lLK Y֚Y CfhfefQJ#=l2k@ e}kιNf$l LUUd cKupVhzLVsCTd[ %{#? h}%"tx.̮\==2( ud ѮoF {Di2 f˥C${UB'´5tAIg^*ViYi#ҤƟQ="{(4JJߨŒUp~셂d?}cU`sH($ XC;1|ܵ2ڃ3N HzH ~{~~'.J0U`0C<~[2VlmZ[*,k2SwuWG \# t<0ycVL*nTuj Uʼnn %62HǁRE)K/ᨯC43<0~{G~^cP4 4|{қpD!:J4̂|I.o„i@MH@m.+k '3@(+ca\#L5IV}a&b5eFS7s\y' +ڴSgu4ߛu |)mbs%4]nab~P7x):\᝛J&*D/ ™+:P1 <}6OϮ]1 `f'Id61:Qp i1^1VkJr&$ Bò3cZ(C4=GPڵT5Esʷ.>wCWo&h0+Zh>$qC*h~1_5a i q1N2ykqtuZd2IVmΔ;;~RA{ Tߦ]ē`&nr iE۰EoѤ&I0Y_{fYEddj7FYƈv*Ve@TKV?4Tgfm]gr(?StVXf ۃ-v#zZ:zC:Ny\r̦> w` U?Lrj,asw/^$: ܷ4N8]{$ɘAg^Lܶik Q-G~{%Ͽ;q`n~N2N=Q'CRz:hM#nv-A|V|}ծ,Դ2ٍ]D0d,3j\@ %3Gk+*c.! MšT4Sy*kVfXO3:br5eD{\h_{3͛&ZrbwcQx#8X'3"ٌW8ݑX5c&T!żH :=x3"p9#u ,&H9-g1VN:e51\n3tC2`6qN7 #93t%`qO|#׾""l8-5; `$4IuhGO8@57ce&&ͦGt\F3o{l]8qM ,+JKEO:h0K4C|gO8C3ItH?oSHPmwjb.eɄed0L\zҍ]+j~5F#Ҳ3<{*Mi @KK"?%6aB u~~k p .zF䚸DNF)PLlgaqM1Xyhl4w3= o _/Dq;W6oAt=43d/94t?|NQQ K&Ca7;\:hM*i  d09{צfx0]z;I i<B,ǚ:?? @ Vx5$8v.%sČ!X&^|.6?Ɣb`)&F۫7i%W\#F,bw2/SV#~9ݏsz?7VA%I删$>_DEnaĮDlSMD[wg%~3uuW39dX-2>'V#' %0S ֒%LJҗ16:MQvN` +ҦNpX]PlVG4MQJj)2؉{F=4wK&iRoFDT#c4?(*l7Ip1tl3Aed0RY3H Z<p x~M;h+jjLY3{ 4q6@]vx(uh,@͡4Cu!%Zx(0{]`X.2[S)?M4 `0_H܂r$KSotuX78ĝ~&h)k`f}]?^<a'Q ~Ta0NW 8.pDP@aJ QԻhc v3'V٤5g¹ȸg%NFT5&"4 q1xT쪞PrΧ Fbތ X<\)l TMJJO=FssV #R&88踺:Mܿ O_˽B}$f$6}m戠P0CS=!k~+?*VΟ6݌DN$LTgW=1vBZ j ɂ3m7Od.CaX.˙E $fݯN.iP 6|:aىX 9Zހ7 IDAT7qdMu. پ^?U>30۬b.7QNIMa)QHN4Y7E.*$RuPreoqǛc A$K߱ .2w}qdL&9e;z9֑M7B)p=hb$(tlx+DDs9z])8;(8΀B&pKc24.'«:f\맑?q2g[Rcȃ֤0N4IY$x9Y:C㗼ّLǨ2@ǐ dC5~-hA3$=ӛrFqvc `., ׂ_5>(Ph1OZUearhƱeX&Dр-COtΙn)rNqO"',@s ,dh  hlbhz?w@׾'%g{Ud&(4u սeBp2DŜnn|NK1*}@X6q1vQ<ٵ}{ɔ0щiR)ކ[f5yXrP2[%p?hK5'fqK\ئ.r(.|FYe #ΓǁYFdZ"R8mDd#@CN"wrR]$eΙhVW(X~q NGݳuM# h=37颏`aؾVܿf&承Sm:[U*;8 a_Dncl[tw:]6t$v/4d}(3ϬbM {5N~ #w#0$7UWaИZdV2 fJLs4(q90t ,Br&ɒm\j9w|,슛!U`fO"0aU1Cr4~L ^H>.P+]:ޠYBIc*Za=1|Y \V t>݀`+V/o/ח᭖ ,c)|%0}İNg^&;9deP煸~n {2E S lt}A,W V} ױA*'(~Ȗ\ՠ;l;gQmoi5v/afMn6պҾOI&hWf c46-S\E 0W隋o#ZcZ"J!Sr&2Q zXs8M݌mJ,>nJc#N,͡8iWp,ݰ:7%P;NNW/9aUクLfl}0Hy`)?24HSY`}d:Hy+UO bĨ,=y!#>֗}`T`OhEݑ@:9]q"o҉l[8 4ܢfaНJy`-Acz !|)PUO(bt^LB]ZZ?h~0ULZ WihAIi7 lZ|dWv. XT 2h;14!|Mxf'ň5t;غkVgTFohNl}X 'eMS36(txߦuL()çS.eb)hSemb2g!Q]Fd MR PfA?Oi,O7ygfXz::rn{m-m BL mUy=KÕr>݄ q) bkY=K!.ES/ __o/u5oD$HugzD@H+Pd6OVnS2 |ǥ?X? XXJ#tX8DV}j-{oM_Mhĸu'- r('J~F>fe/I/z5~[3.Ά==jU. ;MiT@G!qgwj-'f L?VGǍ&>&yFȸ1d(Rc8'&(vhכ[Sr'hdָޮ{c,>bnf65YY<]l4f5?)4APfL9Y {Bq<-T3ٛR!SOdIv3aEq8}8*1@5M^$DA#ˌ87 IN\?{q }-铓=Nygz6g(^AĠ#iRya hh gP̭`:"wݡ^\-?D9bCՈ( ?_Uwu~g1 Vl59Wl dl#Rh>GVg8p;Y,vތRxȆh4._gPdtu`+_M}-^(`g5M@;1cOnɝYgw~79lhoS SE<uLoyZ1,/G`8oǛ SFH`eF܄FQlf"etW#ķ;\I`4d(7 Z:;ks1DS&N ̧2^iy:cD*68v 3CХLMi3/sV3#F4EƲ lǶs Nȶ{& 1BS:mgBL9@%(At?RW9Q?8?k{}@yٖ f·Yhdf1'8`̲$__:w{{\lOdəݺ I- H8$ALux6=m <_ꅥUm#~<^+~{/my #\KNSj0}J!WTzUÖm_pH / x#/v<FN<'H3'y6 hct7*Cc7VqL`쩶ᅿWP=<Ə[nIZr \js̭@VG0q 4"!=ʫ!gҊj 4KQj uN}O3̧ͷ\'& xmlfaid ;r>э!)e$VczByƈ`0rt,RL*&e G:pEdZLdO~'2bPuSg+䩬K Ji$O>+,45O糟n6ӈ½octڳHS NeI J`;Krv#2cJkk^\{`3>Ơq?[*j:3Ty̱lpO_nѿ2bG,i(PmRJӏ?]7tc3Æe |Mqs] Nx"|}6B|ܗⓄcO * 3e aDW+p|FfVǃׂ5&˶0Cx^+kۧ[+&<}x%D5b,77ׯ_!CDqA}1&[0=ddҞwCϯ4f{ZҳFʖ}= _fzt`bжc㣪p햍93$JrvZe30乇0|3$dKStzh0-g g.t_<]qRpЕ@;y6 ѐGWav,XQaL0LW膳DC 1 |Y9KLfDsdE^CvVN?Dݧ0qY% :ӜDZ ׀CI D K:9>O,!V-9"ۦ&Q8(D8VkGWyp+&4sjU7:+("rGiTF', rP}]zɞ80MuFukJ{tm x =l/׳A꙯H,z L<Ŝܝ l~k[c#F<}&kݩ&v{YnF.;_&+pF5,Ig٣b0BBz"CtJ˿_A}{{-p`#׳z݂.%giϩ(iDa ,͐|;4UQ?"ܐюO2(P<h1gFq?;kʗh0Lg]+/o5/82M~> "~_~>;\wbC>mk߈__*lv!ϳ& :@MoڍrQLFdelb3q:#Kbq)@=qӤa= rҴ{qLJx/B;E9"?I7»")6ta hNawƁ.v' 7p3J|+$DQP#5 >|r CJyňU]'`Mc{Qge-!`Is4@o#2!L`Y2cޮ0vl0n~?ݜE}a:rStFɚ;KsPm|TtfעiyP JLC5qQ%m]{W`k5IAN s6Lit2k\iX4V3;'+L)Z# i\f&l/Ɂ 8YFY~9i0䋞)PɄ|;if9p1}06aYyyO`fSR?@2ٽ*H?W|KI&q_ ͠o@lJI5*D]z rҴU;YǤ?BB`he@kE-1.3c=F !N!,\YD/Q_Kәɺ<~~~N|{i{ q@U UaZC1=;p,,M 6VJ ~_W|bamօbMq鐆=Il4 =? 1/? 0.1&;Rcĸ"V@_Yp+A12FJBUH$UVSx(5ل("q֬8D[ N\3*YirFz^GJ,qD\)!5${ϓA}sԗ9 |nd/SYS:0M.ك7)6V3L\4 'cAӀwxm@$jfoũ LɞHtӤ0&n?G1)N7vjhwjM1>%QR׊9*u<5{<}THȢ޺'@0)e@2g)!4E'\LULFOA% wRߕűjNr A${ԵtO#ll5SZ=))XO5GP&ƽP\#'<{2 g6M>39P^v3aOIX$oqOI>#~>ȼ( IDATx֪՝GcQe,\qY, rłS[j5r!\O@. JP(u!XJӯ7{ۀhI<]?7M.¥ͦ;;QҌ~XM*?ڄj # Scx`־< q f@Kr]KH`ЙZ, lp&\wa{ 3i-kia ]BD|Gdfl>TUx?^ҽWzmӺ6LhIMx}ko·7kQdj :=B@箷H|9(]2dp~QT sy4d `p cxX)ZL-m1-9d`^kZjp3)}~Gi47i*aZ KM hɐHdCl,4hQ@P!&|7.'_9cDrSbm] $HfI]:_q|V˖5 ~XnLUas 3SpE-HMq9G)gsB3)}uldOD] s,u 05AҴ8 80*ty>Lgti(vC a„BMAϔgH.`4;hR2](1olO4%;b㑘 NfpZq*{2;!{@Zˌ;%:{gdLc_XaKgsBG"2Ұ&+_f}֐K G^ #$GM$2`u 7CkA^P+.`QTW6ðxsNU rD4cWwGf'ɡ "B\>tj_[>}g&ܖ&Ȃ=HsW pZTxmhVFjr5x;-ۭ8aG?GW4#mkl)?^Р^Mi*ϼNH'#Ug3<̆V26"`ZF0@1_ .53m Y̧&/胤 9W|JFN3{mJr8HrF_iR@#=QytJn(0L~Rt'%c Cl g w1͢ '),O\B~2]o%RQEJ&r8zs:QB %zHl6Dny3P&s1iwBI[CNi; dIuI4ҾلF$z:k$ںQ,$#9S"OQ(TIZжZr̓LC@G&5CƵS2a4d1h}j^㦈8(O9kn>Z^(唥1Ō$xb'4[\h a=:)AN*`:g`tɺ);` 'e\m~be=?aB!!aDg,ӱ%δ^ʠ@tzCY(,X6xnviϣ9kd?W[jb+K֘Uo[lv&7Spp.e>  ,fwavл*~e[, c^^ oq;)yh+tN8+ dYE~@ߘh>SmX=!p[/&*lb`n {$ƳIV9z7假\Iy~Wl@yk뼘j`T4bb&3>ST*V^TacLW$S|;7= p,K[ e$biK0 g'bk _ LVs[Rvj+%cDmvf"^BfS@)6s-WSp$ïlj4r݈;yN)Y;=5clB r |\,pF0hIHIL!S(ϔ5̅'b*f_ <_eYF iމ#wM׹ m7?Q$穮)e>0X.snmd4\xANr0uwF =(W&ޥT rLj "+蚣a8KBO|d,ٷl#qY  JC-Ӎ!Jx@°֥mNXibc2NOA<*BL,X1c}o>KVHSM!)&7SgP-}&>4IW@+厕+4w8fe$ihUʹ^&MG[+p_ۿ׵Ш ^7bۀJ|ϋp[*Vj?FriYpyxal{\3x( 5b긻 {Yˍx|. 5> {{.ܩ䪃VqY=`0sAxT|=:^GZ۾^MԭxH 8'x&3`ahSuh!!d~kcB}G{]ԄGjblc2z!X0 o. R` &swяR5{ݖƾxlftVig(=&YũEX'|FO1 g̈́ FA`(d>υ`Fg2詔u_Gg #2qM~ '!씓<0G!w@LBbșOӂ*҃| fO,&vO5fO`;~7^NۜOqËO' W<4Csc_UM5sqVhD(cħUs5_"V_Wb5aݐ/=xyҪ1$To$$13!ILITL#U@KI%b͓$b%p-m})eנ/ehv}%`A2_=RѲe6s3σ_[\ xa\q+K}Tsntn'Uץýg3 <_ ,Ü` ^(((+\4F!](͢r_{e!;q}{k2!2 +" Q֦WT)?R&C{ {~3aMC0>Kvw?0Ii+}Ӕ5`p>J -A=EIAoBԤ7gɏp10O04X H7rI!bw2|&wl D&xF)!# 48;]&PBdz:uR:^ 6:B) Sk3wcY,_tp^@9i\b;3$#`)-E1%)#<thAvz̲%jr&lhH8a6a!XQ)i#Z狞Ri_Z52cd l %?8 Y崤ɵbf0@}9c`ˏbjԎT49<;wE lM D!^3OwF4L*{Nd R2a|~&[fX'N@"Md].?U::"{pR3<NszBt*KPoL (j~0tR?NugT@ wP@{f=t,\Jk|v jU;Em*P Exyk_3"|_)Po =V‡ /@&؏)bmfg珧ɽ.G|*.~-LB0td(:_Nc)e3|C'?""ڰOw*t?CNԿ6NJ*UsrPCw3>⢆;2D) JaaNN&3A!+yƤ6h-4h!͔f dLs$WwqVNJ2-s,DCdսNY0S-HS (p;xw!/Z'}bn,üdf9y {{O3}֎7k?Iށp5Tҹ #౴۳x~]M =kФ/v< 3 8$1gX\7O򄩹R7淋{_Ё>'[6x|HOAą+ujk?vmeNB~R(EQ֐PU{BRlt~P_~"~zjfrP}}15ʅXV:#8.Xw`]=z'.rU7 ;˲GU"4 >u=Qג7Tm-v)nk݉&lo*nЍc@;(~T涴Ԇ^j(WOFt@ Ħzqkiдp:ult.sTS3hX)^.s G\2{'LaSXz+)7)ZkY>끌MK- &yJ69.A>jSfn(Ywwf} ],xr_Ѧ*f[O ,9F%cqd|mC#0C.Exəgw ΄=>Wf^ 4;$2r5> F=bݢ k af^ `r^./7q+tA`' M# iu׬dq2sw3υ3,5%}jd9BlfmNuhjyFrOLLef}.8'T@YS^[^R4UIb]4캴;`Y{0;Zl];E}O_~Ol[ton"ojqߕLW˝G~/חFf lk3YE,20ׇ<@+j>ùz#ky)k="X .Mrr%͛ڑ>}dc"6*cRp%P{_}^E"?w]&rE,.l 1*mi~ UdC(dZ[txvĬ 郦=>5<We%7ݿΌg}B?^}s|HirӤBǹ& /lc},Gg #uz,Q3f.;36mk@3De $͊lYe9ۨ ){0tTU;IJ3T(-)~DG!h.!f7̦MQz_T,/9h:+,3`?L LxIo&O<)382km!OM3LdsC,HGm1ճɰZ&mE-#dwP벽spXwUYp,|P1=#2spbLf \l2'w i%|iKl3p1o lG@*ég$hE?f' 'ɉ/h8cE|.I)hd;?Ιt"1{>w%Y/y&8CځffzJ>)10`LQܲxggFrbx| QUDSqԝof.'?| MX MyV2co{AIa] \~oJfp6uW\^bJ1'䵽1QP0m>^ p);%jYfJՍFC#G!j{?Gvv-Fxo&ra-Jn;kWNHwFjOW?=O 8uWS7VM@\ ,EO% Lth&`%P*;Q;W-r:%?٦Xvڨ5eize8k>JUށ ±t/vƀf6'Vpty F(*vB/`>2't0)V86[Mc9XN%ێV0(qp409]00qvj1uX /zLZù'^S"Fw5s6z^LԘ7vD uD,qTs\,Ak 8?T4c@N&f?4?vFSccrAshʥp'gqTٟq51L\{ ˜C4}(zK1|okdqhigK7O 3Yxo1@2&rS(z~Qڢ\&k!>_ 3˳˯?g3q`Х3ZE~sd(i'~;YS2.n{܇!xp^tF zx%Z+r ɏ;z^ 2Oz=1գA liȓk5=da#<QM8LW23\݅ɩ׾8G&%a2"wWqfcW:Pç|nV~9]y)sa Py)K_aFHFǰWPݕqP%C\ dDh\ؙar| #ʳSv*0 $tsK(EXF<ܻmO㢭P+N8iS6mmVuJoO¿L C{lM@Q823 Y˳\bS[e~W߿ |<RIs/^vZR-_ՀQ*p+&|4s^bw5'JNr6΍vF8 V yb]oXϲVP#V=&]?y;txg^;qx=E. 69 ]x[8k=d9XB+(k6T`/Nc_/x_nKi*Uu-*LEi Bp77$6YO+֏GK`5?uE9M;o[; Hukֵ_>_'V|&`; I : qO\qy]׶fBəK?1ge@[d,K팰9X ;3=ڢ6uď<0 /Ka|@C`HrP؊I,O΃Ϩ }me+DhW&)RHYS 6Ʉn~aNzC16!G~K۬LO|%G ]׮qưMص~$ 3'r#;HN f:A:t3ҋ>#i٩@4p` Ky$DM Z 0Z];ьqup=})o#S; Ҵ}DDm u\ƵY'N3+yoFF}۩t;`=w cR'E ݙc)͟ΌXHz< o;^0{%8@uY̠B'^W@BS]}FwT,Y8N tr{X9 .` Y`óilEgbipe<3rBYtیԙmRz][Zj5"(&6qFGfv)-|Z~rKsW^7TKKm%˗_+} D(iEYд?ϲOz}| .~#^48]XÉc)U&[Er#>6 5&D7Ek&ԕ9 ޏ'UosgyudzZx-4tk$z?&҃}Zp)X? *KC13 ׾45x:)O3) 6M}WRzwNᙕ?* lIE'r6e0#8&+qGRC`!)["pYipV{sd\cm .J4d6q7r ]~}IUCmiYL~&4)x¥`^=MCB$3JHCsN㦨;а9MFIм骉'ұ8FuFm^SbD!4簬)M(bo)YAA#k|\bg ikc0inbN/#o|9;&4dœ=6q%i;ӈQ0Meۈ>̀8S&C!ߜuRXVEMڰ?Ov`7X38Ɖ@E.*ǫm]7kucTmtֵM^7~e{&֨0F;>07]W~9 kg} =~TG;[;fƨF_F k5<-q_g٧&r,5wG9*Rp+b[kz쟧늵\vf[`u@Ѳ>O_'ᢂ1Z w#44k<ۈUf9bfS U(7T# ŗȒ$[b#HyIRp|WŮi1!C~@'ڽ=UiP?F#ՋD$P$Ų!ux4W>`j9o!'GKkH$3u֊|UGt1H&]R1 #X~>y,qDuqVOףaREIKYeJ:1&\>,:T55 ' নf`*TDo4bl29o2KR FXb "ڲ2#q1e/b#kH??x[mEHy'{;:Ӕ<8tU.B3)"ߚ>7a2oPr qے>8~cȽT+I IVuRy)ć+*ܗT Z>Ll]=Ml*0Ve3tgo٧PI*.!K!W B\ +M$K#13 Ґ:Нn!g\={myuեKBǿ*|}YZja߀ ɶȔ3jy֗jl`ԅUIP;lU,ɡoӊXpDKK |vq~Ԩ Lv٩T?gQ\ȋU7el, h~=N)Nkk=jR,)ӞB+)=hs)^S\t<OmGΙXA +=bwmV.@no`ozaFWtg˗]:J>YZ;_0_@6xP0p3άg]g ^x1z0MږEjY";ҀCN]ɐ3C9ڡQ(-d'|^T璗,93"`X hAgz"'X?β8ė終Z% j ;ѷ$!` Iz~(" v #bs-V>sm b~8.IWC;^5voײm-&gY!\ n B[*˒xE* _Fu*Y}fd=F` ʠi L|\6-3XrY$xZႶS -IL=oOY 턆/AYA^$YsU+7>siXZ~e@o,gFk_U{9gGMR֬v. oa =w2PJ&K L޿fu X3qDPBp.! k :a~öO~1t=)k 5J)B֝9#kșaNqJ眉4IMFEu'SpmP /-\U1|`%<+Sl) K YTW,`ܰGP~ND_rċ6G-3X=`.gf16Z%)ssl]}QRT]Ց]C)Shwp9* mIбo|hqKXh#vmH8TX*'(O[Ajd5*>uZ*7 LJWTMޗg[.x+H |< `N|{ B_Z'2eS[k j"NXA(j'|_P|7 _~xS\3aF綰{PEQڀ^Y$398`%+ӯw g$LUCfޜ1BS_$rc6TYxh9PD*'{"ly] EF՞[)zp_ x-z`ZFtRU$_64J%1BԘR 7O~"8ULBÒdC/:5/.k^ġt!(BP gGe(|b`g<\*1L^#^3,1 Nͺ^Wԫ{mV_|UfZ]kJ?k¼j r)&l۽}ZVd[X;\V? ojυF;q#^X\܌GVߋV!LEӢH\ lsԯ}N-iW2d59cF]p˭9KgIJzر\re5pImiRCbnL?fE#\s ˵j3`尉2ܦQlLBw6% jU,YhZ$R(@)-4Zb@1GmGu9 U IDAT݉I+dJ,dHަVxC@-WeNTCvBL;OPmR=;4ѐ%LAw, ه11=? 1!jkv6 ,= _H='// s^|{S EK"\$pVzp{g޹.R+甂Vd<|`W"e9fP-psۀ'e_># 6HW X^^=xiC$jN'rYa>&0 `O)k||e+wQ ݩ3w#,ۂڿE[ߕ3d??<1eAaQ!Wf :FYj^ tS؟ϵ ģ3wW;\F}𹎌&ގ.gV5 Nn6 Q4T.+y_>x,xg-Xlv#nW̧x)&p5Ѵ<몼+w`ſ]z2qjGCcPV5 H!ōD:4e#^0kusʀ ^v.|ö152r8F!IJS lVLeG35 7QOrrذ[Tqj.b @)P+O GuЕ"\7v!CuF1=|4[c7d<#KDթX{.[=k]n[wPC`'toz'6 n&V^8T<[ᮗܐj7DE) +hIRʖYrIFy1t :b¿/ޗۛ@#_\;ɬ5X)\r贘l ٧S](uHwrq^Q-pҰxAϏKGe!p{.5\,{@d & uꚤҙAR mG @ki\7v#EܦW2t^ ~xk9 Ek?_]~L{@zda(} [5s،ԕ$ omz{/?}#?C1@5W[cTu6>올/ 7 RV |Jן_FYTܘ@rNŃ]/9Py7p559f9 k??'ۗO&PPNXbΆT[W.R9+ޯ?ၿRp|g1[5"n?UyыDr[JK:ˮU+a뿪.vVZ>DF /b'~HW?dFN0eT$eDm-ך{*3kXʸV瞊dg)`'C~V굵 4ȆRJϫYI |:8Ʉz:2k3XjmݢB)/=[LjcA)ƀ&W$%e}imu oYI6dֵ :B\h>gBCzW-oBkG;V Ӕ!p+-q>?f m4`l-H"\yԲ&Ȕn(oI cade{tKw/^S Y+"+u?2c%{O$6+6̦͍=Qhv_sS&2\gLcޯiL/eX K.kEUXe)Z(y9}ݟ/S.!/^G-psYzHNK3>w*0Fw|}y} VXTYVc(c KV3TCĘ >U`4/ QJsDmw dv$.^q)ᯈ H2xoأtHѐB_҉80'UGv[HHyVl6Pp0jxdRJy- E[ ji,tv!u^raHTRR0GS -%LgIRw{,ײ3z^wbۦW!4Gz qchgS<Z+b+)]@0Nήeg1f_IﬖVP\Hv*sMM0wO.$B <*~oWi _ufX9YB(YDC}ڥ7Vڢ>8SK5rн?5 /Na4+_&ObM׈f2 0>5UCfV_ *7?V ? U<rՒQUx#~Zu5΍H OibF%#O)]F@V. Y-.Oha4>uNE)iXٵ;[9aHiwțBb#34?QQrʰ7J%.dJ $alaVxX/){Dgu4-޶\߽e;L{HO)I#1ۊhF~y(dAķ"h5~KT̩{J m 1=1 ؈$eHq !Iփ<9bs9LVYwLuy-MV#!+x3s"%/ (dP4+QrOn-! rco|_G6L&6Y>oŦVfOm4Rͥ$qt2l)e ~+x>[_Xǟ g|#'B}gu@2!^ʬkL֗۶Җ ꇯUgOğ~7V;,1K[#_q*#eȜcUkM qN,% RՠGwM0TChsPbТ!2( -]7_Y|*${ggȪfke0[Nkgxwn("Vg?X)(J+6[^f]X VJN,:u`4w`xywi oWz7Xs_'4ἘWYN1{$+/$ڧˤUs|ꀣ f'rZP"wﲎP=vKV~R2QΨa`n}ހw/O@H" 9*|oWc%f =cKd=lOo>Gg+@{Ul~ΨʍbSNZJD!]MZE@w3eYh)]]9 x2%'&rIS ûW[L=q93"co(V8RH^YR넕<=uֵjΨ/ґU%b8),úU͎`⬯XeiXW5: 2L,̸ؑ0\yr٤6Co;:7@L3p 1<٫ضE~ ɫ:G|ĐBL/|emV^KG;XA+QB d2`CjyQ?kc:dGhug!›qR;U5:omoM-#+Õ3p>UzrJzg{M`^>P rK. ."4kW+3 !߄?|~x#>>۬SC{\ʭaSJLҸ$_͖9jżdlrؤL1"a^vjab !b6Q<=;yiP;ˏ~[sW @-yQG&pg]BUBoDZ엗 | e1d.UE"%JDo,MbVeG0LJ$”D2+ΞV1TuȿCC` xnAkr݁ajc6^`A SQ>]J56?ĥY _ePi5 u1eV[5M:>+uoz Ip=VbFo<% DyoC+'.gғ23W0_lGʔ%ߚ 7L H\G2%# <܄"F9dxq-BBЛQVE dHM9>~1I!{|DX;!*.^2UW yPʑu!D|=}I:YBjQB]s C]7d4V@FT1^rݠaNÙ hYٛVT<#Le,.]zqJ5 \O9OrGSހZLmv66-e[UX)L&YE_N!VnMeh C^2Qc,{|<ՓDݍ^+|Q팳-tcIVj0HHzVPW-NZs;f6U9*g=@]xTM%oCpv)g@D2^r ?p c+=)FvLLⴟ~i(ytzuդ1jR!=kofjWŮ6,xȘ]l7'_38wK>dVI3J,yڒOaӾ J o%oGMן|vW l֬mwTRrfu Sb9KeV1UaVZ.0n o&||U$Z4c^cL؉9V[WUϱJ!v)F{򳚮wڂm0ܘYK9 &:bXca/=˩QqI]9+hzJAlݠZ=_OR35ʻQ߮>DnaR-#E131La.%npRqܫ>s%'ŃuV!q\ pjM8a=VБR6-,ՖW1*u؞[{ Q 砹W a'Dok\g5xŠCUཬU78Eh!,0[LƗ־b Yۘ sS`6jj8~P7 ow஖. { zx^^MWÇ?1Gm#i9+pkJ~ox+}@\3#GAbW~=6bD_֟xf-<kF(fq * zM5["ǿN.==\^=>KpH؅0pu 8A%UYʵs.)-A>U*4h8d!=DrݣҽA:dax2<<k>TjzJN4L~x}|:~zsy/V9wxBvoaPPd*JX_mF[\BzhmEjnWF\|ͼtkRo'ϚGik}cƛq:Ɣ 5[gz7o;P6j~Q vn$ۓ)/ هφX5>ӑbA` qVY c{6^g0ڼ<{꾬OYJxvkz{{WlJ թJG IDATYnj؈wdݬ?k.~9bC^Dv{zGSppЛ{6D`{%=v`-d xXAqӂau̺P8^r{M4AdĊ8"+?Il~[*f2Q[U j*:RZKѫ/^Yr|J޺U /Q>޳[Jj6 =LZ?jK1yXˠP3;!fs _jmJ*K3h2JG ,&۫#dH4/ T1J]WIܫIM"Lma]Z?YCP B4˄dA>(Oy2do˴ *2utt\P0*\# *%`1||cna Q28s]@euA&P$ nAd8&U.ed:fR[*xqkOwrEK7,SwqP|2@l{ ɨ0)nl5f#*Uw=<,UXLzɓLtȨs>׭x 3\OBPЏ*ogͿ$Bj3ϐ8{]N/+FpfYr|{kmE@]b:Te s5^$U Ɛoc b@2_fmnUD²\38qTj.W뢮x7[m.@gf|b&+f`aDtVPC)Iv_ OP$Vl&ZC9T W{>ִGAnMAif}a:ʼ%K6>UZ.6=2iYŠW%,;mHVrMr;~5K-8T{:0DY>=px_.eu|H)7$Sk]R{='Bt'k;Ɣ 4Mͽd('NW1fP̽߭arV#$x>$TcIy9,|mR$>ZmJ=h$ ( )~U[ WR7aDw)al/::79R=K}DV5#.jAl(#7Wx1J2Ї̚g[-!>{1KC\QRJ;S,uD,v R=t. ^c }} tѹ.$ \Vjk[dR{xP >јBvHc1*(Vb#bRG-/-orC5>zE,LL:BrءjN8Wr4Eƅo7 P% L/@-$ X7EvH.x>(@UB!3 ШTZS/xL(+|!H)`J? `۳”`I1as: Ke+LNBaCj.3Nb]ᔰbuOrf<,I/48:c+{/9O7߱68ď8 "Oƌd߻@⤖Y5@>3!O+ [fYLW )} _z ;jz~=JqZLs1ޖMއ4)̫eɀ>"dx3|VxW BnMTG7;GRh]F?}N੅q9Q`XK haM,sme}0c~z~|Rg!3< >ͯGvWzUw!&pgy_m|*YTf-O,9a\S6Uuo5gIi K_OtG%ьl( &$9(ᙓy @cX,p莔-v4$:K Wc2(=pz`dgLnYc2ڿsAgiltavlm U;7g\]wW{_82 CA+O?evLH BҽK k Tcm%HW0)x26߈<֌H7CHVʡLvw̄1['o~~B/Cq6F| հ3T_r"cI4S6A!=<9' OU) [H}ɝ!Z FuWT "RT&ڿ7ƿsu3H1cZχdч[ [\Pd+5A:i zl-$96Ƈ4p9iK\E~'Pav 8h'QYAt1J%jԳ{'5G2Rj܆$!d&=HTS% v:eݐ]]Ew2$K:]{z+l2yjx7%E#RSuh┏ZU] ψjQU\Q\Cco~ kUłw`jOg}%VPYP]D&2Z*k6 a[V7jfVݺ^5[ڬdR& bvI{'8=S,z|ijbmD2CX8Ky c',"7 OVyxNG]@[h}%{oL:KgQ %[Eܦ;D=1- ~T.!Ep8KÈ#~"Zz1dֹ8ރ!^hW{%c~jWU A 0@T{c@h@DJ'TFm"\>Bv oRK ^Iք6Pӗ>]>:?٪Ȗ҂rPvt;z[4YV?(71.?D&dzCϚ5&5Rs0BjDԘ}q+uXδ)8Jā ij]X4s,;/s  Uτ$ y3Vuv8U4EƟ'EDz%߹_,pY+al0gQ*dU%4"P10/tECVqC_TS`jbإy^w?yb|YuB)A#&Ge3*ޯ_89Z_5᪝/!PI y';Z'lFw*v{w>,{ #dҁEPc{DA"MMmrSVR*[ݷ!YbxWмP{H>Y32:UZBdszuu 9Ohzif]80bnn-"Ŵ: ijr׼ʒKT7|1Utl>6R'];U oܪJetU%  LV +«s+ҁIf>kxr_SR(oD hcP4r*VjUbANJ%')UWt0#gk.e`G >c )8H1gn4/Vij,5♚Mv=RDzHR<LR0N,{0_qu¨BLm *Sh-B[#!8ܚr\"eՔ>\W"I$D4ڒ2>XAVՎN W/%K )| sOWD1U ]P.EQ1d)1]JXPPtVļI>AKUa[؎Մ\>%a=Z=Jc@g,K򲌐ˌ28;]S\ixW7w N{P __ 0 cM֍c`\ GM&a; :*w8l&xƐ% ;&jSm$y:ߺwXSΌ>rEB:Kª]~%NG@=[P\|rS\eCCl PCcVFMђ%gh<؛MN{34l q3ZH~xk2)Qg찧`uT=8${vK1{M|ϓ C$dYYOT*#:«g# s,t5TmNeh8a'axcb2:Z&k^Ԫ DPĆ T *!nk!poNU롷\uc{Y V';&wXk hs%-I4Fmd Z ՚M/\"?+)|=Y1PM5.o_ǃdq./Ygշ#yDgk`o7/T=Ȼ&9o24|e.lA6XRsqXlVe>]nkyKџGp3c]r`)uNEBj_3CZb &I̡ۨIpdgX\g»9"25xGp Kր 2İ;BzIrsb2I/vK@e#ĪWͥzZgd>3u.^e՘V0z̙IY$r"Ї@EryFV_gKMs<29Q8 ,N; {4?7&fuU ~{n5dY^P)Ag cd}P$:t=GƬՀ|M!~Ŋ0Ze2 &{hw<.c ld ?Al."b5囨c yN_(??ڼ^rk 19l&ihQmY}?ػ.E/T6;=_UlL#5 +|?\,D^l9}V%,.-i rF)3g(ФޙBmwX||XJlO%X}aUB =ߖ.€O!ik⤵)K޶Z8(.x?Vh,k{( LMblZwUAT:ظfQmZ}.]V δXͺ6#~*gId"ɶqຈ S>PdpaM:y\MߪC~:v\$B}'ۭ"U6,nRGXsӘşuvG*P1%tP6֐hv9ky3fJ'Ji٘gQUBܮ wγVP890fQ'2 VbnΪ] ބ%KSH=sc})#pG +kڟ6rbK5^Jl7ΏOWIKTyd|e lq-htx>`DvOA0EV5q6FNM!)rW@Ն;KSr#4g2'Yskgw$KQ5Nv~b{;˷Z( F$ihafʑ w+ZF z 7aF7ĿWՖoҒ9\WysI㙎&mKCw6 uټk/ pPP 'c6CJ(:?g:vR¾XN/D7,sm!]@;sd q_K'<&quE y8nҊZEV"pkU@U&ht(_B z ϋꌿC)saKR ^9$+ t6|u|^#ƾ<}1d-=}S;g=ûc=n ʫV !B IDATH V$x`eYLA4QLEh=iW6!gd}SAM$3/+沬uK/{ƿU%)Z-RzNYв18F'\;YRm e8PD6`4ܼ=AάcI&udk󽰤ဳAjW/X=TTؠNs!5[cPse ww>;#R#+kLA:}n Fr Ұ@)xdE\/!;E VS9b jfzpya6WQkwW7C}ה~?γs3t̍S`G )q^)MՖtw_U!M.A)kbB~WIO.)0G׫FhNT{2]ϕB P :iU'z8؁6E&ptw p4Rd6Vd(pHl=J:xDx&ex<(Fܲ=Y?v>J`IUolH\Dҕ%`g0=9BNګr6@ȭ'"?MV7?I!+[rYcdCa8]FwIL3'NT fE+n3+߯nUhSӡK2nlf:J`.7ZfPI\2G"3)'KrO NؗS:0]d*f_IJdٿS;Ff '%2 I<}8i,/ O>bȳ̬A5[5c32~/jn9/XLX!wwtsiܞmZ Sy%yWةHlHe%2A>2\OT#'Ϥ0rߕ}Qvx7&;]^9A?ѧjTBFwri}Y;]?v֡hpZl ~zm$$IB|7639mC-*a8++@uN@Y }'ݮed}e[ +rWPO Jgp W2 VLyVZ>O|=O 3Td~\_/>۹UU&1ab̧lW-s J>%#xƁ-7VsMB/1ZI:tT`L!QF=wH-)B+Tq5Xptʂn3+R52]G>7O܁Y]D~Ga9'LKWY͒n<ݧFp5keoq <:p:@\gCn˱D1,D_zk2o^I)$ES P.lP; $cz8^bYTT_ HEhe qKC&3FpG m9C% ,Tپ.Xke!Z/ﺚl& j*V7P2qZm|0Kx<$R֋C#B f۰ w_K/e'ev!*/v;;$rG((+? m>_"ɻ$5}bx Zǖ R\}Y:|| _@oP 20jsggm\];!pϥӔ˞&|PV,YЭײz@=5`/gWIl뫶@!-mk]|KF1gZ/U[4dop!׮Dt>[h %3pS @xh'z箼v?kd`1l<0l9-Y\{^),U_!3^ 5H֝S8pc eo5 Y^] 4t]iG[?"bn~'ody('/ԁ!ꁿ~] Ľv56ye:)\lz-j{|f)Z8=I+_ؽvV 4([l4=hAQ5وPRaj ?D?|]^=/|j5f96k1ƃ}W:akPgRzqk"/}RKm @4]gmm`f3RL֧7VG=B& (&%_\> ɍWűpBc\z~#WQu,B}4vZa&=OoǓĞ:}_}9o /Twq9`_01D zU{/T "#pp LU>6N |aH_`HT z"[_k4U re BM_#{8 s`ցgh>+3Z#'p<@`v޺Js,Y-L $7;1qsP\Jw97oχD#^,ya8Pgՙ'wYRfZ^<SB3wR!rHq||W99/ F .e4jad/aMWo߀;~~7}Cy^΃?JK!ߧbQU 7ru +nWǧZKh#H-i{ᆐGF >v7: |u#mAVRfƚI0ɾ x( "ݙ<*3|1 = ~>{KMf9` : kWo,St3F]zc6 lM{ăGlV0- $"yAWk^I5IwOLɩ$WɖbGld/[7yq.6*&U>?r.|=K_! ߉_?yz>Vrǻ>oG͒ݧlq3 _HuV1D"[؂p譊R"VLVueoUׯ@66jUe$q$ zdUu$g[[DpzefQR$TWfFLM-"H՚;#dOapsqK&}RxPoSq 4&OE&@Ϸl-L 叝WΒ1s^&`).nԹq%@koSnGë2|a8'9Jm1ӻYXӉE/ z'남31-­FUZx-&;5/W/.)ءD]fF'kneV YL?yg n5@O2 buhE'g&K=i*l\պ搓X*- bEK<rq'M<:?n{ɯ2/7kzn#F'f\|E:1-FD~_Z0teХOB x?|T%^! 986۩LY3z&}.1D͉Ãj&:O!˙^O78*bw;8㵷H>Xr>#˪xY͚`ezb}kJ͠~hQn!Bn *ڨ61Ζ36Q\CBU&ӠjcG$AsoK#4F}Wk___o0o8OVlV\KuSQkᬺT7/ۆ[Jxǝ1i"|^)hmmcJ .|auMiE2:t;Qw&eB F +u@.9WV^֨v ut=:g' 2AËHW-/9&ed"2*jf%'Jŭ+̯M' 9HLdSOOe-@s.ZYѡ<]4 \{ğ5(,xdFY%Dd|֐vD.Jݫ 8{xQFvJR!^ދ4mi袤m ;{1:^ce\b~O>}{vx{䄩NAֿ@z烓aT&Σ$&WV5u~k%&Vs%|B[?PH,`&lo]5wRW^ %4" lD:mllCNÉfc@&,5<a;7ca3>8UwrJ-#ai ^1ֹ~Cٗ4FFLqr=%[YR Bcof1PS8ܵa&%hKGjczBM.ߜb%O`m(RE4.o"Lȉ&T J+'lxz-?r wiץ%M=_$ V# {n 23]=\(n!ᖀ$4Z$O]g;C";4nhˆO__3BОH{Nt6?$l|FB7*V ԨtobBF;ik6=?~R^A:&jV<'k&ߴ`2\~GP0`57 g3otvu~}'MjIe1Bi;65{9c?#^ 0'O`jxΣ.xar5K?Ssmqqy h;q6/$Ofl{Nx'xdYRgP >h֪swjb, X&hZ+ =.]?IW?;`BeΕkղ] Z6/i f {_^-"*o?~Bg6_`5~L >}Z"yK!'^ad̀GMi>w&ZR6 HI/XWs2 vt__nBlr$N>u#7JP ?l$3fdhǍO֩'%OU'$\$lEk|#,KrںJ Q8)"\9f1o ٱx󂢧Вs fӂ=o)N#wXI*4E؆=\3=IMO]7?4"\%y(/#;UՍ"J PMϚxgƝae:- 3-_6P.ԋ.3!tTY'1I|89v ͺ51cOUn@f6"3'ʮaŜ^)9 Ll$^)V0ӀL6rHdÕ fph uڙTixBę0/ߚY9OY7]"볧 LS1. gtΦ9l@=D57WjGųo^lƌdbrSA.X, ÇtubOV8 D%hSK-Qi4Z4\Av,{lvO1EW}|Vn'2r7kRڭ}y0X]v`k+< kxvJiO,qAad"gճK̴n)HÍ?A)#>s%6 p< BJ^(_~Vd5Z"'hQ0LMtݘRƮMP.D5,0ݓT2DCZzEkB_6itaN|ԁ-iJ03aSBɫ]?Q vhq}F0a菝Vr}EћN:<=r1ix[Ŏ[T 75^ )J"@tx6|Ab`Q2Ph@J: MbO+.{ ϩpLy{nf˕m8/opOjyϦnq衄{u ؐM"Ts1U_qYϮ˰\p `}ZUOfr\@,LFS>;]I7DbQ/A.2N,Z u43g}?yHKJYX[GRnQd ;9@Lru)~Defr1D3So}@|$(ܶ]&jt=jҦyjoDq OqSw_MC\p}F|S0;*}&t#{ Pљ}MZ"c VJoq<=pK:xw!-:ǿq-}HюknA~kX`L Z, 5qO1ci 0nj!Gmٽv{vli`B$JG& 0D}E]Hc8ƅ3.ؔ?= /g< 'd2~gwNʞ0>_Vɜ<8' '=s4cMg?y>{N ra+ހ;kƟ^/OerIEsP]VH"K*?e[ /95hv>>|ݔ#~$N (Մ40ef0aVa^dgǑK`8'~gwt\b_TA"i] IN+_nVi*ͻ6lj;-LwQ<Όoo -Myeq̯+/|g"xT<1 b4xt/V6I'/0uAV mOHbtkP/0v%Io?R{fVpjk:ǀ'bK7ۛkyYIrL6r ?b(3m``se+^vQU)ZEXB^LCq1g,xLbt",M:N~;i@r;H0 vٖdc\a55 %9ӌY&&Z-N&RXZw,ІBg(\;7?MjF۔A .'؊T]ºyv_KŖ9a=]JoZ4cӘiN _Bp.7rp} 46\I4 -ݟS3hpZ0 ?AȰq8NW7q`s}cu+XUdvV9s]b*HGަ{10䊫̑)E,5[U ZFh:,)T1|`e+[i)6w;T|j jseI=>@N`?YD{7rvE^3m2%ǫИbJXQcnSr (1 Ց65W3?T岦׃A9ik'#L,ʴNFu5hmC_qFۘ4Ro DWZ9隱eYnu|ؓxza}/;DYf^ l(º `1U=Ƅ cnX,Q߁Wؽ$-ss&=@|^(gV 2FIn%V2qԨg1|ہS8UR _]$\@s:C c?SWa5*jSII~l"JX#P˂qJtMW_,>> )g/ɘyO,O3p$vMlDHO,YiP15<)n,̊7]8fׂ߲h2^ զ6cb=LvT%I8jddfZ!hd ~*;ҳ\qÙIvr9&^\O??>Hl,/a=O 1+Ú1:2j{P(%i75N<S amz>%*ͅK3%+4gQW5׃Wn}&[ϭޘ"kA 7ss_DMXP0 b2u]9^3pI5QCG@sje794FShPkڍ†0~&n Y:_gl2pG#-A*,2 49uc2l:vpᅞ2y:hJEJO.ԙ ,ƪMsƑ6}AhP:s7S(fc%kJ47c7-&]˧8Ή!հ2&v mbK)['<#iݝ`JVڛmckFq,>kZ7uy3ڭ^R$y7$҉|e㼒>[+[vը׆:4&?ދ+FU$n͌/"82.dFRz3(Ծgpd(y72x+,=t P`92gd.Vҝ3q/Ii@VՇ:[0fZiMe.`sO8J83N,Vl摘V=oOg_ 2< IfRMosHN櫻._ ùpSK7x`^3L=\_32l}sU8}Q'A?2mO B/i\(-|)b߅*+9U5zf6aaEowGE仚yf~gZ &9!¹22i-<=^c$]]p2`$^\~ϿQY؋D  f=>M?I9WA2P%B7o/d88_\,MsJFAyrյKh=I`#p%*U%R1ܪ`Oq*̑X4Μkm9Mō:$pZoo@;55}'6Zf(diӂ)`IJeWɺfBteD.  &5)84ܽ7EۛIe2&h/]4Lm;LƒkZA̟1Y\tZX"u[0#s9k0 #I2 }O~5JGs26NdqEV[unO L{$^%y/@Hxxli8G="i?P Ֆn+o'{= 6%N/p  v@A">l |.볼4:~ ,MvtьcrsQPiLȭehИD"Yo·b\f.KR6;3;γ=%9y-B:lI1d@~GYB`>wq aY/T )e?? wɿA6CG1n `+p!4}l^GEE [gR ug1^,:|estef[a `߅75|Ϳg8_߉ yyq7V3uW%I fjn]Z$ײRy[Yb?#ym\ӹ5=0. Lኃ9yOG.< {iٓyt~@' ML?"Uc7w3F ۑthJ,@0%ҙi SBg V"^(_R?u$t@E,t'#Cg9oaqɧ"$</2˗h 'sh#7Ӣc9ށ5wsZ,Aa\<]Pf 'xD=_ASxD)X>'*/a3G_{}Jt AU2ya<ۥ0eG}rX~zMQq\9S[53BZhe:w,\.5=ޞssN7gF/N{Ӹ/%+i +?ъo$NT)y#' IDAT""J3Җ\b|,œT+SrF(5WlHxƆgl| {BRg64FQ=i K{얼2LJΎlt`!{&wǽkޅ]xd9BGޏ;7z$?5ШASB{7 @e-hЋT3 O8\1w`R:6A1e|bG`=(U =f68Mj7u?AN5m6̧ۈ>/:٠W0ɣs˦!Q )dhfʮI&} 0q50.eA;&?~(9(8x?}qB{v]q@(< SPD'4{9yH҃ 5(_^gJwdhi\jG"{eW WWG=|(@FSgyq~ gݶ\<')_5j BoY[`ۛ1g\lUy@2d)^Q+: |'g]:/GSjm^0lmIHXVMZKNڌKR0߲J#+9mbrAܛa[PrtCJzmB<#PX<8Eh颺lBlW2j+HiHf9V?6$G_?Zx3ʚB$<0q[/ϵy3G{ncH(W3FIJ@IKM֜O(Gפߨ|BtyY??n_o!cpFbͬ)v(yM(2E¸?} p/ZmO//)?Y$D3J$@> o;qǑITu\c`#Sa {o~0!',7k}-)0N~nS.sar k1,G4=8Wg zԬu8|dT`0I>T XaQƲQO~@ d+\UY3s; ҫģ[J1kL\eL> 1a^v$7+{1[d4s# ּ,[jr1fAtDcnNϱ[VkNi=RqԞP-71wi=>GA0 3ԔUƬ>Ypy>b'+6BԓA 34$ :r!QW 8=\v kvQgS(wYaeFmDnMz^oH`EZpV?T`RIV`~XnHxAJ3wjRBSO[-Yo gidR 9S}0vu'6~<bK$#?e%M:u֤2!4/BcxII٠k#`jϱhKIaa~~KA3|fh;NI<΄B'")xf '? ҈jR:AI!xJ0fFuBB96ORdgD3;g̦ 3O~@^&;qz6/GKk傢! ueP}d WȂd.뻐 u>NA7#Nf{TaR%{&Q|hbOşY03]M[l` |ݟtFHIЬc2ʙ$ 1V%Nnu/iue)4X>=슩?Z9 -қ=M{L\M2UC2VPڈ6܊4(Z+К.e}zn(l.`SFB$X0Jk›fJ, yU7$=a#mE{MTT6)j} US* ~B>Y 'rJZS`be%I ֑+jkvs>ՍĬ+$~|~(+u~?`35 l:U9qfli+o#Q󲟙9Awk}Xϸ,#p?ZfMqވro~&_7GFVY(=#!XSڤbk &F<a cfWSuYGMPLMZb ? 2J :v6`fm/b1 D "!O*'`Rƅݜ?j0젉GBLG-b݀rXf-qm=KbuR{ pSx!8X  r|B?5IrNjvqϺf6/p9F0O-fK\kdl L鸻8Q{]LB$pc,(*Pp2^YZbA!F XvunCoC서"o5f"=Kh6p.tQ"FqKJ /%˳4Բ9taLL}ɢbOI0^}n$UVKje,7g8 F/vZ\b-fl2@dH'1^mmג )j/<<\k\HkkYQ gc$9;Όi+Y8ɲ/rd =zq#p>;01dBFGK*Ga8hqx߁oo/o߉ow%դw~g* p֠)j?&ɄRgFw=6MGӎ%nR/#o &GI-Ski]yظ`%eS3r0Etiz[bNh:} @ݱMa S`N) ;挆-e탯A:Y,6y:Xm+.l=5ljtK6Htӽ6hԫ! yکyMD/=>(CU#n4jUuwgZhaLF4:P^)W%;hM;u]S'E\TLxkj;Mf[8G+'d)D*S[ h0,jk FEDupD!yrkAj\kL[ vB 9rKwXQ2ͥk/@i f# 5(fNr@PEKDd'K00-ҏanΏc%ӀiS1!_/"wI[1Ck6Bkw@$:,,tuFu1̖;7{IAUrj.hc$& <9lf>o^Rfeìk} NhJ)0r\o%B+\R}>UsF#LJF 먄+x}*`/R͹baIF3TL (a7@fߖ\ {Ra~ \|(znsG5 &Ȫ `)+23! /-CvH|)ȇpnu_&9#:oϸKU0%רZdN'Gz@|R/uQGMGx?މG# l|g,OiX>֏Řzs c_#B*=xo?܁k%T&+ u, he1tOso9`5gQΛnKe,y-NYJ,8(X7q@iH[jeHgFx2T 6::m'S*826jPB5$se8M͌\>L} p+ ]j^S‡?1!bL>=A-Q4/bch'D[]܂Vc#8C3曪6( >{,վ4!U ҐfV+J>24+{K^htB'; [K 84Ǹ1~ ~sQYXisKC6(Z SM4ɃT:gT9ZJ r52Pit3=cw }đ`sM'Fp!, ZL0z+,f{Y*K5oKO1\OŪ&=T7՟c>q%C6$>x |{+ۿD{>4i<=Z*{ΌF4z`Xz̦SVF5*Te03{{[F>^!x4ۚzķGy?*Zb PSaL=>bUP*`Hd$|n>tiJIGϓ@x}?A\%Y8޴u3k[ټ. ;q-"3agvS[:o,߷gyk]@l7"m,ƞl3p_w!|~xtt3Xw-dt2h="*`y&Qe'SƵ"u \+[de )+|F.Nef_n"8HYTޣy͕Xw y6]n0samD52d [aBlC %V$;˺: *o|&Ԅ˲O #Z9g ^w[]>Ql-9 &UocCv;#E02A1S8 7@ŖG1~a CVF%&o\#)Lm[{dX"YEď3 yZklC5KƂZK)e i lyW;to/"w1F[α^\tk.gۡɂzqx-ܿغm̹zw0=֡)BXc4^סɏhBm>DMO@ҥBdIN3+D7wt#)01u᝕yVN+4 yAh=Yp%;\(ueR'!C~5fT-iKĜF/9w\ . V[Q:g1hFMi73)s 'f6&|jk R9[Q*b짊L4%!)0($ϛ,!C ^)UJ;^ )Kǻ̄X Eؼ1}c猭6dUf~Fm=ݭ>]w(z ƴy4fhS[lH_87115YE^09 \\L>t}Nn+ ,]g{sӐ=ϋ k(LSe V0edPWMRHoU|2˧pGK$PAgOqg,~7g(MЧuRq7lZ85]Xs"W?o5<'+,2' }EJ-?OĴ4&u 8y?n.3oR .brhPn2Y#ZUSZ&%氚W*6pow?~=0>w3ҝ|;k65 g~2ZWI!(T筤Q@äMs%wlrSt Hܧ{?w6H\guR.%9 &mgm9.{ B\!ôŕE0[)yu"pk]!x=ryYtR c! '60峠SPU㐴^5>K("= OPr ;nfiP,Z+(HGZ<Ix,e^khD#)i IDATe9>8j1-1V?uA;\ k5>ϡ%3.fCzJXXus- A$:lU]q&(B$qؘHɹZڵEl'\ ZӢerFhٚyfNϿ&\ 7=92-鱚@G5NH\Ty&s49I)gki2j#Rjpּ7LQ bvF||UtGBb9o)a{i:4_\rP3X땵Kp-`rvwg,,)w0{vV "1Q3N%'p?czޟH8Q~䌏x}V_7 &,n_hg]:CjTVBG=߁gTeK푚`;`k\Xѯ2yM.˃1W{bQ lȉV% TM(c# E>Y$!L짰g`l M4{ԐQ5O!9If~};N#|Ʌ5"͙xo+u o2pK7q>'~;x#y!D ߬8nfvI[& Z-nn靖䠽,`? RxܐoFBDUlnc+ <~02鉵Q:O8s;,Yb!..w3|]'ՠw(ڔ),T^NxA}k4 ewW|m`6~Z-ѧ;-sDs܋*J%4m+o(/,Hq9-4#d+ULPͲAml*4f ҕy`П*C[C0在N']d}Ingp DŽR_1+hT.}@jJh3&%JǗ1E,4I8LUφptք"fi\Sd#7yA;D M隗C[;NΐJeӤ.!^biTE6L`Ӌ暿KӧͅsgX'tA^^푫YɘO4ym_4S8lD7CCoCvie4C߱ۍ9e1镍C1%;[YB>c¯D'/ӭq}K.:DJ9MQM&E*k%VCث =Zk{Kg^m[4^a̶¾L0  =wU3aQgF b 8-5e'xd3D= 5^fu<- gM"2S'?^LKz!^ "4n>Y,-d|oАRĖZRPX$bϹS Z9'qTAV21z;' npk͞dw(^P JrRJM<ާjjLS(NDi@!IA0gl#r-sT02iO1}MZ=/w`ñ_ QKiPne\eAC.EV}{hchF4VPg lMˡư.dڛHsq=6' :i׏7(-z9 td9Ҹi摛_YN 6Y%έm&/n$WzqH<`w]Hvct52hg2T EE29[0 ̚ 6"$[b". уEl͹9@5Рzp"/'.UYP^\4`:$Bfzt0e[tOHM-Xj[eW*l.Ian8|2``tp-O *a%M,6A`L"\}/;_h%ZU)nPݛ@s@Â0 1O}?-TXg)}D3՞{3OwAT~MX{C%&bMr@~+364`hJwn@@s|em8 ^/O,ya 45Q?NTGv!t+Ԇ]qq6bgֳIwqWr2m!0~ T7Yc|gV8*+"Rk˒HիIH8sY3LsiDfi|:63uaLߍ6|-:΀j}].to x%ς]\B0'Lqz v/(]tF!WG@q dB ,^_l6tʩN=hG.`}p4l|)OZ!s5J֩N鳴> ]3o2 qȑf)de$aK Ig곰tLjү@wT 70bvfO\xLjMѧzo P3Mp<2 LT <߀[V͝L$o ,?]x G. d{ +YVDvO>KaɠoMeÕDҩ>IZ^{RѠ1 c{4l>K}"2 c3ar/.3JFF6[@j1l&rښb7=%GVS`c\1٤AgǻejH׷D+#ô՚ᅡkb4RѬߐg0 pd7^UK| ԥg`Z4a1xh] ( tlP.+P8R_sFº7 UplPy2˕DdE,sߒmZ!V[E~Κ2YYb|4ʼn& =&msg!kFl]-@*C76=fw'M `2QNO3E(fZ5} Fbl 8#v* \l[@q 0+o2 11çB :/M5(VJM4^` !Nc3 s" x ]rH M(D8;eBD]`xHXoϲrvF2 ӤѤdGCICDw <%rYAEa⵴CFJc)}*)єmtܲ ASEm6Ң0iӑh})FF<n Q 6}{-H5%#=KOLdV4gjsUPŽcTYCNk5Ӻ9I'ʴͿTnK [})\pGY?X3qVٟnxJeb]MT~סbv̸%qY V$ĨM9gY:[Ba*#S{G?lerg,nvˣ!"P:}McorhI^bI"rikNEiԿÂ}jQ&Ϧ?5dhn@z\㜺]"cOlCYzk=< A2sX/" #I xE_uZunMz1O/xIj^[9)Fa*#e0湮2&ӰB >eh6ͮB\mrT' ; v,beqT'<1H_Ї¶f2&csC>jRqGq+9gK^>Ceو4m~@$Q`ICCSqh10u'`Pjm[7kh #%dc5V>xoCۻJ( *2yzV24֨ͳ{:Do? wKвYƹe 2{=-;LŁkv*:vbjzT^ʕailS.>~*)Ԓ<$(c TFa5l .w7&l1gb ɦ.XkI]a~X`NƾT8}ӓIe6,/G2_GXFKK-oߜc Slj)F mi |搘D#ŚZyre'3j_ڎdE^ ށ0; ,΃H]bI |'IiƤ}ldMHP!αd<@g hy{IajY<k썼@+fDs8gb=I`abd􆖮Tr[$5{aÑ%6N轑06/Ɔ0iI̮pQhnk!QLmΓ8\ B7gι^s_4:FCo:8՗"t I'nSFSAcdfw֗N9Sd&yJҸJ~Cԅ71dC5p(ip=ŭ<`H#VfCH Q1vZFiv E80hd5# ~H)Ӛ\tCŒ|{@pKWu|1lo;Kq1Ibr 〟 Nx3-OP槺BqzM6){;E3'czQDoG˸pO orDBY~b9ۘ;sSp}zθՂeL3 LeR  EԐX4bn~f# I0#ǀ8I# D@%v7ޮκf"J|ĵC..pdNwt@Tt; p'0k?+%yӍmf2u21Z$4gtIn$s؃~8k YtgxX18↣Il(^&ƮML `x,rV9]y sd`\]@zYhXEpZ0i]C&3ѝo>U1|2IN-25{gA&6=m\a<ةN .f dg&{HZ6X2re#?5z؀r1P`̱X6mԲ!`)"vƚ9koΠżs{y鳘s:5"5I_x/ zfT0 I7FL؉}g3HZdlR}!L6˔?Ja |HE'Tػ~T'),h,UVICn"Eݶ$9,=22 @t7gу~@7zPi&psD˅P@-9t5(v 2lKFLOO XZZ)Z f]QhJc8IY[ָ2<#kiϝf7YDv)zEМ=/!ϋ IH` hrdJ=1s=?':.SylyenVJYܔ2?RW0W֨:|4ƽE $=1/= s[ 9gd+IZU!C2{S+Ub< >e5Z Ϣ.]I5MOR/J8kYTqyA[3E{2Bf~NuN<~0ޚT` c`V8צ iTf32wg U2"/&Sa/*AZͺ̯a^rT utՀ37,P 3l&0τH'5}HƂBk ;SV%YH6Jv1A]N]w.dH1>cٴu*s߿ϔ c4#bYҭz&σ̜7Ж4f2 )MTX珞 ,Po a%{Xb4:+gþg6|Oԣ˳̗Je6g-coP[$#ۚ'I|GCg}`3IٰDiVTǴ=OQg2߶"L kTk;x(52Vszء>0J>%8+o$;at~1rQj- ɀ7=֦i,ǰuRZ}fINZ- Dk^ R]Hm6ƂkA>ޕQ%`VYݳS5e^sk x.K&pt_cm"g8KnPиEPZ,+￲S}eztD%Q ^dl)-pY I{;Oy÷CN*(Y=Ɂ0zaW+܎rodK?/GcU.9sz.Pzh墊W\=V֎E3//.W޶ y}y7A0(sRV e۹6(齦MB k1GҗSntbUw,2E K}VF`bժBh}6g|O@ffu$>h g^‰koFc\P,} IDAT,#'yUʝ-ّψ:nX)cC)4K*mWvYBxիgk`^eVj֗^AJ*9ᕂN0Gֽoi"_w=,S_ccsO)N{Hgum?Tb $\X IfϟɆ?Q3< SbaaH&{/^ M7S_t*ͦN٪vvoAJm Y7T޾H JGW qXAZ]۶`z0qd !CʬpL~xZF19)$YSK?V~Y6@zm+u;6dMOMZZ+j0銁ז{YaZ9fQȚ.$ge^2M[*3c#e> 1 έYm(#icaXqn(0uXs6N S7@K Vg;݀'bWK۶ޛ'S;5ܿ)-kαܤ=K{Ȫ4B^=31HTv2a(w1ak98m0V33$N|= dLY+-hʕsLrOFKߌc4ˬ]MU@*Hn^DjrEL\RUG P92+g . H)WMP8Ϻ3,Tj2N  eİL582QL:|*k Wk7bB89W(qf,Vtn+eDpy, 'vV$sOBUMzUQВbvd rC=]LXZ?C< EU:˜}EƗ%~hq6fٷ= 6C@ ;UlNӪ99O\-Bm^W&s(rf~ѨN՚˵ ߳ܮL"pSτPʸ}3& S~&4 _TN~YԪT0U9"c/`mȏlgUGD0#鉪c^Y*e=y 5sn, TdYu?ǃx>|\s`%2e(*ՐC4z:Qd K8kqHEr} i2~/&_A}<,#.yfGjZp7 SplF bF']С|Itc8Jr1r^U ,Z"l;][icu}NƽCDYSmeV:m8IG[u];_SCȪlPn `~ީ 905Ĝٴn\ y1+pEVb!JzC3C܁kpd-[ȥJ+]pe'!ߋ$ah-㣾Xb.6,lyÝcϢ\cEr+JZ eոgQG)2obp4:O()e)CDNW!5aCV6vC`q ϋvB6572νj|n'ySgBg,ӟc.H&ӵ5#ֺF8vZ4yfxV!)]aa2M9+V"XDR=GA+TE[r 7r7.qEsb"-S,r:`:,Ah}-5!D#.7OY*ت9<Rd<,8]<S&hp*o2e$rMi @˅U% !Nr H xIuluZ`WV5-rf𴈏B6}IbĆ{@e]Jmy'xʃnrClPd)끲LD$ oMW2K&afV(ˎWj JdCɢޭd JIXg}Y* +p=` 2TYv)?iZfSDϭ M5v0{N]mnoJ{Mε Bo9G" xItQdG6_轃rVߍL6{ ,]H8.+g\B!yJXab;]~%d±Q~o Ȫސrfu "JZ:!B-.f}h8Ǿ+R?FšXj] ܗ!@R欐;[_BNhf&8$6ඍDI;Q. y L-sY-{lUUpJNf |;MRh LȠG}'ߓX/ ScAY ʇ.|ew=o7' |JLK@#\h窨sgz kj2\+׊6/^xl\_@(&jRL⽺[~otpCh3g-\HcZf0􊷩63kbۅ^HX.:4pA[CA[ual8xͰ &p@ahk Ҿȅq h"*)29vPv7^f$ #46"%8lF`Dž/ .hX%Orr+ ˎJ~` y=s yiA?fT6x7k@hLPLUz5ǥ<1v1a?Cp}|`\bwEo̓^%D}wTXPrSzfȫd{: Gq[.V25b%qxLV:qn# Kjv8Nܶ"Ҹ>l;op_R?Ǚz%"5>ȇ &@[8F#h@Ĝgƙھ3iW!$3a861 6'X7 'aTA8QϤ$p==3#-tQJ>C@J-ZO^(QQLZH yxl77{M`B6: f'9SF6:aJn7Ot!/(o*/<]fT&.vE]˛S)i&Ҭ>L6 \dI"Qz?oxB_GĖ3$"'؈|ֳKRfpJh/A-ngGmaCP(2gQ+s[Y϶mpS'r '| ;Mzh])_f!W<.aX2Nygv+[+>B/TZywg{/*0v%$9ŏb\<ׂ/^ۥ9S|V"hC\Wj]^_KL-mҷ<bcX-D6&M{u~̷߻TЍ$|!CYZMﻻlh 4KX &X2jK%s\M]* c, AμI|/*G5^6ۭV>g:cz`'K̃Ȑ}TU?ims4 xɶ"J(]qV{,;-e8N˙g; 7ONIW["!f/,A$F8My(rސs$.X%y܀{eܠ ^drayt?9dA%f\y xvzjYC 3[ bRPi{_r`b%W^xV30dEL1(ے4 0E{rf0y%O4Pc/r%  Te !yk`eNq`&dq|JkV` }UY2^Pޘ3 Z 0B4}{n<ϟ7!|70ߑ<ҟ!_$ @7A| hKRa'y$LP{8Yi,<ٲ)P<ƸIYuƉ|"XHT.^SY;EeU\aV ]0S8 &?sǕy1 /?ɂe¢.đY:bغ(Y^/ ˈ\uͫ?h26L? 66ǰBM ]?V*`H§{uuºs?ygID4x\5znE]lT>;(D3?+8Y/hYKy*UV_p0*G/X%IAx["vF|SH&(\IaS: 6 gkgjlU/f9hck8SԒGX2yI|0E,[;A2 Gs dDhBXVn=@5NL(>l\0CI^AKj4M /"=sNrN]L @b̭(i~xZ4IvOviEύ=(Z)i Z5Y/P37-lieH[}]X,諾5jZ gvղ=6$\׃,J!{L9efXVgO>D4׳8jْ5[Z0p{?v5Ed\!ɥ -pWZ&̈́%X?r;n!CO kB–E S(By5TնqV+@>BcVA8py8:~$2ΓQ4{VZ<2NCwwaZ^E[5j~}vER"xV = i'p9Xjޏ> ГgdikO<9ej$NL}lp&)&(Fb pZ?gփΈҥRYU(!fvzoV eǪ*on ς0w]VQϼnZJqB-]iW"&2N\b,ɘ&bzU'W ٷK+1ͨQ :ZwƮ.2žRf4/SK}[ IPr68)l8\,y MĖ;-λ&=..ݚcf\H1Jg0)zHiC'*"$#ZëކlyZ( fh_$+Gj0e0x,Dl[Y4ba9OuEI]@ KesY[0O٭规=m*.:3&w#*wk!U k )uP$U>0 8m9%85Ni 0]u*ߣg.7GMmy+xx+ӿ+,m1I]A 2]x}rY H_m'>OBVi,"A\1UZzqFՃOQZ#G &T2Ύĵw"n'0>2"֖fC^K^1ùdsX> %bR pX\fPG:1a_V`$)IPmϝ5I5 ò=^?=,Hە'LKmU{ZekeiBŃޔ 0NYSSpq>*d(*ed5.XD3H^ꪀ3';p ) f!oU@O>N|{|n_?3xbd?rfF٠KcjmϝKPHQڜ@>s6&ܘ +87@IEyЀGֻe#g"TlϧJfXrwN"2m~ `Fݖx'p\Rܑ aufKz_p ?T\ W q\<lbIoXPA*UV ̢V1ȵ u 1ܕNqȾhMqC`@'^לgINu.7KYmx8Q{(zi΄٠p9gLx_q/BVF103綦2u&u3qXqi.}*MmIpՒr'X 9|gԣPԆT~B1UAX!5(2\BUoEea*_6ꌹ I2֘$"vVJ$"<|q;?Ė>.,:hpJhm-0%f@>2ȳ1~;;79T#OzZ /mO$><~/0H)©p4 7@e Jmaf|aOv94W ^ Mzh/r]䘘E֭IX{ZzT/;!x-J? } zI'M$"ڟL k>aNעIgVgŸ N{+Y4w\ZHLS>5u*4\ҠN UL%H!nq*(\a\C z5!#~?(rَ1a'/+3U\{ M7؟ 4 |,{*N{G*Z.Rid¬."oK| St4 SI2/t}2B"Ae'RfO!/X$wsii`"ReUgD7}\)مꤴ`Ke21~Hl~=<($ b _[NSGm؄*#Ԣzܫ"h#߅m{<㆔r*$ШTd($A|60rƤi5k2p8D'tBe+9 8oGLd<'' NvIGL_F_oP]PE}|E\APae\/gWhŖ?-l >Zy]&.%^De ^…cao%"8!6B*&׎^-sUߟ/.,.8t"B(@ʩ2V Fxoρ͆Q|kAaE 2цn^U(%8$ Vgzl|lݩ#TET$z-"e~?N8n@ydr^!@p零Ռ bXEv`h4DM:Lh 8}X/2r*lb\->5kԮ>R׻b-[5YYY2sKsFUVz,*!#%*SC8lؐr%-B{2-mޝ;ޟw}!h*'\X\(d/j$q$cCaxsgo7>} M'_ㆿOl_4;慨z my 1#C1!%'ltVN2+Rͳެ/ mϬbg6 Xlwt}@Y:8<OD]? 跓k,n!KɧE?ϯ-)eRbǐs⬀]VVݮ hrTsj2Ai0_If/+c=9]=9[vMRCtyvjϚ(G8;kWD(jVx(]!QeذC3ib1GqjyJgPP]c7^WJ5Os?EvŬ;wX"i:WՔp7 e仠wan; _ 6=gX#'||_Sහ'p|ȇg*NO"7ғIA\]Tπ FCŗtIJd'b;Z/+)UƍՆdY-1\3J=cS ^E™Sa .e^"+QN.`&\ =1J™6eA@n]"a3¡>8 C D\\ +ܸUO„פpaLNvwX꬐ e b3`oSJ}Yt-4#mT_WC.^&o*j62TJ-덜]~WA:EXZJRB|1SS4v`b47mgn97a*l 5ʿ5?^d TuXF~w-/_6ows6`tOX;(~n0[O<<3]=!6&l\[aV-f`N`+Qǭg>q4ÙUpfUdΪQR㬕g {}^;WQ`\썚vjZJ;u5Ģ/eB/r?^K:1Nj隳3{58ۭlD+*[|\qOozRi}@V~/`toϢƓ_{F iT.snzVH zp$owxx6@mD≜8o__yWD$?|f8}w|bOߵ\1gw6_w.T  tmjݺvWgh(Ŏ 99$à42kS HbZtz!"I퓏YWSޣSMd) ӣ[#"Pq2>^CW0aOPu? z;}d/$յ%v*0>}I3*T JtQ1ؾ3!h嫡Y%W-dwR ,Ts\^̇9Wj-R%߲[[gTGY *".:z@V ҟlsFYS}k}VVPVF++vlzfC\߹h Ϣ3JS%]1KA-[S+#IH 6>lpWd2(cc?W|0^,-S#W1ce 0! D|> ʛƹFS" J'~`e{`$$%oAɀmx<Zwxpdq%aXa ɩ. %a%eVXYseZeR'xfB/9HaҒ5% ˋcREzGK7 Y* u_|uas5b? p4 "A=&I33jsy6hx@ԐND,@}?,!z)j?M}0]l褒Ez)ǞJ)PiRJp&M8O'`ܿiܱ w{ \ޠDq+>D NlzOw|+{5OdžY԰-"XtX./"R`OzHѸ"LoEu^ \><%C?At;_!:j_21M؟e(\b>$0RG(TuVFC)cuF32nM1AP%M\ᴈcN~lD qS=D{Ņ C~V%#Sz)E kZgudj"Pk u q!D ٿr'X! 0>C[sr_JȹU^z*چv~,D i4H\UaZ(29 ?3dθT}փEq@dH[VZU 2Uǯqa J<9[B&E.~*zQ D%˨-9}ۄ*FHS\Rr&m^b%-_q{_xӊW<F$SUZf㤳m;og*H·$`oOlq6^uT|:3ܐC8{V2n7x>~> 0r x_\Q=v܋xtiT9v"3qdCg(D]vWrY`fmƎƅJn?ũҎ 39 ``,ńt Z- "3nûjiڬZ.ոh"yon(i)KkE IDATsԤx:S=Xc>==뗯cdقm@p&X+^ZѻT^aAA|zKtaZhE[^۪0D'o's—n3> onB7}LT%nCiͦ‰'8l )o3xwlLPsǑby;22pf\9 הq1j)& 9"W՟?f,>Fv[bcH4wy~qĢQW]2:4q{he]nZf,/KTM6h_D+ysk2/.dV8A1@@t" `dyUX@mj%^01HR2?#rs,/}KdV vZ(4,84+7}bV_ /U~C#T3( BT{ ;^@!c@mRv:{6H {2)Cro|p(gr˘e$s)9Le0#>@ٙ~O rY$vk2YY}Oiѹkɨ$ <{!#j~K}O=TRu *pcK!>o8n~+Ӏ\f/ p+DRWVy`np @[aYtÎwl|̿{SU J %UkV <ֺ|-o"Y4rufK, pH,Aa~i];Tlb]M*+ʢHbٵ8'`r؉P[Q〾$~ǟ>~¯_O(~@J`JؘcㆍE=JZ x#8n82sǗDl3߰x${%ZݵjA43N.,0,ŔCx & ON l- F6,Qm瀅qccWb륢 ,`n: j;C]+SG.D۳(`0T#V.$*G / eL(V %N2eFnaJC!V^i = %ΗXB%wo[l5YV' %4. 8e+@#}m)@2]f-geI拜% TWCǥ5]O]8\[lH[d5Lw6@MhIrFYMO{@B.Sx*SmR lo\8{KݞɑH[S%I1je=ig#J(:k}b6: `kǞ_@~? W|*;kO6U{ѕ mm 'ca{" oNDn'n[[;¸lKK ]3F`e  =TV w?(8M 5*`?vg*4bhb5VѠH-Ι u7oT9D+)^6.l[#nX_d̴S3A$hBd̪I%'b`13:t1⎳x-n]PZ0,,rbz<+d<0 U%K"? gHlf>΀ڙ %>,B mض U OW~w$AHۆwY x}zÎtlj't3ݐRF҉3x(#f+I\ն|U,0 OF47,,\ :(aɽMR 71.C͇e[x^>^x8Pv鋩MMzOZQ ٪CM"_xire؝_9\z߉ >3{236kJf, n^4nh/L ?PQ؞کEGt`zqrAS*-(z#sѰ/%zysV2˸s5fK|LnIvޥаY?r% Rؚ( 9YQ!0fF)BwxR ׁh.Y0Z04TVZ_4_%7o oB~Y@2Lĸʩ]yI,'8q`)H֪M `OMW o/4g;\x %V3|^L>cI} AWYr>NYY kiaūu#|* H[+@݈۶CD }#|#~OqGbێ7aGaSc3Sች  ;vxmU^8<{TUeS\4g\O0!RCIЩɫsv=2g% ˋڍ[TU*$WZ=F. LѯVu\glђ>'(ӌ/gg+aE{Xʜ2#I i锕Tau9Eȑ=@1=$?rd3 :K9b`ϥ-\oY<drE^OfLDx+y/>/o[|//ێnطث&NGt6C?Vf#@'H"I<󉇄GNxBToKuW#cos0wWLE3-8(DL?*IzJzFPPqaN痹;xS!wjqV\[W?f`[}W9;< v%yxU)Z_~#}wMhO92.o4hVdѶKz |Awvbsr6,W°w^\켭OjjD4X8tF(֎:&\ z.Xm(򞽊Ni ݬ0G{Kۡ3ȏ; |O?nR6U !vj5- mo%Au?'u(v*f#Ӳ6 ~'~]x~8I g-E5"/W>biN[  4ׅq! J$ej9*JK98+/TQֿ`{@:6V(X! sl C"О&f~+t.@W' H rANk/wn6[2VJ`(w_44"T\9z%D u& *ǥ-6&ì@.SEƴ70 t v[Iޞ8' ~?n/p6*OɯkE;@ )r󉛞xUrVl| P8VZo+x1H\TP\&`ggs9c3S4QTcr, 2RH~ʊ ~5L^I'H9T:a h>m_lug=Ewӭ׳;BNߘqfbO% \ӈ_K+v]Ї^ /Kedg8: `FDYy"DS šKSWM nB&Vn0P{0[dL ``E[}fae-##؍@>B唫ly,!Ko=ѣZkcԳ1&fuP35_[xje$1Ȋ:Ÿ́RJI4&?tG!:Ew$r5D#x+JBYw:*h% vhv/n$C_8 HTz&8,$ 0C @b,4 65Vڽg\;MgʄO-EI^}W~/צެđ)Uܦ ְQ{ntYO\rLg !QQKF{۞pw!}3~~BnHi=vlV?g-̗u𖍁oG[3w<'sÎMvl`NPHڑ v-NOu|N=BeԗѷG9 !Z2bg,7W]Cjz|-W iRvlKulω\^MA]%P"+yjS0;5I d{9)&ʇVE̒jo~~'#*Q֧e ܑIW29k944{3ȵ{f%+~+ّȱ#"kfЗn4$Ւdl#i%(IY[}C+bTk|<1jics 2Ameo|{B?ӥP 9ljZ|'ve@N sR@Y[HAu m`<,r_1댘j,YOI!>tf f Um6;"CFw;Ez|`ZJ]l#{S1/>M/Tmշi93Vr ) اj _ο_o۳.FiU >nz-wv@}I+Qrt5Qw=AjhrZQZ{+T$2:h^_#D;Z Y p/'EA 2$I ˪}k%z bž7ZA%foϮX"{2nYs8'g&fhWcjJ%/Hxs@찅i[ X5g.>Kgm!FNƼ{!=/CPl˛d ʢ"O}tݳu?ž\*ˠ,3P",S$knPgm&/c!W"avX ` [N%\|Ew C '!wB [<>oI~Y>B䁳yĉPH. LiA qإ2j,&nkVv5A,/_>prc, Ku2PSa.^R)dPZkr 2&{ F٬zpxDT JiJĩ#i]mrPuZeQ{s5jHV$0)&kÔ,r}-O +r'y\=+$} XgnwZNN,Bϟp/KziV1Y zR%EFNA_v0*ryؾ.&)ų%;/ec=*6_ܽ TEjBI۪!ՉltN)@WQs, EUGvJE-Z{jظ4UQ1tƪSm5p뇶9 R}-Oz,B8pW *o1-CLKUejTȃ@p,L5૜%v 5u@zs/HʞFX69U]U 2U:"MǒZ9̼Vq6>ҶsJm2|z9\^NhRnLmWxŃCljN7g|8En‡_B#x]u~$gy(5I4P@@pr TgA `/DHoͧݞzʶjh1K7]@c7E<*33\\ QH u2PuGv2GkhAem !@9T:D,ŃBWP1ciTt2^徱u1}9K%o_K僗M0D Y0/R/G?d\(%% 2SπDU|6HA!E-e k5f U܂}QE >|!8^:" Ye`MG^6S_k`P?sU*ݎM<U 6$CmݾǷ:7URi4ƩwiPjK`)CNUb%9M88<Վk6MucuReA} ̘ڗ[4VIDATV&v Okcm7Ye$9l*N!NMe`F`&?)Y+mk G^:YZ=m~Bwy_W1|)_ Nid}_%J͖<4_5&~ %G&?^J;!A\ SFڲ, ^mJi ;_еt A.T.K 7+ib-a֑g%|9$pzU)5nMFzŇ>^8{y;JvZ- w?qj $+)0-v#Pfz)W;W[hKKx`e&'kf.]w~_F*&-}^;T4jCFPk{,/1J`X,K @d{t8؆Pzc)Q}jiliW^H5-Xr=4SL ;6?;"ۊ}կgv,,IMH.N+T!a> BsH$ˢ7vҔleјl9ʖRƨ4 ;7GF6t2n)C|+:Y.q^wCfQb5a{zŃ bǢg2bgȽt:f[JVfR YE2!ؑb\Ꙑ )(;_8/YkiR_rg 1dUJ6ɳK%f<̛#1!v0-{- h׫3!9Ig@-ɛ*PpXVjKLՙ*-KL\CɌ $C\0\]:ex&}!qK±1?-JSKF aၤk އ41E eXKo(:~`UZ tS򮄓6s~NYa2bS@-ٶߪq/5z~(1dw _;p$\di*K/IQX`B|Y89: sù9 aC!ϝKC=В ꀍaMئ1 &$eS{JU+mmj\{V5 25/NDZU4S`maX+->@D<2)d1G{k{]Q`m`(lO eaF *[ U#_-r O7sXrHEڟpp98ӂM$X Aڊ(eSADq&TX-sq%R $NϚPïB\Rꮵ4.L.s?`R-i &FaMv^.>nM4M-TFE[^v_?{-d^|b8lIŽ76]Y c{2 q7D:7.EiQL܌|XKDx|Iđiqᒌ6ji#EX-*<'O k;%or2z0#wa8qSADꨮaz(Dž4 v';nO偣q/=w\/V O3ǯvre8q\x@BྸǩEIζ [ٺ'whͯ#گ⒚2zU )2Q,νo#ďo/CNUh<=0j: Ug)M%r'(CÜƦ :;`͛fvxz'g!5w$VZ˺U9B$arXYW bJT,.=Ld5y>/ޣAi5wNC uEU{^g5H1|F%naQ2|V=`^.4?&Bqi:9%o~{S7~%r]#\Jd)6FwtexX1=/ɣՀՀ=0E)q3.<50L+4K.hAm if m{cX[jt rSP 52*ܳ0,d2מ숌;0=he3r:ȹ {59H ?%M ks:Ѹ `)j a2GY,nyI32ƪ:dSudPv~ʴŒhZ+>w}P X—X&)"e0ƿӼ=XM?"̼(e(#Zg)!٦nB\m'!|[zhZ-BJQg 3`*W< zjy~>G(oxctKhoCj7| "8Póy! !g% @A2bSJsx-B54Gω]0|klĿ4IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/deploy.TestCase0000755000175000017500000003572514620351225017114 0ustar00hanshans#!/usr/bin/env python3 import inspect import logging import os import sys import tempfile import unittest from pathlib import Path from unittest import mock localmodule = os.path.realpath( os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') ) if localmodule not in sys.path: sys.path.insert(0, localmodule) import fdroidserver.common import fdroidserver.deploy from fdroidserver.exception import FDroidException from testcommon import TmpCwd, mkdtemp, parse_args_for_test class DeployTest(unittest.TestCase): '''fdroidserver/deploy.py''' def setUp(self): logging.basicConfig(level=logging.DEBUG) self.basedir = os.path.join(localmodule, 'tests') os.chdir(self.basedir) self._td = mkdtemp() self.testdir = self._td.name def tearDown(self): self._td.cleanup() def test_update_serverwebroots_bad_None(self): with self.assertRaises(TypeError): fdroidserver.deploy.update_serverwebroots(None, 'repo') def test_update_serverwebroots_bad_int(self): with self.assertRaises(TypeError): fdroidserver.deploy.update_serverwebroots(9, 'repo') def test_update_serverwebroots_bad_float(self): with self.assertRaises(TypeError): fdroidserver.deploy.update_serverwebroots(1.0, 'repo') def test_update_serverwebroots(self): """rsync works with file paths, so this test uses paths for the URLs""" os.chdir(self.testdir) repo = Path('repo') repo.mkdir() fake_apk = repo / 'fake.apk' with fake_apk.open('w') as fp: fp.write('not an APK, but has the right filename') url0 = Path('url0/fdroid') url0.mkdir(parents=True) url1 = Path('url1/fdroid') url1.mkdir(parents=True) dest_apk0 = url0 / fake_apk dest_apk1 = url1 / fake_apk self.assertFalse(dest_apk0.is_file()) self.assertFalse(dest_apk1.is_file()) fdroidserver.deploy.update_serverwebroots( [ {'url': str(url0)}, {'url': str(url1)}, ], str(repo), ) self.assertTrue(dest_apk0.is_file()) self.assertTrue(dest_apk1.is_file()) def test_update_serverwebroots_url_does_not_end_with_fdroid(self): with self.assertRaises(SystemExit): fdroidserver.deploy.update_serverwebroots([{'url': 'url'}], 'repo') def test_update_serverwebroots_bad_ssh_url(self): with self.assertRaises(SystemExit): fdroidserver.deploy.update_serverwebroots( [{'url': 'f@b.ar::/path/to/fdroid'}], 'repo' ) def test_update_serverwebroots_unsupported_ssh_url(self): with self.assertRaises(SystemExit): fdroidserver.deploy.update_serverwebroots([{'url': 'ssh://nope'}], 'repo') def test_update_serverwebroot(self): """rsync works with file paths, so this test uses paths for the URLs""" os.chdir(self.testdir) repo = Path('repo') repo.mkdir(parents=True) fake_apk = repo / 'fake.apk' with fake_apk.open('w') as fp: fp.write('not an APK, but has the right filename') url = Path('url') url.mkdir() dest_apk = url / fake_apk self.assertFalse(dest_apk.is_file()) fdroidserver.deploy.update_serverwebroot({'url': str(url)}, 'repo') self.assertTrue(dest_apk.is_file()) @mock.patch.dict(os.environ, clear=True) def test_update_serverwebroot_no_rsync_error(self): os.environ['PATH'] = self.testdir os.chdir(self.testdir) with self.assertRaises(FDroidException): fdroidserver.deploy.update_serverwebroot('serverwebroot', 'repo') def test_update_serverwebroot_make_cur_version_link(self): self.maxDiff = None # setup parameters for this test run fdroidserver.common.options = mock.Mock() fdroidserver.common.options.no_checksum = True fdroidserver.common.options.identity_file = None fdroidserver.common.options.verbose = False fdroidserver.common.options.quiet = True fdroidserver.deploy.config = {'make_current_version_link': True} url = "example.com:/var/www/fdroid" repo_section = 'repo' # setup function for asserting subprocess.call invocations call_iteration = 0 def update_server_webroot_call(cmd): nonlocal call_iteration if call_iteration == 0: self.assertListEqual( cmd, [ 'rsync', '--archive', '--delete-after', '--safe-links', '--quiet', '--exclude', 'repo/altstore-index.json', '--exclude', 'repo/entry.jar', '--exclude', 'repo/entry.json', '--exclude', 'repo/entry.json.asc', '--exclude', 'repo/index-v1.jar', '--exclude', 'repo/index-v1.json', '--exclude', 'repo/index-v1.json.asc', '--exclude', 'repo/index-v2.json', '--exclude', 'repo/index-v2.json.asc', '--exclude', 'repo/index.jar', '--exclude', 'repo/index.xml', 'repo', 'example.com:/var/www/fdroid', ], ) elif call_iteration == 1: self.assertListEqual( cmd, [ 'rsync', '--archive', '--delete-after', '--safe-links', '--quiet', 'repo', url, ], ) elif call_iteration == 2: self.assertListEqual( cmd, [ 'rsync', '--archive', '--delete-after', '--safe-links', '--quiet', 'Sym.apk', 'Sym.apk.asc', 'Sym.apk.sig', 'example.com:/var/www/fdroid', ], ) else: self.fail('unexpected subprocess.call invocation') call_iteration += 1 return 0 with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): os.mkdir('repo') os.symlink('repo/com.example.sym.apk', 'Sym.apk') os.symlink('repo/com.example.sym.apk.asc', 'Sym.apk.asc') os.symlink('repo/com.example.sym.apk.sig', 'Sym.apk.sig') with mock.patch('subprocess.call', side_effect=update_server_webroot_call): fdroidserver.deploy.update_serverwebroot({'url': url}, repo_section) self.assertEqual(call_iteration, 3, 'expected 3 invocations of subprocess.call') def test_update_serverwebroot_with_id_file(self): # setup parameters for this test run fdroidserver.common.options = mock.Mock() fdroidserver.common.options.identity_file = None fdroidserver.common.options.no_checksum = True fdroidserver.common.options.verbose = True fdroidserver.common.options.quiet = False fdroidserver.common.options.identity_file = None fdroidserver.deploy.config = {'identity_file': './id_rsa'} url = "example.com:/var/www/fdroid" repo_section = 'archive' # setup function for asserting subprocess.call invocations call_iteration = 0 def update_server_webroot_call(cmd): nonlocal call_iteration if call_iteration == 0: self.assertListEqual( cmd, [ 'rsync', '--archive', '--delete-after', '--safe-links', '--verbose', '-e', 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' + fdroidserver.deploy.config['identity_file'], '--exclude', 'archive/altstore-index.json', '--exclude', 'archive/entry.jar', '--exclude', 'archive/entry.json', '--exclude', 'archive/entry.json.asc', '--exclude', 'archive/index-v1.jar', '--exclude', 'archive/index-v1.json', '--exclude', 'archive/index-v1.json.asc', '--exclude', 'archive/index-v2.json', '--exclude', 'archive/index-v2.json.asc', '--exclude', 'archive/index.jar', '--exclude', 'archive/index.xml', 'archive', url, ], ) elif call_iteration == 1: self.assertListEqual( cmd, [ 'rsync', '--archive', '--delete-after', '--safe-links', '--verbose', '-e', 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' + fdroidserver.deploy.config['identity_file'], 'archive', url, ], ) else: self.fail('unexpected subprocess.call invocation') call_iteration += 1 return 0 with mock.patch('subprocess.call', side_effect=update_server_webroot_call): fdroidserver.deploy.update_serverwebroot({'url': url}, repo_section) self.assertEqual(call_iteration, 2, 'expected 2 invocations of subprocess.call') @unittest.skipIf( not os.getenv('VIRUSTOTAL_API_KEY'), 'VIRUSTOTAL_API_KEY is not set' ) def test_upload_to_virustotal(self): fdroidserver.common.options.verbose = True virustotal_apikey = os.getenv('VIRUSTOTAL_API_KEY') fdroidserver.deploy.upload_to_virustotal('repo', virustotal_apikey) def test_remote_hostname_regex(self): for remote_url, name in ( ('git@github.com:guardianproject/fdroid-repo', 'github'), ('git@gitlab.com:guardianproject/fdroid-repo', 'gitlab'), ('https://github.com:guardianproject/fdroid-repo', 'github'), ('https://gitlab.com/guardianproject/fdroid-repo', 'gitlab'), ('https://salsa.debian.org/foo/repo', 'salsa'), ): self.assertEqual( name, fdroidserver.deploy.REMOTE_HOSTNAME_REGEX.sub(r'\1', remote_url) ) def test_update_servergitmirrors(self): # setup parameters for this test run fdroidserver.common.options = mock.Mock() fdroidserver.common.options.identity_file = None fdroidserver.common.options.no_keep_git_mirror_archive = False fdroidserver.common.options.verbose = False fdroidserver.common.options.quiet = True fdroidserver.common.options.index_only = False config = {} fdroidserver.common.fill_config_defaults(config) fdroidserver.deploy.config = config fdroidserver.deploy.config["servergitmirrors"] = [] repo_section = 'repo' # setup function for asserting subprocess.call invocations update_servergitmirrors_call_iteration = 0 remote_push_call_iteration = 0 os.chdir(self.testdir) repo = Path('repo') repo.mkdir(parents=True) fake_apk = repo / 'Sym.apk' with fake_apk.open('w') as fp: fp.write('not an APK, but has the right filename') fake_index = repo / fdroidserver.deploy.INDEX_FILES[0] with fake_index.open('w') as fp: fp.write('not an index, but has the right filename') def update_servergitmirrors_call(cmd): nonlocal update_servergitmirrors_call_iteration if update_servergitmirrors_call_iteration == 0: self.assertListEqual( cmd, [ 'rsync', '--recursive', '--safe-links', '--times', '--perms', '--one-file-system', '--delete', '--chmod=Da+rx,Fa-x,a+r,u+w', '--quiet', 'repo/', "git-mirror/fdroid/repo/", ], ) else: self.fail('unexpected subprocess.call invocation') update_servergitmirrors_call_iteration += 1 return 0 def remote_push_call(ref, force=False, set_upstream=False, **_args): nonlocal remote_push_call_iteration if remote_push_call_iteration == 0: self.assertEqual([ref, force, set_upstream], ['master', True, True]) else: self.fail('unexpected git.Remote.push invocation') remote_push_call_iteration += 1 return [] with mock.patch('subprocess.call', side_effect=update_servergitmirrors_call): with mock.patch( 'git.Remote.push', side_effect=remote_push_call ) as mock_remote_push: mock_remote_push.return_value = [] fdroidserver.deploy.update_servergitmirrors( [{'url': 'https://github.com/user/repo'}], repo_section ) self.assertEqual( update_servergitmirrors_call_iteration, 1, 'expected 1 invocations of subprocess.call', ) self.assertEqual( remote_push_call_iteration, 1, 'expected 1 invocations of git.Remote.push' ) if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) import argparse parser = argparse.ArgumentParser() parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(DeployTest)) unittest.main(failfast=False) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/dummy-keystore.jks0000644000175000017500000002415514620351225017662 0ustar00hanshansa163ec9b]1l00 +*:$ 5q8E4cʿ3K*sQKxEc\ ~md6 hWyKP) 6lS_ D 's18Qd|mHTķAg>U/gzdDa3iswMg)O#h%Ow/\BĈ xśGnK1U8h/ҍ&*kyP`r6]LQy(茷 X¯/9BS( =,Z2[ 6S~'fc ;[^EʠCDr-|9j(y.C~^L5t^楉 ׬mي*S/E75BpHS=sCwb43\G!H;Hb-d7 s%CTH9T_\OqfmohR.SPdܟ:NGdev$]*{(8'Z-fƨe1@bTwUK@G<Ď#-#V'B3CD-VUP'iF*Ƙ@(COC7S- wJC؞!hhO/q3/3WTGt;!NûY(e7|j̢D֑ UDl1|Rܰ4u$p @w\Gg8E"O<ן2ALGw+~Siu1/L_S(i hGAaꯇu`1| Xwb%?skjUʞfrJ~Ajbe:R: /5UŵFEBpކ=]myb\reոІnڡ~y$¥!00UbO(^ ZubB20  *H  [XXX ff6 T l"jVJO?,RWlAcppoԌͻ"TbB*M i/)q$<\0`w8%/ 8WW'g8K0g&t = H#QcT͎J-Ӫ'K"H#l $ORzch~I"Pp #+kW^*>9buÀ(XTξ.E78688a0f]7L#00 +*JbhXF~j_ ܐFY!}E^ 㜛C 2}u3KYBj kxڣ=^yf%fn(2t P;*]b Xw$S˔MB]S  L8^$Ll,)[=*_"\R=$MRkAQȜ1觴Txf~%3i->ə x\=!O,;M%aP6w&t\=[J?'ɨj)D&BzQA@[q8bE;W愪lG;-nƹ|>uf#"?bw.+ D))_-gv˺?*e1ۘ9d:~?Q L 9ȶ,L1H1pi`)[>Lp5@;l]T#[]%-6v^MPUI Z< 'dPg .Xm2: P CLw ']]/oHk ү,`Wmk<"Lt6?6 Yi5_%3-̬KI{ܫ'㴿[&+  4ab~v@cX.50900ɠ-0  *H  0!10U F-Droid1 0 Utest0 170704152811Z 441119152811Z0!10U F-Droid1 0 Utest0"0  *H 0 ,/ϓ 2ɰm H3یu&É6`IݨoΓ9<в>v1+nۃ( {l 9y-.smm=P!r+KIWmU!|*.g (Um<*6I0[1=ڱ F"(gtB1$v$O(8E'&K@<} 򃗵UiդXZР9w[4W?S,<SRNy?Ŏ|7^Q07؝p]E8clI]' Q/as9@yKurepokey]2ʶ}00 +* }zEךT;‰/l+p)DՐ Ѧu)+^Jgn񯞏ȑV]ZL8=5dc9H?gt]ƒ0M&"re?"PYL }̶ \ j42,r"muI@w tE?2倭4+u'hGR#ֵ,cV kYrbYD%8덟qfѶ.CcU1c?~s_9J;yݼ CrfC);IDfojxƙcl: Vh$>Vyvr$u̬[жYe)%h "6bx'$;S֍ꆱYRC'_ixYA4aSn)Fm7}T[iޖە$t֔2́LiY#e\۳7mSJ{XQԙxS?܊ C=rĬ;$>`ӅMMz?nDWܤ{LD?iV 1izxU6QXȵ\%XmQbq[JYBcCt>Nxs6ECTN$6<7"P.nqc$ V aJ+Ѭ60QO&EX,a؃Ų(Gޕtah]@NLEl½njwg!{,d ^`N5?AW+iҪEfX.50900ɠ|SY0  *H  0!10U F-Droid1 0 Utest0 170711175532Z 441126175532Z0!10U F-Droid1 0 Utest0"0  *H 0 +2!ChB^ X Cnqy:8 /qifOZH71MmS#/CB՝*A apk3s'S.ЬeL[zuYt{YE4@?:٤6%<;j} ^ե\zR3v Z1|~`.SL&w\r_ȄaM~}pd7$"/3|#m=};,3!00U3 ZϣJ'*nE0D?p%pTNGU1'pH(u8~9`&RtV ,Eqr,ɓ8xYEĜU®%Q~?PpiPL A?!gXQ@$2}?aR\7 '*] Hi-pм~rZt4 oY-T_dԚy>jў]Htl-> (N*ȧ=sk0N<'L"QV$ LDgye:D5մ@K+K^"i&̊xYY a.uq93ħAA.؛eEÔb& i7] ӛp_mSn1BN8锨x Iffl y> сtz;a= Mrإ/]Cjb {/op^/'ٳhB[o2|H߿ TKoc:u?O\W  )1-LrB-B7@ ݮ~Md[FZbg%" PA SwQ_^6)׭~(`;Xړ\W=YvG;%z="1gգJgZL9J7(wX%$(1m6u0j_qUD/ c.>zЗ19܅rЊ-CՈy8YsI4סf030d#gs-ᨛq3I-,e¹kSw1cZr'e@p Fb@_Qn|לF,m9ei gW ><޷VWdf@Ɗ?on=jՋ0 wXEʥJ02e- lYi`߉z 2U(urvqFrPpC̟?"N@$IC!GfĤN#Rr%t):z>^ثd/jQW୞z4O2`D.^{-X.50900ɠKl+0  *H  0!10U F-Droid1 0 Utest0 170704152800Z 441119152800Z0!10U F-Droid1 0 Utest0"0  *H 0 h"E~QˈDؓi_fTIW nmuUk0z/p܎m—aX9٢B8;pnPל@ZSQ|2n[ ֯g {ψwu ow)?H6_^ABs} L>wDG]gN N$:1nJƍtJ⿧ˈE.I5Ukw@wfDKLr6DO}ٙʏHA!00UQrr@3x0#+R$~0  *H  *[Jb/%) bKL'8Q˂S1]Vvmj:FUaǪ<$i./„4zp o CC5:dokc|{G腅xY:WI]0%5*,QP3Vq7{$~nkq6\^rTۤ&f K 'IΏךYh?e*thT//nfl=!by>d2d51ff2]600 +*D .qG ` HBx_3}'8au?56@G^Á4%{@b5 #j ^Uun4cU? ~nIw"zxm0d5~ه₥^EM# VG}B#a!m[4Dz29jʊueA|n?!^mu~A@Ns MkTTTI_PxҸܘg<޾ܘDɵ" } 08MB8wgVHJ qG '^B)8'`dK."룻 YcVUubBn3!*J >r6+:C;Y)}/zwx ߥm$GvZl}l{*&gxhU %U-q27#o VGEǗƆ,DBeWw\L27y] 1'+r?Z̑~|s:eؽXH$D{K QRYN# #(wgO^W[0 NIG=ȎbѰZKu 5rI6_-,np D6L'~"eTޯ uƵ+ÒF @{+@1d2^?Ycm& 1nG~]nO^pb;6D3y~m#bC.SoK)Z$Բ,d::"@h숚YqiN|oEEw즌'``$`lk@Ceؠ\6Z^t/?I/#*ֶY6{=tf?<<el@^0=>b)Iy_jnt3R1]lNzӾs/Jji=^7m $>E{O)n_FV%Q `p;UWߜ]{.65qǙ"wg|5 ^(t埭zvtD԰Aw jz'8?0)$7EK;Ib=ŐR7 Dz4P;;"13TX./F'VvBih`ԳlԩD9ՂhoPzTܰ|*KGQJe+LX.50900ɠu0  *H  0!10U F-Droid1 0 Utest0 170704152747Z 441119152747Z0!10U F-Droid1 0 Utest0"0  *H 0 7<1|bEqB .x؍~}U_jMGdt}qt:?|ynO($MP 6kf<)p -ewԋҴ#|>]{ >y4ƒm4S7,.:p7s^؝J5ϩ^D^nC/1yt yӀa M ɟl@ASFB͕%laIHjMRaA;HkyKSQȊ;![!00U؛z:&Dnnl[0  *H  [VR sC ~H{uE"W@Zl9 1-Ehwfm2ڡKVoluX̃j yԐBP3(鲢2ֻ;6X`r[NΆB}D8aJCTNr5)dtx,54xyJ,Rl[(lCֽs̑1 Ց#nf[POTRaY!A4_0d7 # cd ../fdroiddata # ../fdroidserver/tests/dump_internal_metadata_format.py # cd ../fdroidserver # git checkout master # cd ../fdroiddata # ../fdroidserver/tests/dump_internal_metadata_format.py # diff -uw metadata/dump_* import inspect import os import sys from argparse import ArgumentParser import git import yaml localmodule = os.path.realpath( os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') ) if localmodule not in sys.path: sys.path.insert(0, localmodule) import fdroidserver.common # noqa import fdroidserver.metadata # noqa def _build_yaml_representer(dumper, data): """Create a YAML representation of a Build instance.""" # internal representation of keys were switched # to lists instead of strings concatenated by && # https://gitlab.com/fdroid/fdroidserver/merge_requests/1185 output = {} for k, v in data.items(): if k in ("build", "init", "prebuild", "sudo"): output[k] = " && ".join(v) else: output[k] = v return dumper.represent_dict(output) parser = ArgumentParser() fdroidserver.common.setup_global_opts(parser) fdroidserver.metadata.add_metadata_arguments(parser) options = fdroidserver.common.parse_args(parser) fdroidserver.metadata.warnings_action = options.W fdroidserver.common.read_config() if not os.path.isdir('metadata'): print("This script must be run in an F-Droid data folder with a 'metadata' subdir!") sys.exit(1) repo = git.Repo(localmodule) savedir = os.path.join('metadata', 'dump_' + repo.git.rev_parse('HEAD')) if not os.path.isdir(savedir): os.mkdir(savedir) apps = fdroidserver.metadata.read_metadata() for appid, app in apps.items(): savepath = os.path.join(savedir, appid + '.yaml') frommeta = dict(app) with open(savepath, "w", encoding="utf-8") as f: yaml.add_representer(fdroidserver.metadata.Build, _build_yaml_representer) yaml.dump(frommeta, f, default_flow_style=False) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/exception.TestCase0000755000175000017500000000400014620351225017574 0ustar00hanshans#!/usr/bin/env python3 # http://www.drdobbs.com/testing/unit-testing-with-python/240165163 import inspect import os import sys import unittest localmodule = os.path.realpath( os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') ) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) import fdroidserver.common import fdroidserver.exception class ExceptionTest(unittest.TestCase): '''fdroidserver/exception.py''' def test_FDroidException(self): try: raise fdroidserver.exception.FDroidException() except fdroidserver.exception.FDroidException as e: str(e) try: raise fdroidserver.exception.FDroidException(9) except fdroidserver.exception.FDroidException as e: str(e) try: raise fdroidserver.exception.FDroidException(-123.12234) except fdroidserver.exception.FDroidException as e: str(e) try: raise fdroidserver.exception.FDroidException("this is a string") except fdroidserver.exception.FDroidException as e: str(e) try: raise fdroidserver.exception.FDroidException(['one', 'two', 'three']) except fdroidserver.exception.FDroidException as e: str(e) try: raise fdroidserver.exception.FDroidException(('one', 'two', 'three')) except fdroidserver.exception.FDroidException as e: str(e) if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) import argparse from testcommon import parse_args_for_test parser = argparse.ArgumentParser() parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(ExceptionTest)) unittest.main(failfast=False) ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.920383 fdroidserver-2.3a1/tests/extra/0000755000175000017500000000000014620351546015275 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/extra/manual-vmtools-test.py0000755000175000017500000001235014620351225021600 0ustar00hanshans#!/usr/bin/env python3 # # This script is some of the only documentation of certain processes # that run in the buildserver setup. It is not really maintained, but # is still here as a kind of reference. import os import sys import logging import textwrap import tempfile import inspect from argparse import ArgumentParser localmodule = os.path.realpath( os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..', '..')) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) from fdroidserver.vmtools import get_build_vm # pylint: disable=no-member def main(args): if args.provider != None: if args.provider not in ('libvirt', 'virtualbox'): logging.critical('provider: %s not supported.', args.provider) sys.exit(1) with tempfile.TemporaryDirectory() as tmpdir: # define a simple vagrant vm 'x' x_dir = os.path.join(tmpdir, 'x') os.makedirs(x_dir) with open(os.path.join(x_dir, 'Vagrantfile'), 'w') as f: f.write(textwrap.dedent("""\ Vagrant.configure("2") do |config| config.vm.box = "debian/jessie64" config.vm.synced_folder ".", "/vagrant", disabled: true config.ssh.insert_key = false end """)) # define another simple vagrant vm 'y' which uses 'x' as a base box y_dir = os.path.join(tmpdir, 'y') os.makedirs(y_dir) with open(os.path.join(y_dir, 'Vagrantfile'), 'w') as f: f.write(textwrap.dedent("""\ Vagrant.configure("2") do |config| config.vm.box = "x" config.vm.synced_folder ".", "/vagrant", disabled: true end """)) # vagrant file for packaging 'x' box vgrntf=textwrap.dedent("""\ Vagrant.configure("2") do |config| config.vm.synced_folder ".", "/vagrant", type: "nfs", nfs_version: "4", nfs_udp: false config.vm.provider :libvirt do |libvirt| libvirt.driver = "kvm" libvirt.connect_via_ssh = false libvirt.username = "root" libvirt.storage_pool_name = "default" end end """) # create a box: x if not args.skip_create_x: x = get_build_vm(x_dir, provider=args.provider) x.destroy() x.up(provision=True) x.halt() x.package(output='x.box', vagrantfile=vgrntf, keep_box_file=False) x.box_remove('x') x.box_add('x', 'x.box') # use previously created box to spin up a new vm if not args.skip_create_y: y = get_build_vm(y_dir, provider=args.provider) y.destroy() y.up() # create and restore a snapshot if not args.skip_snapshot_y: y = get_build_vm(y_dir, provider=args.provider) if y.snapshot_exists('clean'): y.destroy() y.up() y.suspend() y.snapshot_create('clean') y.up() logging.info('snapshot \'clean\' exsists: %r', y.snapshot_exists('clean')) # test if snapshot exists se = y.snapshot_exists('clean') logging.info('snapshot \'clean\' available: %r', se) # revert snapshot y.suspend() logging.info('asdf %s', y.snapshot_revert('clean')) y.resume() # cleanup if not args.skip_clean: x = get_build_vm(x_dir, provider=args.provider) y = get_build_vm(y_dir, provider=args.provider) y.destroy() x.destroy() x.box_remove('x') if __name__ == '__main__': logging.basicConfig(format='%(message)s', level=logging.DEBUG) parser = ArgumentParser(description="""\ This is intended for manually testing vmtools.py NOTE: Should this test-run fail it might leave traces of vagrant VMs or boxes on your system. Those vagrant VMs are named 'x' and 'y'. """) parser.add_argument('--provider', help="Force this script use supplied " "provider instead using our auto provider lookup. " "Supported values: 'libvirt', 'virtualbox'") parser.add_argument('--skip-create-x', action="store_true", default=False, help="Skips: Creating 'x' vm, packaging it into a " "a box and adding it to vagrant.") parser.add_argument('--skip-create-y', action="store_true", default=False, help="Skips: Creating 'y' vm. Depends on having " "box 'x' added to vagrant.") parser.add_argument('--skip-snapshot-y', action="store_true", default=False, help="Skips: Taking a snapshot and restoring a " "a snapshot of 'y' vm. Requires 'y' mv to be " "present.") parser.add_argument('--skip-clean', action="store_true", default=False, help="Skips: Cleaning up mv images and vagrant " "metadata on the system.") args = parser.parse_args() main(args) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/funding-usernames.yaml0000644000175000017500000001045314620351225020465 0ustar00hanshansbad: - "Robert'); DROP TABLE Students; --" - '' - -a-b - '1234567890123456789012345678901234567890' - ~derp@darp---++asdf - foo@bar.com - me++ - --me bitcoin: - 3Lbz4vdt15Fsa4wVD3Yk8uGf6ugKKY4zSc community_bridge: [] custom: - bc1qvll2mp5ndwd4sgycu4ad2ken4clhjac7mdlcaj - http://www.roguetemple.com/z/donate.php - https://donate.openfoodfacts.org - https://email.faircode.eu/donate/ - https://etchdroid.depau.eu/donate/ - https://f-droid.org/about/ - https://flattr.com/github/bk138 - https://gultsch.de/donate.html - https://jahir.dev/donate - https://kodi.tv/contribute/donate - https://link.xbrowsersync.org/cryptos - https://manyver.se/donate - https://paypal.me/DanielQuahShaoHian - https://paypal.me/deletescape - https://paypal.me/freaktechnik - https://paypal.me/hpoul - https://paypal.me/imkosh - https://paypal.me/paphonb - https://paypal.me/vocabletrainer - https://pendulums.io/donation.html - https://play.google.com/store/apps/details?id=de.dennisguse.opentracks.playstore - https://play.google.com/store/apps/details?id=eu.faircode.email - https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/donate.png - https://raw.githubusercontent.com/CarGuo/GSYGithubAppFlutter/master/thanks.jpg - https://raw.githubusercontent.com/GanZhiXiong/GZXTaoBaoAppFlutter/blob/master/preview_images/thanks.png - https://seriesgui.de/whypay - https://transportr.app/donate/ - https://www.bountysource.com/teams/nextcloud/issues?tracker_ids=38838206 - https://www.donationalerts.com/r/blidingmage835 - https://www.hellotux.com/f-droid - https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=8UH5MBVYM3J36 - https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=E2FCXCT6837GL - https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=FMLNN8GXZKJEE - https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=K7HVLE6J7SXXA - https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=ZD39ZE7MGEGBL&source=url - https://www.paypal.me/SimpleMobileTools - https://www.paypal.me/TheAlphamerc/ - https://www.paypal.me/avirias - https://www.paypal.me/btimofeev - https://www.paypal.me/enricocid - https://www.paypal.me/gsnathan - https://www.paypal.me/nikita36078 - https://www.paypal.me/sahdeep - https://www.paypal.me/saulhenriquez - https://www.simplemobiletools.com/donate - https://www.youtube.com/watch?v=ZmrNc1ZhBkQ - paypal.me/amangautam1 - paypal.me/pools/c/8lCZfNnU0u - paypal.me/psoffritti github: - 00-Evan - adrcotfas - afollestad - ar- - BarnabyShearer - CarGuo - cketti - eighthave - emansih - GanZhiXiong - gpeal - hpoul - i-- - inorichi - inputmice - jahirfiquitiva - johnjohndoe - kaloudis - kiwix - ligi - M66B - mikepenz - Mygod - paroj - PerfectSlayer - sschueller - tateisu - tibbi - westnordost - x1unix - xn--nding-jua - zenorogue issuehunt: - bk138/multivnc ko_fi: - afollestad - fennifith - inorichi - mastalab - psoffritti liberapay: - ActivityDiary - AndStatus - BM835 - Briar - DAVx5 - F-Droid-Data - Feeel - Fruit-Radar-Development - Gadgetbridge - GuardianProject - Hocuri - KOReader - Kanedias - Kunzisoft - MaxK - NovaVideoPlayer - Phie - Rudloff - Schoumi - Syncthing-Fork - TeamNewPipe - Telegram-FOSS - Transportr - Varlorg - Wesnoth - ZiiS - ar- - bk138 - btimofeev - bubblineyuri - dennis.guse - developerfromjokela - devgianlu - eneiluj - experiment322 - fdossena - fennifith - freaktechnik - gsantner - hisname - hsn6 - iNPUTmice - inputmice - k9mail - matrixdotorg - mmarif - moezbhatti - proninyaroslav - quite - renyuneyun - rocketnine.space - sanskritbscs - sschueller - sschueller/donate - stefan-niedermann - tasks - teamkodi - thermatk - tom79 - wallabag - westnordost - whyorean - wilko - xbrowsersync - yeriomin - zeh open_collective: - avirias - curl - libsodium - manyverse - mastalab - tusky otechie: [] patreon: - BaldPhone - Bm835 - FastHub - Teamkodi - andrestaltz - bk138 - depau - iamSahdeep - ligi - ogre1 - orhunp - tiborkaputa - tom79 - westnordost - xbrowsersync - yairm210 - zenorogue tidelift: [] ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/tests/get_android_tools_versions/0000755000175000017500000000000014620351546021601 5ustar00hanshans././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.920383 fdroidserver-2.3a1/tests/get_android_tools_versions/android-ndk-r10e/0000755000175000017500000000000014620351546024540 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/get_android_tools_versions/android-ndk-r10e/RELEASE.TXT0000644000175000017500000000002214620351225026205 0ustar00hanshansr10e-rc4 (64-bit) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/tests/get_android_tools_versions/android-sdk/0000755000175000017500000000000014620351546024000 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/tests/get_android_tools_versions/android-sdk/ndk/0000755000175000017500000000000014620351546024554 5ustar00hanshans././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.920383 fdroidserver-2.3a1/tests/get_android_tools_versions/android-sdk/ndk/11.2.2725575/0000755000175000017500000000000014620351546025774 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/get_android_tools_versions/android-sdk/ndk/11.2.2725575/source.properties0000644000175000017500000000006314620351225031403 0ustar00hanshansPkg.Desc = Android NDK Pkg.Revision = 11.2.2725575 ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.920383 fdroidserver-2.3a1/tests/get_android_tools_versions/android-sdk/ndk/17.2.4988734/0000755000175000017500000000000014620351546026014 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/get_android_tools_versions/android-sdk/ndk/17.2.4988734/source.properties0000644000175000017500000000006314620351225031423 0ustar00hanshansPkg.Desc = Android NDK Pkg.Revision = 17.2.4988734 ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.920383 fdroidserver-2.3a1/tests/get_android_tools_versions/android-sdk/ndk/21.3.6528147/0000755000175000017500000000000014620351546025776 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/get_android_tools_versions/android-sdk/ndk/21.3.6528147/source.properties0000644000175000017500000000006314620351225031405 0ustar00hanshansPkg.Desc = Android NDK Pkg.Revision = 21.3.6528147 ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.920383 fdroidserver-2.3a1/tests/get_android_tools_versions/android-sdk/ndk-bundle/0000755000175000017500000000000014620351546026023 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/get_android_tools_versions/android-sdk/ndk-bundle/package.xml0000644000175000017500000000143314620351225030133 0ustar00hanshans2147075529Android NDK././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/get_android_tools_versions/android-sdk/ndk-bundle/source.properties0000644000175000017500000000006314620351225031432 0ustar00hanshansPkg.Desc = Android NDK Pkg.Revision = 21.4.7075529 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/tests/get_android_tools_versions/android-sdk/patcher/0000755000175000017500000000000014620351546025426 5ustar00hanshans././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.920383 fdroidserver-2.3a1/tests/get_android_tools_versions/android-sdk/patcher/v4/0000755000175000017500000000000014620351546025757 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/get_android_tools_versions/android-sdk/patcher/v4/source.properties0000644000175000017500000000123414620351225031367 0ustar00hanshans# # Copyright (C) 2016 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Pkg.Revision=1 Pkg.Path=patcher;v4 Pkg.Desc=SDK Patch Applier v4././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/tests/get_android_tools_versions/android-sdk/platforms/0000755000175000017500000000000014620351546026007 5ustar00hanshans././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.920383 fdroidserver-2.3a1/tests/get_android_tools_versions/android-sdk/platforms/android-30/0000755000175000017500000000000014620351546027647 5ustar00hanshans././@PaxHeader0000000000000000000000000000020600000000000010213 xustar00112 path=fdroidserver-2.3a1/tests/get_android_tools_versions/android-sdk/platforms/android-30/source.properties 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/get_android_tools_versions/android-sdk/platforms/android-30/source.properti0000644000175000017500000000030214620351225032722 0ustar00hanshansPkg.Desc=Android SDK Platform 11 Pkg.UserSrc=false Platform.Version=11 Platform.CodeName= Pkg.Revision=3 AndroidVersion.ApiLevel=30 Layoutlib.Api=15 Layoutlib.Revision=1 Platform.MinToolsRev=22 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/tests/get_android_tools_versions/android-sdk/skiaparser/0000755000175000017500000000000014620351546026144 5ustar00hanshans././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.920383 fdroidserver-2.3a1/tests/get_android_tools_versions/android-sdk/skiaparser/1/0000755000175000017500000000000014620351546026304 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/get_android_tools_versions/android-sdk/skiaparser/1/source.properties0000755000175000017500000000013214620351225031713 0ustar00hanshansPkg.Revision=6 Pkg.Path=skiaparser;1 Pkg.Desc=Layout Inspector image server for API 29-30 ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.920383 fdroidserver-2.3a1/tests/get_android_tools_versions/android-sdk/tools/0000755000175000017500000000000014620351546025140 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/get_android_tools_versions/android-sdk/tools/source.properties0000644000175000017500000000021214620351225030543 0ustar00hanshansPkg.UserSrc=false Pkg.Revision=26.1.1 Platform.MinPlatformToolsRev=20 Pkg.Dependencies=emulator Pkg.Path=tools Pkg.Desc=Android SDK Tools ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.920383 fdroidserver-2.3a1/tests/gnupghome/0000755000175000017500000000000014620351546016143 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/gnupghome/pubring.gpg0000644000175000017500000000132414620351225020302 0ustar00hanshansXEUݺЧʜo#tV"ʖD-oY_)H8СAuIhG#r Mbp% 0.bN<|to?1(4X(p ʴnf 4'rUQFake F-Droid Test Signing Key (never use this for anything but tests) "X   q;Wʼ`~IH.3*>ׁ֦7֜ F"$=@0_h r +[E&wt |;dDcs怜^j4R!D}qw*9^XȤoWUV[gMm2xœ *e-u_n/Qx$u1R;ZvNsg S‚]6k?DƿΟA)iοn팣C52 S X qnfEtz 36[\M"CS 2tM1PȾ* =DBxxǛN!%1!:D kW?m''] ).-././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/gnupghome/random_seed0000644000175000017500000000113014620351225020333 0ustar00hanshans].)l$*aqyF~PLs5?=X:j'3`mDC3E UYX#)}tپ2=K- U[QXnڼpMpA5#r_ xK!3@wl;/V^p*"ʧc͈꧇{ʜFՅ=P 4YP2G@iOJs,T'vzv`ޮ*vSEza8S'`uphR`Zp?1>xjw(QzLr *3:t `ZBDr|rWZ!!C"$dC[| S!f\X*A9> l7c_m$wK9l? 05 &xd~'_ڽ/'B5tVQܟj> ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/gnupghome/secring.gpg0000644000175000017500000000255414620351225020274 0ustar00hanshansXEUݺЧʜo#tV"ʖD-oY_)H8СAuIhG#r Mbp% 0.bN<|to?1(4X(p ʴnf 4'rUOwA6'3NcZE]#^63c(_@7z*RST^GWet ̺L. t果g ym #pk!IQ.("940R& 4~66. gH_͜o.)XGl!;b8`$H2l5hXFwdئІHQag'S=f(~Ьp`lZ,$K qS:AfMy7$mT#rT?6>TG_@-G7\@ձ1Қ>{-CM> %P:QFake F-Droid Test Signing Key (never use this for anything but tests) "X   q;Wʼ`~IH.3*>ׁ֦7֜ F"$=@0_h r +[E&wt |;dDcs怜^j4R!D}qw*9^XȤoWUV[gMm2xœ *e-u_n/Qx$u1R;ZvNsg S‚]6k?DƿΟA)iοn팣C52 S; b4} 7ln~Hbf=21ºfg z6w$Dm۝gmlsoQgFR Тiyv5D9%<8QA5R"USǻ`%'4-7ffV,kޘ?}S 4k`,Ҷ#Sa/9ԛ*J_+eKYjjN29R <3#qA7D7c|j ۘ_#)ynF(HE.{=j7GeɁu[9Z5A qؙF? ؈ X qnfEtz 36[\M"CS 2tM1PȾ* =DBxxǛN!%1!:D kW?m''] ).-././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/gnupghome/trustdb.gpg0000644000175000017500000000240014620351225020317 0ustar00hanshansgpgXI  uf:5q `o2ܟr޺mCD[e././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/gradle-maven-blocks.yaml0000644000175000017500000014007314620351225020652 0ustar00hanshans- "\tmaven {\n\t\t\turl \"$rootDir/../node_modules/react-native-background-fetch/android/libs\"\ \n\t\t}" - "\tmaven {\n\t\t\turl \"https://plugins.gradle.org/m2/\"\n\t\t}" - "\tmaven {\n\t\t\turl 'http://4thline.org/m2'\n\t\t}" - "\tmaven {\n\t\t\turl 'https://maven.google.com/'\n\t\t\tname 'Google'\n\t\t}" - "\tmaven {\n\t\turl \"file://$pwd/.m2repo\"\n\t}" - "\tmaven {\n\t\turl \"https://jitpack.io\"\n\t}" - "\tmaven {\n\t\turl 'https://maven.google.com/'\n\t\tname 'Google'\n\t}" - "\tmaven {\n\t url 'https://maven.google.com'\n\t}" - "\tmaven { url \"http://JRAF.org/static/maven/2\" }" - "\tmaven { url \"http://dl.bintray.com/populov/maven\" }" - "\tmaven { url \"https://jitpack.io\" }" - "\tmaven { url 'http://maven.ghostscript.com/' }" - "\tmaven { url 'https://jitpack.io' }" - "\tmaven { url 'https://maven.fabric.io/public' }" - "\tmaven { url MAVEN_REPO }" - " maven {\n\t url 'https://jitpack.io'\n }" - " maven {\n url rootProject.ext.mavenRepo\n \ \ if (!rootProject.ext.mavenRepo.startsWith(\"file\")) {\n \ \ credentials {\n username rootProject.ext.mavenUser\n\ \ password rootProject.ext.mavenPassword\n \ \ }" - " maven {\n // All of React Native (JS, Obj-C sources, Android binaries)\ \ is installed from npm\n url \"$rootDir/libs/gutenberg-mobile/node_modules/react-native/android\"\ \n }" - " maven {\n url \"file:~/.m2/\"\n artifactUrls \"\ file:~/.m2/\"\n }" - " maven {\n url \"https://maven-central-asia.storage-download.googleapis.com/repos/central/data/\"\ \n content {\n excludeGroup(\"Kotlin/Native\"\ )\n }" - " maven {\n url \"https://maven-central-asia.storage-download.googleapis.com/repos/central/data/\"\ \n }" - " maven {\n url \"https://plugins.gradle.org/m2/\"\n }" - " maven {\n url \"https://repo.commonsware.com.s3.amazonaws.com\"\ \n }" - " maven {\n url 'https://maven.fabric.io/public'\n }" - " maven {\n // All of React Native (JS, Android binaries) is installed\ \ from npm\n url \"$rootDir/react/node_modules/react-native/android\"\ \n }" - " maven {\n // All of React Native (JS, Obj-C sources, Android binaries)\ \ is installed from npm\n // url \"$rootDir/../node_modules/react-native/android\"\ \n\n // Replace AAR from original RN with AAR from react-native-v8\n\ \ url(\"$rootDir/../node_modules/react-native-v8/dist\")\n }" - " maven {\n // All of React Native (JS, Obj-C sources, Android binaries)\ \ is installed from npm\n url \"$rootDir/../node_modules/react-native/android\"\ \n }" - " maven {\n // All of React Native (JS, Obj-C sources, Android binaries)\ \ is installed from npm\n url(\"$rootDir/../node_modules/react-native/android\"\ )\n }" - " maven {\n // Android JSC is installed from npm\n url(\"\ $rootDir/../node_modules/jsc-android/dist\")\n }" - " maven {\n // Android JSC is installed from npm\n url(\"\ $rootDir/react/node_modules/jsc-android/dist\")\n }" - " maven {\n // Local Maven repo containing AARs with JSC library built\ \ for Android\n // url \"$rootDir/../node_modules/jsc-android/dist\"\n\ \n // prebuilt libv8android.so\n url(\"$rootDir/../node_modules/v8-android/dist\"\ )\n }" - " maven {\n // Local Maven repo containing AARs with JSC library built\ \ for Android\n url \"$rootDir/../node_modules/jsc-android/dist\"\n \ \ }" - " maven {\n //noinspection GroovyAssignabilityCheck\n url\ \ 'https://jitpack.io'\n }" - " maven {\n //noinspection GroovyAssignabilityCheck\n url\ \ 'https://s3.amazonaws.com/moat-sdk-builds'\n }" - " maven {\n //url 'https://maven.google.com/'\n url 'https://jitpack.io'\n\ \ name 'Google'\n }" - " maven {\n name 'glide-snapshot'\n url 'http://oss.sonatype.org/content/repositories/snapshots'\n\ \ }" - " maven {\n name 'glide-snapshot'\n url 'https://oss.sonatype.org/content/repositories/snapshots'\n\ \ }" - " maven {\n name = \"sonatype\"\n\n def releasesRepoUrl =\ \ \"https://oss.sonatype.org/service/local/staging/deploy/maven2/\"\n \ \ def snapshotsRepoUrl = \"https://oss.sonatype.org/content/repositories/snapshots/\"\ \n url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl\n\ \n credentials {\n username ossrhUsername\n \ \ password ossrhPassword\n }" - " maven {\n url \"http://developer.huawei.com/repo/\"\n }" - " maven {\n url \"http://dl.bintray.com/dasar/maven\"\n }" - " maven {\n url \"http://dl.bintray.com/jenzz/maven\"\n }" - " maven {\n url \"http://dl.bintray.com/journeyapps/maven\"\n \ \ }" - " maven {\n url \"http://dl.bintray.com/lukaville/maven\"\n }" - " maven {\n url \"http://dl.bintray.com/ona/kujaku\"\n }" - " maven {\n url \"http://dl.bintray.com/piasy/maven\"\n content\ \ {\n includeGroupByRegex \"com\\\\.github\\\\.piasy\"\n \ \ }" - " maven {\n url \"http://kotlin.bintray.com/kotlin-dev\"\n \ \ content {\n excludeGroup(\"Kotlin/Native\")\n }" - " maven {\n url \"http://oss.sonatype.org/content/repositories/snapshots\"\ \n }" - " maven {\n url \"https://clojars.org/repo/\"\n }" - " maven {\n url \"https://dl.bintray.com/kotlin/ktor\"\n content\ \ {\n excludeGroup(\"Kotlin/Native\")\n }" - " maven {\n url \"https://dl.bintray.com/soywiz/soywiz\"\n \ \ content {\n excludeGroup(\"Kotlin/Native\")\n }" - " maven {\n url \"https://dl.bintray.com/wire-android/third-party\"\n\ \ }" - " maven {\n url \"https://github.com/vector-im/jitsi_libre_maven/raw/master/releases\"\ \n }" - " maven {\n url \"https://jitpack.io\"\n\n }" - " maven {\n url \"https://jitpack.io\"\n content {\n \ \ // For some reason gradle attempts to get bugsnag from here, which returns\ \ 522\n // after which gradle just drops jitpack. Exclude so it doesn't\ \ bother trying.\n excludeGroupByRegex \".*bugsnag.*\"\n \ \ }" - " maven {\n url \"https://jitpack.io\"\n content {\n \ \ excludeGroup(\"Kotlin/Native\")\n }" - " maven {\n url \"https://jitpack.io\"\n }" - " maven {\n url \"https://jitpack.io/\"\n }" - " maven {\n url \"https://kotlin.bintray.com/kotlinx\"\n content\ \ {\n excludeGroup(\"Kotlin/Native\")\n }" - " maven {\n url \"https://maven-central-asia.storage-download.googleapis.com/repos/central/data/\"\ \n }" - " maven {\n url \"https://maven.fabric.io/public\"\n }" - " maven {\n url \"https://maven.google.com\"\n name 'Google'\n\ \ }" - " maven {\n url \"https://maven.google.com\"\n }" - " maven {\n url \"https://maven.google.com/\"\n }" - " maven {\n url \"https://maven.mozilla.org/maven2\"\n }" - " maven {\n url \"https://oss.sonatype.org/content/repositories/snapshots\"\ \n }" - " maven {\n url \"https://oss.sonatype.org/content/repositories/snapshots/\"\ \n }" - " maven {\n url \"https://plugins.gradle.org/m2/\"\n }" - " maven {\n url \"https://repo1.maven.org/maven2\"\n jcenter()\n\ \ }" - " maven {\n url \"https://s3.amazonaws.com/repo.commonsware.com\"\n \ \ }" - " maven {\n url \"https://s3.amazonaws.com/repo.commonsware.com\"\n \ \ }" - " maven {\n url \"https://snapshots.maven.mozilla.org/maven2\"\n \ \ }" - " maven {\n url '${mavenUrl}" - " maven {\n url 'http://maven.aliyun.com/nexus/content/repositories/releases/'\n\ \ }" - " maven {\n url 'http://oss.sonatype.org/content/repositories/snapshots'\n\ \ }" - " maven {\n url 'http://oss.sonatype.org/content/repositories/snapshots/'\n\ \ }" - " maven {\n url 'http://www.idescout.com/maven/repo/'\n name\ \ 'IDEScout, Inc.'\n }" - " maven {\n url 'http://www.idescout.com/maven/repo/'\n }" - " maven {\n url 'https://clojars.org/repo'\n }" - " maven {\n url 'https://dl.bintray.com/alexeydanilov/maven'\n \ \ }" - " maven {\n url 'https://dl.bintray.com/drummer-aidan/maven'\n \ \ }" - " maven {\n url 'https://dl.bintray.com/kotlin/kotlin-eap'\n \ \ content {\n excludeGroup(\"Kotlin/Native\")\n }" - " maven {\n url 'https://github.com/suckgamony/RapidDecoder/raw/master/repository'\n\ \ }" - " maven {\n url 'https://github.com/uPhyca/stetho-realm/raw/master/maven-repo'\n\ \ }" - " maven {\n url 'https://jitpack.io'\n content {\n \ \ // Use this repo only for matrix SDK library\n includeGroupByRegex\ \ \"com\\\\.github\\\\.Bubu\"\n // Also add subgroups, due to SDK\ \ split into modules\n includeGroupByRegex \"com\\\\.github\\\\.Bubu\\\ \\.matrix-android-sdk\"\n // And Olm library\n includeGroupByRegex\ \ \"org\\\\.matrix\\\\.gitlab\\\\.matrix-org\"\n // And PhotoView\n\ \ includeGroupByRegex \"com\\\\.github\\\\.chrisbanes\"\n \ \ }" - " maven {\n url 'https://jitpack.io'\n content {\n \ \ // Use this repo only for olm library\n includeGroupByRegex\ \ \"org\\\\.matrix\\\\.gitlab\\\\.matrix-org\"\n // And also for\ \ FilePicker\n includeGroupByRegex \"com\\\\.github\\\\.jaiselrahman\"\ \n // And monarchy\n includeGroupByRegex \"com\\\\\ .github\\\\.Zhuinden\"\n // And ucrop\n includeGroupByRegex\ \ \"com\\\\.github\\\\.yalantis\"\n // JsonViewer\n \ \ includeGroupByRegex 'com\\\\.github\\\\.BillCarsonFr'\n }" - " maven {\n url 'https://jitpack.io'\n }" - " maven {\n url 'https://jitpack.io/'\n }" - " maven {\n url 'https://maven.aliyun.com/repository/google'\n \ \ name 'replace google()'\n }" - " maven {\n url 'https://maven.aliyun.com/repository/jcenter'\n \ \ name 'replace jcenter()'\n }" - " maven {\n url 'https://maven.aliyun.com/repository/public'\n \ \ name 'replace jcenter() and mavenCentral()'\n }" - " maven {\n url 'https://maven.fabric.io/public'\n }" - " maven {\n url 'https://maven.google.com'\n // Alternative\ \ URL is 'https://dl.google.com/dl/android/maven2/'\n }" - " maven {\n url 'https://maven.google.com'\n }" - " maven {\n url 'https://maven.google.com/'\n name 'Google'\n\ \ }" - " maven {\n url 'https://maven.google.com/'\n }" - " maven {\n url 'https://oss.sonatype.org/content/groups/public'\n \ \ }" - " maven {\n url 'https://oss.sonatype.org/content/repositories/snapshots'\n\ \ }" - " maven {\n url 'https://oss.sonatype.org/content/repositories/snapshots/'\n\ \ content {\n excludeGroup(\"Kotlin/Native\")\n \ \ }" - " maven {\n url 'https://oss.sonatype.org/content/repositories/snapshots/'\n\ \ }" - " maven {\n url 'https://plugins.gradle.org/m2'\n }" - " maven {\n url 'https://plugins.gradle.org/m2/'\n }" - " maven {\n url 'https://www.jitpack.io'\n }" - " maven {\n url rootProject.ext.mavenRepo\n if (!rootProject.ext.mavenRepo.startsWith(\"\ file\")) {\n credentials {\n username rootProject.ext.mavenUser\n\ \ password rootProject.ext.mavenPassword\n }" - " maven {\n url 'https://maven.fabric.io/public'\n }" - " maven {\n url 'https://maven.google.com/'\n }" - " maven {\n credentials {\n username System.env.ANDVIANE_USERNAME\n password System.env.ANDVIANE_PASSWORD\n }\n //url 'https://oss.sonatype.org/content/repositories/snapshots'\n url 'https://oss.sonatype.org/service/local/staging/deploy/maven2'\n }" - " maven {\n // CUTR Releases\n url \"https://github.com/CUTR-at-USF/cutr-mvn-repo/raw/master/snapshots\"\ \n }" - " maven {\n // Git project library as local library project (ucrop) - see\ \ https://jitpack.io/docs/\n url 'https://jitpack.io'\n }" - " maven {\n // Need manual cleanup for new SNAPSHOT update if same name with\ \ date change only:\n // Smack official SNAPSHOT repository accepted by F-Droid\n\ \ url 'https://oss.sonatype.org/content/repositories/snapshots'\n\n \ \ // Smack custom library for org.igniterealtime - not recognize by F-Droid\n\ \ // url 'https://igniterealtime.org/repo/'\n\n // Custom library\ \ for org.jitsi - maven-metadata.xml not compatible\n // Unable to load Maven\ \ meta-data from https://github.com/jitsi/jitsi-maven-repository/tree/master/snapshots/org/jitsi/ice4j/2.0.0-SNAPSHOT/maven-metadata.xml.\n\ \ // org.xml.sax.SAXParseException; lineNumber: 44; columnNumber: 91; Attribute\ \ name \"data-pjax-transient\" associated with an element type \"meta\" must be\ \ followed by the ' = ' character.\n // url 'https://github.com/jitsi/jitsi-maven-repository/tree/master/snapshots'\n\ \ }" - " maven {\n // OBA Releases - for comparator to sort alphanumeric routes\n\ \ url \"http://nexus.onebusaway.org/nexus/content/repositories/releases\"\ \n }" - " maven {\n // TODO: Remove this after support library v24 public release.\n\ \ url \"$rootDir/prebuilts/fullsdk/extras/android/m2repository\"\n }" - " maven {\n // This maven repo contains artifacts for Flutter's Android embedding.\n\ \ url 'http://download.flutter.io'\n }" - " maven {\n // This maven repo is created when you run `flutter build aar`.\ \ It contains compiled code\n // and resources for flutter_module itself.\n\ \ url '../../flutter_module/build/host/outputs/repo'\n }" - " maven {\n // Used only for PhotoView\n url \"https://jitpack.io\"\ \n name 'JitPack Github wrapper'\n }" - " maven {\n // for Amazon Maps\n url uri('../.m2/repository')\n \ \ }" - " maven {\n // for testlib\n url \"http://dl.bintray.com/acrowntest/ES_SDK\"\ \n }" - " maven {\n //url 'https://maven.google.com/'\n url 'https://jitpack.io'\n\ \ name 'Google'\n }" - " maven {\n url \"http://4thline.org/m2\"\n }" - " maven {\n url \"http://maven.chunyu.mobi/content/groups/public/\"\n \ \ credentials {\n username maven_user\n password maven_password\n\ \ }" - " maven {\n url \"https://dl.google.com/dl/android/maven2/\"\n }" - " maven {\n url \"https://jitpack.io\"\n }" - " maven {\n url \"https://maven.fabric.io/public\"\n }" - " maven {\n url \"https://maven.google.com\"\n }" - " maven {\n url \"https://oss.sonatype.org/content/repositories/releases\"\ \n }" - " maven {\n url \"https://oss.sonatype.org/content/repositories/snapshots\"\ \n }" - " maven {\n url \"https://repo.eclipse.org/content/repositories/paho-releases/\"\ \n }" - " maven {\n url '../..'\n }" - " maven {\n url 'https://dl.bintray.com/amulyakhare/maven'\n }" - " maven {\n url 'https://github.com/Goddchen/mvn-repo/raw/master/'\n }" - " maven {\n url 'https://jitpack.io'\n }" - " maven {\n url 'https://maven.fabric.io/public'\n }" - " maven {\n url 'https://maven.google.com'\n // Alternative URL is\ \ 'https://dl.google.com/dl/android/maven2/'\n url \"https://jitpack.io\"\ \n }" - " maven {\n url 'https://maven.google.com'\n }" - " maven {\n url 'https://maven.google.com/'\n name 'Google'\n }" - " maven {\n url 'https://oss.sonatype.org/content/repositories/snapshots'\n\ \ }" - " maven {\n url 'https://oss.sonatype.org/content/repositories/snapshots/'\n\ \ }" - " maven {\n url 'https://raw.githubusercontent.com/felixb/mvn-repo/master'\n\ \ }" - " maven {\n url 'third_party/m2'\n }" - " maven {\n url xwalkMavenRepo\n }" - " maven {\n url(\"https://maven.fabric.io/public\")\n }" - " maven {\n url(\"https://oss.sonatype.org/content/repositories/snapshots\"\ )\n }" - " maven {\n url \"$buildDir/repo\"\n }" - " maven {\n url \"https://jitpack.io\"\n }" - " maven {\n url \"https://maven.google.com\"\n }" - " maven {\n url \"https://oss.sonatype.org/content/repositories/snapshots/\"\ \n }" - " maven {\n url \"https://plugins.gradle.org/m2/\"\n }" - " maven {\n url 'http://download.crashlytics.com/maven'\n }" - " maven {\n url 'https://clojars.org/repo/'\n }" - " maven {\n url 'https://maven.fabric.io/public'\n }" - " maven {\n url 'https://oss.sonatype.org/content/repositories/snapshots/'\n\ \ }" - " maven {\n url 'https://raw.github.com/ark/ark/master/releases/'\n }" - " maven {\n url 'https://raw.github.com/iFixit/ark/master/releases/'\n }" - " maven {\n setUrl(\"https://plugins.gradle.org/m2/\")\n }" - " maven {\n url 'https://maven.google.com'\n }" - ' maven { // url "https://jitpack.io" // url "https://maven-central.storage.googleapis.com" // url "http://repo.spring.io/plugins-release/" // }' - ' maven { url "https://maven.google.com" }' - ' maven { setUrl("https://www.jitpack.io") }' - ' maven { url "https://dl.bintray.com/bjoernq/maven" }' - ' maven { url "https://dl.bintray.com/ligi/maven" }' - ' maven { url "https://dl.bintray.com/lukaville/maven" }' - ' maven { url "https://jetbrains.bintray.com/trove4j" }' - ' maven { url "$rootDir/../node_modules/react-native/android" }' - ' maven { url "file:///home/snowdream/workspace/git/mvn-repo/releases/" }' - ' maven { url "file:///home/snowdream/workspace/git/mvn-repo/snapshots/" }' - ' maven { url "http://dl.bintray.com/arturbosch/code-analysis" }' - ' maven { url "http://dl.bintray.com/countly/maven" }' - ' maven { url "http://dl.bintray.com/drummer-aidan/maven" }' - ' maven { url "http://dl.bintray.com/drummer-aidan/maven/com/afollestad" }' - ' maven { url "http://dl.bintray.com/lukaville/maven" }' - ' maven { url "http://dl.bintray.com/mobisystech/maven" }' - ' maven { url "http://dl.bintray.com/populov/maven" }' - ' maven { url "http://kotlin.bintray.com/kotlin-dev" }' - ' maven { url "http://maven.batch.com/release" }' - ' maven { url "http://objectbox.net/beta-repo/" }' - ' maven { url "http://oss.sonatype.org/content/repositories/snapshots/" }' - ' maven { url "http://repo.commonsware.com.s3.amazonaws.com" }' - ' maven { url "http://repo1.maven.org/maven2" }' - ' maven { url "http://repository.apache.org/snapshots/" }' - ' maven { url "http://snowdream.github.io/mvn-repo/releases/" }' - ' maven { url "http://snowdream.github.io/mvn-repo/snapshots/" }' - ' maven { url "http://storage.googleapis.com/r8-releases/raw/master" }' - ' maven { url "https://clojars.org/repo" }' - ' maven { url "https://clojars.org/repo/" }' - ' maven { url "https://dl.bintray.com/acra/maven" }' - ' maven { url "https://dl.bintray.com/asf/asf" }' - ' maven { url "https://dl.bintray.com/badoo/maven" }' - ' maven { url "https://dl.bintray.com/dasar/maven" }' - ' maven { url "https://dl.bintray.com/drummer-aidan/maven" }' - ' maven { url "https://dl.bintray.com/florent37/maven" }' - ' maven { url "https://dl.bintray.com/gericop/maven" }' - ' maven { url "https://dl.bintray.com/kotlin/ktor" }' - ' maven { url "https://dl.bintray.com/markusamshove/maven" }' - ' maven { url "https://dl.bintray.com/mockito/maven" }' - ' maven { url "https://dl.bintray.com/robstoll/tutteli-jars" }' - ' maven { url "https://dl.bintray.com/videolan/Android" }' - ' maven { url "https://dl.bintray.com/wire-android/releases" }' - ' maven { url "https://dl.bintray.com/wire-android/releases/" }' - ' maven { url "https://dl.bintray.com/wire-android/snapshots" }' - ' maven { url "https://dl.bintray.com/wire-android/snapshots/" }' - ' maven { url "https://dl.bintray.com/wire-android/third-party" }' - ' maven { url "https://dl.bintray.com/wire-android/third-party/" }' - ' maven { url "https://dl.bintray.com/wordpress-mobile/maven" }' - ' maven { url "https://dl.bintray.com/wordpress-mobile/react-native-mirror/" }' - ' maven { url "https://fusesource.github.io/jansi/" }' - ' maven { url "https://giphy.bintray.com/giphy-sdk" }' - ' maven { url "https://github.com/jitsi/jitsi-maven-repository/raw/master/releases" }' - ' maven { url "https://jcenter.bintray.com" }' - " maven { url \"https://jitpack.io\"\n }" - ' maven { url "https://jitpack.io" }' - ' maven { url "https://jitpack.io"}' - ' maven { url "https://kotlin.bintray.com/kotlinx" }' - ' maven { url "https://mapbox.bintray.com/mapbox" }' - ' maven { url "https://maven-central-asia.storage-download.googleapis.com/repos/central/data/" }' - ' maven { url "https://maven.fabric.io/public" }' - " maven { url \"https://maven.google.com\"\n }" - ' maven { url "https://maven.google.com" }' - ' maven { url "https://maven.google.com"}' - ' maven { url "https://maven.google.com/" }' - ' maven { url "https://oss.sonatype.org/content/groups/public" }' - ' maven { url "https://oss.sonatype.org/content/groups/public/" }' - ' maven { url "https://oss.sonatype.org/content/repositories/releases/" }' - ' maven { url "https://oss.sonatype.org/content/repositories/snapshots" }' - ' maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }' - ' maven { url "https://plugins.gradle.org/m2" }' - ' maven { url "https://plugins.gradle.org/m2/" }' - ' maven { url "https://plugins.gradle.org/m2/"}' - ' maven { url "https://raw.githubusercontent.com/guardianproject/gpmaven/master" }' - ' maven { url "https://repo.commonsware.com.s3.amazonaws.com" }' - ' maven { url "https://repo.eclipse.org/content/groups/releases" }' - ' maven { url "https://repo.maven.apache.org/maven2" }' - ' maven { url "https://repo1.maven.org/maven2/" }' - ' maven { url "https://s3.amazonaws.com/moat-sdk-builds" }' - ' maven { url "https://s3.amazonaws.com/repo.commonsware.com" }' - ' maven { url "https://www.jitpack.io" }' - ' maven { url ''file:///usr/share/maven-repo'' }' - ' maven { url ''http://dl.bintray.com/amulyakhare/maven'' }' - ' maven { url ''http://download.crashlytics.com/maven'' }' - ' maven { url ''http://guardian.github.com/maven/repo-releases'' }' - ' maven { url ''http://igniterealtime.org/repo'' }' - ' maven { url ''http://maven.ghostscript.com/'' }' - ' maven { url ''http://nexus.testobject.org/nexus/content/repositories/testobject-public-alpha-repo'' }' - ' maven { url ''http://oss.sonatype.org/content/repositories/snapshots'' }' - ' maven { url ''http://repo1.maven.org/maven2'' }' - ' maven { url ''http://wordpress-mobile.github.io/WordPress-Android'' }' - ' maven { url ''https://dl.bintray.com/badoo/maven'' }' - ' maven { url ''https://dl.bintray.com/content/simonpoole/android'' }' - ' maven { url ''https://dl.bintray.com/content/simonpoole/div'' }' - ' maven { url ''https://dl.bintray.com/content/simonpoole/osm'' }' - ' maven { url ''https://dl.bintray.com/florent37/maven'' }' - ' maven { url ''https://dl.bintray.com/intercom/intercom-maven'' }' - ' maven { url ''https://dl.bintray.com/jenly/maven'' }' - ' maven { url ''https://dl.bintray.com/jetbrains/anko'' }' - ' maven { url ''https://dl.bintray.com/kotlin/kotlin-eap'' }' - ' maven { url ''https://dl.bintray.com/twofortyfouram/maven'' }' - ' maven { url ''https://dl.bintray.com/umsdk/release'' }' - ' maven { url ''https://dl.google.com/dl/android/maven2/'' }' - ' maven { url ''https://github.com/FireZenk/maven-repo/raw/master/'' }' - ' maven { url ''https://github.com/uPhyca/stetho-realm/raw/master/maven-repo'' }' - ' maven { url ''https://guardian.github.com/maven/repo-releases'' }' - ' maven { url ''https://igniterealtime.org/repo'' }' - ' maven { url ''https://jitpack.io'' }' - ' maven { url ''https://jitpack.io/'' }' - ' maven { url ''https://maven.fabric.io/public'' }' - ' maven { url ''https://maven.fabric.io/repo'' }' - ' maven { url ''https://maven.google.com'' }' - ' maven { url ''https://maven.google.com/'' }' - ' maven { url ''https://oss.jfrog.org/artifactory/oss-snapshot-local/'' }' - ' maven { url ''https://oss.sonatype.org/content/repositories/releases/'' }' - ' maven { url ''https://oss.sonatype.org/content/repositories/snapshots'' }' - ' maven { url ''https://oss.sonatype.org/content/repositories/snapshots/'' }' - ' maven { url ''https://plugins.gradle.org/m2/'' }' - ' maven { url ''https://plugins.gradle.org/m2/''}' - ' maven { url ''https://repo1.maven.org/maven2'' }' - ' maven { url ''https://repos.zeroturnaround.com/nexus/content/repositories/zt-public-releases'' }' - ' maven { url ''https://repository-achartengine.forge.cloudbees.com/snapshot/'' }' - ' maven { url ''https://s3.amazonaws.com/repo.commonsware.com'' }' - ' maven { url ''https://www.jitpack.io'' }' - ' maven { url ''https://zendesk.jfrog.io/zendesk/repo'' }' - ' maven { url ''libs'' }' - ' maven { url = "https://storage.googleapis.com/r8-releases/raw" }' - ' maven { url = uri("https://jitpack.io") }' - ' maven { url = uri("https://maven.fabric.io/public") }' - ' maven { url MAVEN_REPO_CACHE }' - ' maven { url(''http://releases.marmeladburk.fidesmo.com/'') }' - ' maven {url "http://dl.bintray.com/tbruyelle/tbruyelle" }' - ' maven {url "https://jitpack.io"}' - ' maven {url ''http://maven.aliyun.com/nexus/content/groups/public/''}' - " maven{\n url 'https://maven.fabric.io/public'\n }" - " maven{\n url'https://plugins.gradle.org/m2/'\n }" - " maven{\n url \"https://maven.google.com\"\n }" - " maven{\n url 'https://maven.google.com'\n }" - ' maven{ url "https://oss.sonatype.org/content/repositories/releases/" }' - ' maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" }' - ' maven{ url ''http://maven.aliyun.com/nexus/content/groups/public/''}' - ' maven{ url ''https://jitpack.io'' }' - ' maven{ url ''https://maven.aliyun.com/repository/google'' }' - ' maven{ url ''https://maven.aliyun.com/repository/google''}' - ' maven{ url ''https://maven.aliyun.com/repository/gradle-plugin''}' - ' maven{ url ''https://maven.aliyun.com/repository/jcenter'' }' - ' maven{ url ''https://maven.aliyun.com/repository/jcenter''}' - ' maven{ url ''https://maven.aliyun.com/repository/public''}' - ' maven{url "https://plugins.gradle.org/m2/"}' - ' maven{url ''http://maven.aliyun.com/nexus/content/groups/public''}' - "\tmaven {\n\t\t\t\turl \"https://oss.sonatype.org/content/repositories/snapshots\"\ \n\t\t\t}" - "\tmaven {\n\t\t\turl \"$rootDir/../node_modules/react-native-background-fetch/android/libs\"\ \n\t\t}" - "\tmaven {\n\t\t\turl \"https://jitpack.io\"\n\t\t}" - "\tmaven {\n\t\t\turl \"https://plugins.gradle.org/m2/\"\n\t\t}" - "\tmaven {\n\t\t\turl 'http://4thline.org/m2'\n\t\t}" - "\tmaven {\n\t\t\turl 'https://maven.google.com/'\n\t\t\tname 'Google'\n\t\t}" - "\tmaven {\n\t\t\turl 'https://plugins.gradle.org/m2/'\n\t\t}" - "\tmaven {\n\t\turl \"file://$pwd/.m2repo\"\n\t}" - "\tmaven {\n\t\turl \"https://jitpack.io\"\n\t}" - "\tmaven {\n\t\turl 'https://maven.google.com/'\n\t\tname 'Google'\n\t}" - "\tmaven {\n // Google Maven Repository\n url 'https://maven.google.com'\n\ \ }" - "\tmaven { url \"http://dl.bintray.com/populov/maven\" }" - "\tmaven { url \"https://jitpack.io\" }" - "\tmaven { url 'http://download.crashlytics.com/maven' }" - "\tmaven { url 'http://maven.ghostscript.com/' }" - "\tmaven { url 'https://jitpack.io' }" - "\tmaven { url 'https://maven.fabric.io/public' }" - "\tmaven { url MAVEN_REPO }" - ' maven { url "http://repo1.maven.org/maven2" }' - " maven {\n\t url 'https://jitpack.io'\n }" - " maven {\n\t url System.getenv()['ANDROID_HOME'] + \"/extras/android/m2repository\"\ \n }" - " maven {\n url \"$buildDir/repo\"\n }" - " maven {\n url \"file:~/.m2/\"\n artifactUrls \"\ file:~/.m2/\"\n }" - " maven {\n url \"https://oss.sonatype.org/content/repositories/snapshots\"\ \n }" - " maven {\n url \"https://plugins.gradle.org/m2/\"\n }" - " maven {\n url 'https://maven.fabric.io/public'\n }" - " maven {\n url repository\n }" - " maven {\n // All of React Native (JS, Obj-C sources, Android binaries)\ \ is installed from npm\n // url \"$rootDir/../node_modules/react-native/android\"\ \n\n // Replace AAR from original RN with AAR from react-native-v8\n\ \ url(\"$rootDir/../node_modules/react-native-v8/dist\")\n }" - " maven {\n // All of React Native (JS, Obj-C sources, Android binaries)\ \ is installed from npm\n url \"$projectDir/../../node_modules/react-native/android\"\ \n }" - " maven {\n // All of React Native (JS, Obj-C sources, Android binaries)\ \ is installed from npm\n url \"$projectDir/../../tests/react-test-app/node_modules/react-native/android\"\ \n }" - " maven {\n // All of React Native (JS, Obj-C sources, Android binaries)\ \ is installed from npm\n url \"$rootDir/../node_modules/react-native/android\"\ \n }" - " maven {\n // All of React Native (JS, Obj-C sources, Android binaries)\ \ is installed from npm\n url(\"$rootDir/../node_modules/react-native/android\"\ )\n }" - " maven {\n // Android JSC is installed from npm\n url(\"\ $rootDir/../node_modules/jsc-android/dist\")\n }" - " maven {\n // Local Maven repo containing AARs with JSC library built\ \ for Android\n // url \"$rootDir/../node_modules/jsc-android/dist\"\n\ \n // prebuilt libv8android.so\n url(\"$rootDir/../node_modules/v8-android/dist\"\ )\n }" - " maven {\n //noinspection GroovyAssignabilityCheck\n url\ \ 'https://jitpack.io'\n }" - " maven {\n //noinspection GroovyAssignabilityCheck\n url\ \ 'https://s3.amazonaws.com/moat-sdk-builds'\n }" - " maven {\n //url 'https://maven.google.com/'\n url 'https://jitpack.io'\n\ \ name 'Google'\n }" - " maven {\n name 'glide-snapshot'\n url 'http://oss.sonatype.org/content/repositories/snapshots'\n\ \ }" - " maven {\n url \"http://dl.bintray.com/countly/maven\"\n }" - " maven {\n url \"./maven_repository/\"\n }" - " maven {\n url \"http://dl.bintray.com/dasar/maven\"\n }" - " maven {\n url \"http://dl.bintray.com/jenzz/maven\"\n }" - " maven {\n url \"http://dl.bintray.com/journeyapps/maven\"\n \ \ }" - " maven {\n url \"http://dl.bintray.com/lukaville/maven\"\n }" - " maven {\n url \"https://clojars.org/repo/\"\n }" - " maven {\n url \"https://dl.bintray.com/videolan/Android\"\n \ \ }" - " maven {\n url \"https://github.com/jitsi/jitsi-maven-repository/raw/master/releases\"\ \n }" - " maven {\n url \"https://github.com/vector-im/jitsi_libre_maven/raw/master/releases\"\ \n }" - " maven {\n url \"https://jcenter.bintray.com\"\n }" - " maven {\n url \"https://jitpack.io\"\n\n }" - " maven {\n url \"https://jitpack.io\"\n content {\n \ \ // For some reason gradle attempts to get bugsnag from here, which returns\ \ 522\n // after which gradle just drops jitpack. Exclude so it doesn't\ \ bother trying.\n excludeGroupByRegex \".*bugsnag.*\"\n \ \ }" - " maven {\n url \"https://jitpack.io\"\n }" - " maven {\n url \"https://jitpack.io/\"\n }" - " maven {\n url \"https://maven.fabric.io/public\"\n }" - " maven {\n url \"https://maven.google.com\"\n name 'Google'\n\ \ }" - " maven {\n url \"https://maven.google.com\"\n }" - " maven {\n url \"https://maven.google.com/\"\n name 'Google'\n\ \ }" - " maven {\n url \"https://maven.mozilla.org/maven2\"\n }" - " maven {\n url \"https://oss.sonatype.org/content/repositories/snapshots\"\ \n }" - " maven {\n url \"https://oss.sonatype.org/content/repositories/snapshots/\"\ \n }" - " maven {\n url \"https://plugins.gradle.org/m2/\"\n }" - " maven {\n url \"https://repo1.maven.org/maven2\"\n jcenter()\n\ \ }" - " maven {\n url \"https://repo1.maven.org/maven2\"\n }" - " maven {\n url \"https://s3.amazonaws.com/repo.commonsware.com\"\n \ \ }" - " maven {\n url \"https://s3.amazonaws.com/repo.commonsware.com\"\n \ \ }" - " maven {\n url 'http://oss.sonatype.org/content/repositories/snapshots'\n\ \ }" - " maven {\n url 'http://oss.sonatype.org/content/repositories/snapshots/'\n\ \ }" - " maven {\n url 'http://www.idescout.com/maven/repo/'\n name\ \ 'IDEScout, Inc.'\n }" - " maven {\n url 'https://github.com/suckgamony/RapidDecoder/raw/master/repository'\n\ \ }" - " maven {\n url 'https://jitpack.io'\n content {\n \ \ // Use this repo only for matrix SDK library\n includeGroupByRegex\ \ \"com\\\\.github\\\\.Bubu\"\n // Also add subgroups, due to SDK\ \ split into modules\n includeGroupByRegex \"com\\\\.github\\\\.Bubu\\\ \\.matrix-android-sdk\"\n // And Olm library\n includeGroupByRegex\ \ \"org\\\\.matrix\\\\.gitlab\\\\.matrix-org\"\n // And PhotoView\n\ \ includeGroupByRegex \"com\\\\.github\\\\.chrisbanes\"\n \ \ }" - " maven {\n url 'https://jitpack.io'\n content {\n \ \ // Use this repo only for matrix SDK library\n includeGroupByRegex\ \ \"com\\\\.github\\\\.matrix-org\"\n // Also add subgroups, due\ \ to SDK split into modules\n includeGroupByRegex \"com\\\\.github\\\ \\.matrix-org\\\\.matrix-android-sdk\"\n // And Olm library\n \ \ includeGroupByRegex \"org\\\\.matrix\\\\.gitlab\\\\.matrix-org\"\n\ \ // And PhotoView\n includeGroupByRegex \"com\\\\\ .github\\\\.chrisbanes\"\n }" - " maven {\n url 'https://jitpack.io'\n }" - " maven {\n url 'https://maven.fabric.io/public'\n }" - " maven {\n url 'https://maven.google.com'\n }" - " maven {\n url 'https://maven.google.com/'\n name 'Google'\n\ \ }" - " maven {\n url 'https://maven.google.com/'\n }" - " maven {\n url 'https://mint.splunk.com/gradle/'\n }" - " maven {\n url 'https://oss.sonatype.org/content/groups/public'\n \ \ }" - " maven {\n url 'https://oss.sonatype.org/content/repositories/snapshots'\n\ \ }" - " maven {\n url 'https://oss.sonatype.org/content/repositories/snapshots/'\n\ \ }" - " maven {\n url 'https://plugins.gradle.org/m2/'\n }" - " maven {\n url 'https://www.jitpack.io'\n }" - " maven {\n url = \"${project.buildDir}" - " maven {\n url(\"$rootDir/../node_modules/jsc-android/dist\")\n \ \ }" - " maven {\n url(\"$rootDir/../node_modules/react-native/android\")\n\ \ }" - " maven {\n // For the latest version of GeckoView (moving target!) use:\n\ \ // https://index.taskcluster.net/v1/task/gecko.v2.mozilla-central.nightly.latest.mobile.android-api-16-opt/artifacts/public/android/maven\n\ \ //\n // For discovering available versions go to:\n // \ \ https://tools.taskcluster.net/index/gecko.v2.mozilla-central.nightly\n\n \ \ // ARM GeckoView builds\n url \"https://index.taskcluster.net/v1/task/gecko.v2.mozilla-central.nightly\"\ \ +\n \".${geckoview_nightly_date}" - " maven {\n // Replace snapshots by releases for releases !\n url\ \ \"https://linphone.org/snapshots/maven_repository\"\n }" - " maven {\n // Switch to release for releases !\n url \"https://gitlab.linphone.org/BC/public/maven_repository/raw/master\"\ \n }" - " maven {\n // TODO: Remove this after support library v24 public release.\n\ \ url \"$rootDir/prebuilts/fullsdk/extras/android/m2repository\"\n }" - " maven {\n // Used only for PhotoView\n url \"https://jitpack.io\"\ \n name 'JitPack Github wrapper'\n }" - " maven {\n // aarch64 builds\n url \"https://index.taskcluster.net/v1/task/gecko.v2.mozilla-central.nightly\"\ \ +\n \".${geckoview_nightly_date}" - " maven {\n // x86 GeckoView builds\n url \"https://index.taskcluster.net/v1/task/gecko.v2.mozilla-central.nightly\"\ \ +\n \".${geckoview_nightly_date}" - " maven {\n //url 'https://maven.google.com/'\n url 'https://jitpack.io'\n\ \ name 'Google'\n }" - " maven {\n url \"http://4thline.org/m2\"\n }" - " maven {\n url \"http://dl.bintray.com/lukaville/maven\"\n }" - " maven {\n url \"https://dl.google.com/dl/android/maven2/\"\n }" - " maven {\n url \"https://jitpack.io\"\n }" - " maven {\n url \"https://linphone.org/maven_repository\"\n }" - " maven {\n url \"https://maven.fabric.io/public\"\n }" - " maven {\n url \"https://maven.google.com\"\n }" - " maven {\n url \"https://oss.sonatype.org/content/repositories/snapshots\"\ \n }" - " maven {\n url \"https://repo.commonsware.com.s3.amazonaws.com\"\n }" - " maven {\n url \"https://repo1.maven.org/maven2/\"\n }" - " maven {\n url 'http://4thline.org/m2'\n }" - " maven {\n url 'http://dl.bintray.com/amulyakhare/maven'\n }" - " maven {\n url 'https://dl.bintray.com/amulyakhare/maven'\n }" - " maven {\n url 'https://github.com/Goddchen/mvn-repo/raw/master/'\n }" - " maven {\n url 'https://github.com/toxbee/mvn-repo/raw/master/maven-deploy'\n\ \ }" - " maven {\n url 'https://jitpack.io'\n }" - " maven {\n url 'https://maven.fabric.io/public'\n }" - " maven {\n url 'https://maven.google.com'\n // Alternative URL is\ \ 'https://dl.google.com/dl/android/maven2/'\n url \"https://jitpack.io\"\ \n }" - " maven {\n url 'https://maven.google.com'\n }" - " maven {\n url 'https://maven.google.com/'\n name 'Google'\n }" - " maven {\n url 'https://oss.sonatype.org/content/repositories/snapshots'\n\ \ }" - " maven {\n url 'https://oss.sonatype.org/content/repositories/snapshots/'\n\ \ }" - " maven {\n url 'https://raw.github.com/nicolasjafelle/maven-repo/master/'\n\ \ }" - " maven {\n url 'https://raw.githubusercontent.com/felixb/mvn-repo/master'\n\ \ }" - " maven {\n url xwalkMavenRepo\n }" - " maven {\n url \"https://github.com/Goddchen/mvn-repo/raw/master/\"\n }" - " maven {\n url \"https://github.com/dahlgren/abs-aar/raw/master\"\n }" - " maven {\n url \"https://jcenter.bintray.com\"\n }" - " maven {\n url \"https://repo.commonsware.com.s3.amazonaws.com\"\n }" - " maven {\n url 'http://download.crashlytics.com/maven'\n }" - " maven {\n url 'https://maven.google.com/'\n name 'Google'\n }" - " maven {\n url 'https://raw.github.com/ark/ark/master/releases/'\n }" - " maven {\n url 'https://raw.github.com/iFixit/ark/master/releases/'\n }" - " maven {\n setUrl(\"https://plugins.gradle.org/m2/\")\n }" - " maven {\n url 'https://maven.google.com'\n }" - ' maven { // url "https://jitpack.io" // url "https://maven-central.storage.googleapis.com" // url "http://repo.spring.io/plugins-release/" // }' - ' maven { url "https://maven.google.com" }' - ' maven { setUrl("https://plugins.gradle.org/m2/") }' - ' maven { setUrl("https://www.jitpack.io") }' - ' maven { url "http://dl.bintray.com/dasar/maven" }' - ' maven { url "https://dl.bintray.com/bjoernq/maven" }' - ' maven { url "https://dl.bintray.com/ligi/maven" }' - ' maven { url "https://dl.bintray.com/lukaville/maven" }' - ' maven { url "https://jetbrains.bintray.com/trove4j" }' - ' maven { url "$rootDir/../node_modules/react-native/android" }' - ' maven { url "file:${rootProject.projectDir}' - ' maven { url "http://dl.bintray.com/amulyakhare/maven" }' - ' maven { url "http://dl.bintray.com/arturbosch/code-analysis" }' - ' maven { url "http://dl.bintray.com/countly/maven" }' - ' maven { url "http://dl.bintray.com/davideas/maven" }' - ' maven { url "http://dl.bintray.com/drummer-aidan/maven" }' - ' maven { url "http://dl.bintray.com/drummer-aidan/maven/com/afollestad" }' - ' maven { url "http://dl.bintray.com/lukaville/maven" }' - ' maven { url "http://dl.bintray.com/populov/maven" }' - ' maven { url "http://objectbox.net/beta-repo/" }' - ' maven { url "http://repo.commonsware.com.s3.amazonaws.com" }' - ' maven { url "http://repo.maven.apache.org/maven2" }' - ' maven { url "https://clojars.org/repo" }' - ' maven { url "https://clojars.org/repo/" }' - ' maven { url "https://dl.bintray.com/android/android-tools/" }' - ' maven { url "https://dl.bintray.com/drummer-aidan/maven" }' - ' maven { url "https://dl.bintray.com/markusamshove/maven" }' - ' maven { url "https://dl.bintray.com/mockito/maven/" }' - ' maven { url "https://dl.bintray.com/osborn/Android" }' - ' maven { url "https://github.com/jitsi/jitsi-maven-repository/raw/master/releases" }' - ' maven { url "https://jcenter.bintray.com" }' - " maven { url \"https://jitpack.io\"\n }" - ' maven { url "https://jitpack.io" }' - ' maven { url "https://jitpack.io"}' - ' maven { url "https://kotlin.bintray.com/kotlinx" }' - ' maven { url "https://maven.fabric.io/public" }' - " maven { url \"https://maven.google.com\"\n }" - ' maven { url "https://maven.google.com" }' - ' maven { url "https://maven.google.com"}' - ' maven { url "https://maven.google.com/" }' - ' maven { url "https://oss.sonatype.org/content/groups/public" }' - ' maven { url "https://oss.sonatype.org/content/groups/public/" }' - ' maven { url "https://oss.sonatype.org/content/repositories/releases/" }' - ' maven { url "https://oss.sonatype.org/content/repositories/snapshots" }' - ' maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }' - ' maven { url "https://plugins.gradle.org/m2" }' - ' maven { url "https://plugins.gradle.org/m2/" }' - ' maven { url "https://plugins.gradle.org/m2/"}' - ' maven { url "https://repo.commonsware.com.s3.amazonaws.com" }' - ' maven { url "https://repo.commonsware.com.s3.amazonaws.com"}' - ' maven { url "https://repo.eclipse.org/content/groups/releases" }' - ' maven { url "https://repo.maven.apache.org/maven2" }' - ' maven { url "https://repository.aspose.com/repo/" }' - ' maven { url "https://s3.amazonaws.com/repo.commonsware.com" }' - ' maven { url "https://www.jitpack.io" }' - ' maven { url ''../../prebuilts/gradle-plugin'' }' - ' maven { url ''../../prebuilts/tools/common/m2/internal'' }' - ' maven { url ''../../prebuilts/tools/common/m2/repository'' }' - ' maven { url ''file:///usr/share/maven-repo'' }' - ' maven { url ''http://dl.bintray.com/amulyakhare/maven'' }' - ' maven { url ''http://download.crashlytics.com/maven'' }' - ' maven { url ''http://guardian.github.com/maven/repo-releases'' }' - ' maven { url ''http://igniterealtime.org/repo'' }' - ' maven { url ''http://repo1.maven.org/maven2'' }' - ' maven { url ''http://wordpress-mobile.github.io/WordPress-Android'' }' - ' maven { url ''https://dl.bintray.com/content/simonpoole/android'' }' - ' maven { url ''https://dl.bintray.com/content/simonpoole/div'' }' - ' maven { url ''https://dl.bintray.com/content/simonpoole/osm'' }' - ' maven { url ''https://dl.bintray.com/twofortyfouram/maven'' }' - ' maven { url ''https://dl.google.com/dl/android/maven2/'' }' - ' maven { url ''https://guardian.github.com/maven/repo-releases'' }' - ' maven { url ''https://igniterealtime.org/repo'' }' - ' maven { url ''https://jitpack.io'' }' - ' maven { url ''https://jitpack.io/'' }' - ' maven { url ''https://maven.fabric.io/public'' }' - ' maven { url ''https://maven.fabric.io/repo'' }' - ' maven { url ''https://maven.google.com'' }' - ' maven { url ''https://maven.google.com''}' - ' maven { url ''https://maven.google.com/'' }' - ' maven { url ''https://oss.jfrog.org/artifactory/oss-snapshot-local/'' }' - ' maven { url ''https://oss.sonatype.org/content/repositories/snapshots'' }' - ' maven { url ''https://oss.sonatype.org/content/repositories/snapshots/'' }' - ' maven { url ''https://plugins.gradle.org/m2/'' }' - ' maven { url ''https://repo1.maven.org/maven2'' /*maven-central with HTTPS*/}' - ' maven { url ''https://repo1.maven.org/maven2'' }' - ' maven { url ''https://repository-achartengine.forge.cloudbees.com/snapshot/'' }' - ' maven { url ''https://s3.amazonaws.com/repo.commonsware.com'' }' - ' maven { url ''https://www.jitpack.io'' }' - ' maven { url ''libs'' }' - ' maven { url = uri("https://jitpack.io") }' - ' maven { url = uri("https://maven.fabric.io/public") }' - ' maven { url = URI("https://jitpack.io") }' - ' maven { url MAVEN_REPO_CACHE }' - ' maven { url(''http://releases.marmeladburk.fidesmo.com/'') }' - ' maven {url "http://dl.bintray.com/tbruyelle/tbruyelle" }' - ' maven {url "https://clojars.org/repo/"}' - ' maven {url "https://jitpack.io"}' - " maven{\n url 'https://maven.fabric.io/public'\n }" - " maven{\n url'https://plugins.gradle.org/m2/'\n }" - " maven{\n url \"https://maven.google.com\"\n }" - ' maven{ url "https://oss.sonatype.org/content/repositories/releases/" }' - ' maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" }' - ' maven{ url ''https://jitpack.io'' }' - ' maven{ url ''https://maven.aliyun.com/repository/google''}' - ' maven{ url ''https://maven.aliyun.com/repository/gradle-plugin''}' - ' maven{ url ''https://maven.aliyun.com/repository/jcenter''}' - ' maven{ url ''https://maven.aliyun.com/repository/public''}' - ' maven{url "https://jitpack.io"}' - ' maven{url "https://plugins.gradle.org/m2/"}' - ' maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")' - ' maven(url = "https://maven.pkg.jetbrains.space/public/p/kotlinx-html/maven")' - ' maven ( url = "https://jitpack.io")' - ' maven( url = "https://oss.sonatype.org/content/repositories/snapshots/" )' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/gradle-release-checksums.py0000755000175000017500000001337714620351225021373 0ustar00hanshans#!/usr/bin/env python3 import git import gitlab import os import re import requests import subprocess import sys from colorama import Fore, Style from packaging.version import Version checksums = None versions = dict() while not checksums: r = requests.get( 'https://gitlab.com/fdroid/gradle-transparency-log/-/raw/master/checksums.json', timeout=300, ) if r.status_code == 200: checksums = r.json() gradle_bin_pat = re.compile(r'gradle-([0-9][0-9.]+[0-9])-bin.zip') for url, d in checksums.items(): m = gradle_bin_pat.search(url) if m: versions[m.group(1)] = d[0]['sha256'] errors = 0 makebuildserver = os.path.join(os.path.dirname(__file__), os.pardir, 'makebuildserver') with open(makebuildserver) as fp: makebuildserver_current = fp.read() to_compile = re.search(r'CACHE_FILES = [^\]]+\]', makebuildserver_current).group() code = compile(to_compile, makebuildserver, 'exec') config = {} exec(code, None, config) # nosec this is just a CI script makebuildserver_versions = [] version_pat = re.compile(r'[0-9]+(\.[0-9]+)+') for url, checksum in config['CACHE_FILES']: if 'gradle.org' in url: m = version_pat.search(url.split('/')[-1]) if m: makebuildserver_versions.append(m.group()) if checksum != versions[m.group()]: print(Fore.RED + 'ERROR: checksum mismatch:', checksum, versions[m.group()] + Style.RESET_ALL) errors += 1 # error if makebuildserver is missing the latest version for version in sorted(versions.keys()): if version not in makebuildserver_versions \ and Version(version) > Version(sorted(makebuildserver_versions)[-1]): add_before = """ ('https://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin',""" new = to_compile.replace( add_before, " ('https://services.gradle.org/distributions/gradle-" + version + "-bin.zip',\n" " '" + versions[version] + "'),\n" + add_before ) makebuildserver_current = makebuildserver_current.replace(to_compile, new) with open('makebuildserver', 'w') as fp: fp.write(makebuildserver_current) # write out update to gradlew-fdroid with open('gradlew-fdroid') as fp: gradlew_fdroid = fp.read() current = '' get_sha_pat = re.compile(r""" +'([0-9][0-9.]+[0-9])'\)\s+echo '([0-9a-f]{64})' ;;\n""") for m in get_sha_pat.finditer(gradlew_fdroid): current += m.group() checksum = m.group(2) if checksum != versions[m.group(1)]: print(Fore.RED + 'ERROR: checksum mismatch:', checksum, versions[m.group(1)] + Style.RESET_ALL) errors += 1 new = '' for version in sorted(versions.keys(), key=Version): sha256 = versions[version] spaces = '' for i in range(6 - len(version)): spaces += ' ' new += """ '%s')%s echo '%s' ;;\n""" % (version, spaces, sha256) gradlew_fdroid = gradlew_fdroid.replace(current, new) plugin_v = ' '.join(sorted(versions.keys(), key=Version, reverse=True)) plugin_v_pat = re.compile(r'\nplugin_v=\(([0-9. ]+)\)') with open('gradlew-fdroid', 'w') as fp: fp.write(plugin_v_pat.sub('\nplugin_v=(%s)' % plugin_v, gradlew_fdroid)) if os.getenv('CI_PROJECT_NAMESPACE') != 'fdroid': p = subprocess.run(['git', '--no-pager', 'diff']) print(p.stdout) sys.exit(errors) # This only runs after commits are pushed to fdroid/fdroidserver git_repo = git.repo.Repo('.') modified = git_repo.git().ls_files(modified=True).split() if git_repo.is_dirty() and ('gradlew-fdroid' in modified or 'makebuildserver' in modified): private_token = os.getenv('PERSONAL_ACCESS_TOKEN') if not private_token: print(Fore.RED + 'ERROR: GitLab Token not found in PERSONAL_ACCESS_TOKEN!' + Style.RESET_ALL) sys.exit(1) branch = git_repo.create_head(os.path.basename(__file__), force=True) branch.checkout() git_repo.index.add(['gradlew-fdroid', 'makebuildserver']) author = git.Actor('fdroid-bot', 'fdroid-bot@f-droid.org') git_repo.index.commit('gradle v' + version, author=author) project_path = 'fdroid-bot/' + os.getenv('CI_PROJECT_NAME') url = ('https://gitlab-ci-token:%s@%s/%s.git' % (os.getenv('PERSONAL_ACCESS_TOKEN'), os.getenv('CI_SERVER_HOST'), project_path)) remote_name = 'fdroid-bot' try: remote = git_repo.create_remote(remote_name, url) # See https://github.com/PyCQA/pylint/issues/2856 . # pylint: disable-next=no-member except git.exc.GitCommandError: remote = git.remote.Remote(git_repo, remote_name) remote.set_url(url) remote.push(force=True) git.remote.Remote.rm(git_repo, remote_name) gl = gitlab.Gitlab(os.getenv('CI_SERVER_URL'), api_version=4, private_token=private_token) project = gl.projects.get(project_path, lazy=True) description = ( 'see ' '\n\n

generated by GitLab CI Job #%s

' % (os.getenv('CI_PROJECT_URL'), os.getenv('CI_JOB_ID'), os.getenv('CI_JOB_ID')) ) try: mr = project.mergerequests.create({ 'source_branch': branch.name, 'target_project_id': 36527, # fdroid/fdroidserver 'target_branch': 'master', 'title': 'update to gradle v' + version, 'description': description, 'labels': ['fdroid-bot', 'gradle'], 'remove_source_branch': True, }) mr.save() except gitlab.exceptions.GitlabCreateError as e: if e.response_code == 409: # Another open merge request already exists for this source branch print(e.error_message) else: raise e ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/import_subcommand.TestCase0000755000175000017500000001436614620351225021340 0ustar00hanshans#!/usr/bin/env python3 # http://www.drdobbs.com/testing/unit-testing-with-python/240165163 import git import logging import os import shutil import sys import tempfile import unittest import yaml from unittest import mock from pathlib import Path import requests localmodule = Path(__file__).resolve().parent.parent print('localmodule: ' + str(localmodule)) if localmodule not in sys.path: sys.path.insert(0, str(localmodule)) import fdroidserver.common import fdroidserver.import_subcommand import fdroidserver.metadata from fdroidserver.exception import FDroidException from testcommon import TmpCwd, mkdtemp, parse_args_for_test class ImportTest(unittest.TestCase): '''fdroid import''' def setUp(self): logging.basicConfig(level=logging.DEBUG) self.basedir = localmodule / 'tests' os.chdir(self.basedir) self._td = mkdtemp() self.testdir = self._td.name def tearDown(self): os.chdir(self.basedir) self._td.cleanup() def test_import_gitlab(self): with tempfile.TemporaryDirectory() as testdir, TmpCwd(testdir): # FDroidPopen needs some config to work config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config url = 'https://gitlab.com/fdroid/ci-test-app' r = requests.head(url, timeout=300) if r.status_code != 200: print("ERROR", url, 'unreachable (', r.status_code, ')') print('Skipping ImportTest!') return app = fdroidserver.import_subcommand.get_app_from_url(url) fdroidserver.import_subcommand.clone_to_tmp_dir(app) self.assertEqual(app.RepoType, 'git') self.assertEqual(app.Repo, 'https://gitlab.com/fdroid/ci-test-app.git') def test_get_app_from_url(self): with tempfile.TemporaryDirectory() as testdir, TmpCwd(testdir): testdir = Path(testdir) (testdir / 'tmp').mkdir() tmp_importer = testdir / 'tmp/importer' data = ( ( 'cn.wildfirechat.chat', 'https://github.com/wildfirechat/android-chat', '0.6.9', 23, ), ( 'com.anpmech.launcher', 'https://github.com/KeikaiLauncher/KeikaiLauncher', 'Unknown', None, ), ( 'ut.ewh.audiometrytest', 'https://github.com/ReeceStevens/ut_ewh_audiometer_2014', '1.65', 14, ), ) for appid, url, vn, vc in data: shutil.rmtree( tmp_importer, onerror=fdroidserver.import_subcommand.handle_retree_error_on_windows, ) shutil.copytree(self.basedir / 'source-files' / appid, tmp_importer) app = fdroidserver.import_subcommand.get_app_from_url(url) with mock.patch( 'fdroidserver.common.getvcs', lambda a, b, c: fdroidserver.common.vcs(url, testdir), ), mock.patch( 'fdroidserver.common.vcs.gotorevision', lambda s, rev: None ), mock.patch( 'shutil.rmtree', lambda a, onerror=None: None ): build_dir = fdroidserver.import_subcommand.clone_to_tmp_dir(app) self.assertEqual('git', app.RepoType) self.assertEqual(url, app.Repo) self.assertEqual(url, app.SourceCode) logging.info(build_dir) paths = fdroidserver.common.get_all_gradle_and_manifests(build_dir) self.assertNotEqual(paths, []) ( versionName, versionCode, package, ) = fdroidserver.common.parse_androidmanifests(paths, app) self.assertEqual(vn, versionName) self.assertEqual(vc, versionCode) self.assertEqual(appid, package) def test_bad_urls(self): for url in ( 'asdf', 'file://thing.git', 'https:///github.com/my/project', 'git:///so/many/slashes', 'ssh:/notabug.org/missing/a/slash', 'git:notabug.org/missing/some/slashes', 'https//github.com/bar/baz', ): with self.assertRaises(ValueError): fdroidserver.import_subcommand.get_app_from_url(url) @mock.patch('sys.argv', ['fdroid import', '-u', 'https://example.com/mystery/url']) @mock.patch('fdroidserver.import_subcommand.clone_to_tmp_dir', lambda a: None) def test_unrecognized_url(self): """Test whether error is thrown when the RepoType was not found. clone_to_tmp_dir is mocked out to prevent this test from using the network, if it gets past the code that throws the error. """ with self.assertRaises(FDroidException): fdroidserver.import_subcommand.main() @mock.patch('sys.argv', ['fdroid import', '-u', 'https://fake/git/url.git']) @mock.patch( 'fdroidserver.import_subcommand.clone_to_tmp_dir', lambda a, r: Path('td') ) def test_main_local_git(self): os.chdir(self.testdir) git.Repo.init('td') with Path('td/build.gradle').open('w') as fp: fp.write('android { defaultConfig { applicationId "com.example" } }') fdroidserver.import_subcommand.main() with open('metadata/com.example.yml') as fp: data = yaml.safe_load(fp) self.assertEqual(data['Repo'], sys.argv[2]) self.assertEqual(data['RepoType'], 'git') self.assertEqual(1, len(data['Builds'])) if __name__ == "__main__": import argparse parser = argparse.ArgumentParser() parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(ImportTest)) unittest.main(failfast=False) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/index.TestCase0000755000175000017500000011615714620351225016726 0ustar00hanshans#!/usr/bin/env python3 import copy import datetime import glob import inspect import logging import os import sys import unittest import yaml import zipfile from unittest.mock import patch import requests import tempfile import json import shutil localmodule = os.path.realpath( os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') ) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) import fdroidserver from fdroidserver import common, index, publish, signindex, update from testcommon import TmpCwd, mkdtemp, parse_args_for_test from pathlib import Path GP_FINGERPRINT = 'B7C2EEFD8DAC7806AF67DFCD92EB18126BC08312A7F2D6F3862E46013C7A6135' class Options: nosign = True pretty = False verbose = False class IndexTest(unittest.TestCase): @classmethod def setUpClass(cls): cls.basedir = os.path.join(localmodule, 'tests') # TODO something should remove cls.index_v1_jar, but it was # causing the tests to be flaky. There seems to be something # that is running the background somehow, maybe sign_index() # exits before jarsigner actually finishes? cls.index_v1_jar = os.path.join(cls.basedir, 'repo', 'index-v1.jar') def setUp(self): logging.basicConfig(level=logging.ERROR) os.chmod(os.path.join(self.basedir, 'config.py'), 0o600) os.chdir(self.basedir) # so read_config() can find config.py common.config = None common.options = Options config = common.read_config() config['jarsigner'] = common.find_sdk_tools_cmd('jarsigner') common.config = config signindex.config = config update.config = config self._td = mkdtemp() self.testdir = self._td.name def tearDown(self): self._td.cleanup() def _sign_test_index_v1_jar(self): if not os.path.exists(self.index_v1_jar): signindex.sign_index(os.path.dirname(self.index_v1_jar), 'index-v1.json') def test_get_public_key_from_jar_succeeds(self): source_dir = os.path.join(self.basedir, 'signindex') for f in ('testy.jar', 'guardianproject.jar'): testfile = os.path.join(source_dir, f) jar = zipfile.ZipFile(testfile) _, fingerprint = index.get_public_key_from_jar(jar) # comparing fingerprints should be sufficient if f == 'testy.jar': self.assertEqual( fingerprint, '818E469465F96B704E27BE2FEE4C63AB' + '9F83DDF30E7A34C7371A4728D83B0BC1', ) if f == 'guardianproject.jar': self.assertTrue(fingerprint == GP_FINGERPRINT) def test_get_public_key_from_jar_fails(self): source_dir = os.path.join(self.basedir, 'signindex') testfile = os.path.join(source_dir, 'unsigned.jar') jar = zipfile.ZipFile(testfile) with self.assertRaises(index.VerificationException): index.get_public_key_from_jar(jar) def test_download_repo_index_no_fingerprint(self): with self.assertRaises(index.VerificationException): index.download_repo_index("http://example.org") def test_download_repo_index_no_jar(self): with self.assertRaises(requests.exceptions.RequestException): index.download_repo_index("http://example.org?fingerprint=nope") def test_get_repo_key_fingerprint(self): self._sign_test_index_v1_jar() pubkey, fingerprint = index.extract_pubkey() ( data, public_key, public_key_fingerprint, ) = index.get_index_from_jar( 'repo/index-v1.jar', fingerprint, allow_deprecated=True ) self.assertIsNotNone(data) self.assertIsNotNone(public_key) self.assertIsNotNone(public_key_fingerprint) def test_get_index_from_jar_with_bad_fingerprint(self): pubkey, fingerprint = index.extract_pubkey() fingerprint = fingerprint[:-1] + 'G' with self.assertRaises(fdroidserver.exception.VerificationException): index.get_index_from_jar( 'repo/index-v1.jar', fingerprint, allow_deprecated=True ) def test_get_index_from_jar_with_chars_to_be_stripped(self): self._sign_test_index_v1_jar() fingerprint = 'NOOOO F4 9A F3 F1 1E FD DF 20 DF FD 70 F5 E3 11 7B 99 76 67 41 67 AD CA 28 0E 6B 19 32 A0 60 1B 26 F6' index.get_index_from_jar( 'repo/index-v1.jar', fingerprint, allow_deprecated=True ) @patch('requests.head') def test_download_repo_index_same_etag(self, head): url = 'http://example.org?fingerprint=test' etag = '"4de5-54d840ce95cb9"' head.return_value.headers = {'ETag': etag} data, new_etag = index.download_repo_index(url, etag=etag) self.assertIsNone(data) self.assertEqual(etag, new_etag) @patch('requests.get') @patch('requests.head') def test_download_repo_index_new_etag(self, head, get): url = 'http://example.org?fingerprint=' + GP_FINGERPRINT etag = '"4de5-54d840ce95cb9"' # fake HTTP answers head.return_value.headers = {'ETag': 'new_etag'} get.return_value.headers = {'ETag': 'new_etag'} get.return_value.status_code = 200 testfile = os.path.join('signindex', 'guardianproject-v1.jar') with open(testfile, 'rb') as file: get.return_value.content = file.read() data, new_etag = index.download_repo_index(url, etag=etag) # assert that the index was retrieved properly self.assertEqual('Guardian Project Official Releases', data['repo']['name']) self.assertEqual(GP_FINGERPRINT, data['repo']['fingerprint']) self.assertTrue(len(data['repo']['pubkey']) > 500) self.assertEqual(10, len(data['apps'])) self.assertEqual(10, len(data['packages'])) self.assertEqual('new_etag', new_etag) @patch('fdroidserver.net.http_get') def test_download_repo_index_url_parsing(self, mock_http_get): """Test whether it is trying to download the right file This passes the URL back via the etag return value just as a hack to check which URL was actually attempted. """ mock_http_get.side_effect = lambda url, etag, timeout: (None, url) repo_url = 'https://fake.url/fdroid/repo' index_url = 'https://fake.url/fdroid/repo/index-v1.jar' fingerprint_url = 'https://fake.url/fdroid/repo?fingerprint=' + GP_FINGERPRINT slash_url = 'https://fake.url/fdroid/repo//?fingerprint=' + GP_FINGERPRINT for url in (repo_url, index_url, fingerprint_url, slash_url): ilist = index.download_repo_index(url, verify_fingerprint=False) self.assertEqual(index_url, ilist[1]) # etag item used to return URL @patch('fdroidserver.net.http_get') def test_download_repo_index_v2_url_parsing(self, mock_http_get): """Test whether it is trying to download the right file This passes the URL back via the etag return value just as a hack to check which URL was actually attempted. """ mock_http_get.side_effect = lambda url, etag, timeout: (None, url) repo_url = 'https://fake.url/fdroid/repo' entry_url = 'https://fake.url/fdroid/repo/entry.jar' index_url = 'https://fake.url/fdroid/repo/index-v2.json' fingerprint_url = 'https://fake.url/fdroid/repo?fingerprint=' + GP_FINGERPRINT slash_url = 'https://fake.url/fdroid/repo//?fingerprint=' + GP_FINGERPRINT for url in (repo_url, entry_url, index_url, fingerprint_url, slash_url): ilist = index.download_repo_index_v2(url, verify_fingerprint=False) self.assertEqual(entry_url, ilist[1]) # etag item used to return URL @patch('fdroidserver.net.http_get') def test_download_repo_index_v2(self, mock_http_get): def http_get_def(url, etag, timeout): # pylint: disable=unused-argument f = os.path.basename(url) with open(os.path.join(self.testdir, 'repo', f), 'rb') as fp: return (fp.read(), 'fakeetag') mock_http_get.side_effect = http_get_def os.chdir(self.testdir) signindex.config['keystore'] = os.path.join(self.basedir, 'keystore.jks') os.mkdir('repo') shutil.copy(os.path.join(self.basedir, 'repo', 'entry.json'), 'repo') shutil.copy(os.path.join(self.basedir, 'repo', 'index-v2.json'), 'repo') signindex.sign_index('repo', 'entry.json') repo_url = 'https://fake.url/fdroid/repo' entry_url = 'https://fake.url/fdroid/repo/entry.jar' index_url = 'https://fake.url/fdroid/repo/index-v2.json' fingerprint_url = 'https://fake.url/fdroid/repo?fingerprint=' + GP_FINGERPRINT slash_url = 'https://fake.url/fdroid/repo//?fingerprint=' + GP_FINGERPRINT for url in (repo_url, entry_url, index_url, fingerprint_url, slash_url): data, _ignored = index.download_repo_index_v2(url, verify_fingerprint=False) self.assertEqual(['repo', 'packages'], list(data.keys())) @patch('fdroidserver.net.http_get') def test_download_repo_index_v2_bad_fingerprint(self, mock_http_get): def http_get_def(url, etag, timeout): # pylint: disable=unused-argument f = os.path.basename(url) with open(os.path.join(self.testdir, 'repo', f), 'rb') as fp: return (fp.read(), 'fakeetag') mock_http_get.side_effect = http_get_def os.chdir(self.testdir) signindex.config['keystore'] = os.path.join(self.basedir, 'keystore.jks') os.mkdir('repo') shutil.copy(os.path.join(self.basedir, 'repo', 'entry.json'), 'repo') shutil.copy(os.path.join(self.basedir, 'repo', 'index-v2.json'), 'repo') signindex.sign_index('repo', 'entry.json') bad_fp = '0123456789001234567890012345678900123456789001234567890012345678' bad_fp_url = 'https://fake.url/fdroid/repo?fingerprint=' + bad_fp with self.assertRaises(fdroidserver.exception.VerificationException): data, _ignored = index.download_repo_index_v2(bad_fp_url) @patch('fdroidserver.net.http_get') def test_download_repo_index_v2_entry_verify(self, mock_http_get): def http_get_def(url, etag, timeout): # pylint: disable=unused-argument return (b'not the entry.jar file contents', 'fakeetag') mock_http_get.side_effect = http_get_def url = 'https://fake.url/fdroid/repo?fingerprint=' + GP_FINGERPRINT with self.assertRaises(fdroidserver.exception.VerificationException): data, _ignored = index.download_repo_index_v2(url) @patch('fdroidserver.net.http_get') def test_download_repo_index_v2_index_verify(self, mock_http_get): def http_get_def(url, etag, timeout): # pylint: disable=unused-argument return (b'not the index-v2.json file contents', 'fakeetag') mock_http_get.side_effect = http_get_def os.chdir(self.testdir) signindex.config['keystore'] = os.path.join(self.basedir, 'keystore.jks') os.mkdir('repo') shutil.copy(os.path.join(self.basedir, 'repo', 'entry.json'), 'repo') shutil.copy(os.path.join(self.basedir, 'repo', 'index-v2.json'), 'repo') signindex.sign_index('repo', 'entry.json') url = 'https://fake.url/fdroid/repo?fingerprint=' + GP_FINGERPRINT with self.assertRaises(fdroidserver.exception.VerificationException): data, _ignored = index.download_repo_index_v2(url) def test_v1_sort_packages(self): i = [ { 'packageName': 'org.smssecure.smssecure', 'apkName': 'org.smssecure.smssecure_134.apk', 'signer': 'b33a601a9da97c82e6eb121eb6b90adab561f396602ec4dc8b0019fb587e2af6', 'versionCode': 134, }, { 'packageName': 'org.smssecure.smssecure', 'apkName': 'org.smssecure.smssecure_134_b30bb97.apk', 'signer': 'b30bb971af0d134866e158ec748fcd553df97c150f58b0a963190bbafbeb0868', 'versionCode': 134, }, { 'packageName': 'b075b32b4ef1e8a869e00edb136bd48e34a0382b85ced8628f164d1199584e4e' }, { 'packageName': '43af70d1aca437c2f9974c4634cc5abe45bdc4d5d71529ac4e553488d3bb3ff6' }, { 'packageName': 'org.smssecure.smssecure', 'apkName': 'org.smssecure.smssecure_135_b30bb97.apk', 'signer': 'b30bb971af0d134866e158ec748fcd553df97c150f58b0a963190bbafbeb0868', 'versionCode': 135, }, { 'packageName': 'org.smssecure.smssecure', 'apkName': 'org.smssecure.smssecure_135.apk', 'signer': 'b33a601a9da97c82e6eb121eb6b90adab561f396602ec4dc8b0019fb587e2af6', 'versionCode': 135, }, { 'packageName': 'org.smssecure.smssecure', 'apkName': 'org.smssecure.smssecure_133.apk', 'signer': 'b33a601a9da97c82e6eb121eb6b90adab561f396602ec4dc8b0019fb587e2af6', 'versionCode': 133, }, { 'packageName': 'org.smssecure.smssecure', 'apkName': 'smssecure-weird-version.apk', 'signer': '99ff99ff99ff99ff99ff99ff99ff99ff99ff99ff99ff99ff99ff99ff99ff99ff', 'versionCode': 133, }, { 'packageName': 'org.smssecure.smssecure', 'apkName': 'smssecure-custom.apk', 'signer': '1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef', 'versionCode': 133, }, { 'packageName': 'org.smssecure.smssecure', 'apkName': 'smssecure-new-custom.apk', 'signer': '1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef', 'versionCode': 135, }, ] o = [ { 'packageName': '43af70d1aca437c2f9974c4634cc5abe45bdc4d5d71529ac4e553488d3bb3ff6' }, { 'packageName': 'b075b32b4ef1e8a869e00edb136bd48e34a0382b85ced8628f164d1199584e4e' }, # app test data # # packages with reproducible developer signature { 'packageName': 'org.smssecure.smssecure', 'apkName': 'org.smssecure.smssecure_135_b30bb97.apk', 'signer': 'b30bb971af0d134866e158ec748fcd553df97c150f58b0a963190bbafbeb0868', 'versionCode': 135, }, { 'packageName': 'org.smssecure.smssecure', 'apkName': 'org.smssecure.smssecure_134_b30bb97.apk', 'signer': 'b30bb971af0d134866e158ec748fcd553df97c150f58b0a963190bbafbeb0868', 'versionCode': 134, }, # # packages build and signed by fdroid { 'packageName': 'org.smssecure.smssecure', 'apkName': 'org.smssecure.smssecure_135.apk', 'signer': 'b33a601a9da97c82e6eb121eb6b90adab561f396602ec4dc8b0019fb587e2af6', 'versionCode': 135, }, { 'packageName': 'org.smssecure.smssecure', 'apkName': 'org.smssecure.smssecure_134.apk', 'signer': 'b33a601a9da97c82e6eb121eb6b90adab561f396602ec4dc8b0019fb587e2af6', 'versionCode': 134, }, { 'packageName': 'org.smssecure.smssecure', 'apkName': 'org.smssecure.smssecure_133.apk', 'signer': 'b33a601a9da97c82e6eb121eb6b90adab561f396602ec4dc8b0019fb587e2af6', 'versionCode': 133, }, # # packages signed with unkown keys { 'packageName': 'org.smssecure.smssecure', 'apkName': 'smssecure-new-custom.apk', 'signer': '1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef', 'versionCode': 135, }, { 'packageName': 'org.smssecure.smssecure', 'apkName': 'smssecure-custom.apk', 'signer': '1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef', 'versionCode': 133, }, { 'packageName': 'org.smssecure.smssecure', 'apkName': 'smssecure-weird-version.apk', 'signer': '99ff99ff99ff99ff99ff99ff99ff99ff99ff99ff99ff99ff99ff99ff99ff99ff', 'versionCode': 133, }, ] common.config = {} common.fill_config_defaults(common.config) publish.config = common.config publish.config['keystorepass'] = '123456' publish.config['keypass'] = '123456' publish.config['keystore'] = os.path.join(os.getcwd(), 'dummy-keystore.jks') publish.config['repo_keyalias'] = 'repokey' testsmetadir = os.path.join(os.getcwd(), 'metadata') with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): shutil.copytree(testsmetadir, 'metadata') sigkeyfps = { "org.smssecure.smssecure": { "signer": "b33a601a9da97c82e6eb121eb6b90adab561f396602ec4dc8b0019fb587e2af6" } } os.makedirs('stats') jarfile = 'stats/publishsigkeys.jar' with zipfile.ZipFile(jarfile, 'w', zipfile.ZIP_DEFLATED) as jar: jar.writestr('publishsigkeys.json', json.dumps(sigkeyfps)) publish.sign_sig_key_fingerprint_list(jarfile) with open('config.py', 'w'): pass index.v1_sort_packages( i, common.load_stats_fdroid_signing_key_fingerprints() ) self.maxDiff = None self.assertEqual(json.dumps(i, indent=2), json.dumps(o, indent=2)) # and test it still works with get_first_signer_certificate outdir = os.path.join(self.testdir, 'publishsigkeys') os.mkdir(outdir) common.apk_extract_signatures(jarfile, outdir) certs = glob.glob(os.path.join(outdir, '*.RSA')) with open(certs[0], 'rb') as fp: self.assertEqual( common.get_certificate(fp.read()), common.get_first_signer_certificate(jarfile), ) def test_make_v0_repo_only(self): os.chdir(self.testdir) os.mkdir('repo') repo_icons_dir = os.path.join('repo', 'icons') self.assertFalse(os.path.isdir(repo_icons_dir)) repodict = { 'address': 'https://example.com/fdroid/repo', 'description': 'This is just a test', 'icon': 'blahblah', 'name': 'test', 'timestamp': datetime.datetime.now(), 'version': 12, } requestsdict = {'install': [], 'uninstall': []} common.config['repo_pubkey'] = 'ffffffffffffffffffffffffffffffffff' index.make_v0({}, [], 'repo', repodict, requestsdict, {}) self.assertTrue(os.path.isdir(repo_icons_dir)) self.assertTrue( os.path.exists( os.path.join(repo_icons_dir, common.default_config['repo_icon']) ) ) self.assertTrue(os.path.exists(os.path.join('repo', 'index.xml'))) def test_make_v0(self): os.chdir(self.testdir) os.mkdir('metadata') os.mkdir('repo') metadatafile = 'metadata/info.zwanenburg.caffeinetile.yml' shutil.copy(os.path.join(self.basedir, metadatafile), metadatafile) repo_icons_dir = os.path.join('repo', 'icons') self.assertFalse(os.path.isdir(repo_icons_dir)) repodict = { 'address': 'https://example.com/fdroid/repo', 'description': 'This is just a test', 'icon': 'blahblah', 'mirrors': [ {'isPrimary': True, 'url': 'https://example.com/fdroid/repo'}, {'extra': 'data', 'url': 'http://one/fdroid/repo'}, {'url': 'http://two/fdroid/repo'}, ], 'name': 'test', 'timestamp': datetime.datetime.now(), 'version': 12, } app = fdroidserver.metadata.parse_metadata(metadatafile) app['icon'] = 'info.zwanenburg.caffeinetile.4.xml' app['CurrentVersionCode'] = 4 apps = {app.id: app} orig_apps = copy.deepcopy(apps) apk = { 'hash': 'dbbdd7deadb038862f426b71efe4a64df8c3edf25d669e935f349510e16f65db', 'hashType': 'sha256', 'uses-permission': [['android.permission.WAKE_LOCK', None]], 'uses-permission-sdk-23': [], 'features': [], 'icons_src': { '160': 'res/drawable/ic_coffee_on.xml', '-1': 'res/drawable/ic_coffee_on.xml', }, 'icons': {'160': 'info.zwanenburg.caffeinetile.4.xml'}, 'antiFeatures': ['KnownVuln'], 'packageName': 'info.zwanenburg.caffeinetile', 'versionCode': 4, 'name': 'Caffeine Tile', 'versionName': '1.3', 'minSdkVersion': 24, 'targetSdkVersion': 25, 'sig': '03f9b2f848d22fd1d8d1331e8b1b486d', 'signer': '51cfa5c8a743833ad89acf81cb755936876a5c8b8eca54d1ffdcec0cdca25d0e', 'size': 11740, 'apkName': 'info.zwanenburg.caffeinetile_4.apk', 'icon': 'info.zwanenburg.caffeinetile.4.xml', 'added': datetime.datetime.fromtimestamp(1539122400), } requestsdict = {'install': [], 'uninstall': []} common.config['repo_pubkey'] = 'ffffffffffffffffffffffffffffffffff' common.config['make_current_version_link'] = True index.make_v0(apps, [apk], 'repo', repodict, requestsdict, {}) self.assertTrue(os.path.isdir(repo_icons_dir)) self.assertTrue( os.path.exists( os.path.join(repo_icons_dir, common.default_config['repo_icon']) ) ) self.assertTrue(os.path.exists(os.path.join('repo', 'index.xml'))) self.assertEqual(orig_apps, apps, "apps was modified when building the index") def test_v0_invalid_config_exception(self): """Index v0 needs additional config values when using --nosign index.xml aka Index v0 includes the full repo public key in the XML itself. So when running `fdroid update --nosign`, there needs to be either repo_pubkey or a full keystore config present. """ os.chdir(self.testdir) os.mkdir('repo') repo_icons_dir = os.path.join('repo', 'icons') self.assertFalse(os.path.isdir(repo_icons_dir)) repodict = { 'address': 'https://example.com/fdroid/repo', 'description': 'This is just a test', 'icon': 'blahblah', 'name': 'test', 'timestamp': datetime.datetime.now(), 'version': 12, } requestsdict = {'install': [], 'uninstall': []} common.options.nosign = False with self.assertRaises(fdroidserver.exception.FDroidException): index.make_v0({}, [], 'repo', repodict, requestsdict, {}) common.options.nosign = True with self.assertRaises(fdroidserver.exception.FDroidException): index.make_v0({}, [], 'repo', repodict, requestsdict, {}) common.config['repo_pubkey'] = 'ffffffffffffffffffffffffffffffffff' self.assertFalse(os.path.exists(os.path.join('repo', 'index.xml'))) self.assertFalse(os.path.exists(os.path.join('repo', 'index_unsigned.jar'))) self.assertFalse(os.path.exists(os.path.join('repo', 'index.jar'))) index.make_v0({}, [], 'repo', repodict, requestsdict, {}) self.assertTrue(os.path.exists(os.path.join('repo', 'index.xml'))) self.assertTrue(os.path.exists(os.path.join('repo', 'index_unsigned.jar'))) self.assertFalse(os.path.exists(os.path.join('repo', 'index.jar'))) def test_make_v1_with_mirrors(self): os.chdir(self.testdir) os.mkdir('repo') repodict = { 'address': 'https://example.com/fdroid/repo', 'mirrors': [ {'isPrimary': True, 'url': 'https://example.com/fdroid/repo'}, {'extra': 'data', 'url': 'http://one/fdroid/repo'}, {'url': 'http://two/fdroid/repo'}, ], } index.make_v1({}, [], 'repo', repodict, {}, {}) index_v1 = Path('repo/index-v1.json') self.assertTrue(index_v1.exists()) with index_v1.open() as fp: self.assertEqual( json.load(fp)['repo']['mirrors'], ['http://one/fdroid/repo', 'http://two/fdroid/repo'], ) def test_github_get_mirror_service_urls(self): for url in [ 'git@github.com:foo/bar', 'git@github.com:foo/bar.git', 'https://github.com/foo/bar', 'https://github.com/foo/bar.git', ]: self.assertEqual( ['https://raw.githubusercontent.com/foo/bar/master/fdroid'], index.get_mirror_service_urls({"url": url}), ) @patch.dict(os.environ, clear=True) def test_gitlab_get_mirror_service_urls(self): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): git_mirror_path = Path('git-mirror/fdroid') git_mirror_path.mkdir(parents=True) ci_job_id = '12345678' artifacts_url = ( 'https://group.gitlab.io/-/project/-/jobs/%s/artifacts/public/fdroid' % ci_job_id ) with (git_mirror_path / 'placeholder').open('w') as fp: fp.write(' ') for url in [ 'git@gitlab.com:group/project', 'git@gitlab.com:group/project.git', 'https://gitlab.com/group/project', 'https://gitlab.com/group/project.git', ]: with patch('fdroidserver.common.GITLAB_COM_PAGES_MAX_SIZE', 1000): expected = [ 'https://group.gitlab.io/project/fdroid', 'https://gitlab.com/group/project/-/raw/master/fdroid', ] self.assertEqual( expected, index.get_mirror_service_urls({"url": url}), ) with patch.dict(os.environ, clear=True): os.environ['CI_JOB_ID'] = ci_job_id self.assertEqual( expected + [artifacts_url], index.get_mirror_service_urls({"url": url}), ) with patch('fdroidserver.common.GITLAB_COM_PAGES_MAX_SIZE', 10): expected = [ 'https://gitlab.com/group/project/-/raw/master/fdroid', ] self.assertEqual( expected, index.get_mirror_service_urls({"url": url}), ) with patch.dict(os.environ, clear=True): os.environ['CI_JOB_ID'] = ci_job_id self.assertEqual( expected + [artifacts_url], index.get_mirror_service_urls({"url": url}), ) def test_make_website(self): os.chdir(self.testdir) os.mkdir('metadata') os.mkdir('repo') repodict = { 'address': 'https://example.com/fdroid/repo', 'description': 'This is just a test', 'icon': 'blahblah', 'name': 'test', 'timestamp': datetime.datetime.now(), 'version': 12, } common.config['repo_pubkey'] = 'ffffffffffffffffffffffffffffffffff' index.make_website([], "repo", repodict) self.assertTrue(os.path.exists(os.path.join('repo', 'index.html'))) self.assertTrue(os.path.exists(os.path.join('repo', 'index.css'))) self.assertTrue(os.path.exists(os.path.join('repo', 'index.png'))) try: from html5print import CSSBeautifier, HTMLBeautifier except ImportError: print('WARNING: skipping rest of test since html5print is missing!') return with open(os.path.join("repo", "index.html")) as f: html = f.read() pretty_html = HTMLBeautifier.beautify(html) self.maxDiff = None self.assertEquals(html, pretty_html) with open(os.path.join("repo", "index.css")) as f: css = f.read() pretty_css = CSSBeautifier.beautify(css) self.maxDiff = None self.assertEquals(css, pretty_css) def test_v1_sort_packages_with_invalid(self): i = [ { 'packageName': 'org.smssecure.smssecure', 'apkName': 'smssecure-custom.fake', 'signer': None, 'versionCode': 11111, } ] index.v1_sort_packages(i, common.load_stats_fdroid_signing_key_fingerprints()) def test_package_metadata(self): """A smoke check and format check of index.package_metadata()""" def _kn(key): return key[0].lower() + key[1:] apps = fdroidserver.metadata.read_metadata() update.insert_localized_app_metadata(apps) # smoke check all metadata files for appid, app in apps.items(): metadata = index.package_metadata(app, 'repo') for k in ('Description', 'Name', 'Summary', 'video'): if app.get(k): self.assertTrue(isinstance(metadata[_kn(k)], dict)) for k in ('AuthorWebSite', 'IssueTracker', 'Translation', 'WebSite'): if app.get(k): self.assertTrue(isinstance(metadata[_kn(k)], str)) # make sure these known values were properly parsed and included appid = 'info.guardianproject.urzip' app = apps[appid] metadata = index.package_metadata(app, 'repo') # files self.assertEqual( os.path.getsize(f'repo/{appid}/en-US/featureGraphic.png'), metadata['featureGraphic']['en-US']['size'], ) self.assertEqual( os.path.getsize(f'repo/{appid}/en-US/icon.png'), metadata['icon']['en-US']['size'], ) # localized strings self.assertEqual({'en-US': 'title'}, metadata['name']) self.assertEqual({'en-US': 'video'}, metadata['video']) # strings self.assertEqual( 'https://dev.guardianproject.info/projects/urzip', metadata['webSite'], ) def test_add_mirrors_to_repodict(self): """Test based on the contents of tests/config.py""" repodict = {'address': common.config['repo_url']} index.add_mirrors_to_repodict('repo', repodict) self.assertEqual( repodict['mirrors'], [ {'isPrimary': True, 'url': 'https://MyFirstFDroidRepo.org/fdroid/repo'}, {'url': 'http://foobarfoobarfoobar.onion/fdroid/repo'}, {'url': 'https://foo.bar/fdroid/repo'}, ], ) def test_custom_config_yml_with_mirrors(self): """Test based on custom contents of config.yml""" os.chdir(self.testdir) repo_url = 'https://example.com/fdroid/repo' c = {'repo_url': repo_url, 'mirrors': ['http://one/fdroid']} with open('config.yml', 'w') as fp: yaml.dump(c, fp) os.system('cat config.yml') common.config = None common.read_config() repodict = {'address': common.config['repo_url']} index.add_mirrors_to_repodict('repo', repodict) self.assertEqual( repodict['mirrors'], [ {'url': 'https://example.com/fdroid/repo', 'isPrimary': True}, {'url': 'http://one/fdroid/repo'}, ], ) def test_no_mirrors_config(self): common.config = dict() repodict = {'address': 'https://example.com/fdroid/repo'} index.add_mirrors_to_repodict('repo', repodict) self.assertFalse('mirrors' in repodict) def test_add_metadata_to_canonical_in_mirrors_config(self): """It is possible to add extra metadata to the canonical URL""" common.config = { 'repo_url': 'http://one/fdroid/repo', 'mirrors': [ {'url': 'http://one/fdroid', 'extra': 'data'}, {'url': 'http://two/fdroid'}, ], } repodict = {'address': common.config['repo_url']} index.add_mirrors_to_repodict('repo', repodict) self.assertEqual( repodict['mirrors'], [ {'extra': 'data', 'isPrimary': True, 'url': 'http://one/fdroid/repo'}, {'url': 'http://two/fdroid/repo'}, ], ) def test_duplicate_primary_in_mirrors_config(self): """There can be only one primary mirror aka canonical URL""" common.config = { 'repo_url': 'http://one/fdroid', 'mirrors': [ {'url': 'http://one/fdroid', 'countryCode': 'SA'}, {'url': 'http://two/fdroid'}, {'url': 'http://one/fdroid'}, ], } repodict = {'address': common.config['repo_url']} with self.assertRaises(fdroidserver.exception.FDroidException): index.add_mirrors_to_repodict('repo', repodict) def test_bad_type_in_mirrors_config(self): for i in (1, 2.3, b'asdf'): common.config = {'mirrors': i} repodict = dict() with self.assertRaises(fdroidserver.exception.FDroidException): index.add_mirrors_to_repodict('repo', repodict) def test_load_mirrors_config_from_file(self): # empty the dict for *.config, see setUp() for k in sorted(common.config.keys()): del common.config[k] os.chdir(self.testdir) os.mkdir('config') primary = 'https://primary.com/fdroid/repo' mirror = 'https://mirror.com/fdroid' with open('config/mirrors.yml', 'w') as fp: yaml.dump([{'url': mirror}], fp) repodict = {'address': primary} index.add_mirrors_to_repodict('repo', repodict) self.assertEqual( repodict['mirrors'], [ {'isPrimary': True, 'url': primary}, {'url': mirror + '/repo'}, ], ) def test_error_when_load_mirrors_from_config_and_file(self): # empty the dict for *.config, see setUp() for k in sorted(common.config.keys()): del common.config[k] os.chdir(self.testdir) os.mkdir('config') with open('config/mirrors.yml', 'w') as fp: yaml.dump([{'url': 'https://foo.com'}], fp) repodict = { 'address': 'https://foo.com', 'mirrors': {'url': 'http://two/fdroid/repo'}, } with self.assertRaises(fdroidserver.exception.FDroidException): index.add_mirrors_to_repodict('repo', repodict) class AltstoreIndexTest(unittest.TestCase): def test_make_altstore(self): self.maxDiff = None apps = { "app.fake": { "AutoName": "Fake App", "AuthorName": "Fake Author", "iconv2": {"en_US": "fake_icon.png"}, } } apks = [ { "packageName": "app.fake", "apkName": "app.fake_123.ipa", "versionName": "v123", "added": datetime.datetime(2000, 2, 2, 2, 2, 2), "size": 123, "ipa_MinimumOSVersion": "10.0", "ipa_DTPlatformVersion": "12.0", "ipa_permissions": [ "NSCameraUsageDescription", "NSDocumentsFolderUsageDescription", ], "ipa_entitlements": [ "com.apple.developer.team-identifier", "com.apple.developer.web-browser", "keychain-access-groups", ], }, ] config = { "repo_icon": "fake_repo_icon.png", "repo_name": "fake_repo", "repo_url": "gopher://fake-repo.com/fdroid/repo", } with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): repodir = Path(tmpdir) / 'repo' repodir.mkdir() with open(repodir / "fake.ipa", "w") as f: f.write("") fdroidserver.index.make_altstore( apps, apks, config, repodir, True, ) with open(repodir / "altstore-index.json", 'r') as f: self.assertDictEqual( { "apps": [ { "appPermissions": { "entitlements": [ 'com.apple.developer.team-identifier', 'com.apple.developer.web-browser', 'keychain-access-groups', ], 'privacy': [ 'NSCameraUsageDescription', 'NSDocumentsFolderUsageDescription', ], }, 'bundleIdentifier': 'app.fake', 'developerName': 'Fake Author', 'iconURL': 'gopher://fake-repo.com/fdroid/repo', 'localizedDescription': '', 'name': 'Fake App', 'screenshots': [], 'versions': [ { 'date': '2000-02-02T02:02:02', 'downloadURL': 'gopher://fake-repo.com/fdroid/repo/app.fake_123.ipa', 'maxOSVersion': '12.0', 'minOSVersion': '10.0', 'size': 123, 'version': 'v123', } ], }, ], 'name': 'fake_repo', 'news': [], }, json.load(f), ) if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) import argparse parser = argparse.ArgumentParser() parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(IndexTest)) newSuite.addTest(unittest.makeSuite(AltstoreIndexTest)) unittest.main(failfast=False) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/init.TestCase0000755000175000017500000000545514620351225016560 0ustar00hanshans#!/usr/bin/env python3 # http://www.drdobbs.com/testing/unit-testing-with-python/240165163 import inspect import logging import os import shutil import sys import unittest localmodule = os.path.realpath( os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') ) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) import fdroidserver.init from testcommon import mkdtemp, parse_args_for_test class InitTest(unittest.TestCase): '''fdroidserver/init.py''' def setUp(self): logging.basicConfig(level=logging.DEBUG) self.basedir = os.path.join(localmodule, 'tests') fdroidserver.common.config = None fdroidserver.init.config = None self._td = mkdtemp() self.testdir = self._td.name def tearDown(self): self._td.cleanup() os.chdir(self.basedir) def test_disable_in_config(self): os.chdir(self.testdir) with open('config.yml', 'w') as fp: fp.write('keystore: NONE\n') fp.write('keypass: mysupersecrets\n') os.chmod('config.yml', 0o600) config = fdroidserver.common.read_config() self.assertEqual('NONE', config['keystore']) self.assertEqual('mysupersecrets', config['keypass']) fdroidserver.init.disable_in_config('keypass', 'comment') with open(fp.name) as fp: self.assertTrue('#keypass:' in fp.read()) fdroidserver.common.config = None config = fdroidserver.common.read_config() self.assertIsNone(config.get('keypass')) @unittest.skipIf(os.name == 'nt', "calling main() like this hangs on Windows") def test_main_in_empty_dir(self): """Test that `fdroid init` will find apksigner and add it to the config""" os.chdir(self.testdir) shutil.copy(os.path.join(self.basedir, 'keystore.jks'), self.testdir) bindir = os.path.join(os.getcwd(), 'bin') os.mkdir(bindir) apksigner = os.path.join(bindir, 'apksigner') open(apksigner, 'w').close() os.chmod(apksigner, 0o755) os.environ['PATH'] = bindir sys.argv = ['fdroid init', '--keystore', 'keystore.jks', '--repo-keyalias=sova'] fdroidserver.init.main() self.assertEqual(apksigner, fdroidserver.init.config.get('apksigner')) if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) import argparse parser = argparse.ArgumentParser() parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) fdroidserver.init.options = parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(InitTest)) unittest.main(failfast=False) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/install.TestCase0000755000175000017500000000307614620351225017260 0ustar00hanshans#!/usr/bin/env python3 # http://www.drdobbs.com/testing/unit-testing-with-python/240165163 import inspect import os import sys import unittest localmodule = os.path.realpath( os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') ) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) import fdroidserver.common import fdroidserver.install class InstallTest(unittest.TestCase): '''fdroidserver/install.py''' def test_devices(self): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config config['adb'] = fdroidserver.common.find_sdk_tools_cmd('adb') self.assertTrue(os.path.exists(config['adb'])) self.assertTrue(os.path.isfile(config['adb'])) devices = fdroidserver.install.devices() self.assertIsInstance(devices, list, 'install.devices() did not return a list!') for device in devices: self.assertIsInstance(device, str) if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) import argparse from testcommon import parse_args_for_test parser = argparse.ArgumentParser() parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) fdroidserver.install.options = parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(InstallTest)) unittest.main(failfast=False) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/issue-1128-min-sdk-30-poc.apk0000644000175000017500000002475014620351225020731 0ustar00hanshansPKyBtAndroidManifest.xml1oPύ%mI 1tB 1SłL6JFA`b' ?_1t`<P u;s-'JU4%Ӗ>6Z~e%x> +&KwKcXuejL9ћ%{3<3lr?WAH=)P!1gǹLS1 iGX5X1MP)ט}/V8y_ bO˕?7C+u m匩;L \QxP2ypğWLz_ѕ9x)ܫ|Bϥwj[5[k[[l2ˁKw'c;KcMv;x*u-rw"ԤVEw7r+sϹ] n+}nzRռsy_~~X5uv;PK-*8 classes.dexOAGaAnj*51d]v"x_'5`L8z7ݩy̛͛׷ÑG3#|[ROMgFtLJr%@RGYCe@BF2 Ed y#OBpn#cMd) RF /WȞB?ϷE3]|>ARlH?jznkwV ߷iq&eTTɋogadB9qpHs ^L%kڛ{Cıx|M۬݀B!KO-VrO/,LKO;Yo:9^$J^VTm;5Z3[ښ带]J[uSpᔘmUt(Cl_բvI_0ڿZKA$TK^uL]L-N8]>'dz?lk475{ۢ%:ibӲRۋ ƽ U2k: I>V4\1ceG7IOPFuƴuCtʮ2F-UʦSO*u\v5'S :A8+!A$$!r|W:YaŮt(Q;p0xQ"A :Z5w 8ZVP?1@n[O" ZEVAǐ>#FH< \gPz{(<> PK v,,resources.arsc5 ,( ci org.fdroid.ci P0 string, app_nameThX@PKXdA)META-INF/59D3C650.SFen@= E@E`:v7La Eشܐ%9j +rC$jZJr '3'u3υkYB(g.VURaP]-ÎXȺ5BFn>UC>6Pnav7]CA~0Gn~^~NfI8y%TXt:s#?Pa3^ [ϜP* [n~ovұ#_Te^&a֦%]uGإMuz.}ӿQG"uN/?t4<߄A7ڶn?oV LP0[Ǩ^/ډ. T&{M}`W 6=2wg.Ke[limT;갩oэ|굆`yá'1e}FXKS=Y,ɱ{31320.V47,zbg~ؗ\̠K?-i~jݢm&-5YJ-3Nn|Q_v,w|[ʎ<+cqEeѿQvY&,!̡xoc,bjjsOߝWsۖbSk>95Wr;3Zߒ*Gk?\gʘ;cC&0/0\ۖZyXo(`Ǔ^uȴ m;m8i"|ħI.q(^j閘cM6)uf+[/qߢ7oڷSgxW>9UL~هFr>9{&s5Q:/j!N3z^tս%^"57mw v2CdۂgsNtj_boGWn qaLH@I3o3*]Ѱd-Tc>Pspyo}IOkH]S ; 00h7J[CcaX)ۘ0  *H  01 0 U oops0  240409151740Z20510826151740Z01 0 U oops0"0  *H 0  pN%$,{&h8 $]&3IۆJ;U&i)ZCPmKّiژBxMHNrT9 鎂 Ђ<a*رXMF)&ef#,Y3/cnu>6ˌ?znP6nO5h?… I7jɲҰ;fQcR;<)0d֭fYB=(f[C6n WaH^M0,\sk 9à$]DiأrE?_au ivIqGEd\RG3oo*dgqֽ@<3+o[ͲI(U=.'/l- 9r%M&4%?I_Òr{u kMELIiͽDUg;*[*YCw_VL}8G^kO<#.l:7 tsi#HyKn0EoX.%br&0"0  *H 0  pN%$,{&h8 $]&3IۆJ;U&i)ZCPmKّiژBxMHNrT9 鎂 Ђ<a*رXMF)&ef#,Y3Pspyo}IOkH]S ; 00h7J[CcaX)ۘ0  *H  01 0 U oops0  240409151740Z20510826151740Z01 0 U oops0"0  *H 0  pN%$,{&h8 $]&3IۆJ;U&i)ZCPmKّiژBxMHNrT9 鎂 Ђ<a*رXMF)&ef#,Y3/cnu>6ˌ?znP6nO5h?… I7jɲҰ;fQcR;<)0d֭fYB=(f[C6n WaH^M0,\sk Àt\{>R5F/Rj(O#v@܏h7^lV14 42&O{M~dw *Wog7.Q,=ZD֌~kJ~/`y "*C;汿_/%gYcFۑo#H$0P($V 1-E_ҍ {JILJc sBe5O E_BzZSV?6,D nJ %:/q# 'bpn#L6Kϕ!첦Wp4(mu؛ו5I [Zy98P@X9;Wv4%B,o0  *H iggSs9 Z~Mz{` AKt(=6hĠKkL0*3B*U:H{~;=mf9e&PmSa@4& @D~RDTi`^n!koj-X H kFϤE ŗS_gZ!VѾ݁ud@ !:6l7"٣&eRcr$"[ԲOBz]No  N7eZjkdnz3Oهn..8ߢSвO Ygf#֫Ə!$J9ź;%\"$GGSpDJA*Ml=¶~cV a,]YZm_v_4b˘<1$PNOZ\&#r%iѢ~" 8aM`tثNF@izѐw; =ͷim!N7eZjkdnz3Oهn..8ߢSвO Ygf#֫Ə!$J9ź;%\"$GGSpDJA*Ml=¶~cV a,]YZm_v_4b˘<1$PNOZ\&#r%iѢ~" 8aM`tثNF@izѐw; =ͷim&0"0  *H 0 u|Nx"ȟy]# >*C;汿_/%gYcFۑo#H$0P($V 1-E_ҍ {JILJc sBe5O E_BzZSV?6,D nJ %:/q# 'bpn#L6Kϕ!첦Wp4(mu؛ו5I [Zy98P@X9;Wv4%B,o8hS0,`( {6oEާ(!hLoq M P30!(D<}lk1V1'\K)@M7cfb0^0FLI0  *H 0q1 0 UUK10UUnknown10UWetherby10U Unknown10U Unknown10UCiaran Gultnieks0 100723171024Z 371208171024Z0q1 0 UUK10UUnknown10UWetherby10U Unknown10U Unknown10UCiaran Gultnieks0"0  *H 0 u|Nx"ȟy]# >*C;汿_/%gYcFۑo#H$0P($V 1-E_ҍ {JILJc sBe5O E_BzZSV?6,D nJ %:/q# 'bpn#L6Kϕ!첦Wp4(mu؛ו5I [Zy98P@X9;Wv4%B,o0  *H iggSs9 Z~Mz{` AKt(=6hĠKkL0*3B*U:H{~;=mf9e&PmSa@4& @D~RDTi`^n!koj-X H kFϤE ŗS_gZ!VѾ݁ud@ !:6l7"٣&eRcr$"[ԲOBz]No5.u:L4c7Rs]shhz[9ȒH}yl_UŞQW *KmvF.~Xp9d#Z0 HMw*yq VA2ȍ]{@mYrZw=GO>Ω{.<5C#l*q`}lQL$?`XYcoGաj$rmaBv4͒?8bV]w"Lc!5.u:L4c7Rs]shhz[9ȒH}yl_UŞQW *KmvF.~Xp9d#Z0 HMw*yq VA2ȍ]{@mYrZw=GO>Ω{.<5C#l*q`}lQL$?`XYcoGաj$rmaBv4͒?8bV]w"Lc&0"0  *H 0 u|Nx"ȟy]# >*C;汿_/%gYcFۑo#H$0P($V 1-E_ҍ {JILJc sBe5O E_BzZSV?6,D nJ %:/q# 'bpn#L6Kϕ!첦Wp4(mu؛ו5I [Zy98P@X9;Wv4%B,oXwerBnAPK Sig Block 42PKyBtAndroidManifest.xmlPK-*8 classes.dexPK v,,resources.arscPKXdA)pMETA-INF/59D3C650.SFPK眜#META-INF/59D3C650.RSAPK;(././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/issue-1128-poc1.apk0000644000175000017500000001536014620351225017227 0ustar00hanshansPK !:9gGÄ resources.arsc5 (CTiny App for CTS -[Ţîñý Åþþ ƒöŕ ÇŢŠ one two three] @‏‮Tiny‬‏ ‏‮App‬‏ ‏‮for‬‏ ‏‮CTS‬‏ android.appsecurity.cts.tinyapp P0 string, app_nameThX@ThX@enXAThX@arXBPK!:AndroidManifest.xmlSn1=$MȣiR胖+DS*X +4IFIhf@TB`Q!>o p|cgӈ{m4 (N'3'V)'Έw"{KCO;I%nDh@vI㘳g@}ghBDdL1{_y2Q,#8!g r5e5웴>}\oGv951gN~GLVvdxeM6!m s>1^E+bKD'N&_AǒK,zIT:]}[4m?pGdb6G2Hږc6t KSo#H%c9ԥUBGܑxk?>;"86 }ST@SJkĈVQ*$"̽~]f_77튼*:rpi9M᲎2\ w(ߢYiƳL yI&Cf:Zv/=>O8>Zt/k75h--۴͎Ѵ6%c[k/8ޒWgU^,`yN"jPK`zPK!: classes.dexMhA~d5mmlH\ iZjRPDNm71 -ŪAzqЦ !+|9F~ɏVҐs v܈;Vv?J7 >˦4B\(2/i3 JC #!s.179<plc?MssJ@QҚY$%eEFih7%"6 lR'Peb$GǗ,Շl@IDsH, V"Aë~Pδ/z=:Wڽ}ux1ypk|G=:0khc$ SC}~薖0:z]]ZhDM4LQ:cx]nQ WM]'4w5AԵe72d&f>Š:,)-)ubVj-KX1|efRƊAEǒR/؈DMVRE:SPKPK!:q8r'FMETA-INF/CIARANG.RSA3hbubjhδؠUѐ߀3̓1qAsAsAf&F&&ϳ -P5@-l̡,lLކ| 0{h^v^~y?H]#<$#( *40 8g&%)efȉDX@&F%%s#?Paڅ'5~J'_UVpjNnJ?/"{==T1P*1ν'_.#0Zr#<}>~?|)yNUˢ7ґg2]ܒO.{V)[LJv$-PlP|iL4Xrl,}xcOM=gqGj7k6pXZKl-cX$2GUw8⤓-0y3뿦*~ɒ7:mޯN.Jk58`o{YZɏ78M:jxufYY|%wCx3fE{q6Oea]K[N)fgnYٛlw/YmNħG)]wQT.eɆ;>p3I(iq&s%En.Vcg5uo?EBRy͹xesU峾7lb\L% ѠrR."S#IasD1Lxػd_њ=w^;^j^BZr)St륯sP[viǀvroϑ5ckTvOpr"DE4y*ZV.#/Dm猞|Ft;gՈ/='>|,_,^5_[ {cCHGV:s~!i~lpo›U?m{ق^uJ?.8a/Wұ.z  qaLH@B"zMǙE=SDEucd>rvq԰E4Fn 00g;js%j>:2d0  *H  01 0 U oops0  240422184323Z20510908184323Z01 0 U oops0"0  *H 0 754+gDǃcF=[%}8;J7UT~3D{sY!10|?ރ/WM}kJ3G0A3Ky13ȧnQv%W E)>u+('Iw]Gq)Qsfb!G]HwTyys\#xBi(xXYL0]dEs0WBG[paAhUf,5S0Q0UqR_Gh.aI0U#0qR_Gh.aI0U00  *H  \Zi8whW;em.7WI#Z>MTg;b*\JPX4vڷǠgAF,ɶ|9CR>1`ʜL6o9zƿ)hC.3!&"+,ω*R,UOI)ޱ#I,)-B+Ɇ.{}ǿm3+RO9`hz K[{'zY` $"qG$qԐ(ivVk}}\hqsDt!C;գcƼ2./5[%yw')@zVoOP+SUrSއa!+tč#Ē>'iXj|lQc egm-sLF3ȕ&A̋V,?K2HYRKѣqCYhкqgVwsg&0"0  *H 0 754+gDǃcF=[%}8;J7UT~3D{sY!10|?ރ/WM}kJ3G0A3Ky13ȧnQv%W E)>u+('Iw]Gq)Qsfb!G]HwTyys\#xBi(xXYL0]dEs0WBG[paAhUf,5hSiLH@B"zMǙE=SDEucd>rvq԰E4Fn 00g;js%j>:2d0  *H  01 0 U oops0  240422184323Z20510908184323Z01 0 U oops0"0  *H 0 754+gDǃcF=[%}8;J7UT~3D{sY!10|?ރ/WM}kJ3G0A3Ky13ȧnQv%W E)>u+('Iw]Gq)Qsfb!G]HwTyys\#xBi(xXYL0]dEs0WBG[paAhUf,5S0Q0UqR_Gh.aI0U#0qR_Gh.aI0U00  *H  \Zi8whW;em.7WI#Z>MTg;b*\JPX4vڷǠgAF,ɶ|9CR>1`ʜL6o9zƿ)hC.3!&"+,ω*R,UOI)ޱ#I,)-B+Ɇ.{}ǿm3+RO9`hz K[{'zY` $"qG$qԐ(ivVkm+~^Q·}#Ɍe/ipR&P 5̦Y͒tlp/Κ^02•Nތx1!Ao#۹QOj0\jb'ydž{_CxnejYE",'~݇oNfW{u,.twW'*\ځfRQB9‡BlX2n>lA&0"0  *H 0 754+gDǃcF=[%}8;J7UT~3D{sY!10|?ރ/WM}kJ3G0A3Ky13ȧnQv%W E)>u+('Iw]Gq)Qsfb!G]HwTyys\#xBi(xXYL0]dEs0WBG[paAhUf,5 APK Sig Block 42PK !:9gGÄ resources.arsc5PK!:`zAndroidManifest.xmlPK!: classes.dexPK!:q8r'F META-INF/CIARANG.RSAPK././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/issue-1128-poc2.apk0000644000175000017500000002306514620351225017231 0ustar00hanshansPK !:9gGÄ resources.arsc5 (CTiny App for CTS -[Ţîñý Åþþ ƒöŕ ÇŢŠ one two three] @‏‮Tiny‬‏ ‏‮App‬‏ ‏‮for‬‏ ‏‮CTS‬‏ android.appsecurity.cts.tinyapp P0 string, app_nameThX@ThX@enXAThX@arXBPK!:AndroidManifest.xmlSn1=$MȣiR胖+DS*X +4IFIhf@TB`Q!>o p|cgӈ{m4 (N'3'V)'Έw"{KCO;I%nDh@vI㘳g@}ghBDdL1{_y2Q,#8!g r5e5웴>}\oGv951gN~GLVvdxeM6!m s>1^E+bKD'N&_AǒK,zIT:]}[4m?pGdb6G2Hږc6t KSo#H%c9ԥUBGܑxk?>;"86 }ST@SJkĈVQ*$"̽~]f_77튼*:rpi9M᲎2\ w(ߢYiƳL yI&Cf:Zv/=>O8>Zt/k75h--۴͎Ѵ6%c[k/8ޒWgU^,`yN"jPK`zPK!: classes.dexMhA~d5mmlH\ iZjRPDNm71 -ŪAzqЦ !+|9F~ɏVҐs v܈;Vv?J7 >˦4B\(2/i3 JC #!s.179<plc?MssJ@QҚY$%eEFih7%"6 lR'Peb$GǗ,Շl@IDsH, V"Aë~Pδ/z=:Wڽ}ux1ypk|G=:0khc$ SC}~薖0:z]]ZhDM4LQ:cx]nQ WM]'4w5AԵe72d&f>Š:,)-)ubVj-KX1|efRƊAEǒR/؈DMVRE:SPKn qaLH@A_ү>6N#v#'BH!pA[98-#YC {p3G9`؎ 00g;js%j>:2d0  *H  01 0 U oops0  240422184323Z20510908184323Z01 0 U oops0"0  *H 0 754+gDǃcF=[%}8;J7UT~3D{sY!10|?ރ/WM}kJ3G0A3Ky13ȧnQv%W E)>u+('Iw]Gq)Qsfb!G]HwTyys\#xBi(xXYL0]dEs0WBG[paAhUf,5S0Q0UqR_Gh.aI0U#0qR_Gh.aI0U00  *H  \Zi8whW;em.7WI#Z>MTg;b*\JPX4vڷǠgAF,ɶ|9CR>1`ʜL6o9zƿ)hC.3!&"+,ω*R,UOI)ޱ#I,)-B+Ɇ.{}ǿm3+RO9`hz K[{'zY` $"qG$qԐ(ivVkwer4dh}AG C\W{@ +w㩽DO|D&0"0  *H 0 754+gDǃcF=[%}8;J7UT~3D{sY!10|?ރ/WM}kJ3G0A3Ky13ȧnQv%W E)>u+('Iw]Gq)Qsfb!G]HwTyys\#xBi(xXYL0]dEs0WBG[paAhUf,5hSiLH@A_ү>6N#v#'BH!pA[98-#YC {p3G9`؎ 00g;js%j>:2d0  *H  01 0 U oops0  240422184323Z20510908184323Z01 0 U oops0"0  *H 0 754+gDǃcF=[%}8;J7UT~3D{sY!10|?ރ/WM}kJ3G0A3Ky13ȧnQv%W E)>u+('Iw]Gq)Qsfb!G]HwTyys\#xBi(xXYL0]dEs0WBG[paAhUf,5S0Q0UqR_Gh.aI0U#0qR_Gh.aI0U00  *H  \Zi8whW;em.7WI#Z>MTg;b*\JPX4vڷǠgAF,ɶ|9CR>1`ʜL6o9zƿ)hC.3!&"+,ω*R,UOI)ޱ#I,)-B+Ɇ.{}ǿm3+RO9`hz K[{'zY` $"qG$qԐ(ivVk|9F{xQ y-᜾yLR2k-Ň@>^ ceXj3X o'@׀+w&0"0  *H 0 754+gDǃcF=[%}8;J7UT~3D{sY!10|?ރ/WM}kJ3G0A3Ky13ȧnQv%W E)>u+('Iw]Gq)Qsfb!G]HwTyys\#xBi(xXYL0]dEs0WBG[paAhUf,58 q0,`( {6oEާ(!hLoq M P30!(D<}lk1V1'\K)@M7cfb0^0FLI0  *H 0q1 0 UUK10UUnknown10UWetherby10U Unknown10U Unknown10UCiaran Gultnieks0 100723171024Z 371208171024Z0q1 0 UUK10UUnknown10UWetherby10U Unknown10U Unknown10UCiaran Gultnieks0"0  *H 0 u|Nx"ȟy]# >*C;汿_/%gYcFۑo#H$0P($V 1-E_ҍ {JILJc sBe5O E_BzZSV?6,D nJ %:/q# 'bpn#L6Kϕ!첦Wp4(mu؛ו5I [Zy98P@X9;Wv4%B,o0  *H iggSs9 Z~Mz{` AKt(=6hĠKkL0*3B*U:H{~;=mf9e&PmSa@4& @D~RDTi`^n!koj-X H kFϤE ŗS_gZ!VѾ݁ud@ !:6l7"٣&eRcr$"[ԲOBz]No  N7eZjkdnz3Oهn..8ߢSвO Ygf#֫Ə!$J9ź;%\"$GGSpDJA*Ml=¶~cV a,]YZm_v_4b˘<1$PNOZ\&#r%iѢ~" 8aM`tثNF@izѐw; =ͷim!N7eZjkdnz3Oهn..8ߢSвO Ygf#֫Ə!$J9ź;%\"$GGSpDJA*Ml=¶~cV a,]YZm_v_4b˘<1$PNOZ\&#r%iѢ~" 8aM`tثNF@izѐw; =ͷim&0"0  *H 0 u|Nx"ȟy]# >*C;汿_/%gYcFۑo#H$0P($V 1-E_ҍ {JILJc sBe5O E_BzZSV?6,D nJ %:/q# 'bpn#L6Kϕ!첦Wp4(mu؛ו5I [Zy98P@X9;Wv4%B,o8hS0,`( {6oEާ(!hLoq M P30!(D<}lk1V1'\K)@M7cfb0^0FLI0  *H 0q1 0 UUK10UUnknown10UWetherby10U Unknown10U Unknown10UCiaran Gultnieks0 100723171024Z 371208171024Z0q1 0 UUK10UUnknown10UWetherby10U Unknown10U Unknown10UCiaran Gultnieks0"0  *H 0 u|Nx"ȟy]# >*C;汿_/%gYcFۑo#H$0P($V 1-E_ҍ {JILJc sBe5O E_BzZSV?6,D nJ %:/q# 'bpn#L6Kϕ!첦Wp4(mu؛ו5I [Zy98P@X9;Wv4%B,o0  *H iggSs9 Z~Mz{` AKt(=6hĠKkL0*3B*U:H{~;=mf9e&PmSa@4& @D~RDTi`^n!koj-X H kFϤE ŗS_gZ!VѾ݁ud@ !:6l7"٣&eRcr$"[ԲOBz]No5.u:L4c7Rs]shhz[9ȒH}yl_UŞQW *KmvF.~Xp9d#Z0 HMw*yq VA2ȍ]{@mYrZw=GO>Ω{.<5C#l*q`}lQL$?`XYcoGաj$rmaBv4͒?8bV]w"Lc!5.u:L4c7Rs]shhz[9ȒH}yl_UŞQW *KmvF.~Xp9d#Z0 HMw*yq VA2ȍ]{@mYrZw=GO>Ω{.<5C#l*q`}lQL$?`XYcoGաj$rmaBv4͒?8bV]w"Lc&0"0  *H 0 u|Nx"ȟy]# >*C;汿_/%gYcFۑo#H$0P($V 1-E_ҍ {JILJc sBe5O E_BzZSV?6,D nJ %:/q# 'bpn#L6Kϕ!첦Wp4(mu؛ו5I [Zy98P@X9;Wv4%B,oXwerBnAPK Sig Block 42PK !:9gGÄ resources.arsc5PK!:`zAndroidManifest.xmlPK!: classes.dexPK]%././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/issue-1128-poc3a.apk0000644000175000017500000002116614620351225017373 0ustar00hanshansPK!:^avAndroidManifest.xmlTnA=8$@c<)k( DHD :c`a |_PQP)sē-x{cf!APŗ`>:{oψ}cL|%D1';EJ#^ĀF fD=6̨)xy>[d-Ox"b|:gm")rV{cl \Hp5~zhiҿ}ǴV#0s&j#l Z/DFjKC.ψ6c'Lc3k;Z_JH/CBk5ɷw={phkdsn)+kܯB*rxgJm6#{by7U=԰1*| >e"edcNSld?[{AMyaT9"!Ayyrہ?\9M;˚~[-zp|]QОN2 'g2X2ܬ)~ESǖGYSG:u y\dz$L15#-:q?GO\05;8Z4Zv:ˎυ1uvh}qVKFq_z|՛/zs%o_PK^avPK !:Շ classes.dex5dex 035jIr9ԄJo:u?pxV40p  $ ,t Gs(;CFJWag{        $po nppp ILandroid/app/Activity;.Landroid/appsecurity/cts/tinyapp/MainActivity;(Landroid/appsecurity/cts/tinyapp/R$attr;*Landroid/appsecurity/cts/tinyapp/R$string;#Landroid/appsecurity/cts/tinyapp/R;Landroid/os/Bundle;"Ldalvik/annotation/EnclosingClass;Ldalvik/annotation/InnerClass;!Ldalvik/annotation/MemberClasses;Ljava/lang/Object;MainActivity.javaR.javaVVL accessFlagsapp_nameattremitter: jack-3.26finishnameonCreatesavedInstanceStatestringthisvalue<9    dp  $ ,t       0PKZ[Jtemp.txtst PKPK [J51lib/armeabi/fake.so5٧Hello PK !:!Oresources.arsc5 (CTiny App for CTS -[Ţîñý Åþþ ƒöŕ ÇŢŠ one two three] @‏‮Tiny‬‏ ‏‮App‬‏ ‏‮for‬‏ ‏‮CTS‬‏ android.appsecurity.cts.tinyapp T4$attrstring, app_nameL`P8L`P8enXAL`P8arXBPK[J> temp2.txtsr\PK>PK[J)META-INF/CERT.SFmIZMp~&5FqvC{Q?RTխN`}Y˃yKam+b~] 4Y ~P|hj7=_3` ~EYW ^(:v:t?)! Nzv(-rX)<;Q3o/A b8'2׏oɯTW+rjI+_r < ρvCm]ȷC`47 1qr=s-Mǥf\wɭ}$ hZH9v0045!P~&źe[`F}هKZh3L? zK.&D(div@]JV;_nDխdƄd g {|c tu beL7}]2 BҜq_Vq VyݚN>}KXc+X'(8a?Ҿ{ vUK(@bw". WOt\!Ox#2E3 }+Cqҗ8C:.p5ɀ"9%tmj`舂t%vr[hwxCzPi3Ff䚶ڸ]GS5_E4VjoB$̾if9c^N>y|؃۫\7WMD3gzJ+a\3s&=PoG_t"JGؿ+A5m^-UWj `Y&*m8 6ѓmS Yե])ya(AmAę.P"+hnq&xll%(4FiT 5PO- }_y-Zkj@N};:T}zu^rQZumm:},Lzz:iJ `|,]}7'7mgӢuؒ 4邯|7:P[oi%[Rv^2zuO9Eؕ'f*X5. {MA`ƋE3r֯}85pSډ}{i%P%&Iu-=kʎz*9U>XM;3Rvϗ^]$,c^Z]L2x;lKnIkweL. k7}4T3WҤ/n-(e[w#XɄa~iŸKaGg_gy½+M)erd%LC˙ "`z M+fp8Rn#sS+̾XA;ٱKȶh'Y̒j?r4BQCb4n!3I(Ƽ?rdƟ!:y[kDO/daڍc3q'%!2狉Wf_s )ȸT,qOL.whbB_I .E4=>;YKFx& ϊFɂ\SЀ%4V16Uq\f0ţgPK[J4JRMETA-INF/MANIFEST.MFmˎ@ཉ(h+&Dl"R *2dzl$ fBL2To&7 k3 rfTp3,ߟ̺8]6K̈́{mR? Bh_PLm_u]4.4,ƣIԶP^s\;`YϿ d] [H4Py+ {2 ^9⭹=Ԧ0@rm8-- Λ].4Ϛy|8bNQ2Sh%}uhAwW5N{[ ۝JHZgz^J_D`9@l+.[_yzV9Ε5*]֟;' Դ ]Ʃϔq [ temp2.txtPK[J)META-INF/CERT.SFPK[J1uMETA-INF/CERT.RSAPK[J4JRMETA-INF/MANIFEST.MFPK #= ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/issue-1128-poc3b.apk0000644000175000017500000002116514620351225017373 0ustar00hanshansPK!:^avAndroidManifest.xmlTnA=8$@c<)k( DHD :c`a |_PQP)sē-x{cf!APŗ`>:{oψ}cL|%D1';EJ#^ĀF fD=6̨)xy>[d-Ox"b|:gm")rV{cl \Hp5~zhiҿ}ǴV#0s&j#l Z/DFjKC.ψ6c'Lc3k;Z_JH/CBk5ɷw={phkdsn)+kܯB*rxgJm6#{by7U=԰1*| >e"edcNSld?[{AMyaT9"!Ayyrہ?\9M;˚~[-zp|]QОN2 'g2X2ܬ)~ESǖGYSG:u y\dz$L15#-:q?GO\05;8Z4Zv:ˎυ1uvh}qVKFq_z|՛/zs%o_PK^avPK !:Շ classes.dex5dex 035jIr9ԄJo:u?pxV40p  $ ,t Gs(;CFJWag{        $po nppp ILandroid/app/Activity;.Landroid/appsecurity/cts/tinyapp/MainActivity;(Landroid/appsecurity/cts/tinyapp/R$attr;*Landroid/appsecurity/cts/tinyapp/R$string;#Landroid/appsecurity/cts/tinyapp/R;Landroid/os/Bundle;"Ldalvik/annotation/EnclosingClass;Ldalvik/annotation/InnerClass;!Ldalvik/annotation/MemberClasses;Ljava/lang/Object;MainActivity.javaR.javaVVL accessFlagsapp_nameattremitter: jack-3.26finishnameonCreatesavedInstanceStatestringthisvalue<9    dp  $ ,t       0PKZ[Jtemp.txtst PKPK [J51lib/armeabi/fake.so5٧Hello PK !:!Oresources.arsc5 (CTiny App for CTS -[Ţîñý Åþþ ƒöŕ ÇŢŠ one two three] @‏‮Tiny‬‏ ‏‮App‬‏ ‏‮for‬‏ ‏‮CTS‬‏ android.appsecurity.cts.tinyapp T4$attrstring, app_nameL`P8L`P8enXAL`P8arXBPK[J> temp2.txtsr\PK>PK[J)META-INF/CERT.SFmIZMp~&5FqvC{Q?RTխN`}Y˃yKam+b~] 4Y ~P|hj7=_3` ~EYW ^(:v:t?)! Nzv(-rX)<;Q3o/A b8'2׏oɯTW+rjI+_r < ρvCm]ȷC`47 1qr=s-Mǥf\wɭ}$ hZH9v0045!P~&źe[`F}هKZh3L? zK.&D(div@]JV;_nDխdƄd g {|c tu beL7}]2 BҜq_Vq VyݚN>}KXc+X'(8a?Ҿ{ vUK(@bw". WOt\!Ox#2E3 }!_<:U+J|9:Q0@܉F" c@B![ҨȀ,nyD~-!Dޗ VZko5t@T+;DScw]LBkuDfir-lçI=m2' ~gOOA%wnS"5ْ4,D0 }-w4\V%Pw\}wK9i=mZg lV cIcj'ԥس=/:B`ړN^ Â/(gH(ߒԮ+@@\E 0f/:iL]P| I&tb/5M;>ywmF 'ܿ9 !N5sfZ~gt}l> dHWwӄZ},Y6V{FUx#|&H v,"hH/ @?w/TyGZNqGyaIēPd@T 2eT?'/^|7 9ӑ/KMղ1J_.6z8%vwM}|{YC=\4~D?Taqʾz-$IuwG,ׅwه:Fcʼ8@FbҮw8,*!6ȫO{٫Vc}GWkǫ1|]EsKVn֓ј42kiܳr_0c]moK觗YJf\ҭ9jBXsěD[~ͻ MA:Îr0%`k=vC?tf2?xl|y+#VibQmm uMZ:tzwT8=@ao<aT7Ox8xj#wRX99ɜ..wDfF۲Ş@T?|N -~d)W.zuj0:"QZ}:PdAd5z/:\^/9?/nUbH/F͑EОu SEEpAxYS3n{B/R+z?_:ذKֲH瓌4XzQ=b]0ErsĽQw&/Ľ=Ȳgc_:x۫DϦ^NxŴL9Ka&!G|t>mm{ jTKKe {p&& WU EݴmŒoDc.;c#Ӌ`3sIд^y uzvņҿ,2V3STGd8fm٭?PK[J4JRMETA-INF/MANIFEST.MFmˎ@ཉ(h+&Dl"R *2dzl$ fBL2To&7 k3 rfTp3,ߟ̺8]6K̈́{mR? Bh_PLm_u]4.4,ƣIԶP^s\;`YϿ d] [H4Py+ {2 ^9⭹=Ԧ0@rm8-- Λ].4Ϛy|8bNQ2Sh%}uhAwW5N{[ ۝JHZgz^J_D`9@l+.[_yzV9Ε5*]֟;' Դ ]Ʃϔq [ temp2.txtPK[J)META-INF/CERT.SFPK[JB_META-INF/CERT.RSAPK[J4JRMETA-INF/MANIFEST.MFPK #< ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/janus.apk0000644000175000017500000002352314620351225015766 0ustar00hanshansdex 035DA 9\*EQ5 cPS'pxV4pp 0px !<^x{      `Goodbye world!HelloWorldActivity.javaILandroid/app/Activity;Landroid/content/Context;Landroid/os/Bundle;Landroid/view/View;Landroid/widget/TextView; Lcom/example/HelloWorldActivity;Ljava/lang/CharSequence;VVIVLonCreatesavedInstanceStatesetContentView setGravitysetTextthisview>ZZZ?po 2"p !n n n  p 0p     `pPK }>* AndroidManifest.xmlTNA==fxc^Bb4Ђh5JT4 oLCtq/pᚸp킅qҕKwzv5SL:UuHsPć$0+2MnHLO_-AvUI_!+o.kTޔ] 5..R)om}q%f찭0*u!ɯ2$3z(.6Y=n[ ̻sj7ğ+{y<Ȳ^8&Ne\ռFfRt G@Bsطkgc1 s#f:\i,^-Qaw5+z~1|_#^ ;+9ē:t)*uE?+#sTٽ}_|8RU-Kՙ)^~HxNn lP..ItrUq֧dW|M'#z u32S6H (L)/j䡿h3lGԛf^Z)YVe"ˊSʩUWL|'ՕcwRiݪo)T&3DMIqyeٶ{\Wsl;t\qOΩN#f>sm h1Kz Cvio]^0Dz݆^&D/AGzzZk E+h Gz}^kZ/a54HnrM% BLTkW_]Ƙ 궑~B0o^ _kPkf#f(d͆f<_hBFވ|~ N>?3KVϱ?PK }L8 res/drawable/ic_launcher.pngPNG  IHDR@@iq ~IDATxݛ{eU}?>530 3 C-6JFGRVBBHkmB5АѤIH* CjiPp@2`{̽s^k3w^;wFf%+u^w=Z[Q>!]n6{w+^Zrg%ɘbf"_d""8S)=W|[dbƔ”D~/VBL4֞4zm.ۇo.}2ɀ3cAE "WP%O y؎/_RsO6g8*ImhJkk,3ﶆ L)x"P7Lk]>{K'Ɲ}glOHoxAdH5W`+n|jf^T {l9<=Y8?3`}Z~=Q]Dd$4_u68cQ /-`f|xW޾̱0,Qv%f:9Erם PFa Cb$MDSN-wxbwy?9-MI,qYqТ3e3cL&K'Sm'{~5iUK2T*|Q>BṿƤFާw2j=AReuqPbss`d8\< fczlT57;a_;_n#!R|dc¶6$Zp^$XRӺVҪÅ=mf*`8g.}1#X&`KceA@?#h/XGF8s폰2QԓX(s3n)NeʙcUsp Kֈ-Gܷ(0Z;0`s$q-lݫ);[C2X5ȫ *[V.NԘh &e{O!Z'3(REe}x .=hd '9 &g+vTXQdzU1⍘,řcXJ:t$T!ƾ`)d,BB Fp7IJ;S)Kuo H ׏,;LX D?d0K6 AJ \Zp>(wl(t$HH#Mt޺D I9Dê@"I,Lԋ1I$D(;abx*l D3ZA@%ŷTT~flFFKg, .P9=H8Yb7GIB_ 0 )YBi-r 9* u^ zZ0;j  3)'J{hLJJjZRed=!X%ªTO-e<4M[i9uZ9г"Ey_\u"ۤk5w٣VUv+.YW?)C0TdUlxalÏoARYOɛ6O)-II9 1mx稢ɦfuSJALJLZX{Rn~TviEn12%w+˔2l\qDw]Xw9BԺ*ؖTI1O)ojG*ÅJuaҍQ Ⱦ=xCG7U%EW6Ar{3D2ҝG`9{G=F`I79&,*b9 $Ţc}'ن~!GW{']}uyQx/8#m/7CcЩA,I:Q{!kYk៿s{ALw&~\f?n>{ArPfUWO6?bo^HGz+Z缏t3 xϒ! Or]ˡʀz/}s>^ٱt޻RfE`G.O(3PvaU%bJ]QUǶ0>1kB2ugoF.cOJ?P *Eֽa)#zGV2OE}?ێl9 "8<.kM"83rM5w9YpLC0 n;Jf e84Yʙ+ݴzp\]olNȒ?Re?QGq?&Y{S' =_?8ues_<$ 2|5~5wnqPpitGƵŷ޳5f͇l-S_U{_Z뾏2vc`|hӼ#?mjdkRwX5m:b*I/ :{{&L_lv!|M"uCHځMvw,p7 nNK,/Yygp;lU'ɐw".W眈8cq""s~#։]NbIMUM,&3UmfmfZEvO vݏ<WZ_⚺nIENDB`PK }resources.arsc 80<xres/drawable/guardsquare.pngres/drawable/ic_launcher.pngres/xml/wearable_app_desc.xmlvoice_transcriptionHelloWorld Sample com.example  8 *8FVattrdrawablexmlarraycolorstringstyleX D4Z guardsquare ic_launcherwearable_app_descandroid_wear_capabilitiesaccentprimary primary_dark primary_lightapp_nameAppThemeLtT8L`P8LlP8 L\8 0KKKί{L`P8L`P8 8LP8 8345PK }0Z#F classes.dexeoAge8y4\GQ \dC؎ !ѤD4JDPhM(vIޝKs/қwO_7~ow R"w.TIIT#?v+9Fd d>o`s\K`5x )lϗJ`JSڦ{jkwsoC1Z4ȱT:(*ρŠ3:chday^Qt<ݒ=C~?􉵨㠟秩7Ynx/הv,4 kkq|p/2 e.(v/Y_M#ؠmыxkE~o=:dtZM$n/8Ux |$- +h*T*a~T/%VYRv~+m7Q&9YPy,dY"PM\F )u Sټ7 o1{qؖqGF\?ٹ^O~b'߳Zw0eAWYEPK })pXMETA-INF/MANIFEST.MFUQo0{~EP\@ ɆaNf)J-G-'''%ݙ9(]I#FtLDC0F zm@t" (LɊ?uiь|~ȰgGQmș슾srjEy5%XLD\5k&OOzi&nc?:a>rX3Ǝp.o.]rwlL>9=/PK }uuG=META-INF/CERT.SFmn@=O1{ BKH\HT(f& 3O6F|3yKC@daJ(ͫ|Z&o|$K tFe}Bh 1. }`"S|l9b:9y*Lsi ﯍678ϕei6Afa"kX!$5NUsMۥ ^Gd?"~BKW [J'ֺU^/ 677Wϵ1b,~~1/rF#U]QK؏NPf&)Vn"M/ f&F&& xjYZ&0 3 8\y)E)b" fa^KjRi8a8K`x̟zWeriasbQK%UKR;~㗔fܻdhStYebAӶ6dї5or v$׼h(瓣}wf}w%E5;_31320!3]Z3^^:09cͩ]_$|v ^<4gO./^).Kk.9҂§Z r73zhݺ֛IˋvHlI[i34o:k* AndroidManifest.xmlPK }L8 res/drawable/ic_launcher.pngPK }resources.arscPK }0Z#F classes.dexPK })pXW META-INF/MANIFEST.MFPK }uuG=!META-INF/CERT.SFPK }5)"`"META-INF/CERT.RSAPK~%././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/key-tricks.py0000755000175000017500000000142414620351225016607 0ustar00hanshans#!/usr/bin/env python3 import os import fdroidserver import shutil import sys from fdroidserver import common, nightly if os.getenv('CI') is None: print('ERROR: This can overwrite SSH keys, so it should only be run in CI') sys.exit(1) os.chdir(os.path.dirname(__file__)) config = fdroidserver.common.read_config() nightly.PASSWORD = config['keystorepass'] nightly.KEY_ALIAS = config['repo_keyalias'] privkey = nightly._ssh_key_from_debug_keystore('keystore.jks') print('privkey', privkey) ssh_private_key_file = os.path.join(os.getenv('HOME'), '.ssh', 'id_rsa') if os.path.exists(ssh_private_key_file): print('ERROR:', ssh_private_key_file, 'exists!') sys.exit(1) shutil.move(privkey, ssh_private_key_file) shutil.move(privkey + '.pub', ssh_private_key_file + '.pub') ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/keystore.jks0000644000175000017500000001351714620351225016531 0ustar00hanshans4e7da5b7o300 +*ļ#y -hyܠƩGy{nf5\nŧ] vosO[iK_)S4Xݘ|#}-\mS-/<Ո0[uվOB{ʳX~Lf,Z'Rq'tM:{`zq4\4]1zDmMiN|6eUN_z]dE7n/mJ^1sϸ}9&NhF^UY3c/sewG AZk 0Y̒RqHY[lR/܈"X;ٟ"XjAqr#>"w\eVNSRZw1%nhuP`+fZ#!G`8K>BվP4V(|(2xFņMz/E*~Azc @AP IdCl7 {W4l:Kw|S%KU׏(/~8̇v_#fsg'Щ^'eC)0&p\@Ԅ+gB3f24oNS]M'U]8|<:9|X#@Ko[Q (E4ۘ yB~HJO mV(ynA>h}uoR|S$Ol2\kE qcGV R$\z$"=O3&p}Yn5 7Bx4f{BSpr9rf&߅2LXeU\ҞdRTXw&Ѳ:9Dm e5 u<}JĺAu$IL}’",";XwpP^n 8~7%wB'|\p~#^WyWCA cY-/ +4X 5y4&j fWhv=t!ay}t6yȡT"ZLQ[w5qx% U7F1b'R?3b| =i@V'8L( bw=b@y>2E%IMxty=yC 8^J%⛪ WOTߵ(j' 7ځa?Nc8;pԙ!g+F U?>wx6&E,nDcJB`rBY*W@X\V?pt?܇i6o8ũ+Hs _Vuz]sq"^RX.509u0q0Y1a0  *H  0i1 0 UUS10U California10UAlcatraz10U Alcatraz1 0 U Cell10UBirdman0 191223180144Z 470510180144Z0i1 0 UUS10U California10UAlcatraz10U Alcatraz1 0 U Cell10UBirdman0"0  *H 0 -rɴ kq $?=2#sqeIrO](w$ WaU"6#B2:va>Ni}IDzѣod]]2}ѭY̳C'e3YǮxFᾫ~H)/PMc^$yCv`۽=m9$2&)_Aeҹ8PY~gk}`cH.k9q͉B^,87e,5!00Ur`v.25Rs0  *H  Ztw|yP;A|+7Mp{|XZ 0~Jߙbi+Uex&RDUyzQEԥ3]F6ueXC+ZkL~#ywYq)m#<~*TD%2& ĮjZQZnUm|C׊iO[g XBZh G پp>Cm =+=_-ú_On.:6)HӜwcqȗ.dg ;Ѽ2Hs*$.=24lb{8س`۩ɽ% s׎A.-" TݑXHS7ꮭR7wChel_uvLƬZukQn T/(O0/_?%986W3Ioc@>r[<mq~.724!Η/%o!xg9r P>d_9=W7|ģA lŏΧ(D0Øn@˂LJ*}KIp q& ++=]bKQ] JIQ9&'kʈR% pk8^>?8D]'5͇ yU$XvXv&.VdXQr*fsn4IM7.vp_GQ%b%8 bk^Q *] kAYҮܮ(&:Y> `Y'#x;K뱹6_”^Kb+ӄ= %R򺦖B> d$b9D?zw@fB*WIL#yk-?%bzM"ϩxvdEVM%9V l,E JwI0f6~uwBV1Vr8V- u'r_ ٙHHALs W˱'~?Equ.@l8iY%4W_L[k>'Ld>Ă>,MxQ!l":r=&Svb@wJ4@lCMpF=' ˏGg= ht2wxms+c~qGf7&,kA{ܢ/ Wj"}]Pg1࿯(g:)k ]R)N%S:Ekotƶo`tIS&0&τ XUZU8jUilm7ܰ˱ Mo^y1ިWDobEZ]Ne(uGΤrٺщy_KG5G8rU QY2F> ✨ac/HARdlz?Se1Y'xәfI$;I bk직9NYڌ1&;{̦*"uen ޜhyq?W]9 o'¶vˆdi4ZDCd6'g=qo@A^|XwCڟL\ HhRK7WFl:ȾeV=JM'Dt!P0J4ntqNLN At"LT;`t}UQpaֳc)o> z1:7C<@|E $p--G| [f$aȳ[Rt#oxђccl4tXTLJL,.nozVӚᦜ|}zO%v#t©#Y#Ά`ΠXKo+]Q {ѹw(qvS :79ʊr2_ ީUj"X'oxF Rv8!OnH;Q˰>-ϼZ$N?._ϙ)ag29D#7Zq0%Pv-RB2I1gF%2G(Adњ\ND]42 6ԧ#&*oSaw6R`EhQw0i*';ȑ]?ٿZ>d$Zyviov[[pf"-C z֥L, ?̡&8,S򥆟ɉ>u_kl4j:wמe| R`Z.|KxoU\⼒CC ۺHϾpvGy2s O P8LG  ĞI 4p=#b\]P}&88xaAXr܁ Fʕtw1N#Hy<"qu {Vh2y \tJyOOs*$WLeV`3}p9`J@#[W_4 &jg)S-@V ԽMWg8K;P9c(N$ p qtR~PquQ*iϸ:W*dV JhZ3'vgsN uk+>c~|'(.˦@`rtA!00U‹=թs8ѦA 0  *H  XqFo$&$I Azwɿ-'% >aw<3QeAuEmxoOV8,+ۡ3 0nG$2^/nxu6SK.o^+NͰh"T&cdy>Je|19q"he8pWC_q_ Y&e'DxHx *x1V--;G>i'PZ]9^kEBp>8*!QGzMhr;CGؼFЗJ$)ThƪB ^4w0twSIdzJ%OL`u4j Vsc+6\Z)T`>hv|<%7J[n(oR И+Zmix)Rڑi],././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/lint.TestCase0000755000175000017500000005002514620351225016554 0ustar00hanshans#!/usr/bin/env python3 # http://www.drdobbs.com/testing/unit-testing-with-python/240165163 import logging import os import ruamel.yaml import shutil import sys import tempfile import unittest from pathlib import Path localmodule = Path(__file__).resolve().parent.parent print('localmodule: ' + str(localmodule)) if localmodule not in sys.path: sys.path.insert(0, str(localmodule)) import fdroidserver.common import fdroidserver.lint import fdroidserver.metadata from fdroidserver.common import CATEGORIES_CONFIG_NAME from testcommon import mkdtemp, parse_args_for_test class LintTest(unittest.TestCase): '''fdroidserver/lint.py''' def setUp(self): logging.basicConfig(level=logging.DEBUG) self.basedir = localmodule / 'tests' self.tmpdir = localmodule / '.testfiles' self.tmpdir.mkdir(exist_ok=True) os.chdir(self.basedir) fdroidserver.common.config = None fdroidserver.lint.config = None fdroidserver.lint.CATEGORIES_KEYS = None self._td = mkdtemp() self.testdir = self._td.name def tearDown(self): self._td.cleanup() def test_check_for_unsupported_metadata_files(self): self.assertTrue(fdroidserver.lint.check_for_unsupported_metadata_files()) with tempfile.TemporaryDirectory(dir=str(self.tmpdir)) as testdir: testdir = Path(testdir) self.assertFalse( fdroidserver.lint.check_for_unsupported_metadata_files(testdir) ) shutil.copytree( self.basedir / 'metadata', testdir / 'metadata', ignore=shutil.ignore_patterns('apk', 'dump', '*.json'), ) self.assertFalse( fdroidserver.lint.check_for_unsupported_metadata_files(testdir) ) (testdir / 'metadata/org.adaway.json').write_text('placeholder') self.assertTrue( fdroidserver.lint.check_for_unsupported_metadata_files(testdir) ) def test_forbidden_html_tags(self): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.lint.config = config app = { 'Name': 'Bad App', 'Summary': 'We pwn you', 'Description': 'This way: ', } anywarns = False for warn in fdroidserver.lint.check_regexes(app): anywarns = True logging.debug(warn) self.assertTrue(anywarns) def test_source_urls(self): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.lint.config = config app = { 'Name': 'My App', 'Summary': 'just a placeholder', 'Description': 'This app does all sorts of useful stuff', } good_urls = [ 'https://github.com/Matteljay/mastermindy-android', 'https://gitlab.com/origin/master', 'https://gitlab.com/group/subgroup/masterthing', 'https://raw.githubusercontent.com/Seva-coder/Finder/HEAD/ChangeLog.txt', 'https://github.com/scoutant/blokish/blob/HEAD/README.md#changelog', 'https://git.ieval.ro/?p=fonbot.git;a=blob;f=Changes;hb=HEAD', 'https://htmlpreview.github.io/?https://github.com/YasuakiHonda/Maxima-on-Android-AS/blob/HEAD/app/src/main/assets/About_MoA/index.html', '', ] anywarns = False for url in good_urls: app['SourceCode'] = url for warn in fdroidserver.lint.check_regexes(app): anywarns = True logging.debug(warn) self.assertFalse(anywarns) bad_urls = [ 'github.com/my/proj', 'http://github.com/not/secure', 'https://github.com/foo/bar.git', 'https://gitlab.com/group/subgroup/project.git', 'https://raw.githubusercontent.com/Seva-coder/Finder/master/ChangeLog.txt', 'https://github.com/scoutant/blokish/blob/master/README.md#changelog', 'http://htmlpreview.github.io/?https://github.com/my/project/blob/HEAD/index.html', 'http://fdroid.gitlab.io/fdroid-website', ] logging.debug('bad urls:') for url in bad_urls: anywarns = False app['SourceCode'] = url for warn in fdroidserver.lint.check_regexes(app): anywarns = True logging.debug(warn) self.assertTrue(anywarns, url + " does not fail lint!") def test_check_app_field_types(self): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.lint.config = config app = fdroidserver.metadata.App() app.id = 'fake.app' app.Name = 'Bad App' app.Summary = 'We pwn you' app.Description = 'These are some back' fields = { 'Categories': { 'good': [ ['Sports & Health'], ['Multimedia', 'Graphics'], ], 'bad': [ 'Science & Education', 'Multimedia,Graphics', ], }, 'WebSite': { 'good': [ 'https://homepage.com', ], 'bad': [ [], [ 'nope', ], 29, ], }, } for field, values in fields.items(): for bad in values['bad']: anywarns = False app[field] = bad for warn in fdroidserver.lint.check_app_field_types(app): anywarns = True logging.debug(warn) self.assertTrue(anywarns) for good in values['good']: anywarns = False app[field] = good for warn in fdroidserver.lint.check_app_field_types(app): anywarns = True logging.debug(warn) self.assertFalse(anywarns) def test_check_vercode_operation(self): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.lint.config = config app = fdroidserver.metadata.App() app.Name = 'Bad App' app.Summary = 'We pwn you' app.Description = 'These are some back' good_fields = [ '6%c', '%c - 1', '%c + 10', '%c*10', '%c*10 + 3', '%c*10 + 8', '%c + 2 ', '%c + 3', '%c + 7', ] bad_fields = [ 'open("/etc/passwd")', '%C + 1', '%%c * 123', '123 + %%', '%c % 7', ] anywarns = False for good in good_fields: app.VercodeOperation = [good] for warn in fdroidserver.lint.check_vercode_operation(app): anywarns = True logging.debug(warn) self.assertFalse(anywarns) for bad in bad_fields: anywarns = False app.VercodeOperation = [bad] for warn in fdroidserver.lint.check_vercode_operation(app): anywarns = True logging.debug(warn) self.assertTrue(anywarns) def test_check_license_tag_no_custom_pass(self): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.lint.config = config app = fdroidserver.metadata.App() app.License = "GPL-3.0-or-later" anywarns = False for warn in fdroidserver.lint.check_license_tag(app): anywarns = True logging.debug(warn) self.assertFalse(anywarns) def test_check_license_tag_no_custom_fail(self): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.lint.config = config app = fdroidserver.metadata.App() app.License = "Adobe-2006" anywarns = False for warn in fdroidserver.lint.check_license_tag(app): anywarns = True logging.debug(warn) self.assertTrue(anywarns) def test_check_license_tag_with_custom_pass(self): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.lint.config = config config['lint_licenses'] = ['fancy-license', 'GPL-3.0-or-later'] app = fdroidserver.metadata.App() app.License = "fancy-license" anywarns = False for warn in fdroidserver.lint.check_license_tag(app): anywarns = True logging.debug(warn) self.assertFalse(anywarns) def test_check_license_tag_with_custom_fail(self): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.lint.config = config config['lint_licenses'] = ['fancy-license', 'GPL-3.0-or-later'] app = fdroidserver.metadata.App() app.License = "Apache-2.0" anywarns = False for warn in fdroidserver.lint.check_license_tag(app): anywarns = True logging.debug(warn) self.assertTrue(anywarns) def test_check_license_tag_with_custom_empty(self): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.lint.config = config config['lint_licenses'] = [] app = fdroidserver.metadata.App() app.License = "Apache-2.0" anywarns = False for warn in fdroidserver.lint.check_license_tag(app): anywarns = True logging.debug(warn) self.assertTrue(anywarns) def test_check_license_tag_disabled(self): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.lint.config = config config['lint_licenses'] = None app = fdroidserver.metadata.App() app.License = "Apache-2.0" anywarns = False for warn in fdroidserver.lint.check_license_tag(app): anywarns = True logging.debug(warn) self.assertFalse(anywarns) def test_check_categories_in_config(self): fdroidserver.lint.config = {CATEGORIES_CONFIG_NAME: ['InConfig']} fdroidserver.lint.load_categories_config() app = fdroidserver.metadata.App({'Categories': ['InConfig']}) self.assertEqual(0, len(list(fdroidserver.lint.check_categories(app)))) def test_check_categories_not_in_config(self): fdroidserver.lint.config = dict() fdroidserver.lint.load_categories_config() app = fdroidserver.metadata.App({'Categories': ['NotInConfig']}) self.assertEqual(1, len(list(fdroidserver.lint.check_categories(app)))) def test_check_categories_empty_is_error(self): fdroidserver.lint.config = {CATEGORIES_CONFIG_NAME: []} fdroidserver.lint.load_categories_config() app = fdroidserver.metadata.App({'Categories': ['something']}) self.assertEqual(1, len(list(fdroidserver.lint.check_categories(app)))) def test_check_categories_old_hardcoded_not_defined(self): fdroidserver.lint.config = {CATEGORIES_CONFIG_NAME: ['foo', 'bar']} fdroidserver.lint.load_categories_config() app = fdroidserver.metadata.App({'Categories': ['Writing']}) self.assertEqual(1, len(list(fdroidserver.lint.check_categories(app)))) def test_check_categories_from_config_yml(self): """In config.yml, categories is a list.""" os.chdir(self.testdir) Path('config.yml').write_text('categories: [foo, bar]') fdroidserver.lint.config = fdroidserver.common.read_config() fdroidserver.lint.load_categories_config() self.assertEqual(fdroidserver.lint.CATEGORIES_KEYS, ['foo', 'bar']) app = fdroidserver.metadata.App({'Categories': ['bar']}) self.assertEqual(0, len(list(fdroidserver.lint.check_categories(app)))) def test_check_categories_from_config_categories_yml(self): """In config/categories.yml, categories is a localized STRINGMAP dict.""" os.chdir(self.testdir) os.mkdir('config') Path('config/categories.yml').write_text('{foo: {name: foo}, bar: {name: bar}}') fdroidserver.lint.config = fdroidserver.common.read_config() fdroidserver.lint.load_categories_config() self.assertEqual(fdroidserver.lint.CATEGORIES_KEYS, ['foo', 'bar']) app = fdroidserver.metadata.App({'Categories': ['bar']}) self.assertEqual(0, len(list(fdroidserver.lint.check_categories(app)))) def test_lint_config_basic_mirrors_yml(self): os.chdir(self.testdir) yaml = ruamel.yaml.YAML(typ='safe') with Path('mirrors.yml').open('w') as fp: yaml.dump([{'url': 'https://example.com/fdroid/repo'}], fp) self.assertTrue(fdroidserver.lint.lint_config('mirrors.yml')) def test_lint_config_mirrors_yml_kenya_countryCode(self): os.chdir(self.testdir) yaml = ruamel.yaml.YAML(typ='safe') with Path('mirrors.yml').open('w') as fp: yaml.dump([{'url': 'https://foo.com/fdroid/repo', 'countryCode': 'KE'}], fp) self.assertTrue(fdroidserver.lint.lint_config('mirrors.yml')) def test_lint_config_mirrors_yml_invalid_countryCode(self): """WV is "indeterminately reserved" so it should never be used.""" os.chdir(self.testdir) yaml = ruamel.yaml.YAML(typ='safe') with Path('mirrors.yml').open('w') as fp: yaml.dump([{'url': 'https://foo.com/fdroid/repo', 'countryCode': 'WV'}], fp) self.assertFalse(fdroidserver.lint.lint_config('mirrors.yml')) def test_lint_config_mirrors_yml_alpha3_countryCode(self): """Only ISO 3166-1 alpha 2 are supported""" os.chdir(self.testdir) yaml = ruamel.yaml.YAML(typ='safe') with Path('mirrors.yml').open('w') as fp: yaml.dump([{'url': 'https://de.com/fdroid/repo', 'countryCode': 'DEU'}], fp) self.assertFalse(fdroidserver.lint.lint_config('mirrors.yml')) def test_lint_config_mirrors_yml_one_invalid_countryCode(self): """WV is "indeterminately reserved" so it should never be used.""" os.chdir(self.testdir) yaml = ruamel.yaml.YAML(typ='safe') with Path('mirrors.yml').open('w') as fp: yaml.dump( [ {'url': 'https://bar.com/fdroid/repo', 'countryCode': 'BA'}, {'url': 'https://foo.com/fdroid/repo', 'countryCode': 'FO'}, {'url': 'https://wv.com/fdroid/repo', 'countryCode': 'WV'}, ], fp, ) self.assertFalse(fdroidserver.lint.lint_config('mirrors.yml')) def test_lint_config_bad_mirrors_yml_dict(self): os.chdir(self.testdir) Path('mirrors.yml').write_text('baz: [foo, bar]\n') with self.assertRaises(TypeError): fdroidserver.lint.lint_config('mirrors.yml') def test_lint_config_bad_mirrors_yml_float(self): os.chdir(self.testdir) Path('mirrors.yml').write_text('1.0\n') with self.assertRaises(TypeError): fdroidserver.lint.lint_config('mirrors.yml') def test_lint_config_bad_mirrors_yml_int(self): os.chdir(self.testdir) Path('mirrors.yml').write_text('1\n') with self.assertRaises(TypeError): fdroidserver.lint.lint_config('mirrors.yml') def test_lint_config_bad_mirrors_yml_str(self): os.chdir(self.testdir) Path('mirrors.yml').write_text('foo\n') with self.assertRaises(TypeError): fdroidserver.lint.lint_config('mirrors.yml') def test_check_certificate_pinned_binaries_empty(self): fdroidserver.common.config = {} app = fdroidserver.metadata.App() app.AllowedAPKSigningKeys = [ 'a40da80a59d170caa950cf15c18c454d47a39b26989d8b640ecd745ba71bf5dc' ] self.assertEqual( [], list(fdroidserver.lint.check_certificate_pinned_binaries(app)), "when the config is empty, any signing key should be allowed", ) def test_lint_known_debug_keys_no_match(self): fdroidserver.common.config = { "apk_signing_key_block_list": "a40da80a59d170caa950cf15c18c454d47a39b26989d8b640ecd745ba71bf5dc" } app = fdroidserver.metadata.App() app.AllowedAPKSigningKeys = [ '2fd4fd5f54babba4bcb21237809bb653361d0d2583c80964ec89b28a26e9539e' ] self.assertEqual( [], list(fdroidserver.lint.check_certificate_pinned_binaries(app)), "A signing key that does not match one in the config should be allowed", ) def test_lint_known_debug_keys(self): fdroidserver.common.config = { 'apk_signing_key_block_list': 'a40da80a59d170caa950cf15c18c454d47a39b26989d8b640ecd745ba71bf5dc' } app = fdroidserver.metadata.App() app.AllowedAPKSigningKeys = [ 'a40da80a59d170caa950cf15c18c454d47a39b26989d8b640ecd745ba71bf5dc' ] for warn in fdroidserver.lint.check_certificate_pinned_binaries(app): anywarns = True logging.debug(warn) self.assertTrue(anywarns) class LintAntiFeaturesTest(unittest.TestCase): def setUp(self): self.basedir = localmodule / 'tests' os.chdir(self.basedir) fdroidserver.common.config = dict() fdroidserver.lint.ANTIFEATURES_KEYS = None fdroidserver.lint.load_antiFeatures_config() def test_check_antiFeatures_empty(self): app = fdroidserver.metadata.App() self.assertEqual([], list(fdroidserver.lint.check_antiFeatures(app))) def test_check_antiFeatures_empty_AntiFeatures(self): app = fdroidserver.metadata.App() app['AntiFeatures'] = [] self.assertEqual([], list(fdroidserver.lint.check_antiFeatures(app))) def test_check_antiFeatures(self): app = fdroidserver.metadata.App() app['AntiFeatures'] = ['Ads', 'UpstreamNonFree'] self.assertEqual([], list(fdroidserver.lint.check_antiFeatures(app))) def test_check_antiFeatures_fails_one(self): app = fdroidserver.metadata.App() app['AntiFeatures'] = ['Ad'] self.assertEqual(1, len(list(fdroidserver.lint.check_antiFeatures(app)))) def test_check_antiFeatures_fails_many(self): app = fdroidserver.metadata.App() app['AntiFeatures'] = ['Adss', 'Tracker', 'NoSourceSince', 'FAKE', 'NonFree'] self.assertEqual(4, len(list(fdroidserver.lint.check_antiFeatures(app)))) def test_check_antiFeatures_build_empty(self): app = fdroidserver.metadata.App() app['Builds'] = [{'antifeatures': []}] self.assertEqual([], list(fdroidserver.lint.check_antiFeatures(app))) def test_check_antiFeatures_build(self): app = fdroidserver.metadata.App() app['Builds'] = [{'antifeatures': ['Tracking']}] self.assertEqual(0, len(list(fdroidserver.lint.check_antiFeatures(app)))) def test_check_antiFeatures_build_fail(self): app = fdroidserver.metadata.App() app['Builds'] = [{'antifeatures': ['Ads', 'Tracker']}] self.assertEqual(1, len(list(fdroidserver.lint.check_antiFeatures(app)))) if __name__ == "__main__": import argparse parser = argparse.ArgumentParser() parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) fdroidserver.lint.options = parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(LintTest)) unittest.main(failfast=False) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/main.TestCase0000755000175000017500000002465614620351225016545 0ustar00hanshans#!/usr/bin/env python3 import inspect import os import sys import pkgutil import textwrap import unittest import tempfile from unittest import mock localmodule = os.path.realpath( os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') ) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) from fdroidserver import common import fdroidserver.__main__ from testcommon import TmpCwd, TmpPyPath class MainTest(unittest.TestCase): '''this tests fdroid.py''' def test_COMMANDS_check(self): """make sure the built in sub-command defs didn't change unintentionally""" self.assertListEqual( [x for x in fdroidserver.__main__.COMMANDS.keys()], [ 'build', 'init', 'publish', 'gpgsign', 'update', 'deploy', 'verify', 'checkupdates', 'import', 'install', 'readmeta', 'rewritemeta', 'lint', 'scanner', 'signindex', 'btlog', 'signatures', 'nightly', 'mirror', ], ) def test_call_init(self): co = mock.Mock() with mock.patch('sys.argv', ['', 'init', '-h']): with mock.patch('fdroidserver.init.main', co): with mock.patch('sys.exit') as exit_mock: fdroidserver.__main__.main() # note: this is sloppy, if `init` changes # this might need changing too exit_mock.assert_called_once_with(0) co.assert_called_once_with() def test_call_deploy(self): co = mock.Mock() with mock.patch('sys.argv', ['', 'deploy', '-h']): with mock.patch('fdroidserver.deploy.main', co): with mock.patch('sys.exit') as exit_mock: fdroidserver.__main__.main() # note: this is sloppy, if `deploy` changes # this might need changing too exit_mock.assert_called_once_with(0) co.assert_called_once_with() def test_find_plugins(self): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with open('fdroid_testy1.py', 'w') as f: f.write( textwrap.dedent( """\ fdroid_summary = "ttt" main = lambda: 'all good'""" ) ) with TmpPyPath(tmpdir): plugins = fdroidserver.__main__.find_plugins() self.assertIn('testy1', plugins.keys()) self.assertEqual(plugins['testy1']['summary'], 'ttt') self.assertEqual( __import__( plugins['testy1']['name'], None, None, ['testy1'] ).main(), 'all good', ) def test_main_plugin_lambda(self): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with open('fdroid_testy2.py', 'w') as f: f.write( textwrap.dedent( """\ fdroid_summary = "ttt" main = lambda: print('all good')""" ) ) with TmpPyPath(tmpdir): with mock.patch('sys.argv', ['', 'testy2']): with mock.patch('sys.exit') as exit_mock: fdroidserver.__main__.main() exit_mock.assert_called_once_with(0) def test_main_plugin_def(self): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with open('fdroid_testy3.py', 'w') as f: f.write( textwrap.dedent( """\ fdroid_summary = "ttt" def main(): print('all good')""" ) ) with TmpPyPath(tmpdir): with mock.patch('sys.argv', ['', 'testy3']): with mock.patch('sys.exit') as exit_mock: fdroidserver.__main__.main() exit_mock.assert_called_once_with(0) def test_main_broken_plugin(self): """making sure broken plugins get their exceptions through""" with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with open('fdroid_testy4.py', 'w') as f: f.write( textwrap.dedent( """\ fdroid_summary = "ttt" def main(): raise Exception("this plugin is broken")""" ) ) with TmpPyPath(tmpdir): with mock.patch('sys.argv', ['', 'testy4']): with self.assertRaisesRegex(Exception, "this plugin is broken"): fdroidserver.__main__.main() def test_main_malicious_plugin(self): """The purpose of this test is to make sure code in plugins doesn't get executed unintentionally. """ with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with open('fdroid_testy5.py', 'w') as f: f.write( textwrap.dedent( """\ fdroid_summary = "ttt" raise Exception("this plugin is malicious") def main(): print("evil things")""" ) ) with TmpPyPath(tmpdir): with mock.patch('sys.argv', ['', 'lint']): with mock.patch('sys.exit') as exit_mock: fdroidserver.__main__.main() # note: this is sloppy, if `lint` changes # this might need changing too exit_mock.assert_called_once_with(0) def test_main_prevent_plugin_override(self): """making sure build-in subcommands cannot be overridden by plugins""" with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with open('fdroid_signatures.py', 'w') as f: f.write( textwrap.dedent( """\ fdroid_summary = "ttt" def main(): raise("plugin overrides don't get prevent!")""" ) ) with TmpPyPath(tmpdir): with mock.patch('sys.argv', ['', 'signatures']): with mock.patch('sys.exit') as exit_mock: fdroidserver.__main__.main() # note: this is sloppy, if `signatures` changes # this might need changing too self.assertEqual(exit_mock.call_count, 2) def test_preparse_plugin_lookup_bad_name(self): self.assertRaises( ValueError, fdroidserver.__main__.preparse_plugin, "some.package", "/non/existent/module/path", ) def test_preparse_plugin_lookup_bad_path(self): self.assertRaises( ValueError, fdroidserver.__main__.preparse_plugin, "fake_module_name", "/non/existent/module/path", ) def test_preparse_plugin_lookup_summary_missing(self): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with open('fdroid_testy6.py', 'w') as f: f.write( textwrap.dedent( """\ main = lambda: print('all good')""" ) ) with TmpPyPath(tmpdir): p = [x for x in pkgutil.iter_modules() if x[1].startswith('fdroid_')] module_dir = p[0][0].path module_name = p[0][1] self.assertRaises( NameError, fdroidserver.__main__.preparse_plugin, module_name, module_dir, ) def test_preparse_plugin_lookup_module_file(self): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with open('fdroid_testy7.py', 'w') as f: f.write( textwrap.dedent( """\ fdroid_summary = "ttt" main = lambda: pritn('all good')""" ) ) with TmpPyPath(tmpdir): p = [x for x in pkgutil.iter_modules() if x[1].startswith('fdroid_')] module_path = p[0][0].path module_name = p[0][1] d = fdroidserver.__main__.preparse_plugin(module_name, module_path) self.assertDictEqual(d, {'name': 'fdroid_testy7', 'summary': 'ttt'}) def test_preparse_plugin_lookup_module_dir(self): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): os.mkdir(os.path.join(tmpdir, 'fdroid_testy8')) with open('fdroid_testy8/__main__.py', 'w') as f: f.write( textwrap.dedent( """\ fdroid_summary = "ttt" main = lambda: print('all good')""" ) ) with open('fdroid_testy8/__init__.py', 'w') as f: pass with TmpPyPath(tmpdir): p = [x for x in pkgutil.iter_modules() if x[1].startswith('fdroid_')] module_path = p[0][0].path module_name = p[0][1] d = fdroidserver.__main__.preparse_plugin(module_name, module_path) self.assertDictEqual(d, {'name': 'fdroid_testy8', 'summary': 'ttt'}) if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) import argparse parser = argparse.ArgumentParser() parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) common.options = common.parse_args(parser) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(MainTest)) unittest.main(failfast=False) ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1715589989.920383 fdroidserver-2.3a1/tests/metadata/0000755000175000017500000000000014620351546015732 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9243832 fdroidserver-2.3a1/tests/metadata/apk/0000755000175000017500000000000014620351546016505 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/apk/info.guardianproject.urzip.yaml0000644000175000017500000000130014620351225024640 0ustar00hanshansantiFeatures: {} features: [] hash: abfb3adb7496611749e7abfb014c5c789e3a02489e48a5c3665110d1b1acd931 hashType: sha256 icon: info.guardianproject.urzip.100.png icons: '0': info.guardianproject.urzip.100.png '160': info.guardianproject.urzip.100.png icons_src: '-1': res/drawable/ic_launcher.png '160': res/drawable/ic_launcher.png ipfsCIDv1: bafybeigmtgrwyvj77jaflje2rf533haeqtpu2wtwsctryjusjnsawacsam minSdkVersion: 4 name: urzip packageName: info.guardianproject.urzip sig: e0ecb5fc2d63088e4a07ae410a127722 signer: 7eabd8c15de883d1e82b5df2fd4f7f769e498078e9ad6dc901f0e96db77ceac3 size: 9969 targetSdkVersion: 18 uses-permission: [] uses-permission-sdk-23: [] versionCode: 100 versionName: '0.1' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/apk/org.dyndns.fules.ck.yaml0000644000175000017500000000236214620351225023164 0ustar00hanshansantiFeatures: {} features: [] hash: 897486e1f857c6c0ee32ccbad0e1b8cd82f6d0e65a44a23f13f852d2b63a18c8 hashType: sha256 icon: org.dyndns.fules.ck.20.png icons: '0': org.dyndns.fules.ck.20.png '120': org.dyndns.fules.ck.20.png '160': org.dyndns.fules.ck.20.png '240': org.dyndns.fules.ck.20.png icons_src: '-1': res/drawable-mdpi-v4/icon_launcher.png '120': res/drawable-ldpi-v4/icon_launcher.png '160': res/drawable-mdpi-v4/icon_launcher.png '240': res/drawable-hdpi-v4/icon_launcher.png ipfsCIDv1: bafybeifijmr5ygvfvig4vzbmdc3ysj6m46ddohaol4vgp4qoyooqpc27zu minSdkVersion: 7 name: Compass Keyboard nativecode: - arm64-v8a - armeabi - armeabi-v7a - mips - mips64 - x86 - x86_64 packageName: org.dyndns.fules.ck sig: 9bf7a6a67f95688daec75eab4b1436ac signer: 9326a2cc1a2f148202bc7837a0af3b81200bd37fd359c9e13a2296a71d342056 size: 132453 targetSdkVersion: 8 uses-permission: - !!python/object/new:fdroidserver.update.UsesPermission - android.permission.BIND_INPUT_METHOD - null - !!python/object/new:fdroidserver.update.UsesPermission - android.permission.READ_EXTERNAL_STORAGE - null - !!python/object/new:fdroidserver.update.UsesPermission - android.permission.VIBRATE - null uses-permission-sdk-23: [] versionCode: 20 versionName: v1.6pre2 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/tests/metadata/app.with.special.build.params/0000755000175000017500000000000014620351546023463 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/tests/metadata/app.with.special.build.params/en-US/0000755000175000017500000000000014620351546024412 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9243832 fdroidserver-2.3a1/tests/metadata/app.with.special.build.params/en-US/antifeatures/0000755000175000017500000000000014620351546027104 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/app.with.special.build.params/en-US/antifeatures/50_Ads.txt0000644000175000017500000000002014620351225030642 0ustar00hanshansincludes ad lib ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/app.with.special.build.params/en-US/antifeatures/50_Tracking.txt0000644000175000017500000000002214620351225031677 0ustar00hanshansstandard suspects ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/app.with.special.build.params/en-US/antifeatures/Ads.txt0000644000175000017500000000001114620351225030336 0ustar00hanshansplease no././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/app.with.special.build.params/en-US/antifeatures/NoSourceSince.txt0000644000175000017500000000001414620351225032351 0ustar00hanshansno activity ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/tests/metadata/app.with.special.build.params/zh-CN/0000755000175000017500000000000014620351546024402 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9243832 fdroidserver-2.3a1/tests/metadata/app.with.special.build.params/zh-CN/antifeatures/0000755000175000017500000000000014620351546027074 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/app.with.special.build.params/zh-CN/antifeatures/49_Tracking.txt0000644000175000017500000000003714620351225031705 0ustar00hanshansText from zh-CN/49_Tracking.txt././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/app.with.special.build.params/zh-CN/antifeatures/50_Ads.txt0000644000175000017500000000002614620351225030640 0ustar00hanshans包括广告图书馆 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/app.with.special.build.params.yml0000644000175000017500000000522314620351225024202 0ustar00hanshansAntiFeatures: - UpstreamNonFree Categories: - System License: GPL-3.0-only SourceCode: https://github.com/loadrunner/Facebook-Contact-Sync IssueTracker: https://github.com/loadrunner/Facebook-Contact-Sync/issues AutoName: UberSync for Facebook Summary: Sync your Facebook Contacts Description: |- To configure, go to "Settings => Accounts & Sync => Add Account". Depending on how many friends you have, the first import might take a while, so be patient. * Facebook does not allow to export phone numbers or emails: only names, pictures and statuses are synced. * Facebook users have the option to block one or all apps: if they opt for that, they will be EXCLUDED from your friends list. Appbrain SDK was removed before building. RepoType: git Repo: https://github.com/loadrunner/Facebook-Contact-Sync.git Builds: - versionName: 1.0.0 versionCode: 32 commit: b3879c973e7cac3a3319 - versionName: 1.0.1 versionCode: 33 commit: 252c8dd4c9 - versionName: 1.2.0 versionCode: 39 commit: v1.2.0 patch: - appbrain.patch srclibs: - FacebookSDK@sdk-version-3.0.1 rm: - libs/appbrain-sdk-android.jar prebuild: - sed -i 's@\(reference.1=\).*@\1$$FacebookSDK$$@' project.properties - sed -i 's/Class\[\]/Class\\[\]/g' $$FacebookSDK$$/src/com/facebook/model/GraphObject.java - versionName: 1.2.2 versionCode: 42 commit: v1.2.2 patch: - appbrain.patch srclibs: - FacebookSDK@sdk-version-3.0.2 rm: - libs/appbrain-sdk-android.jar extlibs: - android/android-support-v4.jar prebuild: - mv libs/android-support-v4.jar $$FacebookSDK$$/libs/ - sed -i 's@\(reference.1=\).*@\1$$FacebookSDK$$@' project.properties - sed -i 's/Class\[\]/Class\\[\]/g' $$FacebookSDK$$/src/com/facebook/model/GraphObject.java - versionName: 2.1.1 versionCode: 48 commit: 2.1.1 patch: - manifest-ads.patch - mobilecore.patch maven: yes srclibs: - FacebookSDK@sdk-version-3.0.2 - versionName: 2.1.1-b versionCode: 49 commit: 2.1.1 patch: - manifest-ads.patch - mobilecore.patch maven: yes@.. srclibs: - FacebookSDK@sdk-version-3.0.2 antifeatures: Tracking: Uses the Facebook SDK. - versionName: 2.1.1-c versionCode: 50 commit: 2.1.1 patch: - manifest-ads.patch - mobilecore.patch maven: '2' srclibs: - FacebookSDK@sdk-version-3.0.2 - versionName: 2.1.2 versionCode: 51 disable: Labelled as pre-release, so skipped ArchivePolicy: 0 AutoUpdateMode: None UpdateCheckMode: None CurrentVersion: 2.1.2 CurrentVersionCode: 49 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/com.politedroid.yml0000644000175000017500000000217614620351225021550 0ustar00hanshansAntiFeatures: - NonFreeNet Categories: - Multimedia - Security - Time License: GPL-3.0-only SourceCode: https://github.com/miguelvps/PoliteDroid IssueTracker: https://github.com/miguelvps/PoliteDroid/issues AutoName: Polite Droid Summary: Calendar tool Description: Activates silent mode during calendar events. RepoType: git Repo: https://github.com/miguelvps/PoliteDroid.git Builds: - versionName: '1.2' versionCode: 3 commit: 6a548e4b19 target: android-10 antifeatures: - KnownVuln - UpstreamNonFree - NonFreeAssets - versionName: '1.3' versionCode: 4 commit: ad865b57bf3ac59580f38485608a9b1dda4fa7dc target: android-15 - versionName: '1.4' versionCode: 5 commit: 456bd615f3fbe6dff06433928cf7ea20073601fb target: android-10 - versionName: '1.5' versionCode: 6 commit: v1.5 sudo: echo 'this is just a test' gradle: - yes antifeatures: - KnownVuln - UpstreamNonFree - NonFreeAssets ArchivePolicy: 4 versions AutoUpdateMode: Version v%v UpdateCheckMode: Tags CurrentVersion: '1.5' CurrentVersionCode: 6 NoSourceSince: '1.5' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9243832 fdroidserver-2.3a1/tests/metadata/dump/0000755000175000017500000000000014620351546016677 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/dump/app.with.special.build.params.yaml0000644000175000017500000001554014620351225025313 0ustar00hanshansAllowedAPKSigningKeys: [] AntiFeatures: UpstreamNonFree: {} ArchivePolicy: 0 AuthorEmail: null AuthorName: null AuthorWebSite: null AutoName: UberSync for Facebook AutoUpdateMode: None Binaries: null Bitcoin: null Builds: - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: [] commit: b3879c973e7cac3a3319 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: '' rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: null submodules: false sudo: '' target: null timeout: null versionCode: 32 versionName: 1.0.0 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: [] commit: 252c8dd4c9 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: '' rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: null submodules: false sudo: '' target: null timeout: null versionCode: 33 versionName: 1.0.1 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: [] commit: v1.2.0 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: - appbrain.patch postbuild: '' preassemble: [] prebuild: - sed -i 's@\(reference.1=\).*@\1$$FacebookSDK$$@' project.properties - sed -i 's/Class\[\]/Class\\[\]/g' $$FacebookSDK$$/src/com/facebook/model/GraphObject.java rm: - libs/appbrain-sdk-android.jar scandelete: [] scanignore: [] srclibs: - FacebookSDK@sdk-version-3.0.1 subdir: null submodules: false sudo: '' target: null timeout: null versionCode: 39 versionName: 1.2.0 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: [] commit: v1.2.2 disable: '' encoding: null extlibs: - android/android-support-v4.jar forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: - appbrain.patch postbuild: '' preassemble: [] prebuild: - mv libs/android-support-v4.jar $$FacebookSDK$$/libs/ - sed -i 's@\(reference.1=\).*@\1$$FacebookSDK$$@' project.properties - sed -i 's/Class\[\]/Class\\[\]/g' $$FacebookSDK$$/src/com/facebook/model/GraphObject.java rm: - libs/appbrain-sdk-android.jar scandelete: [] scanignore: [] srclibs: - FacebookSDK@sdk-version-3.0.2 subdir: null submodules: false sudo: '' target: null timeout: null versionCode: 42 versionName: 1.2.2 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: [] commit: 2.1.1 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: yes ndk: null novcheck: false oldsdkloc: false output: null patch: - manifest-ads.patch - mobilecore.patch postbuild: '' preassemble: [] prebuild: '' rm: [] scandelete: [] scanignore: [] srclibs: - FacebookSDK@sdk-version-3.0.2 subdir: null submodules: false sudo: '' target: null timeout: null versionCode: 48 versionName: 2.1.1 - androidupdate: [] antcommands: [] antifeatures: Tracking: en-US: Uses the Facebook SDK. binary: null build: '' buildjni: [] commit: 2.1.1 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: yes@.. ndk: null novcheck: false oldsdkloc: false output: null patch: - manifest-ads.patch - mobilecore.patch postbuild: '' preassemble: [] prebuild: '' rm: [] scandelete: [] scanignore: [] srclibs: - FacebookSDK@sdk-version-3.0.2 subdir: null submodules: false sudo: '' target: null timeout: null versionCode: 49 versionName: 2.1.1-b - androidupdate: [] antcommands: [] antifeatures: Ads: en-US: 'includes ad lib ' zh-CN: '包括广告图书馆 ' Tracking: en-US: 'standard suspects ' binary: null build: '' buildjni: [] commit: 2.1.1 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: '2' ndk: null novcheck: false oldsdkloc: false output: null patch: - manifest-ads.patch - mobilecore.patch postbuild: '' preassemble: [] prebuild: '' rm: [] scandelete: [] scanignore: [] srclibs: - FacebookSDK@sdk-version-3.0.2 subdir: null submodules: false sudo: '' target: null timeout: null versionCode: 50 versionName: 2.1.1-c - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: [] commit: null disable: Labelled as pre-release, so skipped encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: '' rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: null submodules: false sudo: '' target: null timeout: null versionCode: 51 versionName: 2.1.2 Categories: - System Changelog: '' CurrentVersion: 2.1.2 CurrentVersionCode: 49 Description: 'To configure, go to "Settings => Accounts & Sync => Add Account". Depending on how many friends you have, the first import might take a while, so be patient. * Facebook does not allow to export phone numbers or emails: only names, pictures and statuses are synced. * Facebook users have the option to block one or all apps: if they opt for that, they will be EXCLUDED from your friends list. Appbrain SDK was removed before building.' Disabled: null Donate: null FlattrID: null IssueTracker: https://github.com/loadrunner/Facebook-Contact-Sync/issues Liberapay: null License: GPL-3.0-only Litecoin: null MaintainerNotes: '' Name: null NoSourceSince: '' OpenCollective: null Provides: null Repo: https://github.com/loadrunner/Facebook-Contact-Sync.git RepoType: git RequiresRoot: false SourceCode: https://github.com/loadrunner/Facebook-Contact-Sync Summary: Sync your Facebook Contacts Translation: '' UpdateCheckData: null UpdateCheckIgnore: null UpdateCheckMode: None UpdateCheckName: null VercodeOperation: [] WebSite: '' added: null id: app.with.special.build.params lastUpdated: null metadatapath: metadata/app.with.special.build.params.yml ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/dump/com.politedroid.yaml0000644000175000017500000000670514620351225022660 0ustar00hanshansAllowedAPKSigningKeys: [] AntiFeatures: NoSourceSince: en-US: '1.5' NonFreeNet: {} ArchivePolicy: 4 AuthorEmail: null AuthorName: null AuthorWebSite: null AutoName: Polite Droid AutoUpdateMode: Version v%v Binaries: null Bitcoin: null Builds: - androidupdate: [] antcommands: [] antifeatures: KnownVuln: {} NonFreeAssets: {} UpstreamNonFree: {} binary: null build: '' buildjni: [] commit: 6a548e4b19 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: '' rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: null submodules: false sudo: '' target: android-10 timeout: null versionCode: 3 versionName: '1.2' - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: [] commit: ad865b57bf3ac59580f38485608a9b1dda4fa7dc disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: '' rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: null submodules: false sudo: '' target: android-15 timeout: null versionCode: 4 versionName: '1.3' - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: [] commit: 456bd615f3fbe6dff06433928cf7ea20073601fb disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: '' rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: null submodules: false sudo: '' target: android-10 timeout: null versionCode: 5 versionName: '1.4' - androidupdate: [] antcommands: [] antifeatures: KnownVuln: {} NonFreeAssets: {} UpstreamNonFree: {} binary: null build: '' buildjni: [] commit: v1.5 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - yes gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: '' rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: null submodules: false sudo: - echo 'this is just a test' target: null timeout: null versionCode: 6 versionName: '1.5' Categories: - Multimedia - Security - Time Changelog: '' CurrentVersion: '1.5' CurrentVersionCode: 6 Description: Activates silent mode during calendar events. Disabled: null Donate: null FlattrID: null IssueTracker: https://github.com/miguelvps/PoliteDroid/issues Liberapay: null License: GPL-3.0-only Litecoin: null MaintainerNotes: '' Name: null NoSourceSince: '1.5' OpenCollective: null Provides: null Repo: https://github.com/miguelvps/PoliteDroid.git RepoType: git RequiresRoot: false SourceCode: https://github.com/miguelvps/PoliteDroid Summary: Calendar tool Translation: '' UpdateCheckData: null UpdateCheckIgnore: null UpdateCheckMode: Tags UpdateCheckName: null VercodeOperation: [] WebSite: '' added: null id: com.politedroid lastUpdated: null metadatapath: metadata/com.politedroid.yml ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/dump/org.adaway.yaml0000644000175000017500000005074214620351225021621 0ustar00hanshansAllowedAPKSigningKeys: [] AntiFeatures: {} ArchivePolicy: null AuthorEmail: null AuthorName: null AuthorWebSite: null AutoName: AdAway AutoUpdateMode: Version v%v Binaries: null Bitcoin: null Builds: - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: - yes commit: ea5378a94ee0dc1d99d2cec95fae7e6d81afb2b9 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: '' rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: org_adaway/ submodules: false sudo: '' target: null timeout: null versionCode: 13 versionName: '1.12' - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: - yes commit: 4128e59da2eac5c2904c7c7568d298ca51e79540 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: - defprop.patch postbuild: '' preassemble: [] prebuild: '' rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: org_adaway/ submodules: false sudo: '' target: null timeout: null versionCode: 16 versionName: '1.15' - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: - yes commit: 0b9985398b9eef7baf6aadd0dbb12002bc199d2e disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: - defprop.patch postbuild: '' preassemble: [] prebuild: '' rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: org_adaway/ submodules: false sudo: '' target: null timeout: null versionCode: 19 versionName: '1.18' - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: - yes commit: ab27f4dab5f3ea5e228cfb4a6b0e1fbf53695f22 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: - defprop.patch postbuild: '' preassemble: [] prebuild: '' rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: org_adaway/ submodules: false sudo: '' target: null timeout: null versionCode: 20 versionName: '1.19' - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: - yes commit: 695e3801e4081026c8f7213a2345fc451d5eb89c disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: - defprop.patch postbuild: '' preassemble: [] prebuild: '' rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: org_adaway/ submodules: false sudo: '' target: null timeout: null versionCode: 21 versionName: '1.20' - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: - yes commit: 65138c11cc8b6affd28b68e125fbc1dff0886a4e disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: - defprop.patch postbuild: '' preassemble: [] prebuild: '' rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: org_adaway/ submodules: false sudo: '' target: null timeout: null versionCode: 22 versionName: '1.21' - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: [] commit: unknown - see disabled disable: no source in repo encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: '' rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: null submodules: false sudo: '' target: null timeout: null versionCode: 24 versionName: '1.23' - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: - yes commit: f811e53e1e1d2ee047b18715fd7d2072b90ae76b disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - android update project -p ../com_actionbarsherlock rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: org_adaway/ submodules: false sudo: '' target: null timeout: null versionCode: 25 versionName: '1.24' - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: - yes commit: ff97932761cdee68638dc2550751a64b2cbe18e7 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - android update project -p ../com_actionbarsherlock rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: org_adaway/ submodules: false sudo: '' target: null timeout: null versionCode: 26 versionName: '1.25' - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: - yes commit: 33d4d80998f30bafc88c04c80cbae00b03916f99 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - android update project -p ../com_actionbarsherlock rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: org_adaway/ submodules: false sudo: '' target: null timeout: null versionCode: 27 versionName: '1.26' - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: - yes commit: 743d25a7e287505461f33f4b8e57e4cf988fffea disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - android update project -p ../com_actionbarsherlock rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: org_adaway/ submodules: false sudo: '' target: null timeout: null versionCode: 28 versionName: '1.27' - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: - yes commit: eaa07f4 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - android update project -p ../com_actionbarsherlock - rm -rf libs/armeabi/* rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: org_adaway/ submodules: false sudo: '' target: null timeout: null versionCode: 30 versionName: '1.29' - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: [] commit: 71ced3f disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - android update project -p ../com_actionbarsherlock - rm -rf libs/armeabi/* - rm libs/android-support-v4.jar rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: org_adaway/ submodules: false sudo: '' target: null timeout: null versionCode: 33 versionName: '1.32' - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: [] commit: 9d63c18 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - android update project -p ../com_actionbarsherlock - rm -rf libs/armeabi/* rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: org_adaway/ submodules: false sudo: '' target: null timeout: null versionCode: 34 versionName: '1.33' - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: [] commit: f2568b1 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - android update project -p ../com_actionbarsherlock - rm -rf libs/armeabi/* - android update project -p ../org_donations rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: org_adaway/ submodules: false sudo: '' target: null timeout: null versionCode: 35 versionName: '1.34' - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: [] commit: 7442d5d disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - android update project -p ../com_actionbarsherlock - rm -rf libs/armeabi/* - android update project -p ../org_donations rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: org_adaway/ submodules: false sudo: '' target: null timeout: null versionCode: 36 versionName: '1.35' - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: [] commit: 83fc713 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - android update project -p ../com_actionbarsherlock - rm -rf libs/armeabi/* - android update project -p ../org_donations rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: org_adaway/ submodules: false sudo: '' target: null timeout: null versionCode: 37 versionName: '1.36' - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: [] commit: 70da32b567122b701cdcb1609b780eb85732028f disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - android update project -p ../com_actionbarsherlock - rm -rf libs/armeabi/* - android update project -p ../org_donations rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: org_adaway/ submodules: false sudo: '' target: null timeout: null versionCode: 38 versionName: '1.37' - androidupdate: - . - android-libs/Donations - android-libs/ActionBarSherlock - android-libs/HtmlSpanner/htmlspanner antcommands: [] antifeatures: {} binary: null build: '' buildjni: - yes commit: v2.1 disable: '' encoding: null extlibs: - htmlcleaner/htmlcleaner-2.2.jar forcevercode: false forceversion: false gradle: [] gradleprops: [] init: - rm android-libs/Donations/custom_rules.xml - git clone https://github.com/dschuermann/HtmlSpanner android-libs/HtmlSpanner maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - rm -rf ../update_zip libs/root-commands-1.2.jar libs/htmlspanner-0.2-fork.jar - cp -f libs/htmlcleaner-2.2.jar android-libs/HtmlSpanner/htmlspanner/libs/ - echo "android.library.reference.3=$$RootCommands$$" >> project.properties - echo "android.library.reference.4=android-libs/HtmlSpanner/htmlspanner" >> project.properties - find . -type f -print0 | xargs -0 sed -i 's/org.rootcommands/org.sufficientlysecure.rootcommands/g' - cp android-libs/Donations/ant-templates/other/DonationsConfig.java android-libs/Donations/src/org/donations/ rm: [] scandelete: [] scanignore: [] srclibs: - RootCommands@c940b0e503 subdir: AdAway submodules: false sudo: '' target: null timeout: null versionCode: 40 versionName: '2.1' - androidupdate: - . - android-libs/Donations - android-libs/ActionBarSherlock - android-libs/HtmlSpanner/htmlspanner antcommands: [] antifeatures: {} binary: null build: '' buildjni: - yes commit: v2.3 disable: '' encoding: null extlibs: - htmlcleaner/htmlcleaner-2.2.jar forcevercode: false forceversion: false gradle: [] gradleprops: [] init: - rm android-libs/Donations/custom_rules.xml - git clone https://github.com/dschuermann/HtmlSpanner android-libs/HtmlSpanner maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - rm -rf ../update_zip libs/root-commands-1.2.jar libs/htmlspanner-0.2-fork.jar - cp -f libs/htmlcleaner-2.2.jar android-libs/HtmlSpanner/htmlspanner/libs/ - echo "android.library.reference.3=$$RootCommands$$" >> project.properties - echo "android.library.reference.4=android-libs/HtmlSpanner/htmlspanner" >> project.properties - find . -type f -print0 | xargs -0 sed -i 's/org.rootcommands/org.sufficientlysecure.rootcommands/g' - cp android-libs/Donations/ant-templates/other/DonationsConfig.java android-libs/Donations/src/org/donations/ rm: [] scandelete: [] scanignore: [] srclibs: - RootCommands@c940b0e503 subdir: AdAway submodules: false sudo: '' target: null timeout: null versionCode: 42 versionName: '2.3' - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: - yes commit: v2.6 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - yes gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: - renameExecutables prebuild: '' rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: AdAway submodules: false sudo: '' target: null timeout: null versionCode: 45 versionName: '2.6' - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: - yes commit: v2.7 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - yes gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: - renameExecutables prebuild: '' rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: AdAway submodules: false sudo: '' target: null timeout: null versionCode: 46 versionName: '2.7' - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: - yes commit: v2.8 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - yes gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: - renameExecutables prebuild: '' rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: AdAway submodules: false sudo: '' target: null timeout: null versionCode: 47 versionName: '2.8' - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: - yes commit: v2.8.1 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - yes gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: - renameExecutables prebuild: '' rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: AdAway submodules: false sudo: '' target: null timeout: null versionCode: 48 versionName: 2.8.1 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: - yes commit: v2.9 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - yes gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: - renameExecutables prebuild: '' rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: AdAway submodules: false sudo: '' target: null timeout: null versionCode: 49 versionName: '2.9' - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: - yes commit: v2.9.1 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - yes gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: - renameExecutables prebuild: '' rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: AdAway submodules: false sudo: '' target: null timeout: null versionCode: 50 versionName: 2.9.1 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: - yes commit: v2.9.2 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - yes gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: - renameExecutables prebuild: '' rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: AdAway submodules: false sudo: '' target: null timeout: null versionCode: 51 versionName: 2.9.2 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: - yes commit: v3.0 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - yes gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: - renameExecutables prebuild: '' rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: AdAway submodules: false sudo: '' target: null timeout: null versionCode: 52 versionName: '3.0' Categories: - System - Security Changelog: '' CurrentVersion: '3.0' CurrentVersionCode: 52 Description: 'An ad blocker that uses the hosts file. The hosts file contains a list of mappings between hostnames and IP addresses. When an app requests an ad, that request is directed to 127.0.0.1 which does nothing. There are options to run a web server to respond to blocked hostnames and to direct requests to the IP address of your choosing. You can download hosts files from the app but it is possible to use your own and to add certain sites to the white- and black-lists. [https://github.com/dschuermann/ad-away/raw/HEAD/CHANGELOG Changelog] Requires root: Yes. The hosts files is located in /system which is normally read-only.' Disabled: null Donate: http://sufficientlysecure.org/index.php/adaway FlattrID: '369138' IssueTracker: https://github.com/dschuermann/ad-away/issues Liberapay: null License: GPL-3.0-only Litecoin: null MaintainerNotes: '' Name: null NoSourceSince: '' OpenCollective: null Provides: null Repo: https://github.com/dschuermann/ad-away.git RepoType: git RequiresRoot: false SourceCode: https://github.com/dschuermann/ad-away Summary: Block advertisements Translation: https://www.transifex.com/dominikschuermann/adaway UpdateCheckData: null UpdateCheckIgnore: null UpdateCheckMode: Tags UpdateCheckName: null VercodeOperation: [] WebSite: http://sufficientlysecure.org/index.php/adaway added: null id: org.adaway lastUpdated: null metadatapath: metadata/org.adaway.yml ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/dump/org.smssecure.smssecure.yaml0000644000175000017500000002026614620351225024372 0ustar00hanshansAllowedAPKSigningKeys: [] AntiFeatures: {} ArchivePolicy: null AuthorEmail: null AuthorName: null AuthorWebSite: null AutoName: SMSSecure AutoUpdateMode: Version v%v Binaries: null Bitcoin: null Builds: - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: [] commit: 66367479a4f57f347b5cbe8f6f8f632adaae7727 disable: builds, merge changes into upstream encoding: null extlibs: [] forcevercode: true forceversion: false gradle: - yes gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - touch signing.properties - pushd $$GradleWitness$$ - gradle jar - popd - cp $$GradleWitness$$/build/libs/GradleWitness.jar libs/gradle-witness.jar - sed -i -e '20,22d' build.gradle - pushd $$PreferenceFragment$$ - gradle uploadArchives - popd - sed -i -e '/5470f5872514a6226fa1fc6f4e000991f38805691c534cf0bd2778911fc773ad/d' build.gradle - mkdir smil - pushd smil - wget -c http://www.w3.org/TR/smil-boston-dom/java-binding.zip - unzip java-binding.zip - popd - cp -fR smil/java/org src/ - rm -fR smil - sed -i -e '/org.w3c.smil/d' build.gradle - cp -fR $$AospMms$$/src/org src/ rm: - libs/* scandelete: [] scanignore: [] srclibs: - GradleWitness@10f1269c0aafdc1d478efc005ed48f3a47d44278 - PreferenceFragment@717a45433b927d2f0dfc5328f79e77c9682c37bc - ShortcutBadger@3815ce2ec0c66acd7d7c0b4f2479df8fa70fed87 - AospMms@android-5.1.0_r3 subdir: null submodules: false sudo: '' target: null timeout: null versionCode: 5 versionName: 0.3.3 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: [] commit: 9675ce5eecb929dcaddb43b3d9486fdb88b9ae1a disable: builds, wait for upstream encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - yes gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - touch signing.properties - pushd $$GradleWitness$$ - gradle jar - popd - cp $$GradleWitness$$/build/libs/GradleWitness.jar libs/gradle-witness.jar rm: - libs/*.jar scandelete: [] scanignore: [] srclibs: - GradleWitness@10f1269c0aafdc1d478efc005ed48f3a47d44278 subdir: null submodules: true sudo: '' target: null timeout: null versionCode: 6 versionName: 0.3.3 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: [] commit: v0.4.2 disable: builds locally, but not on BS encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - yes gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - touch signing.properties - ./build-witness.sh - rm -rf libs/gradle-witness/build - echo "org.gradle.jvmargs=-Xms512m -Xmx512m -XX:MaxPermSize=512m" >> gradle.properties rm: - libs/*.jar scandelete: [] scanignore: [] srclibs: [] subdir: null submodules: true sudo: '' target: null timeout: null versionCode: 9 versionName: 0.4.2 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: [] commit: v0.5.1 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - yes gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - touch signing.properties - ./build-witness.sh - rm -rf libs/gradle-witness/build - echo "org.gradle.jvmargs=-Xms512m -Xmx512m -XX:MaxPermSize=512m" >> gradle.properties rm: - libs/*.jar scandelete: [] scanignore: [] srclibs: [] subdir: null submodules: true sudo: '' target: null timeout: null versionCode: 11 versionName: 0.5.1 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: [] commit: v0.5.2 disable: broken in upstream encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - yes gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - touch signing.properties - ./scripts/build-witness.sh - rm -rf libs/gradle-witness/build rm: - libs/*.jar scandelete: [] scanignore: [] srclibs: [] subdir: null submodules: true sudo: '' target: null timeout: null versionCode: 12 versionName: 0.5.2 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: [] commit: v0.5.3 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - yes gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - touch signing.properties - ./scripts/build-witness.sh - rm -rf libs/gradle-witness/build rm: - libs/*.jar scandelete: [] scanignore: [] srclibs: [] subdir: null submodules: true sudo: '' target: null timeout: null versionCode: 100 versionName: 0.5.3 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: [] commit: v0.5.4 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - yes gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - touch signing.properties - ./scripts/build-witness.sh - rm -rf libs/gradle-witness/build rm: - libs/*.jar scandelete: [] scanignore: [] srclibs: [] subdir: null submodules: true sudo: '' target: null timeout: null versionCode: 101 versionName: 0.5.4 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: '' buildjni: [] commit: v0.6.0 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - yes gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - touch signing.properties - ./scripts/build-witness.sh - rm -rf libs/gradle-witness/build rm: - libs/*.jar scandelete: [] scanignore: [] srclibs: [] subdir: null submodules: true sudo: '' target: null timeout: null versionCode: 102 versionName: 0.6.0 Categories: - Phone & SMS Changelog: '' CurrentVersion: 0.6.0 CurrentVersionCode: 102 Description: 'SMSSecure is an SMS/MMS application that allows you to protect your privacy while communicating with friends. Using SMSSecure, you can send SMS messages and share media or attachments with complete privacy. * Easy. SMSSecure works like any other SMS application. There''s nothing to sign up for and no new service your friends need to join. * Reliable. SMSSecure communicates using encrypted SMS messages. No servers or internet connection required. * Private. SMSSecure uses the TextSecure encryption protocol to provide privacy for every message, every time. * Safe. All messages are encrypted locally, so if your phone is lost or stolen, your messages are protected. * Open Source. SMSSecure is Free and Open Source, enabling anyone to verify its security by auditing the code.' Disabled: null Donate: null FlattrID: null IssueTracker: https://github.com/SMSSecure/SMSSecure/issues Liberapay: null License: GPL-3.0-only Litecoin: null MaintainerNotes: '' Name: null NoSourceSince: '' OpenCollective: null Provides: null Repo: https://github.com/SMSSecure/SMSSecure RepoType: git RequiresRoot: false SourceCode: https://github.com/SMSSecure/SMSSecure Summary: Send encrypted text messages (SMS) Translation: https://www.transifex.com/silence/silence UpdateCheckData: null UpdateCheckIgnore: null UpdateCheckMode: Tags UpdateCheckName: null VercodeOperation: [] WebSite: http://www.smssecure.org added: null id: org.smssecure.smssecure lastUpdated: null metadatapath: metadata/org.smssecure.smssecure.yml ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/dump/org.videolan.vlc.yaml0000644000175000017500000014226114620351225022735 0ustar00hanshansAllowedAPKSigningKeys: [] AntiFeatures: {} ArchivePolicy: 9 AuthorEmail: null AuthorName: null AuthorWebSite: null AutoName: VLC AutoUpdateMode: None Binaries: null Bitcoin: null Builds: - androidupdate: - . - ../java-libs/SlidingMenu - ../java-libs/ActionBarSherlock antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] commit: 0.0.11 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: true gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '48d' ../Makefile rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 110 versionName: 0.0.11-ARMv7 - androidupdate: - . - ../java-libs/SlidingMenu - ../java-libs/ActionBarSherlock antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi ./compile.sh release buildjni: [] commit: 0.0.11 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: true gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '48d' ../Makefile rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 111 versionName: 0.0.11-ARM - androidupdate: - . - ../java-libs/SlidingMenu - ../java-libs/ActionBarSherlock antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] commit: unknown - see disabled disable: ffmpeg error 0.0.11 encoding: null extlibs: [] forcevercode: true forceversion: true gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '48d' ../Makefile rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 112 versionName: 0.0.11-x86 - androidupdate: - . - ../java-libs/SlidingMenu - ../java-libs/ActionBarSherlock antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=mips ./compile.sh release buildjni: [] commit: 0.0.11 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: true gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '48d' ../Makefile rm: [] scandelete: [] scanignore: [] srclibs: [] subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 113 versionName: 0.0.11-mips - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=mips ./compile.sh release buildjni: [] commit: 0.1.3 disable: build failing (at 0.1.3) encoding: null extlibs: [] forcevercode: true forceversion: true gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: - ndkr9.patch postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@7c52aacbe subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1301 versionName: 0.1.3-MIPS - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] commit: 0.1.3 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: true gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: - ndkr9.patch postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@7c52aacbe subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1302 versionName: 0.1.3-x86 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi ./compile.sh release buildjni: [] commit: 0.1.3 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: true gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: - ndkr9.patch postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@7c52aacbe subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1303 versionName: 0.1.3-ARM - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] commit: 0.1.3 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: true gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: - ndkr9.patch postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@7c52aacbe subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1304 versionName: 0.1.3-ARMv7 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] commit: 0.9.0 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@31ffb20309264994 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 9002 versionName: 0.9.0 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] commit: 0.9.0 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@31ffb20309264994 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 9004 versionName: 0.9.0 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] commit: 0.9.1 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@37e886d113b8b567c15208579fb2f subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 9102 versionName: 0.9.1 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] commit: 0.9.1 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@37e886d113b8b567c15208579fb2f subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 9104 versionName: 0.9.1 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] commit: 0.9.5 disable: can't download gmp encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@052600173f376ff58ff04d53746961a2 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 9502 versionName: 0.9.5 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] commit: 0.9.5 disable: can't download gmp encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@052600173f376ff58ff04d53746961a2 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 9504 versionName: 0.9.5 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] commit: 0.9.6 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC-2.2@27f4799 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 9602 versionName: 0.9.6 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] commit: 0.9.6 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC-2.2@27f4799 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 9604 versionName: 0.9.6 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] commit: 0.9.7 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC-2.2@9e1c6ff subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 9702 versionName: 0.9.7 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] commit: 0.9.7 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC-2.2@9e1c6ff subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 9704 versionName: 0.9.7 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=mips ./compile.sh release buildjni: [] commit: 0.9.7.1 disable: build fails encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC-2.2@57cd36b subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 9711 versionName: 0.9.7.1 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] commit: 0.9.7.1 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC-2.2@57cd36b subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 9712 versionName: 0.9.7.1 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] commit: 0.9.7.1 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC-2.2@57cd36b subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 9714 versionName: 0.9.7.1 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] commit: 0.9.8 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC-2.2@f2db364 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 9802 versionName: 0.9.8 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi ./compile.sh release buildjni: [] commit: 0.9.8 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC-2.2@f2db364 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 9803 versionName: 0.9.8 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] commit: 0.9.8 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC-2.2@f2db364 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 9804 versionName: 0.9.8 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] commit: 0.9.9 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC-2.2@e731dc23a4f8ef6782c7cc2236bbbf41c034dad1 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 9902 versionName: 0.9.9 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi ./compile.sh release buildjni: [] commit: 0.9.9 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC-2.2@e731dc23a4f8ef6782c7cc2236bbbf41c034dad1 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 9903 versionName: 0.9.9 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] commit: 0.9.9 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC-2.2@e731dc23a4f8ef6782c7cc2236bbbf41c034dad1 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 9904 versionName: 0.9.9 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] commit: 0.9.10 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC-2.2@e33e5de subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 10002 versionName: 0.9.10 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi ./compile.sh release buildjni: [] commit: 0.9.10 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC-2.2@e33e5de subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 10003 versionName: 0.9.10 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] commit: 0.9.10 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC-2.2@e33e5de subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 10004 versionName: 0.9.10 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] commit: 1.0.0 disable: doesn't build encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC-2.2@036010e subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 10006 versionName: 1.0.0 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi ./compile.sh release buildjni: [] commit: 1.0.0 disable: doesn't build encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC-2.2@036010e subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 10007 versionName: 1.0.0 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] commit: 1.0.0 disable: doesn't build encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC-2.2@036010e subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 10008 versionName: 1.0.0 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] commit: 1.0.1 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC-2.2@59409d5 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 10102 versionName: 1.0.1 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi ./compile.sh release buildjni: [] commit: 1.0.1 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC-2.2@59409d5 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 10103 versionName: 1.0.1 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] commit: 1.0.1 disable: '' encoding: null extlibs: [] forcevercode: true forceversion: false gradle: [] gradleprops: [] init: '' maven: null ndk: null novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC-2.2@59409d5 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 10104 versionName: 1.0.1 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] commit: 1.1.3 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaARMv6fpu gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@a9b19e4 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1010303 versionName: 1.1.3 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] commit: 1.1.3 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaARMv7 gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@a9b19e4 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1010304 versionName: 1.1.3 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "x86" --release buildjni: [] commit: 1.1.3 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaX86 gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@a9b19e4 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1010305 versionName: 1.1.3 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] commit: 1.1.5 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaARMv6fpu gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@e6b4585 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1010503 versionName: 1.1.5 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] commit: 1.1.5 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaARMv7 gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@e6b4585 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1010504 versionName: 1.1.5 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "x86" --release buildjni: [] commit: 1.1.5 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaX86 gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@e6b4585 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1010505 versionName: 1.1.5 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] commit: 1.1.6 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaARMv6fpu gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@551b670 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1010603 versionName: 1.1.6 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] commit: 1.1.6 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaARMv7 gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@551b670 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1010604 versionName: 1.1.6 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "x86" --release buildjni: [] commit: 1.1.6 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaX86 gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@551b670 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1010605 versionName: 1.1.6 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] commit: 1.2.0 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaARMv6fpu gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@23c8d86 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1020003 versionName: 1.2.0 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] commit: 1.2.0 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaARMv7 gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@23c8d86 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1020004 versionName: 1.2.0 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "x86" --release buildjni: [] commit: 1.2.0 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaX86 gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@23c8d86 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1020005 versionName: 1.2.0 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] commit: 1.2.1 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaARMv6fpu gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@23c8d86 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1020103 versionName: 1.2.1 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] commit: 1.2.1 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaARMv7 gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@23c8d86 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1020104 versionName: 1.2.1 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "x86" --release buildjni: [] commit: 1.2.1 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaX86 gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@23c8d86 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1020105 versionName: 1.2.1 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] commit: 1.2.2 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaARMv6fpu gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@7491a5f subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1020203 versionName: 1.2.2 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] commit: 1.2.2 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaARMv7 gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@7491a5f subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1020204 versionName: 1.2.2 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "x86" --release buildjni: [] commit: 1.2.2 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaX86 gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@7491a5f subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1020205 versionName: 1.2.2 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] commit: 1.2.3 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaARMv6fpu gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@7491a5f subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1020303 versionName: 1.2.3 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] commit: 1.2.3 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaARMv7 gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@7491a5f subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1020304 versionName: 1.2.3 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "x86" --release buildjni: [] commit: 1.2.3 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaX86 gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@7491a5f subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1020305 versionName: 1.2.3 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] commit: 1.2.4 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaARMv6fpu gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@7491a5f subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1020403 versionName: 1.2.4 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] commit: 1.2.4 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaARMv7 gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@7491a5f subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1020404 versionName: 1.2.4 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "x86" --release buildjni: [] commit: 1.2.4 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaX86 gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@7491a5f subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1020405 versionName: 1.2.4 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] commit: 1.2.5 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaARMv6fpu gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@50accb8 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1020503 versionName: 1.2.5 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] commit: 1.2.5 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaARMv7 gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@50accb8 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1020504 versionName: 1.2.5 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "x86" --release buildjni: [] commit: 1.2.5 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaX86 gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@50accb8 subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1020505 versionName: 1.2.5 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] commit: 1.2.6 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaARMv6fpu gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@d59b81a subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1030003 versionName: 1.2.6 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] commit: 1.2.6 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaARMv7 gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@d59b81a subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1030004 versionName: 1.2.6 - androidupdate: [] antcommands: [] antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "x86" --release buildjni: [] commit: 1.2.6 disable: '' encoding: null extlibs: [] forcevercode: false forceversion: false gradle: - VanillaX86 gradleprops: [] init: '' maven: null ndk: r10d novcheck: false oldsdkloc: false output: null patch: [] postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] srclibs: - VLC@d59b81a subdir: vlc-android submodules: false sudo: '' target: null timeout: null versionCode: 1030005 versionName: 1.2.6 Categories: - Multimedia Changelog: '' CurrentVersion: 1.2.6 CurrentVersionCode: 1030005 Description: 'Video and audio player that supports a wide range of formats, for both local and remote playback. [http://git.videolan.org/?p=vlc-ports/android.git;a=blob_plain;f=NEWS NEWS] ' Disabled: null Donate: http://www.videolan.org/contribute.html#money FlattrID: null IssueTracker: http://www.videolan.org/support/index.html#bugs Liberapay: null License: GPL-3.0-only Litecoin: null MaintainerNotes: 'Instructions and dependencies here: http://wiki.videolan.org/AndroidCompile see http://buildbot.videolan.org/builders/ for version code scheme The VLC srclib commit can be found out from TESTED_HASH value in compile.sh On new releases remove the updatecheck and force the CV to the last working build. This will make sure users don''t get notified about the update until the final build from the BS has been reviewed and tested. Once done, undo those changes. ' Name: null NoSourceSince: '' OpenCollective: null Provides: null Repo: git://git.videolan.org/vlc-ports/android.git RepoType: git RequiresRoot: false SourceCode: http://git.videolan.org/?p=vlc-ports/android.git;a=summary Summary: Media player Translation: '' UpdateCheckData: null UpdateCheckIgnore: null UpdateCheckMode: Tags UpdateCheckName: null VercodeOperation: - '%c + 5' WebSite: http://www.videolan.org/vlc/download-android.html added: null id: org.videolan.vlc lastUpdated: null metadatapath: metadata/org.videolan.vlc.yml ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/duplicate.permisssions.yml0000644000175000017500000000015114620351225023153 0ustar00hanshansCategories: - tests Name: Duplicate Permisssions Summary: 'Test app for all possible ' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/fake.ota.update.yml0000644000175000017500000000305414620351225021422 0ustar00hanshansCategories: - System License: Apache-2.0 WebSite: https://f-droid.org SourceCode: https://gitlab.com/fdroid/privileged-extension IssueTracker: https://gitlab.com/fdroid/privileged-extension/issues Donate: https://f-droid.org/about AutoName: Fake OTA Update Summary: Tests whether OTA ZIP files are being include Description: |- F-Droid can make use of system privileges or permissions to install, update and remove applications on its own. The only way to obtain those privileges is to become a system app. This is where the Privileged Extension comes in - being a separate app and much smaller, it can be installed as a system app and communicate with the main app via AIDL IPC. This has several advantages: * Reduced disk usage in the system partition * System updates don't remove F-Droid * The process of installing into system via root is safer This is packaged as an OTA (Over-The-Air) update ZIP file. It must be installed using TWRP or other Android recovery that can flash updates to the system from the /data/data/org.fdroid.fdroid folder on the /data partition. The standalone APK is called F-Droid Privileged Extension. RepoType: git Repo: https://gitlab.com/fdroid/privileged-extension.git Builds: - versionName: 0.2.1 versionCode: 2000 commit: 0.2.1 output: app/build/distributions/FDroidPrivilegedExtensionFromBinaries-$$VERSION$$.zip build: gradle assembleUpdateZipFromBinariesDebug AutoUpdateMode: Version %v UpdateCheckMode: Tags CurrentVersion: 0.2.1 CurrentVersionCode: 2000 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8763816 fdroidserver-2.3a1/tests/metadata/info.guardianproject.checkey/0000755000175000017500000000000014620351546023457 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9243832 fdroidserver-2.3a1/tests/metadata/info.guardianproject.checkey/en-US/0000755000175000017500000000000014620351546024406 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/info.guardianproject.checkey/en-US/description.txt0000644000175000017500000000072614620351225027471 0ustar00hanshansCheckey is a utility for getting information about the APKs that are installed on your device. Starting with a list of all of the apps that you have installed on your device, it will show you the APK signature with a single touch, and provides links to virustotal.com and androidobservatory.org to easily access the profiles of that APK. It will also let you export the signing certificate and generate ApkSignaturePin pin files for use with the TrustedIntents library. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/info.guardianproject.checkey/en-US/name.txt0000644000175000017500000000003414620351225026056 0ustar00hanshansCheckey: info on local apps ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9243832 fdroidserver-2.3a1/tests/metadata/info.guardianproject.checkey/en-US/phoneScreenshots/0000755000175000017500000000000014620351546027740 5ustar00hanshans././@PaxHeader0000000000000000000000000000020700000000000010214 xustar00113 path=fdroidserver-2.3a1/tests/metadata/info.guardianproject.checkey/en-US/phoneScreenshots/checkey-phone.png 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/info.guardianproject.checkey/en-US/phoneScreenshots/checkey-phone.0000644000175000017500000037433014620351225032467 0ustar00hanshansPNG  IHDR@JIDATx\b Q{* E@:JU@E!{FILb&jb{7=y7(&㘝nڈ                          |6g )**U!D˫AA5#_APgj`QQ)S0”%K*P099W"  .F p8Fջy5o>ɣ_85!,ХRA_;v x%3fpDQAdž  {}#F=f<q^Z}W.#GO1z9u2Zt2[92ZN_q( ??L"uWWYh0؍LLL@?'d:w\. !*idd$ OɁK AA.OO1cMP4utRz~ KS Y>?MTvw0,x2@u@̪@^i9LOgg-js81cP(XV+VUcǎBY RΜ9"ijj!Z^YHWCVVn奥`3E___PPpT_ChAA!ɱSU-OWHlPlC){cϻDž>?Mhh45jLBbE' O!,7{aIA>$_8[g!18RRR[ZhWZҥkØ1o|*++ϛ7/ )S&߼ys}}E@g6--*Ғt?~6\nQQQ7nC$DC(d<77ꢢoooMMMD<4AAawU3IR^%P~urFR.==7kw׿}{0a!bɐBAp<2q̤ zͺi[tӛv xBperrr/222===_yN!+/Ťwswv}ݫ\pZrZtPӶ)6+&oO.gO >ѐ )riHX aaa }A 9l4ZרQفp~A[|; `ћz 3Eٵ3Do#0/CsT#$$-2o޼p c3|MMMk֬_qqqb"??c !C ,BAXA1Zk\tVa )rf*!VuttI%22288ĄB0;~...p}N~/}7Wft> W&K$1b[A/22?@ M  7IOonnnpp+**<@BG;]YYiccFӦM C  2tOuSzqa jF+2ټJ9{{:-՞w,M!g/1sbW3&HI&AJ-Lh{kkkϝ;7&&Vk׮MHHutt=z4} = AՆ#_탳NX!AAA;;IJ_+b8'}NL0aUUUhBS.]oLL R(.`' h=n}:؋-3&//<9J%'s&pKpD3xKϣ͛7 2.,,!  \x,EQ&Z*C~uIc'N7zp|En ADc5}.ȁkגҗ ^:1ظFAG¡Ͽ}O?읇{O/ ?C&}imQ2\B=1pa.A܂ʥ:{;0-H]FKj`xPg cMMM_җ 0,B'o5Lҽq#Ne:F ȵGt/ZG8 `  ]_E_)k?}ra9ӴG5n$pq IUЪq+|wpw8 ~'PԮ; p'cPFu5a„sÞ:G Xpp٤Cs?~럺B|O,0*;0CɁl~s/[IP@BX#sg#  `$w--xQb8::~-xbŔvGZKvv髃7~>W9T3g1Zzut <7~JTYLl~~~~>)ʴf.VL999dy͚5kDwI3Ц{U3Bc[)p[`={gPc'ȢG1c]ÞG+')ׯ_/""2bQ~ͅ{.ga&,F"$ZyR. t#GObu`jA"TK3 FFFaRVZϤdқ6m =՞X$,P'(-[&OOO_UUK. ʂq@CB͛!G\@AAai TEU ?RکLI˅\9{Pd 3 {{hZ[[khh 7..АLLK :b@+t>|΃O^FTh~XDsu``*r$dU3 SLHLLtrrZ|9hyyyFoPBCCccciUTT@t{#eHque' ]fyhll1cƬZtA$p.  2 %6+퓏,3UNēIǍO.N~''P;Rh}K {zx;L=zyN`spfH>{]q~ `p'>>䖿#Wѳg&N2e^ `0xi(}B~t+"cg("'H+цAZŊ%Mܵtf JّKc 7n\h9^OOrԩP3/_O_fڴiIII:FPP1mllt>>>//֣&EA V`'BлY9G6XfDU@@ <<- 2AՉ111Ě!?}IZ[>k*tAx.BՊ}٠vurFYYo\\ܬY̙b̘1gp xk%Ã{y  +hY"hy{nfftGAA8)s' .N4ֵ.³eK;eʔB^l(xDHc1v=[#O\?00jxu_'w+l)~~sLJR(A*^[-ZܲeKTToz{ ?Db͟Y\ nz͹?_o2ԟOΛ>hӅDC^  0,ENNOEYW=To^*k0[hG)f.]M<-r}l<:[xjrxA>"گ ?>-ѩQGUxƧR[wHۏv\~q_杗H8 Ό=63gQii/jL-|79 QZ ,hࡾ~  EdUVi,֏Ymi\{F~iyeEEqiEMmC\oEFjʊ:/*(IS?A WM?_Eo_yT/[޶}SnT'| 43Hߩ,hlRt,ߧ߽{8W?RI?Ct;FAaa eeU)*ʒqGUGC_C&Hf`jbfa"|EIQ~nqe\ײ ڐM}]|fh+cW0 \ .j?9ݧ?_]ߚK)UxSېދum*M1 `AAJ,++ T"gL2vx(k.5RJv2Jurq/ePafoha[YгzGyC.œ"2F)xQw_r q`_aݞʧ{{K7Aڇ=QN;AA]JS( UQWV\G|L}F3-d\(®"nYʢb!rՓ|l xxYyYe{Z{V.Ynfy |B}V[k(c/0 LquF{\"ayu_z߷ᄄ<ݒ_ۖ\L< yrv9rL:"|?؆t6  2XAAACUXjA՗ӗ44k##d#-HR Ԕ_anT-HyRfy,Bo'YnI16nkW{8vc}wu} yFONM;cQt!z_=N7{۟_ɝGuL5xIuGi'a^xn?~(AAb0BԴ;XR$EgN7i)-h.9XrT #:K8$$';HsݵqVi~N>Es+ݪՅP`}[Bݒܴ(cA> \{r37{㴃X_^bz1Wth]*giWFAajTeiW)jӧj pvWIQ 7׌Mp4Kv5 ԏ1Nta`oobkl`oV4pge [y[X3@m+r(8Azս?orټBrr/N'Q#  `y9yM ZIUYcueR (W!H=ۦ#1,TOqjUiFWvzfy9^֚N\Jg;Tn^:{Ǫ9;V.skvhoYgZ;jRע9NzjqA>l|)5\FA]WYZAQQ[I4\)U'F_~ U,[g#X;8I3DmfuAGkcAv~:QfF\+:diYkβTضza>!]nY`[]kms\;u\AcZdpЖ/2ɤ_  yM mn Omk<G䃀Q/~䭧q7tsM]wt F  "/ee (R^"!*:5$Kl 8^y>֒Jol+5ʖKU,XѴjIIfF4c,uc, C57ͱQ7˨QU!nk!.[C\r߲2I;CaE]ENq"ǵn8Ando0O{rayG FAaRO%%bDΌVٗz*M7[snowo5J}…Uc} ]=,]mtܭcMWEi:mp4]oHI4HaK}cEVZfcPyVswplY3,Qlq|Ms̋ jB\W{h`?0 `R[cW?ēae,  ,2XQVƚ"(2GYxdtB%ѺP 6^Q}M?|?hN{ƔKGf7j$̙okelfjj/eZW]H-uQ+qVo P8lbJo7\vAfFކumJ8-t2L׿U9%@Pn_m7Cm!X| UAe UlHTD`J{_S íl}ttۓ͏?8P;6^<BB'TH}D;.I*޶~sͫ>ũ/O:/>?`vݲyM LS) i֪%U>us8k2n3ܱ~*E}4,fϳjɲS_#jT1˰xbK T:̟?u7 [d0ý_=?8]d}˄Λ<(J l~`! V9ake9 a+iE!"5$"̨MKŝɸ^ZԎgwx3 ^XËC/<ڝ}C.6ϴ+*{h77wlo^gTU?KM[}>yXڨ'Y([+o /'S䡷yqsٮ[-wPQpY555E~3g^wqBĉ'ۖ.]:Զ PjU䓾/̉R7I;]Y*Y( 2`Cv7VQH hHiI7P(f-%Puٷ@w=աُvޭ8-ȸqֹM~;X5lU]`XhfLђѓ֓3S.tժ3L>jTS`[)l"5氒bR;w.==="""..Ç;|qww A?&3c+oSE^8PMbsJ -C3N&^ڒuΞ<:Dߞ'{!4ݠ>moNny}ݖO:VZd'ԺuAR!m} b5V EiI*8T蕸iFXSUj44847˗/'/֬YCwV[[[n `0 `t͗w\z_o:s>{ô=G!+W:G:x[9Z< 60lyW_}U^^6z˗#>ԩStI=j===n"D :|bڳW6;w#Y! 0bU/]VrP: `K-S{[yAeޗIȎ VvVPq.PDU4B[j`~}LތJ>ϺVt-on˺5Μwl~% N~0aaaw9͑fŤ5k`W_}E0G!uBe5p\mpuƫ[ҿٖ}{ˣՠ{xg=t/ֽIRՏd=ڝ֤.&ϾVn;5ag `*!k%LU$LGAQ%VWE}nn@%Au+?ӕ.lܸt$ڵk?׽Ac}^CEuӧ{ KّzuM4u7j2) %udJۯ~g?o=>hի{ ^t4ϟ'N.l `ի)njj"/<֭[bj$=4(L{p ͛7E@7ex `V,gҤ"Yvӛsjj*'%%=hNVV\o%B!N{,IFr^m`Y1ti'x qlJ"r_-[aR;<0[7N vaE2+lsidVIXXpYG5J>uj}YoR559TqQf1Ke;SIWSlxmKIWkbo5_kp&Fsƽol{q{/g@~sͩgO;r﷥>ؑz5ve͊w=Wm}4hyFb$=Ubu<4k4+\e**ܵb 7Zk[:2WeR?x 2SCCCn޼IHv4>ɪ/!AAAФ#Fk7erɽ{TWWȆ[\Ů4 6o rL_\'(Ɨ.7q˗O{{;ݻi C̢LX3L{-mm~MXsև(KDC;cdn͢xLV["ߡ!77LQ/&p\غqz}e[+@2٭ļz2xCkx)ԔWZĚ*.w P4[)9[IL_H լ~½kNrݍ4]u*Jٲ/K~YUIȵek"tW}Y;_{?W:X_^td<ݕxmž^/܎_/=Owgv[)iFM<͌`\멕jPW'RiBnW? 3{߿!0]+ʕ+P| 8fff;sQܹsYܤ#&SHq@-L^׮]#N1RdBWf=Z9!*yP#u; 0W_}EzqKtmk(+i"NDX8p{լzA}YBdO 8\fL07 vB  C*МWA+Y]SVb,h޹p#!-Gڵk7;qRkR=1"(#HSjJ-)oQəq&;68y꫕7nlZ~4RO/f1, _+_mu؏M}-v>ٙxG܃u+VWư'mMsA9^w)k^JbR_ ,+J/MNj抩Vy&^L+k!b#MMM Gx:cϞ=!sssѣG.:{@ґNg:B90 (--%WHȅd&)QG@ yg~vT?~WhqE+ZW`r {miGqÇbsrrx!LxGPh9YH}U ƫ+NưaΤ96|g+ xжCNA]bsu>U,mȴcaQ1/VJJ<Ȁ ^{r^ `ѐwJUX%5GYCN0@6RG*BWYFMF(ˢ)&de_*Z~mӪ/t`ᑒ  8{>mgy. UU6E233eWfQ&EQY"O PMDJҕIn]|(c'yK/-VeIȱ2h=vdcUϻ0vժlYyͣ@>֨U+Д|qշ*ޫZ%egc5oN<ݛ{>k^J|INQ-ے6߬]3Y3Qė~Oz!^GJLLdrKRXXHuh{?ʁI r} @`PM?{cR>y<ܫ&'D*e+vxǢEȩJxFOKe0ajd>1А. ђYg~;vA8* 'n 7̺ם[EA^ؓ'OkgnYKU`VJC΍jnnf u3[AR7]EH'CḲ7b+}ɽ ݃ s<ꕾnSCY,VJEo<7RXy2sʻO{,?l%Yʢ %b dc =DRgٶ=yY͚j¿޴ts'_^rDB;v8u쓆 ً./]pkIl|7yG=5_^vp֖m[ϷW\Z}mS]9uC+Ur lKA*m0V䤹{͖Fʽ+d\㛳Kρ&rr}7n0tρI111;X!`TPHψ9WA_]6e.UUUCݼZ UdX]]HNds&'^uA݀. -Ewiƨ_{]LvB5N?VZExV-jR0z&w}6p9 [Uk ~KCn=~8cTmmm̞=W4[f4{U5JB?5hzUUU_u`X9(pk*#\J;Al坭 wPCb<J¾J"Ѻ2d}z3ص'.t3}Y3W>+o:zWk|:^K%oN6=ڵ҉G+^._mh5{V-7ߜlx{0Zg㪸~X(v{L" [c{,k{4AA-b}vIH yQYдjQ#_lb*ڠ Ss6=L֕s+`///hYѿN:*[s*(*'<<}`"0cǎyPih]٘>}:, ~:l01Y"lܸڵ+ -ɩ F 9/_9Ϸ}6]kk5[QF_UR^ 0n I;6III'xnkڻw@:t…ڣ]|9tVpe+XWέTx"SWYtu@U9ժU5/><CXsju5رc-\V-ʀ5M1q !!k(NzՂѥģ7rX?5pdw] <K4/[)S.-K4)ҴxImn?zۗ<={ q Q1qOgMs6|xͫ=o/|.֥̻əߦžML8Gҹ_LYs܉+o?xvmԘ̛oӢ_'}v8kV̤jf.;zٱeGU)5~M]mVs5T/&h!ɝ" `???Q4\(tW/0ˋ< [)ZlA[wGq銄+lzd]߫.gS 0Hy¤ CVndc֬Y488^zSN={8LҾb=XhݺuRWKw9]Gq٬z[Tģ7`(79`X{- fcQcSK)s7g߂y [Թe fŜpiR,upaɄۗ~|˫^p~cݏo}r|[of^:z|潔w?ЁjpfZ۔)ѿ\Jtfr۫7z2}9W\lE~׳ O?ٸͷZѥь~SKMƄ@ShXh-#䠥ŸAbl طozNjuY%0(N, F pc<~._EvZb,Uӕ Ñ#G^"5@Q4~֭M>5z|(H<4p-ѶmۖUd/_Ƨx=;u֯_ ,g& 0̌ZVϜW[=]++T ͛7 mA6<] C~֔)L:U~T"qㆤ}m2p(:.ۂkTʥk>pLEzUoJׂxfU %S;k,ek^X4jlusQ o"Nݜkq/״sP ు57yrȤ s]lje򉿮|{̛K\:&Tf©;煽3o_ɼ~߽k7/FԸ173.fNWOq13'W] KVP*B}jVwu,bVɭoF%͛fĉL&pu> (1\NѣGNCrt׊+ >*Vv;:*g~i]NVT۷oOM9 pƍIN1bhȐ!qqq {͚5t رWADGGK.aV0r q0ٳg+~U]jz޽{Wq MQa> ޜD < {5uNeAO]++Uq>HKKQ\c[Ν;={VT>}zA9P=w6*Q 恣{hnVc*] ћUJ mٜ Ʋ[Ơr\ٻ@JpWԩQ͋;7.ҺlM.จ /xg[ѷWNM| 7GE}zrGA}ܿ $s5mwɑ^ZwyjuM+.kQeloJF<`q& ~ծ6uQ; yqkP#O^~+VVGdNܶm[E`H.JNN4h$ժU+88/dg+pѮ]V\36[|EQ0~¡G^ D駟Dv#ZP;HW_.&ؘ_A5;իs]ϯI&0ݨQ#E;|jSҎl|0ecD4Mݺuq&]&'5Y&C)Kݖ wC[_S.:7*ҰK=4^Էΰf ػͯ|3og^μrUԮG"\h'ּIe |(@XzS9 S 0`޼ytY#E& a+8אÕKzڣE7ؖ'?gCa+ds n>] [*݋.^qfqjR¥s.n>:z ٥!폆8u m'7Mܡ̄#o:}i=fꗧ¸4F]j`a6'N۽ у R4n9gڃSL]EIׅRZd 1b i@ްe"Ntը=ל gs4w9C/l^ׅT+ԠKbΠu*B_}bZ'pVgGvI><}'[g~h˓^Ԇ#zo+_vNΒxn=ShӨg"^G~{۔ o/{μtu?nyyrË=F{|Sc)_YMT6۱5RʥqBUM4رc-|}}mX5mT.b(ڵk۶z,Җ-[P,g0l_}?]{~/+Xc8 ëLoKxPի_wApYԩT/Whf>اѡm&uK?aOwN~osfl {K^?1}qC^Y:j#KH3r똽o:jv<zPR9pT:Fx \rj|7ad݊! ذ*rT\ϧ~[ & pNeO Xk_V?>8p01zaKP![JrU h|yJG/{oS{Ek?_Z5ᦑmhݐ]O oxfTĈ!Myq|ūs^&;oʹ?NGIY۶/Dqrǖqllw|#&~fSu+]pxK}A̞=;`(z`y'of~F_:ǰXc8 /~t+SٯsBy=)?ObZة~hynR3'e/?  ltnJk+Þ_2z^_:t*NІ7M~9{3wғa'2_fP|s .>aOje&zF=SVV㇐jx~o`Ѿ}gϞ0zMrXr8hEH>to'e|#Nc ,hp1 r ^G-Zh ]|T*c<_V*:sf[:\#i^}RtOԶ'F4߻Łn- ~qʘRI4eЅ1Z]&rT -/~m m6>82}شu, :8YBJmɾ%T/UrWɱJ̩S6fUYr[?o{U' oo﨨8:0lҤIY)CV*L8}*5zEv;U_aG<݇du1 `M6E ?oy婜?O|y ÚU^ХƦA8;ݥo.w_X:Կ{ʐ~7B^xq/Oi}~LvWwW_7V\]zv?rsjReǤ_OVrwU)KZxMhZ_ރ3#00P<&z۶mY#$,VA-rlމ[fEg_-8u`?1EJIw'Ngu1 `W/Z|N mPɿ`^+rYiA+{=m.n7wۀroEߤy/L;痸_&\71&I16N|zUu4ݕ9ݓƒ~W rC, xq (\pގg(2ʻho?M)ޣTQ3ZO5:rHTT޽{a0`8"vƿ 736{s =^sNԘqwMm`0 vWK-WȹZaN 8(k҅xP}ƴO}/x˃fPZBgnң^f%辬3 `hࢅt)ssw¯JͿkQgC&i^=3waTz쟼$,u٘mË_]|,pݐ;^^ixp⢁f2]e5WBN ܜsp}}Jm9+ *]){WΰLvqtT\ tuԽbl iQ'M9}}|g@V`0 FE /Zåv8/ׯ@y~[,wD׀Ûڢ^Oyo=Soxc;Ǧoh&c_E}+_t焇]9>,7w)iov:;p\}pbc+WvZ =4~ꆯwM0l `Q̏OTA/g\ >Cynҙz cLޖVƫ| )՗``0 N".>.U 9ujWҹSâNU.W[u^zž7<:7OxcC ^\ڗ7ړp$W[^'[n-xuAsPX)W(oܥkƅ;+ܵL^%BJ)57>e|ӯ`dsUA;%i~>g.Ïr6hyiE``0 p!X +]ĹEI&\@mlp͝>/;W}*OmQgyBZFNiwqnKNZz8y[ͯv:Xl߬}:zcŪ py\W(o.ʸ\ڥcY_b-)__}uޢ?l_|I]o!G "oIڞ /.͗``0 (\S".5]v)͹H\_Es*]ůGWxVǴ9=%oɏ6>:y//zqxzDȩݏ??h\!&68Ym-Pky׺k{79&fZEgwN9uaX60eQN&)~F/]+lz*ݹc16k_ܵs" ;ts.˻S@1N?j`dhWAu}b{>v$GME޶+~2572{_s;ՉkOrY] `09Píw}_ys7?SϿf (_"Bie~QrJUացNuw{c^tQ' j&iTP҈5?ݩwp[_TvMqgЁ;rKo -ҤS@^n?SKY?(SA`09+NÎptWEW=ԗݿx}Qg_!q;g?}?ۿ3OuA㿝tA@!:|V`0 F`ZbEZ4o/pϝ??^bo"knMܝJt:Jqs[ȩ[҅(Zag09/iK/H5M~GE_C8 ;Z0[꣗^^ݫ o&:ӚKsp19 `0r# ,TɹW\>"_}{ܗyrZyCn-y7yG5μsc.+]=`xB /~(_My]z풻K r*ԾTlU¹])zE9 #Coѥw _M:$"nqw?~ ?)o}wzNʌ?U(xGe``0 pp+Rh| ,Pw|<# 𮼮{йQ-xµpd=.)yխL[qkp|2_uy]o|Y97sU`^w5)fa粅 dI F68#7&>xCWմEteweoo;L:xqDlq\3ȻӳL``0 p^{2n%w.',-n|Y}W/WޅKΣH)"|/PICi4h 7'e囿f/u]LjkD_\}֋Bw4YW|IPkAvf2?7h͹QY] `09 wAj;t9%%:;˲NlkEl(Y|7mPnW:{5=ںѶNu9ӬA1՛{׻S?J ^uOTto~7T능/CE\`0&p:swF-{"/޼zkKxOAt6;fu1 `dh`0 `0 V `0 I``0 `|``0 `0Xf0 `0 ' 2 `0  ``0 `|``0 `0>۾}-[6o̔)SL2eʔ)SL~#bccc>܇`0 `0 4Ϯ\xeL2eʔ)SL2e#$3 `0 㳛7o޸q7Ct0f7nvf7nAD%an@qt>`0 `0 FJ+twSL2eʔ)SL2e )T `0 ߿_`0 `0 #F+iFC`0 `0Q]%eyHtf7nvf7`0 `0>|==zDT܇`0 `0g?~f7nvf7nvw 0`0 `0=Xf0 `0 '~&`0 `0 F\(/f7nvf7o C /^fçRǏ? #pyz%!!9d0  pvwJJJ\\ܥK޽Uyu˗͆AU-߼y=Yܹs 1uTȼYq 5jԨ_~'N< (_|``ŋATI7::ZL1&&FWA4iСCv ժU |H*=zs*TzzzvG>\tiƍŢjjÆ ZyIF* Hfgxx>|Cԏ۶m@C5BIA1;?nEnnU q8A0M65nTTSgjj:S&L!x֭[j֬ ݟ=v3^OqWN*O*+_=u+=za7o.〼-Aj*hrQ]խ[wڴin>d7nkܟK^zjCZZvy)ei~zg͚z5k,ODDD6mDzys߾}Q;ecLՠAS»bp]9yK1Q5ߚ={V ATn&MWn߾MO͛G0-/}:!ܹs{$''; 6`bCBB,YұcG}vyxH=:{J?nTp='q ʕJbBB*~5$$0]ħX<==S׿X\(pW7.+-mHs̡[juر$1˗> 0̂ @iڑ=͛7۶mkdʔ)S+; \~9 ӬT<Ac6O?=1(Z!J;S!#ZJL%Ѽys{-*ȡӄM@/_n*!@޽N:MYreI7SN`0r(["SN?tPx4s,A߿.tu*S$˖-g ;i)y1cΪ|Z%Ѥahm۶%?((H'[~t% iYY(=bn۷o/۽{wz{s̙b:u#ӹsgyĽ|F,<3(֫WO?zߺul֎;5jTJICỤF #r꓊`I`IEN;&L+ J{|_Wӻ#G$-[A?7듦 #&_p8 'I4~x=UB'!$LÆ }||#S܋-' 7~;@d})#5kBlׯ'd#yҥK^$kג!C$o'#ķ֭[A E*5%a~ xb)(lKSNtB>,O hʉm[ -?>PA#; ҳg϶lٲE@k׮ڣx4h@O-C]`(zHn@WY` RbEg,/ɓXmڴ ު_ɓq?<' /[[nx(d߈#o!ܹ5hƣJY5 Yd t * l?˟l1|nO@= 3(>=d :6T,n z!OTŧ/_VIIIނSPH1Cɟ/^@o>3vX<;J;Ş " R'TLqFbНҚ)^0'&&B -;vPBL2e*n}wzс;&.L WС۷xp YY4񅇇y:  uQRV "zd ,HsEဪƍMaܹsVdTЮj0@['ʈr FSM|%N8%E ςI( M,p*`?)xSƇFT,iŖl SnJOŽuTm۶I*\N҇Uf0voy\yGWo6m-`j0ШJBBJիW1-Zr%(~2E/_ U᡼;e2e3wz6lh0+)v0%@~?j +zK(T ҥ9^Vj/DV^c6Il5ks$L0g'&&._#>sNfv&}qBBt̲6f=(ħNG{TQyQϹC>!*Z+$2" FzNp'*R )6>A"L#no-XD1<[LSZ$s::ⱀ?ŋ|,r+5'L׉4 '3g+_2M8סchU6Bor\]3F%Q2+ $"+%\] A*V=mnvp7nR|?B|m B+Q!yVX.F <6x`M=ȩYfqݻz~&Ix\Xz5q߈_~Eo[8sN )/׬Y)2Z,bT#yRV<|\X(uп ֨Q#un< ?- j0|CS!&S)v6eʔ)SS{ ƥM0JFVZxr9)>w! ղXrxB CXwޝ={6to^-ߓGxO0HzI1]XW#m8?Ven4C |W :R ,KkZ_CL r0*6UE]~FH0pbHIrrXu'O7I\lYfUI]. }]< s 5ާNAٳw޵kB$Ԧ $'3eʔiN-5k֤ICE'r&G<\)J-xe`ZW⡠ ne=H(4m{ xŊUVfcgժU|C!V??ijR~ 6+kU,ڵ X`< ]TˑTm+,R6-r{\;w}RSSq߬YL]؃pM5Y}]z5h 蛈T,5h :~,<nx *m+N򆙤]B$ds㱭X #_rd0v0*qpTB[1Zuax}jx\VQ.]hV|sNi`ذanSL29=fAiG @q|2eʔmU`Jbx80Df A:4i-<[.F[jU?(c4T<27zi?+%oܸt '"`J^r%Åm5j!"ڋ`"($f^Q T)]C޽ܹsZNKtA9r$zkժy"PۄƕcSN5Pj*2G`o^߶m[d툭@ i^oDzbXc hƽ"P&AAAH,gi&0a˜1c`ʃ:Xv-^/O *U Kt 4.֘1]>}PmذA|$x͚5`0* ) UׯOK =ש*B n˄U< B{>5ٚti&'Ae˖aՠBwlf$yaNNg1׃A?4$MOk׮%J n [%a KK -[nIh 1bzLj۷oy*fϞ[F%pƌ?T2ZHC8Q5ux`֧hDGGJʂh B[U3>qRUhOSqclR6ݻnr ,r 0N.+T(FnAً@Ia/?-,K &_pt7|@4!740nܜдiSHX?T7B U& OI)W a$]1*I~$`_f ah8ԁ111t<`Сڂf7[vHva!ipc0~s})))Fn1l0Q6(mIIcDTTz^ݷnRlߨQ# @V`CC@ZjբE +V$Cmi1DDDk{#mfoooF 0Z f0FnƒV;1`f1P1ExxEjP,%aИ }̬b<$I hޅ>/^. Ať/n"@#GAӧ@#I9'X1  M8F pƇfRaI~$dXlnӄd@S k(X/<^ \5k`ܿ RTZPb*a#% U|nݺ! ܡ`09r{1)az-ܻw/][&{􏋋&BPcҥ/٠ܽ{W=r ҳb՘.;v, =0CP}AA_}p~߾}[ĻwFX%)XXX=TALTU*JvcƍEKxՐKVY 0T'"x>'$^`ƒp策Ўׇ"@ $HWb劀Gag ҾF5Nr@$!hU9 **  ЁAڴiSAVA'^"1B‚ mmڴAnIA3B1]v5U4"h6VXmũ3%QT<7EXlnӄ ѥKQSf˗//3F܁l"nݺqƕXqa*C4ijȑ+`0r t`G a8% 6a `^>zcoVz* X|͑ '.*sW-ovIP\i6DQ9dd @$$$3B͔`0>dS]CVҘ. d0r.p#-88W2G1 `X#{WYgt%e7v۶n0rYO|9xY92e4hm۶Yf 5jL@KLM4jW ͺl2f.4(rN`g9t<!rN%8كf7dr89;u-[FgR͆pD2e KϜ9aIhРA X3Tir@fϞm*n#9b%''~թS'L5,XB*dx~ѣG;8][ѓ'ORSJ. J``Zs{s۷omTx豠2aH(`@3[?*M ]~sȉ)SL- `D!ܹY$4mժ?D^> /'!՛DrPBժUE:Xs^xT)7odʕbxeK e ڻ o2͛]5Uyc)#(-- SG޽{ժU>\1SNQS[Ԕ&JBaJ:!Z,ȹ9'T(oooѧN:چ_̙#Wh`"sȞ)SLuw`{޽"ڵhk,p_t\r/-Q6^q:sbڵk'!Ǐ}}})ݑ#G۶m_=A~`xjԨA/^VZE9(aZ)))rN,ɏ{ӦMDлwo{nٳT)3G+sϞ= e4nrr2UZhhl^^q,H\pa֭Z B]E r) z&Ld\#pK`1e˯$$&&J*{ AJ dGALt߿+q.PlVtէIxEnI+@䜈+rΜ%{f.-u&sO 7ndA/vmW !Cp^q7n<(ޡ؎D\BVZ%'|ڭ[7z~z56zhz}֬Y:u#_kڷo/޽;=][zu h2~uzƍaÆ$kB}|;[+WD_0EGeoIdUҬ/ٱвeKS=Pn7lN1E3@uXN>x ^~%*2 9篿JˉONBBByM ܻwO%|bb"  i@ʼnV28'SLjg<(N~&y;-]^z*Tҥ N҄0U֣Gcǎ)F-_F]r'.@˜2e L$r>o>˒9sO>Z\ N}%׬Y!WBqY<-ȕIH,9sm(ԩSAAZGdd$!((\rIhfLelզb0i>?#p?&OLK,Ë= CK`eUva_\ K I^S[*0[iz˫' .]dW`k )TXr@ӦMځؓ lήרQbŊAھ}$"4m۶L6Q>`S;Dlڴ ͖lW\9xv9 O]L@DÜ'9 C;k;v,2kך -67b hըQ#@ ]e05lذc%O P駟($hG 47 ߆aJPL?yn݊+@u$>hРI&[ ҡxڍ8 ծ] rHW%4<ϧG )b 2@+*W,ޜ!4P՗O> 2Pjbx"M E)yyf-VƯBAh%=JA'#ZbM5TRtEjCTݎCmm۶6AXBϝ;l@Bg6>M6 $b3IL_j۬_> \8 QرOWĀF @Gص<2Λ7]vHO,ٲe[۷oG`Js* (e`sN.Z«Td3G'qIǙs~:)SLSZ[nMW@J~ :* y[8yFxu߾} ̃#]IVJpS\z0I`G9R|СC4גm‚*`0WSjueX^-qСC1['*"/ٳ'dGgeo߾s-`t:4Eo˯8qMW\-zsb gpB# r/E&@ҙ0'-/9G92eT;$ov횩0(@/ I)p<(Zu%:6$AvI6Z* 628plDq-A_aw8k"}PӦMCOܼysP3 ڵkө6Axx8E/VD(a+"%%ۗD`\G7rsv +y;w[ 0F KA4Lo0Zu%+*e c״dƆlbVbP9vҥi' 8'AF߿JNaz6hs~4`0_aIϚ2.ҠA0((*Aǭe^N=-ED<'kD]tIN<j `oBkn˖- I;k֬)9,I-uR$@N!Ԧ~ر;vD/B\)'dX25Bòj fIv= &1⩼8xB_Qې]_r[aϞ=dm lW ֭",p`DÜS9 C;۳g?T$̚NiP1Ç{SWB獒VL/k׮xM-u{6}=q"7gڴix)!=XRL,>$ejժQl .">x<{_NŪI FUF^k'ǂwPPP֭Bw>n8⽠6A=HO8BGO%WTVɛ.ԸS{;ӟyʕ+V@*~dSf͢Æ B LSDcq]1甿9'SLj}Bshm IAx`| mOB)ɫjgk`RLxG˗@bWBQLWn !% Q]jf%+Ci8qB[v+\PJXh=q]8kC1`Su3fTT)..e*]sZz \*ybX\n]ǎECq_G.&N<:?`C,== Uz >ϟWOךwy^"F*lٲK.Ʊ[#oشiS`#rz'~ y~,dҷAUŀK C≽943=4}#RkҠ4@G2Aъ.c$58y$⇪⍞'=b\{ncRױC Z אSQŗ">X(8D{78:-'|yr۵k'TZj{˩P(F]DD?7nL̬ .<~ۍhv{ Ef;ұ0nF?0ad(t~˒%K+6l@A,n9C 9x WFNhvo }ڵ+EK2]f\à;v[L|Z$ӷ!W9<)L6u( a^G֌{P0(}0d VXAn G:t_~,|qqρtRcT^Hh͛6Ni5t)|E-]FKd4v5sn-"%v._põW6wr9rc#t#*`G-r* EUQQ??y$`¾ӧJ4G` 1M<4a4id͈駈2ϟerEHW^-Ӽuɓ0AՎrH ibE3aR|45kp:Ň`;(9B$nܼ̄y՛?࿬aO>u2 cdR`o!8zvM ln߂"KmƎcS2?,&ŭϯ2Re%.xS2QeԠٳg-^np8/%]:e6a)To`ǎ͵Nl3| q4i$jdvUGaEDlpeWPPpYF|G80-G $|֭eskMfx~ز9ru:@ c8PS*GdpmPç+i1ߟ:uj߾}P˗aDc^yhУի1TS! v|Ǔ*jH^Z  #CMF߿Gm9#n2H B%/|du GQ^Zϓ}Grf\W^y啯A+2 >sÆ E y۬8T( "4ҷXy ӧsQGy峁pQ>(/[(ȣ+5`EٳqP)KNx"ЖSP(d RJ*Ŵ7Ι3NeϸlJ*UTRio1GP^yW?-(ȩ++_+UTRJ*UTҬLW^yW^yW^yWV:TRJ*UTRJ`W^yW^yW^y峂 0BW^yW^yW^yWVVTRJ*UTRJk1=J*UTRJ*U4++UTRJ*UTҬXyW^yW^yW^uXR?s͠~- =tP?d\#jFɧyĉ L{| D?Hܿٳ?(ș [ᣏ>ʸ<~(Cϟ?<૥"d\߲8IÇC jUgh>}x%e}>(-GU/ߨZO?ߧ$͛7oQJo,w 4N߿iӦkٲ#=|pa 4j̗_~Yxx$777ߴiӇ~c@N>mPwKNjqu9wڅR,%4lذ_~<7{ 7,L&Uu]v:t%K:޶£#vqN65kV2ǞRX9GKMR"4'3aB]f1ЌSLa>s8ϟ?w9իS('cnjFnݺ=z0V̘1ѶtĨQB=iѣ)ǎ܇_D?$;wPO81%2TP-s aIGa O#%)Ǐ !? vi;,кukr&S78(Paa5:u:<,..vfc!T}HUVWAիBڵk+x8 Ϟ=^,r~klTdy a 4( MטE8q"qoqi}Q7n*BNvLp?#YB"yŋ줎3JRB,Y"U/pOV+4t„ ,ȑ#8]tpjRve͕Z{.O4)pkz}H 0r1b 6i$Uo 4f\pz ͛uy;v{͜9SZ ǎuS)kY`'Ja?F#.WDڵ+C,֮]M6q)&5ʢş;w;w*UqݺurH.@JPTAQau6;fbK p͛lQtw˖-,vNJ#cߢ9viFU޳o"'':uJζT}H`*p4(ZZvmE7z}W M) E={8_57T?|ֱ.CBZ.He?~| T|-qc5C_{gy9wދp:̧[>;vȎc m۶ˍ8ǎMh+k1}G8:MG* %(G>PEtFG+(r0 pe… e?4WY624#n 1=۷ozmđgXt1?'lذwuܑ1LFُS8|BK,ڵ+ۢEaÆh1n޼9i$tHYf508{,\֭[1СC/SNv ]X͛7r_1{eWVe>{Ʊ5jHnbIX tH \tɖ_߫͛#3g俌@3n; U~ 8F8p ^˟ݱ3߀$gĉ4A .}׮]C=|0T)?j&2o߾'knƾQ ZlɯFFSa>3u6TTT٬zB+8c .P jI(**p@cݻol(#.OfO,opsS' ] k׮*)qNw냷0ܭ[7wݻw/l;z()P82;t6#j0oN:qU6mڠ)&jT]"d^|BHǎ'T!Ł) 1'.nY՚4i##GgVۣkߧrμyKzASNq8i2>P9"{ 嘲)sx)9|yBk!x*!1ξ}dQx=o,5Nʕ+Z2 V#DG:PGYOI^ u[d}8s ph"tE*~"\|q<p%Ps/lc۶m[l~ YzfdCˁP=)T=)N߂9w80^#+LgNJUuɎ'o[ɞ>ȭ% uV^# 8%coK.o B O 6H:nj zs=AK[#+;LvlAU.3p\zG>ϙ[p40y-f^^^,~i1y-*#X EP7sn5f AMQB0?NZci'X [Px?çN=0)޽{Ғ~XwɅ%[9f"#7h/GBާXɄ~:uw&>}B:#rix_~ܪ"zCUwގqf~V1 uD"{8尷Lqe#B묪^@QٕkK7@YyjRN>|S0 @%3rM6tC+;@ g#^.0 7EEE4(1@u\z) ۄ/⥤ra? Yr%EvqQbqwn\MeT5<TSsq"AGR%H+1zh=zW_}E+JJJ/uдB6L>maGxEnܸ%5֭[>vbdBHUVV@*Y4l'9ǎ\8L@,7klǎ7 6?ݻ7a-P0q>~/m/fpC[Y#Rzߌop|bG([qaHn?>C4GYU=U=U=4;@~r$+W%wp9C#sO'oQ"-ˣ<?3nj܁ԼyI&yl䔨n׽UYY?##&fܸqF|cNv9h)']`%?<oT8sαLF3fi]r˄U 6ld2?{ΝS7Çߐپ};ߪ<ʂ?kX (?.d̙.[4sB(n 8p.-<)~/ZVN:tQt0Aڵk6jEYiJOkcUWUXǴYf6  ȁtW9]3|p/7=y)p7` U@ F񋊊8ɓ' /dG_^Dlx2˕+WRm#V \;m4 4NwHr‘2ay"3e02C:2TO/Uoh/Uo˖-ᩞSUFUO&WX/^0@{u ylq|CG:#ݸUX!?WrK^f&ia"-ڴiSL //'i}^b)}n!Cr!YıCm|j s<[~d&&/F{׬?& Q͛;fпfP/~u3"7nXaww9"]*5yfrPm<t r7[Z&AK r޾ .-<3_d|9@.Om 3yJU8.q-++E(NE\y:6.oeM_p3%l`J.Ǐ+\z RG<]I9٣>|BVxLsDh U=yT*OyVP+V9D{Ioi1&AKĻ ;Jfj&FΝCPɌL@6w\:|/'\bᲷO12En4h7 7p&.GF]e!EEE5FG;~CA E'Oyҿ:($c}Z ,ip\{G*[n"ZgBUOUBUO #+4PVx4;Ҭ;3>!7CXq#O@Bl[c,p… -L&` ~%sHgttݣ8:K\`G=]wĔcU:Nj / 0z>@ H*\aN*d3gFG0=@yRd.,,D~M[V9e˖S׮]ыPm|D<@ϟ?!;vRBPc̘1_VE iS`h8H;޾.UVx與/_QCd#B묪^2jB(j!VZmAA|OlٲN!)o )yǕZJ-FB8;Y׺ny?v| n?%ge8HÆW=ˑVqn߾n9ѲWs|M6q[ngo Ay@.w)\A+8F"(gQQBvH틔G(0hϏ'ui6#Jf&e#jnI{Kn/Kd޼yq))\vo#FpLUB٧z눏CЉVHB_G-,(Q.Rn[O< )W_}P8&!;p8tZ OIizF6`3]yW=wL}43rp=:<{=K(YY{trk p8ʑp jB&/Su]>cND<4"0𣽻229[;#GxN-7ƈI =!4A}}_|a'$*_e#ƴ݁dovСȎmd @nc-kdNGV7` ;_@ɱB֫WرcYnj3{PyR>oGV4o.+,,@xs$C>H;wr|2m|wAe{ncrFa,pi(cLCIQꟆ izzz>3i>Z& _p|cdlݺ51n ؎D AiBûK(KѣGy`őv9X<ߨjs~>CUJ2 oqt-Zā|G5&J(A6n!G#}YG=Bǹ=Vl؏cGޫ!ìxsk7;0`4oy8\Ή7}{aȫ/lbĹ|rnn.GFp}Lgg߿/{8VÇW7k VQG<䗭">̕ofE𮫆"pn+cҚm+m+eRiZgSGUᎪg=W,XqUhAm<1TϭUZ wTHWX3핣3}j8qV( ԖVķ<?^6w`wqjqpvHZy`rO8-<[.q^xۡ>IƱgkV}`f͚%9Z:0iӦܹSN>xĘ%tjoWK;#qd mѢ+;yd+WM>|XKś9Y[ԡĴ@`9w x }8w4i҄An Ǐp6yiTO=؃`y7f֭x=sq8iFɓl2OKcN j%g= ꈊ%(Kr2tmݺuUۃ @#qiHu}FNqɓ;t ĉQ߾}իO>|-tT ŋs(E4pmcjeʔ)!p&MP8&-gHK!m߾}i%H2ۯYW\4kOVZ%G.cW8Bȁc-wOriII @Y#Sr=OE.[Ɖ'Y2Ie۶mCtm۶E%OS>6<3glzbVk&ӳNDȏ?h̨6 gk֤I ̐!CJK ޽{w~[@P@+Vy >{lٲefXhu<#$-olժhϜ9uXh/[~'OfϞFL ы;*СC6}ϟ7bY|oBfgդΝ; ۲e)Kڪkbx.:5tLryy6"~z(S8} t yAkL^TjAHTF`2-Esa$;E8"qX{m eE)"fMI>S!je@Tψ8zO6 uzJdFintR.Tȑ#zED*|Wr'#B[v/W~vH\#ZC$8;Ly*2%ɓIN:jv(mhԩwe+~f܈> LaBIգ{2W~fFAT^JfFF]q{wva…QGy#ӜѣGV4|݆ 2%C8Ç_|Œ%KJJJm6|hM&?~ɓ(-]t˖-Nyj.}Zujo^Q>|՚ U$sR?~<&֭kJ'}Mt% ڵ+  gig;f+X#޽[(:GAӧzQGi i՚Hʸ?ڵk,~ sQ4TAϟ?z+W[͢OD$(}~+\6Ċ|4 :z{x.A5xz3 UZ h՚H;LY_|}!ݴiӧOGG6問VZ :t߾}ё&G)..ѣF.]Ç[n6l*$ƍaȐ!v񎪷l2RqGzGjʧkn„ W\ɸ}$2Bq$&ԩSI2W+y_Ξ=qyj35h\RVVFgŋ7n@BP'>X`mP޽{9O>ɬ2?δ85U1P"8?~, ;5{)p݃ jРKذa~A򔤟D*׭[aÆ-YÇ'@ƩS *ڵˎ\RR™Y\\ƍ9δiӪYH#:D_RX ެYT)HgzzSQm2e&STc/^m) ǍFnݺ=zU<3f8ږ5jTI"U#_Ђk3f̡C";Z?掱crX#FiSmIJCBȏH-i^sfJ6XѨQ(++ ϯ0nݺ ͥgԩS-`UU?ii8ƍKj8#A!Ua9ha*͛7/tn U=U z_.U:K*\|~,ؙ3g88B^^^jSukT;utY\\C]P^^NТEL˒aeՁ#Gt(=}ɦAB?oР4 A%ˆ8+WfZ?QP#7/FU,((=:e)%K섪^QU/pbĉ,_|aGҥ GHoe ̇' G=77Wnp3[z5&OЭ[ȓ)~\'7oc Gŝ9sJKKAA]i7Z2rO\_x_d<}tҥrEݻ3޼dB/V7oի۰aׯGAdx7Yʢş7oݻwɓua#p;o8QՑ, EH ?#Z>]t6 AQ""[CA[R\M`|RqtxPn݂ō˗eSN0S+MѣG6mmEmڴ=y9МsiٖQtrػwaر~KS .jŐp˖-FǏ"W6 Óbq@9 Y/ZarRY3>#rwH޶m[~~3"?~6W?NÌVHe$xVx5/~5Zʹ:$T zAAK p, +4?d4OCc3۷ozm+7w1?0HՇ!rrrڵk7emݺu$6QI&F]i֬+yS-]}7ɓv[h!pܹSի-$Ǫ֨Q#%U;<42–_߫ш̜92bõѣYEΝ;Ϙ1ݻ2S )((S3u6TTT٬zqZ tʕpE 4NG@ᨁ YxI6} G,)%nC8|k׮3 ߎO\}[ ~ Dz?}ы 9 mPT۴i3f̘}RL{H}'K.Ek\SXUdUkҤ 9tj6,Jq G" _.O<٪U+[b}P*lܸG H޽{"'87e˗/;v7O>phB?^GpU~i=φ.bJ?~<3Lpgl' ګY9ap//ٰaaaP(ڵ|y]^^lA .JgϞ , 7O#;l؈#O&2dDzѢEo΄͛7s&LHᣏ>r6#2zbt#7:ƹuǁAI{ Ƿ0,FdCnG#::#R~7toE?wNrA"tV` V8 zVgSl9ؐgo8R9QQeUG͇OMF=z$4 Xց1c<t-)8Ư}[K(=To'P{J''قj\2Vu]) yΝv=eʔ6*&(5ѣG9AK[#俨9 kӦͣG<$9;x?~zޫJv֬u5x >M6_E9 5y\R^^N ̙Á0qIh!@5׺j?]pXKj-(W\Ɂ||C#ѣkZuV dݺueee-)!@H9d *l﻾gdB5H@ H%Gߏ?΁p&Hy\߬Y &q> jp rxiҤ ,^D34W/^4N = U:"W~r8ׯ'Zn4"Ȃ H7h9"Ϊ4GqX %HVJ7.rkm @s~K(FG!:t(hF;7o>i$cG>xݿ0y9ƍS Ļ>SfǑoM|޽@< /G+\u:"7ӧŃ+F{mEt呋􊋋)Po"PI<޺`7gRo0'Cir٠Q꽶fe|[Ṫxb^gkV}Ο|`yS2.]xXv4wQ42|8ٲN`^m|KǎZ p%{ rBXn2!:d "ѳh_t2M #< UrLQ ;͕lPgU]?mWZO|7p GƧOVvbӎq cm~vCpv)\ w{oa_|RG|[XfC*ݭpbQ =+ݖ qo0{X2.^(e3M:둦#o1TmkWu6R=!XeHbp|[U/J镖[<:D{(4'aN;}^iX8ߖV9ruV N k1سgO" 0>(|aW d8wށn]Bc:w|9ggkP}z!wq;+Wh;.g 0Q]42hР8c-Y ^RTT>%z8- Fb'L0lذX堸!Sx%"x'<QlÆ FK6Q|LT ]_e;yNZ|J޵w9>2(C)_'8(Kx+фVuC~x8^CRHVԦ" EHXspopVȶC٠T}%*U/`PǏ?Yy­MAf+=;T}c=93h'/bd}ɞ>ȭ% ÆSʑB|iYҭ|3r-0zhCgUZ ;._, !Z6-X|UKJ8[qIr6h47`M`Op+msqĔϧZ: / c-XiRRB:ńn*^8Ep;fs̙|3u?C!qb?yXsss{W2N2e֭n @ rx˖-_AL… ұcG/%񫯾*JH#??C,r"aÆF pDzx/'k߾wڧ>6"l.# izzzɨ^=A-Vh%D" !iݺ/((5J%%%,t g( tw Ϟ=Æ8;L8;j 0GYvcL#ښ5k8bd-ruO>%Lܹ{ĉmvߋЦMY8Nг݌)ǯݒY,**BiO?H;H?dʧN>Ri]ff,>_]☨ %:.KF|8rnmĈ飊b@@tF3#:!4sy[|Y.P\"tuոӧOcZ Ex-!Gp8DZ OIizF3Rˌ2q?3Ɖ_Fn$O gϟ?))^94-k-4gW-Ç49\N֭{n}RZLFȥ02=zTrO?o%S;O?D1un/+|pm۶mu#"; @{rpЛ]䑕ƹL nիwq/750@yLZ*OϦy ͛7˅xx޿~$'I~=z%ߵkLJgAI nN29+\gbb$:#]a6a|Fرk_"A޾cS| /i(ԍH:=ɼۉ켢'ꥥ8K&J3Vk{ *O Ǟ ˶>ȱ% ÕcO!+Gj-%zAlcLF3qD5nS҄3gNB土iivqWu7Ra#k׮ׯ]'\y]Kp:RN:F]3?g6q2\ŧ'sU6BM UC˜%u^x1rOLԶ0<5yh#€h<,DpTޫa[ueUT <ﰅr Aaȫ/KJJ8hsss9ۅ}|Q#СCk)]ׯoVꈇx/G+Z"|0pY6 å"?¥NV]B]HHd[dqyŇW41-ϱ'C俆깕uPyR8$UfϞ>ȱ% ï=ǞW4 pPK Ԗq=x,~[Yx߬z(3$M8~'OY #իWG>x`AsGhB:thL&bGpf.oڴ)C0s9 x$:p;bV^ t0Eb(ySΪU&>Wm=.D^{sQ-3LGSr _GRV>IzdqH&M؋Fn 0XH-,]vr*c>;<7"*/,{dCx)*<35#ӥ|c.]J Ɓ<ӹ{.˗+8\oG\n&G=pzv„ WVJ/zٗWp:;vE%LVxꈧH۴iQcdz$^yI,ϙk*͛h 4~zn+Be.pTʪ~vs̑:mǍ-+\g#zPi<r W{ ջ|2W}Qp3`MEzg۪XA8T;Cvڕ{knD@fm7mzwza%7y^ eûq9:Z!Rb25o7e-lDZC C >ޘpYnȱ]529>Ǐ=g[7`>X/Xխǯ349cah0d)DРbS- תGfoߗOw|g *7h˖-,~5L\2rH8?o7N{Z*[h1(Eng>#!3:oE9nhY&4P܈VXXH#|r!3JJ* .]ijVPy9\9 y-!=~\1V&wHD",afWoՃ&cjKΟ?_ߵk+gQ=~h%tZ0|۰[jd -((@1_4=@W_} -;oƎ{B3%K,[,*mȈx˗ShW^5#fF]Bf3?O?RT;Hħ@ W6">b@}'Np\.`_XBF8pjD?~,o J(cO+Gɧli&ijK_yTƄ -@{9\hh,ޭ]_#/qj{#^g ;:%f"իW&Mrrrڷo?yd4v zĉcիO>^ &SSLT>{MvU[+W6b }^zQG;Xϲwn֭h_ #rC^A@.[Ԙ%~R۷!mBHXBk' #<)qv/<}tΜ9[kiv?ɓYf3*Æ [\\,'dPg B(lxVZ*yyyvo2nAXWih̰>2B3Ͻy6VZ'p|?{Q/ߒ{Aw ŽAdҤI"КF)poXn[a7 itۂ_M:OzAƷUmKU-[fWuc& mkߪVցq!##}^lգp8*'zv?뿽2TGSnی#=:9GԖM'ܸq;t6~(#vQ rcǎxwfnv۝]:A#7|/-[Ճ+e^sF=EAUoӦMQGi i՚HXP(+xx*;w.FM_P( BPDøq4h0q)|1Lx_?}ɓ'pAoܸ/aI=zj^P( BP(2:QoٲM6W^˖-?ҴаaCdӁwZ#G ީӧO9… Ȅiuԡg#G<c֭[+WK?~[nM>}̘1ٳg^^^NN^&:\yW^yW^yO9_iRnq-[O>#O4)tݻGݨQ¥nݺGqT4ѣcN'F:FpBC/--upJW^yW^yW^yפ%ЫW&Ge͚5W^i׮]fe K,X`ox25c?~Fpu XP( BP>GOȓKˏ9|ʕlҤItK8W^mРsÁLK֭K_ϟ?2e ӻwo_͟?gvg¥T@7N7߀?pP7W^yW^yW^k`۾}{~֭[ё'pg `O`>~}cfEEE2NӧOs+8jv9hAyx~Ν;HP^yW^yW^y嫃wpm۶mРAf YƁOݺu_xe˖ͮ_~ӦMj:ujdUR<|BQ h׮رcla;>%E{eڵk7oޢE 6l gc=qLK۴i3c |ٳ/| K()2O>֭ͥ^ر#"liR^=y:17(.#G^m[7od~cFg}!?@=,`)v;?0ǔFi5ѣ< ? )~ڻwƍ#󋋋o߾-%~P_G/_Sg*UTRJ*V%OҜ*PN"ÏtƍSyWF>ԩS͝;ûw޳gsűVЅ ed8YQRof͚qIQC ׮]Cti0Ŕ{h+//s GRW\Ç+WJuܸqDVq:A*ݻ9Yf;w|iii)W`ǎv)8VTRJ*UTi5iu|t2c920lu94sx qFבK))G_ڑzUct>S $#A֭F8AIi޼x4iB ]t3BT~h X۷çMf+UTRJ*U={wyTp{OF|eNƍTǎe^*#v = }ܹ>=nߣN<ڄݻϞ={ԩҧڗ/_r`-8m&nٲ%\0x:uݻ`ҥKg%z gϞqFZ_m@439%%%k׮eĉA$m֬Y3J*UTRJfI{mz۾(ϟ#5Jn^/Ç_z}?Ks(j~Q>hʕ+V *ŋ#ƍԐirOmVw:p@zYv{|AE9|T+UTRJ*U=3]'OJi?ٺŗ^ 1cEr8p;M~cBN>;w'~"t e.]:udիW ﺴ?ongYY֭[ϧsp@*++5I36mzw~2@j۶gV#//L2Xr3W\ڵ >}$|)S8%K(|Ϟ=[nN>@?O!u>zǠ|:TRJ*UTi&DcO8ai-[tT:u0I=[od4NX߾}>&Or20tPwyƍ8uX|+m(ez{+773|ذa4W,qmr !Çݢ}ѣG)… ݺu=z4=ge|x8p;x9)p9\:;s$S?~,~vNz)Onذ!O>c~6m;O?`}] )M޿@= BP( V&åm۶?999c|}{Jά/=pZɓ',eN ?pn6n$^MiFυvKjժUM  gvq1aN5kJJըQc)w Jd'?XIݺuQ(5# BP( BQLްى'<(Mo߆{y28~GGG^|ɏ4ϝ;;JyW^yW^y啯| V( BP( "j`J*UTRJ*U44`BP( BPdV( BP( EV@`BP( BPdV( BP( EV@`BP( BPdV( BP( EV++++_[yV( BP( EV_8 +++W3 BP( B XRJ*UTRJ*Tg BP( B`J*UTRJ*U-+|U8rHɯ]9rd,?ziػw?>5k־}ISXM)I-++_[yy~dԩ~ٳg;>_~ƍ6LB:}t~;Ǐ \VVțr&ÊE&?~޽ ~1bپFڸqW옱*ڵj׉'RW'lE V9߲e *ɀ Hjʍ*愡Cu?0al)ȱt~K8$nΟ?G67 oO7}i+5J*U4:{waga cF[;eׯ_Hڵk)yyyc:F:>{ԩ;ex{oO'Pm۶ُ8ƇۡC|1?܀B;ݳgHNx4R?6/K-%ye8)w||իW ,h֬c|8iwMmZM< v=#}c9o!C+znʶrʄ%-xd rFV^yW^4s͛4huԹs[|A߿Skݺ8/^\\\L>L ̙ѣGL>kfOAxG/PXXȇM6wܲeKFHlk&O=J wݸq;N>H˖->|-:kzjSfp8ķH-|#={t\ݛRԩڢ@CO8fi)~P$s,=N+4*-ς!rBw&-Aw92 @zJMRJ*}+T=>m۶/]-… SLG{Ru&ß={6n8 c4 gC۷oذa|~ѯJo=qD<~={Ӈ x/ӹs炩SjիGj1kkի[je3g^o6f+pcּysC .]QȺI&'!|X:?n21>mkzÇϘ1aΚ5СCvλQny毾꣏>B>*4b?dQ:/^L/jذ!}Ȅ_~me18Ak˗&f-\Rh po_.!۳gI!qUj29fS2(3g"T?#ר{/o\tvڅ;3 1{6mӧr|*AN+ynJbf}.|Ů]; ToP^{£J*UTiڹi,>|%aq~ 3n AaQ۷N8m۶>e^v--Z_痲dQ(ƥ/>}w?lOƠ0aQ4萟xf\& !$ /K.6 ڦrbԩS;v;:c7ݙ5f޼uoNp  D0˜d "G%PD"#@ @DF & `D9|;;޻{ViNU]받4im6)<)Y\#JJɽw%f`m_*Ͷm/())tT.T+)MQjݻw<::}~|mPW^pIVE+..&ݾ}[,3GB233멪>oܸ5Zlyfp.^XXX(kyؕ,n@˂,`'j0&ݻwkP!/z7oaԪD㗪.}H,0Ʈ\SREJjJ/Iw #ʀzsuXL[RTTϿIG/~ߞ>a9gyg_`Q^^fܹyGbp-ٳ'SԩӨQ]”j:0me$-B[ZM=a|ۻwo9\Z3u+b7s1?="u tMmXXŷ]'R9M-KTAB||zނuݻwO| Q%Zl:)ŋ[0lhC sY @`K#{ Q< -tALuQT S\w5k ]cХPU^pAL |x*b*-rr X6ӧOi)ӧ@gR@9g2eʔ)ׄv>~/ϊat2|p3R`5 0k#G5 &^t;w"1c0zR:>!fT<;R:G>zhzY,bX жm[3]!O>gZZfȑVO(|@I२N:,^AΝ} "S&E]$i̡~,r ,:6gU)MJPY @`R٨`ӧOsۼ\qSUiI=J<%jtDs*2HUi,IaVP-E?Hsgs`t ^<3<Ͽ.+{zS?=m>,݉DpyATTU/N8ٓϘ1vAjV8+F]&Mdl?#eHahG+?Q@S9)ʤ^zϗ.]J%))SG4nСC\6l%k7أG֮] ֲǏe>|xӦMt!bl[LZn A"LAH!CUX>pXSo2sYJ/J /XWX1a„6}o2eʔ)S + `q?>>zXM'K8vwR6r222\ma[0mR1̥Iqq1Z=*YAKHsMN>Z_sG׮])[%@FܳgK.s趡f͚ݽ{PxǸ!Ec={ЪZff&=]U٪ xybP0\۷O2q}fU|$I ҡ,R]dP0(sʀ%>`0^F+@qs/ܹ#;v Inݺ^PuN ɃJLL bٳgoi}&99zLRz3`|wG׭~#5޼y5|4M%*YM3Ay->DOCj̋,@`j,nI7d#4T*9J/JM^/vٳ77oޥK={߸qC0eʔ)S//}VV,L[F<36lǏۅ`t6R+Sgߨ$ 4,%(bKxx8v.10Y\`|btJ~*j[%L4 4~>3 ta@]& HÖ+8Y fi\\5X$It(AbW4tׯ_WLvp1 _t Na0gH&`1L~0֭[`R\.H1n Oۤ[n-z*!>7gL1@DDC]<(UVK 8 =Nҧd)d|N`)M_%fZ1//='՛`QQQW^066VKK+e1YԂqiMGI{#GTxzox@c۷o{URRB(/^LִFkSOܖ+e1Y fKqq]۷otKSOq+4ŠUjz+V~-%a`0 Sa^`֬Y#4iRNԨ$իW7kߗ` $ͧw~7nLQҷmi ܱc}4%9%MΝ;OǏ/,,KR2 v]r%҄'̙3$fDDސρ2[;Š^ d E_ &~?,Ν;@Z_~I[s{\ܹ#V̙3O> *ԟ5 ϡWٸqX0lh̲*ATe1h^`ZHٳ' {4}9)SL2eWy\D 3QX: E,o`H$11_Y7 )׷Œ o 2bP|ްaCHK`F=TbWW:D暖ضm8fKRTTD EqdpZ>j'|VWDGͭƤ`r  n:Xfd&z1Š`sQ~=mQhP0Q< FG_ pVV ֭^2t} `&x5_txС0Da00}ߑ#Gh_m ^ Ծ[ |ڏ1cƠ iӦYBܹsrrrzz:8}ڵ+"`~΄(={hH̢uzr.< 02Hkȏ?TJ5 :-RhРWcǎ%2`댨(UBB)77RkBKyAqqqjx7Dl z1ylNrdxГXwh(ÂqjL+`Uz{nMʜ{оϟC]v}UdfygȿQZZJ^$¬Xlذ‡ < ahjnf̘qMy Çì~*\dȐ!k׮ďBeTjO2} 6aɡ:-*.}Kr.<a:?p@.իڡC,^ŋi!h}%K Y,2[vbccW^m7Us̹w]^PK L۶m'::͛7Cf͚A>`ԨQ?^IcPHҘ5kր7 5jT111`Fo[l> rP.@!xj[N t -Zׯٳϝ;OK -nSƀJ,jUB}Z ҋ,C̔Z&}˼և *@;_P)[NJJŸ/;udJ] gygh`0 `03 `0 ; `0 x-jfygygygy``0 `xW_ygygygy+``0 `xv)SL2eʔ)SL2})3 `0 3eʔ)SL2eʔ)ׂAygygygy_IW2eʔ)SL2eʔkA;3<3<3<3+ 0SL2eʔ)SL2}-/L2eʔ)SL2eʔi%`<3<3<3<$+ݿɓأG޽{GGGgggٳ*)>SL%s@|!)S`wѫW/.N2eʔ)S/|d֬YC yɀ&Nx'q}V>|]w5 _'NЧ/l„ P0'=ztܹ111}C]d]9d}MKK.zv.?"..N#˲ebcc#""@/9uԀ~Q/3,crrrvzMfDK(U%veq*&tܽ{~AneQ_eqe=APϟ]`Ju9Ϊ``޶m[5?QÔ(--_~'xbK.4ׯc D п{^|YS'hС@ @ % 5nDDnݺBVZPoڴQFb0ն+رcL{f͚MPYbWnejszE }P}M4r >(j47C+_Ւql^oyd}9.,ң,-P^zk׮hԑ%{ݹs'a ^ <"u7o 7=,thb\pj̮^ѣXXu<3ϼH0ƳݻÓm۪aƏaj O41^;дiSk׮}E}xiM<(`tq޲e˩Sѣynn] 4ul֤RX<)A6lpђbռ10 Ν{~!))=ڕ,0sݳgOQQD] @GBCC/_@lZ3g"~yW5Әukɥ=Y;vRe`M*kС!7|ӳgOa\ϟOU#Phk*%0R;qpb={ve H.\ԯ_?##c`'cs+e"{ 1\Wnr,ٲ"J^d01eʔ)Ӏ3G_i9۸qc˸8穆W&`6o(1MOT '$$`K00W0>z2_i2/޿ ܣG  5. f:Z0;m4|Uvm˗i* \eʔ)|QAAw4~*hnFX/&LPqyi,YA2K'y쪜sXe-Yڳ Y7-- RCw%XpeqO8Ƃ .ahhժÓfsGY(۷WJc?-GKVKKGի'_tI(4y/3<*R| `i>Xve\]4{EX_!CO ixx81U~̘1aaa@.ímڴK.e˖v˖-|ѢE0IM ڶm+!S نeĂIeR-XN:0u:kbӧOt[o߾ӧCEDDDFFlc̙POB?x4`=uѱcGEN fx|ԨQ T#G/l߾I&⊐q3̭%A45;WedqdhԨKY@')[qAib"HVwQZƯAEXqw߾}+Q`0zs8Tlݺa, /K`}:xXW:Qa\_ Ӽys9˂Yk„ vСlR|޳gO5~ڵklò̔mԷt[~3w̙3շƷcǎRj*ڒ% <&թS'(Ɣ)SLN_`:;Ըq{:Ὧw<ˢs!:sE^zioRqRN50`>LKKv&~۳eFtsxt@ z*qio':x`qq18qqq0`e})L`*ޔ޽{l |tt4IۼE| 44˕ڇLiݬ]v3g\|fݺu#Uxb1\4Jd40Jx.a|XKG,7``0G,X0ӧOƍ} ۞3[N-A|ƍ n/%6pj 0.\ eǯAJaHy0*ׄ]]oڴ Ν;]5ks1 L4(\1Iӌ&"۔ ]d)#eawn̲wޖf 1K(b^ΝJUoe,[Z|vЁ>Wӗ,K@KȲA=dZRR><ή? vjW-Co. BҽӖ7hߏek,Y PcwX^ 6Fo(gy7_R0W! ?LU$h2MMM]FO G<3h ',4+vhq?a駟~RW+xx ފ?4NouF!|_rY,gؒ\1 +-m2dK_aG /AQ%AUP/݅eKyUi ,qCDNNƂ LxWTpԸ8}`B]T!E˒-AlD}k01 "F xMa0 i֬-c6yիW<ͨ~hhaäx e,v%/̍i 6mWwJ|}~sa(<( 믿{.ɓ'N)/W2md6H}P\Q5ǏƠAc'N=zRcT6/)n/d۷owYR\Ւ1 eR\Oe)߲ВjRΝ;hXhU~ @MСCexʕ 8.4 /~vZ5Sj:dfxڻ,Ve ھ~LR{fTK޵k4vZ+!QLH _1<̿KLYܹs48 S xW_I>OKzܹs'''{ &L[j5zh)[V AhCZ׮]a"ҩS'|;n8zNK@0Ts3f '=fY,=,~̤IǥgϞ/_0+_s`ZO;}t@oǎ >.M( J.,mUP%_Ǐ*vwK>UE|Wmb tɓ'[S*MN3E1E%iEZ%[J` F1`T^qܹva_yq####}ǎ3`1@:mZ4ߜ+m۳ݢ }Μ9jZS!hufW%w(PܟI N>MCZMW2 >335'Q 4\(%(ޫҡ,zd"husQ2Xm3?H@{ҥK^h0ؤx%ubb]0J/(@^SDDY,s nwQ?X֭[s]2 Qxx#GѲeK5 ͇!2}d%::Li:tbEvqɓ'5Ҝyly\`j1n~~>ѣ=f2):[qFK{&N}\>4ÍpRɓ'[l_Yt)Mz1+3il Wb8Գ1zN2}1EK #F4Kz.FQTJcY4<} p)qǎQAСƲML61YJCu˻qaZWaɓ'zݺujI]fa(Gr-q j_?EKvW0&,,D(&AaQ*̩gy_Ue]C+5 -+xx =?*,1Y:qiu5+غuk)kh!_ÉUb,"%Dm?Kelk,>>ޡQXPr hf6t(fL[m#zU,ⶉČ )k`[L(3EE@K60KQWCY젱dr/ wܡU,ⶉR*R-ZWsN8l0xQ*u6mPeV$HAѣǵknYA' **{.jcPvA.\|KFp;1 "6ltg0DXޤ9s fyJJGzOٳb/~p0őʶ}v|L) D۴i>La00M>;`'urJD՟.OE-!uE=`]Q0͹Y߀f) hVSG>Yђ;vh]Z^R+ȋ,0.jb_fdee[hP6腤G:L_+C-,]E JP0Rmc?&) p@GLS1򔔔P0?sLQL+gy/ ӧqЦMF\D OuJSys̱ J:te ԩSK"yժUMXv*{dddf` KQv%"ךԂ0{t544~Z߿hU<&K (Ilu^pC?;x1w\`g FGN:$ǏzC>tЌ3 ߿ĉۧOÇk׮2ի_~iii{ Bw|4E8ӦM (%,mLBJJ ÇwԵiӦtw6w^}f`W8)bxAh2_|?\Μ93{!C`{'3Kv⤇1 Nڋw: Kl%w2ist㙘1KeR)\cU{x˖- hҤIݺu<(fis00Y܏=֯_/7atl֬YHHH >#h6e[ вeKM^6lG4m͚5AѶhܮ1i PR{m{y}`6lA&_!;)öo0sWce%4ҺømrھϟiԖS2aP`~nY0gz/T0o չV+eՏUAVEoV7nlۥ 0La`999j.$̍ @zzݻ9ëN:pgZ`|U@zI0$)su_j  {Ⱦ{ѰaC+T1}t J8)ĉsEÇ[jI)#uӧAJ~2Ka[bJ{SNeffC]`9b\:Kz_uZi1h;'O!$m۶r޽{޽GUPP`à^x~W WfBڋ[ Q2؏EWQb^Rkߋ,ܵkK=^h\f}p2V/Cg%0{Jk>1v\z'P0/`cV:'QI)6*N(|cU`~D/1 PW^ZN'MQ)g꫌֭[;LgX/IBׯW.YD=ԸqcM:#""~g"rkcPť6eϟ?Qvy&[s, f^*, fPK52+%ԟ~hlÆ i<^nAvT]vyἇ1 \fTne1h/BXYlA2LcƋFdKTDw;-ɺbP/f3èzUUf?VƯJ|9T-}JÃl`}::t裏9Ƃa1V@g=l0:J[hU߾}-[B oݺuk׊j=ubIP 3p@ ~uzTLvf) ɈG8 K?`$"Fѧ !ta7J(m=iy)/_\pm7]vhcF  *M(`AAմ4 uW2˪^ژSJ1X08T07CjCy/ƅzunƍ:o߾¸8e޽+u}{+::۷/"͹YbxH>|yz屽dwÀmv6lp٫WBnݺshPH}^NڋÔ ic?*KJjjc/rjzھZ-,-ok}KJEa A0vW^Thc}25վ~@mNJ;<^4+** s*0ΝBҔp[nS8qW 0T 5p#N>"iM`1277Ńty3-4\{ !m^d 9?~\|uQ.8,f 4a1@G>}7nS=tW>{pZ2s Q(@xxtqV<0RoH+tZ56F%wr93gԇ"~;>`BfiP0KsX̹CMiG\xQ< & b]3yHHx3nC[͛-4f-JFWa 1c%}zUPې=F!;Xcj=TȀ⻵1B}U";3И~8!0ZSՏUTw\?*%h2, ׯ74af0AFÀ=vXݻh|Z0S._<;;%,*hDž9*C@BO{KfA'R?dL6 vMK7B~ԷC]VV=4F eKe֣\_y~s~^TG@fiP0KsX̹CPL"Υ{h3K\hÎϿ "oCEXZ2}dMLLAcЏ+Ub^sWA؆1 AEclHԋo`cj"l@cFI&*eqX/ B` t ~If͚8p204e*nNFMH e˖'DfSA9r<tRW1qȑ# F]ZfytTNfeBcǎtN>|8Sv? `y;IAF8;TQ(eJJs;v(֣\Aϟ_j#G4hP>}8 V, Rf`k97~x,_.===K.qv+nKаaC:jaq SKP-~ԇW(~0fݸ־,:7~ȋm v^4!0j!ؘ}5;;3Xu sر͛7'%%ѝ[TeU8 0ZSՏU<;\𰰰/!-LG:Rݺ}v֭[1b^^W^mѢxPn%]l撑!>G3m߾ r(>}/ADJw~LKJwݡ\dtDT]i ^na8Y2 -@w3f u~;YD, ONEc@_xU>WӤA||woxP;p͂hc$xђXB'O,͸^t҅ N8_}>8ŕ̲'hL,O?$ 6n8/Omۦqs7+Y #m\aC?Ȃ#ٳz{@CL&Zj vշo_#ŭ%h`bøLj޽{wܹH<׾y{!;+mВ:4v|1aj*;1hQQ-9N:5X8=ݻwX0/6FT)AUBF!}4@+vX۵kz3zCԩ0B_ qЕYhJg>x A)0 "n߾M|Gi@`y<]~vZ$%%ϙ3G}K9,QAD GDDCϐ OU6Frp@~P.]zE]DWUC G:96Kyl/s9}㧟aPmQCݴpX̟?,EPjjL;KVa Xbx%X*mb^H΍_%b(;X4dƲlL mṃTP2xI,E` X&zQK˖-~1^4::r#0.ꬦC-{cI@/&>@= >vöNOiV0 8/=Jn[ +#ǷxIvƍjKBB[q ?L~P"V6&&76F d T=~6R`K 3 N7/Ҳ徐<S.^ )غuԷd mm]N9%41ɓahU޺uFM-9Ԙ%ϼoT܀jm?0J6}3Y %ү`㾁 ƭlE6Qc*?`b`* 6';M,g4@ ,f͛7+"E7OZX+pT?~?^6hР؋x +9'NqqӦM߻woLGOlNص}`R &[a;:%`xW㾨15Xi0=A4V\hc}eqR/y`ÈZ\a:N Cb^T?VZF8t=l5x?ԯ|>z111߽{kΝuq"[x5%%%ǎ޿~=ov׮]4M6l7`/__-Maaav@jĹ%SXnӦd+W⋩Sj0󃩿%%]vjͣQTK,O-ZWWIJݻ'==]|+]Vh{qƾ{*tJM*_jV|{9rUfv|WxpBMh%<-- *c`4ɓ'[.Xz-<Сm46k N<4E5g"@|HvB01g?9BwAOJ=_~ 8~KZMfW m(Dy/<<\/9( (]y>}BKΝ;C զMh%6}ۂo/fTr־2` :cǎrGiխ[Oebl2#577cǎ/:ט[K`4 $cDjڵ1110ښclPfm/ƯRx Ak1lxԘ*k$1G6W^M4Oza**ͦp/ aÆ6cBU+`[Tvi)ܸqCz;tP/+ؕL_w}o>Sh&Mtw`oݐr?q⽋Ѓ :uz =_\@^):DOxYQR͛7MYkֈ?yPkf?t%,Ν?YY+g[`Ex,"V 0*]SA-'ezIc:3($+ݺublE*3yDjjˡYz?Ӡb`N 0}+>믿,Dd0]!~)bf q-}1ƒ'F{;Q.4Ē~ba,=Ƭ+Y oPfm/j8+0A_6 4f6aUJeۻwo@%Lᤲ~*Њ:\RRhӦ͂ pơu։aoSONhut~,w >*ǏR\7*˗9 رcjxE3IjҥKJJ W^hPR';v޿Ccǎq裏*b/t~#G%{#33 W:D햲@="#jT3e3PDU%O􋊊;KY clceV?ZݻwǦ 0L>]j "e`Al/*/(~'MNks˸0ߒXR5ZEtt4xYR 4Qcshj\-dޠꊖ~Ld`k?(j/\{_V_ ]uH۲Iy/Fs_Ҙ^WlrھSH5!}C;{3aʼ٘>Jqߡ^31W~?V իxN/T8~ƍ+))Bujh90 bոI%h{d2oܸqĈ0֯_?$$`Ȑ!ׯן\x"(]v+,, E1Zk׮Lg֭]f > >>СCO<_)YYYnp9990N@v cV8IS\2336ld7w\{"y([K}8&&-[ 4H̓jҿr rs3P"'_tkc{1t `*[NNN'x 0,h` 2jѢEKƨIS+nۋ\ , mJ* w _Bd :M[^x1DI +PsΝ;ĪFzM !F|X_}ra(3N,@;3<3<3<3+Ww2eʔ)SL2eʔ)Ex%`ʔ)SL2eʔ)SL+#ogygygy%y^fʔ)SL2eʔ)S3L2eʔ)SL2e̔)SL2eʔ)SL_ ``0 `0^a 0SL2eʔ)SL2}-(3 `0 3agygygyUy^f0 `0 k>̔)SL2eʔ)SL_ + `0 x-ggygygy-x^f0 `0 kv `0 Z``0 `\k^ǿ[Ϙ2L_T=ma VKW-~;љo'CGx~Є7J[TclAqjNXQkZSO˾ /;ө.?w\⋚Y5g׈Us3kg5/O%ܻ73XĕM^]{:Vי—佔gXTɑrJ+`0 `07׿f<:O>Xoz;cL[X-)%ͭ6*o 6v9Kj<~y+kMx韖:vWq:y|ѾwԬkQ}:;O3'\;'͑of,N3xUdrow2<3<3<3_|V|oi VK_-1|_}Mإ&/3ߟ;s}Ϫ7z̐MFopsW8cCWe1M_#1/1 `0 *#h_ Tpʽߤy3j8of!_,ք&^p:y QSP]36:x7;kL|kLIjO$8ݔy5f6zƕ_f0 `0A ,-eΨjw9SW _Aė&8i,p@o;WSk3#gV]#fz5f6>Ad ㍛/?_NθewFC]+; `0 `o~¯L2eʔ)SL2e9}#)"^<ӣ wC^c.0ƻ7B/QP5:JW[+1f6L8:yan~޹wcf]k?\#fZcLS񖻾q3WcUάpVS?ZG}^)SL2eʔ)SL_R`ec)}*ͳVX[-ua<1^XdpUW+~VnW^wȋnu>vc'߮q4T=.&x#gV]_y]ӿ3N3g0uNC[Ʀ}\ L2eʔ)SL2et`/⪯p嬥}i .|)8uA)5F76띎C'v̿LlܸcИwb֌*{fHS']#Ϫ01ӪGM8<>u┮ߜUn2eʔ)SL2eʔiiWRƝy3?~/aNW7BYR7ؿ:m!&)k{o?LĜZwŸGL=Z p}˝^x4Vr I|7`V⧂eprܽWk)SL2eʔ)SLV ?=?}Ѡa}1Skx'~vyZrnEi輚skB`pqGͪ4fʼwGΨ;ș5f&{7{t sjY d̴'UT'>m.QcZGDW;px_|B0eʔ)SL2eʔ)Ӡ`]9<^ya.S:ة5G I qvw_k̯5:g{yM̯4ח0vRNyuSSՃs'ͩ8^z#Bb2 ްi7Xcwk*d=0<3<3<3_i XFaݹw=wu|ipF)gJ*5y򜰤9 s~lG6J Km 4Mk6fc4O O:?|9j;%lĄÆ Zor3=]{L2eʔ)SL2eգ/ 0Q:m~w`Q]n-vQ,J/h޻Ɗ]( (* vػX &?[3gw}gϞ]9}JasL,\ GnfmST*JRTh uHw&-mU`.5ey٫:sУ~=8tt6׽˼5{vzXk>] lt㠥/8DE^}yv Vnv*l׏wST*JRT*5{3/>1nSf=J6RyWe &.isnpm%^x7 ^qӦ+7\;eX1# ݧU:7=n fvPc )SfO`0 `0,W'n}(ײM]mu*Ӽg6*tZ~:X/v{C6 r\r`Ψd,00ȸU MkرL%ݥ_3~RT*JRT^N?-oR^F]iײ0 ڗOiVAu(ɇw> wN;жal\N~j]A2:kըy {5nuP^CEI+`0 `I$`3)O㫷 ͱOިӰmoէ|u7jҥ|ͺTiؾB射/YآH֥~nWQMkӨUTjݧ"= {X3N2:w̙3gΜ9s̙3gA.'cWd*T}*PUonwҨ)!>^<^ ږC&]4QjӷRZ-}h>r``0 гЅ{k˫_V} eC28rv+ߪIͽ"; ;iܹTeawqqaU:yqFG7Ixt .̚JRT*JR:aUfV/6jQV8ͤD^cM:ܪQUuu8LӨs&]4QMrW:ܸh^zW5ƤȊ8`TS3 `0 `cMv6(㖙/11Mct*_EI%cv+ѢaU1ڸϸ&V0Xʃ'4pLӈ 4 `0 gCxӁS\&y Nf㖙Yl6b٠iMuD.CZ2N/sߪOfsL~M~u>hِCf~ 4 `0 C7x4w W).dlrKF/2m{11Ҳm*'| u; .uDŞM28Й1>9Cg`2|F!G^f0 `0 2fLtp5b&|K,F76۬~c: ׵/Wdn#+wbAMͮ>bXl>hzՑaE``0 п)ϟÍO9\c;x*I+-`/r馽ǚݻ/@s!W}"s%Vc%֣X6lcY|kZLe-2}E˺Xr~ٍ-g-^eO_m}2^,c`0 `U$#  }ˇs`^y.F,ݻ"+]/8F sRT*JRTjPswn||kp—; `0 [+T*JRT*JH̙3gΜ9s̙3g<[\RT*JRT^`0 `0 FzWT*JRT*j#RT*JRT*5T,B|fΜ9s̙3gΜ9s̳e`*JRT*J`*JRT*JrJRT*JRz9s̙3gΜ9s̙E`*JRT*J~Xs̙3gΜ9s̙3g-sST*JRT*U/= `0 `d 0JRT*JRB 1 `0 a ݻRs̙3gΜ9s̙3grW!B!l 0!B!B!B^@L!B!D/&B!B!B h !B!4B!B`B!B!z 0!B!B!B^@L!B!D/&B!B!B h !B!4B!B`B!B!z 0!B!B!B^@L!B!D/u* w4] B!N41r.ya-Xo-iHASBJwd>D*g {٧}umW_%B!'`VbuG9GZ[/m Ƿ3}cu"oLͪ065Vߦ_ТdWJ4Viܲ=F{L5!B!d0:obvDm1CK=q!ޣ/^=~K"x{%o9R{q[;LPubl6a\fd1ZPTy>Sض'`jܐ|7[&B!G €5ؿ@>%9O9un>|vlc}[Ђc9-cbaAӊ7$rRmk׊j0b+?\uz5-B!BHf8.8+9KeWDy%!ܩkr]ᄥYkю*@c-Q`DBkShhLMXo5ȑY]V^'j|ßo9ӷ6!B!D= 5Ӷ1?OyO7jr%2<% JUPE?\yR}!zhG0I --Ѽ{\P_|O*+[:zre;T[Poq&romB!B>cXJŽ{&kr<9}^[uZh`P,VI YSTS'9'gхⓨ*[&jr&;JXoUG NLڄB!}F p@ |ہgT,Jr_>v_׮\psgaWĠߢN :s:Lk)kPЬȓ3ANW `Kϣ(O+O\auIQ #+'^)m>=Zo:<%Ay4ɵL!B!`6w..N~!kW8x`ւE׶uVZY5i]mgLs?h?1l0+-ާuBh^9rXd^(?hAƓWo3𥨆_!A U p^9/1*d]~*s{z2of+v+ey>Jض~7xi\n-=[o-ն?V2!B!d:cbdn磯(-xǏ>rfjYE~-G6ܰ עOM{ qȑGWB߼]{fݼxKe Z~K#g.T\\eG oek]Tj70xaR Ӫl(+ϑ#G%vFVT*T5s%F&y M'2!B!dbvDt s;Eךٓl[v,մk>c]RmZE[~a<jxk몌ߖnժy[>}U2=6[{׹E`QOl.7*oOѸx1֛X{ J0v4oB!B201v"m?tﻷoNXRЪ͖X=&T眍D|ΡfN;::̼e?{ZNSQKd~L&B!-n:l˗/,'O,}D,=l>gl=??ZQ(A9̰պcnkLc?zd_ƶb}J&B!8<}[E̻Zj1ٻ|{].˖pe[Ա:Q}Gο>nG"0!B!:`?[.ظkӛ޼^汮i.l\VϯH)͜WJw9rr6h !B!D|͜.+?u;*Ooi}}&B JςrVY6ೠ !B!o:,wY}i 7!k~.j]2[bCJm>}߭ןmB!WZgI ^xdVc_h6z^pv[Ŋ]&Lu)&#gL IzuB!!j~aV,twJf5!>m|bwG|1=[0(RTSѰYW1ȑSvo *GM'>DY['`Y>PqѩT(13^ͻ㫂f5Uзh/,MdޖG|>W]r}WߤXFce@$ .Hx4_Ė\ U4MvHX.=8:KU)lcX^}t/Yi Q 9J4w59{Q,n`</cVPiHLpv&iE#bJk /(_Nvy.H.K{Ѳb#)X%7$rw;QjP/SC_B:Zr3]B!,M`B&ynCϟ?M(4lǏ7[{]QA,N^U3֒3՗nśtQmՏXzQ?H bQNF_ ыT\mfQmS\6|=Sm\Nx4_WNQ3_U\}()٪R qUyY+TtJ%8$IjىWVb_/o<ɫWGpB!di˗k,r=l*ډuU/*^wxQ;M8Z$A1,7+o?&BҤm}<׷o^{۷;e N\<[7QV7ފQwkmꪺ tҥi5lUp62d^?oSnsPмVCsUĭNxT&3&ڒcY?Wo[Qu_d83JsNLJ/l_7!B7ibGZ%Cڼ}۫WL3?jÏM?7?}0i F7u?Ɵ1NW,䓇!RQ3gƦS_Q54v*ƙ56i5m ZoOU5EP3M(U]( pZtvbՐp !BH&] eۭa 7;&k =|0nƜҿ-}*cgsTO4=qWdUj7$ʓ|%te.R2귩7vQW?m N]JibpmܭgUjqj+ʓ4ƓŷFCgoU 0(IQFXzP:M*k{e6ķf+v'53i8m pkķ}'|~ G7ҝ?V[NÝNLh !BRF:'_42W/12i'햋~aP+5l\I޻[k|k,t5ҽI+&tyAVu5|Uz]@Q8FT[eV.(qS wLbkkfp<2oOY?WKϰ7WmZ5!YWikS02iӵډIW 0!BHHOm:sǽ}atw덡[><6v[iYkLV޽{5GS4-f™qzCP\2 ,bSj_#ŕoW%u&\ebiY;d#p +.XD|SGxRHOJHvFuf%u v;QjIL!2_l5Cl*+k<gӪ# dA N(DfUfQƖ``%[ʙ'Fͫ/٦zDڍS|b ;2d)T Pck d$v> +L!zf)J{ݐ|+OM)YSMMh;1sw:!BE p䏺k`(\2:Kٗl+G%\/lEӼ3};dih !BY'׊h 0!BH#k'. lU4r&)O9}Hٖ>2+l0%:-dY'gqwM=LB!D0>r޽{4B!Hg\s̻w `O_ ]1v[iiC0ڿș? 0!B!d9l=jNXDd4uևnl5䅰41WڎB!BH p;hǪ/ >m^Il?kɾ&xl -.n`s?f;B!BHI_l1˔%N^HC _HH_ǾV}P`B!Bm{qCa߽J??>zp faE$B!B!' p˶-}73j»oNXe0"w!B!ԓ8n{QN%1>9E XB!=HO, f9ӹu5pޗϟ᳚AvtZ7B!BH!} r*4=ҥ7bucTo_h閮AB!Bmeo|l] ?%&z`~^2aQAf7 !B!$;80qjjWa?ufDxt~`Q+ߢ{ՉNG0f.B!BHv" p_k%v됐Ї{&!c&Z_1~ͫ>};S W2ׯ(_znֵN;m|gB!B~d]m=buPUC  Ϝ9}ʕ݆}O^>w0-Ѳz/ӪW!3Ly[z~ !B!$8Pll|ZUe<±|Z(^u:MJnTvRҥ5t^1ɡl_d?O^ԲTn <|NYk-\[{ƨW>B!BH$c p~v"l.Yo:cl,u&V^h<|na*Sߞ>ySb_ssLCʴn2fْm-\,VH`#|B!B7deK2#Z愷G0[K6>,v6c5w >|A^e: 笍4g,e[G(//!B!g%dNAt~>ݿno޲ծumUbuXΕd~S? 1{{_~;Zt,q`5l|/PxU揙9s̙3gΜ9s̙g\GWa믛7n2iΨ3Xz !B!D ^\ v3;6wFM4c_X M\eΜ9s̙3gΜ9sZ纷e\ XiC.*{VB!BHIXwFe-gW?~N#o@.JRT*JRYQulXnEX2_]ȫ|!B!ԣs+5H5#jdT*JRT*@:ׁwD f]'Ɯ9s̙3gΜ9s̳f{+T*JRT*J=B!BH:`*JRT*JdT*JRT*J 0JRT*JRB,>3gΜ9s̙3gΜ9s2 0JRT*JRBy0JRT*JRBe+9s̙3gΜ9s̙3ϖ9WT*JRT*ř3gΜ9s̙3gΜ9˹LRT*JRTЯB!B!ST*JRT*U/+B!BD,0s̙3gΜ9s̙3g]sB!B x0JRT*JRBL!B!D/&B!ʕkذa[lqtt,Tpꇝpww700^W>}U|Fqǎk׮ussڳgOP?cӦMԚ5k`V^ vLS aDafru`z˖-ܺu  ϝ;'$WRŋFv<߿2eܼy 0r .J=9q8Q믆ǎO7o^zuQ+WŋKcu8 .M-1cƠel"e}0K.F:tP^=$F*YCa6޽+H)KkѢ40ѝD`i`5󲷷/TP`` '<6ܹs\א1}f& lҤIb7x`Μ9s̙3gΜyZ~MXXju7o ; /w}Y9ׯ_}7c;w11}llC6]v%WAϟ?êIX(<9ڹ|2q)6mdd pE/Кxqqgr ,ʣa#?~"B2bSNU߲BҥL<666o޼Iܹy JN5ԩ!''&MZ VF"Ж[P\V^.e0 `0?y$\ݻaN`gPY3Ņt0)___,7778|S[9s̙3gΜ9s闧jڵkE XbHVFqO x:99y{{ޯ\~f8 |ƍlC?X,BB8[`ɀbH;v+< 0q˖-X)]d.x( S-̳`iɵ,Ʒ0ɰ={aFt_~3TBѾ&7/1TŗjbE >`0 `w۷O, 4[]^^^pƙdS0AAAu&snݺu5jԐ̞֭[7h@ׯ+^;O~o0Ǐ Q.%B9o߾H֯_4Qi&ӧ166yٲeyM'ײvvv˙3'ksȁGPR#F\ LMw륯 .L`0 `d0'}6|2\_@@ x`2_\'uä05q3n_z`q36Bj!rt++8.gggAqQrg`daP Ippda;x߬Y3Gߨܻw ZCy޼y-Zϙ E>^R UN2)yaӡS ,w `0 F֊THBE?! 0V;ٳCZO6-W\i`0 `02>RupTTdwi;u84օkٙS~ҥRJӋ);ccΜ9s̙3gΜVyjWw޽e˖۷kku,52&s8ϟo߾}֭o^`0 `0t9 pyaʘ8FmHRT*JRԌT m6U(yᄧDIhhhtttLL y=^vaA9N+0+X@FS4 Xe~aEh̙3K/``P[5agh%m`0 `0T+`Jfnv˖-gϞzjdd$'<#>|Ç ={`w+C===`p_Ì_{׮]O~:. `՝;wn޼aOrvc#ɠRT*JRTz52Z0`U''X7n0G9v yv^ʏ= [u=< 0 X_m۷o߿ܹsG : =u/\CBB`}EvЈFH6dΜ9s̙3gΜ9svvp_*nݽ{+W'9aocbbܹs;}1ԁ=/|2Tx]kŅHaJN30VAAAQQQpp qڵ[n%{I>|޽{a1ZDЦ45[n7 fRT*JRT*5c=V90p !]޺u Ν;P8g@»w>|_?ԩS+|Wt'x4,[ zH/^;-7F۷>l/ł0* aF0Bh1SLY}$ YL JRT Y__+""6 8&&F\Z,x"~k׮W‹ܹs0r7o^vƍ0n^,a^t-Bh)51* U#X/_?~\,0۱(#Tm0PS ,MS`tS Eҽ{5jm6~ذa5>mfs2Pr]#L|јlZtd<'ye\9s̙3gyVϟ?/`$۶m uo>",, CŰ*lC+e:g{3g{.mf?U<#ʥ] #LoU40$JJRT*5s5UFjnٲE`8R?ڵkZXʷoĠ< ` a;7n(rQŋ^¯ٳ'$$$::zǎV$+ 0BGcbT0O>#_PÐ  / 0&~N6i;~xgx}󀏘cnjժSɎ;_'R;تra3ڴi#~{ža7o:5kl۶e˰Mӧ?f͚8l.ѩTעM !C1qFIYdɳgHchР*Ko=:hG*+-I.Hx4_cҥؒ\NA8qBi W Z+c~Μ97Oիypul7Q=bHCҳDWJ9ضm#6cݺuq'WIN_>Æ TQ:,{-Q^P(YUǣ'gTGukTwkx̠/4HtM{~Jcd^l$s̙3gΜyyjW?Ʃu͚5sEs) S<k{W8mmѽq|}y ?LhtSs%,] #wϟ&W8vڅs%իWHtt4NśîOdX)p&3`sM8 Slj;kݺu x4_qjJ>I~rjΜ9S|{rg6C?۷ԑROR4(ߢMյJX366V|R_Lſ?xQ~q8%SƩ1$|sJk8/MҩT*JR5T|aa sU ,>xÇNnѣGa5-2j3**ʕ+0Swwwaѯdx0pһ,|jyf ,+ rJL>\Ǐ߹s'aCDwZ`llCJFHg5jڴ):v͛7[h! 1/uD9f#ꈸ|8-ׂU5řk```Æ Q?c7`S`b7aOiTY+Ӑ??۷/Z_j}Ҍ탑cYj ǞЬY3l4 T UwAƣR7i# ǘIT'9_m }ԩ#Hfٲe-?^llFTFb&M$_4+G#SZRN.q}' XYk{Xjg屧~ϦNIFK?7ͮ `0TvnܸP< Ng'NNNd %06m5===pŋX$?W(0=Q_!َ|xGWAAA111HFˊ S?l933̗gw&\Ւ%K+A:X.y43F@N eƇsrgrʼngџ.ao GQ9ܼjmmuâ@ߙthz5|ו`Rlҹ9%頥%+i0 0%O80TeXUU eLmhh.{J!qCϟ'zXN}7RJnضmW;`"]vI}cPR>w\OOLCCCt~qNa*aMᅮn b9*WNk/.p82П.k}`uDt?]C̲etgpsU8\gxE~'N?aEwoMX> #uuuFҮۈȵ;22=vNwBUZř3gc+cq>|X|X$#?^yyV${q1䗀S?q n^nuvvd0k_j~iMMVXIj4 Y}ҦY=JTŊMۡ!Tk.\ VPޑF'ٳg;;;O>?=b F.Rbp7VOO}r6Bj'Ot~z埪Dmd  `FRs1WɎݰv[eh'4RT(ݭ[1'ݘ8$:(JN:%u&O*Ao_g3!w7UJ3~zj=|t'O ۷oO@MS!2ҭ=|7N?I3W"g߰PN]]]NLZ+rp0sÆ 2gν甤.aaK:EHsAGLtbv-Jixboo/ݯ^{2r dpk`Qֶms]~aCfIIIQQѪUsN':X d {?̊޼yϝ;jpBj/„yG(5P[><:v9s?ҥK:7o{گ֭[؂(? 4&)'B/\0Cni0g͚9,8w٪? ~/U?3Lpa<́[1-P'I=tEԟ?$tDv6 0 #]r{Ak baYQQ:ohhy``رcHV5-Kک_+IL@E3Wj@C]]]Hk\]Y0bխ%KMb/_;ԩS%%%/믿/()8}[ZZZ1MpK͛_}O<5483x+V,͙f4 pH-7,\t'^r{= ʕ+QYD;=_ o8gC2Ofh\O4-xͽD.aaK, o>hj%NġCIsW*Ow$*0Pmmm-?Ԡݛ H)Cykg4M<%00zO:TG?G',%HxzJXƅ,Iچ'`Jx|McD~+~ڄ61Hi'B:S@tkcڛȿ0:c3<#$]~=c%3f`0+=ؕ+W-R+|wǛiW'9?gΜLD2'1ܛгsJAKqo `0 0%q^*FVz;Zr!)~zhmɡEԯ*%o}{zwxv0&ACkk>[_̸xD+++sg¢E7n|Nױ._z5(V .裏]Fyeq]aҥG՟oO>pB7mIII@Ʊ7wbU?Oe87is2BBr:b /1H}A&Y|۹uoD|̙qݺujMZӆaaq/o맳|!%_L VF psWvsɸaaaIAo߾5XgШyώ;0t߼ywޙ7oރ>8w^{6 ###<;i[fqŦ~ 0 0iH:X!O+6 0 0 Ø*w%+ &MU `h0 0 0)J >K* m۶e˖1j&5GILp6 0 0 Ø  ٺukEE?=eEiibY@eeet&ion0 0 0 c F &R'lڴikVP͛׮].))ɮ7nXUUN+ІaaaS"u@:rE~@r抈͢d0U!鉺N-laa1UrEG^IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/info.guardianproject.checkey/en-US/phoneScreenshots/checkey.png0000644000175000017500000051267514620351225032073 0ustar00hanshansPNG  IHDR 0n3IDATxXMnnrEP){& ] J*(VPAر]Q"Xa僧~gmNTp~yߙwfiCP( BP( BP( BP( BPZph|\i#l;;;]GGwcbԩӠAFr,̂ W` Ǐrj?ʩ5s3ߵꌔ(XBbh,((">ptɢD%H`@]_a&+3aXAAAcƌJNN#OOOgw!~*( "oj(ROݢ1{TI&N!@̉bvnnnVSLM{RzMCF4Um۶=ܔY"`|>!|,mH1 ,8O>@BPZ0UV?tTƳ$!!^q?x{{:wBs~AZ$>c HJJ$%%4Y BP>1c̲1 d )FPA2qM+KZwRRPPS8 Bl^aדBP( BP( BP( BP( BP(СP( B4)^FP( BiBP( BibP( BibW`))*jik8tga4((<,E\/؞=m410TV)ZeefM6BP(Jch.lUH{Hm&;ǻZNuJp1Kt1Mr5a#o Li-Da BP(X jn~F*~j C, \̓z1ͫ wif\MgsS P( Rizd.ڥt/M~: T'us5wKr:47Dg'G=-2, lע0gSc-&OBP(')jWe9i 3 +9 {Ŏ.Jn}5 1Pfsc>.l^ك<9 ՠX BPZ M! 4ՠ Ɉ[B`utPKUj0FjM';yH#:4uIpeՈ iBP( 勡 dWvb2r6 *wenkh`fg8((mmwCu( B$%Ք5ݵd=e:k]^_:TSi}y1fL]#-"\KpHr5Orڷ9>`(>k6[1W!]EP( (l**=XeRNb}$itetJt/XQfB,tz$Z9:'{HvJr4iǂCp@ۥ#]tU*ʗWvԃq~ήڥ/߿Ֆӵ[.z.>a8z]4(2sbooм 67[.TULsЎ4UP]9ƭ$aPIBpv{vh1KKyQaDkf]cMv:|bUcB?)BO=ƹw7PZ+s~uR)kV|~n7U~6g5k'nr)DS֟!k'4'ilnhZA55P`)((ȻuQ/?NO>^8a͟qzi9㶆{@<%Z%62p^HqjK{YmT`.Z}Z-VPM X *եkw)=TKAgd^ٰW/*q~L]]'XL44ʪpm$G@%8d5_3%fu}y elaJyq՛3|YYGL~nA3;ϭ8 VF`sC E !KEARTv$\ vWϫٸ;;[~xɵчLg=VoCU{^V)N\eUk~v^F+.Kqgo9(jVypݣoNyS*O.EdԘԃ"vG`sC E KAPK/U)?M:FtP^2Ig,^U ^hW96_Y[:"N3D9849 {7_cxi˼ ]u3 ZYvcꢻr24?GnP=ִC1YU VF`sC E|4fPJFw¼{8rxa6dwOQK4U"M&A#4;x3:i]6Y5޼)LKK{CLEݢ"r9VVV.<~TU~؇RȋF%#>:G=4 8%fop>}:s9[[۹sjkk1tPx向9'544n`` ZZZ7|`w?8q"91 ''`„ *&&I0I/Q vYP^^^|]sssQdnHH -4+2"(1 ((h1#FkA$-Z=n8Rxn"19rk^*},ovxo1AY捓 A5ŕkA72ۍo ʛwd2kjj*)ʺH)w [Y*@Cj\?5:VDEδK5kg_YvuE[>-Y //<9K G y4OuiWE'+GȏԐ먑o4E;չ[ѪB׷o_hbg~~><I֭[UUU]vm QZ=6?yK{NyǛ*;r5g5X˗/BWˑz_%8З ;w~!ΠAM΅c}FEEÇ7o 1cV\ϟ?ӧOÍ>g͘1>va8v OAk @EIQu˂'ypnXXk׮eGE̚5LaA[h#Weobuo<)Y^^NF$#,:@۷og¯%z m"}b n:ke(LHx1i~ǎćX&[`5BV6YbaɤΚ-Xu j7dx/״7rvWV3g5\WR`NCv1an~ԈE1 .L2r^tͲc/YdעW<#=ߛpESכֿ>V~dƔǥKﮝv +HaJ}lYn]-Ux&$8{9q%tlp{^]\\? ݻwcP î? CG@3yXѣGfGHWd ,\d>AP\p0!N(_\VXtށyv{Y;qZ:LϞ=5cTܼkkkKKK ,"~7WWWp!!!ŸEeXG#~UchvYsrr 4(GT6{!|Đz6lٵ8p ^HÇ'ZZZ+CǮϛTh}l,:ԩS(@ҩc|t- oo-FPLWȄ,ATekjj$_Rd7B3PdH]9ZG 5+xfW"/L89̂g (ʲI=ݞ߳v{=IMyPxcYOqd6?ؐij]z.}2ot[D $3,qsa!'ntnFF]82!3ULL vy"0bnA"߿DŽz{13|mX̯N +r~OF`=~+Ekacp!YSۼ;w WΟ?Of ,ENgs-g2jUccc͛ƽF(0 l8 lقIMME{RQQȚro>ǁ<!*HAARLpE7A&|֖XnU +!ݻ /:}!O&X%z* m"p@||GE8{,b#$Z(}{9[n.(:YnRkN݇GoIF_>>>0#F3fۼ9r Wp%B"3f n xG'\jdd${ ܙ"\oߎK#1qqqRlR%$~t׮];uTAA m6 Y\v""&*HAA"H7ODD`ǎ'O|Ι!pZ (}޼y‹UV۷oȑ0XYYk^ b&3˛+8)\ u ,$!rf AU{ Z];S+e0xѪ!q>steƠG,nef :s*cPwrC֮ ]0^9htM9_bW^[2qfB\'4G,+}Mhm!W>|x!!Xi8w^9%ײV"pΞ=BU?--Mۉ!"?=e޽_}vzʕ+2>xY,z&YOPC*lnjU 0K"$cz1.RŦXwwwGR]]9=A[hPxVĠk733k!!| 5z8cb8pӧO!Жvy[ADxfyW`q':k`yodBc J*]ş{ktQ.=V_nH=97MŌ8>qp߾U,oG3B҃fzT7$!`TA1$Q!ђH0p CE BDFF^|YƆ1ʊ|Ȩl=X8۲h9K`q;}QDW߿+YGD4aScnx!@ 8fEˢ/MA o묠lq6UM5Oq# G5XJd{)J8Ȉ;ʈ{+IU nuij=ڽ-V|SU·%wmݽeߜ7ο}{y+/?⩷~{{gޜ}5;jU?9.:#U0X5{YsYlݺHhdy=~fi ,___hcǎsܸqgϞ%j, `L[+^K E`sC E ,KqN;K+HRWSI>ڴپ?*v}XTPb?Ẃ?\5zsAl$?o:y@LOpS];OIqsz?$o[A̲i~N~ZYY?<7aWp%{ꎚ~wk9RWm'g"l3y)/5)gy OE>JNrջw4X0һ8fɷzu^7Qκ9OWtҧWmyOl{SS7Ͼr[,5t9$MDnaS8>% |~ ,GmVT~nV9w'w> -W$mdm$m$z)uAF\_ldRW9t!#ފiOg؟祋_rn ɛxwE"ywDG{s'K_bg%F,1%=DMjL7HKK)v]z5p&ˡɓ'ty;EQ޻Lb:J:D6I;ֳϝOJ>[}Z-H`()j(iw1!+('aIL$ڇ{gU֯"yȅqwV<<+&7 Zt—W9u&M| qtëCk8jnMm UfFiZ3 ٷ?ACC|5|B$wOt᯿=|FGN*[!nuFy؆>zϝOJ>[}Z-H` ed%d%Tʹ8q;x̱WzvvIn^ȍ4*wY}呵5#J tܣ IOycΓ-)7N0ښ䍓I}xvZJy}ME94;JˁjVjvWozr;E}rOfYytۿEh*Z> -A+ ,h,ymΦFu;kk%ip-2F\Z4ڒ5O[2QճjMQ;3fx̽aN++*3'E:{HN4OuPO4W6VIXeil4ƕ[Jgeŝ߽;vԃUTp:/GT{U~'ilnhZA5O`1v`ݹ}fbf[5gͼ珻daG&{!bbMLę؈91uj_U#挹|⍂egsvRrSgoh8Y'IyQw/w j7yws_}sNrJmꎚ}~7|f޽{śFlhkMG+h3ljjR3,$+.+n%%f 5IۢVA`=ޔ߽Ց2Ce_\y+?ǻ<ݱQQ,F_\KO9q՛_y|%T0eG9aSxo䚳;V. g"h@./kQx_qwVbJ2nFNx̣ SnN^8NQOvf=-]7'K^YbOMnL8#sCkXKi#/$U&X%J-٩kDgcG-%- BP(:KuP$[^ܼ/Jv0Y0mSx҂,.7iK^~7 +_)z?ᆤscf,M.;P_*\^r5:Փ WmjjiIBP(/ ,Ν5%%ˊ+whʶkU)$n'ۙX9¸bפֿ~Rtųo:1`RiA(&W>%t* a+#"9kk-?BP(J@dd4|ҕv?$g6:3uy-`zkiX1%WN <_{rjٙU5E{P8T]GgqzM$5P( pșRQiN;?.-%-ӥRe:tY%/VEqV-m:ZǺVVU]Qixvn:R]vFgIey3BP(J(HwҾ/mILn!+KKl븵dq]{%:KUvR\YT2';+퓒]&&SD;i^ AIz+IH*)7In) BP>X׻+(()z+֞V HLb. RN .ʗ5(i_Vo;thjGqZˊR6S)ץP( Bd4V`+ky* RqVuU-Dn{B:mߪZr~;ף.' .؞ӳf[fq7m,t$$m]ZP^J BP( E3X BD(F ܺP(WDc:TyJiV B|tb!M4EqX B*VRDҪ=,)P( CaaիWX|KZ[[;4)Ʈ9m lFcXSSS {ᵩBP(k'O(//?|޽{wѵkW] t i`f06"\pyP( 5qܹgUVVp۶mT`Q, EUuu5L˗|KUUU ' LgEEرcg͚E Nۯ_拿H _[{(++á9r|4ђ4a/2E9Xd mA.\ψ0aEt 0`Ĉwpxyy1qu#{fYx1J={644ɰIIIAƎ',, '?o ,@q>enaС ///G Q'N3((KMM{޽Hq9|>}?=vܹӀtRxx8.B'}U?ۍڴiSɸ[x6ǵPl1c1'سgO&<{cTuj!wIv bnn&aB\=l߾);sS)$ Mܑ؄_twHHbFӦMnii/|ƍטzamcG}.))i|E kjj4-X' 7 lM-8/33feeW V/Цb&nF)=z. r]va{C 7;k(`[7y,Yh(Ѩ(8OĀNHHu|EammͤmڵjC3"%ߓ0Dl:th˖-p3DtBF`A gdd dWTTʕ+q͟?o qlj}ĉVWWcKQ)N8fǎpؠ֬YP68?: R(0W!NdA-g@9\vAb, nƢD())Შ͛73u5 *HĢப"!lPFbc eTmp!Gq.ܑBXIիɵL!3)DLn-˂wİabbb cc10b@22dp-6~Ϝ9k%dN%Ydķ2lٲZl"3lsB鹸-tں #xzzװRL؋aGTik&z?OnA{7Ca⏶<33 \>55ͭӗ]&pOt<<<Uc?> zAо# kOs`Ϡ/.HA%,d ppp@dzΞB'nt#tfb_RvHM}"eK 2vPlz#fkftؒlBl>%ĉpn+׺Pb㏻<)&a2#>VP *)5,tn3XUUUw$:V򈰎,F@GbZ +?08p 8 BEuw^^.-$ D`Ak%1c8Z8&<1ņGS>bU˳ `X6n V-g. ҲxgP\H!>; Gč|>|8 j:EH WiYsբ|͆JO:˖@ll, mBB+++2%`&uaggW˙b$TWp$#%&1'ij|rv`RBM 8 f:`fA`9rX& i1E(}ƭq;:coG7ÇFo 9!]Ph2 ?4drҥzW=.3/3n5jv===?"kqa0#B}:`\Ǩ|}}Hr"'DH?׌PɌr|70sKH5 )D0  FAPqF{3U5BFS`qYaEl?c6"kTBlSň솄 {XdcDŽ؅1`4N&:NR+^f \;ڌ #H[ZbtF.7 ź,"=ZRRBI9A`,Q`r: .Gֹ0@j @! wAйz2Κ5<o~>0O09K__|Da!mk֡&K0/D?#z'%%ي}A5cA 5l UIr&Ϭݥ!UYYY `_ BHffB֊Psբ5X Y G!H:s&)D) *y^c`HKK#RRR0pÇ7*A3XzNpW]2aFz{ɓhjhp}|Aiq`>{.Ӛ?K,Y?vZSSSO1d69+6ޘI'{.BBءGrѸ%֭CWY3yd,Y}q &@X b @jw FGG?~\P9 :;;/'nd̺MkrԨQ(1GGG?H E P3kepK )7nܨ pMfnIKŘ $1m"…Ş"F2abז%RC !>U" yg,F`/_;Q_̙3aX<-nR2ff#QbM7]soUUD$TH(n-{ #Gv`Ch|8q 8?K[FDD0'>wgL##Bakt~̋FIS 弽 nEK~zD[\`xL^9(\=Οؠ'CYoհnW~p3['/usڏ 7#!b#OT񐑑w @qZ ?b6u{n (RQyyyw =w@@¸n޼B$J =<<0c\3f P ՚(+nKÓsgdi Ƣj,Qזj?>b&ۈI.DjBp!μ^q]ƀRBaH8za. Ch>rrr#hkYE`m-BX hΝ XhC0 >s@]n #=d=RQ\ܼ۲9PV̷[AP ]㼵IƵEGU]]ͼɺHcŵew^Yմ[9$ty}Xݻw%l}+Wm+ےGF߱cG:S)+|xb\Ԥv2d4k֬Hm-_~č*:t({uΗNnٳgrIMݟ}I" :tak֭lOWWWx0>_EEE&SLa<{_>''g쨄8uT33s2cbbVZf511!D H,X _ ϕ+W8I:s5sb`zm 0'Ǐ={ܼysSH"n+**P#1799\KR[[-{ĉ &.]tu^'''+++666>pgprHrHCii3g>|S4YcN:ۇܹsP`8_UU9w\z.,9J  3X BV5X ou]B̄2e MOOȑ#u9rnfitǏ{D<}tرd7!!3f DΆɁgTT.?%$G_ X0'L ,knnn- ֡C&[`As}dĈ+„Y|.G<}aee%3%V]x͚5dW` X9,X`߾}!/'+K`5,nn/M`]rڶm[gCsܹ>pr0Gy|=zԀ94вe X#gCVMMgϞݿrr2`N ,XES[[[bd- 1#VȂw蒥$..NWG`۸qcAA %$c%[{y¯~odk^[_fd8t\v-GҀzAc74:J-17bƤk9ϼ4i aÆ $l\$W:`;v G7lۃT_Z[[/Θ1CP)2! e?4mq2~(~ -n-3[Ծ}#h |ÃL Ot 訝"͛7#@,TLhh(?E@75==}Q&'Z4!nf!}q=N777$z/= d6NS@ F"p-ysyĨ8%rʷf(#Zy^L!#$c4 3-L|׋׭['J4 ;P3Ċ0KMM%$;j $ ;A)eddqܹs!Ⱥ"%B"˖-{L)|rg0|e>wKP}&\[&) 9d ?<M+LB\3X aX ,`A=6k $F6,;f s1bHKK#( XEP1YՁɢ12DG8i$r+Vرcq. H5\Ʋq1 Ecbb^v- ,&??_PoQgxfKAM WxB<2}թSPEEE(R(ӀS 0DFF)YYY pgOL}Y eE6{ ‚,r<:v옠5Xkǎ]r%#`52QkH #"v<s_kLB,,4I*(Mz v4|fimPaa!!|>ҿx!C #bL0ᙾMйPcLke4ȭgFI&UY=1=3y1y1lff;c6  d@HlbxXIUe8OHyNs*7OeU$(X={& 6 ;t@,y駟rcǎH.~c%ߗǍIqcxU_,Sj}V6mdtWÆ {3B8f%/`m=o۶-ݣQoټyN$v==q, ;rNJTBb.))) f,\,)(MRDYQKMv\wNHe4,SQB*yZreˌp(ulmbXz~߾}`Y ¨0-`alDRSSW{&IԩsݫW/8Ȏ 7\ gOJhѢk׮SJ!S0>m۶D)P{R2fuLcu uD݈:F:-J/)kqDAap!]wR\o ]AQMъUP;[n9=X*F=1.d߰aI,SbVF I+S˫E‡kSN>I)Mx$///d؁ZM+H*`ݼy/,K"޽{LLY**p{&O{7던վ+֬YSEU!m\<Ӽy$lٲ)B:gP9Vg}~adDtVP Fŋjbv3^|YR"°\6yRKz)WfV(633Sd%]N2">}|cS0!TUG\kD]Eo5jLf"ёN:6wEj2 ,ZB9ND6ʖy3LVT^1aLxD ,ŅX3g03>6 ՠAfL)deǏC^Q~zzzbbgO9'RRPP0dRY߁=w„ 8֔EEE9W=seÇ+JhEsΛ7oLjڶm! Kj\עEd? x 3p!4Qܳ9p |+/l77n*џB/ba5je%%HHzȟ,!R> лwoy8sPf>w!fM2m1e#Ay`MK6Ü \.3Ӻa$䄝 Bxv &]U+Qȣ5keEX1S'`&ԨQ#!mD&\$mq<]vŁI@AQȵXpTm {"da$,X}V+l؃mWw@vyڡd233jMd:t(A;hd>}ȹA$QH.^(K&v%r Lny^P2Rs\GraI_z}Xk0 ;.,MNaÃ"ҁ8(Ջ"PX+Le 1 :W݃[K6WK9y#B %%,Kq!EGr_[Wʔw<>|v>+x1GծMnr󊓆a^`-B ,Kq!XN| F^=Ozlɦ9͕>͛7?x`c-Ӧ6-Ze)^$ dɒ%KVRor]vnڵ,Kq!Q].`E徶MmjSڴR=uҥ'OZe)^$ԩSYYY6eɒ%K~F"/RH,L e#X6Mmjӷ?JOOR\9I u]dɒ%K? rE,GQO+77k׮7w^ǽėglo00aܹs!CoJ,IGI2iQQz O?34^dL&Ne@Ծ˗w޽[nzl̚5:qΝ;-`aNL`}7=z|K.ϟ/o"%Kr ;<={vݺui111q׮]k֬Yvm.0%%`z˸{yh.6m SXXغu>UIgrZZS 1ڶmW\ļzƍӪU2ݫAT(jSN wjb#¾X'%%;FMZ._z\2'"LÇϲeTɔ)S(6mZ$KwF!GB|!1%%%ՒW-[ [_߃%V(x?|^XI~Μ9^bhUi̾yA:r8rH.K̰?8ԪU+U_7*#9#ϋjX 1_Ѯ飮UZ>}Ҳ|~1k֣A֗U˞2JߙH"PzסH(%,XǏ,K"`8qB"X^)exb3uv9??TѪSȯYcǎ0`S[4ydVmڴ5j%(.^`&a\'=zӾ}7oR 7,a0.jժ!p"ݫH>X^R >96m:v옔?E ZJiXKlٲhѢ5&߹3bJ 8u]`,fЙ3g$j۷oW8߹vZ: >BVB} СC%K>,$@!"3 V@H&ٵkף/&9ڢE ġ|+Wȵl;S$LJ Rr=V'S.YB%Kz ~A ,ŋ`Ŷ[lP)WMSK`tE/:V}@Pرc9wٲe4$m&[rr|W^K.޽eLu5hÇJIayjK}ңGro߾R._(05zQ>KERtΕ) k7v܃ٳgex|E8p wm%?1c 59VReݺuaSi]N0cȨR8n8UXVY5n={*9YI\XR_Xɋ֥9A#_+HCj`⫚A&4!4}yxq]DЫez_L2x 6$>?"ZrҲ㛢GwUiX&N*,7XUZae^zf@cutep)BX|{G`رC -h F5b"aU!m+VH/`E:y%\*R2+@ȰeK`L)@~Q3?_B`,UQF3\}GŖ̉JfRf\kwy/ŒI+ĐZ$\,}/`1޷oLr /--BpU5R]Dpi,vNƍ&7 vi1ڵkQ^kNa-r-[=)z4EL ]}{*| 9QT6~xWX% /n ":y$-ő$Qeffb`ׯe3yI `II>K~ӦM8˱(JX/>@ 7oT `dzbZi=x09_-M26:cǎٿ[nRٲe' 4fLO^V28Ajj*?sssz^Om61(1j*~N>]>|xȹ<+W$rMIf_1JOOWWʽ+=X"Pɢ0\RdPvd\*0-`!y\:*l3i/u,X zkUjB//ux#G>LEe7E,_ Ϯ= ;[;8e?n8+n =Z7S/\t`1P`Y)m3䙿֭+y.'֔_vm=XQ[ -B5wիֵzy=Xjժ\EEERد_?2VOT*((*$.]`͞=;䄾)@ZJq׬YOG~S yA0݃5IXK~vޝN=,1t>_ـɓ3gRBiY-D^zbb=e%-w@* (e-+{PvO3faRk|LTU\Մz+@RwgƍJJ.u̘1CWr{w2_v&\qbe7Z!=XyU5&sʔ)!gLc<*횻BaNR.O/ԩӶmpHHɱcǶonvuaTJX1Bر<.{X63d{XXvb^)r1ҧ~*g5h@_/Ӣ<)Y|9$kS3+4~0\6JKK%Ky "07oud+ә,ǙѶl">gf Ŝ9sdqM"`>a04nO>y2H#PPȒYSʺS'77!۷VbȺ}.yVŭX^= PM~~>3A3Pjk0F@T|^4NuG])a-*-[=z kpF/^4i0xv)0#P a灆_R\^Ǩ[Μ9Ӿ}aj{5+N\K]v=q bUӧq)!,,6mUʥeNIIB`4hLmڴ:uܰgC{CW Uz24jԈOrG{yhy3)VZ+?,d?/3{^U0;plp=EY [XtJT$4dy mZ1 IqZjԑ#GUt1ą 8 pa`wS ?1dJVo8Cs^*uv)^^ŤjLXT` aVR\HEXZqXwA,]ozu4cBٌY*[1L_+b! ,WYE[ncLU72޹,#y)PN]6ZRF}rQY#^-6-{Q oO_g=xA|̙3-kΝr|Ű"E`1MWeA'Ndu>b( 0zF8"x(.Zz,wz Wky `=zt`Y n݊QU,5gΜv!V9`ɗ>ڵk۷ԥ0.kzj\|7mq_Nj233?x(.Zz,wz Wky.\ٸqXB `aZ0X,YdRY`mٲ,Kq!ڼۼۼͿey_ѳgOy5||I}̵u}ѫp 崴4`9h۶m b\r;7{iՍ79/gW#E9!DIN _FqWG}Yb}OJJݻw䍚\deG^?5۰CJ"|!z+ݛ7o>|Æ UVԲܖ`aN,¸䃃x!?yPш#Bm=z$YMr|yN4I>F1o޼ѣGWR%99Ycq_Z PǎkLe=#: pӧO9r$#Ɍ,!ZS/\*0\ 1_ѮcƇ\_-_z|!l̮R.U LGyлݾ};>r^`͜9/˘1cT kquٖ$RK^&{oEeddpU?K.$??_%{>p|KN*ifԨQWsrrzׯT ǞUU58e޽׵Z^%PXh"z1) ~o>|x…,qԄ*vHF>nٲeѢEHM`AbJ\p$yG|Ȗ+F$|D_Rm;׮]S)d`%ԷxbANH XJ QSX̃ `cHȀ 23P5DCsٵkף/&9*ߏï:u$[Zz|S1S_dvuTPhTعs'zN5k֐5kt "ʥ2Vl/Eq,=Auu8۶mێ;L=z,YD?W6>\駟޽;==}ܸq[zœC{ |7l@˩}%ʑ=SΥ%< Azw.m,\TիҥK\Nkխ[נA8k,!&/Pzѣ۷˧UYo ~\j-ղeK[׮])\A-JΊrvVzàAt]QH08jrRʺu먯J+$.(23 ZjjmCFRD+%A$θ)%G%%6i @-|$XFޚ;&`ӤeK5Jx &ZKׯ`HTUW.upԡ[2BÆ 3=l)ZM ]}{:qĐ(qcpW .wՁ&EEEut`.EO>=^_X_|a?^xʷnb8@sٲe2Q0s{ 'O[z$,J"X#XL"cǎ"9E"XPIi%y\~rr}O2{Had5sġ3dΗKڷ^|1j(zp+!W[2'̤9ɹE 8W;K^VEԑK fF1X2IN\_))),'W_}E&--Bp[yoI+l2#II;RqtysQ4ѨQ#`k׮(Gu} 0' |1="X& Ϯ= 9(*?~]P,0S/\PE)% LS`FuU7oG1! '@P~b'ܱ&Z zwouSD6lE"ҐR<ˬѾ>U?==$CޣwL#w xS`!Z0M6 ;'.l3g;vTknݺI˗J]_gLYasΝ;Ν+%,'"X: ƄZjZӧOsO>=rJ,w|XM.^8,I[_pr,v06L|I|d\Vo"X ]}{vvpʀܸqWN=zn$^!?9?E& *tGUرc,Y0@+pN'`<@%vA, ´]JYrJUDjڵӜrq i/o"jժ0& 0kM&׼X@tma<} eٳCNrA 2<5$pKn`+aJ]+< 1yݻzK}:Jـvn͜9SqfB~,ƿzꉉȦ-bY J֬YYS,rCVϨ5>t4jDj(7iEPVҾ9x|۶mDq)1+u#,$4ԣGpLlQiУL \35xIoO)R //T/7vX#,+W`q"V*DQc`BB5j%ȃfBF gϞ[*Wz,Gؖycǎ\Y IdX8#Gj{,de LjĹ2>Ijd}hٲa`w^p<}*ܥ]ꐧ8 Xf70=z.88]}{ @1*:lh$e)70~s.]4m$''\Laa!s>| `Qh% T<]~}sY**%%*xPZCc* u7D/1V3^}3M)! ,WV ZcjvS8*{_PlvJJ+rIHȩ8:TKpًHqK$rFwɦב%KY=V=7\/S21TYN2%կ_>?۷ɓ'Jϗ ɓ fu&%(酠~ȉ۷g1cKΛʑXRۑn߾]֜,_%x2vĉ:b(0=G)3C:qѲcj-o&wRl{:w|…/1\N)PUeff-!lSNuq\BWRҧU1Mmjӷ2`S6e)^$,P`,x1.]?>ZgyPk֬)|x{׻w._߿zkL3Տ8K,iݺuzTrʊ0Ԧ6[J`YI`W-2`{Ȑ!3g8G6n(P9sf0>}T^l8~Çׯr 8pd =zTߔ.^C5,VEljSL՛xA`Y{@`լY!yܹss/lʔ))))m۶5jTQQ`nn.Dʭ[令*:_nݺO>|^BJJJOwC`t).zW\O7n L$"uرy^ZtʧM&"A6MmV6euG>Ö-[TEڴi#;NÇ]8q<q9r$kɮժUѣ)߼y3qɹ'(JڭU֑#G,Y?joO*… JN*dSԦoeGX8 ,ŋXk׮5F㒿tRF'NHcRުU+01dɃ0̙⣢Sz9WEՃm0rE6lxzUZƍgΜm۶94)u֕OSSRhoy]v4h.lmy+ʱdI~P"X[>Er8U~:uJ(QFfڗ| 5A;wtqP)f߾}G-us>}ڼysVسGjԨQܽ{7vڑOMMmҤğ1b<@ [߷ŋ̟??켋SMmjSuj#XʎJ` 7_TT痢i_[GI\z5p@#UG?TGydA tRS~rk,`9s :tժUEÇ]3Fb&1*hYۼۼͫ`=XNR{02`o^h@~u%}Wo[Pf͚6mrY,Tj կ_:՛:u]JAy"lڴ)999n>|Y3d&Lvk3gT'l˦6M:,KeG#{**3`#FٵkWbb"@ݻw?2~lrOOO'߶mI&A!CP.ruK6VDv>Pnn~QG"죚1cƜ9sjԨϢ"S}f:u} 9:!o˒%K,ŗd`Y* rA*.֙3gڷoá &3|ƍM6mذa6ms-yMCf;333wN!57mڔڼys ʁkԑAr߂!%w[lInݺdO@QRN@v?z(rRXJ0MmjӲNmRQBW9cړ7W߿y}_PAAWxmm眷{,=X6MmjSV7j+S˖-_,K,Yd݃euMmjSڴF-ŋdEh#X,YdB,K"z)%'Hmmm-˫,GX6eɒ%K~,KeGA,6MmjS݃egk;v˟>}zС۷xbP֯_a9|N8*szzݻd<@΢"ץKTaڽpB>}:@[c_Ϟ=C$ O_>+} $ST>,Yr`Y*;*=Xݺu BUVyUɓڵkW%Znݷov >CquթSGՙ|XJhȑRbһwo&y;v={ע䏄TҤIȬ /<&>TlW^;С%/^ ࣾ{ ڼlv Kؼys*|srrT}$iѢxJoa݋K)xaԩr*2+INK>sΝ\3`z'Fm۶QϞ=2cmWN_`8{y+Smyԛ-/݃-C,D;<+XJXRME~J^`y'%%Єr|2lӦMH\dDrrr6mqFNQ#wIαc"̡CҚ7o"gŊm۶mذaQQQ|0u`dɒlRQ{^ lذ̑#GmqƽoѢŰa5ke/ծ]cǎjժ `/+Tu… e'~J1tɯ^kB0a.dɒ,TvTW^NHƍQ,EwmpRRRׯORVСC[GAA Hu9uIeS9D}Ԡ$3߱cSNMDO|f~~>meee}T$n7ߗ /_/<&>+Z}$Zg)Aw]YdE`Y*;XK%īTiٲ@f͚ ڷo o֬Y$yPɦ6m^SN 9Xu9u٪UdS9ytLr[xj#{mV:ݻ~E"'~E/D]Ǐ^dɒ,TvTV3 &7eӧOի^ӌ3dϯ[.]^*(hUT`[3M6 (i(zE5jnI:uSAB/o֖r^&y#ҥKC%w*4jԨI&*B$]|LeG*yj/<&>+Z}' ϝ;WbZW^}wnj#G}ʒ%K.r,T֭R\9aT ָ 3g$G~Ŋ!kgiСý{ղeYfI]ne FO>r^5eʔU4H(tqizW"}veGΤIwe9xb*zJIjjLd3IN9Λ?~rr2SĴ4|ԩSa 8{gX`y&OܬY3*3)PΧf͚0\M14oޜƍ9֭[=he_]ǷXޖ͔<}m]yX[e)( +[,Ydk7%5mڴSN5hРU[,Yd85k.Y>Ϟ=+**JOOo֬Y\򗿼{bh5X,YdgJX7o>|Æ &LXj0oMMM-?0;;{̘1%5jԨUVRY*_*=X6o6o6o咏3g/q㥞۫W/J,d`Ydɒ)+%\AWׯ_W?V駟޽;==}ܸqppnFFƒ%K-ڠAȫ |&O I&ٳg͚595k۷v:p:_ڵ ߿h;k)B*aYgؼۼۼ7o_`fDS5jp¥K|I7mڔOdx"8[ԩS7nܠz-G}]C}ֳgϨO9B鸜N9/ZbB6eɒ%Kn#XxA|cXjպ~!C\-[qy_~`w$[n)S8pB٣GXv"6N:EeKE`Ԧ6MmV**Nhʕ}xt֭[𬅅gRR6lX?~ՇJ>;;ٳgȣ~ `;vs6l(?_G`bj>sN%=T¸#*|222m@hӧOAA>%wiEEEhqǎ.]M$O iro={P_6e85K06mr‡Sʹ\O$G9 h7zd)5j 4h߾}.v1ֈE xQ4ĄV.]0Ç'C)xݺuѣX%P(99yٲebt:tї+W0kiܸ:s挔-GmRc-\|_JW^V|kğW#GԮ][99s愴7Dtر#v, PիyU^o⏧zP1c$G|mIh4nrS՗΍r_vMMz  p-[G kC1%@_QslIʤ;_/!aӟ[e *U*,,d ?e@ ޽ DoITsiA_=էO-LYߺu{|RK?|kz||z0\ɋ#) Jć8tm۶a>Gߵkr<\mڴvĿaÆ]vݺu+^Vߍ4vX2ZNKKk޼@ o&yOӸMV_BoРAjj*/S&&z}a,ܭryŊm۶mQQQ z WTx mܸVr|XwW%q(N< p?Tի+kx1-8.]pDM~͚5}KX.h?eiDIC]Ѳ*FӨQI&aQf֭[c)yW /HpqwEsT2} d/`J&&>%0O>%ѣGC%{MU滲7Ǒ+ )_jGgM6m\q]2؃e'4ԯh咖Rbꗩ]^LsrrBU/&LpK1ر8/Y$vcOIAr0z)hM߾T`nnذ!=X;wp`E T:L ,P|p9,7)oPIl}ΝUFHJkԨ< (J?^lfOLL78*UpӦMS?"TKJԩSgϞR i{\ԴiӀF[n'4ԯhUTT` +]^|s;wĐ^a̘1έƮ]b+W/ K@yTxBL؄ vMKq"yك`1ռK2gnݺP?;#X x uU[j  k-[j`:7L/2,_\sH3f{M8_ŢҥKODq1;)=z7o^FX )SV:h ɎI&u]u>ŋK8$ONNW󅌆<5&SM6E2RSSg͚5sLI|M4nrS5Jɟ&|L2koҋ/lCSz,?hBnq\k4''GdSN5lP@zJюsYOc^ljӸokkСr b C پ}1>|¬,~2GcH'i^B.]233Vюs rY&y;ױywTHÇaMmjSԦ嘺"XB ,ŋX6mz{lmm+B޻ hE`Ԧ6MmZRTvTJܭߦ6Mmj2Jv.^ڼyXB9~:ɓ'6eSԦ6}S>χ -BK"xvA6eSԦ6}STvd#X6Mmjӟij#Xʎl˦6Mm3M],`Y :zKHl-ȯwh۶m\Hr^cǎ'Ox2LΝ۾}]ܹ#?>x swmO>=t充خ\ݰaCzzV]@3 'ʗwc swݻw/.9MG5n&>3yF={"˗]}Ç,wvܩޮ<m}=<7ۏ0q}1ٿ#V̙3Q'`|RX*Ee|XE `] =zt{ѵkWYYYRdf 7رcGgtw q㆔?^tڵYӧO~ڴid={TߗzӦM,|暚57oz5i:uTɓ>vv011Q^F[.&{ U9sB/=Y_o:PY Hj*r-vL|L53|֬YSzu)O05J;nٍ7ʵj:{l3&{0ُIzG88C]ڿ=5O _y`M|Lm}^~\`Y*;*%0_4w{Om+W+VrMR._Q-Z6mߩS%h͛7\H [nիWO|HUV^i4矇 ߕM0K5jTRE&,Q&bcTPP@Ӳ `lС4!'?M7iDmr,dz=vX@r"mfC۷MGIӧO/UMԇƍD,/`ܢh_8sJJǑoa,0(8 Zlٺu7gM`0G=0@_=!:hk<ݺuk߾$Yո'~Gd沲N8cǎ?- TjỦL=X^5k.YDyyy]tQGkת)qqXlن 6m:k,>##C˗/WݻJª?\J-6fR 3^s2aÆ۷p̙:tP߿:۶m#߱cG3P.wmTK>]^jcƌ# ('7̄,&TUvϞ=G5n&>^Wk׮]㖔oڴ񌶾Lc3#}B\dz'I3&1Q4/`?4{+WX-ְdo,{͚5,Ç_|S-V9 |=| äIR`8.?ƍ)S|TZ>jxlbX9GxpHivM9` H+Wl۶mÆ /en޼YGhӦM޽>LRuw|.\ؠATe0QqNNNf60vX  '''--y adjw}YfIr'&}Hs+!=O4hRjU 3Į_5u:v(%Dg?rHC/.dm`|W^,,E[ḙkg*r?nڴ)5TS6i7jr}22 p}chd?&9M5p)ǐg/Mhv}'6z$Dq@t$q3 "W0/l?z* yݸqwvi ˗#/^ 7oܹs '~:͡)SL<7ѡ }VBzm&D_:1cƀI`,X,]JY:uݻ=Zkˋ}S1b"uQa׮]-B\U5-?P~Qol)^:f+&yYܹS9w%֭&,V͚5+Q.KU޽{)))grQ< 9bhT*sp5Or@ǎ.^ރ;>! Cpe"@~t ^zqg6߹V8c_4ngEĊ>9+yLm}=$&;qcx$I&{0k<+feeGt'vL|eb=>x%\xɓ߾}֭[AZxʍ7 fiUV\b A`KZ\BEBȈ7(/#EV@Bf1YlypuC S%3!9I TH(`iii$Nŷ'DCrEZ/۷ιYf:tmgρ1ۦMA r62aOȰ7B~G4O1?q314έZJNN֯_-6h%q{^,bE+yMݺuաPIKH,!Lm% 7N.bV-4^uR+!.$M4&F&LmH_B,8];'Nw\Yk3&@N⹣Y?q3o8O6-TrL:uS\!gR$㖓UtۮN񌡾=ح +"^zddO5I],C%@7_>mLRSs& ceggsa_~:ӧO9tҡ%te:f !BEk.Wƀad8`0 ƃ aHFia`lzy (0p#FH^XeTMT չu҅ZL gϖX˗۵k',sΓw-[`-OQq=En[qɖSvDw>|e6wOH8^bȤ 1r;eʔUckT.b.ckذLԤM"i|B~+Kx(v`^+z[Nj-P2VE;юoۜ.;&MCqf g-X 99^zgM>]L8_vmu$i46gz<^z;V=De)BaŹ`U\ݺu31䉈l޼S`DAdp9&x)]r֠Rjwe [H4^=ha7nm$;of?.+8C`n;TQF4覥tm@ LCœ$v`Ԧ6Mmf9$oz1ѣGdd:BBEEEd)ΕMԤ_H69ءozП ;T#X,Ydɒ%K"$MmjSԦ6sj#X,Ydɒ%Kq-yyyy`Ydɒ%K,ř*ֳyyyy;6eɒ%K,Yg˒%K,Yd)d%K,YdRyyyysF,Ydɒ%KL`Ydɒ%K,řJX_9Rnɒ%K,Y5p8w ow4hϞ=hZdɒ%K,U| X/`[Y #___gu=~so.ߗr7%to^/]//߅ۿ> Wƭ_Y'0,Ydɒ%Ko0'Fίt4ܫ_^|o~u_~O>?>{Oվ?]y~Y ʸwgGxgוgvt"X6",Ydɒ%KH Տ/>ssVWfW:*tN+.|A+}rw2V>MsߐS<|SNw2WT>zʇnU>p&*ɫ3K7^5*o>ɓ',1W\x5k%ۼۼۼͿLm+羳7/#*pn©{NO8[Tˇ/2~ g_ 02μU'U:y҉߆J`yw_Uڒ +m9o-5UXX8x5j$%% 8 >SNV0V\Ydɒ%Kt `/X^w\K8p=p~т?a0预3^~R~~*[cwP"jUpA÷hu~]iO^*̩D.bWO>U'?3isέ^xXU"`gyyy/|k_O8x3ȭc X'NW%'U T nUW) \} JuҮJ;+mz2Mn|ުU7EEE͛7wUsmuǏY ]dɒ%K, ,T`~gՄ}_'p(?HA„cY/~JU:yϹwەS@T:*PV@9?6g&l8sV |/O>D/>}z$j׮u*U:r䈔,PΝooojժu5)3g6hǏW֭[5jX-m_?4MmjSԦ6}R"XOr+M ց/0ႄ# Go^:vޒ? A`n%/F+v]~5!=7a'9/V.'ߖM~KyyyիW*|z٫W6ip#a*=իW_ׇή]v*UW??ر#''g4t)9ԦMXm߾˭Z#X3fسgy-Ydɒ%Ko<k^3+oٕwVޛA7*YP~÷[/<{ʻ*V9gw澳#ۮ-^mʬxs|g*m9S$'pi&?O< Ν;|…?k;w;*tw֐!CLrڼۼۼ[/%~ .R¶+ ;rү%Kuž {׿=7v_넝y ;%lMؖ5;a.'lJX:.‹5_%>˄g|gGS#X999 6*V\ٷov%%%(X[ ѧ~X򗿔pαcT:2fɒ%K,Yz[=X; ^yZs^_7}-_ݎۙ_z3w;2_nﶞc{Gu^ipb;u78Oܳnlq . #QEG6ؘ@BuifQo`'%sʌ$r3=w}~g޹R=P|H@<»O>'|\I='8gs#Z0?p0{M |~ɓ''ś7o&vg0p s6@`0"d&kbKVxOOOV zd VC D#TFF@.3jv`pq8rĠ9Zmx\%+^$֊:Khu#h ڝPs;" Fͱp9ڪhdx衇x??m4f9 ,cǎ<^n!$J"vA &P"K UYyJTJNojNT*ZS`1)/hrr=0|Fi^v}=0{{ #!κH$ںgϞta L;_뮻juOOB&:XLrtp8pB`%Y;X F+D|P(Ζ+2Z $2X**յ\P_b0E5`4C&f 6Gp( D#Ѩ茵wtuCwƫtiiߞmݖKٲeˤI ~=>}Dee _|8E.`0}ݐ /Y`%b$5jԨQu`ճ \%T(z\*TTQUYZQdWՔUUT=Ԫ|mdh:jz>_jjikmwktڔ,np:)3a9rhWDFFFFFF.9,d6*XXT\Z$RLDB> gJ` s w~tiv(2D 5:sf8lvq-HK3fުjRB US[SQYQU]Qn=[][Snj`yzNŨaֲN;{"h{ڶOTY` =\E9G %RBQJ2o)P TwNaK2L.+Z,5jZT:-^(jR!Sȁ똌Q[\^~BmlJRFE E4KќyqdI#K׿//?ΝSMA(7[Z[Կ"DFFFFFFF=XuP(;:bXOo㎶tvuut`tt{|^b-0.jj^(R?CdË ǵhk>7|nxx/LS_zktmQF5jWNdZZfvbmjuu=P$ f Uskaӛf{\ErgC`0+A0X["ஆ`}YVQfh4y>/ z`!######_[=֖( 6+spzBKKsKlD@k{[9 "ASYjLzRYS؜v"S)(DPaW6a{Kh.oz޴%k37<, !4':ɓO&F9ѣG\n|@Ax+ыJɤ๏Y;X555?֭[:̘1u}R+ `!N&쐑KN,pW^j-&I=2YݡPvL+_??ݾ=gC`.0XNέgx lŮ 3guMwv0%%%$&iΝPӧO99s&!<31mڴH$Z*[3FOhdpf=Dnn.ԩS$x2߾}$PY򈏤=́Tp dή]F8湏W@{#ק-ZGœlJ^ YhE7722222):XRCe@vy\bmhommi:cC,i% o;wnFǚ;s?@ 8x#e|)|!_h :H,Bs0I$"ja2tKJ$3w\~?Fo B8j˖-!+` !/p|%K \w҂jZN Q9s֯_Ӣٳ;Z3-^x+ؽ{ܹs;XL&x `A p@8jK."5kֆ `]("#(oѢEht*1 px5'&@իW g l $'5w(>)\.$&vQFuStx3E|#@\2uho#` 9|YLe 3]mmι>RF'I:XT7 TUEU1ln&6K6KdFVׇ)D a ު ުܢjU..@ @i<_7ILG247ۿg7v}kl=?~}F/ jZ. KpSƎAN]4-S5߬|WҸI txWEFFFFFFF'`?ӫ-a3\0[tQ(]Ҝ!f[ʶ U$U;p#]LiCޚ!kh΀ő Q8C3 nS Kd05 SF2]]]Pu^&T}t+ @ 5d,0X,ŲJszm˙҅4q8MI5)Vjھ8+[3-i ʁHS*=>2$tI8]N!8 nlO:x83aK^nD^.y>1 fffN:gYzu H.xw}7 roooZZIRoO2巿mnnྑ/hE%Nb:4/MO]Xid4y 5.)JKKӈD2 Qj} CqSEuyt^SZy<,W:әpXaѳ4`^;X9ov0L8rx:nDwy' Ꞟ0X65g!u@FFFFFFNd:ՍzWۓi@06K"B`:)⨸J;U4k֪za+3h'+$";ǬÍ7޸iӦ~:o<[[[̙sT|',a 0[w<㎽{ǎ@g7߼qF"5Ճo&zElvz衇~򓟌85k]{{C\.!OFFr)rχӁn&IA@ Z233~ɯèQF5d:E)_ZnJL&Ky,?HfQ!oAp`ܦ4LW:ya9kiVkUiN#ܘvVVtF'Iv(((,iP(Ns̙`>H&t[ofO裏nnZ d$o -o$v[?bFyaȰ|r( 1x fZuA~33.\& ]mb~RRD }e˖?(-- ,4u@FFFFFF$N=jVlI!tCMcF-~x3 ^S|/&ǀ߅\LWÙQȨS MfT6fTZ. 35M8k(R]F:@yC{cI$qP(LϚ5駟&zD~*??ϒJ:Ï~#Jr؃U#@rwgJjj Fj6PJ݃ eKU((?P({ O|oO #Wpqqw =㮃u6O|޽{`}[ gɟ|Iqq-[L؃p s62@ 0 ">Dѐ8+BRYqϞ=͛IQי EP(c_y'xO.CӁ`ZJrƬ5jԨQF=N`\>_$*$LjPų5j ȥN焗jq\B0KzX+,QtR3jwBHsWs+v77hFwƮ? O6 b^īFw~??>:x,*,,$V`mdd;=I+W,;Ggy睋/]-)洺F3?$+u@FFFFFF$Nkzx|@( JQJZ7BVPd RcjB4p \^IY> #m tvwR/;{zA~]ݽ}F)Jv ####+++ٳ\HIIEGo`2w߈0{K̜J&ĞPE;)S:y…t+Ɋ#%3<.o|x]8䦛nli s̹;`X,hҤIFqt5k֐2^͚5 2nmm%9u@FFFFFF$NbX .' BLv \0MUu5Lg%RT! ̆Z/*4ͭ8)r7,6k9CH%FnwGg 48,g~iqSI|-[@LF^^)WP_L\Ԃ m2.%Ht҇~ރ5ފI`/\r%L`* ŻYr ws! OȿuVR=Cs7x {==u"#####_C`0XvybD&//JEEeE=^* "'UTUV1Uu5eU%er+*_8`uۭ.i5-ZsðmZZaD[Z.efxF;::g$a.6m.WP'-OJ~bT8޵ Ðnw]u@FFFFFFN,&`2X l|P,,*.-N EBLZ^Q& "|!EՌZVŅ;?:dzTfɍRA" hX6isF3jnmoh5`!O fpQPhڵ&MzU`TTVTUWc5rOVԳuXl`1jg+*8#1;D|!`AiWQHrTiRhj ` G#jz,䉰Bu~G^ U!#####_OLuD H2L.+Z,5jZT:-^(jR!Sȁ똌Q[\^~Bm?Ea97V$uF5jԨQ_U:Ez4e{[k[+,X=`юX2^Nljn°:lzlokU|2XL~7k{K/:;;* &O!р,ddddddkڃ50C.DῶVYΘ cZZ[` Z"-H( jVcҋ2b55sa4QXn v cE%qy|^(R@ 5,L 9L٬֖XGyCP _n-&_K[ @8 6iz\*Q9">][hpr|GAyk6?8\{{{aq,z~R,ddddddkSz}>U>dt8nq;.k4lvnZd*e2H9,;l2w) ޥM֛|-}}}Cm%gKZj:lNS"\{mݺݾ}P(DtuWC ;oDQF):XrjVpG"d :c&) 7fY,Xw'L֖h[K]pϯw/c^eLqkK?uwuW2ZLdk>쳗tTvv6/**TʯF?D/SR*H8 "!xctuuut4G2?h 4}`4S<7|[sBﰃ0ssj R`UWTWj[.dSk}}}IA;*5Z3g|$WeD ?Rws԰nWOOw3 7DB>TZ_~y9jbx|yKc677 قW*4 v݀wWMSXJw iǏ/((bb`nng777X#G/?S7G`8yd^^^---رc#=ѣL에u+++!N"fօN>`l6:@ x#HY]] #\UU;h4|>fZ$M|9BB2ck $ xg`%}"I>g|W ?5|~j 1@g V( xqٜvFRcB< .\~=,M?qLEW^ /GB 2^yC_ӌ*$9s6l.ė6m|$ke5cmqƌMMMɁTvzwA7QxOI&@  z0,pW^j-&I=2YݡPvL+_??ݾ=gC`.0XNέgx lŮ 3gu `W'Tfb,` }4//9t̙3!}8܏>MnR|#ٳd,]4;;4s)?xK/֝>}ӧI闐'q<)HOC"sH$>s}qH|Z, LC\p2\piV/..&!'2~']d Yhĥ/PF5:EK&y v{.`2X-mXg,s(9[DAs ڝ;s?@ 8x#e|)|!_h :H,R wfD(h4[&. ^vr~ܹsJX G-^xCot8)StT$N6bx %iKi!Ødm۶Yf(Ȅ5U8ؚ#q̟?(pykkkO'7Oj"D&"qyHK &Ua)dmr菶D,ZjS /&9tG}ٱ=Ů8\IDbD*ʕrF% bpGKC. AzOx xP('޽"nT*?''駟޴i_nÃ;Rt?cy<^9Nbdi0 ;)s܃ nCz~P={qbAAEN$O.}oZlو&zOd,22222q@(p0\nC 6]XXPXTH ӧO BtN< ϟ̬g:~luyymeyMeiES/JBTjTBHk :QOJX,pGt:ljx/I ' OEt c9jkkv>ߝ qMu+o(O3^DHKq\_ꫯ>|xڴi$rYVkbY8'V5S~"d<؃`(dw8n[ WU-/+-?[VYwJ,4ڬd-솊%%%-r}eF!s'aXcv򺺺Hy6iT0NE@yH5k֐ U+W|ׇr O\} = jƍtmaܹ䣁f2F#\)SqpK/D>ڒC?~N`W 9!1XɎXhD1F5j)uϷڬ0lv,˩i͍fb,\4ZaYkk>䓜9[ضm[vvǟ~\mBH"b6#S*RTi0itNCkFD*N+BoLcd}7Zp3a3m;w#<$''_j3g|Gy晃VnT呴֭1cz\rg'Djp\p) 3p0"h`\{9..!sk;7QUS~"d<%_-,`4Zf9Fm4vl (drdig7=q葽{?'? y$rT) RAW0_(w֪q n供3F"K.:7uIB1PvP[ ;zx^+X+q#x뒫qa y~Us$jH+1O^}&r.P'8F'~PF5 Pk`lv "/W* BrjjJ J ϔ-)+%BU$"dz@=,K{) o-&,d`@  ( JpNjFyrlR !H,Rk5vy^OjղlQèQZ~,υb@$((g3,&j`(=[j D5̞=["|ۅ R,>.JV4*0UZV KNK"x!Uh IRBlSM]H"ݼe̵׭]v݆uk֭Yl %֮ZfYk: @ ĵTK/_xtbʤzlñ$rBwz0|^XFKYEZ\PKJo9lشq-n9Vmڲi썛6op4X@ -0X<>j_Uj |X+HP X$|>t].3M%gKJu~Q?lWU>C;rv۰|`VrcF۰nkׯ=t;X@ 12Xh(.-&bWŝ0hHp`ͪ7ZrZn-pڬB qm!mxx~1Zsy\\T+ wTkJL,ew؉x=EP#|.a|GR Ƌ`!{mXlkf̬NԨQF5G` BT,IE20L!+0Ij@$ʥnA=`2 ee "vb$ K}a<;gGE֯%Z:sx:T @ )p8"!"|x|P|eCCŁql6EQPbAYYYg KR .@ 7G ?)z$?d@ H 5jԨQF{@  jzQF5jׇ@ ƅ=XW@ q,ddddddd+B 2222222&@ v0ъ5jԨQF7BFFFFFFFկkԨQF5jPc  3B5jԨQ;XWqjԨQFBFFFFFFFœW|1v0c  ?n̙3gxj2ߐV0ʚ:u>zjxxwRٳWXQVV77-- <ַ~%9S,[׃q 1c~&}ج!ıp›o[{__m`~('9QF5j)"7xcmmm${}꫉s@<129~8ؠ@ 83qb,!cf3>WXqm s`"#####_,oKwuu߻oSvZ&R Voܼysb|޽#&,Xw'|r81Uub0Xs̡`Ho;صkC=;tM0{aXtp~s΅a!PHPg7|svv61Xd0vPsFF?HSo~sC/BSSħO3!Tx|>߷F5jץZ:Xyy[7oyfS0 OrkRPP0ޜe˖zEl6xG}'zW9NX#}{?ɁȒ%K~1LݾpBp6fLz/J%9s&gz7AԀz7;Xpɓ\.d1cƽK!Jzf͚^08/ժh~8d8n`>;$!}52 jwL?wddddd뒯=X}eXuu2,''?~o{/ɱ9'L4&!ރo@`֬YCt4lcYbI"Ԉw /.uxgtM[nwoNfD"H F>v֬YO?4ѽgΜYrܹs}Y2S.` zTs! 8@ojZ#`>CbԾOzogV"X,(|>`jՔG۱c81sطo_b]eee /k޻;/, J}Wx yɓ'`lB\<:̡EH׬VGCRٳ"n8'|nҤI#+1i5jԨQ`'  % q,yˆxWW X,`p]~8'͛!y  ^xaڴi'8 9~.W-/98G3ŋnllLN";Xf;HiӦh4 6H*jpxpH|۶m`/W\Iw"Ȯ]^/Y6O=XlPI'@*J$q!/ Ç_xy4eB&.c޽`wȗٳgu]:OVY!`%Z'O馛֮];`ܹwq`ܼy3x4|{Yź+N !P{ws36Px`??͙3 NJ򀋂v;\$@\Y`şIP$bk [јe.[-npb|>x^O\L&BPh4`T*+3g7gϞOi~;ي~m:u~7qx , `|痿֭[o;XC}f"?ˣ! ýޛ EKxwҥ?0> -V+Cc8'`>)|Vr zB%N򀌌|e9Yk(,I[`Z՞cJׯ8mÖ'`0X,;]$fZ-.h6Ap~39200@jM ocpovU\.q0+р81kH~<8T`D@1#9 @ ĸ8Ǻ{âl龵skEأs)3o'N*,,,)))//6 @ wJTj4D_e; ]h"#######O` R[P|N-N2pGu&>`2M0]D"T J ^tz<psssSSL(X|9liX@ X&>$eLNL>j?-hZu>t5uUUU,傯LUccp݉lb{|j=DNddddddd䫊^<&%s[,<ѿ^!6mW$`JeKx@ KE=XC!Du `Rht 5:V1Yln^`]]]}}="@3LpW0 `$ 7sj ?k3͙3===cvDc sҩ.;3gΌ`qotׯ_zE5jԨ:Xfmx`v7yݱXG+5 #Hgg'yhS&鞖\.`0Ir"X ^e7oޜ9s5f#N|◈`&PʘG@ +`}}fcAn___uzf v^5D6iý*''iOz~NSnٲeժUO=CC)Sdgg[?1w͛7/_ݻ|۷xG'#Oܹ333STt _I'Niի_xb,u6+o6hT9wӦM۶m3_NbfΜ#<. $)~̂KB-Xsꫯ/}Dce\"._{5XẉF_(@ /`jӟ$vYŃO=8t188TCCCMTUUZ, aee+/裛`ҜYZZJ^I[oWWI!!M8$_FQ-rMĞ={h3tM6 _O&CK `ӧh8@7p/Ͻ-Ze8:x 9r7Moo Wa:a2+F"搜8˻D`~ͩj <,utt$ϠRGLD8jqpG͝;P(oKU,Q/^|᤻ !_?^y R:Hr-##w8KsrrX%5LIIIC 2 L' X<%ozUbxy];3@1XJfOބ폼+tǏ"=z4(SFo0~x>}0c'*2X@V uqq1{O&&=z65.'YQQ-[͙ᙗ'^xPp36oތ[]yy)Syy^}QOOoŊUR]v7XX 8\/[L:Odd$3Xhزe ƽy&4X3?={suֱ;}4\EB`pɓjǎY~*F;$0U:::g!%+XMLLЮ);%U%5JKKkРAvvv2 U|Jbz2מy"3{Ā [Ǝޠ 9ayIෆ a\!O"))o߾Fii$e.q[T%:n)r龏Tޱx{YYswl_Ž!Bbv;`K~*yvz'ܼyS=log1yD鵰-E 3?iҤI&-Y}J_D wFF'O`sss ؙF$&&&&&&&~, ///_/ܽ{) @ 4 ʕ+pWL?~&s&M4iҤII۷o!///%%E @ Vh*їsrrbccæ$&&&&&&&~ݹIJة{ݹsw޽~eC~@ C*X܊W I&M4iҤELLLLLLLܤ3X@ iP`&M4iҤI7 1111111q33X5iҤI&M4&j`73z3 &&&&&&&~Ø*XT"&&&&&&&nfnUL @hVP;^&M4iҤIn 1111111q33}*Xt4iҤI&M5U_b M4iҤI&D<Vte];IuueWwқetbbbbbbb/`5\cΖyd2;Wՙ %o3@ 1hj n _\zwյT>}vُ~Ng?e=}~CM`U=>=$Д9(nzUNe93~Nw56Ok,kլ+YTZnpYC.<_K &`Ur<_8~1~ZcS/5]_35wN-][٬ľ|---׮]kggW\\f،#sg?11}Pך}55kj"kjW-YZT(/8ܓ #KF](q]Vp5}}޽{tt %l8;[YY͝;itXpoݮ]?BMM>0`ۦMh///tӧ ĠA{=޽{ XyΝ;=2޽{gdd ͜9 [n F!***׏MLb4&lmm=lذVZ0552-Fqec2'bJZKokߺ&!M4iҤX wqEUao[3^pୟ<%|K?-yQz~һlQjGOݛ~ԃEJGw%:E,60 E-[cǎ0999p9ZZZ>x":lSX!oA`PÝ?oN::wBhꫯHF #!ML,LO?pk׮4Μ9ނYYY)))ݻwd%F9j,eq5@ lj/N.xxɩb<.ۑpo\YI=}b֩;3`bO2>Ŋip3-h`iё\rәСCh;h616O61Eb`1 3}},<;y)61FMk5?C[riҤI&rt*X++N1!ڐÎ^z#W/_>DS˦ĕN61x1rGe Ky-NQw m3X Enn.n2ߍǻ_|E;v=%+rxe>w=]j̙3̗ćP01qHT';/mmm٧xfffYYY%ob2+Xo@  4 ;/Uv?`ިC :T8pѐCECQ}L};]<~X3ZO͖ܺu 7{{wkR,'~0.wޝ7o`WbtL ֭1 [lb)))Ĥ(qKn޽_3f̸u?}:>Ea>Ď=OZ,KJJ:Z2#ҤI&Mo`=?\0|=L'B 97Ա ru@ ՠ!CY! ;?}\Fknu\g{G}_Xd2?lxbN62 ܹs+`tS JKKGZ Iarrrڷo z+XբdzLܳgOX%^m۶h7񁈈Bġ8vF k`ML޷:@ `o <>tzg.<\4)8'6l6yaϾ#?AUݏ>pP{4uQ0z_thCwST;մE­nݾ(,khiYc3)|!-A[eeePXXXqZV:=rWDW#jzձ=e}P*\+D_C^(2Xg,[G c8DXEh[e$V"AYe_hwyMGvvt k+>9 U7~ϸ #[T;csPr`iklXd-ݾctcD2\s^d@ nhS4=a"Wa(`+P uCZvGt,¿vv6שٝʹvln; Ӵjlw`ذ; pCa=5Y7XI4iҤI&rRݻC -w [ 9l}pA-BcڶGU\{_k?l緘4hlsQ_ogbF`pQ]ݡ2r-B@ Z%4]ܻ+D}w,P_~o{rд8:-J8 ?/SsZx_0ti,0ܧվUEk~aH]!0X*9jg!knI&M4i-S+UO,f,0ܣ&>V65D:5[~ -'%_?`UҽkVy.}]L|0Xئz=aC:-5[ s/VS@ z`1uEyZ˞9[uOpeDOIw뷲l|:̼}N`MEGGĝs}&Bg K TS.wwMAus VD##]kbbr ꯘ'?_O<)&M4i-A+U:jnn⫺[}eН󢍽Tw"{{zN),TQiNVyX41,S?7lub7mjEK`}P*\,@CJ :" ` ..YR)FIIIqqAD+ @xS;SS*ƞ0X=.{ /صGVN_q9yvE_~y>ѧu%$$wK$6JAK$e.@ g1` 4 P7U3MmEWKǍɫWJ;11111qe*Xaf&ު_=Tw}vlo>ԅX0XԷ:hoo66ZAwhhlRv+l(`ݽ{"88Ibvۛ5ۏ5v8 ʠO>E$[ZZՔK@رcIdnT $5REvR5te଺¼>EUΝ3XsD,,'+<`muR3pmh?zfFV{,UZB; G߽{&%%|Mtd4>xn0|̙L_v o?^zD\dɒ˗?y2+X2朝-޳q,~]o>q}*3X }fF1-OR|ET"&&&&~c VuN t>vVAIM$^;U,v vx,iVGz `Υ雎lqThwkm-v0X}s}yaƌ =O2[f+**VXQ-UW:z(VpaTTT-[&}[l ˬ`ɛ^$ħ'o3g\~=laE0^رcǜ9sXz+Xv `$6Z$@ )`quUJRUU%=~ULTT̓ԸG9z-1|^MY~՞ ]48nqR쨺>֓-psyZ])\}.XUogiӦ銰m۶'Oųgφ-E?>)YbhܺuΝ;ٙ-yQFiii 4^f |evzOJJ <KeggWЇB 'O`?o߾To iذapN3lړX[nMW$ '@,bbbb7[A*97ܧwM}6WjT7hlhș ٫E֪ZlXetii)닷Р<ҚՐt-&þ?^b5bR}ACׅH/ᮘ൒9k`5oD4iҤI(dKrݲ|gMZƮmw&B1cD{ocFf~}V]m/4ģ1111111/` ѵuKK 593wf9s焝<'YxO;co\A [x8~ؠ%7rUc@4iҤI&t#+XYV :_c}6myׅˍ[[f)tRcv6Z^c|}KT]MVR튘 VM;CcQ3}6~gCv8cL(I#<{hOLtsG-aTzĕaǷ5yW#gvZr4?3I7SrUZ.7#7 S*)캮cn tǚ0⫵ی?u`&,_>ckTsL|ҨqI&M4iҤ[n >|&n{c09GT=j+X'Ŭu_/2tG;z." {C@LLLLLLLܲ`UUW9Gup{TuFzUljumvyջTWZ]j{Փ M`>*ئ-N*ΪU6Pb1{ȁ4ޥo-hFwy@LLLLLLL܌ V5{hkv~KXb3bx /rb exo¸R_Z'OO)LeT"]Xo7ELLLLLLLL,\&M4iҤI&DM,bbbbbbbfgH&M4iҤI7QS,@ B*Xt4iҤI&Mu+W7҈ȧh EAAAAAAAA E3, f2Xd((((((((9`QPPPPPPP4sh EAAAAAAAA/0Xycm;ma6>=64E}+_- `NL.._~C_]Z6?$}+|i=_FSPPPPPP} zEsL$f_׹]jxj{fmbV>453˚=FAAAAAAђy !Ѽ{bZj\L̡C58޼8:0|)lP|n# V9_~cպMMΪm+QPPPPPPh5.ٳg?ްQ0lL?3~#4YN?7'uk5vn_[S~3 zH o}2v^/z?6Z !#-*/ԂLAAAAAAђ@qZ-BHB_;{~z_ou+eDa&-5c._:tz&B=4u;N_)"ÏOf1>W$Q=`|vjϿj)mQK>Wߨ|9X|/5喠!rfv۾~O.'>?1~mlqٺ$27}H&M4i ,kWn~_ZPZp79{n?f)bt= 0U1Nϻ[}P8F=, qIc1sA"FFr83t3j|vn.@;~[i 将K̳{~}[Af M5XsǛ8&(sтM$W[uZ?İpZ=cf;G/VjqGtсf*>IYψ0sZ-c^{otꂗߚn,~2.DS`N` \c!?vnɍj`>:moj5"㲎,с-LUl:X-`qkOc'Y.гe8+,}:w[RI9ÜQAz|fW:Ľ"M4iҤIotS+X*>WQZg)'3 &}*IM{_xxˇQ"%2X=c?[U` V/wYkg`J~i/VĶ}-:lOj'%/3k k.{dՠ%i5OسU6'Ĩ\x[֭dƅg `wT}cg_tw=d+t}[S_l\~cۼ.;S>nYwCx뻽;N_/t)>j`Χ_t92v <{$2gsv:-&M4iҤM`lu ֔ ҁ n|ϝ>!0gM6;NDغ 5۴%0=샿 ]4D51WCgid|!ιݓ=ACtC@ux4fء.֑?2%VNsadVdhQ{?wgKomSӧUϟW=Qv<},{/l찳9Hp/^n J-(=Jru5HْΣzhD^xG-YLϾ yP@ļ>'7 `v;}Fx(&1111111qӹ,us YX-T:PPPPPPPPh`+;RN8TڴZ3d3X!"UWl1©3Uuyzlfm{Q} 5 SD[  t}ImU` E6UL#\fU`9  2] )P0ʋ/8+M{_0)] lrmp~)}4_11111nՀṽ]YɟiP =6r$fzrEaSDU !G^>.p;Wf2+XB 9n0.2W0m8.Q zX J8m!Ait Wύr\]Yk.Yj Xgyss#=QwJohĞHp}{l$]+o㇭\mi$ZWFbbbb7$|Uf,;{2?}| [rrr? @Φ$KV)xWaꩩU @/Ov/ Nz+X,X;p8Hch谬Q`WDud{5dr3=(?䯚` D.5`+96OϹeW"YEPS`s@n6 Ny m$&&&&~c!,XЬn>j.@aĭh(stE+Xܩ)ciiignjp`{)nnp]b&oο٥C;u pV.*Xį  Z}[#9`M;cnUeutcIv?lwW:ՠ94] S")/pj} D6 ,ɘ[%i^ʬEd8!]qKc(XmRl {ޕĜC3_)5`oWSdUzW~H&M4i,a9jz%t/Y}>k̓%¥kww~fwջky%µ=]O"OkW ⹳n{Å>+UJ?3^C2Q L[Zd3[HLLLLLJ,AC=ZDnrjA.&ض3.OӴݭWKA''SqD5~?"?CػppP47q 1bP vq wdpu T4iҤIn8N+׃OLyq/ s^S%&&&&&&&nܘ3X2tx3XO*CTrE/Sꡙa,ҤI&M4閭es+=:-*^4²RELLLLLLw&y*;?6[#VG%?iҤI&M룛+xU}wZ#~g0Xn ]V}g{D=(},HAAAAAAAf`(P➼}C8GbbbbbbbWTbǾ0HAAAAAAAwf`3n UEAAAAAAAQk"M4iҤI&tM, fV-&M4iҤI*Xd((((((((9Z]%@ 4+Z=}YH&M4iҤI7]zF @hV"@hf"@hf"@hf"@hf"@hfz94iҤI&Mt5U@ ^/V]]]YY'"@?Cj6Z%M4iҤIV^+U{nQQQAAA^^^_r{)37@ 3X())IKKKNN>?1kמ>}x-`ݾ}v~~~>ȑ#qqq ggg61k bcc[`ڿhb@ r(:UUUu/ quuήqㆾ~޽ ~ׯ}D蔔sN8}nmoo ŋ]`);wߟ ٶmE0[ J\ppphժU^^x3:wઇ"4nDUUU5553 ?g/ơ)#%C,8$xÇX` }Yfsڴi:usk֭ĉٻz葼 ͋ZO?[8|p]Lt}Q:3%2+ߗwٱc߂?lw^ `o9s|ɓ'?{T/c$2+ &&&&&~YQ sզJ <~ ϱm6ƽ{Λ7i+W9O6k֬w}uְ 'ODҦM>}9f*8GGǢ"6… ~v߿3c #O޽Y{Tq/b׮]WA)Stޝu!?ϟ?3o6**ӧOիW+xzrK0"v;O0BzbX ,hjj@ TorKСC< ;}ң`3g(`]|@y}`:v3ޅWꫯ'`l*++:t@V rrrUpi/_̴̝:u:~8.6lX׮]Y{۶m x>/V922IIIaW;VWWzҥ0ŋfև?&O`1юᴵYD 2nܸg/WkŊ~hh(2cpZpìx*2mݺuX#̽;11111qKVbp67aaa y߾}0uA Wp-{{{%l>}4_9O܌1%y}GL# 4?c;wpЬ͛fkkNR7nhӦ v_x6~n̈ܰaeeeigg3%oN@o.A*KTZZO bpl!@||I&M4U?~ zG111YYY'OC ~Ņ,hYpss[0UDN=IpÆA@ y%oÊ#-?ȈJ??իWϚ5kȐ!|D  /A`ḤK.=Do2..'%%IgP\)/3{wڵT;vvݻ91c`} nmuI\Tرp&L gW)S*,,D Y11111|&$$$R&pf${qV]CnPPХK\2srr0ca &y  "d7xܩS'++`.QIU090___֓'''K9ވHS^fŋ.L,Դi sN Ǐׯ|I '},ybSؕg3@ Tor1)#Gn#555>> :000HدPs]vIn޼ FZ4~lDXzE2rȾ}2-]bX:"kggXk| D;l0ɒTb>n`Dltǎo <Ϛ5M6B hݺ5vӥK~i=GZ///~۷v '=,OUQQU|Ux  \΁D8'n̰ ߸qwhpFFL_ß!\lʉ'Μ9O$0jX0j.//n * yFEEjc&ݻn>g ;ƍ![n|kǎfž4dXl#';S5eXdCCC6'~pآy}gi &Mڵ+V[j-~K|_"3.DfI[cس/#s۶mao'6|616[^<{%gk̘1ܹs, ;iҤI&bu,f 7EHLL[C `yzz`BCCu`焛wjj* Lɓȃ[ku ѓ,Xo 矷fˋW^ F`i!,}xU{V^<4h6ˀ5 `7ء.KfoΝ;idVdf"v֯_Ϸ`??'k=nѢE*YR..6ŋ}` {-aor"""ߟqʕrgD#CWҥԃ2KG IܒH6nضm[x"&&&&&KlN11111W`0XRk/]0p#B*g {xxegg޹shb*--åϱApeee2z*X70IpH`SNݼypB0[h1:{ɓ';f/ Dggg$ȸ|2bII ,+;#w3""֊ PbE߰o$6eeeݾ}~Ν;0Fwޅap8OX1bOD2\{td`0;;} 1$$`Ǐ`"&&&&&&&V`]`9::\t= 6˙)))ʞ>( +XHžԐ7v\~մR2,`"&&&&&&&V {-aaE`\PPq .DFF]of4.D¢SN988XYY9990+vqqq,y$M4iҤInQ  RPBD:|0 Vnnnvv6۷YV5[:gΜ9rHyyyFTRtFr`^\,f_;'!؃dy)vd%Bz`$$$(SYYA.\+SN1mjj%XXXcn {Ҹ;KLLLLz  nH,a~ GИtylhhODDD>}ߟ%xqsׯ_g}.?== }|| Sb- ^B9_u%Tw&ގ-ٳgoݺņf-2WЇy&Ј sΜ9Csbb"ˀ}۳ >4K V*odU(%jl]甾o/`1kܶq+4A`W!111쐻y> lPhѢ͛7ftĉcƌٹs'OpAM6ADN25557n8m4eqIyz4`~LMMqvrr2?Y"!?Vw1uFB%@CTׯS\kٲe˚5k*v64<Z"##%V;c חcllbŊCFB gdd _mƍ~ `ffڵk…#F9͔G'h9|0Vc~hWvZ9W{"Pv$}I&M TopwyV7f'W䝈g 7\kGc2Ukkk8$g9@pOUpuueMnnn,y`֎;0XC<}2 И^;v pSNa%KXBz>.\RR %SKhBr$U RRR4huƍ`I-pɬY>_"oh,=ʯBĔHZ@ mQO+::.e<)._F7GGG푐*+ț!c 8浵+XǏGxxNv?.//g-RP8pm'O\|ɓ'l<,T4s>Xt;挗III VWhaak̳ zc|6+`ITIW~Dɿ@Xĵ[;&%!x&[[[i2A >=LK ...W5b,Va'x%7X^2,dCb톆2NHH^ʬ`)_!dVd`Cvv6 ˬ .}U$&&>U`7uEؾ};+P=9 ` _`>97TG{+U~2'_Mz `"*}㫘˗/&APQқth* E " U( Y{]TLvn?yg|sgΝ{}λRXXޙ&ELe5ØaLnIiMՅl0')%--- ;:Vtqq4f7ELFLtWZwD ?4>o,bf.:wm|ɓV PLHH@z}eeek!_R2AQ|z]]$M~~~QQQgQYY)1Cqq1ZM\_ lmmھfQRSSwgno?R*(((,,tPM!LyygLUlp3䯞X?ƾyڵk=E`͟L >I߱0iҡO ~ЅE+**[x`a4774(+..l0ߘUB ~Ѕmf ,9 `x; Xxw}3ΚAAAAAAARmT]JTi\ksژhCM窐 kh$“"jv"<9 np难 h|^j1{Uŝ }AAAAAAARUk`` 47ؽfU7i_Vۯ.ER_L[c1WeG![ibG ؽyX:PN@}RQ;$p0!-]1۵qa+,,l1~p'OD>==zjf0)) PoN4arr2z‚1O/YU*JE՘n^qc=֕&eٓ<ڧ%9+3?;z0@V@k=w][l=Lon9+xRQ]&?j>܁ZAQRq;uX\Uxn g8-wX,rfBXp LHHXpyKKKggӂ BCC1X<\B~˖-k֬G?z WUUe``(--E\q5{lEEĝTyyyh$6y~~~(~㏽=g?TB{{˲06ظb/*sv: N+9Ӗܛ5=;0f8;r(+x0ͷ?rg٧>{v_p^[;|l5@ IU Hl:'/((j7zѻ̰Naaa8+V':]@.''w}gbb%z 4߸q#M,]]]֭knnnjj4y`>}GxE  JqK8|쾕ZOoVp}(#}aoVWIŒ6}Z3v:uK7fY)fva- *ϖۖq:ex7èGtq?iK`ծ󭑶.8V豭cD *z+dz_R7س}u7vMoOa›v*/5ݴb'*K X;[z~Ӯ6l]ؙ`7,_zvгiPG7Qs|g̹[gc[Bn_ϸ~!F XhpWQbuan'pVtoL[Ғ6_0-w^7A;Qu[֠C]G#,P=s;ҢƁz?k{ڃŞ}C =**dI!OY9P_ eU 0x5ѫoSc^} m{id: ޑy~O3}%n&9޼{2INK}m:Cu늴쎲9gO }/w답#<kvJa[<7_a3:S'W\vm1_gffeS?X>?<'9ID7ƶ/l_]omSUQ͸0g'&:ORIU |IY|-c@m>O5ZBӭ@˩3 @DEE DDDTVV<,.._ݻw?ٌDі3.13Wf=XF,46oXɴLqav*( &;PrTsŞn#[B2sw-/)- :X7F}M .?c߁4Z_>(((((Wi+XVh0,ʼ\eRY:*ƥ藞RKp2̵;-*/aaeDžO? uj&<7VdlEXE֫:Ȼs5Խ.IyS»/irHop,^byMQTxNND|||Tddd[[[JJիW5dCCC---*zF=~~~MC.t"TJAٳhB4a@@ӧOɝh|KK dddÉ0TSo ADəkpȇhWhhhSSɓ'3((LJJA>>OOOԏR3gP @Y 8v2(aL3,,G@H{6.G EpF^. Wu:| Tj۶m[Ca܏Ή'8͛7^!.ԯ۷o :uLRR˗M.gccAeeeeEEE }+O\T6Px^[^SbHN'RꏍEǘ'Ǐ1'JʉsVWWNLMXsѻ;zSGW߱czl=X-׀$O52evkSэÊI]766b0!`N{{{(`---<444LكCl0֏ ۷Q"_"b`4z\ 'NE{郧H _D2@RPiju[eWSoXe羺G3ԮR7.߽>(eXy֫hgVw8f]|J(=8ieXS1W5?k+}4MqhDĘcY(QYQ1c"O⹦['aJ^ÃyrJIIAc;[8:>#CN!9`P:{չs԰5i=/=q l"ڤ~L+99 XNq9u+X#!ag^W{xmGC]:-;#O ߻BgQyS17:Wh#k'D6I[l<)j?=|R$xʰ~C޷3IM^^^tyrBh*M,.`aoi&,XݎLii)$o/))#L>8x5ˑg@pss;Pp_[[ XϟVg$'?'DK-CG_M-PߥxLqsm'8(r-u7kL:Ex:VnӍUZoZ ^}tU^HRLs׵:k^aqtZx,iE tgO XCC055ݳg֏+*6k۶m䀥PKK.<ܹ#,,{Ah%hZޯ75`rIѣȠi=M?]ÇRvv67`;фh^^^pQ`#'> Xux<>x:^᠗f?),wXV/ZFɸ?`(H:Ji"뮛7l|R@۾“ђ79Ƿ^zɳRbppo`P.4D:>iFk̴ XRĘ.ʰ\pP=)tt Ԁŋ[W+4yxii2: 0t"ROOOGA`;]NNMg3դu1IIItGtw=1`=}] @Y033@~G+$$F3MgIf? n{5+9^=9C }9 a455MCI}ϛ>GOkMM˗/O3[kƾa6:x%r?5,27WP\"b eC(sլ3[w5튰 9pmwvNj|ny)ӖZj [_沭ˬ>`sѦ/oXVXԔ_03" gYq"o"tLZS/} S>VQQ+a%F%BAA9_B?Vztrrf 1kVQQ.[,.$B(`ۣa7A-!!iwS|{cNVϾ~k{qD$;-l<_Mq>Uּk^Q`:(tT@y+ohh(,,,''gkku,55ƹnB7haa1444= tǚﯹvٵe^Gn7ce] JTZw28ƱZ7y6'5# 6~\'lcG.ů[ZKBDRBI>̳/ƝIؗ63qm4Xi,x֛k{z/1 f4[PS`cere<">9d+<$s *UkVP#>i&J.+̟ڴF; d |0qq !;'GN{2LcՍ֣&~4VSnXjʼ \kq;ķz?=#[fԔer /G*g]u%n)ŞN3.<e}#f e0JPR78l=OZkOѡ2Zt2=˔RKR1,ź*>kJ4|hZq} ڕ!׬Ű. 雙sX6=`/)-}Ζޝj JtTKM6,;Ag°\jŞO?9V1=odvZbk1Wo V1WXDy/ٕ陓3sΠt_\1x¸ո'~B UG~U1r1cyJz+q#:üü[F^)H^%?L/i!hnn. ))yz~3jo*S>j*SOUr{ȚJz稤騄 AhDDXHo_{Wc[CMUn?cҮ,VUWWGKKO?=y{>NAAAAAAAA?O?m(a 2iԸWoIm 5=cfodwz-ԎQw`Xx될 ~n>6n|F b8[uMz٬MSSdbbRQQ` &{tzggt9$_?xg]ABJb2;Ff'j&Q)Uh%JVB|<}\UF b vln4>BGwY[[Ot钁Qڻw/pȟ>}<ё@JKFFFH;wLigg'((^㓒:!++kYY6`bb~7"""ճz,cL?1w%_E ވ7z-aJ F͘čb(W?$G+~~-}j=lr]ҕx;pz-t-k8[?r|яsrBo߾]UUu4󎽴xbggw]vQQQ%$$۶mCI MNlٲԒQQQǽ{SNaΝ;^^^H{{{ojjB`(a(i͇ 5c,Ҡ>00ߖa~aaaAm LhڃV| W*=Jl],ۙ%ژZ[H銻~%K=ƺW3v>F^ TUU>݀EXxɓ'yyԑhd||x߇ )[;V{S㫒PHP*vEyS=Z8מC{Si5)bEDDHXߟ,+XěmmUPPX@bɒ%ׯ_$UonnfLLL_w K[=g;xvutog`n ,,,ˊ]Xg{KGá}j~-o{+y7^36XWCh#3?Cor]pQCއ zs)zϐ3<:'$fQbӧOQ0y 3|)x?[>fG2M߳pZ22 1 unYHg{ߛц7g+Pm[oFoż־J=L+W~ g᷃ o,{7'g!j9}pق 0͐Z;[O>:~ }]v0`_`kZ<-x[ru?5oz ž։պEЌ16|_9OzFB{ ,/gQ_Eo6EO mAo!ǖƪk:r_)O!߉njiJ d/OїEսtu[МaVZuYɞ&fwnߓ}ߝƏ4vKJ%y:LU!}7zw^mnnaXo6>>>PۛO{EY vf-\ОȢhM=;3S, ۑd+hgcR3ٕ4}G'gֿ\ee6g^K) zdQj(zrʶRp=YPz2Q1`eVu8`nKjg`z`GĤ붑qvK*(ZV#ЅG͟dd;e|%=Hz9>d\{rCѪ95jM)-)dXbK/Z0J R0R(J8JtR-w~vA8ŗ "u(W _ry.TʰP}dޤ%ZR,hA-yAs2)(qũF_q-;u'bkkS9r 2S ҉T~jZڨj8x֥g|\)/T:+9WYb>~"%ér.T98p+{eWirHoJ8bjNµ$-hNZДCZ"X\qW{sg/ JkTռsS5ݛ[ZM up7,-/:U1Vy8N=8f:gӉ{ZW#KNjڒqwpMwqr]bBZWwWk+U$6 ɝeee~~~Ψֻw^r%++ WѰȁN^TT&~g&ޞzI5Lԉ^FGG_UU5T3;9`OZ,0GE @^zE>Fn Q VEM;XM'D];X]}#)\9|w+$֫O屟eyfjyEԟ\E+bQ@KWwP"f(`凯>44ɓbPll,//cǐ">tuuك}$,,>|'77<϶mێ?. 6 C=tR111S2nܸyl*tiTwZ͏&?йo8}4#))Y[xVrpͼqCY#5jf j*ו5+z{dTC?u Y,o>hoQjyw ~3kCAU"1]yU(jqU-gQ Q8sLOO#ׯ_:H$((ڊ|vv6z x"޳{n++awssSPP@]-& Gdb|2?'c&Axxxg<"ܛ7obcLMMwkjֽ40k jկ+mG P U"/ i8ƭ8tIRPWl*z+4P0Ƕ; XUxU/YX˿EZtEmmmX'MMMyyy3tXUUE ?w.K?4?޽{;vٳO!_PPTX?ZZZ% d1>"']+>>{k%%%a#<*[WH'3|+fi`? ʝ(Y+R ^2 WePRЮ'+yi9)ywiYWIigQB΋\(85b)jqgH+nmd҆& aYSSuV^^^}Ф*0RN@@okk,--=[丹>X<^+rSǐ7OI0itٳgQPľaKT}_u̴P "'9O)+j49w)PB Y5 gqҺn-w)Z? -ZqEwGg}5fI$f9t`=h1ol7>xK: 2,LX/S&wuDa ]ÿOW(ZI;K9KH^ }/%M ZцDR"ą-g)TU`{Fg^(((((((<ԏT0l*I1WTG .w@MPxUı&uI\̥T\Sf_i|'qAiHBjAӽEKfmW0X yĉ] &w%6.ɸ\FJL5g1KqHhO5'V5mAǃ/8ogőGG&q*rbxwQU )X.΢J^w?/(4$ XɸdRB=)d{μoJ. n4bCNE>ϏFX,ŕ&e]؏N!~u8'6ŋ|~y ʮWNH}zs5 ==MDi3gtŋi"""tt4rppP 믿G˅𷅶kr\A5+:yٕJmSBg4 'WP.kkk>,JE^c5-U`ͯQ^ߺI.n2X `5(c)ydw}cNN|virssz/{رSGEEEQ3 {W;X<_ɦk[jP{wMN0`]]ݫW1{dӕE񠠠^z%&&RM!Y -v t,"""ϟ:v̙H'$$hw~#h`)orowX_l:&C}vq[7[MMձcǴϦhkkk`0o*X_Ӡ=_ױ>Ij#Wip8.pKοACKEejz-U%\34jQmfIJJڰa|.~Ս7~W\~ѣ9tQ]to۶"gϞ=s w>}iZMyLÿSN)gns.\Xnݾ}JKK٣ܟVw߱P޽{%'zRΝ;t,ii4ٟ_d=Q峦!,,UyZ|/-*X:woEKյj`ϟ`0 ? k`Eֶrڅ#95%_}Z}*Gc;wDyM2.##NB9sf̘ABCsycСǏ'lٲ0O4It;JXB}ir .:u@ x"7QfΜITd\X6WHصkǣ$ӧO4h g ʝnݺ*j6mS榱*OK\^"*HRRRT};P{Cejz;uyNj֨=\ZZJwV2%,BaѢEeeete}֮]+jkkw˖-,Nքnw!}y:tm%%%c<''{|dd$b+Vp5w}wܹ5o׬YIZ ]]]?_n ر~Kj %g%G8t,NsrrNևF )Noeqrf+Xp'!!|ҡCT} J,Uתo`dz):ǀ`0]8Zrd?V\\*}LDz>Q|64|ESkE{`-Q=3"dddt,Y4&:%g@5(Ӝ9sOXXذaø̘1Ǐohjt'M8B&XхGaXd>sr]4)Mt8>͡C2M&Dlld}H`qt\KsKU6ٳguc9,? ٨T]+: n lYf)*44444j ,w=%߾a⸢}_ST1ɓ'醪8<<ܞ*3Wb݀`)i_%o7СCR\ۇ'jrřVG\rŊd>Z72X f2ӡsαp׍:uJ9q,9irt^|H${.ד%̝;UZJMM*U u Z!%%%8Wb]|-K:#id ,KS, VϹUy^OlEz6(T]+6ygsWBCCCCC?\"(xT,-״/J=W7JadtYY5U5Prn|uyСgϦ;+y 6P|SL(++3f̄ : 8%5k9"/^Lnfڴil tѣRtܸqg*XVHAQdԨQEqZԩSYI~I*X` `c=<<̙CA4)WBΕi_EjUU *Pյj(;9' `p{&?7*hV%A92WŤʵFw}2%">OSƍ!!!B<Lj#rssvtkvyRNNXU:y$ R͝;@VبPr6d;XQrRgXL(""B{G޼yN[@NNC&|5k ,܏<An,IcߠSuZ;NMkU"ή~HMx#D2=EIʑC㲲KT8ŕLZ_gyZ/\ ,kރ5K=Ru}ïMA=aTWUU"ʕ+s|}}ΝyZm_KOad!M~NLLy~ >|T*daaaŝ`0 kbL㫿Cm8NyW;)O `0UױR~F4d(!`0U8>[٬e[!Jð֊jWw`0vW8ήW~wrs /ylfBEX͈/6dodx `0 wZ~ {ۆEi6Q0 ? +X c+ TaFբه&V?/4444444tOZR檺/*Ǘ/s;]B 8#]S[dov`0 h44444444ꎬ``0 `T`0 ; 5*X`0 ؃@ `0,Fbn u@{`0 ; =XQ`t<^Q``t0`:Ro7 @gCG􌔔W^Ir9ʕ9'99Ԍ􌲲 VmmmzZ䫗ȼY_PZ\\Q^VUY^]UQSUQUQVQVZR| /?+#JĄKiP/.>W744\KIMJHyύ>x؄_/56TWee&^K$OhhhhhhhΦu؄Y7+|TC]MFZ#GXaaY3P#A>Jꪩu!ecnݺЈ[:z˗~|5ʲK I4O.M222z뭷;y=&Bͬu5U qo~gOrQ/{zOy{o"~/?/GQ>|ښ̴ 1~6ٳ'5k֬_^t; x!0ꗟϙ=3j^7{wַg~{߷>q^={޽_:ݺ%曽f͜Sr/5Uf眏@N0صk׻w8e0`@kԨQCIII9r\`ugН_U[[{|LQAa}]Ç?'ŋv/ͮv۫n?#C}sScoa-$Ĥ)Bq}sӻYg-c,2my磢BC?|"ӪUδr:9^ҥѣG!d駟))),lȴj<h2Xx 1d=|={{׺u]G*P"#5 {78ۈA{Eniǎpꫯ9r$==}h8Ok׮NJKKsqqcqfH=sCCCCCCCwfm+RrFZF7?w5^t102YXsr9<\<=]|}|dHPrprw eo$Y -ȫѵ}:5:M®_NkϞ=:pg]z5Լ&MjT׭[]t,;;`;v:|Z 3`gq5܋>ݽ} L-̈́՛*V9-!ngd-RcN?>:E˽ʘ|{K*NOO'{nU}=X… Q///gϞC/^l 믿Gk`0Uw߯+˳_ncCKU^rVTTTrTd.4Qb+vm|i&"Cn^nO ]fmw%o'(Kmݺi\TLL ֖ĩSPllld]k+XRR]Mq_zM}sS5і="X[ᮼiFاt&)rZZ1Jwww)Uz 6p={=vX`}7,7o޼;w46?",..Ύڬ `ߜ5W|D]{ Rd.^^ԼsWrE}e[\B,((, [ڵ{3?=NQvE#G<ӧO/,,,))Yj]vʿ" իץK6=3/_ftuuSRRЈ#w^0**g]h6K 7o&']k8G[gWwwgOLa<|7@r]^ޮ`S!O`>|S;SttU]S[USsOX{ٳgurG ir`^^^O)+lٲːD鐱q||ߔZ3AsScgK֊|y,klFG|^ACCCCCCCwZaVAAIMcZIDb <3Y\#%8R7'GNNރ ѣp="kekh+o̔_$*6[~mOy%qV9**j:`cӚOV6̦  wQsRbRNNQCs隋Ed$"{kG؉9dV6:/?N`ϽW{16з03yLP՜ݕDNȳg:oGܺYg7ر:44ԩS;wtppP?V>-رcwqqٺuk{C]]Mq`0 VbBbfFv㽇}MZ #;VvbK*q83V'IB+Kc}MFܧ+= +KsgC.Jx&HJ廻rX v::_nP0Ą?k1*ƫ=k!m۶] `]vQ<O*يMQ^"̖EGyb}W{kn-L6mfW+RlrT<|g+!?"BuOW.\L6nܸ}B.B:==?=ztݺu6m8넭'''W[lTs 69Q/ʎͻo>իWi^ʜ=|׹lgϞ4ߵk5,--ϟg.)S(((`6h:`07eu,2 Ieo:8x` $J>ɦiUS,KU~c t1g" x,(j2UMM/z22仸\L(..V}H$7oޔ)S첲(~P8wܙ3g qO}Ǐ'lٲ0r&Mj۶m-6m@ 5j֬Y4N/M:uT777xy dY(byR}QNfuJU i:99`dʿtґ#GsRv? %Ijj*ivIϟ.)skS߅ۼy3MAw`o*X.4s<O|[ g"E&g&c$h7PF{Q9;2MAy6< 1ʶwBWW-P(--]XL Xkd23?uV'D;w><}v+Vû\oY|͚5i^TJ6ɽ1,^^^Nqfaˣ>JU"Ch ևR`ܹnjC4Y2^l=tWq'!!|ÇhYYlxkksm~cS:t3`07ey}nnUW?oii!YJˮ=VmvH`'ۼgn8Nx׍+j"Ale!67".VT4ވS6ccc]TT$)XXXdeeǴ4'fK, b://QsFEE ;v5W< @:11┊iݟ[ϖǞ rU".RX>욐Zi EKyJs?gvww'\쌸Z;wn ޠZeXnVbJKόgi y,2Fb=IMKWM57lal$7XRPqHޡZ=]ݕO_1'V\H(((hlF}ÕLF-QJN,U}5裏V6ũ'-D~EEs?ƍsY;ҸZ;wn U# %~>[w*+OGYYjX"f=MR#T I X^j:<5+\)J(w.BiYݍsQկB ʕ+ iiiC,*.yyyfk6XL3ڵk,H6UZaDrr2ųXs<-屭H˻\%Rݸqa^ŹÖܿٳzxx|g{%.T;wM;k {c ++ZгLd%/e#KY ܚ*XF͍ ,3tH$ZɛPRV27ZZH0Xؘ࣊DT4pСgϦݻw6l@ÇO2B1cL0U%IUȑ#!(NO&_BA*7uEq2.s̡Ii1 #hytQXь,a ѣGD5}MƪP됩 lguܸq0777:D]R:.)lUw| .dShN`0 S=X "eeݭʾ!ϔ̐R$c1̓O˖ s fFR0f:+ W6MDha.dϐŠۑQ2Ti2C )0o<[֭[!!!d)9ՇZ*XϹIp;-ZDq7w?j`NHHd|>Κ5k܃Ezy,K֩>>zU}țR)X,&Iq2Rdi^_d8CC#Y"Sսצj s'M;Sk{Ns%%q1uıg$J~FfYyYd:Ii |: s[Oo߾}ųgΞ9}c'8N̙3gPvvvUUՓ iuTTNNv t пa , @{;X``t0d T:0X.>@CCCCCCCC?F d:׃khT:M{`0 Ũ`t0 V?aV{.*_y[_lVCZ4lvQݹ匚:+`0 l-̢_ƧxaPRK{8)tyh,} |)?Ð?O)~ٹkW٠5%9G;-[Rk}EVCW͍;T̛G|بf?쳤ΰ0 'wC =aw«5~'qޤ?&6r_}\7EXLAbBQ$yf4wyc߿X4`stm}}kSӧOH$ӦMGc)hѢ9GsNxTTus玚5е]t!ehhhhhh迌PåiF 7|p!G z+x!o3"xȐwFmܨG cFNT47z2vD0z{P>*x01tа!@!>zsYehEK srrziddv׋^z)99533#{5k,+̙3G9S[n_2sK}?N˜`0 a=&xco??߁ <8`ȐC 4xXАa!C :|XaC <$$h H݆ 0h~|)L(}m vڵ}$g?` ?^{o&3X2ٵkuyrPV,*叓&M֭[>lmt)[#7Xd Vg"<$$Py,j!Cj(ٯ!C|ի Srr2;d:tk׮*WfffzzzRZJH7|3--M0>/PȆӤ/'|rq5444444tgК*X[NO>r_a( ?h` aKQĒ{#Fv*//Qi._ȟjzJHm/,/oP&S,W`}N>f޽0u…~En߾3DFFz y0~'OLg]bUUU\b|2iۭ[7/,,1OFSNQ7rZn̙j Ï`-'J"I?WO 3 *`v ŪYGUߌ˗;8֮rCK ݽy,}%`6ڽ{>`7o GU9=X\\yy r2Y(uuu\bmNLjԟ,gϞx޽߿?} &Us;PzoO^>ޞx?%TDDQȑdƏ端dŋZd?VlހFV4`WXRRB.O?UGFFn߾i`_G{0ߣoʑ[,^8 Ɔ4+8]t[LU׮]WZE^mtŋ~]:}4?~a޽+*Xթ`0 ;wQc'y{{{ ?XNz?~QQQ}GO_W:r߄'pqq2d0 W'_/ECQz|F4`_Dh<KKKTdL3E?_,V|jS$988(G&N/g${sNW`*??=OO>f_zSO={nv`~9UUھ};u[` 6W ?N٨铘H,..=Ӽ  *P]̻SFNmX E o/;)eog4{E|5c2l^^^^oU+A7WWgg'{]~kOks&{ٳguyf(W"KQU{g\_}ժUQ:~~~z"ϒmF]zUWW<3&L` cO񴴴7x>~7=< W?JsO:z;Pzc_]=<=Vj{ȑ49inqM0~ }XHݕ`I|tr/_  `Mz;xK^pJmy|%^ju2X.Nnr%{,Oך5kYۺe/`:5G,ȓu%V>w{tݝĺ)7H(_ݕFdtЭɪ 9 Mڗ&survvtusqss6,$x{.D_Pn|iԬI~u;^^2~``C='/=GO=jP}۶~>vv4\"t_7`y+`0 lhC =c?8:998:Dh6nhnc*5KIM&;?Cif͜9skYg͞3 +KRcU sj Y ẛ|_C`᭛XR" 9*+Ƞ8Q3gNé?^,H%blőWM9**j?' j7 s'~!ԩSnr 2?SWbUذ%?n;حX(j?ٳdɒQo%Vbͷt[v`W Wعs3///;;c *XdOuv:::8:ٓY>\djCD+Y;ͅT).E-2!M 'QQQ4^V\USƍz_Q~-]ӓX|4 a̘1T%4U-d7od@[Wg+"3Xlo邐mU͋F9q*@g ּ/ܙn/%dm#%%%e'%4{/7njZ*88iTuhݖ|!_ȗ+Hl--]W X_ ccc^EH'$$Pʢiii| _dIPPdeS%g ̝;" .>|8ןcǎ0a½ 7#+VB&_Ge8VZn.`Ǐ\עӭ YLև'&&&@`Ŋ"\ԓ&bcCCC4Xd[!zR~~͛7I\|YusgY~+4Xlt,.-zoe/ imL0Xܼ,UVVܹ*X ](ߣTǷi66bP$% e#P҂`ieehd7??]=]S3S?3+@$Voean"ߢݪi))0o)`cA7251Zls!:  ֲg7e14od˚5=c#}˛~07愑>WPttGP!}.@GAZƷE }t6SZ[t٢<ތpy;1ۣ7Y +;7xdɨأgblG:]dxḏ QO?q\k`E ^Q``4444444tkT:؃ ,F,0 `pG1*X.9@,``0 w0@ `0 P`0h ,0 . `0 b  `p3`ACCCCCCCwF `0ڃU^?1!.FEcE?l޾}{xxxk `0oYo ϫ Kt`\ECP>&UɯױgRPP0c DqGc@@@jjjQ_hQUFEΝ;E_YѨQZk0  VvU+2:Qcx`?+1<\fthW+;dܞ={Yv bK/̎ueԩ-F͞=nnn-1ɱĉŋѤ$7ߨY3U5  ?iq wO'GF=GIo|5v֭EQ2X?^{5sHwڕ.\@{zQ2pt4##CyTMMrJ׳xEEE:R5 60 &Dӥ  dE͓*?%wG^ʦ p4@矟?rO>1bdڵo>Mu3fu٩Ec~孷޽;YZZLyz)2R,ջw7ZXXPΗ^z/%w¥d^zmڴB['ѣGž{9YYY,˗/! En޼2,;;7`_,Y{+P ݏ|Fk ~,s=y"h@.0ãGJ6h}7c @عs>dquu➞Æ sSuNr$666K/ׯ_'߳~#Gщq㆗V%RU"G}>BK/_fT\*yܐ#GpC\†L0k׮d222B!Ӑ_|O?=qK'B "隚_~yl .cbދ aj6taa!g}Ʋ9s=d̜9;^{mҤILT{ `p=X KO2Ãs+5I-k_!txgֱ7*ԏm333[ٳGUV"maa1o޼ؘWj12=ʕ+)>w\=='NP<%%u#})S8;;!q?5WXeMևh,-Ku_ᖔȆ>}1RuEumݴWWļ04Q{hNbHMPt",`CA*"afp=sf20P`7YYs}=}܁y\\\\=Dkk뢢^kԨQF8+X]b Ξ*_R粫۵cGVݵJxbOrDLXc1 OmOOOB4`>{_pEKHGPڷoD&54ZZZ`|cHH6 `RlܸQIIh:88@(cccu_M]^~XYY|o]T***:o4dddddd_ڃ% z%ԊŶPHJNsƊiMI]CB+Z$v )2oϟO4`hii~СoMMMa,^>}_|AIKaa!uk= `֬Y[nJ!sx漇ٕ`cuvv K@ UL7H\xRδ޾Ʈ܆U*zccV@|lƘJHHx׎?^__.W_ %R,лw_}vr HIKUU]]] ̜9S g}vA;D fbb" EUpEKmڴO?$w?~^jkk `)S######y {IDq^qjWbq-Kۺ9E76we5ߧԁhWMm";fEJ^l}/ _b>>>Tj:ܺu(hNs;T;Ą@111yסqƌ B+X6lONqG 5uK!խ\U.?ڵ|oVJJ ١ݾ ,1-jԨQFzz ,F+Cë%br^T'u |~&?jH}AZv0feUH\1l1+^.bGM[[[7EOjK===%%%---|A([TZZ<~{J ?j4VU.U{>grZSN"~ߨ-Bdddddd䗂E`inE''@zYmk8qO[8/МNΏ='0vj>®z64DRnC^ 1dWE7R奨vEW{Eo &K2+;8mܻV&TjԨQFT"U$+96^YK}zCz?ysX k5ԁxqU/vb7GTG:Y}g !@LaA}b@,nPJ\Fo&GV6qZx~ਤßѠC|+g< .k77? X>{ܐTJMR@L}$cw^<ɽmOj-ig.u_ݚ\'UqW!OŢ(0R3Cz:*kVDͣ^z2$.{>=$$DQQؘdPAAA___GGY{{{aVWW744ܿ?h[[͛7R}AQòLl V盙=zT^^2]tuu!ƅD1C&#++ A7mعsBZee"<==!h@ XjZ{/W T!yv(]"y9ɢܽ\ y~.RWN4|Q:@!t]7 8p=X{ʂFޖZՉ߿?jp&wgrS{gXȩ@\ "Ҟ@ $\0࢜A@7>-BQ Vnn.:+вf#+00PMM$B׭[GUFOPE2e ,u2h)6 `$qgb횡"ӹZ><=jb_z狁5`Z8:.*ӇNhın1k׮Ƿ}뼍 M?|+-[xܾ}{8ee厎UUUaiipBCCC046lq!%Y^^^Hdm`L^<࢜nt}DUQQ1aAAS`  Ƃ`AgpRr|ڛ%h>,r:"^( ڳgcȉ#AE+z~IRXLӢĆΡ-m}nE;ӛje.WqW]%8+S W6-1tW)%i8J&|H5цG=x$#ZHUoGcc#eP-brWXa}e0Пk`` 9hjDN<h*CNI555d8i'_TT{}}}@;e)2XA;I(//A)7jjjDI e0XuV]]ݓ'O2uEqFp?䭳a>an'| Hjl"^繹955"\r%$/#ԨQFGc`r$B+;64a ̺־\FOfCϽ 9=-}?շzxB.[Ɣ٪ xXݡq۶mZZZ`Varm uwi p3G%oaIÓgbb)$(CM[[[wEmrWWWHm +9 )p hS ﴀsuh?>Tv.HQ`1 ܹS|2VA@|Qu_y9TPP ;WZEU A067,Ŗvⱒ:72*zF?xrUbO]wUL"FFFdغu+,o߾l*yM1895* 333hE= 1X#f֬Yq-ZF2X`S &t;w.x ,A U/ m۔WXajjK; 6=aD@ Ƅ!5X!Ǡ^E,f.&ʹUʱUՋQoL ~5jԨQFzz,⦞oӚ%%iqzU7+5|󠇨F8vkzsY8]!@LA v*'6J\^V =ůt/Jb] V}K_E5jԨQz, f\&,lЏ{0OtqKr}n.zH~ʭWe8`r`ھϔϪ^PQF5jSJO,{X5;>hgױUww*Y.̼N72c'2222222`L+VwwբmlY۱`׿*sSJTC9? ssszT``-##c߽{wRBwttYixnR>̶b4 l*2F6w62V_ZW48gBnrCc=1$kT|[)[}1{rV1勂BszͽkvbEQ-#FcA}A*X)Okkg 9COQ*XB +TvW \&_˱cǦO.$޹ߵFFFFFFO9n0a٬-k5 p@#{- +ݨ8[s! if3:uu7|^7o^aa!i%yΝ_̘1#)):O>TRRz .@#.**>Jss֭[!ګ*..FrrrZt)‚:VUU(;;;;O5 /`m߾]FF:_rss,!okgnlz 6|]+ā SSSAi|s;k@ 1 <cAUo fݿپ>g{V]=u}zzrݦ+6*7'BϢhkα 1`&>%K M555}Dh߳g( >ѣ Gt:֭[w/!Ȉ|癙eeeVŻ!؋8ѣlgdd;No`Q?3o>H5!!޽y ɻ 8|N 88p'^ÇBR,33?OĐA믿neeE?RCX-[J)GGS&î]"455]r>>qVƩvͻkW{?sZݪtwMROc\ X'kKV.>)h1yf>[+jkk_{sΑKIIUUU566TYl"oa511!aX=<<[X1UqCH(SSS...I'O*8Q:::D O 8Q8q6mڴ9 AszQxǢ 1X|ɹJ8ӹ[ָ5@ Đ"nKd qr5e*OԢJUV].QIXTJg*6$+[]:`ť%ԼoqOVr,79z=8so,9 鴴4X2ݻ~MAzjy?|z zyy[j@--[Q**VOϭ[H;ߞtHԃ?*[" ΅`;ɉ/^h8* ,!k[k׮mnS˸} |1==:}NNs!KŻ5jԨQOl[H%ˆE**K//.Y]"xeTJU/. V {gw{IsOG+:51;+&))) b233u)++ͻR.,|UUU?CGGP-HNN>999]*e_J~4,ڸq#{ASo( _+))&J&lD@L6& =nH P ??0s~!9BrTB^U }Y b*X+ }n)_HSrO{Xt yIMg$85.wQs5LJ766xWݩ~޽{歋E7..[tIBh '1112LE[%RDS{H/v>;'l"RRR౨ YC&wh H > ȸo&,ޚ֭[A?QI;I(S+E o=^Дͷ8k5jԨQO\Xbrcs|OnEMUY(f* p^ 埱L>orG#0'|k*Kx!"V5ܢX\7&,Yfjs{Fhhh` O` HJO6-==~[x K|7n9s&x>Gzx+X9겱 ^)V@T9vznӦ%zBpo`sQ%nG|`^|J^٪60SB ϙyf>:Nhh+'Cڎul+($Cd; l.dկrߟ:DE̶mH ,,\ 8p@FFF*7U>P9}L$ n޼ Fo%kHaP_[[{ @ ^b^ [n7JYRٳGN8.>oiJ$ߝޥ)K_i -|_F}y=1wfޙ! ̖_ig_ZljniLu1[5J~rz)b)~_ŻTJ&!BB tnmmk$΢tBF+@ oQ`sXKSӑJg% }4bYbŊKB/qKX|*L6`es]:)?M?~LsLd,dlCd6!4cɿ!BL\rG$rSY?λ-Č;D5X`9"B,_BD %H+6Ä2XVG`]_a"f%N5QL"Ql\9ۈNG=2b朊Rp [ʘ ;E ;ߵtlCey}) x@ pjlYeHpxn(}*RtKk,EVt3]b%f3ڞt/tOXc:6lc0`ю:v˰Ym&7eyY-EG_B raM\ic}Qhf~#'%Bc慙K;D9^;ŀRplڍ\6Ϲ/v?aYW #߯/Z˘xҎ8vνk6~:Z1R:XD^! h@\ig$mD6kًƺdDH s%%s}Civ6V|"6nzySG܏n|v⌴.=Ls6!2Y((÷@ D2XW8ZJ[ʘIhIGzPo%e*{2)rqǵxST ^8-x]^^fuꈅ'MUZԼ=\fLwT 5, @ ˆWpM Vr+,S)/yP`|A6~2L:T?Yͺ[n ZUV۝{Үgxs E{NHeYd}Q!B>L"eC/)c0XD5jԨQ:Z VJE[8`&yJZ.mB=ֱ`Tenr̜4Av}}% 7.3{%.ƞt]{QFH ~Ҧ]S `{^4+M6m/c,c,~>n `qv_qslV- ^3"OlyM ΃vXt~a鹖2vm9ʪ'&=&yRL[g@ D1K ֝3_))pT[2-M6p4Y,b A+"8oϹܝN>:qD?~Ryt-hrGljQ 377\H}}=^XXUVVFlll?q9𩇇?//Ϗ)%%DOKKd 7::I BǏSǗR!>B,%%%ܹsSHɓ'B抯q rDDDmm-9 N&4hhꂷ0ݻw}׷o7---oq '9A !ZiQtWK]9)MJS K,ibn1?3X\#u7;5h/!{-?;Kz S!VAr&^Gq~}FDHHւ gΜOfk< Ν;QUU_|o>Uj*0/iTHgggN҃4@$=@B)>$_n$,Wٳ===$픔N4WuvvR Ƣ y{{ve"vwv2{DSWSGId`,rAXYY)5jԨQuHǗM}<$IH3|AQ-}?Lʡ=X2@An Uz'$SquwjrE`%m,Fz'WF`ݿTX_[B`oBKKK %;-hHnٳT#UIݛUfTi|9Eܺu+o>|{ѐ}kǏMdwhKk,}\iKW_*HZ}oPPKnΊu |9΂UmӳS1[=kmkbǏ٤BrH)A "@#NX+v%%(=OKP(^-..&%"Ai8WT[KAA!11hA,dYYD5{qUF@ N֕K1n" uƞ>~RR2F~áWv'oMӴBI#+#ڎ`~_La毿ڷo߮ѡqaA$0N,KJJJ?4*++kjjC`}ʕ'Nqn:b x۶m^'$=NU`D :yAT |Hj9p---ѣ7nHکaPlٲe9)̌:oK[[ XBFFFF+"YacsZC&ޒfRG9xKzH6ezC4oNGŴOյ_olb/~] i&E.n  x2O8dNjmf.ښmnn[ZZb _Lvv+-Z[}"g`hގ;V"1K V^ѣӦv) +7"u#` ::::jjj<\ᑡupiDJPЇ=TՊWE$.Y jԨQF+X\ >xIi7)cOi ^m%i|̖Ι?}0c\iNw>qVZEi#'i5 T29kA}I.vA_6h<r#a~^0-Zs%TT~ͫ({ =t19ó ݔ럣\cxC .;*ixD-s^ǵ0@ Ĕxmm*s-ܿ6w_o3uzv[--z$,3n̺]wz35$4wjx_tߚ << , Lq篎;s~z3?XPCzJT?./o&Ot,dddddd#O"۰ugH;5IFRz_ W=4:l/sAIŽF2W90 ȓ` 3Zji۫i\MiU !q`9~wN{np#S'Z|zKʳ=ZR=kͤ&^̓c-gddddddd䗋9,5jԨQF$Tyy{+Xȓ̸ 5jԨQFz5V'ڃE5jԨQFz+Xȓ̯T!@ &XBFFFFFFFd[@ IV'@ 1 2222222$3V@ &C-ԨQF5jXB d2)~H^Ë /k+X<9ǪoϟศQF5jSPOʼny܄I٩;8 : f5D=NE@ `{-~Vss,\#,x UAu)+k?PF5jԨ=X!wlyVs.E;ۼ}Uricw Vf,M E =a`qo vww\-Vm6`خ A [=1{2:7ԯXB~...c=6((#qvv&E斑+/uXϟ&d1!ݻwyF5\O,`[l6I#[flvd1[#~{CZkKb/~=XȆ^ypc=PBBb׮]ǚX131xRB!w ,7l`{ֱuT5.lFqۤ}}ݮMWVĕ- Ypfpc1nŤRj…t2 @ &blfV>a*xY> `9[ ^هsd|usrژEr =*pX 2"mmm};b>#bDTE  B !),D5:thsłs1jB *菊}";D V`Tsìos4+̳Y[=(dk>ߟ?Ffۭ[R6W,Qq0BUOG+ǂQ]]7|הH;,;w_3\B'XYY͟?>z뭷RRRhᣴlݺiiiT(ggK±---CTUUo!퀣eddyBZZZӧO/^˗/$'<-p h333QΎ/ݻwTOZp'OFMld-Zc^, WFH[[{_ˆi$l߾Nà׿Ο??c5X0$=m4'''*,xJ-c:<cAUo fݿپ>g{V]=u}zzrݦ+6*7'BϢhkα>~!8Ǐ/Yd̙]SSwMJJ={b =V)(( [222K2(_|Eff&,ϫVŞC 0ѣGaMw-..ovQ?`zTy` d`ĨӁA?*X8ڗ-x)h1yf>⧷9}G&uuuy tuu5x7j:tԔ+W!$ommmau>x\"BCRPww7& 888~kttt*e8 LJrO *<jD0 ,%{pԋE (U8Sl#(mĉԠӦM+&dAl/ X@{Q,&ߦN@ /;^y9Fdͩ6 tިܟtMtJRըUKT+$UR>ن F,Xq)w,5sܓ/9q^`CI<擞oݺEHիUTT&VhX&',@oooxKmʡbuV555*8FiXA[@: ͛7I4j,HUUUh0Xw޾}ʇ;8L]{=yDLL :;Aivk֬Yx1u $=9  \ڵkyy Sky-b\QF`R ay=ZQ(P%P%pe%ˣWD*Z *<ܥjU|,NWvOw6ihE&^2n`=#9Fkp@DVV_;Y 333u-XhޕuDχ~xԩK.="v>{T |x#xXੁR6$ّ'E򠮮nFL`~J."M|g'(ᑿ9sEnƍ{=R"x7TxGϟ?<2@ ^F ѼP]x% C%A, Q }z)W-b+g1Y`.|!M=y+sbOӭ%5M$*!&՝hT&<7X`%2 XA_}U~w^y׶<`AL`U\\ 0>#x_,ФBڅ,T?*h` 7'  lMOOv<5"I… |ׂ:SVH!I2ݠMf`߾}JPmmm Μ9C*mFFFT4x,(r=ꏍ 4ϵBH|:::Ըo %&&uVE5j/|5ؠg}nW ̚@)0S V}{Z/`|,}cGO>ͅvX`i9D 磣K)8X)A\re֬YV`444,nrJ"޲e ؎qP#mڴ>Ɂ"DHbB׿<@ċ%$իWC0&#U6D6mZzz:>?6j2oݺoP_&ݸq̙3s3`kkG@ "z~VaneMhftyE99)}oZxJH*ygL o.>g9+82:c[d}_F%7hqd/,g&ؓPǎ,07۷o'G^?B VAA,t{RΑڃA|PF$Q*X 1wmCivdme,Gbdۇ?wMBJ,U(XrhYtʸkG,\2<YHZE=RITL6n(cC3¹y,R+6&X\U_I ",OEʟusM9nyK,sFŁ kBgچvT8`5X47Q9y6>d枺,o"e7; V@l5ȭ`%eZ_"IK.rN1,B>?v#׹syX啨n7+닲2&^4#z3`Yx, Vt=d+A V_.ig$mD6kً_s*1:& K!Jګl⭞,b Zuț&>~t gvdS 9*H栍DAE@ 1E k٧,eL|d$BOg'xIمʞ ;Dʸ)\q-%x)0Up oXˬNV66J뜚G_kl鎑 `f>&!2222222Tc*X9`,dL}L8?&8m0duzcK!=u%p{cUeu, z1O/`^TN^љEe"-hZ62 @  "UR2xK_.J4]ۄ{$`Tenr̜4Av}}% 7.3{%.ƞt]{s;+YN+]7W,&Vnݺebb2ȳI(hkkLu>`_z 4`yXKI{IyJ -f!i(c*c"sn/@ sj`1khh:78t:իyTVVsND PF5WTe'm55 `)-ee,ǭ!,+v eKsnq&״<,m{NHf非k(cwI&cΩ!?TVh'MKWWѣlF_a,O3YJH28/rGqwIs?U"H-v`Q_ʿr!RNv':9IzҹRن[˙zKQ{61esչ/^lhh ===ʨ ʕ+nnnxS#˃ qSRRjN"2ntt4|cJKKBxn݂stR{{ ϸqHL'p^]]L)ɓ'T ΝpMx8]޹ S9p9 4¸d\i ]]]!5jԨQѴH%!f&^R'IiZ|+qyI3?e lbdd~vvv|󍩩%K<8<~``-,,=*//=gzzz0:8… MWWȑ#˖-#ZHzp,$! h IneeܹsҥX۶m >?›[||ܹsMLL8F~xvkkkH$^ڵkW^ 1L ;vL[[{pi'I…IVUU+VǏ6Y"#)/nl޼ypИFw5g,JŸD "####A=H+4GSېr4zT^W\s1k=XF*#'L>^ELإx0X:)O/(vm 3@;nhjxكa{{;,.]"-":8X I3g k'YH;8$XA wGNwppϾ} _uժUa\eee???"Ņwvv(gϞhbH\΀E4|s-$$&@Hp|3%>yyFv983IC IL謪ёijjC&$$ $ oCaŋ8m#####,R+,GCR>s0XOo͆vwYgV<V`QxNKYJiީ{Oe2 ƴ`yxg2oB%2"EDiMRdŐ}M!De<뜛=o;5o9sus?}9>sbld-<5={Z2u"mAS ßjcDPRRj\  ?z5/Uөl~V]3uTnݺEݮ]۷U؛Nʏ2h&k*e,*PV϶wdk֝3AvQαRQKsndw( = _՝+}Ui{Jk$M}[k: /o;EZ\PWn?x jl~!IOϞ=[mEt֬Y}N:U-СCIiii_Uce%yL~JJ*֟Oņf׭ kuظq#,ccjc1QI|||E5/k&PU HͰ7VrcjOIRz,OJZ̧O7Jt'r' BڵkY{,^M>oEUYwļʋuLĕ߼n.%#'kuq$ +)[͆uO5R+} Ϥ#>zV\yG؟&7xPAW^U힦+WZ_`uj+ ,泵||VZ>L` D;=''Ub6 _Ƞ\֧ iZ5)ܸq> eEO_.>V]***(@P)v`5jXFu.|ej1D v+++Vß BII߭տuUYbaaaaa?7<|ȶ"aE4IaҎ2N12m¤HE'WW.~1 #'ٍͰ/+I]IgBkӧElWeq3˘V©SRܹs^[tiU - t5кVIdXZZҠO}:tuuuj%ill*|dff&IÑe'700#~6hcƌyO!H9+XNgАFl aaaaa[6Pzc_ ka sh&e!%##CcuCC鹄NvיbŮ=--LML|Wx5]3cǼ*a Q*4X- ZUDذΝ;wfϞM?IVjdTɉI^=[uUOOOPRR6lX```,oOk%-´4>T@@_b1èQH4P(REc`5r.%z8p *v3ZE !!RUUNjiMUWknU:ĉƥTK%CyN0!ORrvv䈟 .Rz/pd+X$FI W%***HZW X{}VxZ؆ڬ mz[f}/oEUd-dW51Y#Sci-aLVÇluo--,,| m2M|ox]bSsM %h[XfZOnM6UNJz޾zf4i{1Vj aaaaa[mde,lӪ}R\lN=lBۅ GdE6lj6^e_'^|SYYYS&MY1,m:Vj] 6 Vk;Mu 2!D>X!dSKocfy3=jSs {d `sUSSpppxikȊٲ2--'Ox& +X |R#}1ԅ/R5rRZ4 +JO[sX9FrZL+zÇ>|[ߔ @tOQ3 M6\]Tu>Gvu}{@o4>ǑӺi5(ƒ-+Մaaaaaaaa[,[ 5^{L1zFwPfl:4f|ÇuP"Qkw.T4_{}_ʔ;ԧw՜tY)1kXOM5z'XJӌ}%L|ZdoQ喙`9s7cGFRϦ|[ Vh|`,,,,,,,l3[T>|of,f棻w{|Ç>`43X @3@`43XGOÇ>|7G iRic*JGXw_.xXT,*.ji%9'5uUUAjiS>@{Z)ذ.U'[傋ܥ Af^T_(yeIaF}_+>|o..2urha%Q/8313t9lnݪ/cO> Жx-_iWWf(⬟s%+.guΔ?]ҥK->w󃃃Ϝ9z>|o=Xg%9ۧCβ xq۞r8LN'R)G;5&NbVYYG}Dmmƀ/ѱ^zW+ Q=y΅qf;q!/\r]& V1ԋi)&$ust|#W9Ѯ~rCo{lIIIiiiv^`ٽ%2mv۔ ‹B.*[y3"gͭes^_Zpd'а#Od i' "?{şu(QkILTNNƍ5G)**={6Ek׮cX;E*g̘1t_~Ia FIxl&''RFFFϯ ۷;и{[:77W{9Qo Gܹ/CnFАZ(/ZM\+r3Ηx4nNc&+ZZ:\3:'9X`޴Zjم{;H%D:::?Cn޼9z>}ŋv===/سhEҥKJJJffa%EE'N9sW^Q~ &0b% Ezb41w֦nvvڌ3 Nt_MɾzR߃UO@qHBLOO۷/?Fκi={\re֬Y$4=+'|?'Z׮]y333>}9Ъy Q' u>ΠCKGC#[w\pq:㵣A sO ^oxL ڷoZ.]$++{:uC-/_Ύޞ$qhu_~=NʣX1t NT/%%%LEǏ)///TEG3+@,U*/،ǪEZАϟ|YÙO2**o'X|$w"`aaaaakn,*xq=9;nO5#:~{s5ݙ|gSNٓ=y͉;MvEcE##N 9]oC#QʪwHѣ$Ν;W$BSSsĈ i2I=5B322={Qվ Gڂ=Wω'ëUOXd\ǎJ*·uc'Ɗ`~=FF?A\w`R/'^xyx[ ۖ9|km_46ϫHWmgGqT-࠵١e]crQ*axA5&Ç2HKK~1j?<2y!C0Ƞ{e=(**6ȑ#GDLq5 >.\`վE(~ӈX,U+%%]x-\JTI~۷|f:mڴ3CuU]k#c u @pa7{npy! ҇o0bő.>Gژ:U̩Q 98pm$e- .q v |K~h}ݿD:crڵkE1__a1xX׮]m۶>IIIٳV-b!;;lڴS*((SeqXg|0!!Lzxxܹs5:88a5F+22 ,:ӓ$k$s;{lwڕISNLod(kgɰNT;oL`59>|,vPE{St{{gUbSŝW=JbkY g11:9$Z1 MDj~}v)y g&Ⱦ͜+;DYeFW%!!AŋMi޽;) jś+WY ޹s@Hۿ`A׏ׯEJ=YUE> H3*,,d VHHȎ;ȧ?g͚Eٳg]ti\9;ϹgϞtI!ҩS'''N۷o*XGC b^qAw)ޡtU~BmT5 $n|Av.999՘8/^Qo߮V[XX]^^^Oʁ)|E0UJg֭[Ϟ=yZk ۆm{ئ=ikw& XM| lri1{s5_SOHS<gOp ׫ٮl0ܷ93?999py  n rR]z_r/7{EitZʡj5>|o~,vovVoVtwUXw_Q׷xl!ե#On2차j)lWrݨ``F~*zNFkH`)pwöů66]gyAqWߤ׶'ȓߥW9pAk ߣ侵?Mvߝ|U#Q=A9V>R:XGA$άE5;oR4pExϧʊZs?o |Ç>V7E-^TKcgB\+MyEJ{H`ۭ౽Ҡ攕<{-6d˦>R{&w 9 ^r:2θENXkve嫥\>,XXXXXX~T*Qk_FY*sVX)9孎1^[+${SBϵFWT|"= 7 ߫m-auS]Z^r,r IamʮWA+XmT+9%N5N)F>RaG݁;#e<RS:)7/-~Ltx HfUT{|a1S~ V.o/#3ny?UH/s"m% ۃu 9V%V!Z.R~jɄkү YIs6y]*uMr)|s/; 5(Y09Y3A ,/_=on[[cI`Iݸu{s_?S`Hy}]P`mvmzixDEM}cj?|r7m3{DHUνk.R?s_ÍۮW ef؂U22s(ﵵGn Yٗ*XmT+Bh9irJ&L5NafMBLboM kfƹ# \~}P{/(])A?ۆ)˙ Y`!~鴥K7+;ȭPɽs{+XǏ;yc#tq{ĉdLMM_0`ϫu,#)F!Z6\&Lv[ߘ-novw$/dĊ2:034!Q棶--+D۰<'y3?9S!zWG{C7ET՚[VZ[[>|f; JU_QQV|Ç"~*X2e텻CH`[ofusks|]pI%kꫲRQ@C'`ۿI`ɛz YJʵ45cWoVv  V||i&jIWY2dAiyy9XG 3{>|=QdeB$W1pg{a`ih9X9ؾA;K`1!u*mW@B)$$y,tE ,Ecr/5mwOPvS ]:8萪z2$yf;;;##!CP;[YYCE2sL%Ko988֌;x`'''ccceeT> A`IP7tʕcƌa,~\T$%%w!6"A#2?<^c}X(ևyH޽[ p44r@;i(&>j(jLm'v?:'z%N[Vg >|o{~*X7 X'i/ȱwHܓAR.k^ޗN+X~VnaOw؅^@b1F-^9V&LSٳ\CsъcBJ"???===zӬj;fΜuh r39wŴFB`58={¶=,ѭع̜Ca֡Rel{Gmrye]CsCҜ{ 1 p(TMtLV5^#irD]y~1zvaWwVn(TU]1СC!SRRoD jq5kxӧOW:tPR*ZZZ$ߕ#LÇUQ,=>gR'a,>ߧ=X4bbbFΑ"oܸ?TT5m:={`v&OAby&''?cÇ~-ByUV1ob;ESY=wT vqq5p:ǸGPU~Dj}Q-fCV׺>gBO &&{ix.E7ԓիWi gĩYV1˫!`>S9NOkkZ+Xv"E˗۬ VVV=vX݋`eddPcnn.Skӧ{صEܸqgώ9B=;Z%''۷ƌNGAXXXXXضg.XWJNߟO ݺ;6L>R1Z)FyMsW}D/GN1ag_L}eWz\[RWi򊲊2~e^TT4u԰0j;wQII˗/.]ʽ$ Wwu'99}ƍxa:ŋk+XN:Ғƥd(x_WzXPQ$}ɧ>Ǐ7fhffF jhh3gӁ3gd1, [%[؝?=ph&e!%##CcuCC鹄NvיbŮ=--LML|Wx5]3cLTNNƍٮ]; hff6eʔիW78P=/P\`Q :v8tМ=}tѱǎ?f/tqq)((9r$666z@##x{{у4III۷?J=ugwq޽s&I]i244h;::||3Ηx4nNjygϕM-I-dbO}}0oZmL½T" 1%%֭[Gӧk_x?Lzzzj-]t!QuaÆK'O<{l^(HQ-[FRl֭7oޤ`;;z KvڕVzFz~ϓP0a&bhݺu۳gnllL>[[[޽3_8p)YO@@Ӥ>Y D|R.\۷/տ3)~NJQXvI4I8sL @#]v_~ٻw)SL3Bԩw}'//?|RQ$HE"5j(\ ,tttdeeێ;Bl5?|ҥ!M)L:'%5[AAiZMgtFt{z mmmia% 5a„>}ԼHOQBBb+Wthcc3c 999RZP YZZZiL>/|ёV |-DNzE #z LһwﯾVzQl;uΓ'O)HPP 5jwcǎ%ڽ D >8h=ڵMttUu&@O?}-=>}\rݺut<==-ZDݮWPP[z5$hhh(!!ɷ>쳦|k!o522c{{{;;;w\pȑ#ALMjذa?'|ē6rPVSS#Ej hBM>(?MLLbD4 ZQHiիת!Cvџ}Y(য়~:j(:K BBB'֭[G.]LJnݺߴ OM87PaÆYYYEDD_׿Zz~)S;xo,CK__>ƍOo/ӟXk׮wliizΝ;ҺV Ç7Dhh(2C|4|'M HkUCBB/fI@`{fȐ!A"hСCSZճgπ.]4Wm  >t:v8bSSS~ -6؆UX--$%%ԚM˯?O~0<gΜjS={6/͛ijdɒN:͝;@GFFrGzжҊ%SD(8 1mڴk+h466Y BPtq&ul2uu~ jUUUSSzg@CW!kڵkaff֌g[SSག4Sz!F}骑4x> zhw8TG!ʧIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/info.guardianproject.checkey/en-US/summary.txt0000644000175000017500000000002314620351225026631 0ustar00hanshansInfo on local apps ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9243832 fdroidserver-2.3a1/tests/metadata/info.guardianproject.checkey/ja-JP/0000755000175000017500000000000014620351546024360 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/info.guardianproject.checkey/ja-JP/name.txt0000644000175000017500000000005014620351225026026 0ustar00hanshansCheckey: ローカルアプリの情報 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/info.guardianproject.checkey.yml0000644000175000017500000000075314620351225024201 0ustar00hanshansCategories: - Development - GuardianProject License: GPL-3.0-only WebSite: https://dev.guardianproject.info/projects/checkey SourceCode: https://github.com/guardianproject/checkey IssueTracker: https://dev.guardianproject.info/projects/checkey/issues Translation: https://www.transifex.com/otf/checkey Bitcoin: 1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk Liberapay: GuardianProject Name: Checkey the app! AutoName: Checkey AutoUpdateMode: None UpdateCheckMode: None CurrentVersionCode: 9999999 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/metadata/info.guardianproject.urzip/0000755000175000017500000000000014620351546023215 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9243832 fdroidserver-2.3a1/tests/metadata/info.guardianproject.urzip/en-US/0000755000175000017500000000000014620351546024144 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9243832 fdroidserver-2.3a1/tests/metadata/info.guardianproject.urzip/en-US/changelogs/0000755000175000017500000000000014620351546026256 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/info.guardianproject.urzip/en-US/changelogs/100.txt0000644000175000017500000000000414620351225027303 0ustar00hanshans100 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/info.guardianproject.urzip/en-US/changelogs/default.txt0000644000175000017500000000000714620351225030432 0ustar00hanshansdefault././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/info.guardianproject.urzip/en-US/full_description.txt0000644000175000017500000000002114620351225030235 0ustar00hanshansfull description ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9243832 fdroidserver-2.3a1/tests/metadata/info.guardianproject.urzip/en-US/images/0000755000175000017500000000000014620351546025411 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/info.guardianproject.urzip/en-US/images/featureGraphic.png0000644000175000017500000011176514620351225031055 0ustar00hanshansPNG  IHDR,D|bKGD IDATxg\]v齋RD"XK4D&4oF͍=$zcE Ho"H mYyAvXl}_c2; ) >OȪ?VWW掎 CMMM]]]]]]UUU]]_544/5776l|`h>X\\\]]]SSS[[[SSSWWvjkkZXX 6̬0077766fٌd2@cZ_x%%%t'&b2Zi\.VUUVTTx<999&&&%%\ }}}OOOOOO 333,?Ct+++bcc0W<^^^VVVVVVffftdee}wޭ522}ܹ¼pH~SH ***222RSSRSS@}ܸqcƌ ck׮3U>x뭷8P $WIr EEE]]]t9pǏ߿khWUU}'OT#G!(?^y;w<tВ%Kh hiiIKK~\\ܓ'ONJoĉ61_rC$ eee$PK222vUWWghh8yuֹѝ  9Ĩ즦&5jĉN J?7mD@;2>:::***))DԴǎ;iҤ@###Bfdw5k 2 'zzz2ϟ?ɓ'񹹹fKKKIZFC @Ucǎ#)(v(d+((8uԝ;w }%d9rʔ)o񆝝Ţ;"͍/--mmmp8ZZZ666...NNN:Ѝݹs'>>>//CUUUGGoڴiVVV/ՑqSSu}ً0Hfeettt0L ccckkk &|:GSSSqqqyyyeeeUUUMMM]]]kmmr\.媨ꚚYZZ:885j̘1#FǪ;wDGGggg777wvv،5j!!!Æ +zzYuuummm]]]sssSSSsssKKKww71LMMM33#GΘ1|˝ׯ߹s'##f] '<{.PЌWUU|7558p+//|ٳ= om۶}'ue/[죏>a![YY 2>ڵ={ܻwL&3((hժU"| صkϟcww3g~G zڦ͛'o{-{ z577>}ܹs8 055utt|ϟrO>Jsׯ~~~=zHr666^uwwONNsAIjwxcǎ&66_=$... ] 㭷ڿ*6l {FǏo~]R=]x<ǜA?#,5222,,dҝH544oߖTC_WW߹sG4449h"!_/ӧOtݻw'M$f“징}Ѷmۨ$9O?ݹs8{oҚ"IAAAvZfMllh-XYYEEE ze.Q?޾}{BBBUUՠO6l5k#CBBJKK%ئ?KJJLRXX(Nw |8}ŋ𒟟H|–-[>Sz/..R{{Y~71 "00=.S@y1 { 555۷t:555ssiӦ;<),, ȴ?g~UUDj/+RJ@__ǎ[xćM,+%%ݝItvv "… Lbaaadd^]]]PPJ?srr\]]{{{d2#""fϞgjj\ZZ?dddjOիW۷og_~ɗioo?e+++9r$%%^{ɓ6~x777SSS6TTT/prr"?y…Ç744lhhuӧIntZkÆ Ç700PQQ駟N>Ml3gN8BGG633ĉN" enn^QQ1. @s ܿԩFFFp8QDDDBBGeI~h9rq~Ϛ5Kн>>>YYY$9rD]]]6l^lႚ=w8-F/}g$jkkwuuIwr${n7ཽ~I o .OJ>}'O~Uc322\%Ղh{|>Oٳgv:w\]];efftիWG }qƑ7"{yyyNNN&44˃@{֭92??^)ꚙ9d///[8_ Ν;'꯿"TZZjgg'hG; 7oN0?Z~-[Y]]mbbBrM6n(Ç###In' @` /Θ1x;v̘1Cmґ#GHݻ䷯Yd6#yūT[[{䉠BwwwBB›oH|Ky._,YHN?Ayaٲe.=|PdtIme= 1Z9sFХӧϛ7Ov-Z4m4AW8.###c]?eAWDOy___e˖Ȅ wygIIΝ#ٰÃGj8===T&oNR#蒻PWx{{ : !&AӶNNN.c SH΂m7!I_0Tx0>/]_ruuu;wmqKK K 1SХǏ744PFm%y>$}K1  z{{:~T(>lYYYL% $%\_yyy 8q<|h*+M܅?ZIL#Δ;vرv޽qP ]ʒv$esssݻ< `]z #Yˡ]R Y(󛚚n߾aÆcǎaW){?ҥK p0It$|CrTFFo&NA%Ε#^#;Z|A0WQQq?޽{ 6Piii_|O?TYYHKH6Az{wwwtܹs b~ꫯ\}wi_iOw5$kܸq"4]*..2 #/yɾ}6o,O[YYٶm80KIS?#U#ft ɔ1rqqt`ƍ⴯&L RNNN||Z{Q^^ǏRk o.a{+ ꊎꫯ''D(ϟ۷o׮]ɊEppݙ׮]+GZc$WwASD2 hÆ Cj?tƆð Ym0(hoo_6o|e@@uww8qb֭l|=qDAWcbb>3&ݻw7o, tI$`S__믿~q1{QBKɓ'lQQQORN$3322 rΞ=_ѝ߾}/<h[˔%K\ݶmۊ+Z[[ ;;;""Bޗ.]Jr?߲eBuU!`2۶m#y]dIdd8G.^NIVoGFF _sΊ+]e2$WVA| kjj=e˖l(RRR6o|Ѫ*^?o<8 8t萃Æ \nmmmrr`gg7n{XXNJA_~ҤIPRQQ~oooa1pvvtg555B; ѣvvv۷o6 tttܷo)_͗-[&jWWӿ[AQ7̜9dEY[[Uxzz EAJrR||>ȑ#GytҥK :IzӧOKK oj$OWZ5m4===.YSSSRRFrbT]]gee_ ͞2eJPP&쬫|ǏƮ\Z&78-UWW;88<"bԨQZhh +**n޼yԩԲlmm3ux8^z߾}$/YbԩSGYUUUPPpʕt39?s vP [b<[JG 3ܹ/^3 IDATl.]5k֠/ oooJQGGGAA:tHJt?pЗ`T{>}*Yy2;(/(SNm޼͛rkb Ν;*fG$rss˗:JӦM׿%f3"lJZ7nlܸҥKX%`|;w6mty9=& k׌$ئҥKI#ƠA7n 9v@|ݓ^رcl̙3LTk.(+./xY@Zӿ'Niz5=== )|E1z{44TB,k yɓ]]]E0[(uu[nMr"`I5(蜯=:55544T"] YpAocbb555"AZZZn׿%+W޿____R[PPЕ+WP,(W޽,@o]]]tg]TTŋ}||}1Ù7oޣG`So޼y̙A`A˗/t钡 __dgg/_|H 3g=SLEEeΝ111n4 ggwŋ;wҍu-9S477ܹرcuuuJ% lɒ%|?(OOO4~w8 N >LHH*))RUU>|ѣ===ΨΝ;|dW Rqǎ'N@i1 ^{mݺu$E)>l֭^:|pdd$y@(~PWW_>}^X `0 _}Տ>Ԕ8R-蔫"#QE555[n=uFO>_TTTLII_= ._,h?zhP'Ϟ=ꫯ.\ب_& ՍX~;t?1"88~ȑZZZ W\$isk֬$>4-***lrҥ&E@d:::ӦM[~Yd#iff/ճo@^@*JKKlrʕ&,jiiqA6mߗl۶m)͛7Ow]mmm7oܺug%%%lp…/` ٶmիW<8YKK˵k׶mV__Ow?HcǎIAw U<|ǎ.]jnn; ȇϟ_paΝ +VܸqCUUUR Po=sLcc#Y@444:uo&$R8;;߾}cqF3H@WWמ={=Z[[Kw?;;b&<<֖ ^UUӧo߾}#GRBk hooS^^_Ђ`XZZ]vŊrrrKJJJJJ;:::;;UTTmll\\\|}}2M ǏرH޿x Aw5ϟ߽{waa!F &>{K.ѝ@ZqƮ]#33sΝnݢ;Tk߿stIIIٱcGtt4-'%%ڵ+66,bbbvؑ|>???wܡ; (_Xb F … R/\?ѝ@bhii9s̱cǺgϞmmm; dSu,,:tM|An .}"rccc\.Y%{DwPF111~)ǣ; X+..oܸAwP^W\9~xyy9v &@mmSN>GwP^'N8w\CCYD'@ssիW9NwPv  ".YN4)(( /knn޿rr2v OxԖE}}}SS.;)TTTtttӱ%(Țuuqa"8)f0YYY555tg ogg@o)5nܸMMMfΝ999xJ L NCwڵ ~zzztgxYQQ޸qd= BKKkAAA 2}޽=; nڴivvvt@YY͛g1&,8ĉ'Of0 330www 8p ## /dН`UUU7ort y-щ;޽{)SA6 hoo߹sgYYA jDD?)_(۷ӝr?n;\+W~N 5mڴ UUU ᫯jnn;AkƍtgZvvvee%Y^GAAAtg''MOwOiiitPf/\à /q,NA O>b ?~ `0 .bXtg@CCÁp,K>nܸO}CCÅ H/xg}}}KKKCCC--- MMM--fi ^DGG[nӦMӧO`Έ;wuttH/`2L&fZ[[X[[[pCUTTܹFf,Y"@ :;;xxxѝ@I_.^rJMMMHwhhhIIICC`0l6p8##cǎ7nرZZZtP( >/ږ,Yr힞 ͯ_ RRZZ'@d CUUU]]ʔ)^^^ =z/_?'[lӓR/XYY-Z\}P1EAAA!!!&Lѡ;Re˖EEEjjj/_0a񶶶FFF޼y[}0LIpp+秡Aw."'<YYYյsNigoVNNNnn90TUU G1iҤ)S`;NH(--rJUU/o7o|UT)S&NXYY* ٳy?$? rΝwΝAAA%,+222!!!==f <{lOOO =e999o߮􂼼G?p8%G;wnii)+2}aÆ1LC$s۶m&pܸqc̘1Z7|3&& Y:::ƍ  Į>IOҢq׮]`Re򪪪Xϟ奦Fw"HOZ[[Ǐ777b6}̙INsW\acc7g___ y1I @RRRll0 \m|||%a@Nrrrqq1HuuuNB͎;w KRR҉'$߬Y0;E|a޼y֭[#""0#{ɓD!?aaa!X|yTTTFF 6lxxĉNC&'w{H r6668J4Vڴi… 1S)rrrbccE… 1111bg!aXVVV-ڰaʕ+ ݡ@D{'Op/ojjڽ{1cCNOOgZZYBCCGAw> /**˗/D'N>}: JEE!22r/@1/&&&55U}]PPyf׬Ys޽Ri%gϞ=qDĈAxyyG={&N#}}}?5󸸸,_ɴ}w?ya`-\tww_p!11Qvo3䈪ϧ~;︻X,UTWWƖWTT|Zm Аdrssۼyʕ+?bȈ`.ӧOKMK./pO_ϟ?}@[[[BBhknn>|ff[;6l2''' Ak׮ݰaCPPq " mmmMCz{{%YZZYF lܸô"A`|>?+++%%Eiݽ{޽{!!!R/oKvmݺu̙zzztg^ Y555Oӏ痔;v[WWWJ`llvXjv ÿ)Shjjҝk׮ѝDxb NI!J$S{.^H"]5vE=zT}qϞ=~~~Sy̘1oA@uuuƍC4'ݙXY" JWWwŊEq9rd+[[ۯzѢEtQeddkƍCٳiii󇾾VUU &H/EDTT˔)S榢"ckƍknnNOO; M__9Y@A @^^^\\4]cc[)KSSscǎ/͛7oϞ=,,@ M6X 0d|> W^q5|~ss3ϟrO>;(!<(//?w7N}1L--#v"/pssЈV o뻹ҝ>^ׯ_ͥ/ccERЗ888ݻʕ+?SN@aGGGVVӧODrrɓ'rȑV#)ܷoرc044\x1A@(MMMt'lPZZF!|=j2hkkO<$` 6l߾}ennnݺI&]ZZJw {%%%ty!==mmmekkrJuuu ;wl|ۼyѣKII;= Fi!ׯS0xyy͛7OvJQSS[nɓr`oݺuĈtgA466>~ *Eyyy׮]+///KKE 6f|9sѝ ?~  HHH;ȷ >_UUBAA˗/J/&9z7xC'ӳXH {555d***y+c5++4¨_322(4<<͍D`0֮]Jwc .\x1ɲ'O477@mmv 5j? ڵk?p8tgbccNrl!#ϯ/޹s'::O}ikkM=c0>>>aaaT`0<<<Ν@ __y1  |hooOMM8?~, ן:ue+#MLL^yLaG Jw 3G_jj۷(mڴi,eXӦM h?Ύ x0T}}}ԧSww RSS)OMMmԩliaa:j(iw@n„ X ,; {{{d'''4+((tRee%}مIQ3nܸPv0(##pﺺ:;;dCo޼ѣib&M$Dí|}}\RRR(qd3%%(R[[{b 2559sUWW 9 #tttfΜDw]zz:\,ZHJll;w('$$HΚ5DsҤIR*++`3P/\.777W޷hoo?qD^^fϞ!3ttt%,g͚S;;; 7^vuu/\@͖F >|d]`dԩSAiii(@xɴDޟ9==G}3fp8I;fI5 Al6{...,,@<`@[[<6gϞ;v,,,̙#-A-,,% dY[[O>ӧOtf_ ޜfHܝ;wݻGy cʔ)AAAⷦ/~SRb kmmˣDP )SRR|>]i$},ZQLMMM&Z@z̰,Lw'11(R~yj5 sN{{SJ*00 rcH =|paa![...l jhh8uTCCC [[[ooo<61NuuuI,--_}Ue0Ç={6vXfjjJweٳjx ={699W}1̹s;VUUUuuu'M$#g#GdtQj</77@ooo~~>Q}Ԭщ^yIPa Ť5eggS(<ɡ1^|&L0yNVWWquuR*)1cf.''/Oݶm[CC}wyg^y rgذa:D //((--ݿ?5-Z4y'O^$)a0f*,,;ȁ >_QQAy{RxD_CCAN999a)0zzz/x?A{gll,̋q/&9{l===(llΦ7 e\EM_sp8@͜9蕓G$O}G===td2?cihhiiiQ @J|}}tS=}5f̘sjhhFSS3<<0RLR' .jʎ۷?{#F02 @jHO@@6QeeNI/**fJ쨯ߺu+5}]A#55L0b{{{(\l~/>}Jw8q"%%/^d2~I]]}ڴi 555S(2j&7bק@wwM)K]]}ݺuMA `JKKQߟ(111.]St. / m~/([+kzzz曪*j_l/5P sH~/NB>_PPp!jV5*22K$l]P&88XUUJcrNBǏ?yV\9jԨ;zhj)Tuuuww7)@1 oUWWgjV|~X,MMM K]===i9$-zzzn߾}]j3gNpp0A*** il6J 9&AJϚ_KK˩Srrr(`ZjΜ9X IUUOꢠ;++իWS-Fd2N***2Iwmmm7oތ/aiiIAG@@:LX|>رc tgo(HwiL>O7򢳳3&&ƍto8 J~ c777C֞9s rʨ TRp܌gϮ[NEE8ԩu#==PSSSxb9::bA*- N2J[ _~4i/Y`0>s-]`迟KTTwaQ^g* X0j(v( ֘ɮ61\OwKbFSX@,("vTDi˔ɦ*u9Sϋ̋{'ȹ99x!y~*Ryƍ~"tXZZN:B_HI&M>ʊtiy8:z1 :ǎ#94M;99%&&&&&b^J -rqq#wt c`566Π޽gϞ2AGԫD\SeTotҒjT{X,$%%V(J*ۓNaPtÇ:G: !!@7꟢(Q&tt&/^wVY[^ ]/5LF:1]<\MMͱcDzHao{tzb1{;xs*ڵk3“1tT*]paRRξwsN1'-x%'O 윔@zG Oikk#t @W1H4mڴM6;F{f.Y|>t](='SSSO>(: l H4eʔ{a!\.t](^VVF:NԩS oUbxɛ7o6n(D tRRRN:%I bxӦMSL1]Z%'MB D  SRR_N:ɓ:%H {OB:;rȉ'I]!ccc {O ! hjjڳg˗J%,cٿ (>zGH!b$ד`;t@3JO?ty GucXv#YSUQQA:1 '4(55u٠j"ȀO|*DxIAMfM:ըVE=xtc,#_iVuuΝ;o߾B}G،3D",dM> #O,LF:A_H90sL#"(..nӦMƶm,sss JKK5BA:D7n5kQuH4s̍7_PTVVNa,,,HG݅y/_>p}*HoΙ3HVbxoEmm-n&:-@Rvu…6YtT*ݰaܹs ~M,̙a)RP(ZqÇ(sskΟ?߀H$[v%,ܸq/au)lҖÇR>|}AwdWS9r1\N: bP#^licwIIIv `trrr222jjjH6@w=_Xd\.?}?~L: yꚐTJ:gDdG8p̙3*t0 JĉGōԺ&""B"N@(0p݅QyfzzݻwI?۷/xf`X666LhmmHIIy,`ZZZ;vvYOhii@Y(277b, t]uu?eh˗*++I 177'RG@,8/۷o/_& Vmm?Nt@ 8pX,&RGb3N.geeڵt0L_yyy988P虎 EQVVVwܙH: 4kBCC-,,H}IJAAA8hBgUVV~9994HPdgg8pt+6aeeE:N qttc& tJOHgqOѿ}|A@_uR( c \._n݊A#N:J)**Ύt c++mZZZvر{Y@ڵ &.+7:/\.t\ccG}L: GOrI=y(aРAڎTUUo;wNPʕ+}\.'.""ޞt o]*6668 Hݺu7э3۷oߝ;wHxaaa~R`ٮ!!!NRΜ9ob %ϟ?sN\]]l6 ߺT(rqq. RRSSyRTT}:AÝH`iihnn4)۷o*++Ix#G$ z(E㏿ZA@\~}֭8_XK੺Wi^Ь7~w:x+WHgi:22Օt0(;PBXnݾ}HgP(]_ & A&k) hCkk/k.<*++۾}{yy9 Б(OOO)@tx<-mhjjZr?~L: ٳt@ tss# D P(RВW^y/x,+T*՝;w>fY# 2dn;r_OHgАqIA#l6;22@]lmmJT>RYTT__gkk@zr/._}ѿ"Ǐᇛ7o % JO {XXX,x`7|f͚/rY\~;v055 uww' JO x`J:rȊ+;D:0?!:/ I[}||qRT/^\r={p4QikkLKK#:fCBB|||HC`nn{u}%%%T*Uii駟~N: t!88P5`P5WYYy?ҥK tЮ֝;w^ptM;4944Zi[O|@>O:tJOG/`A EQB5//B@(ʚ[nY[[K$ҡ{_{fAs}3gNHH `4P(277yfAAn2HݻvZYYñƣ}ܼzWrÇŤ!L055&cCR?~|Mu 033o[lzuΜ9U)E_vƍJR#_tP{{Ç +++-,,d2ի$@{_z%\s=]vm+fff555ZZZJKK lllb1>A~}1O/ϟ?РAQmXiں͛Xpƻw566ؘa;^kaW^rÆ [x1v4V(255mooǛCR=y򤸸իΝD) 69sm\//\0""?;MI322ݻҢ Ν;W^MIIy'OfIG3^>z( </00'EPuj ~Y}J$??<+Dսׯ_z=)))44t0?1:::,,޽{)򊊊;vfff;v\|Y.I# L{5q *ѣG=*..trr9rdllhΝ;۶m{ %α2t0"Zikhh}ب>3tǎ#GD1DTG;nݺ?zA 9t0.Z)B0...;;;??__R)--=qT* 9rdtt%tZzܹ'N?afӧECCCaasrss/^X]]O-,,VZ꯾ ̂ޓdƍ & Ŋ?|Gp)tL.򦦦Ǐ;v~ۗTPktʕg֪3+gmYr+3ׅA 4M{xx$''< B(KKˤ;wܿ_( BXQQE4>>>>>>nnn2qCCý{nOqqqqqG}Rٕ3v|||͛'4 [UU,=kky999Fr|ܹd4M ,--LG( BRlhhQrGCRgロ0aߩT^xǩz :tϞ=h EQ祗^|rqqg1m]GU#ƍ꟢'Ob/lmm_x 3BCCcbbh355]f 3w644|7of`@ 2dѣID(jʕ̼ @M ,fNJ{K.k{h5kHcPpppHJJ#4%>>o]v'x33Ǝ@QT|||``lgٲe)wؑ{Xl Po36aƍcu9rG 0X( MNN`̖,Y1??Y{<oѓ'O&.E-]4<<_i:666,,JѣGO<بY{4M8t䭷bSR888̙3n{qD"ի]]]Ie˖0?@x<ޜ9sԜ\Y{4M>|֬Y@(*999::h0a5_~!/^{5.K:Po:99A"hܹ}e`Vcc/\,=>rJAL(jV hСC &=HRϏ=,Ј脄)X(j…F"lmmg̘\rY{:>DW_}ݝ`r111 )333333= z/^8((t Y(]j)=9qDf^e{nZZ͛77bĈENt M3g7nebb2i$lnn8uB,=OOKRAp(t͚5#BBBFџ׮]KKK+++c`T*]z?E4rJHD: @XYYM4ۛYGe`͎2e !\I&MD:@X,Vttttt4UR?>--ڞl2333A:(TtR???A:裏10 zennn:NW ^bD"!|ѣ###y}:==U۳BaRRҐ!C\.,Е@Q@ ;vY8Vgƌ[ngý:kС˖-0`hYhѠAHg,ӧ˞8zs|#UWW;  3g\rD"!@+PEY^|Et1++I&00g`tP(6m?O[[[YE EQ,+>>~ٲe...l6 .d`J*))裏" 'LvZ'''Y EQl6;))iɒ%] .d`Vcc~XUU,:@0zW_}ݝt2@Q]dIbb#:t@  4iT*եKv,:>?bĈW_}ӓt3@Q.\hoo]AӴwǏmmm ̂.6l% U(+W?-:tt̘1 RTǏg`tϏZn]@@, 1@QU̙cmm`X}Yx13РAk׮g` Peee~zBO?Ց1bԨQ̌;zS~0Y0@QU*(iiŊl6q\.g`tL 1bÆ 8x D?VTTT*҉$7{lfT۷_tY1P8f̘0r>m۶ݽ{x/h ܻw- 'O &L]<PūV|q +V0ommOKJJ ӦM[n3G8#*ED ?ٳÆ efVVVVJJ veffvZGGGYtqX,֔)Sd2ه~xQRI:0r͚5BY555| ;'r޼y+Wd^0sYXXd{ 9sfxx83w|OzIDATKrrrRRX,&@KW\\'l߾t:OOTfv߾}{/^T( _lY\\'@5wwW^y/ f/_տBo '%::zcƌp82ߎvvv˗/d[l}68- 6m3rrrRRRf'Llٲ(E:.2@QL&J~).l2HfffWd jhhغukii1o#E(Μ9s~~~X< EQԩS%ɧ~zqq@&O(''uSttQLMM#f-EOCRرc]]]ݻt(P?իWqo.Zhƌ̼` o߽{t"ԩS|>>|Ff!6zMA 6mccxb͛7ggg']`gg7o<{{{fUVVٳƍ 2B2,..nٲex@PzN(>>صk.".!!LJkwY [zɓ?0^p87o~wI1jǏg´4q &&ٳE"Vڀ[4M&&&nݺuСخ@JJJd`Bؽ{wvv6, 6|Wx@{P4bEFFOo3{ƌ3h f|833]۳ MdҤIK. `X&MJOO_z64k{ll3JKK裴6ҡ Ǜ0aBXX'N>|X.k{!177?ܹsq'NA qӦMcǎ.^CRI:~߿رcuΝ[n100$'';88@6lXPP?gϞ7oVTTtL$M0!((YMMM?3 P(tvvHLL d ybxѢE111wNKKqFyy9~*#""F)ɴ=KR奤TUUi{...AAAӧO6l2@Ӵ+&LgϞ#Gܸq5/lmmǏ?`f;v̙3 _|>_􏍍1bD b^|Ř}/s .;lذh>Yr… onn,=KǏ9R*N]s8N~V^=~ǏTWWEرc10Kp\̘1#G$@Gq\__߾}3&--F)tȑf~}uKKٳg:B |Gicc;} N9vXVVV^^^YYB iƍe`֝;w[RR,}! ]]]{9, >>>ǏʺpBIII{{;h 5jThh(N8/00K/D~ 4(**K7\?sΝѴb7N$i{R~]?~Y/44tȐ!AAA6s>}ٳׯ_ohh M[ƌӿfUWW20KgX,++H???0@/40yA]r%77777ҥKw0Ϗ5j+W޽M۳tqpp ׯ0<(zȑQQQ7nܸt҅ rrrn޼J:fg„ ... *//߳gϭ[k/Äd#GϿxٳgϟ?_[[džJ${nС u|̙Cbaaa!!!mllHB0,)**jyyyYYYwcC}||&Olnn;vϽB0 """((} AAAC 8qb^^^nnnNNNUU}mcc3jԨ20ȑ#YYY "i{{AEFFzzzZ[[B0Xl6}w޽}˗Ϟ={ܹF:p8ydPYJh۶mMMMڞEiPPPTTTPPP߾}|>P@ D~~~~~~)..=}+Wt*1GGlj'ӇYw.((``A```xxx``YKKKҡ$ZFT>}:;;͛:P(ݼy3SO?ڵkͤRnnnqqqMݺu\oTTTxx5& t r.......]ξrJmm-TRtĈf`VkkkfffFF+,,,<vvv8 [wrÇW\9st鐐-[10d֬Y 8@vvvVVV<t4i~pccc+++.^x'Oh5I:Ei׮]/_f`? ۷L&]'JRWWɓ_pHfr8课N_T*UaaaLL=h  JD ^.*RPQQqs޽{_yƍSNe`Qظz:pܤRH$255Ň(JƍyyyW^ϯQ*BpҤI}6R{,b999y{{{{{{yyyyy9:: \." v@P[nUTT߿<= /))a`EQ"H߿XPQ*JT* 򆆆wwwUTos8ggg֖@s HQQQppp_K;@`nn.,,,\]]]]];yX,Mfz y뭷BT*xm|>_ ,bwW|#x24ݿIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/info.guardianproject.urzip/en-US/images/icon.png0000644000175000017500000000260514620351225027044 0ustar00hanshansPNG  IHDRw=LIDATHǥyPuƟ{².˲ 8ႈ 628yr OCM5V^ʡbY"0,,{DPXϟ>ߋ4zљp a22x@-q &6'xnب4Ռs-<!a^zD\W6=YMQ2ɗw|՟-f̶vJA؜s1Ym®n>/]ҹr8୔@(r1.}j:Oi> DowJ'CRRVJ eMPy|{|7sRNQy(KNnቹM{p՝Ғ6Q:h++-LxȄsՆIT~M≹\{V{TTX@vL (Ćyq]zAnBFZmHocs  Çd6ihh CCfQ!j2OPSեlUY G?15t"GUˢy*(M6\$""DJiujdo5GcF^G"@ Vx\|T$SgOt ::erOK\]Ϟb¶hӫnZ>5^7 S~6B3Щb#RجJ[ =64%1N ('5+٥bvTD%W< `y*VnJK6͵[h8l3PA$M;QZ1[,U3|.nlIuG2 3 eb2V'0`ę&Uڂg ,.!蒎Q1 F|UJvuӆaL06 cLzN׎zXYٹLGBr8#0LmMOS7onDVv͞} DLژ.C{e 󳵴&cY,ZKSiZ=I`҇6%]Nm},ŅU5SN܈mݷ<65}E޷'0CקԄf.̙3;EnK=_d*/r.Ѵ#>)?/Ԟ H\o7aU%(|${hjǜIL~ cS/LҘPPX"1sgsLuP!!"@&849^1|'3}ȕs_-]$IVM1,,D-aEDA̤rIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/info.guardianproject.urzip/en-US/short_description.txt0000644000175000017500000000002214620351225030433 0ustar00hanshansshort description ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/info.guardianproject.urzip/en-US/title.txt0000644000175000017500000000000614620351225026014 0ustar00hanshanstitle ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/info.guardianproject.urzip/en-US/video.txt0000644000175000017500000000000614620351225026001 0ustar00hanshansvideo ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/info.guardianproject.urzip.yml0000644000175000017500000000304314620351225023732 0ustar00hanshansAutoName: Urzip:本地应用的信息 AutoUpdateMode: None Bitcoin: 1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk OpenCollective: f-droid-just-testing Categories: - Development - GuardianProject - 1 - 2.0 CurrentVersionCode: 2147483647 AuthorWebSite: https://guardianproject.info Description: | It’s Urzip 是一个获得已安装 APK 相关信息的实用工具。它从您的设备上已安装的所有应用开始,一键触摸即可显示 APK 的指纹,并且提供到达 virustotal.com 和 androidobservatory.org 的快捷链接,让您方便地了解特定 APK 的档案。它还可以让您导出签名证书和生成 ApkSignaturePin Pin 文件供 TrustedIntents 库使用。 ★ Urzip 支持下列语言: Deutsch, English, español, suomi, 日本語, 한국어, Norsk, português (Portugal), Русский, Slovenščina, Türkçe 没看到您的语言?帮忙翻译本应用吧: https://www.transifex.com/projects/p/urzip ★ 致用户:我们还缺少你喜欢的功能?发现了一个 bug?请告诉我们!我们乐于听取您的意见。请发送电子邮件至: support@guardianproject.info 或者加入我们的聊天室 https://guardianproject.info/contact IssueTracker: https://dev.guardianproject.info/projects/urzip/issues License: GPL-3.0-only Repo: https://github.com/guardianproject/urzip.git RepoType: git SourceCode: https://github.com/guardianproject/urzip Summary: 一个实用工具,获取已安装在您的设备上的应用的有关信息 UpdateCheckMode: None WebSite: https://dev.guardianproject.info/projects/urzip ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/info.zwanenburg.caffeinetile.yml0000644000175000017500000000016014620351225024175 0ustar00hanshansCategories: - Development Name: Caffeine Tile Summary: Test app for extracting icons when an XML one is default ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/no.min.target.sdk.yml0000644000175000017500000000021114620351225021704 0ustar00hanshansCategories: [Development] Name: No minSdkVersion or targetSdkVersion Summary: An APK without any block in AndroidManifest.xml ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/obb.main.oldversion.yml0000644000175000017500000000050314620351225022315 0ustar00hanshansCategories: - Development License: GPL-3.0-only SourceCode: https://github.com/eighthave/urzip Bitcoin: 1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk Liberapay: 12334 AutoName: OBB Main Old Version RepoType: git Repo: https://github.com/eighthave/urzip.git AutoUpdateMode: None UpdateCheckMode: None CurrentVersionCode: 99999999 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/obb.main.twoversions.yml0000644000175000017500000000045614620351225022542 0ustar00hanshansCategories: - Development License: GPL-3.0-only SourceCode: https://github.com/eighthave/urzip Bitcoin: 1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk AutoName: OBB Two Versions RepoType: git Repo: https://github.com/eighthave/urzip.git AutoUpdateMode: None UpdateCheckMode: None CurrentVersionCode: 99999999 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/obb.mainpatch.current.yml0000644000175000017500000000047414620351225022642 0ustar00hanshansCategories: - Development License: GPL-3.0-only SourceCode: https://github.com/eighthave/urzip Bitcoin: 1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk AutoName: OBB Main+Patch Current Version RepoType: git Repo: https://github.com/eighthave/urzip.git AutoUpdateMode: None UpdateCheckMode: None CurrentVersionCode: 99999999 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/org.adaway.yml0000644000175000017500000002047114620351225020507 0ustar00hanshansCategories: - System - Security License: GPL-3.0-only WebSite: http://sufficientlysecure.org/index.php/adaway SourceCode: https://github.com/dschuermann/ad-away IssueTracker: https://github.com/dschuermann/ad-away/issues Translation: https://www.transifex.com/dominikschuermann/adaway Donate: http://sufficientlysecure.org/index.php/adaway FlattrID: '369138' AutoName: AdAway Summary: Block advertisements Description: |- An ad blocker that uses the hosts file. The hosts file contains a list of mappings between hostnames and IP addresses. When an app requests an ad, that request is directed to 127.0.0.1 which does nothing. There are options to run a web server to respond to blocked hostnames and to direct requests to the IP address of your choosing. You can download hosts files from the app but it is possible to use your own and to add certain sites to the white- and black-lists. [https://github.com/dschuermann/ad-away/raw/HEAD/CHANGELOG Changelog] Requires root: Yes. The hosts files is located in /system which is normally read-only. RepoType: git Repo: https://github.com/dschuermann/ad-away.git Builds: - versionName: '1.12' versionCode: 13 commit: ea5378a94ee0dc1d99d2cec95fae7e6d81afb2b9 subdir: org_adaway/ buildjni: - yes - versionName: '1.15' versionCode: 16 commit: 4128e59da2eac5c2904c7c7568d298ca51e79540 subdir: org_adaway/ patch: - defprop.patch buildjni: - yes - versionName: '1.18' versionCode: 19 commit: 0b9985398b9eef7baf6aadd0dbb12002bc199d2e subdir: org_adaway/ patch: - defprop.patch buildjni: - yes - versionName: '1.19' versionCode: 20 commit: ab27f4dab5f3ea5e228cfb4a6b0e1fbf53695f22 subdir: org_adaway/ patch: - defprop.patch buildjni: - yes - versionName: '1.20' versionCode: 21 commit: 695e3801e4081026c8f7213a2345fc451d5eb89c subdir: org_adaway/ patch: - defprop.patch buildjni: - yes - versionName: '1.21' versionCode: 22 commit: 65138c11cc8b6affd28b68e125fbc1dff0886a4e subdir: org_adaway/ patch: - defprop.patch buildjni: - yes - versionName: '1.23' versionCode: 24 disable: no source in repo commit: unknown - see disabled - versionName: '1.24' versionCode: 25 commit: f811e53e1e1d2ee047b18715fd7d2072b90ae76b subdir: org_adaway/ prebuild: android update project -p ../com_actionbarsherlock buildjni: - yes - versionName: '1.25' versionCode: 26 commit: ff97932761cdee68638dc2550751a64b2cbe18e7 subdir: org_adaway/ prebuild: android update project -p ../com_actionbarsherlock buildjni: - yes - versionName: '1.26' versionCode: 27 commit: 33d4d80998f30bafc88c04c80cbae00b03916f99 subdir: org_adaway/ prebuild: android update project -p ../com_actionbarsherlock buildjni: - yes - versionName: '1.27' versionCode: 28 commit: 743d25a7e287505461f33f4b8e57e4cf988fffea subdir: org_adaway/ prebuild: android update project -p ../com_actionbarsherlock buildjni: - yes - versionName: '1.29' versionCode: 30 commit: eaa07f4 subdir: org_adaway/ prebuild: - android update project -p ../com_actionbarsherlock - rm -rf libs/armeabi/* buildjni: - yes - versionName: '1.32' versionCode: 33 commit: 71ced3f subdir: org_adaway/ prebuild: - android update project -p ../com_actionbarsherlock - rm -rf libs/armeabi/* - rm libs/android-support-v4.jar - versionName: '1.33' versionCode: 34 commit: 9d63c18 subdir: org_adaway/ prebuild: - android update project -p ../com_actionbarsherlock - rm -rf libs/armeabi/* - versionName: '1.34' versionCode: 35 commit: f2568b1 subdir: org_adaway/ prebuild: - android update project -p ../com_actionbarsherlock - rm -rf libs/armeabi/* - android update project -p ../org_donations - versionName: '1.35' versionCode: 36 commit: 7442d5d subdir: org_adaway/ prebuild: - android update project -p ../com_actionbarsherlock - rm -rf libs/armeabi/* - android update project -p ../org_donations - versionName: '1.36' versionCode: 37 commit: 83fc713 subdir: org_adaway/ prebuild: - android update project -p ../com_actionbarsherlock - rm -rf libs/armeabi/* - android update project -p ../org_donations - versionName: '1.37' versionCode: 38 commit: 70da32b567122b701cdcb1609b780eb85732028f subdir: org_adaway/ prebuild: - android update project -p ../com_actionbarsherlock - rm -rf libs/armeabi/* - android update project -p ../org_donations - versionName: '2.1' versionCode: 40 commit: v2.1 subdir: AdAway init: - rm android-libs/Donations/custom_rules.xml - git clone https://github.com/dschuermann/HtmlSpanner android-libs/HtmlSpanner srclibs: - RootCommands@c940b0e503 extlibs: - htmlcleaner/htmlcleaner-2.2.jar prebuild: - rm -rf ../update_zip libs/root-commands-1.2.jar libs/htmlspanner-0.2-fork.jar - cp -f libs/htmlcleaner-2.2.jar android-libs/HtmlSpanner/htmlspanner/libs/ - echo "android.library.reference.3=$$RootCommands$$" >> project.properties - echo "android.library.reference.4=android-libs/HtmlSpanner/htmlspanner" >> project.properties - find . -type f -print0 | xargs -0 sed -i 's/org.rootcommands/org.sufficientlysecure.rootcommands/g' - cp android-libs/Donations/ant-templates/other/DonationsConfig.java android-libs/Donations/src/org/donations/ androidupdate: - . - android-libs/Donations - android-libs/ActionBarSherlock - android-libs/HtmlSpanner/htmlspanner buildjni: - yes - versionName: '2.3' versionCode: 42 commit: v2.3 subdir: AdAway init: - rm android-libs/Donations/custom_rules.xml - git clone https://github.com/dschuermann/HtmlSpanner android-libs/HtmlSpanner srclibs: - RootCommands@c940b0e503 extlibs: - htmlcleaner/htmlcleaner-2.2.jar prebuild: - rm -rf ../update_zip libs/root-commands-1.2.jar libs/htmlspanner-0.2-fork.jar - cp -f libs/htmlcleaner-2.2.jar android-libs/HtmlSpanner/htmlspanner/libs/ - echo "android.library.reference.3=$$RootCommands$$" >> project.properties - echo "android.library.reference.4=android-libs/HtmlSpanner/htmlspanner" >> project.properties - find . -type f -print0 | xargs -0 sed -i 's/org.rootcommands/org.sufficientlysecure.rootcommands/g' - cp android-libs/Donations/ant-templates/other/DonationsConfig.java android-libs/Donations/src/org/donations/ androidupdate: - . - android-libs/Donations - android-libs/ActionBarSherlock - android-libs/HtmlSpanner/htmlspanner buildjni: - yes - versionName: '2.6' versionCode: 45 commit: v2.6 subdir: AdAway gradle: - yes buildjni: - yes preassemble: - renameExecutables - versionName: '2.7' versionCode: 46 commit: v2.7 subdir: AdAway gradle: - yes buildjni: - yes preassemble: - renameExecutables - versionName: '2.8' versionCode: 47 commit: v2.8 subdir: AdAway gradle: - yes buildjni: - yes preassemble: - renameExecutables - versionName: 2.8.1 versionCode: 48 commit: v2.8.1 subdir: AdAway gradle: - yes buildjni: - yes preassemble: - renameExecutables - versionName: '2.9' versionCode: 49 commit: v2.9 subdir: AdAway gradle: - yes buildjni: - yes preassemble: - renameExecutables - versionName: 2.9.1 versionCode: 50 commit: v2.9.1 subdir: AdAway gradle: - yes buildjni: - yes preassemble: - renameExecutables - versionName: 2.9.2 versionCode: 51 commit: v2.9.2 subdir: AdAway gradle: - yes buildjni: - yes preassemble: - renameExecutables - versionName: '3.0' versionCode: 52 commit: v3.0 subdir: AdAway gradle: - yes buildjni: - yes preassemble: - renameExecutables AutoUpdateMode: Version v%v UpdateCheckMode: Tags CurrentVersion: '3.0' CurrentVersionCode: 52 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/org.fdroid.ci.test.app.yml0000644000175000017500000000017314620351225022634 0ustar00hanshansLicense: Unknown RepoType: git Repo: https://gitlab.com/eighthave/ci-test-app AutoUpdateMode: None UpdateCheckMode: None ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/org.fdroid.fdroid.yml0000644000175000017500000004407714620351225021766 0ustar00hanshansCategories: - System License: GPL-3.0-or-later WebSite: https://f-droid.org SourceCode: https://gitlab.com/fdroid/fdroidclient IssueTracker: https://gitlab.com/fdroid/fdroidclient/issues Translation: https://hosted.weblate.org/projects/f-droid/f-droid Changelog: https://gitlab.com/fdroid/fdroidclient/raw/HEAD/CHANGELOG.md Donate: https://f-droid.org/about FlattrID: '343053' Bitcoin: 15u8aAPK4jJ5N8wpWJ5gutAyyeHtKX5i18 AutoName: F-Droid Summary: Application manager Description: |- Connects to F-Droid compatible repositories. The default repo is hosted at f-droid.org, which contains only bona fide FOSS. Android is open in the sense that you are free to install apks from anywhere you wish, but there are many good reasons for using a client/repository setup: * Be notified when updates are available * Keep track of older and beta versions * Filter apps that aren't compatible with the device * Find apps via categories and searchable descriptions * Access associated urls for donations, source code etc. * Stay safe by checking repo index signatures and apk hashes RepoType: srclib Repo: fdroidclient Builds: - versionName: '0.17' versionCode: 8 commit: c626ce5f6d3e10ae15942f01ff028be310cc695a init: rm -f build.xml - versionName: '0.18' versionCode: 9 commit: a6c9ed8d06b19315df9ba9041324f78139f7d238 init: rm -f build.xml - versionName: '0.19' versionCode: 10 commit: 540b7d0522f4d67a4896697f7342e4c75b4cbf59 init: rm -f build.xml - versionName: '0.20' versionCode: 11 commit: ddacfb856ad66c1c367e20c9cbecbfb15fe00813 init: rm -f build.xml - versionName: '0.21' versionCode: 12 commit: 49fa56aa6626a190f2d711120b69e435e9e615b1 init: rm -f build.xml - versionName: '0.22' versionCode: 13 commit: a6a33c942495cc4c74a7cb6e968efe0e00815e68 init: rm -f build.xml - versionName: '0.23' versionCode: 14 commit: aa58a8aad1a1c3832eafb9f1bdd6db8292d2c172 init: rm -f build.xml - versionName: '0.24' versionCode: 15 commit: 9b5fe2976443255b95027abd412f1c1e7f3d27b2 init: rm -f build.xml - versionName: '0.25' versionCode: 16 commit: 43977cc493e47a4dc841c4192ae8a40fb14b639b init: rm -f build.xml - versionName: '0.28' versionCode: 19 commit: f881aabe5bd0ac94771b03f1318a6e0972ab4128 target: android-15 - versionName: '0.29' versionCode: 20 commit: 87b229b95d0909bfd05c65c5670794e743626f6c target: android-15 - versionName: '0.30' versionCode: 21 commit: 497cb19840f79b31ae9590f5abd9e4df832b34ee target: android-15 - versionName: '0.31' versionCode: 22 commit: f99f8a544c7cb4d4a48ad09da00ad281af05f2ac target: android-15 - versionName: '0.32' versionCode: 23 commit: cc3970cc243e345416bfc62781ece6eeefd11495 target: android-15 - versionName: '0.33' versionCode: 24 commit: 58eb580159aa4d54767f0af1736cad233fec2475 target: android-15 - versionName: 0.34-test versionCode: 25 commit: 335d27b725b0f92e9e8804ae09518cd47bc7b021 target: android-15 - versionName: 0.35-test versionCode: 26 commit: a06d18b029392669e98359f86c07e442a04e6a13 target: android-15 - versionName: 0.36-test versionCode: 27 commit: 647e230c9e888c04bb0554078c5aa81da63548a0 target: android-15 - versionName: 0.37-test versionCode: 28 commit: 3c02e3ccc147a34af42cedf7d85f18dc75c8efa8 target: android-15 - versionName: '0.38' versionCode: 38 commit: 99b52c988d203811f434d6ac40675a63d5ae41ab target: android-15 - versionName: 0.39-test versionCode: 39 commit: 9a7d0b9f10710105d51d8206a7faa4408c60c20d target: android-15 - versionName: '0.40' versionCode: 40 commit: 51a67efdf1ee2819bee99d9263b2980dafaf761d target: android-15 - versionName: '0.42' versionCode: 42 commit: 36b815095ef51ca4f21887d973dbc0a50575cd65 target: android-15 - versionName: '0.43' versionCode: 43 disable: sdk doesn't like tzm (at f2109e4e0bf1597c625221d8d2d10050f146ba5a) commit: f2109e4e0bf1597c625221d8d2d10050f146ba5a target: android-15 - versionName: '0.44' versionCode: 44 disable: nasty upgrade bug commit: '0.44' target: android-15 - versionName: '0.45' versionCode: 45 commit: '0.45' target: android-15 - versionName: '0.46' versionCode: 46 commit: '0.46' target: android-15 - versionName: 0.47-test versionCode: 47 commit: 0.47-test target: android-17 - versionName: 0.48-test versionCode: 48 commit: 0.48-test target: android-17 - versionName: '0.50' versionCode: 50 commit: '0.50' - versionName: 0.51-test versionCode: 51 commit: 0.51-test - versionName: 0.52-test versionCode: 52 commit: 0.52-test submodules: true prebuild: rm -rf extern/Universal-Image-Loader/downloads androidupdate: - . - extern/Universal-Image-Loader/library - versionName: 0.53-test versionCode: 53 commit: 0.53-test submodules: true scandelete: - yes - versionName: '0.54' versionCode: 540 commit: '0.54' submodules: true scandelete: - yes - versionName: '0.55' versionCode: 550 commit: '0.55' submodules: true - versionName: 0.56-test versionCode: 560 commit: 0.56-test submodules: true - versionName: 0.57-test versionCode: 570 commit: 0.57-test submodules: true - versionName: '0.58' versionCode: 580 commit: '0.58' submodules: true - versionName: 0.59-test versionCode: 590 commit: 0.59-test submodules: true - versionName: 0.61-test versionCode: 610 commit: 0.61-test submodules: true - versionName: '0.62' versionCode: 620 commit: '0.62' submodules: true - versionName: '0.63' versionCode: 630 commit: '0.63' submodules: true - versionName: 0.64-test versionCode: 640 commit: 0.64-test submodules: true - versionName: '0.65' versionCode: 650 commit: '0.65' submodules: true - versionName: '0.66' versionCode: 660 commit: '0.66' submodules: true - versionName: 0.67-test versionCode: 670 commit: 0.67-test submodules: true - versionName: 0.68-test versionCode: 680 commit: 0.68-test submodules: true - versionName: 0.69-test versionCode: 690 commit: 0.69-test submodules: true - versionName: 0.70-test versionCode: 700 commit: 0.70-test submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: '0.71' versionCode: 710 disable: Broken MTM/AndroidPinning commit: '0.71' submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: '0.72' versionCode: 720 disable: proguard issues commit: '0.72' submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: '0.73' versionCode: 730 disable: local repos broken commit: '0.73' submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: '0.74' versionCode: 740 disable: still some proguard issues commit: '0.74' submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: '0.75' versionCode: 750 disable: repo update progress crasher commit: '0.75' submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: '0.76' versionCode: 760 commit: '0.76' submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: 0.77-test versionCode: 770 commit: 0.77-test subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: '0.78' versionCode: 780 commit: '0.78' subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: 0.79-test versionCode: 790 commit: 0.79-test subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: 0.80-test versionCode: 800 commit: 0.80-test subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: 0.81-test versionCode: 810 commit: 0.81-test subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: '0.82' versionCode: 820 commit: '0.82' subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: '0.83' versionCode: 830 commit: '0.83' subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: 0.84-test versionCode: 840 commit: 0.84-test subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: 0.85-test versionCode: 850 commit: 0.85-test subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: 0.86-test versionCode: 860 commit: 0.86-test subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: 0.87-test versionCode: 870 commit: 0.87-test subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: '0.88' versionCode: 880 commit: '0.88' subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: 0.89-test versionCode: 890 commit: 0.89-test subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: 0.90-test versionCode: 900 commit: 0.90-test subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: '0.91' versionCode: 910 commit: '0.91' subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: '0.92' versionCode: 920 commit: '0.92' subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: 0.93-test versionCode: 930 commit: 0.93-test subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: 0.94-test versionCode: 940 commit: 0.94-test subdir: F-Droid submodules: true gradle: - yes - versionName: 0.95-alpha1 versionCode: 95001 commit: 0.95-alpha1 subdir: F-Droid submodules: true gradle: - yes - versionName: 0.95-alpha2 versionCode: 95002 commit: v0.95-alpha2 subdir: F-Droid submodules: true gradle: - yes - versionName: '0.95' versionCode: 95050 commit: v0.95 subdir: F-Droid submodules: true gradle: - yes - versionName: 0.95.1 versionCode: 95150 commit: v0.95.1 subdir: F-Droid submodules: true gradle: - yes - versionName: 0.96-alpha1 versionCode: 96001 commit: v0.96-alpha1 subdir: F-Droid gradle: - yes - versionName: 0.96-alpha2 versionCode: 96002 commit: v0.96-alpha2 subdir: F-Droid gradle: - yes - versionName: 0.96-alpha3 versionCode: 96003 commit: v0.96-alpha3 subdir: F-Droid gradle: - yes - versionName: 0.96-alpha4 versionCode: 96004 commit: v0.96-alpha4 subdir: F-Droid gradle: - yes - versionName: 0.96-alpha5 versionCode: 96005 commit: v0.96-alpha5 subdir: F-Droid gradle: - yes - versionName: 0.96-alpha6 versionCode: 96006 commit: v0.96-alpha6 subdir: F-Droid gradle: - yes - versionName: '0.96' versionCode: 96050 commit: v0.96 subdir: F-Droid gradle: - yes scanignore: - extern/AndroidPinning/res/raw/cacerts - versionName: 0.96.1 versionCode: 96150 commit: v0.96.1 subdir: F-Droid gradle: - yes scanignore: - extern/AndroidPinning/res/raw/cacerts - versionName: 0.97-alpha1 versionCode: 97001 commit: v0.97-alpha1 subdir: F-Droid gradle: - yes scanignore: - extern/AndroidPinning/res/raw/cacerts - versionName: 0.97-alpha2 versionCode: 97002 commit: v0.97-alpha2 subdir: F-Droid gradle: - yes - versionName: 0.97-alpha3 versionCode: 97003 commit: v0.97-alpha3 subdir: F-Droid gradle: - yes - versionName: 0.97-alpha4 versionCode: 97004 commit: v0.97-alpha4 subdir: F-Droid gradle: - yes - versionName: 0.97-alpha5 versionCode: 97005 commit: v0.97-alpha5 subdir: F-Droid gradle: - yes - versionName: 0.97-alpha6 versionCode: 97006 commit: v0.97-alpha6 subdir: F-Droid gradle: - yes - versionName: 0.97-alpha7 versionCode: 97007 commit: v0.97-alpha7 subdir: F-Droid gradle: - yes - versionName: 0.97-alpha8 versionCode: 97008 commit: v0.97-alpha8 subdir: F-Droid gradle: - yes - versionName: '0.97' versionCode: 97050 commit: v0.97 subdir: F-Droid gradle: - yes - versionName: 0.98-alpha1 versionCode: 98001 commit: v0.98-alpha1 subdir: F-Droid gradle: - yes - versionName: 0.98-alpha2 versionCode: 98002 commit: v0.98-alpha2 subdir: F-Droid gradle: - yes - versionName: 0.98-alpha3 versionCode: 98003 commit: v0.98-alpha3 subdir: F-Droid gradle: - yes - versionName: 0.98-alpha4 versionCode: 98004 commit: v0.98-alpha4 subdir: F-Droid gradle: - yes - versionName: 0.98-alpha5 versionCode: 98005 commit: v0.98-alpha5 subdir: F-Droid gradle: - yes - versionName: 0.98-alpha6 versionCode: 98006 commit: v0.98-alpha6 subdir: F-Droid gradle: - yes - versionName: 0.98-alpha7 versionCode: 98007 commit: v0.98-alpha7 subdir: F-Droid gradle: - yes - versionName: '0.98' versionCode: 98050 commit: v0.98 subdir: F-Droid gradle: - yes - versionName: 0.98.1 versionCode: 98150 commit: v0.98.1 subdir: F-Droid gradle: - yes - versionName: 0.99-alpha1 versionCode: 99001 commit: v0.99-alpha1 subdir: F-Droid gradle: - yes - versionName: 0.99-alpha2 versionCode: 99002 commit: v0.99-alpha2 subdir: F-Droid gradle: - yes - versionName: '0.99' versionCode: 99050 commit: v0.99 subdir: F-Droid gradle: - yes - versionName: 0.99.1 versionCode: 99150 commit: v0.99.1 subdir: F-Droid gradle: - yes - versionName: 0.99.2 versionCode: 99250 commit: v0.99.2 subdir: F-Droid gradle: - yes - versionName: 0.100-alpha1 versionCode: 100001 commit: v0.100-alpha1 subdir: F-Droid gradle: - yes - versionName: 0.100-alpha2 versionCode: 100002 commit: v0.100-alpha2 subdir: F-Droid gradle: - yes - versionName: 0.100-alpha3 versionCode: 100003 commit: v0.100-alpha3 subdir: app gradle: - yes - versionName: 0.100-alpha4 versionCode: 100004 commit: v0.100-alpha4 subdir: app gradle: - yes - versionName: 0.100-alpha5 versionCode: 100005 commit: v0.100-alpha5 subdir: app gradle: - yes - versionName: 0.100-alpha6 versionCode: 100006 commit: v0.100-alpha6 subdir: app gradle: - yes - versionName: 0.100-alpha7 versionCode: 100007 commit: v0.100-alpha7 subdir: app gradle: - yes - versionName: 0.100-alpha8 versionCode: 100008 commit: v0.100-alpha8 subdir: app gradle: - yes - versionName: '0.100' versionCode: 100050 commit: v0.100 subdir: app gradle: - yes - versionName: 0.100.1 versionCode: 100150 commit: v0.100.1 subdir: app gradle: - yes - versionName: 0.101-alpha1 versionCode: 101001 commit: v0.101-alpha1 subdir: app gradle: - yes - versionName: 0.101-alpha2 versionCode: 101002 commit: v0.101-alpha2 subdir: app gradle: - yes - versionName: 0.101-alpha3 versionCode: 101003 commit: v0.101-alpha3 subdir: app gradle: - yes - versionName: 0.101-alpha4 versionCode: 101004 commit: v0.101-alpha4 subdir: app gradle: - yes - versionName: 0.101-alpha5 versionCode: 101005 commit: v0.101-alpha5 subdir: app gradle: - yes - versionName: 0.101-alpha6 versionCode: 101006 commit: v0.101-alpha6 subdir: app gradle: - yes - versionName: '0.101' versionCode: 101050 commit: v0.101 subdir: app gradle: - yes - versionName: 0.102-alpha1 versionCode: 102001 commit: v0.102-alpha1 subdir: app gradle: - yes - versionName: 0.102-alpha2 versionCode: 102002 commit: v0.102-alpha2 subdir: app gradle: - yes - versionName: 0.102-alpha3 versionCode: 102003 commit: v0.102-alpha3 subdir: app gradle: - yes - versionName: '0.102' versionCode: 102050 commit: v0.102 subdir: app gradle: - yes - versionName: 0.102.1 versionCode: 102150 commit: v0.102.1 subdir: app gradle: - yes - versionName: 0.102.2 versionCode: 102250 commit: v0.102.2 subdir: app gradle: - yes - versionName: 0.102.3 versionCode: 102350 commit: v0.102.3 subdir: app gradle: - yes - versionName: 0.103-alpha1 versionCode: 103001 commit: v0.103-alpha1 subdir: app gradle: - yes - versionName: 0.103-alpha2 versionCode: 103002 commit: v0.103-alpha2 subdir: app gradle: - yes - versionName: 0.103-alpha3 versionCode: 103003 commit: v0.103-alpha3 subdir: app gradle: - yes ArchivePolicy: 12 versions AutoUpdateMode: None UpdateCheckMode: Static CurrentVersion: 0.102.3 CurrentVersionCode: 102350 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/metadata/org.smssecure.smssecure/0000755000175000017500000000000014620351546022541 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/metadata/org.smssecure.smssecure/signatures/0000755000175000017500000000000014620351546024725 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9243832 fdroidserver-2.3a1/tests/metadata/org.smssecure.smssecure/signatures/134/0000755000175000017500000000000014620351546025234 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/org.smssecure.smssecure/signatures/134/28969C09.RSA0000644000175000017500000000245614620351225026561 0ustar00hanshans0* *H 01 0 +0  *H c0_0G?w~0  *H  0`1 0 UUK1 0 UORG1 0 UORG10U  fdroid.org10 U FDroid10 UFDroid0 150403094515Z 420819094515Z0`1 0 UUK1 0 UORG1 0 UORG10U  fdroid.org10 U FDroid10 UFDroid0"0  *H 0 Q_aI.r4Px@ K{F}!aPB({d9(AN>(ue>kkIXxꃑ¨ CN@jz`jU ZpJpFk"{mZ Ab&nk2ok ^<@SL7u%v2 [ސ"X\40  *H  Y N~lP V'3hC-v=rǞ`%9'>xڢ<(͐K63y\'^HݴbY+kFe+!)7 HM.6]] viҀQM+GQJexHJt<1zWYyO}QϾ̢{: 6~pkw\\_K'lʸ>7-p^#%g(CiM3fAŧVcIVvxܺ؎m~SM Ų100h0`1 0 UUK1 0 UORG1 0 UORG10U  fdroid.org10 U FDroid10 UFDroid?w~0 +0  *H Y6oOKom7{xN:%߅xvY69~ c_ؚ-"1qX|+Bؓ ph$BWV@^< cpڬlfRbh@RՒdLr>EL+ ʵ5%]5ʙmIٝd`lwÏ &⺏x4>B_ggjL9})././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/org.smssecure.smssecure/signatures/134/28969C09.SF0000644000175000017500000070776314620351225026461 0ustar00hanshansSignature-Version: 1.0 SHA1-Digest-Manifest-Main-Attributes: jyVcs92M3Hcv9SH+Z3LUjUkRivY= Created-By: 1.7.0_121 (Oracle Corporation) SHA1-Digest-Manifest: 56iXR6DCWVAoifQSUwNTRSK2h4I= Name: res/drawable-xhdpi-v4/abc_ic_star_half_black_48dp.png SHA1-Digest: osunKPxCh8nEVIDLO5+IMccpFig= Name: res/drawable/abc_btn_check_material.xml SHA1-Digest: YFDDnTUd6St4932sE/Xk6H0HMoc= Name: res/drawable-xhdpi-v4/ic_video_light.png SHA1-Digest: HtVJxluzJoPHCjreZHOfOC3X9aY= Name: res/drawable-hdpi-v4/ic_lock_black_18dp.png SHA1-Digest: tsXHhh2ccnNTEGew41PTgDSThgo= Name: res/layout/design_navigation_item_separator.xml SHA1-Digest: Rop+L/oPNw275ck8glcXZA481BY= Name: res/drawable-hdpi-v4/abc_textfield_search_activated_mtrl_alpha.9 .png SHA1-Digest: 3TVJoKotGhu2qu7nxOP+9dmuUfQ= Name: res/drawable-hdpi-v4/ic_audio_light.png SHA1-Digest: 13Mu0xO0mJ7FzY0q5XKbxSwruV8= Name: res/drawable-mdpi-v4/ic_notifications_black.png SHA1-Digest: MA4DXqM44SiqV6B9cY5h3pUOOhI= Name: res/drawable-xhdpi-v4/ic_advanced_gray.png SHA1-Digest: WDPvH2ZqZwD/phTruQBDukuSpuw= Name: res/drawable-xxxhdpi-v4/ic_textsms_grey_32dp.png SHA1-Digest: 9jva4mR1b6ILjJREhpq5viytlMs= Name: res/drawable-xxhdpi-v4/list_focused_holo.9.png SHA1-Digest: 2/qW1KJgIeUV4L7+Rd9kqNoxB2E= Name: res/drawable-v21/abc_action_bar_item_background_material.xml SHA1-Digest: KV90fjq9oUm4oE6kD9IDK7IG1zg= Name: res/drawable-hdpi-v4/ic_arrow_forward_dark.png SHA1-Digest: klj/AiJeyf83zuYmFJk6xukZkxw= Name: res/drawable-mdpi-v4/ic_attach_grey600_24dp.png SHA1-Digest: ngmOYUucFE57T857CEzLtuTLxfY= Name: res/drawable-xxhdpi-v4/ic_arrow_forward_dark.png SHA1-Digest: jjaIemVkS1nm/HxIu7QLAkN6ZdA= Name: res/drawable-xxhdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png SHA1-Digest: J2uKPpryiQzwY93PQXWIe/qu8C4= Name: res/menu/conversation_list_batch_unarchive.xml SHA1-Digest: RBChRd/UuAfGHAWjrBxlsP+GMag= Name: res/layout/share_list_item_view.xml SHA1-Digest: PFk53SJjEoGF0pQ/iJJziVwTWCg= Name: META-INF/services/com.fasterxml.jackson.core.ObjectCodec SHA1-Digest: TUt3WJOdFSbY0ZddbRq3WmcKOBM= Name: res/drawable-xxhdpi-v4/ic_emoji_objects_activated_dark.png SHA1-Digest: jZHN4c0oJ8KGp3FGrI8oq5DGu7w= Name: res/drawable-hdpi-v4/ic_block_grey600_18dp.png SHA1-Digest: u0L4vqPdxqMY7+HoZZTGJK7pAy0= Name: res/drawable-hdpi-v4/ic_refresh_white_24dp.png SHA1-Digest: Ct72rRND5PQORhQLlWGdDT0wsDc= Name: res/drawable-xxxhdpi-v4/abc_ic_star_black_16dp.png SHA1-Digest: 99UOwsvNS81PRlylisdIV85BpmY= Name: res/drawable-xxhdpi-v4/ic_emoji_recents_normal_light.png SHA1-Digest: kGRNc0o4fZjmBSzaes4vp2PPBgg= Name: res/drawable-mdpi-v4/ic_photo_library_white_24dp.png SHA1-Digest: vHWhkrvE9tFuZp2ZIW9hpNJDsTU= Name: res/drawable-mdpi-v4/ic_action_warning_red.png SHA1-Digest: iNTrh1jh7OMJ/JKmvoUi095+hno= Name: res/layout/conversation_item_sent_audio.xml SHA1-Digest: MDYNLLHlEtPflny/+jsKoheQxJ8= Name: res/drawable-xhdpi-v4/switch_thumb_activated_holo_light.9.png SHA1-Digest: 3Ss5k8ep2Mrg+rgvOa7GGRfjpF8= Name: res/color-v23/abc_color_highlight_material.xml SHA1-Digest: ADJ/QZvjWwj/DO+JqvWU+jC8e+0= Name: res/drawable-mdpi-v4/ic_image_dark.png SHA1-Digest: ZzKS44XOxeDxQocnWdQAjubRzhc= Name: res/drawable-mdpi-v4/ic_message_gray.png SHA1-Digest: 0K+5JBTOf563oye6FpKegWKZ/fA= Name: res/drawable-xxhdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png SHA1-Digest: K3qxsC992lHdJzyirP9Zy9TMKkQ= Name: res/xml/preferences_advanced.xml SHA1-Digest: ismOPLlHsOnM/t1aVSELIMtocho= Name: res/drawable-xxhdpi-v4/ic_attach_grey600_24dp.png SHA1-Digest: ipi0CO2ssjeKYfEDbwhCGHmAhJQ= Name: res/layout-v17/conversation_list_item_view.xml SHA1-Digest: irkP08EmGQuV0W8i11WFROHpfR4= Name: res/layout-v16/design_bottom_sheet_dialog.xml SHA1-Digest: gqn9+EdH25pjfpqTXP6RAZ3CNP0= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_995 SHA1-Digest: VQZUHqW605gJIqlz9jltq9FdR3o= Name: res/drawable-v11/emoji_category_recent_light.xml SHA1-Digest: 0kdu9tgDg1GZ0ECdt2/P+L6zw1o= Name: res/drawable-xxhdpi-v4/ic_message_black.png SHA1-Digest: mXTAUjiikDSafi6k0815KQ07too= Name: res/drawable/notification_tile_bg.xml SHA1-Digest: GCdT2VRFagIyg+5ijRJYiNDkV50= Name: res/drawable-xxhdpi-v4/lockscreen_watermark_dark.png SHA1-Digest: yD27OTvbBk1jpS1o/+kZQko/Sug= Name: res/menu/conversation_secure_sms.xml SHA1-Digest: e4pbyINrig3CE7vbpn9e8WbN5gA= Name: res/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_light.9.p ng SHA1-Digest: 4maqTaWq3BEXw6ShM7wJMon1kU8= Name: res/drawable-hdpi-v4/switch_thumb_holo_light_v2.9.png SHA1-Digest: dUoJcdYHBaB65zOYYoaEwJLGORI= Name: res/layout/time_zone_item.xml SHA1-Digest: OMUu/fQwSnx6ixxWcCbzPFxEl60= Name: res/layout-v17/abc_alert_dialog_title_material.xml SHA1-Digest: OFtIBILoZz5RL4i5NG79H4C4oJs= Name: res/drawable-xhdpi-v4/textfield_default_holo_light.9.png SHA1-Digest: tlklNYajvvNexKXzCLXina5RJ4w= Name: res/drawable-mdpi-v4/import_database.png SHA1-Digest: lW4UkLRTwmCgNQlCpnd+J2wZWEc= Name: res/anim/design_bottom_sheet_slide_in.xml SHA1-Digest: H3e/zshhR8lSEOvNJ1F7meqRXT0= Name: res/drawable-xhdpi-v4/ic_image_dark.png SHA1-Digest: Y6aRi8pB8nHYc2Ab8XnD0qGupRs= Name: res/drawable-xxhdpi-v4/ic_emoji_people_normal_light.png SHA1-Digest: hK3QELxmoGp5x91V/iG+hqecwDo= Name: res/layout-v13/conversation_item_last_seen.xml SHA1-Digest: LKCgoKkL2vB1Xwn2MzNS2iilUxw= Name: res/drawable/play_icon.xml SHA1-Digest: LZsHd/10peNSnCLEcZ0N08QoAB4= Name: res/animator/scale_with_alpha.xml SHA1-Digest: dkkt5ydwuaxd0Vix8/d+HhT1TAA= Name: res/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_000.png SHA1-Digest: 7hzOGLjK5Ydm45f6RGVtepdkPl8= Name: res/drawable-v11/abc_textfield_search_material.xml SHA1-Digest: khlWpwwJ/BpuCBb0uDcegE9Qi7A= Name: res/drawable-hdpi-v4/ic_emoji_nature_activated_dark.png SHA1-Digest: kBBhwFcho+/f2fevl7i89QMctp0= Name: res/drawable-xxhdpi-v4/abc_switch_track_mtrl_alpha.9.png SHA1-Digest: 0/qHVKsPWinDgoCSCJ2tYnOQHDk= Name: res/drawable/done_background_color.xml SHA1-Digest: exuy7684bBtPXZdYMo07HuDY3nw= Name: res/layout/conversation_item_update.xml SHA1-Digest: zTAp/M2/nwDDANB7UAsuq/K4eyU= Name: res/drawable-hdpi-v4/ic_clear_search_holo_light.png SHA1-Digest: UeGvq8ddjrUFOGl38NFyxYA/M+o= Name: res/layout-v16/radial_time_header_label.xml SHA1-Digest: F7ROUbaGiB7d5oCKYGJskkSsP/k= Name: res/anim/abc_slide_in_top.xml SHA1-Digest: ps83fDCN37hSi5vdARGgPEjdET8= Name: res/drawable-xhdpi-v4/ic_menu_search_holo_light.png SHA1-Digest: 1OEqxyBgSuG4bJFuf4KAED1IFhI= Name: res/drawable/emoji_category_emoticons_light.xml SHA1-Digest: s5zj0LIzJakvrvkjFksQqWzCMtk= Name: res/drawable-xhdpi-v11/icon_notification.png SHA1-Digest: RuxV4sFOJZDKMDqRGmvv5ZHjaOA= Name: res/drawable-xxhdpi-v4/ic_emoji_flags_activated_dark.png SHA1-Digest: DFPRNsIBHb5NdyahxEP22SzqQKQ= Name: res/drawable-xxhdpi-v4/ic_save_white_24dp.png SHA1-Digest: M2Ksw9RoI9aAekWorQL1ZAtMg64= Name: res/layout-v17/import_fragment.xml SHA1-Digest: 9TPP+7MllpGYOYiYDBc/h7ibbUY= Name: res/anim/animation_toggle_in.xml SHA1-Digest: dRaYBsOfLqP23qwFMXALeJ6iGYM= Name: res/drawable-xhdpi-v4/ic_emoji_objects_activated_dark.png SHA1-Digest: oPGZtdvfw/nnZQ5u1aLjkZsiFp4= Name: res/drawable-v11/emoji_category_people_dark.xml SHA1-Digest: 8MsF21BUgoxTMNne35u1qG+2KYw= Name: res/color/abc_tint_edittext.xml SHA1-Digest: ELKpQJ7BBc4wCAl/vSvMN6a+kX0= Name: res/drawable/edit_text_holo_light.xml SHA1-Digest: jayuwPQnLwPrLoaJoSHnF9BnVx8= Name: res/drawable-xxhdpi-v4/spinner_focused_holo_light.9.png SHA1-Digest: GoRgB1Li7RZqzAPwAgLgd0fqnmg= Name: res/drawable-mdpi-v4/ic_recurrence_bubble_outline_disabled.png SHA1-Digest: ys+pQ2K1l435FrfBx6vAiDX/zRk= Name: res/drawable-xhdpi-v4/ic_check_white_24dp.png SHA1-Digest: q/oBdURfScsBlV4e5a4TxQowrp4= Name: res/drawable-mdpi-v4/ic_emoji_flags_normal_light.png SHA1-Digest: Zz+YX+HHOmmtVOvPRXbJ2d4L+so= Name: res/xml-v12/badge_widget_provider.xml SHA1-Digest: O68Q2g4i0uc2pLd8KQJJtS6vPqs= Name: res/drawable-xxhdpi-v4/quick_shutter_button.png SHA1-Digest: SxR6XbTH+j6YodTwgGnN1P6NGMg= Name: res/drawable-xhdpi-v4/spinner_default_holo_light.9.png SHA1-Digest: 8z6OMkzlDtz6BaebwU13NRMiwGc= Name: res/drawable-hdpi-v4/abc_ic_star_half_black_36dp.png SHA1-Digest: dLhPxcY8oRLfQRaw+nJKNi5Ke88= Name: res/animator-v11/bottom_pause_to_play_animation.xml SHA1-Digest: LYCzlA/emeQcYagTxZ22jVC7fjo= Name: res/drawable-mdpi-v4/ic_arrow_forward_light.png SHA1-Digest: O/8+Cz6wP0XqeEc1kY5mJJG4hXk= Name: res/drawable-xxhdpi-v4/ic_content_copy_dark.png SHA1-Digest: O58dv6ws4IlktN8EMsPx7STY+w8= Name: res/layout/message_details_activity.xml SHA1-Digest: azLss1HqZc+OGoasvbh3/pmvfVU= Name: res/drawable/abc_ic_voice_search_api_material.xml SHA1-Digest: FKT2suuxpH8tno25EX3iM2N2sF0= Name: res/drawable-mdpi-v4/ic_create_white_24dp.png SHA1-Digest: G0B2ZqlkLHaAmqSMpcq74l7viH0= Name: res/layout/export_fragment.xml SHA1-Digest: R9RsimyrNaZrtRJ6tYxiPnd0xUk= Name: res/drawable-xhdpi-v4/ic_lock_black_18dp.png SHA1-Digest: BHfmCHr+L1mAJXAj3f/Pa35mojA= Name: res/drawable/key_background_dark.xml SHA1-Digest: Q9XtZPMUF3W5vYFD1YfSL3PN98U= Name: res/layout/design_text_input_password_icon.xml SHA1-Digest: enOxXnZ0Bu2vzMaGn/K9/MGflag= Name: res/color-v23/abc_tint_default.xml SHA1-Digest: hkuz+yd/nR5mjwYr8RPMX49hS2I= Name: res/drawable/abc_btn_colored_material.xml SHA1-Digest: 5in2GRrYzWn1M5K8rINJqJPTOtg= Name: res/drawable-xhdpi-v4/ic_keyboard_white_24dp.png SHA1-Digest: gef8mzFbtVz0/gSncFbDhsyWERk= Name: res/drawable-xhdpi-v4/ic_reply.png SHA1-Digest: EqxlL9HBYa08+CVzrwfmhkUaWUI= Name: res/drawable-mdpi-v4/ic_reply_white_36dp.png SHA1-Digest: PcvXgVENNXIje52ZR0uF+Xl44Gg= Name: res/drawable-xxxhdpi-v4/ic_photo_camera_light.png SHA1-Digest: dmMt8Z9y+GqWe+6etY4zVem8ZEk= Name: res/drawable-xhdpi-v4/abc_ic_star_black_48dp.png SHA1-Digest: HtRtZJS+fQnU+eg18M0MLVLd0x8= Name: res/drawable-mdpi-v4/ic_movie_creation_light.png SHA1-Digest: hAd8qQscCw7ttV3lV8ICP7YD1Z4= Name: res/layout/hms_picker_dialog.xml SHA1-Digest: EIDb2yx/gAzfBk1vbnL+PLYhFMc= Name: res/drawable-xhdpi-v4/check.png SHA1-Digest: O/Qi5apjgjIYDbiy4L7NbECquN8= Name: res/drawable-hdpi-v4/abc_cab_background_top_mtrl_alpha.9.png SHA1-Digest: bKDAz/GvMsK2qKIXXjfzdAwCtG4= Name: res/drawable-hdpi-v4/abc_ic_star_half_black_48dp.png SHA1-Digest: ChKX/6bmS9ZkTZ+HL6xSqZEyCHk= Name: res/drawable-mdpi-v4/ic_keyboard_grey600_24dp.png SHA1-Digest: qnqSiT5wNCCg/UlnWQ1v9BlLkqU= Name: res/layout/keyboard.xml SHA1-Digest: Z7oIktvuO2U6H4nSwa18j5kwzaU= Name: res/drawable/key_background_light.xml SHA1-Digest: eFKV10AvLYM51Gr3qKecuaDCFAs= Name: res/drawable-hdpi-v4/check.png SHA1-Digest: bls++agTJ1NimFsoefiNBdsQThE= Name: res/layout/message_details_header.xml SHA1-Digest: h8JQ3mLrzfdnJXrpX6nqi45YmXA= Name: res/drawable/reminder_background.xml SHA1-Digest: gd6gIPUlMSPqPA7qf158rnlpwCI= Name: res/drawable-xxhdpi-v4/last_seen_background.9.png SHA1-Digest: o+wL4yJDNpiNHf5ZhMPaWIKOIEw= Name: res/drawable-xxhdpi-v4/abc_ic_star_black_48dp.png SHA1-Digest: IwCAMkAf6X0pu3GZenrkpUxcYjw= Name: res/drawable-xhdpi-v4/list_longpressed_holo_light.9.png SHA1-Digest: wjffxg4gtxSXtviI33Wu5A+pD0U= Name: res/drawable-hdpi-v4/ic_warning_light.png SHA1-Digest: z4G1iXM8qmbVe/WFc/791V7csQw= Name: res/color-v23/abc_btn_colored_text_material.xml SHA1-Digest: QfOopQVyGBK5764AtyzCeSxgY30= Name: res/drawable-mdpi-v4/ic_send_sms_insecure.png SHA1-Digest: KDIbLEMtUuaf05ehU9GETKSfsFE= Name: res/drawable-mdpi-v4/alert.png SHA1-Digest: iNzhKv0eva+6plDyJC6ddH5jCpE= Name: res/drawable-hdpi-v4/ic_badge_24dp.png SHA1-Digest: Bp+VbQKKHRTv+bE2aHLZU6qH9y0= Name: res/drawable/badge_drawable.xml SHA1-Digest: Q99rmXG7hI/Qdmv3rntexGhZtCc= Name: res/drawable-xhdpi-v4/notification_bg_low_pressed.9.png SHA1-Digest: bY0L7HlUYuOxWEpqttxLZo7p6QA= Name: res/drawable-xxhdpi-v4/ic_emoji_people_activated_light.png SHA1-Digest: tlyiMeENQ1f+aIFe+TyOKIwe2x4= Name: res/layout-v11/notification_template_custom_big.xml SHA1-Digest: VYI2XlNT0XUnuh0qA1BoxW6bJl4= Name: res/color-v23/abc_tint_switch_track.xml SHA1-Digest: bBD39oEqyvU5cz93JUQT0WhDCho= Name: res/drawable-hdpi-v4/ic_play_circle_fill_white_48dp.png SHA1-Digest: PayjsoW2PSnRDUwwmhTJbh2ljyQ= Name: res/layout-v16/selected_recipient_list_item.xml SHA1-Digest: AzEF8ESv6dxauh7AJe31k89QnVQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_506 SHA1-Digest: /BptlPYGlVrO6aOiRVQIw8Ezzhk= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_505 SHA1-Digest: GPF+v2ktP3tCtgbBVUwLwURztCE= Name: res/drawable-xxxhdpi-v4/abc_text_select_handle_left_mtrl_dark.pn g SHA1-Digest: firK0ehpSAty2PwnPS9T52QLoJk= Name: res/layout/selected_recipient_list_item.xml SHA1-Digest: ZwMoe3tueFRM1XJsSKuaiPw4MZI= Name: res/drawable-ldrtl-hdpi-v17/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: HFivDekYna/HGttXT/KmXBD3Fmk= Name: res/drawable-mdpi-v4/ic_video_dark.png SHA1-Digest: TBnuH10e391JDrpYlIxt7yqzqug= Name: res/layout/recycler_view_fast_scroller.xml SHA1-Digest: 7py2L+OuSApx1silOwwAS+CiF08= Name: res/drawable-xhdpi-v4/import_database.png SHA1-Digest: Q4C3QnSbVJogvVbJL04gfneaYms= Name: res/drawable-xhdpi-v4/ic_archive_white_24dp.png SHA1-Digest: Spkt/SXy1cY8lxW+n2OKMQteFKo= Name: res/menu/group_create.xml SHA1-Digest: abNM/Ga3TBltWGfnOimRjkvQYpA= Name: res/drawable-xhdpi-v4/ic_emoji_places_activated_dark.png SHA1-Digest: 2yCExeWjZxDr9TPIhbupCmdAet4= Name: res/drawable-xhdpi-v4/ic_menu_remove_holo_light.png SHA1-Digest: jS22ANT03aXHBixQEDTbArmO/sM= Name: res/layout/media_preview_activity.xml SHA1-Digest: JmeMePMCgjZNCZT+wiTCPoUUruw= Name: res/drawable-xxhdpi-v4/ic_emoji_recents_activated_light.png SHA1-Digest: /Jeu947UWEMQUEv7gCj7ch3fSac= Name: res/color/abc_background_cache_hint_selector_material_light.xml SHA1-Digest: mnPrYggTiTtLeSJMGhhI7MazdiQ= Name: assets/fonts/AndroidClockMono-Thin.ttf SHA1-Digest: zFQStQ34LrLFalq5xe3Uxd6yuVU= Name: res/drawable-v11/emoji_category_objects_dark.xml SHA1-Digest: rGXVg2KdXem4/iDdBV8pb2V/6Aw= Name: res/drawable/abc_seekbar_thumb_material.xml SHA1-Digest: 3gcgKKHkoQO20Qass3DY4tt02lc= Name: res/anim/abc_shrink_fade_out_from_bottom.xml SHA1-Digest: bncgNmwtn5WUMmKg+YNicoakQlQ= Name: res/drawable-mdpi-v4/ic_audio_light.png SHA1-Digest: UmjvOFURYutq4AlUnNhK//vRArM= Name: res/drawable-xxhdpi-v4/ic_emoji_recents_activated_dark.png SHA1-Digest: oDErz9G4J9sw13lmWiAcTyi0/JM= Name: res/drawable-sw600dp-mdpi-v13/ic_backspace_disabled_dark.png SHA1-Digest: goD6JyqKwXfXEQ+bnApKBlW+Gz0= Name: res/drawable-xxhdpi-v4/ic_volume_off_grey600_18dp.png SHA1-Digest: R4uNV8VJIb25VxNlcMMDg/67s0w= Name: res/xml/preferences_manual_mms.xml SHA1-Digest: jHUQzpsM3z1VTPD+NaMIDpwlp2A= Name: res/drawable-xxhdpi-v4/abc_list_pressed_holo_light.9.png SHA1-Digest: rDoVKQUYnqgVz5KStlGT59UHjW4= Name: res/drawable-xhdpi-v4/ic_delete_white_24dp.png SHA1-Digest: Lb7XaUgaZoqd9Om5eg0FWfdX4H8= Name: res/drawable/abc_cab_background_top_material.xml SHA1-Digest: Z+2EBs+zMxbPCCEkmiGm2pj627E= Name: res/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_015.png SHA1-Digest: KV1kviY5baSCVCjRxrMs398LwBk= Name: res/drawable-mdpi-v4/ic_attach_white_24dp.png SHA1-Digest: I2ss7aVE2K9WPhzlOKoXB+xJL+c= Name: res/drawable-xhdpi-v4/dialog_full_holo_dark.9.png SHA1-Digest: mgx4FmtAVykjmDt5bIzhpACjqt4= Name: res/drawable-hdpi-v4/ic_lock_white_24dp.png SHA1-Digest: 6CyxxMRokxyQCUvFeOWUrqC0Z+E= Name: res/drawable-hdpi-v4/ic_volume_up_dark.png SHA1-Digest: 4wby/2YNvkPSOiVjwE7SpkE54mY= Name: res/drawable-xhdpi-v4/ic_message_gray.png SHA1-Digest: tqlXe84qbQTT4jGRNJY9Ft+E7pg= Name: res/layout/outgoing_sms_preference.xml SHA1-Digest: pJFNcYXq+0z0p98IPcboyReDb64= Name: res/layout/number_picker_view.xml SHA1-Digest: VypqbcK3MUZJEcrnRcempupOR0w= Name: res/layout-v17/design_layout_snackbar_include.xml SHA1-Digest: QzNVDbo0qD41LnOPYCRD5jHKA9M= Name: res/drawable-xhdpi-v4/ic_lock_light.png SHA1-Digest: xV8re7lisutnOVQxHM3gACt+r5Q= Name: res/drawable-xxhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png SHA1-Digest: Jrc7Wnxi6R1ydjCdOBfCkiBqY5s= Name: res/color/switch_thumb_material_dark.xml SHA1-Digest: 8cvUQgKtG7wHuyAwzySbxVSy3KY= Name: res/drawable-xxhdpi-v4/ic_visibility_off_white_24dp.png SHA1-Digest: EronAFKuEapU27GYFV++I8hEsgU= Name: res/drawable-mdpi-v4/ic_push_registration_reminder.png SHA1-Digest: 4mxg5UOCU40SUg8JGLVNJzkIQKc= Name: res/drawable-mdpi-v4/dialog_full_holo_light.9.png SHA1-Digest: I98WjozKc0JNwjTZq0MP3G92hxE= Name: res/layout-sw600dp-v13/design_layout_snackbar.xml SHA1-Digest: AecXgQqt21R3R1lrOUnPAtiMSbg= Name: res/drawable/actionbar_icon.xml SHA1-Digest: Zolvi6pYeS++UJxxiH9TjkqRRJs= Name: res/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.pn g SHA1-Digest: S0h+/cgNmuIaGR2yC98F2TluOLU= Name: res/layout/abc_list_menu_item_layout.xml SHA1-Digest: BBIu9OwGrkJCBkYpt10MXYYt1G8= Name: res/drawable-mdpi-v4/ic_movie_creation_dark.png SHA1-Digest: gh9BV9TqavDUMLj3I02tsSzYdZU= Name: res/drawable-v21/abc_edit_text_material.xml SHA1-Digest: hBtHM7G5owedF1Sx2+3m6PbIJaw= Name: res/drawable-mdpi-v9/icon_notification.png SHA1-Digest: XO7m3P5ttOZrRdz96uBImEdvufQ= Name: res/drawable-xxhdpi-v4/ic_refresh_white_24dp.png SHA1-Digest: juzHaK1HIeW3e5KzHw55xyfh6HM= Name: res/drawable/progress_background.xml SHA1-Digest: vOhG7l3qzc7lUlqnjnghMamRR1I= Name: res/drawable-xxhdpi-v4/list_pressed_holo_light.9.png SHA1-Digest: 7Gks0mPw3HB/OmNgzPxInAEdGvw= Name: res/drawable-mdpi-v4/textfield_disabled_focused_holo_light.9.png SHA1-Digest: 3HLtWIGeOcjeWJDyrxpQl26BxQY= Name: res/drawable-xhdpi-v4/abc_textfield_search_activated_mtrl_alpha. 9.png SHA1-Digest: XhJt+0uemfensB5jPL5pYEy1IQs= Name: res/drawable-xhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png SHA1-Digest: j7oKd56yOLmG/qIDUU3a+2EFFV4= Name: res/anim/abc_slide_out_bottom.xml SHA1-Digest: QE0YUwjYdedmgPyovw3+5mmYlYE= Name: res/xml/preferences.xml SHA1-Digest: PT/JgBHAZ8ftn3TxEqqMqZ5pdis= Name: res/drawable-mdpi-v4/spinner_disabled_holo_light.9.png SHA1-Digest: uvpYfq+h6Qn/SDGkwYFfUeaTWJI= Name: res/drawable/emoji_category_places_light.xml SHA1-Digest: 6J23pXumUTxrk55YpGf2J53MCQ8= Name: res/menu/conversation_group_options.xml SHA1-Digest: erRDp8SZW5YJE1GY6Ch5oxltnxM= Name: res/drawable-xxxhdpi-v4/abc_text_select_handle_right_mtrl_dark.p ng SHA1-Digest: GtE+iSfForTxBq2j48yuxNYKU2s= Name: res/drawable-xhdpi-v4/ic_emoji_nature_normal_dark.png SHA1-Digest: MWPryu4IpuIzEHxEWBFL3ogscwU= Name: res/drawable-ldrtl-xhdpi-v17/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: l+vUgYsVgQXPS3iZLaP1u5bjQck= Name: res/drawable-xhdpi-v4/design_ic_visibility_off.png SHA1-Digest: yi6TjTc4+gpXbmQRh5L7zm9CXWg= Name: res/menu/share.xml SHA1-Digest: OFFi2txtjcp5KSxNEBrun8cQpVc= Name: res/drawable-mdpi-v4/spinner_focused_holo_light.9.png SHA1-Digest: PkIQHK1gQev4CH5s1HE8eer4Q7A= Name: res/drawable-mdpi-v4/ic_unarchive_white_24dp.png SHA1-Digest: 4l/On9BS78WvYF1uwjNEV8/1G/k= Name: res/drawable-xhdpi-v4/ic_send_white_24dp.png SHA1-Digest: YD6S90hg7pSL0YuLV5QDwdVbKYY= Name: res/drawable-mdpi-v4/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: uSRKE0Y8igxEBi0V95m3BVba9Dg= Name: res/drawable-hdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png SHA1-Digest: kUO12sw4wuCW6X3apk/9/Bgw1+M= Name: res/animator/rotate_90_animation.xml SHA1-Digest: uK/YW8CFLkvobgn+SDKh5dvJKnc= Name: res/drawable-xxhdpi-v4/ic_forward_white_24dp.png SHA1-Digest: Y3hOlIZxNvmckcFpXZTZuf10tyY= Name: res/drawable-xxhdpi-v4/ic_notifications_black.png SHA1-Digest: AKxPExcZvMELEkvvP1zzyAdeIhc= Name: res/layout/message_recipient_list_item.xml SHA1-Digest: HNkd/TEU9KeZaxKBKRxfCKaSY4o= Name: res/drawable-mdpi-v4/ic_send_push.png SHA1-Digest: 4fXyZhxfTIKtowGHz864YuxW1uU= Name: res/drawable/abc_spinner_textfield_background_material.xml SHA1-Digest: VxVhP39ECkMfDcnEy/uhMtmv8LA= Name: res/drawable-mdpi-v4/ic_pause_circle_fill_white_48dp.png SHA1-Digest: 73mWrCxJapk7/mfXDUXGtoKTW64= Name: res/layout/single_recipient_panel.xml SHA1-Digest: gp93RHYmAHjep9cLn7e4j5uTWMs= Name: res/drawable-mdpi-v4/abc_ic_star_black_48dp.png SHA1-Digest: V5wpcOnIoe/CNNmRipWaosuWAqc= Name: res/layout/select_dialog_multichoice_material.xml SHA1-Digest: irO5EwKaeonZFyXwllRA1Y/3usY= Name: res/drawable-xxhdpi-v4/ic_warning_light.png SHA1-Digest: jsK7b90OKdO3vtd46dwWd92NlH8= Name: META-INF/buildserverid SHA1-Digest: xhNZchncMZQXytaTDWWDf2VsOkI= Name: res/layout-v11/notification_template_big_media.xml SHA1-Digest: ZdWu/rZKQzwVcV+s1qWjhDJvsII= Name: res/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_015.png SHA1-Digest: XI/8mKg+lFBg6GPmpkV9cv9l9n4= Name: res/drawable-mdpi-v4/ic_menu_login.png SHA1-Digest: h5cU8FfckVa4rOuoIbz3rB48K3I= Name: res/drawable-mdpi-v4/ic_forward_white_24dp.png SHA1-Digest: zcVF/wtERmVIt3bCYas7rD0sBuE= Name: res/drawable-mdpi-v4/abc_textfield_search_activated_mtrl_alpha.9 .png SHA1-Digest: 8MDSDpYFD8fxl8tEamhg6/oSBig= Name: res/drawable/conversation_item_background.xml SHA1-Digest: ksvuopfp0d7WQvKy20PIkopUaCM= Name: res/color/abc_background_cache_hint_selector_material_dark.xml SHA1-Digest: EkWMqlaBHrpcPaV0xhKAKJtZbBU= Name: res/drawable-hdpi-v4/ic_delete_white_24dp.png SHA1-Digest: 2nHoZeS6OL6RfxKF6SCo48YhVdE= Name: res/anim-v21/design_bottom_sheet_slide_out.xml SHA1-Digest: p2/uhdWZ4yTGAbU/lBqEQJKJUt4= Name: res/layout-sw600dp-land-v13/calendar_date_picker_dialog.xml SHA1-Digest: WjSX/EalWBnBe2rlRRSuIY1u8Zs= Name: res/layout-w270dp-h560dp-v13/calendar_date_picker_dialog.xml SHA1-Digest: Djn2sT5SZvoA7c1kwGkK9DiulwE= Name: res/layout/design_navigation_item.xml SHA1-Digest: h8Z4IZ4EaznZ0mo6kqbz7RPxJMg= Name: res/drawable-xhdpi-v4/ic_contact_picture.png SHA1-Digest: IeIqBVil3MGhdEzcHuZS32ebYc0= Name: res/drawable-xhdpi-v4/ic_push_gray.png SHA1-Digest: SdutMl0s5vzPa64biCQ9LrttW6Y= Name: res/drawable-hdpi-v4/ic_menu_login.png SHA1-Digest: YrBpMxSmkmtw2XbZ3d6yRIJYu4w= Name: res/drawable-hdpi-v4/ic_emoji_flags_activated_light.png SHA1-Digest: X+Z5HSACXPhP3BAA/Ep3phP+uAI= Name: res/layout/notification_action_tombstone.xml SHA1-Digest: /CJtUAzQm88owb3rpJ2lmhJ8nXs= Name: res/drawable-hdpi-v4/abc_textfield_activated_mtrl_alpha.9.png SHA1-Digest: PIZprngie1clc1fat6kH+iHy6P4= Name: res/drawable-xhdpi-v4/ic_group_photo.png SHA1-Digest: MaCkY1wW7r9wgt6keYpnoNeK+J8= Name: res/drawable-xxhdpi-v4/fab_shadow.png SHA1-Digest: d1fCRucybBZ+sWRe7tnLPKn+GUg= Name: res/drawable-xhdpi-v4/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: v+Lqu0RugRO4lsVbLkHSOZ9u334= Name: res/drawable-xhdpi-v4/ic_visibility_off_white_24dp.png SHA1-Digest: yoKJE2Q0Q97jGmbrQ1KsgQf7rGQ= Name: res/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_dark.9.pn g SHA1-Digest: e8DEB+kwT5rrQOaL1UepmHHnW0M= Name: res/drawable-hdpi-v4/ic_archive_white_24dp.png SHA1-Digest: aqU5UhuTJeL2mRIZhnOmiDZm9Rg= Name: res/drawable-xhdpi-v4/ic_backspace_disabled_light.png SHA1-Digest: uvL0tDWQYO+b6a2r8JmD+J9Jlsg= Name: res/layout/select_dialog_item_material.xml SHA1-Digest: R7iXswuWqsPN8EjQvGjC9B6cHTI= Name: res/layout/view_identity_activity.xml SHA1-Digest: ZxYsEzUbqWB1fd31cKcAig8JDhs= Name: res/layout/design_navigation_item_subheader.xml SHA1-Digest: 69a0szAexIuOGbKDRpYcCnJcMhU= Name: res/layout-v21/notification_action_tombstone.xml SHA1-Digest: 1xrid9zP7OVc/uzz4qlGXdDs5To= Name: res/layout/share_intent_list.xml SHA1-Digest: /OHFqV8MJVHfwnbde21PTpxrK2o= Name: res/drawable-mdpi-v4/fab_shadow_mini.png SHA1-Digest: 7tnIvAUbieMoyoHI7/D7iHUF4Qg= Name: res/drawable-hdpi-v4/icon.png SHA1-Digest: CAVFYxqGyWt6CY3OmeIJX/+GrPs= Name: res/drawable-hdpi-v4/switch_thumb_pressed_holo_light.9.png SHA1-Digest: 85bARtoMmHSPqKgl57lX2txB7Sg= Name: res/drawable-xxxhdpi-v4/ic_archive_white_36dp.png SHA1-Digest: pOQIe48NSqdiWxZfFfwOPOH/pT8= Name: res/drawable-xxhdpi-v4/ic_emoji_places_normal_dark.png SHA1-Digest: 7/jTrEpkuGZjnbgKQSEqElfJ2Gk= Name: res/drawable-xxxhdpi-v4/ic_save_all_white_24dp.png SHA1-Digest: xKq8C4GY8EkO3Rol+/G0+/Cd3oc= Name: res/drawable-xxhdpi-v4/ic_delete_gray.png SHA1-Digest: lPVwwPUCLG3GRVxP9VyDLfyaRF4= Name: res/drawable-xhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png SHA1-Digest: bTNFsVJfPn6MYG0AqtJNqG+o5hs= Name: res/drawable-hdpi-v4/ic_emoji_emoticons_activated_light.png SHA1-Digest: 8UlhfP3tNBq8Wf5YVnXyD766HXA= Name: res/drawable-mdpi-v4/abc_textfield_search_default_mtrl_alpha.9.p ng SHA1-Digest: IKTGIARYbmam8Kefq6089z/0k98= Name: res/drawable-xxhdpi-v4/ic_textsms_black_32dp.png SHA1-Digest: C8gUhZWCtgS6vVORCu6jLmyhHXk= Name: res/drawable-hdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: PtZHBaIOZQ7QKdJsAM/4rDecT5c= Name: res/layout/group_create_activity.xml SHA1-Digest: Mz4Qdjyqol3nqXnezWWmg/hPfQU= Name: res/drawable-xxhdpi-v4/ic_volume_off_white_18dp.png SHA1-Digest: BN+6DA8i0N7feI+DXuSuHwu62Kw= Name: res/drawable/emoji_category_symbol_dark.xml SHA1-Digest: lZvGgjFlg46lXgxyWMMuiA1xop4= Name: res/drawable-hdpi-v4/ic_delete_gray.png SHA1-Digest: tat8joPgYFEqR40RJTM055lAwdU= Name: org/spongycastle/x509/CertPathReviewerMessages.properties SHA1-Digest: J41SvstF2si4wHzfzilAP7QU0lQ= Name: res/drawable-mdpi-v4/ic_emoji_people_activated_light.png SHA1-Digest: 07Lo9EDy3OzK7UmCLWv7hZdkp+s= Name: res/drawable-xhdpi-v4/actionbar_icon_holo_dark.png SHA1-Digest: lsGB5rIJlqJvg5RCYO7sQSheKlM= Name: res/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_000.png SHA1-Digest: 6jyDQn4+fkX7JjWXzkyApClEOBM= Name: res/drawable-xhdpi-v4/ic_visibility_off_grey600_24dp.png SHA1-Digest: +K79wo79xc+zIdUhA+BgY3NSjf4= Name: res/drawable/abc_ic_ab_back_material.xml SHA1-Digest: LqMgt+Rywg7XqCzgIu4X9925b9E= Name: res/layout/design_navigation_menu_item.xml SHA1-Digest: 6WXixNq0qbNTdOQrxHoRlPGWqEs= Name: res/drawable-v21/touch_highlight_background.xml SHA1-Digest: LXWsYtf9CleMEE9F2d2jKTU65FA= Name: res/drawable-xxhdpi-v4/abc_text_select_handle_middle_mtrl_light. png SHA1-Digest: poX8dpNKEtacykuUW45/TXuqGCQ= Name: res/drawable-mdpi-v4/abc_list_divider_mtrl_alpha.9.png SHA1-Digest: 5CNLAG5hgHUpb17az14TTSMIzd0= Name: res/drawable-mdpi-v4/ic_reply.png SHA1-Digest: 9lPFP5ez5joY2ong87wLU1XP1NQ= Name: res/drawable-xhdpi-v4/ic_emoji_objects_normal_light.png SHA1-Digest: 4AdVQ6THS1Icz32grl9k5Tsnjgs= Name: res/drawable-xhdpi-v4/ic_emoji_people_activated_dark.png SHA1-Digest: FqikSS1A066ye++OLqgxphBX0fU= Name: res/layout-v17/notification_template_media_custom.xml SHA1-Digest: NRqlXcBt6+EiJWA2Us3EB4O/aNA= Name: res/animator/bottom_play_to_pause_animation.xml SHA1-Digest: noAqkjThR2pnIhrGEXxZ9yulSK8= Name: res/drawable-xhdpi-v4/ic_emoji_places_activated_light.png SHA1-Digest: oSUJddvEATDs9mKMCzEASwz8jIQ= Name: res/layout/switch_compat_preference.xml SHA1-Digest: SCvYTOQBF2ZhtbA8eqD7WWHhPMQ= Name: res/drawable-hdpi-v4/abc_list_divider_mtrl_alpha.9.png SHA1-Digest: Sjjr2U+mtnlc+xsrpBBNrqVorGY= Name: res/drawable-mdpi-v4/ic_menu_barcode.png SHA1-Digest: ne6Yu7swl/uqop6waeVVh1zxCHc= Name: res/drawable-xhdpi-v4/ic_audio_light.png SHA1-Digest: b7Oyc5myGgbHSG4u9zXQDjle0xM= Name: assets/backward SHA1-Digest: hgif/oUAa/79gSRPr7FCRJRVfvk= Name: res/drawable-xhdpi-v4/ic_emoji_recents_normal_light.png SHA1-Digest: g0z67sfbKP0Rd2NtBXF3o8q//48= Name: res/drawable-xxhdpi-v4/ic_push_gray.png SHA1-Digest: 7ZX2rXUTLc6nm3GsOwVrscJFST4= Name: res/layout/load_more_header.xml SHA1-Digest: fO/2JO2SLTeT3dtcsrS43HVQ450= Name: res/drawable-xhdpi-v4/ic_missing_thumbnail_picture.png SHA1-Digest: wGbI11M1M3pYFtyUJXQZ6MizZkY= Name: res/layout/abc_action_menu_item_layout.xml SHA1-Digest: W6aMUP8ritG0C2IidXq3FVHIo1E= Name: res/drawable/conversation_list_item_unread_background_dark.xml SHA1-Digest: 50vYDX1625FfrdJBL+H6rx1VTE0= Name: res/drawable-mdpi-v4/switch_bg_focused_holo_light.9.png SHA1-Digest: VaARP+7lQEpru1o/MCLqYUFQzRo= Name: res/drawable-mdpi-v4/ic_advanced_black.png SHA1-Digest: fhaB4MyFd6TDRkCQ3/WY8zSB/js= Name: res/color/done_text_color.xml SHA1-Digest: eR1WRcksZkuvjSRlr9yROqjJR30= Name: res/drawable-hdpi-v4/abc_list_longpressed_holo.9.png SHA1-Digest: xcQ0bHWRc+R9tuxQ3wgY1a2eY0k= Name: res/layout/splash_screen_activity.xml SHA1-Digest: CFKY1bhI3rjzzDbxHkfXqzAyKtg= Name: res/drawable-mdpi-v4/ic_app_protection_gray.png SHA1-Digest: GzFsgti12EvIVG1qkSLAtV9ZjMo= Name: res/drawable-xxhdpi-v4/sms_selection_icon.png SHA1-Digest: Pd5TMvT4yFkJcbqEitc5QMJNKmQ= Name: res/drawable-hdpi-v4/sent_bubble.9.png SHA1-Digest: FdfowFhHZNhFmrm59JSxASd+t3E= Name: res/drawable-mdpi-v4/icon_dialog.png SHA1-Digest: 79d0h9fKk4P7pUZzgJ7lv2p9tZU= Name: res/drawable-mdpi-v4/ic_visibility_off_grey600_24dp.png SHA1-Digest: Kme1LM1CzvATKwc7XWpJRXV86sA= Name: res/drawable-xhdpi-v4/list_pressed_holo_light.9.png SHA1-Digest: o6uQudI4iPo5plFaQ6Lklwf2dTY= Name: res/drawable-xhdpi-v4/ic_unarchive_white_24dp.png SHA1-Digest: u01sKhxVrWMhi1XBEwZNIVo7rdA= Name: res/layout/timezonepickerview.xml SHA1-Digest: FTO6xH/QnAy/MYvMir8FJKaoZLU= Name: res/drawable-xhdpi-v4/ic_check_light_disabled.png SHA1-Digest: MSOoGQ4W9IcDT9Zhqhv/G6fngNg= Name: res/drawable-xhdpi-v4/textfield_focused_holo_light.9.png SHA1-Digest: GTkseIIJxb2K4BmEEabgcA60SSU= Name: res/layout/color_preference_item.xml SHA1-Digest: B3xDRjQL8y7Jv067L35aCv3GdXA= Name: res/layout/transport_selection_list_item.xml SHA1-Digest: JBE1VfhklKRsjD2pKQh9o/ZtgMI= Name: res/drawable-mdpi-v4/actionbar_icon_holo_dark.png SHA1-Digest: VgvhFV/+fXGYj5+AC5e93lMt7mE= Name: res/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png SHA1-Digest: o6T1nENnpl79GnrVrE8AKfzN0kU= Name: res/drawable-xhdpi-v4/ic_menu_barcode.png SHA1-Digest: ZlAaKLTGj6XqaMQf223krzJLh74= Name: res/drawable/import_export_item_background_light.xml SHA1-Digest: I1I61lkLByy2qvkW9xYBLKTqUwQ= Name: res/drawable-xxhdpi-v4/ic_app_protection_black.png SHA1-Digest: IqZgSmpHE49sfbLTV6FwEMdEvYI= Name: res/drawable/emoji_category_flags_light.xml SHA1-Digest: mVgGk49YE3Kp0cMsfEDBXyh5PiA= Name: res/layout/abc_alert_dialog_material.xml SHA1-Digest: Duv2PX2Q+Op7FCLYmzQw1pedlJQ= Name: res/color/dialog_text_color_holo_dark.xml SHA1-Digest: j3TCt+8RhyKc5DagKQ/vROwHTJc= Name: res/drawable-hdpi-v4/ic_visibility_grey600_24dp.png SHA1-Digest: uYPGcx0wpMlrcYbzL5ePQwFwY0E= Name: res/layout-sw600dp-v13/three_keys_view_leftright.xml SHA1-Digest: ZK+ggUFpyjP9kHzkHRtbzP+F6O8= Name: res/anim/abc_popup_enter.xml SHA1-Digest: mW6OQN3tih7Y8FA4hLg0FHa+E8g= Name: res/layout/blocked_contacts_fragment.xml SHA1-Digest: uEHjf8i/Nf2x4YvNH554IW1UpDw= Name: res/drawable-mdpi-v4/abc_tab_indicator_mtrl_alpha.9.png SHA1-Digest: ToVo2KPSLrpwpzwqt2DA6d7KLWk= Name: res/drawable-hdpi-v4/abc_ic_star_half_black_16dp.png SHA1-Digest: 8ZyC0cv9tlgFMz8W119E8Qvb7w8= Name: res/drawable-xxhdpi-v4/splash_open_padlock.png SHA1-Digest: EH1IeP6nR4AaPoz61kEWmoqXy8E= Name: res/drawable-xxhdpi-v4/design_ic_visibility.png SHA1-Digest: 4Ss/5pyNfqZlcXdBZWunmqBPz5Q= Name: assets/zone.tab SHA1-Digest: DB2JMeHIQyU6vbJXRUlLcMwvciM= Name: res/drawable-hdpi-v4/notify_panel_notification_icon_bg.png SHA1-Digest: +WaWq164+JEgAS3SD7a6bgQZgMc= Name: res/layout-v16/conversation_list_item_view.xml SHA1-Digest: lSi6A/is5qvx5RlqAICR8SN1MIA= Name: res/layout/notification_template_custom_big.xml SHA1-Digest: D8hRNdml9Qrs+koitDmiY2HzYm8= Name: res/layout-sw600dp-v13/calendar_date_picker_dialog.xml SHA1-Digest: KCrT+yA0T8tZKWG7czg0px64l2Q= Name: res/drawable-v11/emoji_category_nature_dark.xml SHA1-Digest: eNALJxHkeZjrFhl5ynj1vPatWh0= Name: res/drawable-mdpi-v4/notification_bg_normal.9.png SHA1-Digest: g3zlZErALgEsgwbkgFIJpkkFLfo= Name: res/layout/centered_app_title.xml SHA1-Digest: yHdRO0YUJInlZSmzQZ/2onMkj6I= Name: res/drawable-xxhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png SHA1-Digest: boG5dcozMnSrJdbSbLX0TBOMATU= Name: res/drawable-hdpi-v4/ic_info_outline_light.png SHA1-Digest: yTkqd9ICdFOI0MGJdKMgkmF2syI= Name: res/drawable-mdpi-v4/ic_block_white_18dp.png SHA1-Digest: v7Q72iINjgascz0t4CZkzcmzl30= Name: res/drawable-xxhdpi-v4/ic_info_outline_grey600_24dp.png SHA1-Digest: aENZGpvf0G9xhsxd0qM6dAdMHT0= Name: res/drawable-hdpi-v4/ic_recurrence_bubble_fill.png SHA1-Digest: qdJfmY6e/L7whGq87X7BrYEd1g4= Name: res/color/abc_primary_text_disable_only_material_dark.xml SHA1-Digest: PMhnRzfrwY1jlNfoIvzhOutdgIg= Name: res/drawable/info_round.xml SHA1-Digest: EQHFy9KXlVRBd3MTQYLkJoHhHec= Name: res/drawable-v21/avd_hide_password.xml SHA1-Digest: QqMO2alBCoD55pHulq7TEnfVdEc= Name: res/drawable-hdpi-v4/ic_launch_white_24dp.png SHA1-Digest: NVgYd/FTVz8kdW/gqkxE45/kXao= Name: res/drawable-mdpi-v4/ic_unarchive_white_36dp.png SHA1-Digest: Bmyc/kg5I3kT9pNIRpbW1ewggQ8= Name: res/drawable-xxxhdpi-v4/fab_shadow.png SHA1-Digest: 2OdUmLlQwfByiuOyfudiKjx+TzU= Name: res/anim/slide_from_top.xml SHA1-Digest: dpPiD0hLamwYer/Zh9GESUYkkl8= Name: res/drawable-mdpi-v4/ic_warning_dark.png SHA1-Digest: XELeit1UK1v2TSoxXA5W2ItV2p8= Name: res/drawable-hdpi-v4/ic_content_copy_light.png SHA1-Digest: m4WVZSa+cJwRcqkd9/78i6UHqls= Name: res/drawable-hdpi-v4/received_bubble.9.png SHA1-Digest: I12yNJInw7EAeJ+dan826X5qFys= Name: res/layout/keyboard_right_drawable.xml SHA1-Digest: WjmFFtlUJcq/Yu6n0ViwogbHXfo= Name: res/drawable-hdpi-v4/abc_list_pressed_holo_dark.9.png SHA1-Digest: 0zBo9Tp1wTO3RHYh5z1M+TUN+H8= Name: res/drawable-xhdpi-v4/ic_lock_white_24dp.png SHA1-Digest: KPi18fS0OO6gNsSD6NSIA7/qJ/0= Name: res/drawable-xhdpi-v4/ic_reply_white_36dp.png SHA1-Digest: n8qCbJdRiLbOJQKLtlmRaJe4C+4= Name: res/color-v11/abc_tint_default.xml SHA1-Digest: luVMp6CyIupPEeYKYuBDed8Oxeo= Name: res/xml/preferences_sms_mms.xml SHA1-Digest: HTAmLUbhkj/pNntmzSd72heNryA= Name: res/drawable-xhdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png SHA1-Digest: Pc4i3ShwZdpubjNQkH6pYtKd/fo= Name: res/drawable-mdpi-v4/ic_emoji_places_normal_dark.png SHA1-Digest: l3jpuQm48WQSKusaIIfI+iWnh7s= Name: res/drawable-xxhdpi-v4/ic_emoji_emoticons_normal_light.png SHA1-Digest: Xvvq6TlHGeCifYKafmHdp6JHTjs= Name: res/drawable-hdpi-v4/import_database.png SHA1-Digest: 9otw1PbLpHs7hylnm0vJ+UF5cDE= Name: res/drawable-sw600dp-xhdpi-v13/ic_backspace_disabled_dark.png SHA1-Digest: A9mermiNe0qduM6gxUjBYk7DkEU= Name: res/drawable-xhdpi-v4/ic_emoji_objects_normal_dark.png SHA1-Digest: YMEOl3+EnHVD+04WJgjLIXFrm6A= Name: res/drawable-xhdpi-v4/ic_app_protection_gray.png SHA1-Digest: /6PrYlU5CH9zIxTa9kmohiJ8Xmk= Name: res/drawable-hdpi-v4/ic_action_warning_red.png SHA1-Digest: M4Ki+A3MnsgSmiETmbzkaKBd0jY= Name: res/drawable-hdpi-v4/ic_info_outline_dark.png SHA1-Digest: NYBCWSND9m39u/8vziayfc01qDI= Name: res/drawable-hdpi-v4/ic_account_box_light.png SHA1-Digest: xx+Gzzcs1zzLeHYFn6HRmAj2v88= Name: res/drawable-hdpi-v4/ic_notifications_black.png SHA1-Digest: TugKLJ+BFDIZO0X3xAZztlvSsdo= Name: res/drawable-xxxhdpi-v11/icon_cached.png SHA1-Digest: 1YwCC2U/322ozak6+RBlTlTDUac= Name: res/drawable-mdpi-v4/fab_shadow.png SHA1-Digest: OSfdOYSWS2nNsDyeAGKqUW/NY3M= Name: res/drawable-xxhdpi-v4/switch_thumb_disabled_holo_light.9.png SHA1-Digest: iXB9Wp8Ev4e3k9Wg79Vv7yfO0fQ= Name: res/drawable-hdpi-v4/alert.png SHA1-Digest: k+gqwAY1F3AaClTmFDpa8cL1gDE= Name: res/drawable-hdpi-v4/ic_emoji_places_normal_light.png SHA1-Digest: g4NzbPe2I5wmoxSsOkoLHIDvFUY= Name: res/drawable-hdpi-v4/ic_reply_white_36dp.png SHA1-Digest: qG8B249RYqWmtpcR7dqP3lAuBR4= Name: res/drawable-xhdpi-v4/spinner_focused_holo_light.9.png SHA1-Digest: CGrl1FRXVxrvA14ueVH03Fn2em0= Name: res/drawable-xhdpi-v4/ic_create_white_24dp.png SHA1-Digest: 9l/Qnsghg6ESUm3rcMTUMtX/ESI= Name: res/drawable/conversation_list_item_read_background.xml SHA1-Digest: f5xdYCU0BaoUAhAzCv6IFIdB13o= Name: res/xml/preferences_appearance.xml SHA1-Digest: DRBO5iPjXkZYKyXOuof/dULm0xU= Name: res/drawable-xxhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png SHA1-Digest: /SHIbNyt1+Fo97bGAhsp65znrc4= Name: res/anim/abc_slide_out_top.xml SHA1-Digest: NM9nWh/XI2zag3rBwIXEqrpl9XA= Name: res/drawable-mdpi-v4/spinner_default_holo_light.9.png SHA1-Digest: s/npsTa4f6dHCangZu461npuSrQ= Name: res/color-v23/abc_tint_switch_thumb.xml SHA1-Digest: HPm3VkEuzmYKpgUXXHUspwEOEKk= Name: res/drawable-xxhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png SHA1-Digest: zkV9qOyIhi4vLRHjNhK5xl8gfkg= Name: res/color-v23/abc_tint_spinner.xml SHA1-Digest: X2/0Q6NoDfrYk6N/X7x1DbK4XK4= Name: res/drawable/design_bottom_navigation_item_background.xml SHA1-Digest: q/tAvUCKzH/tN0gPUEzccAp698k= Name: res/layout-v11/notification_template_big_media_custom.xml SHA1-Digest: KX1rENjUs85+ejNOUAYAl9Z7p7A= Name: res/drawable-v21/conversation_list_item_read_background.xml SHA1-Digest: lHqCczv9TdFvutPUbZ0CbjrHBe4= Name: res/drawable-mdpi-v4/ic_delete_black.png SHA1-Digest: A3F3BoFKYkG+kiaML4IoSYKbALI= Name: res/layout/conversation_list_fragment.xml SHA1-Digest: uH0eyxy/wXwDnv6FtjMMPSPj9Io= Name: res/drawable-xhdpi-v4/ic_notifications_black.png SHA1-Digest: OqKoWA5XngcH3MzOC07wT6/DgGc= Name: res/raw/whisper.store SHA1-Digest: XHW+g7lvAC9+4Celnl0Js28aCVo= Name: res/drawable-hdpi-v4/ic_emoji_recents_activated_dark.png SHA1-Digest: rUvpBOhj8S4eylPNtFccUQBNN1w= Name: res/anim/fade_scale_out.xml SHA1-Digest: Uir4/KEtcVOVxHtCmwcmNzM0Nnc= Name: res/drawable-xxhdpi-v4/ic_video_light.png SHA1-Digest: RYbv/stsAv9oTONUojTZJIztUpI= Name: res/drawable-hdpi-v4/ic_reply.png SHA1-Digest: yW8DB5L+UjcqFxvPb5iuS/mfNH8= Name: res/drawable-xhdpi-v4/ic_image_light.png SHA1-Digest: YHBTbc/9heYP6RqeLq9sXyJW6FY= Name: res/drawable-xxhdpi-v4/abc_textfield_default_mtrl_alpha.9.png SHA1-Digest: sNds9Ym0phYx3ALXo+MZX8xlc30= Name: res/drawable/conversation_item_header_background_dark.xml SHA1-Digest: 3zJGQhq7efNb8O1pcgs6FzHcZtw= Name: res/drawable/emoji_category_recent_dark.xml SHA1-Digest: eAK1NEcV0fHAEgwtw+fTu9BiJEg= Name: res/drawable-ldrtl-xhdpi-v17/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: P6e0iLoIQdVv5zYT47sluTSi/8U= Name: res/drawable-xxhdpi-v4/ic_emoji_symbols_normal_light.png SHA1-Digest: K1eqzy0NhAiQODx1UHyyoWU91Ds= Name: res/drawable-mdpi-v4/ic_forum_black_32dp.png SHA1-Digest: MnNIINOWIvcaYHrGk2rfw+yAVPA= Name: res/drawable-xxhdpi-v4/ic_lock_white_24dp.png SHA1-Digest: VdAOsL1D5/ItORL6K7CcwYggixM= Name: res/drawable-hdpi-v4/ic_contact_picture.png SHA1-Digest: gPwXrikYXs+yK3bZyZgFtAIDmmg= Name: res/drawable-mdpi-v4/ic_textsms_black_32dp.png SHA1-Digest: R83rBBoEwhhrp/iegHs2AvJtM6s= Name: res/drawable-hdpi-v4/ic_push_registration_reminder.png SHA1-Digest: dcBXqXnBBxTTh7oHuIxfc8KfTCk= Name: res/drawable-mdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png SHA1-Digest: fNoEDfJ2jcrqTWkxek2nAJgdC58= Name: res/drawable-xxhdpi-v4/spinner_pressed_holo_light.9.png SHA1-Digest: y35Cc9pdVLFODoXVqOPGVcSrZMs= Name: res/drawable/design_password_eye.xml SHA1-Digest: Ip+zp9WKcMYKDC/1FcIw9dGmhd0= Name: res/drawable-xxxhdpi-v4/ic_clear_white_24dp.png SHA1-Digest: 1bagW7s760FgyC2CyUuCe5/ziv4= Name: res/menu/media_preview.xml SHA1-Digest: fOX7zZBM/ljHhjRMGFudzioNsi4= Name: res/drawable-mdpi-v4/ic_emoji_emoticons_activated_light.png SHA1-Digest: E5wir/v8hkd9E5NTh9HqVC1BD+8= Name: res/drawable-mdpi-v4/switch_thumb_pressed_holo_light.9.png SHA1-Digest: VyxRoouO+Z7ITDC+bYAPridmWf4= Name: res/drawable-xxhdpi-v4/ic_scroll_down.png SHA1-Digest: ZcDqoZMsXZUUwEEg0N6+uWPRkJk= Name: res/drawable-hdpi-v4/ic_group_white_24dp.png SHA1-Digest: Ni/4uzTNcVuC9JFCauz6cg4390Y= Name: res/layout-v21/message_details_header.xml SHA1-Digest: gLk3IyEea/JbEnQK2ANAzT7EO0E= Name: res/drawable-hdpi-v4/abc_list_pressed_holo_light.9.png SHA1-Digest: +pi/Z1BDTC/eHcG86xxdoFAyukA= Name: res/drawable/abc_ratingbar_small_material.xml SHA1-Digest: /P2KXIWbMuyOgftOHbBQa8ym+uI= Name: res/drawable-xxhdpi-v4/abc_text_select_handle_right_mtrl_light.p ng SHA1-Digest: 2fShoeavJczbLrecvbStdNRWHBc= Name: res/drawable-mdpi-v4/abc_text_select_handle_middle_mtrl_light.pn g SHA1-Digest: IsZBJs79BBpAphfuhFcivjA1NpU= Name: res/drawable-xxhdpi-v11/icon_notification.png SHA1-Digest: yQfuhwUNRxNDirhNEoeb9xni0wo= Name: res/drawable-mdpi-v4/ic_menu_remove_holo_light.png SHA1-Digest: 5ird1K8096LmheKRN4rsyxZFjDw= Name: res/layout/abc_activity_chooser_view_list_item.xml SHA1-Digest: /DgA41m5NJLrwrcDEmzvCS9O1yw= Name: res/drawable-xxxhdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png SHA1-Digest: ZcL++/zGOpiMrBK+00MCCJiYQ3Q= Name: res/color/text_color_dark_theme.xml SHA1-Digest: pR2obPIva/G2jowyPfTM8RXmLeU= Name: res/drawable-xhdpi-v4/abc_textfield_search_default_mtrl_alpha.9. png SHA1-Digest: P2nXckVhoat9mgVUXkNB8jHu5sU= Name: res/drawable-xhdpi-v4/ic_emoji_symbols_normal_light.png SHA1-Digest: cTSoOzJv61D89v2GDVBHmByVH3s= Name: res/drawable-mdpi-v4/ic_badge_24dp.png SHA1-Digest: gnFSqIT+E5kIsh+Br09jRekEuaY= Name: res/drawable-xxhdpi-v4/ic_delete_black.png SHA1-Digest: MNYVDUN/Gt9+uDpcHLyR88U2rFE= Name: res/drawable-xxhdpi-v4/ic_reply_white_36dp.png SHA1-Digest: R4DMczvl55BvJN5JeI+Brs0gsdY= Name: res/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_000.png SHA1-Digest: XS4QSKcuwFMyWTP/Zt+tOFsl9ak= Name: res/drawable-xxxhdpi-v4/ic_circle_fill_white_48dp.png SHA1-Digest: rISqysqox9AU2cIf7NlrhI8t5tM= Name: res/drawable-xhdpi-v4/dialog_full_holo_light.9.png SHA1-Digest: Dz8isbAUH34hYBe1HIB8PQUSGO4= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_972 SHA1-Digest: wAYIltvc6+i6ruNDh7sN4H7KQtQ= Name: res/layout-v16/audio_view.xml SHA1-Digest: B4R1LyV+PN0MHQruAVIKwxhSMEY= Name: res/drawable-v21/design_bottom_navigation_item_background.xml SHA1-Digest: 2jtUIzAVfdNNdYjQbhXKGtwbJK0= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_971 SHA1-Digest: hXcyXUcpEkkPh5oyJGLDlCa0gj4= Name: res/drawable/conversation_list_divider_shape_dark.xml SHA1-Digest: ktw2iwGSzvnpAHSYqkCzwAl1IDc= Name: res/layout-v22/abc_alert_dialog_button_bar_material.xml SHA1-Digest: 9PCUgjPrwCbXRSWb3dRs7CNBrME= Name: res/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png SHA1-Digest: IG999C1958jP76m6s0v2EDG8eAk= Name: res/layout/push_recipients_panel.xml SHA1-Digest: 2jGWKD1zuA9OasOhzoeRBstw/gs= Name: res/layout/blocked_contact_list_item.xml SHA1-Digest: CaLC/vO/gBnjCuEBJxMq3Q5IWbE= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_595 SHA1-Digest: jBKKEzLak9mybfD0suOcI3/gILA= Name: res/drawable/emoji_category_symbol_light.xml SHA1-Digest: V7rs1fShvGaZC0DqybpyHQ7R8zs= Name: res/drawable-hdpi-v4/ic_emoji_emoticons_normal_dark.png SHA1-Digest: FtvuHhnn2rWRI1W4eDnkGxOW7mI= Name: res/drawable-xxhdpi-v4/abc_list_pressed_holo_dark.9.png SHA1-Digest: LdyLROvWFgig9Vsgsaypd9fZOJY= Name: res/drawable-xhdpi-v4/ic_emoji_nature_activated_light.png SHA1-Digest: srXdxRF7zmsNW2/pq9U8k9+Fp0g= Name: res/drawable-xhdpi-v4/icon_cached.png SHA1-Digest: JuqwHlsBI7MPpbHGQKe1oTsXs/8= Name: res/drawable-hdpi-v4/switch_bg_disabled_holo_light.9.png SHA1-Digest: 8JhypYeb6T5pv+9W/UUzEOwHvyI= Name: res/drawable-mdpi-v4/ic_emoji_nature_normal_dark.png SHA1-Digest: nHzm3ieSQiM3OHi93coXGldH6c8= Name: res/drawable/ic_backspace_light.xml SHA1-Digest: SXT6/wR3ZvR4BpzLlepVtpYeEbg= Name: res/drawable-xhdpi-v4/ic_forum_black_32dp.png SHA1-Digest: wxl+jLneFHgHmn5j2hd4PPtxw0E= Name: res/drawable-hdpi-v4/ic_emoji_places_activated_light.png SHA1-Digest: sTP5McVyAvCYWJ9qwSR1qGkfkqM= Name: res/drawable-hdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png SHA1-Digest: o7+2UpUxcOZYQ4J4x3i56OSAwrs= Name: res/drawable/rounded_rectangle.xml SHA1-Digest: SLpT6+Ji9tdT8wIJFuZ4ixlh0iY= Name: res/drawable-xhdpi-v4/ic_lock_white_18dp.png SHA1-Digest: Oby0J/jOXhF12uk0Zoy11OxxTdY= Name: res/drawable-hdpi-v4/lockscreen_watermark_light.png SHA1-Digest: AXK2KP2ApxC2Z2yzuty9it93QuI= Name: res/layout/conversation_activity_attachment_editor_stub.xml SHA1-Digest: elQymJQ2LcmEQwG1CIaQbQUK270= Name: res/drawable-hdpi-v4/ic_lock_light.png SHA1-Digest: 6xsBKtq/dlPGkcu4hdJHkMAQhd8= Name: res/drawable-xhdpi-v4/ic_forum_grey_32dp.png SHA1-Digest: YmNZAvF1dw49FR+n3p2+UEasp5E= Name: res/layout/color_fragment.xml SHA1-Digest: R48hoN017xeVcNLmubDVpBqNrl8= Name: res/drawable/widget_unread_count_background.xml SHA1-Digest: 1176myGDj2tXsvH5TzAG82aondY= Name: res/drawable-xxxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png SHA1-Digest: 3fhmc4V2nmgfmXePbvfRvhgIwJY= Name: res/drawable-v21/circle_touch_highlight_background.xml SHA1-Digest: o2UQBTWYlJ9QXTjKaXy9nlvVkd0= Name: res/layout-v21/recipient_preference_activity.xml SHA1-Digest: 9yFPBf2+N+0/IgrEZT9d7AG7VvI= Name: res/drawable-mdpi-v19/switch_thumb_pressed_holo_light.9.png SHA1-Digest: CFRP5NlSZZOns7feha7lGxerPGg= Name: res/drawable-xxhdpi-v4/ic_video_dark.png SHA1-Digest: h2fDFLYAXstx7xbgiUFoiVTCyQk= Name: res/drawable-xxxhdpi-v4/icon.png SHA1-Digest: WtQHPcTXiUt+2Q8CVkBaKIpO47M= Name: res/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005 .png SHA1-Digest: ihH9NNjybEcS1mrq0UNzdyMwkLM= Name: res/drawable-ldrtl-hdpi-v17/ic_send_white_24dp.png SHA1-Digest: HIyXGcfdgw5bBXdBaJ6Mw8gbJlc= Name: res/drawable/emoji_category_objects_dark.xml SHA1-Digest: xmZDgPBPRHkIReRRxihiLYLA1ak= Name: res/drawable-xxxhdpi-v4/ic_archive_white_48dp.png SHA1-Digest: +b2FPCB/qYlbwGosHhZSn/gq1hk= Name: res/drawable-xxhdpi-v4/fab_shadow_mini.png SHA1-Digest: oBYy1KBTteK/1XvroCshzukQ3rg= Name: res/layout/conversation_item_received_audio.xml SHA1-Digest: wmLTxioffAsJsb4h8fuhcIGuG7Y= Name: res/drawable-mdpi-v4/sent_bubble.9.png SHA1-Digest: oWvWoFrpRQdCV4lAcWNy0a6DydY= Name: res/drawable-xxhdpi-v4/ic_attach_white_24dp.png SHA1-Digest: 7SvJje1R/bzW2htsBKRw0unxWCs= Name: res/drawable/compose_background.xml SHA1-Digest: 77YF5OthBZArbShPc+i58Aql40g= Name: res/drawable-mdpi-v4/ic_content_copy_dark.png SHA1-Digest: EiNHa+nhPyWGj0gC2+oLnBXhcxw= Name: res/layout/date_picker_view.xml SHA1-Digest: AtS3nascwyJBVE+H4vD2IN7fi7o= Name: res/drawable-mdpi-v4/dialog_full_holo_dark.9.png SHA1-Digest: q3ptg6feoBdTrvEzjNt9NgzKcHM= Name: res/drawable-mdpi-v4/ic_emoji_recents_normal_dark.png SHA1-Digest: aXPZFvyR6dEDTGYuXzmdiwTTM4s= Name: res/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_015.png SHA1-Digest: zeU1JSNmPm7v39XNkaEkis5yDOQ= Name: res/drawable-mdpi-v4/abc_ic_star_half_black_36dp.png SHA1-Digest: Ql4KDXZpZ5PFXDlF3miVqQ8Z5DA= Name: res/drawable-mdpi-v4/divet_lower_right_dark.png SHA1-Digest: j/2GkVcY+hoTFH44wDfwNjcB4DM= Name: res/drawable-xxhdpi-v4/ic_image_light.png SHA1-Digest: vhhilPVoXIJw10WfMfgAz/q30E0= Name: res/menu/contact_selection.xml SHA1-Digest: BPAWUA3FKzBZVyeDk6rz7ZTVj6U= Name: res/drawable-xhdpi-v4/ic_menu_search_holo_dark.png SHA1-Digest: gdLsJp9wkONi0h1ARQRCjjgfXIg= Name: res/color/abc_tint_switch_thumb.xml SHA1-Digest: 6XjG56K16rD+RUsRUBNur2NAk1A= Name: res/drawable-hdpi-v4/dialog_full_holo_dark.9.png SHA1-Digest: gYRi3qcewvv4DpgH7WRa5oontHM= Name: res/drawable-hdpi-v4/ic_backspace_disabled_light.png SHA1-Digest: 4DrNtujXsHOnOZbH5z3nT9s2ZZs= Name: res/drawable-xxhdpi-v4/ic_reply.png SHA1-Digest: qG0hBkDSQm7dAysBPD1VzEHexIE= Name: res/drawable-xxhdpi-v4/ic_send_insecure_white_24dp.png SHA1-Digest: ZxJY268JNqO/9atssu9hBquS+pc= Name: res/drawable-hdpi-v4/ic_message_white.png SHA1-Digest: IgwqNHZrN/XeY8WZvNKXVAD40QI= Name: res/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.pn g SHA1-Digest: uMxaAPN53ynLGvBOkqlsfufYJEY= Name: res/layout-v17/abc_popup_menu_header_item_layout.xml SHA1-Digest: TLtuMry21yP1ZaUx8BGqmrhC+4A= Name: res/layout-v17/notification_action.xml SHA1-Digest: HZT619G5p+wXxhjri4eaIpvZo1Y= Name: res/drawable/background_pane.9.png SHA1-Digest: DebSplvlRk4ibCyCE6fVr4Rye5w= Name: res/layout-v16/conversation_item_received.xml SHA1-Digest: cbsB8+EW605eLAe9v+hToLruFl0= Name: res/drawable-xhdpi-v4/ic_arrow_forward_light.png SHA1-Digest: FwHQb1/0kv+VMlsrHkrzqvVHIyc= Name: res/drawable/emoji_category_people_light.xml SHA1-Digest: CFjiHrhvyZtBoOrjP6LotQu2o8I= Name: res/layout/notification_template_media_custom.xml SHA1-Digest: aAiITkLuFWAAa6RLNuhXTyKbze0= Name: res/drawable-xxhdpi-v4/ic_error_red_18dp.png SHA1-Digest: 4/XTIknpEfHwIgBUeiE09u75i9c= Name: res/drawable-xhdpi-v4/ic_forward_white_24dp.png SHA1-Digest: lBhMg7uuAL2TsIpM5wQxqtqz1yI= Name: res/drawable-xxhdpi-v4/ic_keyboard_white_24dp.png SHA1-Digest: //m/4n5G6FBA7MbrhujVAHgUTjs= Name: res/drawable-xhdpi-v4/ic_message_black.png SHA1-Digest: C7LJDa4aEbvOPOxhDwvHcnBLuUU= Name: res/drawable/emoji_category_recent_light.xml SHA1-Digest: sqTG5bnucpspdMl+YKAO73VvcAE= Name: res/drawable-xxhdpi-v4/ic_app_protection_gray.png SHA1-Digest: wd1wvXlTsp+e/0GVz7YL52iYnt4= Name: res/anim-v21/design_bottom_sheet_slide_in.xml SHA1-Digest: P5+oT0+JVe2tOF/nHLy58E5nCQg= Name: res/drawable-xhdpi-v4/list_selected_holo_light.9.png SHA1-Digest: U9jUfNg6H8NNFEsehvr9ue8J/zc= Name: res/drawable-xhdpi-v4/ic_send_insecure_white_24dp.png SHA1-Digest: BjmpEJVy1wBNO+c6Sh+AygI1M7c= Name: res/drawable-hdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png SHA1-Digest: Eh+ZTEk9nWC3r6F65kTTCqFuv/0= Name: res/drawable-xhdpi-v4/notification_bg_normal_pressed.9.png SHA1-Digest: R13cV9f14qtyCUzpc/FGqOIcssU= Name: res/drawable-xxxhdpi-v4/ic_scroll_down.png SHA1-Digest: uTdB/76suYhkMGS09Fb5rYUx/u0= Name: res/drawable-xxxhdpi-v4/abc_text_select_handle_left_mtrl_light.p ng SHA1-Digest: g4xmf1zIMEOQxLCN5PJ4U0Uk9uc= Name: res/drawable-mdpi-v4/ic_app_protection_black.png SHA1-Digest: YYlTW8ijNJvUYMwoi6Bils3c7ps= Name: res/drawable-xxhdpi-v4/ic_error_white_18dp.png SHA1-Digest: G9twTPy0ao8j5wNFULY3l1ZJPTU= Name: res/drawable-xxhdpi-v4/ic_content_copy_light.png SHA1-Digest: 1uiDQ/MALB8aE//rdO7zcVmPiaA= Name: res/layout/abc_screen_toolbar.xml SHA1-Digest: Rsk+wUgGh3cQxMiDvRqTgBypnUE= Name: res/drawable-xxhdpi-v4/abc_ic_star_half_black_48dp.png SHA1-Digest: kXuE8rc+VUrWq1VBZznOulaTh2g= Name: res/layout/database_upgrade_activity.xml SHA1-Digest: rL6MNoPR3el/9nr/O35nh8wq07w= Name: res/drawable-v11/emoji_category_symbol_dark.xml SHA1-Digest: R05URkn92Ah2uD+XESV+rMC8oq8= Name: res/drawable-mdpi-v4/ic_download_circle_fill_white_48dp.png SHA1-Digest: lWCsGRplQ/8lYectnUFCcWs4Uuc= Name: res/drawable-xxxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: hlPg0mO16g5nYlkb2LmahKOZAG8= Name: res/drawable-xhdpi-v4/ic_select_all_white_24dp.png SHA1-Digest: ZI18NdfQH1mcaGkRA9XM9EVMq1M= Name: res/drawable-xhdpi-v4/switch_bg_disabled_holo_light.9.png SHA1-Digest: R8GV7kb6QAwT3efgJTdnB9VOJAo= Name: res/layout/transfer_controls_view.xml SHA1-Digest: I8RMTIKmQOzTY3MNCUDaSiq0Z4w= Name: res/drawable-xhdpi-v4/icon.png SHA1-Digest: ZX0Na7vYQj2M/TBdj+eQoSk7YR8= Name: res/drawable-mdpi-v4/sms_system_import_icon.png SHA1-Digest: UTztdlNiwCPOus9KMOoPzE8U8eI= Name: res/drawable-xxhdpi-v4/abc_text_select_handle_left_mtrl_light.pn g SHA1-Digest: dTW+TBt3P2ZDHiurAQlmTb3QAuc= Name: res/anim/slide_from_right.xml SHA1-Digest: TfPszWadpReLtTNx99WycfoyUO4= Name: res/drawable-mdpi-v4/ic_emoji_places_normal_light.png SHA1-Digest: c14K5X5vUSiK8A+vXcWcLhsJFeY= Name: res/drawable-xxhdpi-v4/switch_thumb_pressed_holo_light.9.png SHA1-Digest: i+IZCPf+mTAbIWLZMAie5xMxUZ0= Name: res/drawable-mdpi-v4/textfield_default_holo_light.9.png SHA1-Digest: HHVoeIoiPaZGrfV/J675mX9mKZE= Name: res/layout/design_layout_snackbar.xml SHA1-Digest: 9Td2r2BXeaOLyxj36W5GtBQQHX8= Name: res/layout-v17/export_fragment.xml SHA1-Digest: uBKGKpWuKPDpVUYf+T5f9RYou4I= Name: res/drawable-hdpi-v4/ic_menu_add_field_holo_light.png SHA1-Digest: 2TfxfYx1ixLVxj6ZQADjYFv3XqQ= Name: res/drawable-xxhdpi-v4/ic_unlocked_white_24dp.png SHA1-Digest: tKD7bJUASCeM+QFUcF+GJcbYNpo= Name: res/layout/reminder_header.xml SHA1-Digest: GBOEd5G8AKVMWM3wGZZU7a6B8O8= Name: res/drawable-xxhdpi-v4/ic_send_push.png SHA1-Digest: Qh+qDzj+m3I8RG1NHZdesZuA/0Y= Name: res/drawable-mdpi-v4/ic_emoji_people_normal_light.png SHA1-Digest: 6Bv0SGIXD5AN9PJr00X2y3ipc7Y= Name: res/drawable-xxhdpi-v4/ic_image_dark.png SHA1-Digest: tmxPWgeZj3+N0xIj8vNZb01aod8= Name: res/drawable-xhdpi-v4/ic_done_white_18dp.png SHA1-Digest: qd1giIR7/BAdurQ26Vj4iyghuD0= Name: res/drawable-xxhdpi-v4/list_longpressed_holo_light.9.png SHA1-Digest: CBiyFOEOkN4G8LwWwkREd/FYJhs= Name: res/drawable-hdpi-v4/notification_bg_low_normal.9.png SHA1-Digest: cZq9c0ns0DMcrd6DYpvD35Sj9Q0= Name: res/drawable-xhdpi-v4/ic_download_circle_fill_white_48dp.png SHA1-Digest: nwZ2f7lDQzw+7Jrc2oyk8h38Zlw= Name: res/drawable-xxhdpi-v4/ic_send_sms_secure.png SHA1-Digest: Uv+tmwIFjiRqwMHnsGdsneBKHek= Name: res/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_015.png SHA1-Digest: 9BhkClp5dEf9SiNlkJTeUiPUGSo= Name: res/drawable/abc_list_selector_background_transition_holo_light. xml SHA1-Digest: GmT6IMAyeHMrj3HfwELKNXx7GjY= Name: res/drawable-xhdpi-v4/ic_arrow_forward_dark.png SHA1-Digest: utEb2enp9ebHHkI2x3Bwiti0gHk= Name: res/layout/recurrencepicker_freq_item.xml SHA1-Digest: /bPgQHwiLQ9Sj/1Q05VTg6GbZ0s= Name: res/drawable-xhdpi-v4/notification_bg_low_normal.9.png SHA1-Digest: SAWMxhraPrV6SXLtk3Qi4BJou40= Name: res/drawable-mdpi-v4/abc_text_select_handle_left_mtrl_dark.png SHA1-Digest: k4RjcVv0axodcYtXz1im5Yqlkxo= Name: res/drawable-hdpi-v4/ic_content_copy_dark.png SHA1-Digest: ys94tVvvZkfW+lyZuguDWocDf+E= Name: res/layout-v17/notification_template_big_media_narrow.xml SHA1-Digest: Fk2nZNget2CoihxhqQPC8OhQqjA= Name: res/drawable-mdpi-v4/ic_volume_up_dark.png SHA1-Digest: IUGVAnqQbPJ3mBqkEjDNZxObb0s= Name: res/drawable-mdpi-v4/ic_volume_off_white_18dp.png SHA1-Digest: 6m960Tsqk6ehOSk4ZX0ELHr5q7w= Name: res/drawable-xhdpi-v4/ic_audio_dark.png SHA1-Digest: Xcsn7AYq4zZ2cUnPpjkHLg4+zBE= Name: res/color/abc_primary_text_material_dark.xml SHA1-Digest: oHZ5jco2WyPUASIcKjDwdNuqMsQ= Name: res/drawable-hdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png SHA1-Digest: QT06M8jIu5PbB6orRZr5qtxv3oI= Name: res/layout/notification_template_media.xml SHA1-Digest: jOsIQ3hR78h017hqQi0gPfxMzkA= Name: res/drawable-xhdpi-v4/list_focused_holo.9.png SHA1-Digest: OMRGZ9NZcF46RZNFPM1PA5UDfDk= Name: res/drawable-xhdpi-v4/ic_emoji_places_normal_dark.png SHA1-Digest: xIUT2cYzPVsHZ1uWdjqvDm5VgEU= Name: res/drawable-hdpi-v4/list_selector_background_selected.9.png SHA1-Digest: hwr6dZUS/iDuJ78l2mF0/dfJL+8= Name: res/drawable-xxhdpi-v4/transfer_controls_background.9.png SHA1-Digest: j7LzaIHFeP182GCKU70DBB8X2+Q= Name: res/drawable-hdpi-v4/ic_call_split_white_24dp.png SHA1-Digest: tFTy8mgFHCjTf1q4a4uHGHBLFds= Name: res/layout-v13/select_dialog_singlechoice_material.xml SHA1-Digest: Yb6SWeDe01r7nK02f9+TLBlVMcU= Name: res/layout-v17/notification_template_custom_big.xml SHA1-Digest: G4b1e/mdGTs1PGLxC2sGKae1ejg= Name: res/drawable/conversation_item_sent_indicator_text_shape_dark.xm l SHA1-Digest: wrHIuc38MrDLiUImGUAlWDTWVoY= Name: res/drawable-hdpi-v4/abc_text_select_handle_middle_mtrl_light.pn g SHA1-Digest: UrzeEED9vrKPkwN3GrI1ylsIFuA= Name: res/drawable-xxhdpi-v4/abc_ic_star_half_black_36dp.png SHA1-Digest: Yf0xjUFhN6YR8IMpV2zk0K2xzhE= Name: res/color/abc_tint_switch_track.xml SHA1-Digest: vVHnK21A9Mg9yvzqb69+lOoo4jA= Name: res/drawable-xxxhdpi-v4/ic_send_insecure_white_24dp.png SHA1-Digest: 59SBcPoQcl+MHHIBe2/jSRqjqJA= Name: res/drawable-mdpi-v4/telephone.png SHA1-Digest: XXO2Fhva42p/Gm3ltGeWU8qwAJY= Name: res/drawable-mdpi-v4/ic_save_all_white_24dp.png SHA1-Digest: 3sA7d4yR0C3cAnFK+KE20ix4YEM= Name: res/layout-v21/notification_action.xml SHA1-Digest: ARX2L+8GodSYDBTJEFEWaVfJjOQ= Name: res/drawable/navigation_empty_icon.xml SHA1-Digest: NnWYc105PNs86W5i6nWhSR7zVNs= Name: res/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png SHA1-Digest: pekxWTKwrzIagiU2Ssj+otR4tkc= Name: res/drawable-xhdpi-v4/ic_emoji_recents_activated_dark.png SHA1-Digest: jjdYBmUugs3Tk1VIJ0TSpMA8AP4= Name: res/drawable-xxhdpi-v4/sent_bubble.9.png SHA1-Digest: KdAs5emUzdEgIGy2K1/+aDjasdE= Name: res/drawable/switch_track_holo_light.xml SHA1-Digest: AjCjiobmxUpXAbj/hs7BwEilUHc= Name: res/drawable-xxhdpi-v4/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: 396cLFH6GmIk+fmw4WU+kcdHCHo= Name: res/drawable-hdpi-v4/ic_emoji_emoticons_normal_light.png SHA1-Digest: 62CMvfSEQQgcBGH4682D4vHVUCo= Name: res/layout/abc_activity_chooser_view.xml SHA1-Digest: t8SNZCpxzOjFOaLI66GA4qvdQq4= Name: res/drawable-mdpi-v11/icon_cached.png SHA1-Digest: cvYOUo32nLmnfiJVHyijYXqpToI= Name: res/drawable-xhdpi-v4/abc_ic_menu_share_mtrl_alpha.png SHA1-Digest: yIiP4Gy0mn3DHVTS9m4D1uLmr6U= Name: res/drawable-xxhdpi-v4/ic_menu_search_holo_light.png SHA1-Digest: l0Kga/HF7gV0KQUMmD0RjUjp4rQ= Name: res/menu/key_scanning.xml SHA1-Digest: loeijMiaLCWeBEo9xiY+e1FGiPM= Name: res/layout-v16/conversation_item_sent.xml SHA1-Digest: P+T7bQeZyVjHk6c5iXcCT0vC+bI= Name: res/drawable-hdpi-v4/ic_emoji_nature_normal_dark.png SHA1-Digest: RRavhILeQiOlyTcq78HU79sw1P4= Name: res/layout-v17/notification_template_big_media_custom.xml SHA1-Digest: uUmG0smYBsEQ28ifQcPFFbFm66I= Name: res/drawable-xhdpi-v4/ic_mood_white_24dp.png SHA1-Digest: IYAUb6e9a3LcyUnsSzM7yHj3ITw= Name: res/layout/media_view_remove_button.xml SHA1-Digest: UTuCQxMaWihUkbRE3VjO4AgIWi0= Name: res/drawable/conversation_attachment_close_circle.xml SHA1-Digest: wT4qc1C3F6xw0uBUEE38D0Eh7A0= Name: res/drawable-hdpi-v4/ic_push_gray.png SHA1-Digest: JoLOR2nABDcMsPnqne437AXo5yE= Name: res/animator/bottom_pause_to_play_animation.xml SHA1-Digest: sGztQN6FsfBHdy/lArM6hyYwIhI= Name: res/drawable-xhdpi-v4/ic_emoji_emoticons_normal_light.png SHA1-Digest: +Old9N2rLprS7oZW6xLg/meIxww= Name: res/drawable-xxhdpi-v4/switch_bg_focused_holo_light.9.png SHA1-Digest: pvzTB0cC/y6EDmF11VDkkGTsOqk= Name: res/layout/empty2.xml SHA1-Digest: IM3rg1Lz0mEteG8vDVjHrpIkzV0= Name: res/layout/design_menu_item_action_area.xml SHA1-Digest: MAjBXF+TiqbN8ABwvCY22FbLaDM= Name: res/drawable-v11/emoji_category_symbol_light.xml SHA1-Digest: TykgFRJ+5KR1Q9rSNbPwsAegWu8= Name: res/layout-land/calendar_date_picker_dialog.xml SHA1-Digest: tb8TxI+kAHvBJry4Ghw9tAXiPxU= Name: res/drawable/ic_backspace_dark.xml SHA1-Digest: BT434abXhMMPnT3sQbuMrtXn6yE= Name: res/color/abc_tint_spinner.xml SHA1-Digest: tDeuAW8Dun0MkfNI/9LHZ3ZFXuI= Name: res/color-v23/abc_tint_btn_checkable.xml SHA1-Digest: 74/2TZdO684fYS/kzfIxIDh0yVc= Name: res/layout/keyboard_right_drawable_with_header.xml SHA1-Digest: Yatfi7l8YS8INf3wfF2NE3OVBow= Name: AndroidManifest.xml SHA1-Digest: yEqnaWsY+ffai3NpIX8t+cW0GRQ= Name: res/drawable-xxxhdpi-v4/ic_reply_white_36dp.png SHA1-Digest: Y4QTK9oU2ML5dRCfNCdOATIDujg= Name: res/drawable-hdpi-v9/icon_notification.png SHA1-Digest: k3ZlgFUY9RiM+5WNMCj0169Vlgc= Name: res/drawable-xhdpi-v4/sent_bubble.9.png SHA1-Digest: PpPeKJZDE+OFnELluMlghGwM1wY= Name: res/drawable-mdpi-v4/list_selector_background_selected.9.png SHA1-Digest: //pjb3Hl60ZanslZW59fxT/C/gg= Name: res/layout/fragment_submit_log.xml SHA1-Digest: hw6soqKamGiIiqb8sqEvUA2tGgU= Name: res/drawable-mdpi-v4/ic_lock_white_24dp.png SHA1-Digest: 9pbZC7NMhOv75QatAANgs5HBSpA= Name: res/drawable-xhdpi-v4/textfield_disabled_holo_light.9.png SHA1-Digest: u+PyBkFnG5V7GBXX1PAbySEqGP4= Name: res/drawable-mdpi-v4/ic_push_gray.png SHA1-Digest: g+vrd4PU18sQ/Z//9zh2tXDQ9nw= Name: res/color/abc_tint_default.xml SHA1-Digest: KX2YED2uqRthphmAhA6odjSt14g= Name: res/drawable/pause_to_play_animation.xml SHA1-Digest: WCcSuzMqsw/4vaNlj3OkwpjVTBo= Name: res/drawable-xxhdpi-v4/ic_create_white_24dp.png SHA1-Digest: tpDx7GyBvnabfQ3361ZHAOEVAIs= Name: lib/mips/libcurve25519.so SHA1-Digest: CufGtSWo6HZ8M6DWgtf0VYskkGg= Name: res/drawable-hdpi-v4/ic_attach_white_24dp.png SHA1-Digest: YJYWi1bI9IdyPhe7ZT5nEf7VehU= Name: res/drawable-mdpi-v4/ic_emoji_recents_normal_light.png SHA1-Digest: nb1zA7N7vLrBxBHe5faIc24dTMg= Name: res/drawable/touch_highlight_background.xml SHA1-Digest: /sqbdO0xB1rR0ofZ71nWtka+gMY= Name: res/layout-v11/notification_media_action.xml SHA1-Digest: CkAaakbqf4jYotOJaDjwZg8NsTg= Name: res/drawable-xhdpi-v4/ic_play_circle_fill_white_48dp.png SHA1-Digest: f8UVK+xSlFWxkHIvpTElUedq8VA= Name: res/drawable-xhdpi-v4/ic_warning_light.png SHA1-Digest: acg6MQqWyvXbYtlk9aNyEyEGL30= Name: res/drawable-xxhdpi-v4/ic_forum_grey_32dp.png SHA1-Digest: /nZ1YZLf1VmyRdCt9k74shgeXlg= Name: res/animator-v11/rotate_90_animation.xml SHA1-Digest: YzPrKibA72xHWsJAnRDFda8WNqk= Name: res/drawable-xxhdpi-v4/divet_lower_right_dark.png SHA1-Digest: fsDH1djAo+V3Wbha9C0rOfFghtk= Name: res/drawable-xhdpi-v4/received_bubble.9.png SHA1-Digest: +GeQlo7tx1PQjC4nJMfJ9I7o6aM= Name: res/drawable-hdpi-v4/ic_send_secure_white_24dp.png SHA1-Digest: 9uwPYUkkYlZH9ngamLedRZ+EM6I= Name: res/drawable-xhdpi-v4/design_ic_visibility.png SHA1-Digest: 9iQsdMe2atN8AlG2+sNkMwp+BjA= Name: res/drawable-xxhdpi-v4/ic_emoji_nature_activated_dark.png SHA1-Digest: J14xvGG8Jn1ZcMQHBzUWkHdkCLs= Name: res/drawable-v21/conversation_list_item_unread_background.xml SHA1-Digest: 7gHZRkfxjXAe/fGi+G9jCLZw37o= Name: res/drawable-ldrtl-mdpi-v17/ic_send_white_24dp.png SHA1-Digest: hE99BQWsYUraZQ+dpCLDCAPIdvE= Name: res/drawable-mdpi-v4/ic_emoji_flags_normal_dark.png SHA1-Digest: Qj/u3uhxRZP+VK/+Z5TGEFvOtNI= Name: res/drawable-xhdpi-v11/icon_cached.png SHA1-Digest: a57NxIxp4tGdjMF/naYYHgybgGE= Name: res/drawable-xxhdpi-v4/abc_text_select_handle_left_mtrl_dark.png SHA1-Digest: oVBkRUE6XhIW4dAoioh5/X56qUE= Name: res/drawable-sw600dp-xhdpi-v13/ic_backspace_disabled_light.png SHA1-Digest: tv7wRXKOl58hVFrG657jIAWJzDg= Name: res/layout-v13/database_migration_activity.xml SHA1-Digest: uZW5xzIg7D1XBqb2SyNTg9x5pWs= Name: res/drawable-xxhdpi-v4/ic_movie_creation_light.png SHA1-Digest: vks1kru2H338wqM7+eoTP2j1oEA= Name: res/drawable-hdpi-v4/ic_add_white_24dp.png SHA1-Digest: /YXYDHyfXqSLJmVDrTIcjaj35eE= Name: res/drawable-hdpi-v4/fab_shadow.png SHA1-Digest: JTWwMd80lcUi3H6QGk62H9WmcBg= Name: res/drawable-mdpi-v4/ic_info_outline_light.png SHA1-Digest: MZjZJ+M6RzY24PmB/ONe540BoKk= Name: res/drawable-v21/conversation_list_item_unread_background_dark.x ml SHA1-Digest: GZOfRbPnDcJsl6tmJ41ksNjD0XY= Name: res/layout-sw600dp-v13/three_keys_view_right_drawable.xml SHA1-Digest: lND2RP8LK/DKsynRSpsFQrr9K+g= Name: res/drawable-xhdpi-v4/ic_brightness_6_gray.png SHA1-Digest: 9bGv8BWdf+mrcvSHb+VARalrHjc= Name: res/anim/slide_to_top.xml SHA1-Digest: 45OutUfVJ6qV4vsLcKjIbCltGPU= Name: res/drawable-v11/emoji_category_nature_light.xml SHA1-Digest: WNvdJFbi4VBwB7SSWnmYl43ftoM= Name: res/drawable-v21/design_password_eye.xml SHA1-Digest: 0z5lKVTTsmwzIox9AxI2XZDgt/4= Name: res/drawable-xhdpi-v4/abc_text_select_handle_left_mtrl_light.png SHA1-Digest: skXEcXSNH1T9DL33yZF7Pe+gkCc= Name: res/drawable-xhdpi-v4/ic_emoji_emoticons_activated_light.png SHA1-Digest: 5Gd3WGYWfnau8ma9mz9V0RjA2Zg= Name: res/drawable-xhdpi-v4/ic_delivery_delivered_dark.png SHA1-Digest: vACgicm9pTLjob2y4F7qkoiYdos= Name: res/drawable-xxhdpi-v4/abc_list_divider_mtrl_alpha.9.png SHA1-Digest: 1Dd/0JZBbJ0v3ZcNgNK8NWwPcLo= Name: res/drawable-xxxhdpi-v4/ic_play_circle_fill_white_48dp.png SHA1-Digest: 6wwUtiEbwiOuXIGZCDz1IlkdSGA= Name: assets/fonts/Roboto-Light.ttf SHA1-Digest: z9omPT1JG8UmPzMe032DUuqIgHc= Name: res/drawable-xxhdpi-v4/ic_send_sms_insecure.png SHA1-Digest: T1VVudRvASxwRfD1anzbGdct2DE= Name: res/drawable-xxhdpi-v4/ic_save_all_white_24dp.png SHA1-Digest: he+Kvp5QLDr1RPYg7x/ZSOFWVco= Name: res/layout/abc_alert_dialog_title_material.xml SHA1-Digest: 15Rl3f2cyYvCDpkFuGx+r5p0zMo= Name: res/drawable-mdpi-v4/abc_scrubber_track_mtrl_alpha.9.png SHA1-Digest: fCw4/3GZJ6HvBRrlhVpfPdRbS48= Name: res/drawable/spinner_background_holo_light.xml SHA1-Digest: h5UzvSzmgiVAUm2lW5ae09Igvf0= Name: res/drawable-xhdpi-v4/fab_shadow_mini.png SHA1-Digest: VF4tJFCsvve+Gk0QaTUTLoxGkZo= Name: res/drawable-xxhdpi-v4/abc_ic_star_black_36dp.png SHA1-Digest: LegIEjffnk8xxS9xljbMaDsxURM= Name: res/layout-v17/abc_search_view.xml SHA1-Digest: 6+X6GtfKSsqxyFGD1z/FhfRI5rE= Name: res/drawable-hdpi-v4/ic_missing_thumbnail_picture.png SHA1-Digest: B+inUZoT1Xta+eKNJBuZ2x79+rQ= Name: res/drawable/conversation_list_item_unread_background.xml SHA1-Digest: wzsYDq0L5HIGF5GjqG4UJX/NH1c= Name: res/drawable-mdpi-v4/ic_emoji_objects_activated_light.png SHA1-Digest: Rl28OE1/+7+rsWUbkursyYvnPvM= Name: res/drawable-hdpi-v4/abc_textfield_search_default_mtrl_alpha.9.p ng SHA1-Digest: VtmcSWaUIf6+DhHt/mnXkgUFXH4= Name: res/xml/badge_widget_provider.xml SHA1-Digest: pV2Kn2jIi0wOfShx2RGl70hlFzk= Name: res/drawable-ldrtl-xxxhdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.pn g SHA1-Digest: ogkt/uGm2JWp22bfH9vZmG/CmMc= Name: res/drawable-xxhdpi-v4/ic_badge_24dp.png SHA1-Digest: 5JLtGA2KxCBOAd9PqCiTCrwnS1k= Name: res/drawable-mdpi-v4/ic_emoji_symbols_activated_light.png SHA1-Digest: OilS22ZGBBCObW9kgmwHbEA8QIc= Name: res/drawable-mdpi-v4/ic_play_circle_fill_white_48dp.png SHA1-Digest: gQum8TE91ke/2S6QPH4tNUCKDl8= Name: res/drawable-mdpi-v4/ic_backspace_normal_dark.png SHA1-Digest: J4VyPfxSxgieBgc3Bumse3SztOI= Name: res/layout/design_bottom_navigation_item.xml SHA1-Digest: klT3nTai/AyZFzYkwOzpGr+G4w4= Name: res/drawable-mdpi-v4/abc_text_select_handle_left_mtrl_light.png SHA1-Digest: W/Qo12yic1xpRjtGp7cyxpBT3iU= Name: res/drawable-xhdpi-v4/ic_check_normal_dark.png SHA1-Digest: NETa3V1Qnnz2QspULgJRXA4mGag= Name: res/layout/radial_time_picker_dialog.xml SHA1-Digest: ZjcwfBrzz2gsGna7/qTzCnHwUSs= Name: res/xml/preferences_chats.xml SHA1-Digest: 8A+NPfvsYxTuEsDEKHzqd8pSgdU= Name: res/drawable-xhdpi-v4/ic_menu_add_field_holo_light.png SHA1-Digest: a19u8qsMIgWqbipY8WunV44A7o0= Name: res/drawable/background_pattern.png SHA1-Digest: eBsAAHA2pACsyImDHFj66PrZFKA= Name: res/layout/abc_popup_menu_item_layout.xml SHA1-Digest: +61DnFswt1tn1sv52roYJY333rw= Name: res/drawable-hdpi-v4/ic_download_circle_fill_white_48dp.png SHA1-Digest: JPAS+Viw/0c/rwmkas+IB8Hh+zg= Name: res/layout/hms_picker_view.xml SHA1-Digest: BJpAu+fVnjEl1XAWwQm9UacGkTg= Name: res/drawable-mdpi-v4/ic_account_box_light.png SHA1-Digest: lVQSsLLXlZuHe2ozbIXLeC/0fCk= Name: res/drawable-mdpi-v4/ic_emoji_people_normal_dark.png SHA1-Digest: Vbl1YH0se4Zp3uLIU65UuNsO2lY= Name: res/layout/media_overview_activity.xml SHA1-Digest: Da1wt0pgVpV55/RDWJaWM4Ihovo= Name: res/drawable-hdpi-v4/ic_save_all_white_24dp.png SHA1-Digest: Kho0UY1QD9/XQXM4XeU2k9k20mI= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_84 SHA1-Digest: RXg8ZCyGT2W/pQDo6jOOCucmFYE= Name: res/drawable-hdpi-v4/design_ic_visibility.png SHA1-Digest: ZVs229CW1T4zwRD0gqYJrNTB2CI= Name: res/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_015.png SHA1-Digest: e1lIlQ6p/YUvIYoyCe/6CikluEo= Name: res/layout-v16/verify_identity_activity.xml SHA1-Digest: Dj+JIUDrK0eSETGeIodTIOH7Jwc= Name: res/drawable-xhdpi-v4/switch_thumb_pressed_holo_light.9.png SHA1-Digest: VTcVro7tRSB7dCiFLkcjEK1gte8= Name: res/drawable-xhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png SHA1-Digest: n3rquhXmVYjYpHMG9RG+SAJc+rA= Name: res/drawable-ldrtl-xxxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: IiQ92KKKcRVz1q2BpPfR0GMDdtA= Name: res/drawable/notification_bg.xml SHA1-Digest: 9AFcaFfLJMiugO8v7FmbFNfihsU= Name: res/drawable-mdpi-v4/ic_message_black.png SHA1-Digest: I7Xp6tEvbH2IE1OUNevK0b7K880= Name: res/drawable-hdpi-v4/abc_ic_star_black_16dp.png SHA1-Digest: 7DXQCyQGhFdQExgxQdETPf4ezrM= Name: res/drawable-hdpi-v4/abc_textfield_default_mtrl_alpha.9.png SHA1-Digest: Rmk8UREagQdf47LncSS6fq9RbAo= Name: res/drawable/abc_ic_arrow_drop_right_black_24dp.xml SHA1-Digest: kUvz65VYVPxxDx+UerVfiTaN2Zs= Name: res/drawable-xxhdpi-v4/ic_refresh_white_18dp.png SHA1-Digest: F9pX43A38QCJk72HWQMXTk1HO50= Name: res/layout/design_layout_tab_text.xml SHA1-Digest: SIz1wfljARNQwBdK8NWsBSfi3dc= Name: res/color/design_tint_password_toggle.xml SHA1-Digest: OL42+5K65KFw7u0d3/CjyOR1fRM= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_81 SHA1-Digest: A1I5nxwmM7Cjx2rfURezn1a/kIM= Name: res/layout-v21/conversation_fragment.xml SHA1-Digest: /lJ8C8vcPPW2PeKdp3SRfLWZhOU= Name: res/color/design_error.xml SHA1-Digest: XPQoCxvkOrPTeQYV6CgWpcHVza8= Name: res/drawable-mdpi-v4/ic_keyboard_white_24dp.png SHA1-Digest: eQwPXKVg6XijuO+5oVTN3aHQ9hQ= Name: res/drawable/last_seen_divider_text_background_light.xml SHA1-Digest: rpqyDpgoCABNYioAKGP/1EiGaI0= Name: res/drawable-xxxhdpi-v4/fab_shadow_mini.png SHA1-Digest: gpDjkxHAvhDgKQjYpWxr0HhMM7c= Name: res/drawable-xxxhdpi-v4/ic_arrow_forward_white_24dp.png SHA1-Digest: dbaROnHC3HchorbfyZdlynn4jv4= Name: res/drawable-mdpi-v4/ic_send_sms_secure.png SHA1-Digest: 59nwccWj13mmtU/7cLau6207f/c= Name: res/drawable-mdpi-v4/textfield_focused_holo_light.9.png SHA1-Digest: HZ9iQgcyhTz2F7RRfnq0smD0pLo= Name: res/drawable-ldrtl-mdpi-v17/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: nXZ4V1mFaOHaCmrZgjirnAh+5fg= Name: res/color-v11/abc_hint_foreground_material_light.xml SHA1-Digest: bwFvqJjQtoVWIGh5ORSrNFGtO+U= Name: res/drawable-xhdpi-v4/abc_text_select_handle_middle_mtrl_dark.pn g SHA1-Digest: 8Xul44BbEF2flRfTADrorPhA2rE= Name: res/color-v23/abc_btn_colored_borderless_text_material.xml SHA1-Digest: B/fNYd3gcJ/df3PhJe8aALH6euA= Name: res/drawable-hdpi-v4/fab_shadow_mini.png SHA1-Digest: QKG4gpsX+QogBYisabhbCv3XeLU= Name: res/drawable/emoji_category_objects_light.xml SHA1-Digest: uD/Fl+aPOFRztUBW7/57ho10AEg= Name: res/layout/emoji_drawer.xml SHA1-Digest: CIJy3GMnik/4H9CI9+e57RqGXts= Name: res/drawable-xxhdpi-v4/ic_menu_remove_holo_light.png SHA1-Digest: wZMtQu26Bycc/gXQxYyJ48WMMb4= Name: res/color/abc_search_url_text.xml SHA1-Digest: mgOeEFdKIOmQBIiUEKXZ+y4FBn8= Name: res/layout-land/radial_time_picker_dialog.xml SHA1-Digest: 7mTSBWhNTRy6zodyvYl0jFcpQI4= Name: res/layout/calendar_date_picker_dialog.xml SHA1-Digest: +VZrWk4Eq7FdIk90cR506Oyfjdo= Name: res/drawable-mdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png SHA1-Digest: eF/LuENYUMfZZS3fHrJi1byAVZU= Name: res/drawable-xxxhdpi-v4/ic_unarchive_white_36dp.png SHA1-Digest: udoGXGX4LhrUvoy2quoHNw6noEI= Name: res/drawable-v11/edit_text_holo_light.xml SHA1-Digest: PfvbhTnt8unDB9uovuE++VevD6k= Name: res/drawable-mdpi-v4/ic_video_light.png SHA1-Digest: s74Hd9C8ADpO502v6TKNOme/UyM= Name: res/drawable-mdpi-v4/ic_info_outline_dark.png SHA1-Digest: WxTYcDMT33eIYH1elqVb6PQAht8= Name: res/drawable-mdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png SHA1-Digest: nuld1RomiGBKqE5EsGnC+AbnNZ4= Name: res/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png SHA1-Digest: 6jnEZnvF6Wf/iso9scq8BExu9D4= Name: res/color/abc_secondary_text_material_dark.xml SHA1-Digest: 3hZqJng31S8e4pl48fkYGRumEUQ= Name: res/layout-v17/notification_template_lines_media.xml SHA1-Digest: fXWFBq1QqGxSTc89fOshXXYXVkU= Name: res/drawable-hdpi-v4/ic_notifications_gray.png SHA1-Digest: A7HeGJJrajg3rAbqIgfOgvWoqII= Name: res/drawable-xxhdpi-v4/ic_contact_picture.png SHA1-Digest: tSETePnYRYOH+Olkr9TSthQY6sg= Name: res/layout/design_navigation_menu.xml SHA1-Digest: nGgjj3rDby9y4GZb7XuXG+0i6hM= Name: res/layout-v17/abc_popup_menu_item_layout.xml SHA1-Digest: Q3lxeNeJ5SCLvtUpQigaCUSW2Wg= Name: res/drawable-xhdpi-v4/abc_ic_star_half_black_36dp.png SHA1-Digest: SoI6H44G0Tn/aehVBwD4xNvR4k8= Name: res/drawable-hdpi-v4/ic_send_white_24dp.png SHA1-Digest: oTNDcYmwfOQs4qavTi5X1i5102M= Name: res/drawable-hdpi-v4/ic_done_white_18dp.png SHA1-Digest: fK7s4FyFEQAxnHHjWosq1c1wLGw= Name: res/menu/conversation_list_batch_archive.xml SHA1-Digest: B8kbAyricbY4WLvgWQ72pAPSAWs= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_94 SHA1-Digest: W0CSkKs60WzDI0QUZ1mhx6CmIPI= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_95 SHA1-Digest: owiIKf9pjSZoNZMs63sucQc8p64= Name: res/layout/share_intent_row.xml SHA1-Digest: /qI4T5Xw817feCxvMolDV866zmY= Name: res/xml/preferences_notifications.xml SHA1-Digest: VpDTAz79t3R+nQZjgPv0iZp52GI= Name: res/drawable/notification_icon_background.xml SHA1-Digest: 4Y1VdLi9SHAewoLxNgLA2rlI8M0= Name: res/drawable-xhdpi-v4/switch_bg_focused_holo_light.9.png SHA1-Digest: OIa2+0APqiitnkIjp1qmRxaODoE= Name: res/drawable-xxhdpi-v4/ic_info_outline_light.png SHA1-Digest: t8G2LGMDdspdjPpTuTp9WS9PTBg= Name: res/layout/prompt_passphrase_activity.xml SHA1-Digest: 09Bizk8wpIKXkGdrtBaWUFpL77U= Name: res/drawable/button_background_light.xml SHA1-Digest: /Bll3+L1AkZiLxMhNlReLxUlkVE= Name: res/drawable-v11/emoji_category_flags_dark.xml SHA1-Digest: tqnjHglvtqKRsTkq7o49fyLHqx0= Name: res/layout-v16/calendar_date_picker_header_view.xml SHA1-Digest: E0Mgbv/6FhhCKZC2o4kI7sczdS0= Name: res/drawable-xhdpi-v4/alert.png SHA1-Digest: qskbMn0jztqg1DvP6T3TxsVqBBc= Name: res/layout/contact_selection_activity.xml SHA1-Digest: dJFaoQB8zVefREvK64KPM393w90= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_91 SHA1-Digest: HXgo4Z3+zEUMIe0Gj3t9Geyt8RM= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_90 SHA1-Digest: xmD9UZpmrXmHXGBwgKcnUgG3prY= Name: res/drawable-xxhdpi-v4/ic_message_gray.png SHA1-Digest: 4HgrvxnxB4V+ehblNGmHkJV/6mo= Name: res/menu/conversation_list.xml SHA1-Digest: z9RkErm13m+o+RJ2/r+NSEHBQkg= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_49 SHA1-Digest: 5u8Emu23ipjQSHPDBp+rNN5gLes= Name: res/drawable-mdpi-v4/ic_save_white_24dp.png SHA1-Digest: 3BfYiEyVhrUolewBWRYqH3EjP2A= Name: res/drawable/compose_divider_background.xml SHA1-Digest: hSlm/fjANSZGvY0jNTBpraaWRNI= Name: res/drawable-xxhdpi-v4/ic_action_warning_red.png SHA1-Digest: NraVnc4MYwCYbuuxiC0lQSHCxgg= Name: res/drawable-mdpi-v4/textfield_disabled_holo_light.9.png SHA1-Digest: t++DHoZpGcnF7y+QUYwVT/72aKQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_44 SHA1-Digest: TVnQ8NXIFuFz2qYs35e/XIiGJek= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_43 SHA1-Digest: YwmvuPrm5iistAma7bavl8QEvkw= Name: res/drawable/ic_check_light.xml SHA1-Digest: pRnFugpsobbk3zUm7npXSy8Dc7M= Name: res/drawable-hdpi-v4/ic_menu_search_holo_dark.png SHA1-Digest: /2wBqxOy0cC40ZI6fj5eSS8V10E= Name: res/drawable-xxhdpi-v4/ic_emoji_symbols_activated_light.png SHA1-Digest: UQ78RTXRCKvUMF1i3wgSR/f6YkA= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_36 SHA1-Digest: Q6P0BgyIFO14RidwktMDzIKtUAc= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_31 SHA1-Digest: r/DBDrMghpy33Q11YD6SwLXaCCg= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_30 SHA1-Digest: zX3yz7FhjbZayv9D47R7u97JH+E= Name: res/drawable-xxxhdpi-v4/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: esewcPWP43YzeikiSszMdbAAolE= Name: res/drawable-xhdpi-v4/ic_volume_up_light.png SHA1-Digest: lvwZMSjJIkqYFqzFGgXOGI5CjM8= Name: res/drawable/notification_bg_low.xml SHA1-Digest: RdoLiETS+XSopjRxjEzYLBZ8tLA= Name: res/drawable-xxhdpi-v4/icon_cached.png SHA1-Digest: GH4pTOyQLF/xy6pyGXsM0mgX7rQ= Name: res/drawable-xhdpi-v4/ic_visibility_grey600_24dp.png SHA1-Digest: FqGRsllTs8N0d5ek77AEpBiEkpo= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_34 SHA1-Digest: QJCaGbU/lFnE77x7YIoqtsjah/M= Name: res/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_000.png SHA1-Digest: iGm+MqvuHagbCTikSNZ2q6527cs= Name: res/drawable-mdpi-v4/ic_brightness_6_black.png SHA1-Digest: Y1CqXJk7c22tGuqu+WqX4oanWfU= Name: res/drawable/design_fab_background.xml SHA1-Digest: RnDZ4YODuNg44An4VRSM13iDsgI= Name: res/drawable-xxhdpi-v4/ic_account_box_light.png SHA1-Digest: DGezBrNdeaOR3EDeh10knJQlW0I= Name: res/layout-sw600dp-v13/three_keys_view_text.xml SHA1-Digest: rCGhKE9ZDipF1CLJ4b0FShiSZUk= Name: res/drawable-hdpi-v4/ic_delete_black.png SHA1-Digest: J+GJotMCHRqU388rGF3PTnwT0Yo= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_66 SHA1-Digest: sAk8V+6UnOy3rXvWnM6/28B9JCM= Name: res/drawable-xxhdpi-v4/ic_select_all_white_24dp.png SHA1-Digest: dMqhWC0rHUUFTxHE02qSC260bCw= Name: res/animator-v11/upper_pause_to_play_animation.xml SHA1-Digest: h7h1IR3LLxizByblffdV+ZIIvWs= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_62 SHA1-Digest: /GFJ0ylw9Il1gfM51PWk1RBl2A4= Name: res/drawable-hdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png SHA1-Digest: xrEYQ5r7Zv8komYSuo3VLdViEUQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_61 SHA1-Digest: y6DIvaz5WnaAn2TRzoK2bvfLQ7o= Name: res/drawable-hdpi-v4/ic_dialpad_white_24dp.png SHA1-Digest: v5PK56rWt9jZkuaz2Tut3WCve8o= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_63 SHA1-Digest: z55xt2Ayw/sf1cZS1n7htuZln00= Name: res/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png SHA1-Digest: Lr8CV2APFenrT2CnF18DHzPxPmc= Name: res/drawable-mdpi-v4/icon_lock.png SHA1-Digest: GGDtAyKs2tmo3a95V0H/KdaPS5k= Name: res/drawable-hdpi-v4/ic_recurrence_bubble_outline.png SHA1-Digest: 3AGl+T+k+f4Opirzt8JX3zRUl4Q= Name: res/layout-v17/abc_alert_dialog_button_bar_material.xml SHA1-Digest: oF8mBtXkGOy/041kd1oglLxKpMI= Name: res/drawable-xhdpi-v4/abc_list_selector_disabled_holo_light.9.pn g SHA1-Digest: 55f4pDcLSMwJ2///c7EjaRD4TtY= Name: res/layout/abc_action_bar_title_item.xml SHA1-Digest: QzmSVkZhkH/CGOFdlrZ9s21SgS8= Name: res/layout/color_preference_items.xml SHA1-Digest: PwBWPIRsTNT6kxblCBJX+ueKwCo= Name: res/layout/notification_template_part_chronometer.xml SHA1-Digest: N3bpzPkHEH/egwMXsQQ5MXKZrfM= Name: res/drawable-xxhdpi-v4/ic_emoji_nature_normal_light.png SHA1-Digest: m0/FBDMkAmG2sjUUzXE0ty2NQRw= Name: res/layout/zooming_image_view.xml SHA1-Digest: wjmUQd8KKCMX7JN384NxM9U03W4= Name: res/animator/upper_play_to_pause_animation.xml SHA1-Digest: 1TOkjm6F2/DzGTLmzL7Ol4HlHJM= Name: res/drawable-mdpi-v4/ic_volume_off_grey600_18dp.png SHA1-Digest: +vO8/raOnJIMUUho5sPrnISDDoU= Name: res/drawable-hdpi-v4/ic_send_insecure_white_24dp.png SHA1-Digest: /tlDKZmj+ITZQdb9V+m49SSWVjs= Name: res/drawable-xhdpi-v4/ic_photo_camera_dark.png SHA1-Digest: 0z4aTrrxUBQ133+qOtoG44E7yAo= Name: res/drawable-mdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png SHA1-Digest: EYD0L7FYlUYj4vZvX1mmqzIwLBE= Name: res/drawable-xhdpi-v4/ic_block_white_18dp.png SHA1-Digest: O4y8hdGpbrDXQz4srv4JV/No0HE= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_58 SHA1-Digest: hkt/emROO5dafVOiI7Zx7fKidEI= Name: res/drawable-hdpi-v4/ic_emoji_flags_normal_dark.png SHA1-Digest: l4ASGy17UUsb7ymwG5cl6ndH71I= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_55 SHA1-Digest: fv4z5lbCDxm8xUvQIY8+gDq08Nk= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_54 SHA1-Digest: EjExNy18aod1tZNDB5Mvc+z5EJs= Name: res/drawable-xxhdpi-v4/ic_warning_dark.png SHA1-Digest: BuB4DE8pjB+1lNNjrmP1GnDwwzc= Name: res/drawable-xxhdpi-v4/ic_delivery_delivered_dark.png SHA1-Digest: raZe/SpGw7+m32jNalmYFRJD+OI= Name: res/drawable-hdpi-v4/ic_brightness_6_black.png SHA1-Digest: KFWvIduHGUzkdtOnjFR4rjsGm8U= Name: res/anim/abc_popup_exit.xml SHA1-Digest: 6uAxkSAqOnz6wM+5oio7//G38vY= Name: res/drawable-hdpi-v4/abc_scrubber_track_mtrl_alpha.9.png SHA1-Digest: bbu4U1Z2FReSVaAwtf9Uj+pAXxA= Name: res/drawable-xhdpi-v4/abc_switch_track_mtrl_alpha.9.png SHA1-Digest: xe5aMoZuNGwGdXksGOYPSE3NVpk= Name: res/drawable-xxhdpi-v4/ic_cancel_white_24dp.png SHA1-Digest: MhDSWzHeLiZFYWo1fQBGgZIWpxM= Name: res/drawable-mdpi-v4/ic_done_all_white_18dp.png SHA1-Digest: kr5wUWq9/7hcmKpj2dpnOmRb2Ko= Name: res/drawable-mdpi-v4/ic_brightness_6_gray.png SHA1-Digest: P5bfosvFzP8DRkPZAQaWEUbr9Do= Name: res/drawable-xhdpi-v4/ic_emoji_flags_activated_light.png SHA1-Digest: qLPkosq6BoLzIPVDUEA8qRCOBNU= Name: res/drawable-mdpi-v4/design_ic_visibility_off.png SHA1-Digest: qwRLhCF05PgnqmU2XRTfcbHoWpw= Name: res/drawable-hdpi-v4/ic_photo_camera_light.png SHA1-Digest: YqtGiRfa9Sfo0tzA4RKzfGIINaw= Name: res/drawable-hdpi-v4/ic_image_light.png SHA1-Digest: 6XURzKlid8os71X+M/kkDIKtKYU= Name: assets/emoji_symbols.png SHA1-Digest: XE9qEioRlR74jFdnavx4j39xY3k= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_675 SHA1-Digest: Egbq8VQn3A6YTmNLqQtbJWXPR8Q= Name: res/drawable-xhdpi-v4/ic_done_all_white_18dp.png SHA1-Digest: IqzBd/sAzp2vr9Zz3XXjUWWYayA= Name: res/drawable-xhdpi-v4/ic_delete_gray.png SHA1-Digest: VRvA38i4ZosD8xe7w2CHcHtwPDs= Name: res/drawable-xxhdpi-v4/ic_textsms_grey_32dp.png SHA1-Digest: KRTtcnS3aob83jnO2puQtMcnC6g= Name: res/drawable-mdpi-v4/ic_lock_white_18dp.png SHA1-Digest: HWpWWMAysGi/Ei9A6d3DKw28mBw= Name: res/drawable-hdpi-v19/switch_thumb_pressed_holo_light.9.png SHA1-Digest: K3YgpyXSgJr++z61OECZhndc9kM= Name: res/drawable-hdpi-v4/ic_emoji_recents_normal_light.png SHA1-Digest: PmKdWE/l07qdHCPnDWsUNCt7ino= Name: res/drawable-mdpi-v4/ic_send_secure_white_24dp.png SHA1-Digest: exJ2SaC4rFenjkwgLxUiIDQaYWg= Name: res/drawable-xxxhdpi-v4/ic_block_grey600_18dp.png SHA1-Digest: YYE9kNJ6soXl0ZGfKt8xxe6CwYU= Name: res/drawable-xhdpi-v4/switch_thumb_disabled_holo_light.9.png SHA1-Digest: ljpsvOw3MQTa68v5CQddL5JUS+A= Name: res/drawable-xhdpi-v4/ic_info_outline_white_24dp.png SHA1-Digest: Xg3np82h+s54ITsFzwApkFGHflI= Name: res/drawable-xhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png SHA1-Digest: 7s2leAY1r3tTtxomqJtjfVAN/l8= Name: res/drawable/design_snackbar_background.xml SHA1-Digest: y0hl2UgZoIkRVimAgN0heOxPqhs= Name: res/layout-v16/conversation_item_pending_v11.xml SHA1-Digest: 3BKWy5KoS+DU1okCGCdO0eKv4CM= Name: res/drawable-hdpi-v4/ic_create_white_24dp.png SHA1-Digest: +zaYNvep98pE6VBn7KLB/SKj1gI= Name: res/layout/key_caching_notification.xml SHA1-Digest: BYjDXuzKljnw8ttDrqmWqxC8rOg= Name: res/drawable-xxhdpi-v4/textfield_activated_holo_light.9.png SHA1-Digest: v1cd6v0pRkDauAh+/cr18dBMykA= Name: res/drawable-xxhdpi-v4/ic_movie_creation_dark.png SHA1-Digest: kSZCFwbqJwlipEVBmLdh5SR/qVM= Name: lib/armeabi/libcurve25519.so SHA1-Digest: hyoc/ivNYSNCGdFKdWtJtq8LlrY= Name: lib/x86/libcurve25519.so SHA1-Digest: 1/qEk4pIj0hCaCyKA6XZhCQBEZw= Name: res/drawable-mdpi-v4/ic_menu_search_holo_light.png SHA1-Digest: hLzglnVP8CqrP4zbyg78Be0YriU= Name: res/drawable-xxhdpi-v4/abc_textfield_search_activated_mtrl_alpha .9.png SHA1-Digest: WQ8PqUvvH8nOnzNH5uPMzVsVa+Q= Name: res/drawable-hdpi-v4/abc_ic_star_black_48dp.png SHA1-Digest: 9zZhABOz1Q3ZndRBEwpf8HVzyeA= Name: res/drawable-mdpi-v4/abc_text_select_handle_middle_mtrl_dark.png SHA1-Digest: I7m7a6z3jtIZ0E3nG+dtZ5GXFpg= Name: res/anim/abc_fade_in.xml SHA1-Digest: wE1QEZhFkLBWMw4TRtxPdsiMRtA= Name: res/drawable-xxhdpi-v4/ic_lock_dark.png SHA1-Digest: +NeEZUkgdxipmiJWfO7EnDSaVC4= Name: res/drawable-xxxhdpi-v4/ic_archive_white_24dp.png SHA1-Digest: Jm4z9iVpSUMuu6rB6EBJisPkQxI= Name: res/drawable-hdpi-v4/ic_volume_off_grey600_18dp.png SHA1-Digest: jPKcbkndw4fhcvRIzrY5Qsf9axQ= Name: res/drawable-sw600dp-hdpi-v13/ic_backspace_normal_dark.png SHA1-Digest: 6MlFNjLjWejakHp7mibnYN5g3sE= Name: res/drawable-xxhdpi-v4/ic_recurrence_bubble_outline_disabled.png SHA1-Digest: XT65zBj9nc/wJfCIh5kVI3HHdPA= Name: res/layout/abc_screen_simple.xml SHA1-Digest: wcPlv/nr5pkFN65VKYp3t34HJzY= Name: res/layout/abc_search_dropdown_item_icons_2line.xml SHA1-Digest: zuGa8MGzNKD8HEVLacvOV6QWpew= Name: res/layout-v17/conversation_title_view.xml SHA1-Digest: X2wnAsbTJQOdDD5Yla92hZj5Ep4= Name: res/layout/conversation_item_sent.xml SHA1-Digest: S916DeMqZ15W+Lg0ts+0k/DF2g8= Name: res/drawable/share_list_divider_shape.xml SHA1-Digest: 2ex/sAlke8bN2MQJTFVY60LNmPI= Name: res/drawable-hdpi-v4/abc_text_select_handle_right_mtrl_light.png SHA1-Digest: m5BiWbvIdHBv+pqV2EE1xWczYhI= Name: res/drawable-xhdpi-v4/ic_pause_circle_fill_white_48dp.png SHA1-Digest: MPyCwxn18rrFgFYbNQZal8Alcqw= Name: res/drawable-xxhdpi-v4/design_ic_visibility_off.png SHA1-Digest: SLjRVIOH1nuQ3ylhQ2npZFXmGlc= Name: res/drawable-hdpi-v4/ic_emoji_symbols_activated_dark.png SHA1-Digest: wVM0JNPBL09Dc/M+khA8pVD4C0c= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_255 SHA1-Digest: GR5suOXxRCRSaPOoEXvpBezuIsM= Name: res/drawable-xxhdpi-v4/abc_list_focused_holo.9.png SHA1-Digest: qCddjZI8yABkWFvWCWlg+bQVD7M= Name: res/drawable-xxhdpi-v4/textfield_disabled_holo_light.9.png SHA1-Digest: 8uAr5Lt4boLAicIMjYMnfGSIX3w= Name: res/drawable-hdpi-v4/ic_menu_barcode.png SHA1-Digest: EX5mWZm5BgXuBUNFocBGP4yQU6o= Name: res/layout-v21/notification_template_custom_big.xml SHA1-Digest: eMDKcwiHm3P1l+bsaSD9j6QFqE4= Name: res/drawable-xxhdpi-v4/sms_system_import_icon.png SHA1-Digest: JWIdtXXTfC2pEijSj8uZ9SZRR7Y= Name: res/color-v23/abc_tint_edittext.xml SHA1-Digest: gl5NW5wAw/zYl0bbs9Z1gJfz9fA= Name: res/drawable-xxxhdpi-v4/transfer_controls_background.9.png SHA1-Digest: x7nPBDQlImT7zpcqgig6+lpYOys= Name: res/layout/conversation_title_view.xml SHA1-Digest: PHclzDkPlkxMvDe1iBNJyOfq2Uk= Name: res/drawable-mdpi-v4/ic_emoji_recents_activated_dark.png SHA1-Digest: xshuIndsY927AhHg1NjuMVLiT20= Name: res/drawable-xhdpi-v4/abc_list_pressed_holo_light.9.png SHA1-Digest: 4CNgdraLjH84scvRJUfzItc3PbA= Name: res/drawable-mdpi-v4/ic_clear_white_24dp.png SHA1-Digest: tivFR5Pg7NTzLhQFxmzxw4LhpvY= Name: res/drawable-xxxhdpi-v4/ic_forum_black_32dp.png SHA1-Digest: mPrnI21janVOrga6scZMonvrSHA= Name: res/drawable-xxxhdpi-v4/abc_ic_star_half_black_36dp.png SHA1-Digest: TnwxMKyw13/+oTuxDf3OnEWDW78= Name: res/layout-v17/notification_template_big_media_narrow_custom.xml SHA1-Digest: aaFbDiZySvnPiDoBpHVG/8e4/LE= Name: res/drawable-mdpi-v4/ic_advanced_gray.png SHA1-Digest: +Uk8rEKjUdjYVcpy6KkQCQF9+2g= Name: res/menu/conversation_list_batch.xml SHA1-Digest: FiB0SSD2JzMhRC3siBvdDyGkgws= Name: res/drawable-xhdpi-v4/fab_shadow.png SHA1-Digest: 2HYDT036dFl/SR0UI6Ou2N01QBU= Name: res/drawable-hdpi-v4/textfield_disabled_holo_light.9.png SHA1-Digest: 0uIKHs2pNZE0TCfBlw/gmH5Viuw= Name: res/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_000.png SHA1-Digest: 16vIEVXQ+k0+9qfLK8Cds0zIZCY= Name: res/drawable-hdpi-v4/ic_check_white_24dp.png SHA1-Digest: yRKvOlN4L/fng8u4Jxc0HUMTPNc= Name: res/drawable-xhdpi-v4/ic_volume_off_white_18dp.png SHA1-Digest: yB2h1TiNdb6rs735j1ukm2deiZY= Name: res/drawable-xxhdpi-v4/ic_block_white_18dp.png SHA1-Digest: p9nZ3831Mm/GVCdGS3W7J2vwAts= Name: res/drawable-xhdpi-v4/ic_emoji_emoticons_activated_dark.png SHA1-Digest: WbVoBPPPt7ocOIY2N6pxfTDuNWw= Name: res/drawable-xhdpi-v4/ic_warning_dark.png SHA1-Digest: vI0kBo2QoadOyYhbebgSE1kpDnw= Name: res/drawable-xxxhdpi-v4/ic_unarchive_white_24dp.png SHA1-Digest: WPb8uDzmwkmUPWCQCgFsnOFo1yA= Name: res/drawable-hdpi-v4/ic_visibility_off_grey600_24dp.png SHA1-Digest: WrFfyPZCMZkNcKNH0/jXDxUtlM8= Name: res/drawable-v11/emoji_category_recent_dark.xml SHA1-Digest: BoZ2dC5kzcIbIx4gwYvWke1zNQM= Name: res/drawable-xhdpi-v4/ic_emoji_symbols_normal_dark.png SHA1-Digest: r8abfKuqfSUJWiUG2AFT/uysZxM= Name: res/layout-v21/conversation_title_view.xml SHA1-Digest: Tg0wV8pcxD05YVaYKd+xFtHYZhE= Name: res/drawable-mdpi-v4/ic_content_copy_light.png SHA1-Digest: kkT/ZtIAYURrC11XLIoC6HxuSXU= Name: res/drawable-xxhdpi-v4/ic_visibility_off_grey600_24dp.png SHA1-Digest: PBMaGZk/N3aLEwrJntAUpHCS2yo= Name: res/drawable-mdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png SHA1-Digest: qzSKvi0rQ140s0TA55aBiWLqZkY= Name: res/drawable-hdpi-v4/ic_group_photo.png SHA1-Digest: 6X6IuPMf/i3zPccwEa5rqEMBEcY= Name: res/menu/conversation_list_empty.xml SHA1-Digest: TMRtrz8omO3JnMLziHrWtZD42mo= Name: res/drawable-hdpi-v4/ic_backspace_disabled_dark.png SHA1-Digest: nGPkozJKw1x0Rw8bJJjOl6gAips= Name: res/drawable-v11/emoji_category_objects_light.xml SHA1-Digest: MzmYGqtPaeQZFVT/8NdkVW78hS0= Name: res/drawable-xhdpi-v4/ic_send_sms_insecure_dark.png SHA1-Digest: pTz2XGg9C7JjliPA1YyqSsF8adk= Name: ws/com/google/android/mms/pdu/package.html SHA1-Digest: ye2lxAPXev+RReyb/W+E5sl8jIY= Name: res/drawable-xhdpi-v4/ic_emoji_recents_normal_dark.png SHA1-Digest: peXDYKfMUq4vWyVK9XRdHKy9YTI= Name: res/drawable-mdpi-v4/notify_panel_notification_icon_bg.png SHA1-Digest: y9fFL7ZwxVmqnnOis/943Gj9mHg= Name: res/drawable-xxhdpi-v4/ic_emoji_emoticons_normal_dark.png SHA1-Digest: JAremr2KFp3vYY3/lBDZ8lLWPK8= Name: res/drawable-xhdpi-v4/divet_lower_right_light.png SHA1-Digest: wzMeNheVDFOHZfw6pLbUX/GbK98= Name: res/drawable-xhdpi-v4/ic_recurrence_bubble_disabled.png SHA1-Digest: u7/bcUxXHR1xB61DGGEc7bSKvCM= Name: res/drawable-xxhdpi-v4/ic_forum_black_32dp.png SHA1-Digest: twQY8z+UiEenkkcKGu92iWq+euk= Name: res/drawable-v23/abc_control_background_material.xml SHA1-Digest: M7P91J6Oq/IeAG37sfccnRIVMEs= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_679 SHA1-Digest: brii8vx5U3th9K0hIr7b19MpKXY= Name: res/drawable-hdpi-v4/ic_backspace_grey600_24dp.png SHA1-Digest: KZhpG5sCWyMPeYTn2z1ZTRNlRBk= Name: res/drawable-hdpi-v4/notification_bg_normal_pressed.9.png SHA1-Digest: mVyFdyHKSjUuQpG+f7zlYC/svPk= Name: res/layout/time_zone_filter_item.xml SHA1-Digest: J98Aas/jL/MnMKY6i2PA4j9RYSQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_676 SHA1-Digest: 4gGxM0M6k+qIXUWmmdKRACJhT44= Name: res/drawable/conversation_list_divider_shape.xml SHA1-Digest: j0vuZSNhvW58lO8uYnIKac7g9kE= Name: res/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_000.png SHA1-Digest: 2PLGy262CDuWvGAcqwLjzuuRvIg= Name: res/layout/select_dialog_singlechoice_material.xml SHA1-Digest: 6hlEA3ufhtXKfJiapXg4kuCsoJ8= Name: res/layout/conversation_fragment.xml SHA1-Digest: IwMTGFoT46gwdrGYF7KTkXyIz9A= Name: res/drawable-xxhdpi-v4/ic_add_white_24dp.png SHA1-Digest: GIRc5y8Vb3f6jXKYPY4vbJUdkdc= Name: res/xml/preferences_app_protection.xml SHA1-Digest: Mkyd9mWNqXjxvohDGC5w15FMLL8= Name: res/color/abc_primary_text_material_light.xml SHA1-Digest: QxwSL2/KR5e1LDlFTDHLZagbcCg= Name: res/drawable-hdpi-v4/ic_circle_fill_white_48dp.png SHA1-Digest: ML2jQD6xhLELNoXjYhMJn+65l7Y= Name: res/drawable-xhdpi-v4/ic_visibility_white_24dp.png SHA1-Digest: h4LkirIQKjUxtwO0DlnMNBG0b20= Name: res/drawable-v21/conversation_list_item_read_background_dark.xml SHA1-Digest: aWDc7VlipCrVRzbFuhsbhJDiVks= Name: res/drawable-xhdpi-v4/transfer_controls_background.9.png SHA1-Digest: CmzcrZNC8r+1hIxDz084H5GZEDw= Name: res/drawable-v11/emoji_category_places_dark.xml SHA1-Digest: Owcp6gHe/SjPFfbWYPHHoUaVGrU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZA SHA1-Digest: /wR+q5WuqeSYVq4OTnxax0fTnX8= Name: res/drawable-xxhdpi-v4/ic_error_red_24dp.png SHA1-Digest: no1QBl1qBiyPhA+fKH8oTpHO04o= Name: res/drawable-mdpi-v4/switch_thumb_holo_light_v2.9.png SHA1-Digest: w8Dy0yH3VYRGd70FBZl2zVgtszM= Name: res/drawable-xxhdpi-v4/ic_emoji_objects_normal_light.png SHA1-Digest: JHyrRJeccYNJeWzNN9fC5Oy/Smc= Name: res/drawable-hdpi-v11/icon_cached.png SHA1-Digest: +TCXEDkHf2wT6Ro7NwKnkcX+USc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_YE SHA1-Digest: HbLeneEtbwO+pWAy0EnGv0hSoC4= Name: res/drawable-hdpi-v4/spinner_disabled_holo_light.9.png SHA1-Digest: wiWkHAPVenl8UL3CUN7wiwB68o8= Name: res/drawable-xhdpi-v4/ic_emoji_nature_normal_light.png SHA1-Digest: wfixPVJOdpogZgbyI4TEahh5QWM= Name: res/drawable-mdpi-v4/abc_list_selector_disabled_holo_dark.9.png SHA1-Digest: 0lawN0TfON5HQhuTBR7Om1xGxUI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZW SHA1-Digest: XEwHXyO2BN+vjJ3oTmYwYF26fXM= Name: res/drawable/abc_switch_thumb_material.xml SHA1-Digest: GMLceoxorxIv4SfySzjNiKy4yRk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_800 SHA1-Digest: 0dlU9yXqTTryauz3RqUi3R2ERIY= Name: res/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png SHA1-Digest: DqYT/YomMpTVjcgLxNiWd75/E14= Name: res/drawable-hdpi-v4/ic_emoji_recents_activated_light.png SHA1-Digest: 2+gwJDXYwypYG/+XcE/LGDYq7+s= Name: res/drawable/psts_background_tab.xml SHA1-Digest: RPiMPUR4wVCZVm6K01+4xKOM2YA= Name: res/layout-v16/transport_selection_list_item.xml SHA1-Digest: 9ZpszvVeyXxgdXBFYZuGeB6nNfE= Name: res/drawable-xxhdpi-v4/actionbar_icon_holo_dark.png SHA1-Digest: XS2gX3fVuiDm17r+g86lQnkv92M= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_808 SHA1-Digest: Er28OW5DpBu0S7qE78Rs46U9UVU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM SHA1-Digest: UMqs5N78T04XZVHo+XfcnTXzp5k= Name: res/layout/support_simple_spinner_dropdown_item.xml SHA1-Digest: v9EKX2UNBQ+3qucl6nl8VOjoJ2A= Name: org/spongycastle/x509/CertPathReviewerMessages_de.properties SHA1-Digest: JEtZ3RAGGTVEFFC7U8WRwNNTJXU= Name: res/drawable-xxhdpi-v4/ic_emoji_emoticons_activated_dark.png SHA1-Digest: q/Atn8pScseD8+59O12FwaOVDVo= Name: res/drawable-hdpi-v4/icon_dialog.png SHA1-Digest: SemQwPZLu5y8tA9/OhifXOEMNtE= Name: res/drawable-xhdpi-v4/ic_account_box_light.png SHA1-Digest: hDkn2R9BCMRYcuDN8OZLbzcRMVs= Name: res/drawable-mdpi-v4/ic_message_white.png SHA1-Digest: qMQrG3OYJNqekHvNN5yf2mPf0Gg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_WS SHA1-Digest: w/P847FjVjBfxdL2c+7EX0wmklg= Name: res/menu/conversation_context.xml SHA1-Digest: 8poQR2hD6mBuYtTPSjxcXiesB2s= Name: res/color-v11/abc_hint_foreground_material_dark.xml SHA1-Digest: Muoz92tJTSeXi0SPaHigB+GjIqk= Name: res/drawable-xxhdpi-v4/ic_audio_dark.png SHA1-Digest: 5qNoPIu9bgbPkC8wtRp7dAf7gtM= Name: res/drawable-xxhdpi-v4/switch_bg_holo_light.9.png SHA1-Digest: EB5fOmXnZyZsagT7N1a70OEs0eA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_WF SHA1-Digest: J9WZUh84u+dw5LiVNdWHTrgoS44= Name: res/drawable-hdpi-v4/ic_video_light.png SHA1-Digest: B8rCPMmHoB5JPFV3REjOFfenk3o= Name: res/drawable-hdpi-v4/icon_cached.png SHA1-Digest: /0ynkRi/GNd/L7zAIMxMFZrzFfg= Name: res/drawable-hdpi-v4/spinner_default_holo_light.9.png SHA1-Digest: wNj51XPjwkpz5i7Qe8C0psbQlO8= Name: res/drawable-hdpi-v4/ic_warning_dark.png SHA1-Digest: zm1FTuklhZEHGM1BDKBc7+ymp9c= Name: res/drawable-hdpi-v4/ic_unlocked_white_24dp.png SHA1-Digest: QrDcUwJPBvJA2fia9L0hfPdwrJI= Name: res/drawable-xxxhdpi-v4/ic_dialpad_white_24dp.png SHA1-Digest: aS9pW5ZiVW23ktv2TgI50vDlnZY= Name: res/drawable-xxhdpi-v19/switch_thumb_pressed_holo_light.9.png SHA1-Digest: vOrQRbnBW344sB4vzWZnuvuoRho= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VI SHA1-Digest: vkoGk7tJGw/D7dD5k7jOMyijm38= Name: res/drawable-xhdpi-v4/ic_block_grey600_18dp.png SHA1-Digest: ElA4R0/C1Oa4WymUxbb7IbERn78= Name: res/drawable-xxhdpi-v4/ic_emoji_nature_activated_light.png SHA1-Digest: JiN+2lpMsROO3miESvAJOcRSeUQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VG SHA1-Digest: HrXQEpLrDYpMZKTpI9pOllxu/fE= Name: res/drawable-hdpi-v4/abc_list_selector_disabled_holo_dark.9.png SHA1-Digest: vVifsTusCsEMS/QLwleavhByCls= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VU SHA1-Digest: ILj3vdeklYp0FAJS7H+Drg4UwK0= Name: assets/emoji_nature.png SHA1-Digest: 3LR8FZBTV9dDX+3fPaFEdfQNKkQ= Name: res/layout/expiration_picker_dialog.xml SHA1-Digest: lBYj8JRu5oIpVDbXlzbIUFRJmTg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VN SHA1-Digest: q7Qn3cHSPT3S93peP2x9KWylEnQ= Name: res/drawable-hdpi-v4/ic_info_outline_white_24dp.png SHA1-Digest: 8tQHiDet7Fgbpnj0uJhuUzZNvz4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_UZ SHA1-Digest: qmNg7UeWXwcRyp+FXCA+LIdy1iE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_UY SHA1-Digest: PA6aZ1by8jynQ4c+eungIaeKx8M= Name: res/drawable-mdpi-v4/ic_emoji_recents_activated_light.png SHA1-Digest: 8K6eTIJEwqqtEkV+dYjfsN+yIbA= Name: res/drawable-mdpi-v4/ic_select_all_white_24dp.png SHA1-Digest: uPkT563M0zaS3nLr8L6tBajYOWQ= Name: res/drawable-xhdpi-v4/ic_recurrence_bubble_outline.png SHA1-Digest: E/z09yV2cKSnnGQ0KTHdUXY/P5M= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VC SHA1-Digest: WqIycqucMNbzQiehs8Hzfu81BbA= Name: res/drawable/abc_edit_text_material.xml SHA1-Digest: oiA6lTI8z8nUuKbfDkfiJVYFwwg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VE SHA1-Digest: qhqhE8cDEVERQp/hwdY9qtKHKTo= Name: res/drawable-mdpi-v4/ic_visibility_off_white_24dp.png SHA1-Digest: QnPKJQNSJWg+KFnw9I9uY3Gobpg= Name: res/layout/abc_action_bar_view_list_nav_layout.xml SHA1-Digest: HpKXyfGMcMRpYtrLU9ybBcuK1XI= Name: res/drawable-xxxhdpi-v4/abc_switch_track_mtrl_alpha.9.png SHA1-Digest: O9JInV5je9E+K0VDIh7tQxIyLAk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VA SHA1-Digest: X9RgrA3GEbXaosdHXS7UioJi6Go= Name: res/drawable-mdpi-v4/ic_emoji_nature_normal_light.png SHA1-Digest: 2AEqIjG+9A64jaXR1ow9UyNvQrM= Name: res/drawable-xhdpi-v4/divet_lower_right_dark.png SHA1-Digest: TrdSDRDDtAdn5HZRumod+VBzN8o= Name: res/drawable-hdpi-v4/ic_video_dark.png SHA1-Digest: LRwm36VyCekL+luFjclPSB5Z1wI= Name: res/layout-v17/select_dialog_singlechoice_material.xml SHA1-Digest: 9yxyqbR9qC/Rt3SI2daiW4WGGa8= Name: res/drawable-hdpi-v4/ic_emoji_flags_activated_dark.png SHA1-Digest: Qk4RhA+73EGzSksMNqfjsZEOHkc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_UG SHA1-Digest: wrNX0UqprVSO8t5el0+ktN0TetA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_US SHA1-Digest: 2/DGaH9u4Ne6CiJFda1J7mLLNGc= Name: res/drawable-xhdpi-v4/ic_brightness_6_black.png SHA1-Digest: 8Nl2BMxG0K8+DwQyxAddEO9EYPI= Name: res/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.p ng SHA1-Digest: yMgf/1udbZRbmbVxWkO2tX8Dmw4= Name: res/color/abc_tint_btn_checkable.xml SHA1-Digest: EjutwwqwZcNixKT9MBicYlTCl2c= Name: res/drawable/share_list_divider_shape_dark.xml SHA1-Digest: dwoh6E4GqWi3+DAhO/ysZ0zWPa4= Name: res/drawable-hdpi-v4/notification_bg_normal.9.png SHA1-Digest: /y2KUDqzajVjYWrw5CoyqM7Jabk= Name: res/drawable-mdpi-v4/ic_textsms_grey_32dp.png SHA1-Digest: Z5jvmpt7DmWwvsAGPE9WWGAawI0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_US SHA1-Digest: 9wBimbr0W9/oIwfS/Tn1C6Gd95Y= Name: res/drawable-hdpi-v4/ic_arrow_forward_light.png SHA1-Digest: 3WZvuZnSsZWuzdneGW5h5Zr5aK8= Name: res/drawable/abc_btn_default_mtrl_shape.xml SHA1-Digest: SKMRXFrMMLv2CZ0xhHWsL5pijc8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UY SHA1-Digest: hbAAX/CtFJm+reOOjQ19FI2N/oM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UZ SHA1-Digest: Hv4Pol9SdHJPa1Soye2xrTXzc1Y= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_UA SHA1-Digest: XEIgrzU4BwSpKojMzajxO8Jc42I= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TV SHA1-Digest: C0KZ5lvGSxh4y3B1G/x/NykuVjU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TW SHA1-Digest: 7OIeA1vJ+mkcPbIfP5JLCkOtWBY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TT SHA1-Digest: +QmgjZTwCkZ9kk1ic+7CxFHAD9s= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TZ SHA1-Digest: diCBTJiQppvA/rE+trGglphJ0ko= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC SHA1-Digest: oFnqWz68lh4TGE083rt0E3gq+Po= Name: res/layout/verify_identity_activity.xml SHA1-Digest: RvqpqlEPWGsVCyyrImHuo9HmYaA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VA SHA1-Digest: dk+7g6GpNiOKWiqTan6GO/EBhKk= Name: res/drawable-xxhdpi-v4/ic_visibility_grey600_24dp.png SHA1-Digest: ecYSYAe/QbzJOHp4AohDY8zSYxw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VG SHA1-Digest: SlvnPws1MUdXYkFfLNvSTC6vC2k= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TO SHA1-Digest: BwUzD6t0mvz3hTqiw31cskrBTio= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TN SHA1-Digest: 6H/P3CVVgHcz0qsrirFpDcbOU7s= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TM SHA1-Digest: hka0u4sg0SVtltn9avVmPefCAlo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VE SHA1-Digest: /k4rJtwOSZvawp1iHrJzYYtenDA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TL SHA1-Digest: ZoHaDxUGWH1eg/2zTrEBk/b0mnU= Name: res/drawable-hdpi-v4/ic_menu_lock_dark.png SHA1-Digest: 09t4ugF802cMwk1VmJDI8yGxn9A= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TR SHA1-Digest: zLdfOpaYXSZRYVirbfGLVCilXVw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VI SHA1-Digest: PbQLxt3r8E6tYcKkKl3OjGIe5rs= Name: res/drawable-sw600dp-mdpi-v13/ic_backspace_normal_dark.png SHA1-Digest: D8d3jzWwaJYFImRPS/jMKmOjwq8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TG SHA1-Digest: Z97IC3RazJPxpi4q5d5Vzk8BAhw= Name: res/anim/abc_slide_in_bottom.xml SHA1-Digest: 6SIMoqi7/LVEqpyfDSSCRJ9qRR4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN SHA1-Digest: jXr5eqXsgg+eqXq81gOm/GFdgDg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TD SHA1-Digest: JBNGXYSPFUyhinfZpVBqtGbJZWc= Name: res/drawable-hdpi-v4/check_dark.png SHA1-Digest: /2RXLskv6ItLzRUAeVVlg/46buk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TJ SHA1-Digest: BYGxSZd4XCV5uu0gVjJYZ/5x56Q= Name: res/drawable/abc_textfield_search_material.xml SHA1-Digest: t7aLlxSJ1jiAbfeYrS+TIQ9arVM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TH SHA1-Digest: LLa2F3t7kV2WuaeLc14w/L2lXHo= Name: res/drawable-xxhdpi-v4/ic_lock_light.png SHA1-Digest: cggyhKwP8K467j9176ETpRtdy0A= Name: res/drawable-mdpi-v4/ic_search_holo_light.png SHA1-Digest: SGAd7cuOCvRNlYd3qBr3geJxi/c= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VU SHA1-Digest: HbjMYeDZRIdreBUbs2Cq8xgI5YI= Name: res/drawable-v21/abc_ratingbar_material.xml SHA1-Digest: lmjnTB/yh4tmiAkHkeKcav4nFGA= Name: res/drawable-mdpi-v4/textfield_activated_holo_light.9.png SHA1-Digest: 2tfE7kha7TRVkhq7YgpEw3Y9FzY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TC SHA1-Digest: P2rYn+GUzQmjwxnWNIV5nW9NSRU= Name: res/layout/alert_view.xml SHA1-Digest: Br0KH+NFXrf9pUA7J7nfo+tGLa4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ST SHA1-Digest: VkjSN7fLfBfcEe5SZcWv/uR6/Z8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SV SHA1-Digest: 87MTJtBvnekgRDqoh3aWergvuWY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SX SHA1-Digest: +M4ddjLE9vXFb6xw+flbYCuty8I= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SY SHA1-Digest: BEeh5XFWqcE47qNiKn93LFSRPL0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SZ SHA1-Digest: hJbbNKy1Q1bfkPX9I/PsS/mjzKw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SL SHA1-Digest: eIVoqanZ1ZJy67maaIFIT6R9FTY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_WF SHA1-Digest: WbdeKurmJI9DXE9iHJuv59WXJwA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SK SHA1-Digest: AjNjSzJsuFLgA8Dcc4TvtCiuGTM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SN SHA1-Digest: UTz/izU4qZwk8y3ZvZKLoRIAvFs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SM SHA1-Digest: m+OKvr4CGjdGcJCjg5uNhP2qj7M= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SO SHA1-Digest: aVQi/dK6f6d6NrDH6GbfDcBtwXs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SR SHA1-Digest: mr2Dh77dKsHX60ZQlNDq49g12j4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SD SHA1-Digest: kEZMnEybm/LZwkI7J55Y0kWZkG4= Name: res/drawable-xhdpi-v4/ic_backspace_normal_dark.png SHA1-Digest: No+dYXGsvygs6zlpkF0mDfgDMWA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SC SHA1-Digest: QXORK2qsVZwQcZS3nHHTkuzujkU= Name: res/drawable-xhdpi-v4/ic_check_dark_disabled.png SHA1-Digest: MViTJyK0ai5eD+lcCbB/mfxqh7I= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SE SHA1-Digest: PxW+hZty5xN51P6O7m+pOpKjvjM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SH SHA1-Digest: y9IF0UKau4eEIN8MY6AXuYo1dkM= Name: res/layout/log_submit_activity.xml SHA1-Digest: 5SPs9x/Yx0vnD3sfhyN1L9CePNM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SG SHA1-Digest: rgXzetnPrU9k0R9cZIpaD8haYns= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SJ SHA1-Digest: I5oNkjMJePXEKnr+GP+0XoJpks4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_WS SHA1-Digest: ItQKkoNByQeq1ddcu+r4o6aIbVY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SI SHA1-Digest: R/8v5Pg11kmuLZ4JjsC0ho7hqyI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SA SHA1-Digest: KSZXOsVtspugLxLthzbF5RGD8kY= Name: res/drawable-mdpi-v4/ic_emoji_symbols_activated_dark.png SHA1-Digest: p1Ts0ObIT4fpP3Oea/h2xJQ5qas= Name: res/drawable/notify_panel_notification_icon_bg_tile.xml SHA1-Digest: IwQ+uXwyEAKvfQTKMCGIQhQIP7A= Name: res/layout-v11/conversation_activity.xml SHA1-Digest: T6kpay7B1Dz0axKJFWNLCoeji0c= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SB SHA1-Digest: NIvNOGZuqSfKY4ldS/EoorKUAf0= Name: res/drawable-hdpi-v4/actionbar_icon_holo_dark.png SHA1-Digest: zY/nEIZhziwsJ79WRFhDlHDVJLU= Name: res/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png SHA1-Digest: M5x5yhIyfAE00veLbT8o+OstFp0= Name: res/drawable-xxhdpi-v4/ic_emoji_emoticons_activated_light.png SHA1-Digest: FCYCyqPIak1PPAm8lZuHrysywGw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RW SHA1-Digest: s3HGVQB9sABfbWh2xXv4aYFOorc= Name: res/drawable-ldrtl-mdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: 9ZpcNdh+3CmLoXOI2QSTVAmsoKk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RU SHA1-Digest: IyrojuthlS4Tltsc349tpSlRbT4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RS SHA1-Digest: 4Zp4Rd85v0edYYVrTfzQlVeGFi0= Name: res/drawable-hdpi-v4/ic_recurrence_bubble_outline_disabled.png SHA1-Digest: 6ahYHWYMu4OAZInGqnk+ouf+IdQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RO SHA1-Digest: KTLlKrp8mtsT4NqPTYNYefex/dk= Name: res/drawable-hdpi-v4/ic_send_push.png SHA1-Digest: C87YP/AcKU2OcHLJ+I8lhxvBT/4= Name: res/drawable-ldrtl-xxhdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: rb/o5dXnd3wSnkR3k6gSSsTsbsc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RE SHA1-Digest: iGS6+KZfHJt03BjO4MnmSWLFYHE= Name: res/drawable/abc_seekbar_tick_mark_material.xml SHA1-Digest: 2cfdudxPpdKT3phtRi1TXi7pHmE= Name: res/drawable-hdpi-v4/ic_textsms_grey_32dp.png SHA1-Digest: vuG/t7wroVh3QjmE0gkH+m3X+ho= Name: res/drawable-xxhdpi-v4/ic_emoji_flags_activated_light.png SHA1-Digest: Bff6GcTHRm1uwjalo2G1J8Grgmw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_870 SHA1-Digest: JQd7ImrAcCDVBuYDH1JSPHWSf8s= Name: res/drawable-xhdpi-v4/ic_info_outline_dark.png SHA1-Digest: yH6D/pPYk7SiepHuMJSn04wwTlA= Name: res/drawable-xxhdpi-v4/ic_unarchive_white_24dp.png SHA1-Digest: zTeI0SzDMFGySNHyn4uNUZnfRnU= Name: res/drawable-v11/emoji_category_places_light.xml SHA1-Digest: gnqJDqV59B5rp8hFa7dVmg0xZEo= Name: res/drawable-hdpi-v4/ic_mood_grey600_24dp.png SHA1-Digest: Hj0b/K/XeEo0MrxOdqSqZMZ9DlE= Name: res/drawable-xxxhdpi-v4/ic_textsms_black_32dp.png SHA1-Digest: gTJ4CMlbnKlZx8zJqXQlfPlaR8k= Name: res/drawable-xxxhdpi-v4/design_ic_visibility_off.png SHA1-Digest: 39WgwQ8A2gMul/kCdVHSfMaXWio= Name: res/layout/share_fragment.xml SHA1-Digest: IqdoCw5LcV/pcaht4DHrvqaUR94= Name: res/drawable-xxhdpi-v4/abc_list_longpressed_holo.9.png SHA1-Digest: 2lRuxodMxnuWn+IclaJShuAV5+Y= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_YE SHA1-Digest: L5FcXJoNyvTtE2xNkttWnJLWGoM= Name: res/drawable/abc_ratingbar_indicator_material.xml SHA1-Digest: 6gbbPFsN/J2Dxd3gmFcvpI6abI4= Name: res/drawable-hdpi-v4/ic_keyboard_white_24dp.png SHA1-Digest: jWWEy90Inty1U/KJpOG1lZiMu9M= Name: res/drawable-hdpi-v4/textfield_disabled_focused_holo_light.9.png SHA1-Digest: /udp2Q0RttqUBxEQk6HV83tN9cQ= Name: res/drawable-xxhdpi-v4/ic_emoji_places_activated_dark.png SHA1-Digest: JVYwpdu0nMp8b6qn37deStXfBkE= Name: res/layout-v13/message_details_header.xml SHA1-Digest: 6t2khWbFIsrlt4HdczqUkRq8Gik= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_YT SHA1-Digest: ci/VBvns4lNNOhH9OObS32+dtp8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_878 SHA1-Digest: VRYqZjoyxSm01oqqk3h0+J0wnDo= Name: res/drawable-xhdpi-v4/abc_text_select_handle_right_mtrl_light.pn g SHA1-Digest: 0sFSb9RiC1Ekht0iXDZIxqOjQtc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_QA SHA1-Digest: nCJbqhYRoyrVRjtCLJcdkFdsT/0= Name: res/drawable-xxhdpi-v4/textfield_focused_holo_light.9.png SHA1-Digest: 3G+rFDxksENpDFDnnWmhx48KLpA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PA SHA1-Digest: psbj72lCq/sL1UFDPF+WdRxFjE0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_883 SHA1-Digest: kDX1xSLz66HnUQDXzN5qLBn27TI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_882 SHA1-Digest: ktmbRdg8Gz2n+qUA8ebBxgxWtAM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PE SHA1-Digest: 4EXXmGnr2E+0zyJGfj0/xtQ5mxk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_888 SHA1-Digest: LwtliyOOWf6PwTZaQStQQYYLZ6A= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PF SHA1-Digest: PrXaxnKuXXfWDon/voJKWJiqDSw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RO SHA1-Digest: /VysOJj9469dUXulaZ2N41d7jTM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PG SHA1-Digest: 8Xhb8+OQXJcz7gI3XlGyOaONStU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PH SHA1-Digest: v4fpxQWJgRR+PdfxHPD5SsU+mWA= Name: res/drawable-xhdpi-v4/icon_lock.png SHA1-Digest: Z0SNskfwhdkoNrpDHS77VfF+9Eg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PK SHA1-Digest: A65rboOYypaau509V41n9l/xTvw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PL SHA1-Digest: Wv8WGdubh03hRMVniWKbV7UCZxg= Name: res/drawable-xhdpi-v4/abc_ic_star_black_16dp.png SHA1-Digest: anvD/umdn7Gbr0QeW9+i2CaHM6E= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RE SHA1-Digest: ZUhxVkruWy08nmep3UAWxDmljxM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PM SHA1-Digest: SQZ7I6va0zPJzwbuV3POrqNyncU= Name: res/drawable-mdpi-v4/switch_bg_disabled_holo_light.9.png SHA1-Digest: 7UJHiJVoqpy2dRzN2BDZ8a3zlsk= Name: res/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.pn g SHA1-Digest: ipZ7n5QscSiC2+nLeSVir23z+dQ= Name: res/drawable-mdpi-v4/transfer_controls_background.9.png SHA1-Digest: 0VZBt8Ugd3Md5Tz54Fi+nEEj8Dc= Name: res/layout/abc_expanded_menu_layout.xml SHA1-Digest: G8xTlaPmMFco2QMPCLDHwprKgwk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PR SHA1-Digest: xO1RQVjAmRVyVX7QAIq+BN2S8lg= Name: res/layout/conversation_activity.xml SHA1-Digest: tYqHpVBkV/xv6W517VQqq/i5g7g= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PT SHA1-Digest: dVqprh0i+d9vh22VegjLWua+BQE= Name: res/drawable-mdpi-v4/abc_cab_background_top_mtrl_alpha.9.png SHA1-Digest: kxSGYJoMOYG0HnE3IprNwOq5ou8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PW SHA1-Digest: oAy03rqC9fj8se4Zb/2uT9UdmHQ= Name: res/drawable-hdpi-v4/abc_list_focused_holo.9.png SHA1-Digest: z5rmTEqRHuMsX24l4sP3B88dR3Q= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PY SHA1-Digest: YMqsB+ycHG539nGUp61je+vPX34= Name: res/layout/emoji_grid_layout.xml SHA1-Digest: i6pRXWxk5o4uaB8M4of5TdUOsSA= Name: res/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png SHA1-Digest: KsVyWTSJS8EOkowXLP9KW5sg2nY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_881 SHA1-Digest: 1ImuOWtFBx85b3f9fK3guBsia20= Name: res/layout/abc_alert_dialog_button_bar_material.xml SHA1-Digest: myoEBw42XsNNDvhPhUWNrMSnJRE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SK SHA1-Digest: UUhVkI6piKRGt3OSmvYR3FfBiUs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SL SHA1-Digest: PUd9DyMto06CBGqcwQGZDVQTgzA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SI SHA1-Digest: WDW9tkGbkeYDiKFg49BwhCnvbbw= Name: res/drawable-hdpi-v4/divet_lower_right_light.png SHA1-Digest: rlgcFpOMVYJdMulAew70KZ7jI7U= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SJ SHA1-Digest: cSUcdEYFcMwFDV8TKGk6jnYAL1I= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SO SHA1-Digest: XMl6G9yJZeIyaCj5w8t/cUEq3ss= Name: res/layout/abc_dialog_title_material.xml SHA1-Digest: WrQrXmc+ow78xNQJ35MGS1YR+08= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SM SHA1-Digest: S1hP4Jx2xtdlOalqxAeOpFH/EPs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SN SHA1-Digest: lsnf2mFPlKLmy9muXtTVLB+jwSg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SC SHA1-Digest: GASpnRPBNWf6J6w6FaDTST91o3c= Name: res/drawable-xxhdpi-v4/ic_backspace_grey600_24dp.png SHA1-Digest: ZVfwW8Pnmiws6HNkppZm4n+w33E= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SD SHA1-Digest: UgYHGSpQmiGcSLTLWr9bqv0yRTo= Name: res/drawable-mdpi-v4/ic_unlocked_white_24dp.png SHA1-Digest: 8I9f+mVCvRJzu+Tv4HRm8/3EKUU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA SHA1-Digest: Jz6pXQIjBTSj35pASVBPMDmqRA8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SB SHA1-Digest: j3emy4+G8ADg51qE22aevraUlNw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_OM SHA1-Digest: KKKCba6YvUE9GegKdjQzrYC8faM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG SHA1-Digest: UaEJ38MLyPEsYJY82QFShFzvCfA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SH SHA1-Digest: ay+tzCVPtaGIy5kuoekTN1ZPvsI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE SHA1-Digest: nXCOEoGKAsMGtpu7z3JMkQuCL3Q= Name: res/menu/conversation_send_drafts.xml SHA1-Digest: iiAhjDSibQ1hL83zevj8mesn2h0= Name: res/drawable-hdpi-v4/ic_attach_grey600_24dp.png SHA1-Digest: HyRgsub0Rl5SxI9bI3u1px18Nm8= Name: res/drawable-xhdpi-v4/ic_emoji_people_normal_light.png SHA1-Digest: YSdmOI7zCoOT7cI3MVxN+D9e1y8= Name: res/drawable/emoji_category_flags_dark.xml SHA1-Digest: sSOcNnzeBN/VOp4VP2yKuacmdoo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RS SHA1-Digest: NTYZRkWtWu+2PTF/kdM5HW8WMVg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RW SHA1-Digest: FF4lOOf/NzJbipI2K33bRHrS7aM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RU SHA1-Digest: p2u5JPJ5XyaGC/DLJSLyXkUkJig= Name: res/drawable-ldrtl-hdpi-v17/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: sJ2bizDjc/IvC35UuxBaI7PxljQ= Name: res/drawable-xxhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png SHA1-Digest: 3uCMhkxK9aSNR8eXJyKd8g2eW/g= Name: res/drawable-hdpi-v4/ic_app_protection_gray.png SHA1-Digest: qcDRdnwrgZDD68xNgO2MVMmo4ac= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TN SHA1-Digest: zKMM896w490z2brJZrmx2isnpcE= Name: res/drawable-hdpi-v4/ic_emoji_symbols_normal_light.png SHA1-Digest: uQGeDtZlRZxvXN6oDUabamSpYcE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NC SHA1-Digest: HmgujHYGI+0ZY96JYVJZJkarHyo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TO SHA1-Digest: +9RrnHIfzrqb00iHIkaoG0lTcQA= Name: res/drawable-xhdpi-v4/ic_advanced_black.png SHA1-Digest: yOnkzbvF0s9fB4W1cWSoF8Uy/C4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NE SHA1-Digest: Ttv2dyZeK1tp82DCpE5QVyoSVuA= Name: res/layout/time_picker_dialog.xml SHA1-Digest: m6w/DwIO4mAWI+Dpvif29yLiwMk= Name: res/drawable-xxhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png SHA1-Digest: i8wYHM8BdG6ZwwbsPcMgrtWVs1o= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TJ SHA1-Digest: VzIqZbtItNuw85wPc57RWLsIW1A= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TK SHA1-Digest: ShkEkMq83HFT1gKS2+quvzj8Ekg= Name: res/drawable-xhdpi-v4/spinner_disabled_holo_light.9.png SHA1-Digest: I/VVsCusXLFlgQt+3GdT6CGWj/I= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TL SHA1-Digest: GSa2GXtwB4FpahkJKMZAP0JnZEE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TM SHA1-Digest: crEXZutS188fBibcIs63+xAJ9/Y= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NA SHA1-Digest: LzETU+chj2E4UmrIzfBNB94vDF0= Name: res/drawable-ldrtl-xxxhdpi-v17/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: wAuClHmA726/rhHTR7gcaVbnnh4= Name: res/drawable-hdpi-v4/spinner_focused_holo_light.9.png SHA1-Digest: 3zmmBeKWyKRhH23IcfeYZhVwLyY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG SHA1-Digest: XuB2EJ54CFbimhdLiJ6SShfDvvs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH SHA1-Digest: DQu+/i3MH0vskJrZ9gLaX85NgXY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NL SHA1-Digest: 9gXOdrW5uA10gXI87KH3/nrIOIY= Name: res/layout-v17/abc_dialog_title_material.xml SHA1-Digest: 4ZPyYhlyaZDIFv3B2K6zngWIMZg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NF SHA1-Digest: kri4ENe4sOygZDd3APacz+tJpKg= Name: res/drawable-xhdpi-v4/ic_group_white_24dp.png SHA1-Digest: efkBALEOtT3s6Vu2NRVOc63Qybw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NG SHA1-Digest: jSOz9LMAbRi5o6ucO/v1bfmPn8I= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC SHA1-Digest: 2zgcoPtiMDg+0bnxLNi84DZATxw= Name: res/drawable-mdpi-v4/ic_backspace_disabled_light.png SHA1-Digest: sJNgMwrj4xE2+79HxIrMqbmY7nM= Name: res/drawable-xhdpi-v4/notify_panel_notification_icon_bg.png SHA1-Digest: qZTXDPkLdLdgn9U7jvOCObBW7aU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TD SHA1-Digest: Re8N7/eSIlGfgHheJVbxks+nncA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NI SHA1-Digest: XxPOnhPln44M7epXmAyrHbx06lA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NR SHA1-Digest: reUcQGkm5nZ7I85HY9orW5gciws= Name: res/drawable-hdpi-v4/ic_volume_up_light.png SHA1-Digest: gOrn4BUJjdBQkyIlZUSbMoTVggM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NU SHA1-Digest: XOibTOofTA9DAQ0QSy9fmYIAk5E= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TA SHA1-Digest: WJ+x2vyXe10ayIuDS2K6DfG6krE= Name: res/drawable-hdpi-v4/ic_send_sms_insecure.png SHA1-Digest: Ea8rLJM+Eo9rEaKSlbDO8xqchss= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SZ SHA1-Digest: L5YeE6Z1hb5T+6+BEgQNhg7x/Kk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NO SHA1-Digest: Ofk/FepiqsPlAtruvP8cx8lTE4k= Name: res/drawable-xhdpi-v4/ic_emoji_people_activated_light.png SHA1-Digest: iE9Ivms3TJKB3J0ARSkjtZWomks= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SY SHA1-Digest: ZH9cmvHEdiM3gfdBQ7tutvvmmwc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NP SHA1-Digest: qoIkqcy6RODpQtSeA0vs4yEKz5c= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SV SHA1-Digest: MZDmXNHQGh6rEN8PbePd0dGwQZ0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NZ SHA1-Digest: /yzMmaL318HTGJLcBex1KuZ2whA= Name: res/drawable-hdpi-v4/ic_lock_white_18dp.png SHA1-Digest: HETP5KoA2IVulF3WuJKEPW22ZH4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX SHA1-Digest: bg768pEb+O3Ug2NxXJASswBsZY8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SR SHA1-Digest: Z1lD8EeLOeqPhPcvaMC4lCZ9SD8= Name: res/drawable/unread_widget_icon.xml SHA1-Digest: 48hOKLPIZpRITJN3NMzJ1OwnIMc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ST SHA1-Digest: B7DzNW3EfhSaf5Og6iJS5RKFp3Y= Name: res/animator-v11/scale_with_alpha.xml SHA1-Digest: VoONsngcyPaOcsxveoWj4d5Ytsk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SS SHA1-Digest: A6YcnEx7rBr3pVI5bRp0B1CvM6o= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MC SHA1-Digest: uo6VEOYynPxFJZHlGeDlHUf3Yeg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MD SHA1-Digest: caVfQWkZqV6JO6QPij0H3g1ufdc= Name: res/layout-v16/contact_selection_list_item.xml SHA1-Digest: MCVJ/7F24YEHA4tl2W8jSoR/7sE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MA SHA1-Digest: SHJ/tfwoGaglI2v2LbiX2R+NGUA= Name: res/color/abc_primary_text_disable_only_material_light.xml SHA1-Digest: TpKwzuD1e5/ZOIvTHOUHlcLNSZA= Name: res/drawable-xxhdpi-v4/ic_done_all_white_18dp.png SHA1-Digest: H13Ryi9PkX6C/uaIUIncPYpPO0U= Name: res/color/abc_hint_foreground_material_dark.xml SHA1-Digest: v7j7l+GbLvDF1F69hRS9LDfggu8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MK SHA1-Digest: LfAEf/cIj67t8rw1UKqe4tVSgmY= Name: res/drawable-v11/psts_background_tab.xml SHA1-Digest: nn+o3yq9mqh6oX8CcK/VI3H2I7s= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ML SHA1-Digest: gsP6Cgjej/FEhPiWoM39L88dP3c= Name: res/drawable-xxhdpi-v4/ic_clear_white_24dp.png SHA1-Digest: 7QbJLZbH/knp5MCIscxlYSCv74o= Name: res/drawable-xxhdpi-v4/ic_emoji_people_activated_dark.png SHA1-Digest: OnGHafI8PsaxHGZ8lZwmirnrw4I= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG SHA1-Digest: 5pO4+JUCjB3JMaM57LQOhI8xBiY= Name: res/drawable-xhdpi-v4/abc_text_select_handle_left_mtrl_dark.png SHA1-Digest: ZwRe0lGO9yJr+od2SmhGzEZccaY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MG SHA1-Digest: 0eGPq0v++0EKz5OHCxcavT5vXxc= Name: res/drawable-mdpi-v4/ic_emoji_flags_activated_dark.png SHA1-Digest: hmw72OlceE2gTL+0XuAYVvUmuuo= Name: res/drawable-mdpi-v4/ic_emoji_emoticons_normal_dark.png SHA1-Digest: 79vTb7EL0wLxCNjKQAjmgUzxLXo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MH SHA1-Digest: GMBhmd2G3+hHr0m9ZYFIikkocjg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ME SHA1-Digest: Zf2+VjwW/dEIk7DmUNY+g3ff+UY= Name: res/drawable-xhdpi-v4/ic_recurrence_bubble_fill.png SHA1-Digest: ATTGE3BfNYhQXnFTX7Jpnbu13sU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MF SHA1-Digest: kCBbzw4t7oZ/QvN6zGigwQdafDo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MT SHA1-Digest: bE+XexQWyFQTTTWmAYfLT8YnHo4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MS SHA1-Digest: fR4k036AGzbv0GAL1uG34ad+MEE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA SHA1-Digest: cKQEqQ3Ry6WQnI9roOhPpFhoQrM= Name: res/drawable-mdpi-v4/ic_group_grey600_24dp.png SHA1-Digest: OsTpB8ywzd/6Engq6RtZq8EmURM= Name: res/drawable-xhdpi-v4/ic_save_white_24dp.png SHA1-Digest: 8MAtxxR4dqh91IujDrakxC13KE8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MR SHA1-Digest: 735sOB9SlXzrg0vtbMbDRV0pEuU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MQ SHA1-Digest: U8BwiAJPu9tGWqhRMCVPQ6rUW7Y= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MP SHA1-Digest: ZLrKuheJUOTF6GUuW4KcaIfNP/E= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MO SHA1-Digest: Trt4UFTbPA8Jz14Irxp8ezg+3SU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MN SHA1-Digest: re2oAQbaFVaV/mAWaAT4oHWjjXs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TZ SHA1-Digest: FPyLF1sL+karcpECpUek/fs7+Fs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MM SHA1-Digest: HjpVhT7ZNh4W1kX23z2IKiKf3ZA= Name: res/drawable-xxhdpi-v4/ic_play_circle_fill_white_48dp.png SHA1-Digest: 5BeXj8m+V5yiA3PMUY8Pgy64200= Name: res/drawable-xxhdpi-v4/ic_launch_white_24dp.png SHA1-Digest: tfVuoH+DeAzzjIa1NfP+SAyX3p8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MZ SHA1-Digest: /OhXIWqDgM0uKzI3quol7bjdsh4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TW SHA1-Digest: IEbHvJq9kgVyHfHOaL4rh9Y6JzY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TV SHA1-Digest: 72Jjc6F7cDsd1dv63W5WTQTHoPw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MY SHA1-Digest: MVxBPbFhghaveOT6m1IrgoQ92uM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MX SHA1-Digest: C3QrVFuO/wliul+KTCEfaEC9/eI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MW SHA1-Digest: 9w1LHuITAAgb4XhUREXKM737dGA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT SHA1-Digest: 3xrIv6e9IaimbBhjBkzvHyuEfe0= Name: res/drawable-hdpi-v4/ic_emoji_places_normal_dark.png SHA1-Digest: 57Y653GtbW2CTvIKUoFbMMXzqvI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MV SHA1-Digest: A1zaPSqaOvWAusj037B/7VFow0s= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TR SHA1-Digest: x/oSY3zmOSH2fRJ6AemrYQs7R8E= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MU SHA1-Digest: qvzj+8VbdeWnQyfD+L6BoLgYY8M= Name: res/drawable-xxhdpi-v4/ic_message_white.png SHA1-Digest: rKHDpW/UO07d/mAofolYj0QZlvY= Name: res/drawable-xxhdpi-v4/abc_text_select_handle_middle_mtrl_dark.p ng SHA1-Digest: BsdbhQlKpA9SYn+gClLarvMmIr8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LI SHA1-Digest: ml9UJKN4SSjRYZp65Oq8zglGLTg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NA SHA1-Digest: KN3sYQBTEyjhXC4ZSYFsguRDc3s= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NC SHA1-Digest: wnzri/DybN2pzYMn0C/UjEfeV3M= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LK SHA1-Digest: krOUkhcmVai3w2aSx1gWHAg1TUk= Name: res/drawable-xxxhdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png SHA1-Digest: ilUGdamMg84FuhryTDOf/swhS+c= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NE SHA1-Digest: Pb8ZnheYRI60t4QnqMEgqTChryc= Name: res/drawable-mdpi-v4/check.png SHA1-Digest: clJy7TAIQVyhe6mzvbRlv99YZOo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG SHA1-Digest: 05+zMc0T/rmCvavuTvMI2pDGnEY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NF SHA1-Digest: kndUyibcB+csXZqB3GT5xT2/xEY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NI SHA1-Digest: FucWSZ3wZV+R+XWNZP/oR4aqCHY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LA SHA1-Digest: TzqD12trWknS3BtHiqj3R5VOFVg= Name: res/drawable-xxhdpi-v4/ic_recurrence_bubble_disabled.png SHA1-Digest: QG1tzjajYfGOEBkcVPy8Houulog= Name: res/drawable-mdpi-v4/abc_ic_star_half_black_16dp.png SHA1-Digest: 3NcPIbGQECgdCby3I+naN/3MIg4= Name: res/drawable-xhdpi-v4/ic_emoji_places_normal_light.png SHA1-Digest: KQY4daNapv4pOE7cEXCXqZkgcKw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LC SHA1-Digest: b4RpZ0zwp17OsCDKZ19fevUpDx8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LB SHA1-Digest: INV6mTaQZ7jwI7NRuimINJ1jLTQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MK SHA1-Digest: z13v1mVv+25E708MCi4mcR+QVNs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LT SHA1-Digest: yLGKah4iP0qZdMJL3FZvMCwcUvM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML SHA1-Digest: 2QQX1zBwC0Cdu/kbRiJV/qVQS1g= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LU SHA1-Digest: FDQNiTaG/bb+rQZW283xhSL2/dw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM SHA1-Digest: riIBpBXX2fhLdNtOBIiaEQXqXY0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LV SHA1-Digest: dFkEEnxq/1FcwvjmI4tiS9ulqHg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN SHA1-Digest: uUKYV/caMCD+Kj5DIPgu8anitAE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO SHA1-Digest: m4IKx6zzLQLCNXnDOrUZha+inzE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LY SHA1-Digest: tOy1xvlr875aH7JU3j4he6GVXUw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP SHA1-Digest: JFn5GEpAGcALxZ8140RAhZdktnc= Name: res/drawable-mdpi-v4/ic_add_white_24dp.png SHA1-Digest: foIOFC0YJcLMes6bNxRUeXzNCR4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MQ SHA1-Digest: Te/AsAogzC4wHaWoA3/BOcEZX8I= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MR SHA1-Digest: oQJSiN5JqXP+4IAvNSzzN4hdPwA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS SHA1-Digest: XeC+tYs/5pWrchlG4Tjgr2QPlG8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MT SHA1-Digest: oiZbGtJGQ210WuZZfAx9ALCLksU= Name: res/drawable-xhdpi-v4/ic_app_protection_black.png SHA1-Digest: 1cP/7NkU0BLMnD3fLdI9zDXDIvI= Name: res/drawable-xxhdpi-v4/ic_emoji_objects_normal_dark.png SHA1-Digest: SFTSQmdFwDJs8Po4Hh4GSszGHdI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MU SHA1-Digest: lmPdov+OSu+1pxxe9/4SSlDKORE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MV SHA1-Digest: oK3+1OyTrYU1OcMDodCFG0d9CRc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MW SHA1-Digest: qMFpXXZbW46Q3nAZnmxkk5KNXy4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX SHA1-Digest: GOmsf34KhPFVIgGwifd/OQY7dh0= Name: res/drawable-mdpi-v4/ic_account_box_dark.png SHA1-Digest: N8c3AZqHptj00S+V5ni4XLrx5FE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY SHA1-Digest: Z0ByGaTpVBcLdQ9ks9YXogBAq08= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LR SHA1-Digest: MPz6+q+V+vK30uaWDOsTm0r+02w= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LS SHA1-Digest: ebR59a5l0UTkiLg8bGlmVLOW+O8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MZ SHA1-Digest: 9EkzkH4v0oHu4jxfxjqFII1TXHo= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_27 SHA1-Digest: mGMwCzLy54rC/B9P+BWgJ/aqtLI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KE SHA1-Digest: jXjVi5jMulFFzFQoOh+0d6vpNwQ= Name: res/drawable-xhdpi-v4/ic_volume_up_dark.png SHA1-Digest: VCpxxBJJIWJPwwCgQrrCEtlAuVc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KI SHA1-Digest: yT4TYLZvm7F2eOcjgZxhb8QGCWY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KH SHA1-Digest: CxalpliKly3QdAQXL2PS91m79M8= Name: res/drawable-xhdpi-v4/ic_volume_off_grey600_18dp.png SHA1-Digest: 81zwVRK9ajRJVQYJLq0WshZYONw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KG SHA1-Digest: p4UwBVa9PVpC435eAXPN2PLU03k= Name: res/drawable/error_round.xml SHA1-Digest: n67C+HKq1nJ8tJ9rWOj80CdjZKo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NO SHA1-Digest: By0a86+TigoJBP8a/jt2YbXZcbA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NL SHA1-Digest: Ha4hDjZN16nRgzkBjwvS9fObwBE= Name: res/drawable-xhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png SHA1-Digest: ZASdEykkaZcSZ7Yjx1dUk6dEVjE= Name: res/drawable-xxxhdpi-v4/ic_pause_circle_fill_white_48dp.png SHA1-Digest: yjDnncHTi2TZtYT3gfkaXmpFgs0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NR SHA1-Digest: ahprX5nq0TbQxWaW48NfNaRuhjE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KY SHA1-Digest: rGd9z8xttxp6/vIr5R5UifPupgc= Name: res/drawable-xxhdpi-v4/switch_thumb_activated_holo_light.9.png SHA1-Digest: 6u81K4sjx958syfrNuc0b5VyCtw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KZ SHA1-Digest: z8PANXDSq5nhyhcK+JmM2j4x0Wk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NP SHA1-Digest: Xt933D4XMBUtNFx+0F7p/w5X/f0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KW SHA1-Digest: v20YnEtJ31VDO+UB3dRKREtZY2E= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KM SHA1-Digest: oKBDs+V52MxB5ZGOVRcairbGgSQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KN SHA1-Digest: NFIFxOusC/uNJef7MTtf7ZRkmEw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NU SHA1-Digest: w1JenUwANTZL4dfTY/aKD2Scsq8= Name: res/layout/conversation_item_header.xml SHA1-Digest: StFS3EO2QuAvfEzV6dli3IXsR5E= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ SHA1-Digest: KJ8G7sin7R7w+cQsgZEpZsL2Usc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KR SHA1-Digest: aRBbP3wmkW2WzPsbRGQbRdE1PCI= Name: res/drawable-mdpi-v4/abc_list_pressed_holo_light.9.png SHA1-Digest: +VIFOUvUwxbnTdHmmjA8LWrUN0k= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KP SHA1-Digest: rw+tCgv/zQPGikAdPAkP0BXLu/Q= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE SHA1-Digest: SXd0r6EDLyyXer9xu3xKkHlNg3s= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA SHA1-Digest: zJenZHuZ2cn3hQZmzVmM6JhtvXc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JE SHA1-Digest: wH8VNKVSJjFwqUnb16ypmBK76lQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PK SHA1-Digest: Eq6rPtosPBzXgL4hJ/f0Gbg/FIw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PM SHA1-Digest: L0nqsOVum6HIQ26c77To4p125qQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PL SHA1-Digest: aeRxfkk/EQFfTZ/rJINnPR3cJtc= Name: res/drawable-xxhdpi-v4/ic_brightness_6_black.png SHA1-Digest: np5V0QzKye3eTLCxW4kcaUAj4NM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG SHA1-Digest: rXO3qI9wrLTZrs+5ryKewhxThxY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PF SHA1-Digest: Odye7mb6I5teGMP4MAenbO8iIbw= Name: res/drawable-xxhdpi-v4/ic_menu_search_holo_dark.png SHA1-Digest: T/L5sJVW2pxScaLsCvlNRHZ46vc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH SHA1-Digest: IkH5hm0h255EZ1NOqB3I8cMzn2Y= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_OM SHA1-Digest: 9evyLcqbrJfZK1P2JsLmf6Lk+K8= Name: res/drawable-mdpi-v4/ic_circle_fill_white_48dp.png SHA1-Digest: PuMj32bJamOW1qHxoKzxZMOShX4= Name: res/layout/abc_action_mode_bar.xml SHA1-Digest: ImmPWOji0acusMAqHT/D5Yk5qAE= Name: res/drawable-xxhdpi-v4/ic_brightness_6_gray.png SHA1-Digest: nCvOoIxTQ5Jo5PXY6NscsSRPDVg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JO SHA1-Digest: etnm4aLA+bHA5+OIdGZ5jCAOPgk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JP SHA1-Digest: kI7O7DnD0LvU3XrTIXT7mFRNCyM= Name: res/anim/abc_fade_out.xml SHA1-Digest: MfCV1efdxSKtesRMF81I08Zyvvo= Name: res/layout-v16/reminder_header.xml SHA1-Digest: lhMVKAV9MJNYuW+SJ2lfvSoW5EQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JM SHA1-Digest: I8yXX/kkW3Ln9yDueqlGVv5MtBU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IE SHA1-Digest: sicER8VgddgNWkvp/J1z12l7PcI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ID SHA1-Digest: vuc4G/SN8nrGzAAd+P8WRJI/27s= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA SHA1-Digest: y8J4KXh2lNccc0XbY4yCoEptzdM= Name: res/drawable-xhdpi-v4/abc_list_pressed_holo_dark.9.png SHA1-Digest: I+f9Vf8JVX6hz0eqBuaNI+f4Rtc= Name: res/color/date_picker_year_selector.xml SHA1-Digest: 3R7vZBjmVG+BXr0gy7Pspt7A4EA= Name: res/drawable-xhdpi-v19/switch_thumb_pressed_holo_light.9.png SHA1-Digest: YcyJfNOau/BOW/i7/AKIHt1H59o= Name: res/drawable-hdpi-v4/textfield_default_holo_light.9.png SHA1-Digest: xrFOt/AjhDtJdBUDzaDAa/6vFAw= Name: res/drawable-hdpi-v4/abc_list_selector_disabled_holo_light.9.png SHA1-Digest: 1gu0+JdGxgtkd7hnwaQbfLEaaZc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT SHA1-Digest: M/lgCqL7346CiRuNiwWoopOi3IY= Name: res/drawable-mdpi-v4/ic_arrow_forward_dark.png SHA1-Digest: Db61tKVCqpJI64QUArwkoeCtcG4= Name: res/drawable-xhdpi-v4/ic_movie_creation_light.png SHA1-Digest: gzWv88BpzIzhVh6iN9KvMTFdg64= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR SHA1-Digest: q1OPwC71Oo4DqRtGBNRJJhOZhTI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PS SHA1-Digest: +e4rAQsWt2o0yPs/9FDJMCNC09c= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IS SHA1-Digest: Hkhv50LIoiHJCsSLH1Q27KO4PJw= Name: res/animator-v11/upper_play_to_pause_animation.xml SHA1-Digest: nGbOGdCFxUAa/SlhCCYlGiHVxe4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IT SHA1-Digest: LvsHP2PjdZNyG7ejzSxAsDW2gn0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IQ SHA1-Digest: xEti79j2sC6UEr2VCVAVOXIRXXU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IR SHA1-Digest: BRnECbhEDa+NUw6gWW/rNLV6BgA= Name: res/drawable-hdpi-v4/ic_send_sms_insecure_dark.png SHA1-Digest: +DidnvthsssPTHPXdMgIQm6bx0Q= Name: res/drawable-xxhdpi-v4/icon.png SHA1-Digest: DF9F713jv+PmMazzAZGr/P2JxVw= Name: res/layout/led_pattern_dialog.xml SHA1-Digest: Yi+0WyrYWJJr2NEqvUCjF2mfObE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IM SHA1-Digest: FHNFdvFcLT8Rn93VtNQhMjlG+yg= Name: res/drawable-xhdpi-v4/ic_save_all_white_24dp.png SHA1-Digest: KQ3TTeFDr9bKYUBuEPZiuUPPbx4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IN SHA1-Digest: 58W4VnHh8FvOYbiChCUNqzlEhO0= Name: res/drawable-mdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png SHA1-Digest: OxGddZL5ftUUMkIS3GSFXNepBP8= Name: res/layout-v16/fragment_submit_log.xml SHA1-Digest: hxjviwb1dreKwtm17ksg3YfY6cE= Name: res/drawable-mdpi-v4/switch_thumb_activated_holo_light.9.png SHA1-Digest: 37aTq/CoCuhzr5/FuGa2TR5yBiA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PY SHA1-Digest: cX4Ed9CqZzNmbYXhguvSsu80sWk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IL SHA1-Digest: ag7zl70llm/HvTsrO2mgc6hOLMo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PW SHA1-Digest: 79DunG6XWWrDpFseuRcQ/eOxaTY= Name: res/drawable-xhdpi-v4/ic_info_outline_light.png SHA1-Digest: LEi02ZgaOIan0L1KZ0bQBAQjP48= Name: res/drawable-xxhdpi-v4/spinner_default_holo_light.9.png SHA1-Digest: TcXBLoAjAlB5KEh8iwVEKiOanVI= Name: res/drawable-hdpi-v4/list_selected_holo_light.9.png SHA1-Digest: DS5Yp1zkxBKJsNnlKmSULzDXa7o= Name: res/drawable/emoji_category_nature_light.xml SHA1-Digest: 6Anm/WyDvgauMmBK0jM/BWyYvxE= Name: res/layout/expiration_picker_view.xml SHA1-Digest: SXYWoBOkixf482pdV3iThCI7g1g= Name: res/color/abc_tint_seek_thumb.xml SHA1-Digest: rMFHVJxtqSk9KDdEBDPHB2GRr9I= Name: res/drawable-mdpi-v4/ic_backspace_grey600_24dp.png SHA1-Digest: RYzAAUdktXszW6j5RXtHi4xW5k4= Name: res/drawable-hdpi-v4/abc_switch_track_mtrl_alpha.9.png SHA1-Digest: aq/s3PoS9wD33oPeDdmP98R6Bkk= Name: res/drawable-mdpi-v4/ic_emoji_symbols_normal_dark.png SHA1-Digest: fFAh7s1JMyyxFRn2ZPID+oIMl0Y= Name: res/anim/design_fab_in.xml SHA1-Digest: dRcgYgcLN0gY/2aHKJnWN/oMfkI= Name: res/drawable-mdpi-v4/ic_group_white_24dp.png SHA1-Digest: giBsdJeQqWg9AW8Mp5wXGrXayx8= Name: res/layout-v11/notification_media_cancel_action.xml SHA1-Digest: /KZyZOzEiShP2cP0cqnTYl+6vGU= Name: res/layout/abc_select_dialog_material.xml SHA1-Digest: A7IHpYuFPT4BZuoZCj+m//qLCmY= Name: res/drawable-hdpi-v4/ic_photo_camera_dark.png SHA1-Digest: foH6nqH7iVHHZfjpplINWKGaFdE= Name: res/color/recurrence_bubble_text_color.xml SHA1-Digest: nXh/1epHXtEJAUdry7YMj9updrY= Name: res/drawable-hdpi-v4/ic_emoji_nature_activated_light.png SHA1-Digest: GE/eS21/a3n0s9Au9TfoETXkpwg= Name: res/drawable-hdpi-v4/textfield_activated_holo_light.9.png SHA1-Digest: Afh8MLGJ3Tx9XRM7C/09jOu01ZE= Name: res/drawable-xhdpi-v4/switch_bg_holo_light.9.png SHA1-Digest: saSmYyqe/82/e2GZuWPAi3VYDPE= Name: res/drawable-mdpi-v4/ic_lock_light.png SHA1-Digest: AKTlpv1YGRuka55Gh+9A59hMn2M= Name: assets/emoji_objects.png SHA1-Digest: vALA6/+WIvuV6gUb5XbcWg5VSS8= Name: res/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png SHA1-Digest: i/xNJ0zuX8i2Qm+lgnh6E6fytF8= Name: res/layout/prompt_apn_activity.xml SHA1-Digest: OvaHMTSuMoMljSQf2Xvh7Jm61pk= Name: res/drawable-hdpi-v4/ic_backspace_normal_dark.png SHA1-Digest: SZn5liFxoX/jJVmxFQ4A2CKTk7Q= Name: res/drawable-hdpi-v4/ic_emoji_objects_normal_light.png SHA1-Digest: 1w29UAnuelWx3GYsNGiOSwuP1HQ= Name: res/drawable-ldrtl-xxhdpi-v17/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: +w/ZV/rJjEMwJS8xH78Mb+2mCMU= Name: res/drawable-sw600dp-hdpi-v13/ic_backspace_disabled_light.png SHA1-Digest: IevK+QGpXr4W7U6uEy6/dLSKg7k= Name: assets/databases/apns.db SHA1-Digest: pj48GVeEBI6ASfUuOGxSeOPuf4w= Name: res/drawable-mdpi-v4/ic_photo_camera_light.png SHA1-Digest: dAu2KZbi7TpJrXbO/C/ZIaEvxbg= Name: res/layout/abc_search_view.xml SHA1-Digest: V7B95cDcwylyEL0KN1ZgvnZlKa4= Name: res/drawable-hdpi-v4/ic_mood_white_24dp.png SHA1-Digest: fUyna2W89cwhr5AHUHz0t7XpZ8Y= Name: res/drawable-xhdpi-v4/ic_dialpad_white_24dp.png SHA1-Digest: zizow2Izc03ucIDK5+Sbw0uVbpk= Name: res/drawable/blocked_indicator_background.xml SHA1-Digest: MwCsXD/KfJg7MgCoWeyTjHysrFs= Name: res/drawable/emoji_category_people_dark.xml SHA1-Digest: 0AoQv/D2FJIPa6agySSspeLXdD0= Name: res/menu/media_overview.xml SHA1-Digest: sPVsPmTH3ulTZpkbgiEkACB9ogc= Name: res/drawable/list_selector_background_transition_holo_light.xml SHA1-Digest: pE/CDG+g87dnlNUicaEve/fKfYI= Name: res/drawable-xxhdpi-v4/check.png SHA1-Digest: pl1AJZMp+3qUvB5MOxVuvVfLSPo= Name: res/drawable-xxxhdpi-v4/ic_done_all_white_18dp.png SHA1-Digest: vR2TeECLw9lbIobeyhvdVAPI4aI= Name: res/layout/import_export_activity.xml SHA1-Digest: KvpYKS2DzUUX5c+l82mvknhKPfw= Name: res/drawable-mdpi-v4/ic_send_insecure_white_24dp.png SHA1-Digest: WvVhyaTyQZ6D4UDNNwoXv5gbI3w= Name: res/drawable-mdpi-v4/ic_launch_white_24dp.png SHA1-Digest: qTNaWuUDE/Jwfi67PxACCQIEZJw= Name: res/drawable-xhdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: yNA/pJXAiNoyw8sLla3LwK1IuWs= Name: res/drawable-xhdpi-v4/abc_popup_background_mtrl_mult.9.png SHA1-Digest: jwT1/Yme29EdIvYr7bm6kxB5lJk= Name: res/drawable-xhdpi-v4/ic_textsms_grey_32dp.png SHA1-Digest: 4zwAkMq6ta+bidHo5cTkoWra1Lk= Name: res/layout/keyboard_text.xml SHA1-Digest: Ld5BDKVvJcBv3RZOSPHFfMu/BfE= Name: res/drawable-mdpi-v4/ic_forum_grey_32dp.png SHA1-Digest: 5mZCwzTnzeapqyoC8S/JcU2BSLs= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_7 SHA1-Digest: R13VmLCbBwMg6K479CnJtnC+bXs= Name: res/layout-v17/conversation_fragment.xml SHA1-Digest: 9vgP2do2wWNfvHNaS5C5Q/q/zRg= Name: res/drawable/recurrence_bubble_fill.xml SHA1-Digest: f3GCv6rhCWwIFFg/JzEgZSezfvU= Name: res/color/date_picker_selector.xml SHA1-Digest: HWOTUXrOCRonuyuxCSSy6QsSxxA= Name: res/drawable-xhdpi-v4/ic_unlocked_white_24dp.png SHA1-Digest: nnyKFq53Gc6DZ/FqDhGbB9xlung= Name: res/drawable-xxhdpi-v4/switch_thumb_holo_light_v2.9.png SHA1-Digest: /dwwrT/7gkG9oNAKszZBP8puxAs= Name: res/drawable-xhdpi-v4/textfield_activated_holo_light.9.png SHA1-Digest: Gmocm6iACu2JtEPjYWad8j6ha90= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_350 SHA1-Digest: FL/nPG4XaSrRGuHfx7krOQDoLG4= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_352 SHA1-Digest: AQbsxBOsaCrzJXI/KS99rfUChNg= Name: res/drawable-xhdpi-v4/ic_mood_grey600_24dp.png SHA1-Digest: eea4+Tx2y464XAKVfXA/o0mAxQo= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_351 SHA1-Digest: 8gUjWk4JW0A+ylZayZHRoen3pFU= Name: res/drawable-xxhdpi-v4/ic_emoji_places_normal_light.png SHA1-Digest: 3F9Y+qUhDtSqsq6b501VgbR42i0= Name: res/layout/conversation_list_item_action.xml SHA1-Digest: I1nQIFRFmKjx1XbSAms2IvXJat8= Name: res/drawable-xhdpi-v4/abc_text_select_handle_right_mtrl_dark.png SHA1-Digest: Er2l3pdoeBwBOmP2sgisT7f+pW0= Name: res/layout/abc_list_menu_item_icon.xml SHA1-Digest: IHjMoWWbSOePG8X4KyBCdZH/r0I= Name: res/drawable-hdpi-v4/sms_selection_icon.png SHA1-Digest: y6JUbF0OyJW7DReN+vDl3rFkvnk= Name: res/drawable-ldrtl-xhdpi-v17/ic_send_white_24dp.png SHA1-Digest: oadJZycEHwI6rCUqfMR/huPDM1U= Name: res/drawable-hdpi-v4/ic_group_grey600_24dp.png SHA1-Digest: TsaEgJUU7sNGtdx8cVq7g7mclu8= Name: res/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000 .png SHA1-Digest: h3lL6tDTgeEUsHwNZiv+gOveu1A= Name: res/layout/calendar_date_picker_done_button.xml SHA1-Digest: jXAu71ZxI7rd22TsQVW44vrI3N8= Name: res/animator-v11/bottom_play_to_pause_animation.xml SHA1-Digest: L57WeA9XqgSXopnhomGIU+zO0WE= Name: res/drawable/ic_check_dark.xml SHA1-Digest: guWXfOAn/P9qpKmKSw8YXT23zr0= Name: res/drawable-hdpi-v4/abc_text_select_handle_right_mtrl_dark.png SHA1-Digest: Qbl+T5s4Vgus+255ilPjOARwhY0= Name: res/menu/log_submit.xml SHA1-Digest: m0IzL3uKbtyRFUcTw0XUpvfNJWg= Name: res/menu/local_identity.xml SHA1-Digest: TJYkQb/JH6dHdmcQHfGCke96cmU= Name: res/drawable-mdpi-v4/abc_switch_track_mtrl_alpha.9.png SHA1-Digest: QhKzfQqaMjEUNLGmR/QjnJ0PWe4= Name: res/layout/notification_action.xml SHA1-Digest: qhq9wA6wEMXdRX6DfU/xMNyQqgU= Name: res/drawable-xhdpi-v4/ic_badge_24dp.png SHA1-Digest: Y0sUZk/5avRSaigeuMbbuLfp7ZE= Name: res/drawable-mdpi-v4/ic_emoji_nature_activated_dark.png SHA1-Digest: cX9FigaizqvhmxmCtyfqQ0rxztY= Name: res/drawable/abc_tab_indicator_material.xml SHA1-Digest: HLMNWYzS8Xr2+cGXFiCZarvGfLw= Name: res/drawable-hdpi-v4/ic_visibility_off_white_24dp.png SHA1-Digest: ogZbqcK/nD9kEQDdeTvSnGrDAkA= Name: res/drawable-xxhdpi-v4/abc_ic_star_half_black_16dp.png SHA1-Digest: VIxY8NsnHv+fMmCSUp80rTA+ORM= Name: res/drawable-xxhdpi-v4/ic_menu_lock_dark.png SHA1-Digest: Uiu0uuGjm3xA3Z0+ZYLiD+mDVts= Name: res/drawable-hdpi-v4/ic_message_black.png SHA1-Digest: 14B99xRUu4LvGytCpQ8Wt+5OghU= Name: res/drawable-mdpi-v4/ic_send_sms_insecure_dark.png SHA1-Digest: Y72eTMA51B0PYfNH7TBb1oy25J0= Name: res/drawable-xhdpi-v4/sms_system_import_icon.png SHA1-Digest: esyNqLcMcUkL9ySUdONxbY4R7U8= Name: res/drawable-mdpi-v4/ic_backspace_disabled_dark.png SHA1-Digest: 3p7UfcrwDxKcyJjfazGz1v3IEC8= Name: res/color/text_color_secondary_dark_theme.xml SHA1-Digest: GEzRfoygmSXPKZxKBrh4H8TaO8I= Name: res/drawable-xxhdpi-v4/ic_lock_white_18dp.png SHA1-Digest: Je8Q4gaVQG09yofBh56+9Jicfmw= Name: res/drawable-mdpi-v4/abc_text_select_handle_right_mtrl_dark.png SHA1-Digest: sik4m6NQi5mcKtGRR1c8em9hOjI= Name: res/layout/conversation_list_item_view.xml SHA1-Digest: p82/GxGQgrhOzvtp8FyrVP1eM7A= Name: META-INF/fdroidserverid SHA1-Digest: 3rH3T3oX8Sk967n0ab5NiIei+iU= Name: res/drawable-xhdpi-v4/ic_group_grey600_24dp.png SHA1-Digest: ZIEhI1MDcuNBqyesBqhIX86jFu8= Name: res/drawable-mdpi-v4/list_selected_holo_light.9.png SHA1-Digest: nPWNtANp5FoH4n/kEIShr57wI3s= Name: res/drawable-xhdpi-v4/ic_refresh_white_24dp.png SHA1-Digest: NTsZbqB/c4tHi1UX0fBPegEljwE= Name: res/layout/recurrencepicker.xml SHA1-Digest: n2RYdNa4k3XGjqpkhXF9ztxnxbc= Name: res/layout/radial_time_header_label.xml SHA1-Digest: 6ZBOmonVaXGpZHcc/Mw2FXcvoMs= Name: res/drawable-v11/notification_bg_low.xml SHA1-Digest: bfUYQEbOdfpHyH/xKU2rljlMzho= Name: res/drawable-xxhdpi-v4/ic_group_grey600_24dp.png SHA1-Digest: aHTpAX2FV4iXzJU0sTO878OTS3c= Name: res/drawable-mdpi-v4/ic_emoji_emoticons_activated_dark.png SHA1-Digest: fF5hcXMeH+QGL3iAAr5CYTAMu4w= Name: res/drawable-mdpi-v4/icon.png SHA1-Digest: T2GWD98XUsHaLFlAejB5QgqyOZY= Name: res/drawable-xxhdpi-v4/ic_missing_thumbnail_picture.png SHA1-Digest: 1RUFuEzt+5rkd4Ck+Kbeiv/h1RI= Name: res/layout-v17/notification_action_tombstone.xml SHA1-Digest: A4y2ru7HSV2XUwLum7cCSvHFXqk= Name: res/drawable-mdpi-v4/ic_done_white_18dp.png SHA1-Digest: mh9w0JZCRb1UPTJ5moQFeoaJKkU= Name: res/drawable-xhdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png SHA1-Digest: d0l2OwtZD2+6JR+S4EKCzr+NRhk= Name: res/anim/abc_grow_fade_in_from_bottom.xml SHA1-Digest: kWfUczBIbB0kTzFgtIQfNc6uPrA= Name: res/drawable-mdpi-v4/abc_ic_star_black_16dp.png SHA1-Digest: cMSzyfIyYX1I9dilqPQLxr8V0UQ= Name: res/drawable-mdpi-v4/ic_dialpad_white_24dp.png SHA1-Digest: N3tRrv5WjgQGNPB/ulysghb/H24= Name: res/drawable-xxhdpi-v4/ic_send_sms_insecure_dark.png SHA1-Digest: FIedwWiEi6UrlNAZ3Va+0Jpjpog= Name: res/drawable-xhdpi-v4/ic_emoji_nature_activated_dark.png SHA1-Digest: 0FUYUr/cLI62IQ4RP5xwLN1vicY= Name: res/drawable-mdpi-v4/notification_bg_low_pressed.9.png SHA1-Digest: rxar83E4fhqCH7r8Q3SGQ0s+sAo= Name: res/layout/recurrencepicker_end_text.xml SHA1-Digest: YjnFzKmvN75I1jNf3w5/IibeHN8= Name: res/drawable-xxhdpi-v4/ic_block_grey600_18dp.png SHA1-Digest: 34Zc5JQ+TeVUVP1udhfE6s1D+iM= Name: res/drawable-xxxhdpi-v4/abc_ic_star_half_black_16dp.png SHA1-Digest: f0Rn65H1PwGOyFNxv43FhzHUaVE= Name: res/layout/abc_action_menu_layout.xml SHA1-Digest: EPivHIZzOWH09bETjXQjOXTv1gQ= Name: res/layout/media_overview_item.xml SHA1-Digest: 0tK6lgBCZPMFJSpfYgLhRj4GKuo= Name: res/layout-v13/recipient_preference_activity.xml SHA1-Digest: hxIA28s1tlAg7XpP8teI8EWr9gA= Name: res/drawable-mdpi-v4/ic_recurrence_bubble_disabled.png SHA1-Digest: GQ/oQKqUlDKBM23s1GXUXYldkwM= Name: res/drawable-ldrtl-xxhdpi-v17/ic_send_white_24dp.png SHA1-Digest: fJv3ddlYaDANDDbzyrHLFIsKVRI= Name: res/drawable-hdpi-v4/ic_movie_creation_dark.png SHA1-Digest: idSGuOyhi77lUXJpb/4cLcZyflw= Name: res/anim/animation_toggle_out.xml SHA1-Digest: h5RFa/NEbVssJaJQDR+GOgcbjF0= Name: res/drawable-v21/abc_ratingbar_small_material.xml SHA1-Digest: wPrz0/gmu9ygjwoOdEMFAq9SO+E= Name: res/drawable-hdpi-v4/abc_popup_background_mtrl_mult.9.png SHA1-Digest: F3OLlUdrDj+2/ztQNwug+XTUWPU= Name: res/drawable-hdpi-v4/ic_emoji_places_activated_dark.png SHA1-Digest: G10d1TjnCZpsWvr84SBKdDkeq7g= Name: res/drawable-xhdpi-v4/ic_backspace_grey600_24dp.png SHA1-Digest: Ts9XoUqEl0/Db4JonaDLKHDLsLM= Name: res/drawable-mdpi-v4/icon_cached.png SHA1-Digest: v2DMT5hHXIMepxOig+HMHo1E4XA= Name: res/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png SHA1-Digest: u7p4+i+MbX5Isql4KGmTM6mrhJ8= Name: res/drawable-mdpi-v4/divet_lower_right_light.png SHA1-Digest: 3Cui8QVfTUnCSeGovo/AIEMqF/4= Name: res/layout/notification_template_icon_group.xml SHA1-Digest: 7FMD39NkHvo5k5k068yXh4qwRqM= Name: res/drawable-xxhdpi-v4/ic_unarchive_white_36dp.png SHA1-Digest: UrffJUFymEXRp+MA71+CU/UucsA= Name: res/layout/create_passphrase_activity.xml SHA1-Digest: Xo6l8fNm1DdquvRoi16VjYEG8dY= Name: res/layout/calendar_date_picker_selected_date.xml SHA1-Digest: mDcwSrn9NY9Q+tUBGJz/mY1C5Ok= Name: res/drawable/emoji_category_emoticons_dark.xml SHA1-Digest: E/0X0M2RoQFiqDrCqgcdbgfJqcw= Name: res/drawable-xxhdpi-v4/ic_search_white_24dp.png SHA1-Digest: d7JXPS0TRWeyD/IeowryWnSoHko= Name: res/drawable-xxxhdpi-v4/abc_text_select_handle_right_mtrl_light. png SHA1-Digest: grcVrQtxmzmSV8JMz/9EcFpwC6E= Name: res/menu/conversation.xml SHA1-Digest: eibAWzj9TXppWnBsdgllRmuJgSM= Name: res/drawable-hdpi-v4/ic_block_white_18dp.png SHA1-Digest: rF4DgE+hC5uF/2Vrnfmc5PvtH0U= Name: assets/emoji_flags.png SHA1-Digest: +csJvSPQ400RI0ujnYElBq3F+Hk= Name: res/drawable/circle_tintable.xml SHA1-Digest: BAxvwKvzZbjQT35J7xxN4i7WHDE= Name: res/color/abc_btn_colored_text_material.xml SHA1-Digest: nsCF5QSiDkdzkM9F53HYXAMfSsQ= Name: res/drawable-xhdpi-v4/ic_attach_white_24dp.png SHA1-Digest: D1B41yEjxu6TL0hB+3ARCREu8fw= Name: res/drawable/abc_dialog_material_background.xml SHA1-Digest: mLGxn48GAFs7+4j22JOs3ea71o0= Name: res/layout/custom_default_preference_dialog.xml SHA1-Digest: 5nvWqkqbyYLDQhoAsNjl2z76MZI= Name: res/drawable-mdpi-v4/ic_recurrence_bubble_outline.png SHA1-Digest: X9whs15eFSBjKKHHunLVVSLqLmM= Name: res/drawable-hdpi-v4/ic_emoji_symbols_normal_dark.png SHA1-Digest: oNBzn63zb1OxF/k6815B5/eibZM= Name: res/layout-v21/conversation_item_received.xml SHA1-Digest: 0Y/LFUjsOHVoq2sbVA4KnTiFQU0= Name: res/drawable-hdpi-v4/ic_emoji_people_activated_light.png SHA1-Digest: ka7AtuzDVZzO8CkHunsbVIUpW8A= Name: res/layout/keyboard_with_header.xml SHA1-Digest: UHkiHpBlq7zA4uxcf8jYtv0RLFY= Name: res/drawable-xxxhdpi-v4/ic_block_white_18dp.png SHA1-Digest: kp/UblwOz/etZbQxR4yrlUEOrHQ= Name: res/layout/change_passphrase_activity.xml SHA1-Digest: q0/kYOZTKeWuuL/w8ByxnL5bxak= Name: res/drawable-xhdpi-v4/ic_emoji_objects_activated_light.png SHA1-Digest: wZ3Acttexos7A6oJL3O7FFUIplQ= Name: res/layout/abc_action_bar_up_container.xml SHA1-Digest: Mgt5FmUJbdaA9tDZq82OJCgjw2I= Name: res/drawable-xxxhdpi-v4/ic_done_white_18dp.png SHA1-Digest: Rbf+P82ITa290kP2akU2k43E0kQ= Name: res/drawable-xhdpi-v4/ic_photo_library_white_24dp.png SHA1-Digest: zPg23n5USvJHYa9lmspQbeQGJN4= Name: res/color-v11/abc_background_cache_hint_selector_material_dark.x ml SHA1-Digest: XEu3fV1TnwtDyw4lIFQ7Itsjbn0= Name: res/drawable-mdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: N/67pvsZBjmVMkE2o1xqc73zW9s= Name: res/drawable-hdpi-v4/ic_menu_remove_holo_light.png SHA1-Digest: nZTetQY5mTYLAK/MMKDXzlkSnMo= Name: res/layout/calendar_year_label_text_view.xml SHA1-Digest: yYXg/r7Aq8FU5f+YXqa5C5DxDkE= Name: res/drawable-xhdpi-v4/ic_delete_black.png SHA1-Digest: WnUBAjx5U2ChxEEsHU1sSysOIas= Name: res/drawable-hdpi-v4/dialog_full_holo_light.9.png SHA1-Digest: gtwAYHIRv/QwIODG9Jmy17izcqo= Name: res/drawable-xxhdpi-v4/ic_group_white_24dp.png SHA1-Digest: Q12UZsK8n917gz1XIUlw/er+mI4= Name: res/drawable/contact_photo_background.xml SHA1-Digest: wcH56qoRh/roa5MfCRAUhY5VXOQ= Name: res/menu/conversation_unmuted.xml SHA1-Digest: iGPzWVNCvf+sAJqdMTdIpoAM4UA= Name: res/layout/design_navigation_item_header.xml SHA1-Digest: 9uJLltTeSW3lfOIzg6RogF+0o/g= Name: res/layout/thumbnail_view.xml SHA1-Digest: uxUYHCr7mt2PsZuulTpLlXWjkZY= Name: res/drawable-hdpi-v4/switch_thumb_disabled_holo_light.9.png SHA1-Digest: Oiup3l4uNF0B12bFkgZ5ZbKU4eM= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_358 SHA1-Digest: VvyTT/9LksUV4HPNbIQ7v9P3pTA= Name: res/drawable/clickable_card_light.xml SHA1-Digest: 8lkLIxn4WnkhbvSwoxrs5gc79hY= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_359 SHA1-Digest: s/VIZLolJRrHzUwl20EGXxrhYHU= Name: res/drawable-mdpi-v4/ic_contact_picture.png SHA1-Digest: rdAdnkTTWDxiwQxMCWPsJyZ9kkA= Name: res/drawable-mdpi-v4/lockscreen_watermark_light.png SHA1-Digest: kSry/5rdpYVffPBKS2Yy/krmC2M= Name: res/drawable-xxxhdpi-v4/ic_forum_grey_32dp.png SHA1-Digest: K0zHF9Qe78zRd6DBOF/ryBQqLq4= Name: res/drawable-mdpi-v4/ic_emoji_objects_activated_dark.png SHA1-Digest: 8/XqLH7wdHhdHp+lBfnlBlL3qsQ= Name: res/drawable-xxxhdpi-v4/ic_launch_white_24dp.png SHA1-Digest: zFUqw+W1bmn24GCoTwy7J0mdh0Y= Name: res/drawable-xhdpi-v4/ic_menu_login.png SHA1-Digest: h+9GxhWayTINb75PLctpU3fqo/0= Name: res/layout-v11/notification_action_tombstone.xml SHA1-Digest: z3AGq+so9/rq5YlSWdZdcGUfX0w= Name: res/drawable-mdpi-v4/abc_ic_star_half_black_48dp.png SHA1-Digest: 0CNoLGphB8nQx4lnLUddBN45dxY= Name: res/layout/audio_view.xml SHA1-Digest: 5L+vTIdOLG9H9cmMnX1bpAxx+EE= Name: assets/emoji_faces.png SHA1-Digest: 3iRFxvoz43yD5utC20esxUfeHtk= Name: res/animator/upper_pause_to_play_animation.xml SHA1-Digest: 04mBHR+Cgllch7nL8htY67n82OE= Name: res/drawable-mdpi-v4/ic_delete_gray.png SHA1-Digest: YFqTxhz+roGQPEIYd6mxxjyiS0s= Name: res/drawable-mdpi-v4/ic_clear_search_holo_light.png SHA1-Digest: BAZdjrg41tGSMJqyirk56aAiI24= Name: res/drawable-mdpi-v4/ic_menu_lock_dark.png SHA1-Digest: kCaLMoRhk42asn0qCSXaY42dnfg= Name: res/drawable-xxhdpi-v4/ic_emoji_objects_activated_light.png SHA1-Digest: JhVo49qB76KOWI311Wftlzd+j4c= Name: res/layout-v11/color_fragment.xml SHA1-Digest: GLHqEMogQFWvx4GeJprKsO/m1yo= Name: res/drawable-xxhdpi-v4/ic_mood_white_24dp.png SHA1-Digest: lxrg18UAdmtgHtJsqAnNlvLJ90U= Name: res/drawable-hdpi-v4/ic_pause_circle_fill_white_48dp.png SHA1-Digest: pJFbvpLCoMVp+U4emMzL6hREDH0= Name: res/drawable-v21/notification_action_background.xml SHA1-Digest: 7E6bypZdy1+qGZt27u/jewA0yZQ= Name: res/drawable-xxhdpi-v4/ic_advanced_gray.png SHA1-Digest: ztSx++CxHc+VAzAvdmA1ujHwLoc= Name: res/drawable-mdpi-v4/ic_send_white_24dp.png SHA1-Digest: T6rCWS01LZ6QvOVTFkODy5zzd8k= Name: res/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.p ng SHA1-Digest: deJMnJHFnu88BXcLutErBl0Yo7Q= Name: res/drawable-xhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png SHA1-Digest: 1Ih2zOyUzHfQqptwXGLdPfBUSns= Name: res/drawable/background_pattern_repeat.xml SHA1-Digest: EEgb/vIb0/VFJJgS0/MIpgsTEn0= Name: assets/emoji_places.png SHA1-Digest: m/f0hGfQoPzldCayMIi+KuOkEX4= Name: res/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_000.png SHA1-Digest: /B3ilbfijKVVB8UBbI++gVsnSgk= Name: res/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005. png SHA1-Digest: TNZBS5Mf0wn0ezp54etHHBvWtmo= Name: res/drawable-ldrtl-xhdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: Gfy9zjRcjMoDZ+/hXl+BaITIu3o= Name: res/layout-v16/color_fragment.xml SHA1-Digest: fCJuAB+3MIXvqkaqWkJfXEXt18I= Name: res/drawable-xxhdpi-v4/ic_dialpad_white_24dp.png SHA1-Digest: 9sPO853rsEByDo1QtXuOMwKljhI= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_373 SHA1-Digest: VeJdhu3EY8wQbzczMbiAueR3kcg= Name: res/drawable-mdpi-v4/quick_shutter_button.png SHA1-Digest: ESX5DUp6mmmodSPKnKnO3/Qecu8= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_372 SHA1-Digest: 9XbPZyYd/EeHczEcjCTlJ2wquFM= Name: res/drawable-mdpi-v11/icon_notification.png SHA1-Digest: E2jULYM5hS0byX94E3863fQxcVQ= Name: res/drawable-mdpi-v4/ic_emoji_people_activated_dark.png SHA1-Digest: PAMFXjP0EKgtzY6KVAHZX1eXASw= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_375 SHA1-Digest: PNdFFZIpo4wtdnnyz/Wp8jU8VF8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_YT SHA1-Digest: Qq3+DtsB2AUCJnag1MiKcSkIn4s= Name: res/layout-v17/notification_template_media.xml SHA1-Digest: Gk9mHn5vRrwokTAoN/AeeLOYFtQ= Name: res/drawable/abc_ic_menu_overflow_material.xml SHA1-Digest: 2/LbV03oji/WgEclRTAtRRy1Sk0= Name: res/drawable-xhdpi-v4/switch_thumb_holo_light_v2.9.png SHA1-Digest: lTaQlla7wJWRfNbx/Hu+VJaDlXY= Name: res/layout/badge_widget.xml SHA1-Digest: HXdmZMCZc5Pcz5ZWGoSEDMucmO0= Name: res/drawable-mdpi-v4/spinner_pressed_holo_light.9.png SHA1-Digest: O8B882Dl2Rt2oOS4plpeX8GCUAQ= Name: res/menu/conversation_mms_group_options.xml SHA1-Digest: m5OqDr/5KrnZNZquUXM00d/DYzQ= Name: res/layout-v17/contact_selection_list_item.xml SHA1-Digest: n0ajHyKjqMdxvlhDv4NebmvXVqA= Name: res/drawable-xhdpi-v4/quick_shutter_button.png SHA1-Digest: WAs3uJg+YYm14gsaEJtWq3uDpag= Name: res/drawable-hdpi-v4/transfer_controls_background.9.png SHA1-Digest: bB3l+bAb+LvTfoWtF9LZilz3X5E= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_380 SHA1-Digest: E0pemWil3+yoXcDS1xZEp8+FN3I= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_381 SHA1-Digest: xZ5XwW7Jz0Hhq9Odxqo803v/5Ws= Name: res/drawable-xxhdpi-v4/ic_mood_grey600_24dp.png SHA1-Digest: ozFX51RmDk7zD2chVTYJX3EOxc8= Name: res/drawable-xxhdpi-v4/ic_visibility_white_24dp.png SHA1-Digest: oDeY2Y3QAl5irGgMIuHx15wKQN4= Name: res/drawable-hdpi-v4/list_selected_holo_dark.9.png SHA1-Digest: hSLKqpeDDArxDLbgz2eUcpI9DhU= Name: res/drawable-mdpi-v4/ic_menu_search_holo_dark.png SHA1-Digest: wOzQ4BmFOb8qY/k0XGb+6vb6K7M= Name: res/drawable-xxhdpi-v4/splash_logo.png SHA1-Digest: L78TqBl/ZHtZALdnwct3mJXsQ0E= Name: res/layout-v17/conversation_item_received.xml SHA1-Digest: zENI4B5CfE+nYXVK5U/arYf5/Jo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ZA SHA1-Digest: P3VCad7HZosxVksUO+IxS0Y7qo4= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_385 SHA1-Digest: 800patLGNib6NsjVJcV7fh1yw1A= Name: res/menu/conversation_secure_identity.xml SHA1-Digest: tVQRPh9+TaRar2ja//rcjoPGgsw= Name: res/drawable-xhdpi-v4/telephone.png SHA1-Digest: XiCzVPlsMJsf/rb/Z2RUqQs1Jfo= Name: res/drawable-xxxhdpi-v4/ic_send_secure_white_24dp.png SHA1-Digest: auRbXFYO8NtTyqn1mERzefiJ55Q= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ZW SHA1-Digest: Oj4Ne9co0PEillrIX6/ivUwastM= Name: res/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png SHA1-Digest: VL2tp5Ko2rl1muvR0Gd7YEtwUdY= Name: res/drawable-mdpi-v4/abc_text_select_handle_right_mtrl_light.png SHA1-Digest: ahadZNpUX2odmzJlr7li4wRLOVg= Name: res/drawable-xhdpi-v4/ic_action_warning_red.png SHA1-Digest: 5fXPbDRpgMlXeIp6WjFDhU9e+Bs= Name: res/drawable-xhdpi-v4/spinner_pressed_holo_light.9.png SHA1-Digest: l07AAjv4APfDSMj2gVcl4QIryn4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ZM SHA1-Digest: NFg9ICpsCKoGQPESt61rjEjKQPI= Name: res/drawable-v21/abc_ratingbar_indicator_material.xml SHA1-Digest: TaCO4rsv95JHS3RML2c940eQ9U8= Name: res/drawable/abc_cab_background_internal_bg.xml SHA1-Digest: OpZTAPON/eHCLK5xEp9Ei2cska4= Name: res/layout/conversation_item_pending.xml SHA1-Digest: eTPQKrzfdGjno8iGRKrmbKxoxbQ= Name: res/drawable-mdpi-v4/ic_missing_thumbnail_picture.png SHA1-Digest: q/a7ftqNdAV6f9nCbSU2PeMXBXE= Name: res/drawable-ldrtl-xxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: IsziyF2OBzAviNmnk3+DRoNCmAA= Name: res/drawable-xxhdpi-v4/ic_info_outline_white_24dp.png SHA1-Digest: cWrQw6vVdsRo290b2sLjivDwPVw= Name: res/layout/import_fragment.xml SHA1-Digest: 7FrulvyXhotkn+GNiI5StvYyi/o= Name: res/layout-v13/select_dialog_multichoice_material.xml SHA1-Digest: qFrnA4LpADzWJJ/RBfYVgAaSR7M= Name: res/drawable-xhdpi-v4/ic_recurrence_bubble_outline_disabled.png SHA1-Digest: Ib+t7PgeUwIktdmtc1DDu245Qpo= Name: res/drawable-hdpi-v4/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: kl6Gqu1dkwDjsHbQTjiEEaVCJG4= Name: res/drawable-mdpi-v4/sms_selection_icon.png SHA1-Digest: 2/XFQD5mEqqjzCYSeQ7wZaJV97I= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_855 SHA1-Digest: GFR3JT2vrXUV4AaCWsbkvT1AlX0= Name: res/drawable-mdpi-v4/ic_emoji_objects_normal_dark.png SHA1-Digest: k7TKJAFDa8dHVGD58qFSZTt3Y5k= Name: res/drawable-hdpi-v4/abc_tab_indicator_mtrl_alpha.9.png SHA1-Digest: XUUeghiBJli27nxrwf5sxQ8N90c= Name: res/drawable-xxhdpi-v4/ic_call_white_24dp.png SHA1-Digest: 0Nwk5dMkNeN14v6ptiSdHiEmaqc= Name: res/drawable/abc_ic_clear_material.xml SHA1-Digest: traTi6O31OhEtbvMNJ8PYJjtDME= Name: res/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.pn g SHA1-Digest: +7fQsrk4ONIq9nPWtO1eTM8C1HQ= Name: res/layout/conversation_item_received.xml SHA1-Digest: wAV7JPKTeTXudSF0UsoJ/5i/a2A= Name: res/drawable/abc_list_selector_background_transition_holo_dark.x ml SHA1-Digest: fAkCuPln1zmCTatmP9A40U4lWak= Name: res/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000. png SHA1-Digest: u9/W8GO9j1WSsX3sxW3nEXn/Dag= Name: res/drawable/clickable_card_dark.xml SHA1-Digest: wf6TFqfzuGakZpMN716tnvOPuu8= Name: res/drawable-xxhdpi-v4/ic_emoji_recents_normal_dark.png SHA1-Digest: rYNP4o9mLGb4hRuFbzgasSMPsSQ= Name: res/drawable-anydpi-v21/design_ic_visibility_off.xml SHA1-Digest: zGvQADjKorrDtblDDeg+FD7MgFo= Name: res/drawable-xhdpi-v4/ic_backspace_normal_light.png SHA1-Digest: Cxntk1NvNFPcycg7iEDABNhjN7U= Name: res/drawable-xxxhdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: 1w/uxs4HAVVuv0NcdbFmy9M8R9E= Name: res/drawable-hdpi-v4/abc_scrubber_control_off_mtrl_alpha.png SHA1-Digest: SFBbwGMV04UxzF/PgrJITyguwKY= Name: res/drawable-hdpi-v4/ic_textsms_black_32dp.png SHA1-Digest: jRpWGSk+5HVbTgEqSMHBKC67+AY= Name: res/drawable/import_export_item_background_dark.xml SHA1-Digest: 9N3yMYN2WLqHwcDCi+qj8GtlZZs= Name: res/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png SHA1-Digest: XEff6jUDEFWHjcuOO3DKy9ou9IE= Name: res/drawable-xxxhdpi-v4/ic_send_white_24dp.png SHA1-Digest: p+LvghVtu4UqmCjQ78gODCMOPww= Name: res/drawable-hdpi-v4/abc_text_select_handle_left_mtrl_light.png SHA1-Digest: OpHRWN2MnxLTK9nhx0Qp9JkgMgY= Name: res/drawable-xhdpi-v4/ic_movie_creation_dark.png SHA1-Digest: kamdG6A5SiThWfBULcd3GxjUm7k= Name: res/drawable-mdpi-v4/ic_visibility_grey600_24dp.png SHA1-Digest: 2fN5+MsicC71y5iO7uVx2iKZtYg= Name: res/drawable-sw600dp-xhdpi-v13/ic_backspace_normal_light.png SHA1-Digest: oO+QVqafnv8qjkKRnUlJc8QC4n0= Name: res/drawable-xxxhdpi-v4/abc_ic_star_black_36dp.png SHA1-Digest: WP2ybY6ZxFUdosC8joKLUcGVas0= Name: res/drawable-xhdpi-v4/ic_content_copy_light.png SHA1-Digest: R/WGz4ly9BQx9UFQZS6XK6iP7xY= Name: res/drawable-hdpi-v4/switch_thumb_activated_holo_light.9.png SHA1-Digest: CctxDSFOgITRJNMJX0mhtDzP4DE= Name: res/drawable-hdpi-v4/ic_emoji_emoticons_activated_dark.png SHA1-Digest: Bs1Bqjn+kjMGOUdmhxHl15R2xFU= Name: res/menu/conversation_muted.xml SHA1-Digest: rrsJ3gK/wiwHJ8EhFDM1gMYF/0c= Name: res/drawable-hdpi-v4/quick_shutter_button.png SHA1-Digest: BqCkbyqDSI7Jt7t8InYASdnPvSM= Name: res/layout/country_list_item.xml SHA1-Digest: 5/z34addyDwgm8fiRrEEt8My/KM= Name: res/layout/calendar_date_picker_view_animator.xml SHA1-Digest: TmLeWqfPUZCkJnKPofJIJK5ryPQ= Name: res/anim/fade_scale_in.xml SHA1-Digest: BGInYJ2dY+FwSHntv4EVZBJwXyI= Name: res/color/done_text_color_dark.xml SHA1-Digest: semtkjG+av9bQR2kNxjnl0cAQ7o= Name: res/drawable-hdpi-v4/notification_bg_low_pressed.9.png SHA1-Digest: x1+Ev4K1aYghXofr0W+mR6oQ9jY= Name: res/layout/three_keys_view_leftright.xml SHA1-Digest: Q7XV2rjXlsx7a1S7PedyYL0Z6XU= Name: res/drawable-hdpi-v4/ic_recurrence_bubble_disabled.png SHA1-Digest: hBR+uzZZXVxyq0bgo0t+U27GnPo= Name: res/drawable-hdpi-v4/ic_menu_search_holo_light.png SHA1-Digest: 0xap1Yr5UvJG1QLDXGeX8i7NEXo= Name: res/layout/design_bottom_sheet_dialog.xml SHA1-Digest: AUJOvlYtmk2AHWv8r3H3P51ZSjE= Name: res/drawable-xxhdpi-v4/ic_emoji_people_normal_dark.png SHA1-Digest: At3lTHNov8OBeIUQE7U2sn3LKdo= Name: res/drawable-xhdpi-v4/ic_photo_camera_light.png SHA1-Digest: FFzT14+B7/XGX4HflN7I8cdbh7k= Name: res/drawable-hdpi-v4/ic_photo_library_white_24dp.png SHA1-Digest: eYroMt+yGNPb/16vvouAKc2CbKU= Name: res/layout/abc_action_mode_close_item_material.xml SHA1-Digest: GW4gZZBmozoKOPFYj0bl8BW78s4= Name: res/drawable-xhdpi-v4/ic_content_copy_dark.png SHA1-Digest: gU/qQLQneKsb2HgbEbByIFGmIbM= Name: res/drawable-xxhdpi-v4/ic_info_outline_dark.png SHA1-Digest: n8IwvoROTVOfrGqhbeVi6X1AD1E= Name: res/drawable-hdpi-v4/spinner_pressed_holo_light.9.png SHA1-Digest: 5Tb20GpfyWPdfk68H93Ix+I70zE= Name: res/layout/design_layout_tab_icon.xml SHA1-Digest: OpgFVS39nmdZdRaCD4FzFLJt5h4= Name: res/drawable/item_background_holo_light.xml SHA1-Digest: lVD3wxMY6nk5LM/+t5mdn7blE3A= Name: res/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png SHA1-Digest: sORfnhpPIEXLnh57veYnu5sMZD0= Name: res/layout-v11/notification_template_big_media_narrow_custom.xml SHA1-Digest: lhEcCM3i0Nk4a1d97lyyozXYFUU= Name: res/drawable-xhdpi-v4/ic_backspace_disabled_dark.png SHA1-Digest: ypl7jxS4XrvwcBL7PFMbZK58BBo= Name: res/drawable-v21/abc_btn_colored_material.xml SHA1-Digest: Exeq8outkyCU3j4roUcAlNp7sYk= Name: res/drawable-xxxhdpi-v4/ic_download_circle_fill_white_48dp.png SHA1-Digest: H94FdKukmjyUrOwyacThnnNZEXs= Name: res/drawable-v11/notification_bg.xml SHA1-Digest: I1JcXdPPUQIoR7Lb18Lxi3LkwvY= Name: res/layout/notification_template_lines_media.xml SHA1-Digest: 6+p+3lkeRlnuyDGgb7A7hf9gFbc= Name: res/drawable-anydpi-v21/design_ic_visibility.xml SHA1-Digest: fn7TJtWncGazXT707hmOkjb7Hjk= Name: res/drawable-mdpi-v4/ic_refresh_white_24dp.png SHA1-Digest: EQyqpYasmoTClIK+uuxMKIzOjX4= Name: res/drawable-mdpi-v4/abc_textfield_default_mtrl_alpha.9.png SHA1-Digest: QAKVB+ymS1bLJVZt/mVSPtEVFH4= Name: res/drawable/abc_btn_radio_material.xml SHA1-Digest: npSvWgijFi0d2VFF3dOZmjf+WBQ= Name: res/menu/conversation_callable.xml SHA1-Digest: SiEu8jM36aCHN/6UTKbnaLPvbks= Name: res/drawable-hdpi-v4/ic_advanced_black.png SHA1-Digest: 4l1EzaQairF8PIGrWNP7KjxlUiY= Name: res/drawable-v11/emoji_category_people_light.xml SHA1-Digest: /qr2mFhRvZmr51s+/QBV+j3wFZU= Name: res/drawable-mdpi-v4/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: K1sCoF6dhKG/axzbYGHK9kB3C+Q= Name: res/drawable-hdpi-v4/ic_emoji_people_normal_dark.png SHA1-Digest: pLARhgTZbjUa7/9j5K+uo/0WtBE= Name: res/drawable-xxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png SHA1-Digest: DjgjddBKSH0OILJhqJkZXAYKmKg= Name: res/layout/keyboard_text_with_header.xml SHA1-Digest: nOekCMLOv7KiP15NBo87M/Pivzo= Name: res/layout/transfer_controls_stub.xml SHA1-Digest: MX3Bo85Lp6Uf92KqntyrIFCQBWU= Name: res/drawable-xxxhdpi-v4/ic_keyboard_white_24dp.png SHA1-Digest: 9EqfIMdh+YfOoSoBvSkWKV36gNw= Name: res/drawable-hdpi-v4/ic_emoji_nature_normal_light.png SHA1-Digest: XWlFZlM/6FX89ShDQYgI2dyH/B0= Name: res/drawable-hdpi-v4/ic_backspace_normal_light.png SHA1-Digest: vy4xZjN8wjI7KA8BWgZV3NndRM8= Name: res/layout/calendar_date_picker_header_view.xml SHA1-Digest: /86yi1DVNOflGh8oEIT6nHq8oYo= Name: res/drawable-mdpi-v4/design_ic_visibility.png SHA1-Digest: IqZoFoiND+uGXpPyKS/D1WgufPg= Name: res/drawable-xxhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png SHA1-Digest: fWFzmRTvlhVZBzFAxTslbjQMJB4= Name: res/drawable-xhdpi-v4/abc_ic_star_black_36dp.png SHA1-Digest: iKusdXnTG07KT152X2hnsP7XAQo= Name: res/drawable-xhdpi-v4/ic_message_white.png SHA1-Digest: fbsfEqwsJ0tjoZE0hNlvV+b0qHg= Name: res/drawable-mdpi-v4/abc_scrubber_control_off_mtrl_alpha.png SHA1-Digest: vMOEpPnU4ypvMmrbnkpxDB3M4eM= Name: res/drawable-xxhdpi-v4/ic_account_box_dark.png SHA1-Digest: bA+xleAg2iE4sEWwUoJ+lXMnlNo= Name: res/drawable-sw600dp-hdpi-v13/ic_backspace_normal_light.png SHA1-Digest: 9lxexc7vtXhIqELJvJyZMfXE1Ss= Name: res/drawable-hdpi-v4/divet_lower_right_dark.png SHA1-Digest: wP+labhUt9bVEMloEG5PoqrjPHY= Name: res/layout-v16/centered_app_title.xml SHA1-Digest: 2z1eQ56R2gDR8kSMnmlGLTPnXcY= Name: res/menu/conversation_insecure_no_push.xml SHA1-Digest: qHOiXgEtRSYUhLWKLvX5rhwwiGI= Name: res/drawable-mdpi-v4/ic_delivery_delivered_dark.png SHA1-Digest: wpU/Tsm7KtmQ/fqTo+oos4D+7Pc= Name: res/drawable-mdpi-v4/ic_scroll_down.png SHA1-Digest: +5IhB96OyRB+P6MHLAQAZeKGvwI= Name: res/drawable/abc_item_background_holo_light.xml SHA1-Digest: ku9bJ9xYD07lS3GZhes5DH5hi7U= Name: res/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png SHA1-Digest: Bj6BC2+QG7pc8RQwt/bo9WgmUR0= Name: res/color-v23/design_tint_password_toggle.xml SHA1-Digest: wUyUHwcmGGXYL1JhhWMPQVcf7hA= Name: res/drawable-xhdpi-v4/ic_keyboard_grey600_24dp.png SHA1-Digest: iNbhPYH7gI/65q5bf84nezr+hSw= Name: res/animator/rotate_minus_90_animation.xml SHA1-Digest: BuCc2mfyfzB/zJMaWWncVTSkoKM= Name: res/drawable-hdpi-v4/ic_image_dark.png SHA1-Digest: 9kta2ksiC5yxLPcwrfPBZHVdtbQ= Name: res/layout/abc_popup_menu_header_item_layout.xml SHA1-Digest: cXVPf20uVygnE264bcuEa06mRPQ= Name: res/drawable-xhdpi-v4/textfield_disabled_focused_holo_light.9.pn g SHA1-Digest: 5B5Y1sO935jPXP0SPaRMQdqzKvI= Name: res/drawable-xxhdpi-v4/ic_pause_circle_fill_white_48dp.png SHA1-Digest: kKjYOuOpFYBK00EYwdKh/FYMeB0= Name: res/layout/database_migration_activity.xml SHA1-Digest: qtevjvESyGIAKlaaHcTVvFivDEg= Name: res/drawable-xxhdpi-v4/ic_volume_up_light.png SHA1-Digest: HJdq6skIdWI/kSrfFnt6D0r+GxE= Name: res/drawable-xxhdpi-v4/ic_circle_fill_white_48dp.png SHA1-Digest: HSvmtSZQCTVP93CnzYBlK3yHAbE= Name: res/layout-v17/conversation_item_sent.xml SHA1-Digest: dhBiGtMXhEIPWzr5H1gqS0QmrGs= Name: res/drawable/conversation_item_sent_indicator_text_shape.xml SHA1-Digest: gjE0kwExarnHKCBzEcSlNUDsC0I= Name: res/drawable-xxhdpi-v11/icon_cached.png SHA1-Digest: E8iyhY8Yt68zCmnuOO+rk/5Vq2E= Name: res/drawable-xxhdpi-v4/ic_emoji_nature_normal_dark.png SHA1-Digest: qvPNkQ4kgg5OJMnrffAW7nShfes= Name: res/layout/video_player.xml SHA1-Digest: BuhNr7gl0JYIYva/P680FXCcprQ= Name: res/drawable-mdpi-v4/ic_backspace_normal_light.png SHA1-Digest: XLVO12/7C+tQkw5aPeE3ILQ9cI4= Name: res/drawable-xhdpi-v4/icon_dialog.png SHA1-Digest: v3eLJ3OgDgovfl3il+qazPMrAQk= Name: res/drawable-hdpi-v4/ic_search_holo_light.png SHA1-Digest: KbFl7RLjRTGlTIPIu1Vgqw2GO1A= Name: res/drawable-xxxhdpi-v4/icon_cached.png SHA1-Digest: VZZoa23taaL3+aQJQMgNmDAvXOs= Name: res/color/recurrence_spinner_text_color.xml SHA1-Digest: dlRxYbAqKQnnnrUVFpgDY5OD+Hw= Name: res/drawable-hdpi-v4/ic_brightness_6_gray.png SHA1-Digest: 01HgaZfDz74Q+6hlCKGQYqnVMeA= Name: res/anim/design_bottom_sheet_slide_out.xml SHA1-Digest: uTMw35lL6zfB58m4Npj1tkUwCKs= Name: res/drawable-hdpi-v4/ic_advanced_gray.png SHA1-Digest: wiOv8b8dKfTYGJI1iZoCasjZbJM= Name: res/drawable/abc_ratingbar_material.xml SHA1-Digest: dQYfnGBvF3NoNPyyD+NZnOWv73w= Name: res/layout-v21/abc_screen_toolbar.xml SHA1-Digest: c6PHptjlDcIIjsVPCryceAZF3qA= Name: res/drawable-xxxhdpi-v4/ic_photo_camera_dark.png SHA1-Digest: RiWmiAzdH8XswRoWaThmwhpSR58= Name: res/layout/date_picker_dialog.xml SHA1-Digest: TG7jySd28roaL3HtDfJn6hYIP5s= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_979 SHA1-Digest: dqFdRTRBu8qABvUu4oPcGOhjXwg= Name: res/drawable/white_radius.xml SHA1-Digest: fmmwZ1xdiLKhbP7MVdTnY4KFGjc= Name: res/drawable/abc_item_background_holo_dark.xml SHA1-Digest: M0YVK8Qdk4ReRL9EAtEpVn58SLc= Name: res/drawable-hdpi-v4/sms_system_import_icon.png SHA1-Digest: p0FwBdO0i3J1NGN/HenlojXr8f8= Name: res/drawable-hdpi-v4/ic_push_black.png SHA1-Digest: ZvdjVsdLxH0gBqQ1PdWsbLKd34U= Name: res/drawable-hdpi-v4/ic_emoji_flags_normal_light.png SHA1-Digest: ZzWFcSV91qSF87GEePVsoqGaERM= Name: res/drawable-xxhdpi-v4/ic_done_white_18dp.png SHA1-Digest: bKAJwtwxPE29bJdHRdAoqgw5Qbc= Name: res/drawable-xhdpi-v4/abc_list_longpressed_holo.9.png SHA1-Digest: /HDLqKYSwxPWi6ihR75E/oot/mo= Name: res/drawable-xhdpi-v4/ic_textsms_black_32dp.png SHA1-Digest: oqLbYDw4OWuVaNkiBeRLej7kuLo= Name: res/layout-v17/abc_select_dialog_material.xml SHA1-Digest: XhivagTkM42eJCtTl5LKhzffpPE= Name: res/drawable-xxhdpi-v4/ic_send_white_24dp.png SHA1-Digest: jPgl1DeE6qTNGQE5Gn9FrnS+fBk= Name: res/drawable-xhdpi-v4/ic_push_registration_reminder.png SHA1-Digest: t2WKBQ5mpFyToqVHEHKRcaZZzz4= Name: res/layout/conversation_activity_emojidrawer_stub.xml SHA1-Digest: t1a8C6MNcoHCQIVqcvozm7/mkuQ= Name: res/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_015.png SHA1-Digest: uGWvmzDJW1Tm49ULXgHdjHtvfwc= Name: res/drawable-xhdpi-v4/ic_add_white_24dp.png SHA1-Digest: xdyoQCLkXu/QWm8eiR5yHAyCEcg= Name: res/drawable-xhdpi-v4/ic_clear_white_24dp.png SHA1-Digest: 73PnLlktjynlAL9dc5op3jz/sT4= Name: res/drawable-xxxhdpi-v4/ic_photo_library_white_24dp.png SHA1-Digest: CYGOrsdjU4wbC903pey4k/K7TDI= Name: res/drawable-xhdpi-v4/abc_ic_star_half_black_16dp.png SHA1-Digest: p77+iJXOm0qrONaejSCLhWIgXoU= Name: res/drawable-xhdpi-v4/notification_bg_normal.9.png SHA1-Digest: jZ3Gp8XAjOt3IlouqhB/Qse7VuA= Name: res/drawable-xhdpi-v4/ic_check_normal_light.png SHA1-Digest: mZkGBjdzIEziwyUJXR4Hgsr1Ex0= Name: res/drawable-mdpi-v4/ic_archive_white_24dp.png SHA1-Digest: qaNI/E3+5JP4Y0EqCBMbYDSCCqA= Name: res/layout/psts_tab.xml SHA1-Digest: o9imNXCn5LOJeFwUrKL9ym55zsc= Name: res/drawable-hdpi-v4/ic_audio_dark.png SHA1-Digest: 6p5nnRQVfPOnYKSUc7LDnWH8fnM= Name: res/drawable-mdpi-v4/ic_emoji_flags_activated_light.png SHA1-Digest: iKK5lkuDk6cgUSxkBjhc7JY1yjI= Name: res/layout-v11/conversation_fragment.xml SHA1-Digest: tEDFwezd29uGZo25Hmrto9fLVfw= Name: res/drawable-hdpi-v4/ic_app_protection_black.png SHA1-Digest: cGFicbnfWgsXiuQjC2yONt0+mNk= Name: res/drawable-hdpi-v4/ic_select_all_white_24dp.png SHA1-Digest: IoR1V7p/3eSsRZqiDIR1fVhtwWg= Name: res/drawable-xxhdpi-v4/ic_photo_library_white_24dp.png SHA1-Digest: hGymLWfgo7k13mfYiomvgpFoGzM= Name: res/drawable-mdpi-v4/ic_recurrence_bubble_fill.png SHA1-Digest: DmXcKYa6S5gB9AZsUldis3sqvPU= Name: res/layout/conversation_item_last_seen.xml SHA1-Digest: 99xLTy2kmZYjpoUuhkydWVW4UNk= Name: res/drawable-xxhdpi-v4/ic_advanced_black.png SHA1-Digest: 79lGVOoBDIYXCTErbr1NvP9Ct9M= Name: res/layout/contact_selection_recyclerview_header.xml SHA1-Digest: Fbz73NjxKw6n9EpmxRB7nv90lFA= Name: res/drawable-xxhdpi-v4/ic_recurrence_bubble_fill.png SHA1-Digest: byPothetufoz83PimCg+81vAW4E= Name: res/drawable-xhdpi-v4/ic_emoji_symbols_activated_dark.png SHA1-Digest: fIQ05wTvHbvpp7fYbZBSzwjuEJw= Name: res/drawable-hdpi-v4/icon_lock.png SHA1-Digest: chwtrHwrmuVUJF5trfB+fonxkyc= Name: res/drawable-mdpi-v4/abc_list_longpressed_holo.9.png SHA1-Digest: jaCqE8RSPyJL2tSTf5ctOZ8Wkp8= Name: res/menu/conversation_insecure.xml SHA1-Digest: 0XziGIUFD2b2uJT/iL/FNk2Oi40= Name: res/layout/three_keys_view.xml SHA1-Digest: eHLBCUAInSvPhL7P/FkER4kgJpI= Name: res/layout/time_picker_view.xml SHA1-Digest: +9O4VWyQ2+LCyq94Q4OcgUpPcbw= Name: res/drawable-xxhdpi-v4/abc_popup_background_mtrl_mult.9.png SHA1-Digest: nM7eMb1IwRTSPeCUiRnPcn3CGRw= Name: res/drawable-xhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png SHA1-Digest: /UEK2xt/qrP3cCJflXSymHBKVrQ= Name: res/drawable-xhdpi-v4/ic_send_sms_secure.png SHA1-Digest: ryMNyBeVzQX0/4AT1TsTXbbp8kA= Name: res/drawable-xxxhdpi-v4/design_ic_visibility.png SHA1-Digest: Jrr2auhCHctL/z4MV65aRgZbDv4= Name: res/drawable-hdpi-v4/ic_delivery_delivered_dark.png SHA1-Digest: oDh4cyrMHk++7kt5u67Kfj07WGo= Name: res/drawable-xxhdpi-v4/ic_call_split_white_24dp.png SHA1-Digest: ww/+BoXzjWC6pIW0UWy3iPTDXSw= Name: res/color/abc_secondary_text_material_light.xml SHA1-Digest: M/vEx1FuZRUURwyMWQad1XJkERQ= Name: res/drawable-hdpi-v4/ic_emoji_people_activated_dark.png SHA1-Digest: 1n23BX7ktYtdz2tzo2K3I2f1Uek= Name: classes.dex SHA1-Digest: JarClbzDn/6wUkVRjrwX/+SFx2k= Name: res/layout/abc_screen_content_include.xml SHA1-Digest: Qy4yTXeEqDx3ZNR+CxiliBg224M= Name: res/drawable-hdpi-v4/switch_bg_focused_holo_light.9.png SHA1-Digest: Uu0jDWQm42BXRa5E8t530Qt9aEI= Name: res/drawable-hdpi-v4/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: 9HmgRLugE7XLFQSCcDKTHa0FfIU= Name: res/drawable-xhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png SHA1-Digest: MRB8bfz87PDQFDWGNEetiXxTiwY= Name: res/color/abc_hint_foreground_material_light.xml SHA1-Digest: I8Ds4hXXhIubmvL5DNX6Tn1EfSI= Name: res/drawable/switch_thumb.xml SHA1-Digest: uD+ge0ZrXQlCCV1iqqfA3aJAg9c= Name: res/drawable-xhdpi-v4/ic_send_sms_insecure.png SHA1-Digest: 4VIdZ809NFUqx/UPenMJ7D874fM= Name: res/drawable-xhdpi-v4/ic_send_push.png SHA1-Digest: 8v0rupvoADhU++O8r/y24H66WzQ= Name: res/drawable-mdpi-v4/abc_list_focused_holo.9.png SHA1-Digest: P0wooDvrgcWxD6FuObhOb0leW5c= Name: res/drawable-mdpi-v4/ic_audio_dark.png SHA1-Digest: zhpozyc7RnIEux36uvVpLpHvoYQ= Name: res/layout/conversation_item_pending_v11.xml SHA1-Digest: BIdce4ZfxHvQJw2Kpy77LuiSNAM= Name: res/drawable-hdpi-v4/ic_unarchive_white_36dp.png SHA1-Digest: WDXJE78HXhC4ci2+Zk4mWKmsmnU= Name: res/drawable-xxhdpi-v4/ic_photo_camera_light.png SHA1-Digest: EOo/n6OaIvn7/oE1A05+ICtODt8= Name: res/drawable/done_background_color_dark.xml SHA1-Digest: VF0ZGwzrktCT7fzYmlJNmcLtSPU= Name: res/drawable/abc_ic_go_search_api_material.xml SHA1-Digest: PB/HXCss38YyHIfl5zY8qJqidxk= Name: res/drawable-xhdpi-v4/abc_textfield_default_mtrl_alpha.9.png SHA1-Digest: wxS5Do9e7cCh/fgOCbgTwd/ZeDE= Name: res/drawable-xxxhdpi-v4/ic_badge_24dp.png SHA1-Digest: 6NFopP31wSBougmiMFJ/ha7R5/g= Name: res/color/switch_thumb_material_light.xml SHA1-Digest: gulAt9uew9Th4qbVyV+/+NDOoRQ= Name: res/drawable-xxhdpi-v4/ic_push_black.png SHA1-Digest: 9iMVgo9s/BTUDPMsVuQpjGH2iDQ= Name: res/animator-v11/rotate_minus_90_animation.xml SHA1-Digest: uBdoND/8IkPM8vaObJcyA86WNN0= Name: res/drawable-ldrtl-hdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: i+D8jpgrDBK7ho3fPTIxkDeM6rM= Name: res/color/dialog_text_color_holo_light.xml SHA1-Digest: sla+7cKXzMuT4rMqnPPlnGrGwI8= Name: res/drawable-xxhdpi-v4/icon_dialog.png SHA1-Digest: 7htL/8mxE7HuKjrIiEujDYbhXZ4= Name: res/drawable-xhdpi-v4/ic_menu_lock_dark.png SHA1-Digest: RLs+N2EZOJI6nQEGc7gs7kTHNMA= Name: res/drawable-hdpi-v4/ic_save_white_24dp.png SHA1-Digest: va4B2UZYQ357PZmHAnQqrns5hyg= Name: res/drawable-mdpi-v4/ic_check_white_24dp.png SHA1-Digest: lycMfpZqD30AJNacCIEKdpzktjU= Name: res/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_015.png SHA1-Digest: lNuUT0ocSjvW/jki9WBE/Zw/lfA= Name: res/drawable-hdpi-v4/abc_text_select_handle_left_mtrl_dark.png SHA1-Digest: l7zskEgFzcvaKQ3ac893RSnOFG4= Name: res/drawable-xxhdpi-v4/switch_bg_disabled_holo_light.9.png SHA1-Digest: Z13MCJ8z/h7AxU4mFC97sSSvf/E= Name: res/drawable/pause_icon.xml SHA1-Digest: uWh0vL+kjTwWGZdrJ4+2fFtoJmc= Name: res/drawable-hdpi-v4/ic_keyboard_grey600_24dp.png SHA1-Digest: S1yK9PAKEF0wcf3IpadF0QSavA8= Name: res/drawable-xxhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png SHA1-Digest: CwBgZCf6HQH3oXQJ4vFliod7poc= Name: res/drawable-hdpi-v4/textfield_focused_holo_light.9.png SHA1-Digest: G+sjjsHiKMXPwXhMYcjptrXj5oc= Name: res/drawable/recycler_view_fast_scroller_handle.xml SHA1-Digest: SdRfCp+VhZO6lfe8HeZXlw0zYSs= Name: res/drawable-hdpi-v4/ic_movie_creation_light.png SHA1-Digest: jMpWCxFLChXXQKRH//uQ5eJhDR0= Name: res/drawable-hdpi-v4/switch_bg_holo_light.9.png SHA1-Digest: 84PBAh8/+LjExDRXzcAPH20FsL4= Name: res/drawable-v11/emoji_category_flags_light.xml SHA1-Digest: 4WJXwjHnNYAoh7PsjTRxu/DnfiY= Name: res/drawable-hdpi-v4/ic_emoji_people_normal_light.png SHA1-Digest: UbowkgVOW71RAjjFUGL5QeJotBo= Name: res/drawable-xxhdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: kW1/B+eMvi5Qa6pHdpol8Np5LOE= Name: res/drawable-xxhdpi-v4/abc_text_select_handle_right_mtrl_dark.pn g SHA1-Digest: U8rdfuKZoulQ8qigYFR2oBTsdvo= Name: res/drawable-xhdpi-v4/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: Rnyk862Fak5QBrH16XFG0gnr96c= Name: res/drawable-xhdpi-v4/ic_notifications_gray.png SHA1-Digest: /uLa66vcY/KDIz8g/5UUGqTgdZQ= Name: res/drawable-hdpi-v4/telephone.png SHA1-Digest: zxNQuZWAA4RKS8tts+BlX5qthPU= Name: res/drawable-mdpi-v4/ic_emoji_symbols_normal_light.png SHA1-Digest: wk94ZEu0bo997UCXWcscIEC1uok= Name: res/layout/country_selection_fragment.xml SHA1-Digest: Jc5OXlKL+7GgqXpkjMZR+rNJnLQ= Name: res/layout/number_picker_dialog.xml SHA1-Digest: QtwqVaCO7V+ZLo909BT37PqgH28= Name: res/drawable-hdpi-v4/ic_visibility_white_24dp.png SHA1-Digest: BAJ3nBA44xIO03iRy093h9/C2oQ= Name: res/drawable-v21/avd_show_password.xml SHA1-Digest: N3p+N4O8mTgGo1X4Nfg/Qf5x9+k= Name: res/drawable-xxhdpi-v4/spinner_disabled_holo_light.9.png SHA1-Digest: spcycqX8mk0fo3XEgQ4H49SOCQc= Name: res/drawable/abc_vector_test.xml SHA1-Digest: Nt9ckQDkCsYP2/LnUbJXmZv47z4= Name: lib/armeabi-v7a/libcurve25519.so SHA1-Digest: +Y+tD77C55a6NOXrWekk2U8vdQY= Name: res/menu/conversation_add_to_contacts.xml SHA1-Digest: uWeEXoC0QxpVS9gCdVRHIZJro00= Name: res/drawable-sw600dp-hdpi-v13/ic_backspace_disabled_dark.png SHA1-Digest: 984kWqq3UKY/ucF3wHp/xjMmzzE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LK SHA1-Digest: dGlE/2sVqnqwOyAcnI147+xWo+M= Name: res/drawable-mdpi-v4/ic_visibility_white_24dp.png SHA1-Digest: +V7BPsXKc4K01O1Z7ww+MC18POw= Name: res/anim/design_snackbar_out.xml SHA1-Digest: fenowEI7s0OCQ7vzkP4haFTfB0I= Name: res/drawable-mdpi-v4/notification_bg_low_normal.9.png SHA1-Digest: G4lYrLmqbZodQ56hAVjySdNcV2I= Name: res/drawable-xhdpi-v4/ic_search_holo_light.png SHA1-Digest: 4Ux7qH9nF4Sf5TJIxfT9QATkT1E= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ER SHA1-Digest: E2TigdpPBhjWghTqLGd1MzWD+wQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ET SHA1-Digest: nLInv9rnfTZyc2Yt3HXON1XbpjY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ES SHA1-Digest: Qh+3McPT6XZ0r8gmjWGxaAtWE34= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LS SHA1-Digest: 7BsS5aNp3jcPOYeM+eXOop7yRso= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EE SHA1-Digest: b8q7bX/oHVLFlYkL9J28fRbE7D8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR SHA1-Digest: L46Pd4GqB6a5EmHS8jH6nOtsOWg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EH SHA1-Digest: JG3j+8eE6wXPKykW7Cr9wkfPAsc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LU SHA1-Digest: VrSm6E5recaey0dmWmzxQbD97Hg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LT SHA1-Digest: bOmBTv4QyYmBTfAiGB7zJwbQaOE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EG SHA1-Digest: fic9NKv+egZ0qRjfXEN/bw7nsQY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LV SHA1-Digest: D85Bu86xeawV7nt+eEnjA3V+yXA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LY SHA1-Digest: uJqhoq1Hm5JnGxP6M4+UeEatBLY= Name: res/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_015.png SHA1-Digest: uk3L+RIoakDF8kLQl1lbuz1VdkM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA SHA1-Digest: JJVvzkHvw50ALWuLIFGOVrl0KOs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EC SHA1-Digest: d+Bo1FvPdg7ZqcgtXZ/O28GQhWs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MC SHA1-Digest: 2CLnKQBD+H31vh400oTIJF70Mow= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD SHA1-Digest: ZUJDIbLgUEy6YAu8uHv1Ph17sts= Name: res/layout/notification_template_part_time.xml SHA1-Digest: LJb6bTMCYfMEF2qojVDiwIByprc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ME SHA1-Digest: pdgkCYCQNzuE8eH8UbDhGHQ8Ru4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MF SHA1-Digest: MbJgQJRk74Qp7wAQYEdn1g07kPM= Name: res/drawable-xhdpi-v4/ic_emoji_flags_activated_dark.png SHA1-Digest: +zOuSsFclhdcXHPhMp+42LgVol8= Name: res/drawable-mdpi-v4/ic_notifications_gray.png SHA1-Digest: Vdg58LW0JtcH1k8TP95v6xsA03o= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MG SHA1-Digest: ofeWHBJTHurHJ7TSU71QNCxnjbs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MH SHA1-Digest: mK7nAasII3omYbOsaQ5cFKjuVQQ= Name: res/drawable-v11/emoji_category_emoticons_dark.xml SHA1-Digest: OAu/lAgwVhzB1wqMMKjti7Zs7aM= Name: res/layout/recipient_filter_item.xml SHA1-Digest: VUgdDdrc1IRnokXxcJhoEPy786k= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DZ SHA1-Digest: rburB7+6PwMfXvm/PQReu/7J4HI= Name: res/drawable-xxxhdpi-v4/abc_ic_menu_share_mtrl_alpha.png SHA1-Digest: ViuGJMQKprUdITWoAs1n21Kd9ZE= Name: res/color-v23/abc_tint_seek_thumb.xml SHA1-Digest: eQQosilXm46wTNpgufTS2GXzzIM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FO SHA1-Digest: lFmxC97jAfdiHuRAhoMXDweAtg4= Name: res/layout-v21/notification_template_icon_group.xml SHA1-Digest: jmIGYrC7O88w727hgaDWE3YeDBg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KI SHA1-Digest: Opv4VtE9ZFUW9EsP1mVG0JY3CrU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KP SHA1-Digest: iV3PJXFR0FJouyPIiqtSDoXHgrA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN SHA1-Digest: cL6rmmBrzi+CEZDcN/l8+bEam6E= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FR SHA1-Digest: e2LNHa2URvmc1YweDi2e38DJU0w= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KM SHA1-Digest: Eiem7oRL+YcsaBOn9xrpq9U5SSI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FI SHA1-Digest: fv0HyXJMARYH1qwYRusPHTwtYk4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR SHA1-Digest: 6IvYFcIYj16qqXkMArzWb8kkZ2o= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FM SHA1-Digest: 7B7I+1yvB1dYzahtRcLI86Fof9s= Name: res/drawable-hdpi-v4/ic_emoji_objects_activated_dark.png SHA1-Digest: nS1sUpH7GYkchkkNocVX+iqyFR4= Name: res/drawable-mdpi-v4/ic_emoji_emoticons_normal_light.png SHA1-Digest: FIA08pF7PcghqiplD6sdajW54LU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW SHA1-Digest: AIEBxYsyuRc/uH/3+VaDHxEcSmw= Name: res/drawable-mdpi-v4/abc_list_selector_disabled_holo_light.9.png SHA1-Digest: VAWAgM1S6jdrYNnzjAk62DbHpA8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FK SHA1-Digest: dZEGOpES37DEl5v8/N7TxzxOAoI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FJ SHA1-Digest: ryDmJR/JPQrikGoj8Ytl9g2x+LA= Name: res/drawable/play_to_pause_animation.xml SHA1-Digest: Hck4FSeE+adafq51j4Jnw1ibvc0= Name: res/drawable-xhdpi-v4/ic_lock_dark.png SHA1-Digest: EQBcZvHcmb9yjyVopDpgxuIjKZU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY SHA1-Digest: 9O7bp9+iM7RE9PuiEuHPf+MB3YI= Name: res/drawable-xxhdpi-v4/ic_emoji_places_activated_light.png SHA1-Digest: CxRau8xckOFqqA3yCXqbNRx7NIU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KZ SHA1-Digest: nDp0Y4L6Vqe72MYxEqXVR4E+Ntw= Name: res/anim/design_fab_out.xml SHA1-Digest: xUTzztkV6DmAqFXiLoefobMOg3g= Name: res/drawable/button_background_dark.xml SHA1-Digest: BAgcQtcIxovcnSFHiECiyN3xkug= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA SHA1-Digest: KzfuzHUPn+zzADyNIhxn75hCr4U= Name: res/drawable/abc_ic_search_api_material.xml SHA1-Digest: JrtYziZNuxfNNt3RwCJLN3fo85I= Name: res/drawable-mdpi-v4/switch_thumb_disabled_holo_light.9.png SHA1-Digest: 6Q0egkPXcET6qWYJbaJnk1GKRsU= Name: res/drawable-xhdpi-v4/ic_emoji_recents_activated_light.png SHA1-Digest: HH8RJwDGr2F1osUMFkzG0XJd1Ho= Name: res/drawable-xhdpi-v4/ic_unarchive_white_36dp.png SHA1-Digest: oro9cJHOkSHpDwbZB77dpOcH+NQ= Name: res/drawable-hdpi-v4/ic_lock_dark.png SHA1-Digest: YqSj7swAiFl1VsnLvzNtj0RV09c= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB SHA1-Digest: Eurl/BYmIaOcP1V+gIVGQPsal6Y= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LC SHA1-Digest: nZLWfW3qC4C94h4vl+/g6ETDHUw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LI SHA1-Digest: YZ3im7JIC/R4awZlELNGZMMvGEU= Name: res/drawable-xhdpi-v4/list_selector_background_selected.9.png SHA1-Digest: 36Ws5DFmoLt4ptxx59DL2RNDQ0M= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM SHA1-Digest: 5DbYBw9KSUeRPtXypIiWU5gNGGE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GT SHA1-Digest: fn64fjgcQ5sVtJmbb2rjh2spihk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JO SHA1-Digest: UuIka7azgqzAh93E2hveZozYwIo= Name: res/drawable-sw600dp-xhdpi-v13/ic_backspace_normal_dark.png SHA1-Digest: 7SPgS7EE9ZHgHjE3ix1RBWa7QtE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GU SHA1-Digest: l0+tohuWk8mOFg4gfLveLzyB39k= Name: res/drawable-v11/emoji_category_emoticons_light.xml SHA1-Digest: ztpE1SfFngkQrj8bJd/uhpuCPCc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GP SHA1-Digest: MFbM0hL6BN87q/jIzTAzagplw1M= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GR SHA1-Digest: /CpP0/xJHc8rMdKbqW/bAYdFXAo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GL SHA1-Digest: Zmd4AP1OecMCxgFTjFiUuT/fY1s= Name: res/drawable/emoji_category_nature_dark.xml SHA1-Digest: k2EMEfERm8Meff1aHg8jukX1/D0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GN SHA1-Digest: 27yzuurZHmVz28908rNoN8FZysE= Name: res/layout-v21/conversation_item_sent.xml SHA1-Digest: ARy+pYJCYQSmz4ArH0J71hGD4D8= Name: res/layout/three_keys_view_text.xml SHA1-Digest: /vFsF8aStrIAyx5vaBMMjUSWDjM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GM SHA1-Digest: lZeIZ3/GlVUgeQDOzRGjvdRL5uE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GH SHA1-Digest: pC7TxK7cLbkDXWLN3SvhshSeaP0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP SHA1-Digest: AcjGr5Vu7DqBuR4h/t3zS1KPoCA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GG SHA1-Digest: uFgP7K8xJZfG0WI8wkOIdJzJ0gQ= Name: res/drawable-mdpi-v4/ic_warning_light.png SHA1-Digest: GCuIPBi4gB/5D//gguMgx5SfkGk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GI SHA1-Digest: pgT+EIU+wJSv2fSR0sT2B1eeCMk= Name: res/xml/recipient_preferences.xml SHA1-Digest: FtaSs3vpt3E7JVFAYhd09cQnTeI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GD SHA1-Digest: J8aWXaCzoEO+LO6xYOtAoBWRuGg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GE SHA1-Digest: WlWC/G0LBBqv3SDDZowNROcA0c0= Name: res/drawable-xxhdpi-v4/ic_delete_white_24dp.png SHA1-Digest: 1t3ru1XcSrHEkdcKIJMDBi2Y16M= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GF SHA1-Digest: s57Ys+jho7LCROt1IjC6fOZw3Wo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GA SHA1-Digest: nJ0fu0m2kRxtezMTo7DnO1X+R/4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GB SHA1-Digest: UqcY0WaMyw2CNOe2zQ0OXzlvJVU= Name: res/layout-v17/notification_template_big_media.xml SHA1-Digest: lvVJtIudn2AjsaXqyC/jbBNEbpQ= Name: res/layout/icon_list_item.xml SHA1-Digest: Mg2ZNXzUdd6eoHO5PszPGKsuqBc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE SHA1-Digest: t59xuH+VnD5qQJFXkbw5nye2vMg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG SHA1-Digest: +XMw5Kg4Isg91WJDbWGZhI+SzZ8= Name: res/drawable-xxhdpi-v4/ic_keyboard_grey600_24dp.png SHA1-Digest: xDsUErqnrJ83jKjLNECBKE/N8Xs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH SHA1-Digest: vMip6YT7BGzR5RcCNDbOPWA884I= Name: res/drawable-xhdpi-v4/ic_video_dark.png SHA1-Digest: SMBnhM0NAFoIyJcGF5EaiIFegDE= Name: res/drawable-hdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png SHA1-Digest: N0JreKvhlyMPBSf34DQond465n0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN SHA1-Digest: YWOkBb7MBSAo6Mb0ODvge1HXRtE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IM SHA1-Digest: C/9uvSfqUCVALrUpDmyb+EX4M8A= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HU SHA1-Digest: GQHycOXwq7rHdtNuIksA6qvcldI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL SHA1-Digest: aJCyzEuJHfXR3apcQT53aJ7Km8E= Name: res/drawable-xxxhdpi-v4/abc_ic_star_black_48dp.png SHA1-Digest: xXkT7UhBEFvSuU5J2I+D1bwj7zk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HT SHA1-Digest: e+uBAKnhIw7UGI6dYyyOLuymK18= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HR SHA1-Digest: 4BGgxCvaONoLwTaax71RnTXpPRg= Name: res/drawable-xhdpi-v4/ic_attach_grey600_24dp.png SHA1-Digest: TsHg4xRzFe1dIrHElbFlXftt1fw= Name: res/drawable-xxhdpi-v4/ic_archive_white_24dp.png SHA1-Digest: bE0E69/QNGuUs6osyjF5hnvGOnA= Name: res/drawable-xhdpi-v4/ic_emoji_flags_normal_dark.png SHA1-Digest: aeFtQ2/DII4N35QshPIQSc9uGR4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HN SHA1-Digest: UZneRcJZOERJiVqI+JauulOEckM= Name: res/drawable-mdpi-v4/list_selected_holo_dark.9.png SHA1-Digest: t3gAnIT+AzQuQiC0J6HKptJhyA0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT SHA1-Digest: gdRZpVQXjDDZfo+vjC6OObobAD4= Name: res/drawable-xxhdpi-v4/ic_group_photo.png SHA1-Digest: e7pgHplWGNXbLF9rvwinkqy3jJ0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS SHA1-Digest: +oko1XGukY+MrN2r53oOBKkNIqs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HK SHA1-Digest: ar/P1+rQlrGBixew3JMIigqX068= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR SHA1-Digest: HSy63ScVyG/eLhq9CdBMpSFAPnE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IQ SHA1-Digest: FmlE0rUwvs4ZIo26IMs5IrY1xJ8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IO SHA1-Digest: FwB7DnBBMWPbXjxfbFWWgeZX6vM= Name: res/layout-v16/notification_template_custom_big.xml SHA1-Digest: eBiyAFGYLKee5KXeEPnVSqqCPNY= Name: res/drawable-xxhdpi-v4/ic_emoji_flags_normal_light.png SHA1-Digest: O5Auy59UiqkF7JkxK2Mrno1oY7o= Name: res/drawable-mdpi-v4/ic_info_outline_white_24dp.png SHA1-Digest: RI7Icbqo5kZduEWaogjMA6j57EM= Name: res/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_000.png SHA1-Digest: pbP/bpdtNDmjPyIJWfLMJALvoXo= Name: res/drawable-mdpi-v4/ic_photo_camera_dark.png SHA1-Digest: nHm0P2OU8w4FasmKZOYNOBsNekk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JE SHA1-Digest: AjRp8NlibDYVU+tALEUnPLEB7c4= Name: res/drawable-mdpi-v4/ic_emoji_nature_activated_light.png SHA1-Digest: 8R7AbylOpq6hTD2+86L3nOCaZkY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GY SHA1-Digest: KrbnGrX0xxCBVfk8nkFiKQj7dpI= Name: res/drawable-xxhdpi-v4/received_bubble.9.png SHA1-Digest: lRkGDA4EzxKSjWgS/YcYGg9439Q= Name: res/color/abc_btn_colored_borderless_text_material.xml SHA1-Digest: fzYoBGcDa2c2oyMPBeOaTO8kqbY= Name: res/layout-v11/custom_default_preference_dialog.xml SHA1-Digest: eSFfc9ed+WiY/Qww/nUHAE6U0mk= Name: res/drawable/last_seen_divider_text_background_dark.xml SHA1-Digest: XCTGK2lgiB+eOOFDixpc9pV4VkA= Name: res/drawable-xxhdpi-v4/ic_audio_light.png SHA1-Digest: 6ngM2rWmrljKjdIacOe0cu85VT8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GW SHA1-Digest: LmXE41jlHG+vphlvr+MghAWCi14= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HN SHA1-Digest: lTgIxZPXaeAMmKQ2gV+iNQ0EkKs= Name: res/drawable-xxhdpi-v4/ic_notifications_gray.png SHA1-Digest: DNUT/VyubypwNlFc5leH3zLEH4M= Name: res/drawable-mdpi-v4/switch_bg_holo_light.9.png SHA1-Digest: peyvmv7NaxWpuLuoG2od8vf2QRU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AC SHA1-Digest: 52T6/UD8x8+sq7OdOJMZWaoZ5NQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AD SHA1-Digest: pDefopEyaRG2+zHbWJ7TjZ6B2jY= Name: res/animator-v21/design_appbar_state_list_animator.xml SHA1-Digest: 3y9SSDOTiyFZI94yGO/38nsIk18= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR SHA1-Digest: ptZ04upnX9rGhmA9OzfEGCkC1rY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AE SHA1-Digest: mPsxFQKI8H5DZvsyLRaRP90LifY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AF SHA1-Digest: izS7xojRAryOGr0qA9Xz9dPoSso= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AG SHA1-Digest: 1DdZY1QOwT8qqZKnmFHNZ5llW04= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HT SHA1-Digest: 2V+6dCrRncydO0uTDSJlOlNCvdw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HU SHA1-Digest: zND66d2un/Wo9yluhuPAn91EfNg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AI SHA1-Digest: gvvHtuY2VuWkF9/T9NG422eFswk= Name: res/drawable-hdpi-v4/ic_forum_grey_32dp.png SHA1-Digest: cSlg8JMxk3TIeSIUC0RyfeRk08o= Name: res/drawable-hdpi-v4/ic_emoji_recents_normal_dark.png SHA1-Digest: X3QsM9GuCqkHy4N6jxYGe+KtLFo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AL SHA1-Digest: yPKEYcRdYIA9EFpYeQa/oiadZG0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AM SHA1-Digest: rQt2UeEZtLFksuxwBcf23zM7vBw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK SHA1-Digest: r3dq0KcrkP0jaZdnsmVsq75GOZs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AO SHA1-Digest: azCK9NpdSOcxG0hg/MVnVsHj8nE= Name: res/drawable-xxhdpi-v4/abc_ic_star_black_16dp.png SHA1-Digest: PyXLVQgunmY+Bf76HwBrp/pQPD8= Name: res/anim/design_snackbar_in.xml SHA1-Digest: 6+HyUPWWyECHhvkn7FfU/SL24MA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ID SHA1-Digest: rS5k3wMYUVWZTCho3c6br6PqCaI= Name: res/drawable-xxxhdpi-v4/ic_volume_off_grey600_18dp.png SHA1-Digest: SKYyfO8DzgP6x7iMbCnKTxBrl2g= Name: res/drawable-xhdpi-v4/list_selected_holo_dark.9.png SHA1-Digest: ddkFXkinX/KLQzbgj+uBDgSBNFU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IE SHA1-Digest: 4+jmZi1toewgU/CaT83WnN0Dm58= Name: res/drawable-mdpi-v4/ic_emoji_objects_normal_light.png SHA1-Digest: BqeIFAcFwZJkqb5kR2t0UfKoxR4= Name: res/drawable-mdpi-v4/ic_delete_white_24dp.png SHA1-Digest: ML68wg2G9p1NW9VL8r3BEjQWKoE= Name: res/drawable/abc_list_selector_holo_dark.xml SHA1-Digest: sfvAyXGl6drAr6es0R11c9d9BWE= Name: res/drawable-xxhdpi-v4/ic_emoji_flags_normal_dark.png SHA1-Digest: sJlblRDOGWvtx1he8SCgTQ6+d5Q= Name: res/layout/recipient_preference_activity.xml SHA1-Digest: UqQ9PQpDhUO/CKxhxMTz4h5O4Xg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BD SHA1-Digest: zCrZncjiYQ+SSHCjmHeLbiCjNzM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BE SHA1-Digest: jYfjZytM8bUw79AXzIi1/hxwQjo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GP SHA1-Digest: 6rjESUS5+feJhBlx8+ju7t710VQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BB SHA1-Digest: 9kxNiqmoKhvMF/sqAR1UXHsMGiA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GM SHA1-Digest: Rc7/O3kbe1uK7g7HZ3AeWGMNsXw= Name: res/drawable-hdpi-v4/ic_forum_black_32dp.png SHA1-Digest: hJWxyhNX+BfxUqxI1hZrgiMJOWA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GN SHA1-Digest: HhbjDJ1+NjuON8mgNRzGKWoVLCo= Name: res/drawable-xxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: cVnySG63cChr86Xl5aTin9ET16o= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BH SHA1-Digest: xl02B3ICW6yoVpNy664JuKwusSc= Name: res/drawable-xxhdpi-v4/ic_volume_up_dark.png SHA1-Digest: wrA8hRzex8CVScwGSQchX8ddrpU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BI SHA1-Digest: PMcwTj7rmmsZk55PL1wHhWz5pGo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GT SHA1-Digest: M7KRT6S140vIUkuZMzMyRuEhypo= Name: res/drawable-xxhdpi-v4/ic_emoji_symbols_normal_dark.png SHA1-Digest: MCF9dMXO7s/Q5Mn4VzRiNbn7pWM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GQ SHA1-Digest: agM36GEm6lZQI9DuDoU02RhuH+4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BF SHA1-Digest: t/MR3+1upQKBSIeDoMlBbajuM7Y= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BG SHA1-Digest: 59p12EeJr8dx2MCE4fMPuC31iSI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GR SHA1-Digest: 4zFbzS+vY1NLsUeqI9GblXxAeH0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GG SHA1-Digest: jr3bdyX8sEm71B9kN/nyKl+GmpQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BL SHA1-Digest: A926WshRsug3ni7OrI1AwVEh31o= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GH SHA1-Digest: 72MPX/1hxgEFifRHhVlPDMNeO1Q= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BM SHA1-Digest: i1dy4FQOimGiGsNWwZpE8cq7nbY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GE SHA1-Digest: yYSoBGeSgU8l3jcRnhv5mkjHpTg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BJ SHA1-Digest: x3YZGtLHr+Q6W+lUy9epyAhLy2c= Name: res/drawable-hdpi-v4/ic_emoji_objects_normal_dark.png SHA1-Digest: RZ6mrsoTtAKh3cAL6JKF72jBesw= Name: res/layout/share_activity.xml SHA1-Digest: Ita0eNBhDG/Cj6Og4F9b8xmJraQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GF SHA1-Digest: NmIGjkQELlpQbKp1XGceoCKGBkU= Name: res/drawable-mdpi-v4/ic_volume_up_light.png SHA1-Digest: u6HXSVUzjgY0xbLFEqSUH+sJq/Y= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GL SHA1-Digest: NdYWDpksScmfPQzQkfdwB4nrqv4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BQ SHA1-Digest: LLye+k6pHTjiEpbOSR48QRJ14Ss= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BN SHA1-Digest: 4KVJcIVvOyM5pNkHRP/LW0+PRcc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GI SHA1-Digest: MyW+90JQaFDpR48bmHsW8BemAn8= Name: res/anim/slide_to_right.xml SHA1-Digest: 0bv28EjFYG0W9O86/FUEyVGaIDc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BO SHA1-Digest: buuWxRiANcZzz39kZI5wZJ/UeG8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AT SHA1-Digest: ADPcGHEooR0B5HgIxPe3yh4wRJs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AS SHA1-Digest: RwNKTKAqOrr0n/V1DJv6xcBrM9s= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AR SHA1-Digest: nYPTqOieOO6SHDfne5T+mLjtYgs= Name: ws/com/google/android/mms/package.html SHA1-Digest: hE75Rt2Cmrv60CqpfVI+PwrlrKA= Name: res/drawable/conversation_item_header_background.xml SHA1-Digest: PkBtM4IfjAPJkWt/w+fC0XhKS5c= Name: res/drawable-xhdpi-v4/lockscreen_watermark_light.png SHA1-Digest: 6lUHGvK7lN2atKOLCJlnvLhmeqI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AX SHA1-Digest: sXwKZXkjx/U8gixI7RH6L+86n8s= Name: res/layout-v11/conversation_list_fragment.xml SHA1-Digest: 3GSSdYX5sM6ipBwkUrO68YEi77E= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AW SHA1-Digest: o0ePsLjCS4rgHmKYRB5YuHcWCXk= Name: res/drawable-xxhdpi-v4/ic_send_secure_white_24dp.png SHA1-Digest: pUlJWnz3F+tFSFZ6Q2Z3hDQecVs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AU SHA1-Digest: IqierGXHtECqe4GIQCtK0znopWg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GW SHA1-Digest: aePAn8Cab2WuQ89czJC9MY2KHyc= Name: res/color-v11/abc_background_cache_hint_selector_material_light. xml SHA1-Digest: vGI9qWZK86UPRnOAjUVBBgxhqoM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AZ SHA1-Digest: LhSf1T7IvjcCena3HN71hUfZ7yE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GU SHA1-Digest: fSn6p96r0c0yB7X363RA5pvZC3M= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BA SHA1-Digest: 0fwq5LAnY+VauQY0TOR7t3qaN/c= Name: res/drawable/emoji_category_places_dark.xml SHA1-Digest: mKSryOKdsURVrjhQix+yeiEGwKc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GY SHA1-Digest: 72s/mUFzGGxqpbqHVXbA2oS+5Hs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CG SHA1-Digest: yYWxLrw40zQlfaBccZ+ywrWIgdo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CH SHA1-Digest: t42SOokbTnreJMp3blXZneIMfmY= Name: res/drawable-ldrtl-v17/actionbar_icon.xml SHA1-Digest: Yy7GfAlLoeD86LGaO6/AyLJjuC4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR SHA1-Digest: xi2IkCwD2C1YhJ7m/p5vytuaoUk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CI SHA1-Digest: FtkL1qR+puYf2ZP/hN13hjxmFZo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CC SHA1-Digest: pj2Re+j+ZHBZ97k1cXh9Vs85LGo= Name: res/drawable-hdpi-v4/ic_done_all_white_18dp.png SHA1-Digest: gB/Fn8OghOrqWdvk6bIo+WURnZA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CD SHA1-Digest: QP2A23S3XYWiInoSyl7indNTbzo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FM SHA1-Digest: U0rmgar+PoH71nmCwk4VA/S7SEU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO SHA1-Digest: pYmvqgGcSKzcBQdvp1Xx86OliuY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CF SHA1-Digest: 28aUWlCa/0ftFre4yRHCEFjFbZU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CO SHA1-Digest: hc+XpUgEPSNA9D07Jqdb+JD29yc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FI SHA1-Digest: R2/EqbCHeYQhz/eizc59jyVKbxc= Name: res/drawable-mdpi-v4/notification_bg_normal_pressed.9.png SHA1-Digest: yi6e8XUhhsJcenYvin1Ro8e73nY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ SHA1-Digest: Yxuw/MtmKGkOnVTtZA1h3gs2h5M= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CR SHA1-Digest: ithTLwS5D/vDgZ/mT2e27D9Dsgo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FK SHA1-Digest: M9Z4aTMhfb1IwhDFpVau0hECb34= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CK SHA1-Digest: IAk623SiQPlkGmcaSGA7OtajaU0= Name: res/drawable-xhdpi-v4/ic_scroll_down.png SHA1-Digest: MwQAn/tjGBzRGtJlcWC6y7R6y4Q= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CL SHA1-Digest: +NX7TGNDK+2iD7j1enQTP5cfoXs= Name: res/drawable-xhdpi-v4/sms_selection_icon.png SHA1-Digest: K1XGwBV46Pk4HZDPGOhMZsT5MNY= Name: res/drawable-mdpi-v4/abc_textfield_activated_mtrl_alpha.9.png SHA1-Digest: LHgpBq22Tp/Uz7G6kTktjBB334g= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CM SHA1-Digest: pQB/+s6po8oIhPJ3EBEqyQpx8+U= Name: res/drawable-xhdpi-v4/abc_text_select_handle_middle_mtrl_light.p ng SHA1-Digest: nom5EFpS7blCwactlhvHBLuEfCU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CN SHA1-Digest: K1wvu3GgibjX4toiXdhiWdIP5sc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BW SHA1-Digest: Dd6O6q0ANmaHd0vscJWabMQxAy0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB SHA1-Digest: vYNOxn9CfHShvNze6bu+k9dv8uQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GA SHA1-Digest: ELfUOOdv4uMFeDG6GJcOppNs7u0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BY SHA1-Digest: ljsu1T3XB76a/BeFRln0ojU3Dr4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD SHA1-Digest: G2JfNFUSdaZa/og9TbXIQDQrlpc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BS SHA1-Digest: a2XmLLonApLk8nYjUY8V73lZJZw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BR SHA1-Digest: al9zf3TVa7Ve99aI/am1USk9y2M= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BT SHA1-Digest: n4yOb54Mv3+EnSUxSoS0XarSX5k= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CA SHA1-Digest: n3iG5qLZan30la135XNHTs380FI= Name: res/drawable-xxxhdpi-v4/abc_ic_star_half_black_48dp.png SHA1-Digest: CqdgtKKg5LzgT+Utih7LH0FOba8= Name: res/layout/empty_time_zone_item.xml SHA1-Digest: ieGUBRMmXnFF9ndtJEe4UUoe4dY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BZ SHA1-Digest: xWKU8QZvkdDD2fwnrIgt1achzX8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DJ SHA1-Digest: JViet+S6qPRSZaSvu8NGcfanUUQ= Name: res/layout/country_selection.xml SHA1-Digest: xAbtwp5RvpUqcs1VfEnelzP82hA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ER SHA1-Digest: GjrOcKCpIAPs5DGlQHH39quIYKo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DK SHA1-Digest: qk0XlsJkP9Reexq2kr3yQ7rJ+84= Name: res/layout/dots_text_view.xml SHA1-Digest: r2xnC1LIQwvev9hzjc4fbI+A2cM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DE SHA1-Digest: NjykeGKqIE1DFOCrC/p1XUkd1Zo= Name: res/drawable-xhdpi-v4/ic_emoji_emoticons_normal_dark.png SHA1-Digest: qmPky+oRAyf3lQyuBAi7fH3pkFM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EG SHA1-Digest: JHKFehFvMn1tvW+70RNjxCUt35U= Name: res/drawable-hdpi-v11/icon_notification.png SHA1-Digest: mwvJ5lhMelDcqZ5HSgxZXXrADjw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EH SHA1-Digest: 6rzZPeyjZIslePbk6sXAv8roYjI= Name: res/drawable-sw600dp-mdpi-v13/ic_backspace_normal_light.png SHA1-Digest: Z4J6EVi+XrPCSrsIZUYQVNimpnI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE SHA1-Digest: FZyGVbsU6rDYHNUfk+UXWWsNJl8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DO SHA1-Digest: 1o54z9+7TYRXR+cc7QhHiUVUSjE= Name: res/drawable-hdpi-v4/design_ic_visibility_off.png SHA1-Digest: R+V7ZmC50puvgW1vyi72e7cIQ4Q= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC SHA1-Digest: dVQFvjTDO4hpwzIVVVen4r6gwoM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DM SHA1-Digest: ND0TIhkvew5K4s6vA/eNXmpMFVo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CZ SHA1-Digest: WGdEz1K7JLL9E8MBJrYTbUjtgd0= Name: res/drawable-mdpi-v4/ic_image_light.png SHA1-Digest: dph6JIFScemUkyC8V4bp2vzFomQ= Name: res/drawable-mdpi-v4/received_bubble.9.png SHA1-Digest: x4/fSsrwLvIKbFtRM1k+uNrk6VU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CY SHA1-Digest: KMSE4subU7Gs/aIA2QCTYQ3/jf0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CX SHA1-Digest: FHoxe1QKkee6R/U6aVKIg4Itnls= Name: res/layout/contact_selection_list_fragment.xml SHA1-Digest: XKk68FA4pyOy5PSlDJZZ/PeQkPM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CW SHA1-Digest: FdIfwTyK28JACeQUquJwha5JHhk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CV SHA1-Digest: Ni7NplLdDN+fQerk/xcl9j8PB/4= Name: res/layout-v11/notification_template_big_media_narrow.xml SHA1-Digest: ZiBVLtWcb4GpY4ETxsBuSCIlULc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CU SHA1-Digest: 6mEArUwmcpF/h1AR8tPK90q63F4= Name: assets/fonts/Roboto-Bold.ttf SHA1-Digest: j1hyrMHyDgMGFiAB3rrPXhTUbow= Name: res/drawable/circle_touch_highlight_background.xml SHA1-Digest: o9QlrRMiE0mC1+dmj4+fg7vpBW8= Name: res/drawable-xhdpi-v4/abc_list_divider_mtrl_alpha.9.png SHA1-Digest: riXoVDKowB8vTruZhoiXpL8vgBM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ET SHA1-Digest: n7OHKx+6jwATc3CLZiztk3USmuU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES SHA1-Digest: CRNNSNA+d0seJkQFZ7sBVk4CWnk= Name: res/drawable-mdpi-v4/ic_mood_white_24dp.png SHA1-Digest: aAawECUowovSRqameg6tsxx6O/8= Name: res/drawable-xhdpi-v4/lockscreen_watermark_dark.png SHA1-Digest: 0c85wNc0nV5Zztf7GsYMc7SKJTI= Name: res/drawable-mdpi-v4/lockscreen_watermark_dark.png SHA1-Digest: M0xsGNyKiuHwaBCCuPvJDCgOWgA= Name: res/drawable-hdpi-v4/abc_text_select_handle_middle_mtrl_dark.png SHA1-Digest: GK+YDX+4M+S5s+noA2Vsy3W+aJs= Name: res/drawable-xhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png SHA1-Digest: kXL/oF0Wug/Gk2tR7sFuSTOQNZU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DZ SHA1-Digest: wYmZxGBYrzzJuQlTTW/YGH2yKHw= Name: res/drawable-hdpi-v4/ic_volume_off_white_18dp.png SHA1-Digest: RQwdjb8jY+52wCaopLvBGc7pRJo= Name: res/layout/receive_key_dialog.xml SHA1-Digest: +as8PetwnBBaeJCc1pbfKl8dR3E= Name: res/drawable-xhdpi-v4/ic_emoji_flags_normal_light.png SHA1-Digest: lnap7s6+mfZWSa/l952QIfrjfU4= Name: res/drawable-xhdpi-v4/check_dark.png SHA1-Digest: hnSfgvYA13U6JO5FBxxS7gf5LTI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE SHA1-Digest: i90vdo+kDq0/AgoF2/hKBKmpLwk= Name: META-INF/services/com.fasterxml.jackson.core.JsonFactory SHA1-Digest: Ba5fEoE3Fm8wW/CHD7Agsn0j4D0= Name: res/drawable-xxhdpi-v4/divet_lower_right_light.png SHA1-Digest: t2Qll0Avs8v4McfCcni+SomfuoQ= Name: res/drawable-sw600dp-mdpi-v13/ic_backspace_disabled_light.png SHA1-Digest: wHYchHnEyH9uYlSfdtV8q6up33E= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM SHA1-Digest: i8oFWIydqBHus8lvoMmndRp9CZM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK SHA1-Digest: hDPjOmt/2gjKn+joDBSniMIGBBo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DJ SHA1-Digest: pxCV0EJL2IKyl2pmfUh+WiMdmnQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO SHA1-Digest: Xp68rW1mi+n+TgXTP3PDatqmb60= Name: res/drawable-hdpi-v4/lockscreen_watermark_dark.png SHA1-Digest: jRk++D87ZgQBkJ2HLWlABxkEJJQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CR SHA1-Digest: 5vyh1wsamKDoo1uoxxc420QtAmE= Name: res/layout/abc_screen_simple_overlay_action_mode.xml SHA1-Digest: 5in0sNUsZqh4AJN6Pw4SP4w5RCg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CU SHA1-Digest: OG3DIiqNwucHlpwwzHDBiYWx/m0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CV SHA1-Digest: pynPRo7ET2L007kIDboVoR72fIY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CW SHA1-Digest: 9ZCdntZll9KvA+/BzKc4qolDvXg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CX SHA1-Digest: zP0i8LRrkTXlWUtKqoGCqlhN27I= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CY SHA1-Digest: BcpGJtPeqZZv7HMotN7x9N+QJLs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ SHA1-Digest: +2yorg5Wp5S1MTPuH29YMiG2oYA= Name: res/drawable-xxhdpi-v4/ic_arrow_forward_light.png SHA1-Digest: oGaS5N6FElUZmWHK0FVqsp/IO5I= Name: res/drawable-xhdpi-v4/ic_launch_white_24dp.png SHA1-Digest: 9qBE6yOKZcH/Q+7qpXV1+USE2CU= Name: res/layout-v17/select_dialog_multichoice_material.xml SHA1-Digest: yEUBZ0g/mR7cWkH9CqzEQd1oYGk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA SHA1-Digest: sWZkDflRTGQB8qYSv4kDYp553Cw= Name: res/menu/text_secure_normal.xml SHA1-Digest: HnrmryD9ml1+2+Ri12H8J336Ep0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CD SHA1-Digest: gZ545vQf9tZD5xNi5Wx+IoKYnts= Name: res/drawable-mdpi-v4/ic_push_black.png SHA1-Digest: nXSF8HKfR3Vg0Fy5MbDc6+qfozU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CC SHA1-Digest: uUaHWJqH3ky16k/qae+8AMBLX/E= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CF SHA1-Digest: yI20Wiel7QOU9Fbm6vOVsrEv/dM= Name: res/drawable-xhdpi-v4/ic_push_black.png SHA1-Digest: yLyv9x4uDYDvqBSzCJUjwI2tFwk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CH SHA1-Digest: 4QhdJjXQLyQ8DECkDwpdq5NJDZA= Name: res/drawable-mdpi-v4/abc_ic_star_black_36dp.png SHA1-Digest: 1f+9ywNx/F9X01VZ3lJ0+rCEP+w= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CG SHA1-Digest: u+u2LhZzLvwcBRKyHfo1LRRsgik= Name: res/drawable-xhdpi-v4/ic_circle_fill_white_48dp.png SHA1-Digest: hNQXoSG2a3z0X2cdvCVa6CCid0o= Name: res/drawable-hdpi-v4/ic_send_sms_secure.png SHA1-Digest: iUTEcbh57hLDwBq24T/T3UkP6lM= Name: res/drawable-hdpi-v4/abc_ic_menu_share_mtrl_alpha.png SHA1-Digest: bUAKKsOuQiIKVhmzcDr9M6636LE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI SHA1-Digest: gQEKmOIshxNtdeACTSv8jGlIV4Y= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL SHA1-Digest: tRpUktZVU/SNjBVEf6SfsRwMdzU= Name: res/layout/delivery_status_view.xml SHA1-Digest: bexcCxKtBslE3ln9kGHk8H9ZDZg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CK SHA1-Digest: RXrpeuEmFtPS5IfZxtB/lmJcY9I= Name: res/layout/abc_list_menu_item_checkbox.xml SHA1-Digest: 6BtxtrSj5417sUBtS2ccXrol3a8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN SHA1-Digest: +6d+rS/lWclQcQjX9ZjIN4LVruU= Name: res/drawable-xxxhdpi-v11/icon_notification.png SHA1-Digest: iaRai5qybbT8Fq3yigwMnAR2B90= Name: res/drawable-xxhdpi-v4/ic_lock_black_18dp.png SHA1-Digest: cwRPAQdnIT94PjrUbHtEv1uHPq0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM SHA1-Digest: 0DUTWcWAP6rp+oEh9TmRMa54tuc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO SHA1-Digest: W0Zq050pRN7pfN7BEbCABvfgtvs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW SHA1-Digest: Qr5RYO3gwcgGwRC8QnzB5hE8nqk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT SHA1-Digest: A+rn7UjM4OB2drvaZMjvhZe0iyY= Name: res/drawable-xxhdpi-v4/ic_emoji_symbols_activated_dark.png SHA1-Digest: o1JodDcZ+/2TneCvfAg7xbN2dao= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR SHA1-Digest: 4KciA1/jpo+Us6frPM2TDyYgapU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS SHA1-Digest: LoUK74c8inyEoN7gi28JdyFDr6c= Name: res/drawable-hdpi-v4/ic_unarchive_white_24dp.png SHA1-Digest: kUDb0vw7IlUei5/mx1ma9Bxn27Q= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BQ SHA1-Digest: eNnUu+NOur+4ONfnW6r6wNhusQk= Name: res/drawable-xhdpi-v4/ic_clear_search_holo_light.png SHA1-Digest: 35PHZggi1WM89Ol/GmUHZD8kVcc= Name: res/drawable-ldrtl-mdpi-v17/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: 0rrYNtqAe+ZiS5xOdK1BRYb2P1Y= Name: resources.arsc SHA1-Digest: FGxuj5EoYTsdNQSzBhNVBejvmE0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ SHA1-Digest: irkyQd1csI6B8RqbC6gHjMbvdaA= Name: res/drawable-xxhdpi-v4/textfield_disabled_focused_holo_light.9.p ng SHA1-Digest: bpNO5KEKc7d4ScXs/viJJsIhwgw= Name: res/drawable-hdpi-v4/ic_forward_white_24dp.png SHA1-Digest: aRxUkfDbNUGrZan+V8kVCzW8mj0= Name: res/drawable-mdpi-v4/ic_lock_black_18dp.png SHA1-Digest: 2Io9MNnOrhJgjFuMDd5JepnF+6M= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BY SHA1-Digest: ctFRXqrm2CU6J4vmMKXKTBgUW3Q= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BG SHA1-Digest: VSinasjH7YMZucy8zl/W4APmIvs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF SHA1-Digest: WVduyV1nMc6tHyitox3c2YOd300= Name: res/drawable-xhdpi-v4/list_selector_disabled_holo_light.9.png SHA1-Digest: GN6V3GwpXHWWT1+XcPJFYRdM3lM= Name: res/drawable-mdpi-v4/check_dark.png SHA1-Digest: msEel7Kkn0/+XEw1alP/dbAfJBc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE SHA1-Digest: Rt80YoKYWhYg8qYrkA+4cZa4fEw= Name: res/drawable-v12/recycler_view_fast_scroller_bubble.xml SHA1-Digest: NEQxqwQjygZugYFJNUU8ybLfvxQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BD SHA1-Digest: SlQkPaNnY1fkS5JC6/OZxOsMfeg= Name: res/drawable-xxhdpi-v4/abc_ic_menu_share_mtrl_alpha.png SHA1-Digest: QmTUhZnsFXq7hkzsW4is5m3JyPY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB SHA1-Digest: XtU/YyywY3n91uCeYDD8/Uvq6go= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BA SHA1-Digest: hKU9mWp0M4mY9m9+LIEz+zlgd90= Name: res/drawable-xhdpi-v4/ic_emoji_symbols_activated_light.png SHA1-Digest: c/HB22lBNN4LYepm5i2iEghdj5M= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO SHA1-Digest: I88GLx6L/DOmQYVvrm4k3VzOml0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BN SHA1-Digest: wUHRTCnaCDLgleWQ473n569Ghcg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM SHA1-Digest: DdSVOQd9u2r8J0b5EsioY+pfGok= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BL SHA1-Digest: GJur2TVqfbwpfjwtOe1+nIgw5nU= Name: res/drawable-mdpi-v4/ic_mood_grey600_24dp.png SHA1-Digest: 7F78uZJiQgg86rqIU3bYHBWKv0A= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ SHA1-Digest: RYe85vl8w2mFpnQApeEqOzBs/n8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BI SHA1-Digest: iZS88pkOBOYAqBOWNk7XEsywMoM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH SHA1-Digest: rrsHM9AVXnrY1FuX6p/e038RG74= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS SHA1-Digest: dZf+gKLL2HEfDDJtH2ICK+9ous4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT SHA1-Digest: UKJvKRYrZZyqCUmMzKu8cEyKKtg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AU SHA1-Digest: ge/jX/b43m/JPiPEQmWZ4RBogfY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AO SHA1-Digest: D0Ha1bJNuWQpKfn8SDYzyhOxgbA= Name: res/drawable-xxhdpi-v4/ic_photo_camera_dark.png SHA1-Digest: YdUPwpYPhTRR7oaMVGCCBmeSgXI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR SHA1-Digest: yXLuaTHYydSh3300TSK9FkGDpnM= Name: res/layout-v17/timezonepickerview.xml SHA1-Digest: +YWjxNfx1LOtArG6NGneDyYXRiM= Name: res/drawable-hdpi-v4/ic_scroll_down.png SHA1-Digest: StqE1YltKYi7ZGi6Cq6zNHhqfmQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AW SHA1-Digest: pbs4IuJBvYxSwRB+BbHiaY3hyUM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AX SHA1-Digest: IMFkSP65C+E3ZpRHve2W8GaMj+s= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AZ SHA1-Digest: s39zUHcenjbKrpltkUa46B3mS2c= Name: res/layout-v16/conversation_item_pending.xml SHA1-Digest: y3mA0Gy6gk7Sw6LtqUBSzs3HP68= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AD SHA1-Digest: RlMBrl7zBtonq3pZ0inesEZ2jV8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AC SHA1-Digest: wzXH46Hy7sWC7b1cAVQTFfs93wE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AF SHA1-Digest: YEPpzFP0XN64qbp1OHkRsOhv9Vc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AE SHA1-Digest: IvmkLYAi5ks8DZw9HSTw0t+eZfQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AL SHA1-Digest: oJGHicPYBCz//Bm8oPcl08BUyt0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM SHA1-Digest: kx0iGCYKQ+DZtjzKJ2hTNrMtRcI= Name: res/drawable-mdpi-v4/ic_block_grey600_18dp.png SHA1-Digest: xSjan0vZ29yMU3/RPBAuz4XeW44= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG SHA1-Digest: lV+64gNnL0BzEI7tOf+vSwmk80g= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI SHA1-Digest: 0cHZnnuP8/HC5DR0/3dNseNewyA= Name: res/drawable-hdpi-v4/ic_clear_white_24dp.png SHA1-Digest: e5gKy+pyNuu/hqM/R9ev9pw3VPM= Name: res/drawable-xhdpi-v4/ic_account_box_dark.png SHA1-Digest: DJEXivhO+8en8JB4z4/0/+Hn4d0= Name: res/drawable-xxhdpi-v4/ic_download_circle_fill_white_48dp.png SHA1-Digest: UAXpmhPTtc8E0ctoCpM7H7pZet0= Name: res/drawable-mdpi-v4/ic_lock_dark.png SHA1-Digest: QOVZAs0XsZPL6eJ/iYVWmqjyc7w= Name: res/drawable/abc_seekbar_track_material.xml SHA1-Digest: DOBvDIvN1gw9U5RRVtBGkfeW8rY= Name: res/drawable-mdpi-v4/ic_call_split_white_24dp.png SHA1-Digest: tZgaQC9PgwZKGo258RR9eao33J4= Name: res/drawable-mdpi-v4/ic_emoji_places_activated_light.png SHA1-Digest: 75owbEhkOq9i8feK35kLglQs1fo= Name: res/layout/abc_list_menu_item_radio.xml SHA1-Digest: CYF8DGDu/tGrm7bhmsGCFVCBKJ4= Name: res/drawable-mdpi-v4/ic_emoji_places_activated_dark.png SHA1-Digest: dfMxSRGieu5e9RyYKQCg3PsGaj4= Name: res/drawable-xhdpi-v4/ic_call_split_white_24dp.png SHA1-Digest: 5vPMyWqAWYhj6q9d6gkjzmESbLg= Name: res/drawable-xhdpi-v4/ic_emoji_people_normal_dark.png SHA1-Digest: uOkkVrMmBZqLdrAA1gP9sKNwVPM= Name: res/drawable-mdpi-v4/abc_ic_menu_share_mtrl_alpha.png SHA1-Digest: a7qUZSr00ZcAUmE7JWdYo2goDxg= Name: res/layout-sw600dp-v13/three_keys_view.xml SHA1-Digest: 9i+QtBZj1xjUP0dJm/2s08Fao3M= Name: res/drawable/abc_list_selector_holo_light.xml SHA1-Digest: 97+5PTkiP0Ok/P9371JlRcH0xnQ= Name: res/drawable-xxhdpi-v4/lockscreen_watermark_light.png SHA1-Digest: JLCC2x8L/5GAbnfY3JOlgzQvBfU= Name: res/drawable-ldrtl-xxxhdpi-v17/ic_send_white_24dp.png SHA1-Digest: eWeA9e16JIKEQxDvXf/++bhBMOI= Name: res/drawable-hdpi-v4/ic_account_box_dark.png SHA1-Digest: E1V2KrSJR96wVzauXfHJa3ftZSY= Name: res/drawable-mdpi-v4/ic_file_download_white_36dp.png SHA1-Digest: aFCq90YUgXcwZXHc8ic8yBHyKtU= Name: res/drawable-xxhdpi-v4/ic_push_registration_reminder.png SHA1-Digest: LBljpyLEbwvk7NjQH/0wvwOpb0I= Name: res/drawable-mdpi-v4/ic_menu_add_field_holo_light.png SHA1-Digest: HT9HQGybsTJXMjvnUua17xpTeCg= Name: res/layout-v17/custom_default_preference_dialog.xml SHA1-Digest: iGxN2JBtz3p68bBASElzuLFMZzU= Name: res/layout/contact_selection_list_item.xml SHA1-Digest: 6G+nvHsi85Vs0w1r8AsIQU1BIaQ= Name: res/drawable-xhdpi-v4/ic_send_secure_white_24dp.png SHA1-Digest: /KQ/orkUQLjKl5kighqumDfycAU= Name: res/drawable-xhdpi-v4/abc_list_selector_disabled_holo_dark.9.png SHA1-Digest: Iz14YLSRp9C85A2InSd7OO4Ga6U= Name: res/layout/three_keys_view_right_drawable.xml SHA1-Digest: OARIR3OFTnY6eQc0mHjh7x/URhU= Name: res/drawable-xxhdpi-v4/textfield_default_holo_light.9.png SHA1-Digest: DKeaMClqVsDdOOwdcsmTzm049Zg= Name: res/drawable/abc_btn_borderless_material.xml SHA1-Digest: 9+UIx5LzMU67HsEZH0vBreWiJPE= Name: res/drawable-xxhdpi-v4/abc_textfield_search_default_mtrl_alpha.9 .png SHA1-Digest: shUg8eUw5YmR+wQVpcO99B+3lpc= Name: res/menu/conversation_popup.xml SHA1-Digest: DEg7Q3NS8JGA0429vJWm0Mvpr+g= Name: res/drawable/abc_text_cursor_material.xml SHA1-Digest: j7vrPa0Diwit3eZnv21AEhEOiLU= Name: res/drawable-hdpi-v4/abc_ic_star_black_36dp.png SHA1-Digest: gD9pNd1rfZaHg/T9sIhWnrNT9Ks= Name: res/drawable-mdpi-v4/abc_popup_background_mtrl_mult.9.png SHA1-Digest: osQ7eeMeQ/k1V+sk6cW3zQoE1tE= Name: res/drawable-xxxhdpi-v4/ic_volume_off_white_18dp.png SHA1-Digest: z7yFMqSQsmhS8cFnlwVT5ntI2Ts= Name: res/drawable-xxhdpi-v4/ic_check_white_24dp.png SHA1-Digest: 8wFL0VlS5dZarinEXmH01EFZc5Y= Name: res/drawable-hdpi-v4/ic_message_gray.png SHA1-Digest: cW4C+vLes/7/iok4hyO3+Cbv2uo= Name: res/drawable-xxhdpi-v4/ic_content_copy_white_24dp.png SHA1-Digest: RjxpVGv8KhOgXXPZY/AcHxRCqQc= Name: res/drawable-xxhdpi-v4/ic_recurrence_bubble_outline.png SHA1-Digest: QUB4BQiNCq2ODiEHdyGUrmFbJ4k= Name: res/drawable-xxhdpi-v4/splash_padlock.png SHA1-Digest: cINCM2OQ7qKGOXWHFk9Biphn2Fo= Name: res/drawable-mdpi-v4/ic_group_photo.png SHA1-Digest: UstH5ETddEM9nTpUWBD3dntx970= Name: res/drawable/conversation_list_item_read_background_dark.xml SHA1-Digest: QVhTb1JvTgh0OuL4XwXcmoYgAOg= Name: res/drawable-xhdpi-v4/abc_list_focused_holo.9.png SHA1-Digest: Odk0wSbJp0hyQ3RZGhgf+2IXqBU= Name: res/drawable/recycler_view_fast_scroller_bubble.xml SHA1-Digest: Ya8tiZ7KeS8UUktQeNFWslmEDhk= Name: res/drawable-hdpi-v4/ic_emoji_objects_activated_light.png SHA1-Digest: tGhsnYDjKzNZvRHlnY/9Rp8a3DI= Name: res/drawable-xxxhdpi-v4/ic_menu_lock_dark.png SHA1-Digest: +0uXktLB/5wU6t3bQAp0ocoiIwc= Name: res/drawable-hdpi-v4/ic_emoji_symbols_activated_light.png SHA1-Digest: LORgzcXqAUKgwulV9Pb7b2houvk= Name: res/drawable-mdpi-v4/abc_list_pressed_holo_dark.9.png SHA1-Digest: o79LWrpVg8mMdhT8PFdC/uVHnB4= Name: res/layout/design_layout_snackbar_include.xml SHA1-Digest: wstZXlJ7PtCmqNfzenGJkO7cIRQ= Name: res/layout/contact_selection_list_header.xml SHA1-Digest: lKees/HLMOcN/YNRlkGFb3Q2mJI= Name: res/layout/preference_list_fragment.xml SHA1-Digest: 4ipfI4WoTkZxFEZmqCeDvQeUlhs= ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/org.smssecure.smssecure/signatures/134/MANIFEST.MF0000644000175000017500000070757214620351225026702 0ustar00hanshansManifest-Version: 1.0 Created-By: 1.7.0_121 (Oracle Corporation) Name: res/drawable-xhdpi-v4/abc_ic_star_half_black_48dp.png SHA1-Digest: IIXvgndAzHnlbFdPy/QNd5PVgd0= Name: res/drawable/abc_btn_check_material.xml SHA1-Digest: 4XHnecusACTIgtImUjC7bQ9HNM8= Name: res/drawable-xhdpi-v4/ic_video_light.png SHA1-Digest: U5U2LHRskn9jaXDMTvHZ1EjilWw= Name: res/drawable-hdpi-v4/ic_lock_black_18dp.png SHA1-Digest: S7n2/JX/yuDCLErq0/yirCHoKkw= Name: res/layout/design_navigation_item_separator.xml SHA1-Digest: ZrVCT50MLzsYssSmPSnwC2kz/Hs= Name: res/drawable-hdpi-v4/abc_textfield_search_activated_mtrl_alpha.9 .png SHA1-Digest: sM1tzoxIgcK5w/PwGSZxzucCBqY= Name: res/drawable-xhdpi-v4/ic_advanced_gray.png SHA1-Digest: a4mTiItaaOrkObi4PO2hLFA2qeg= Name: res/drawable-mdpi-v4/ic_notifications_black.png SHA1-Digest: N70Up5wxCOD1opQkUHZZD90OIXQ= Name: res/drawable-hdpi-v4/ic_audio_light.png SHA1-Digest: BQU5Jkm8jgm5qPNXsiTqIUNK9hM= Name: res/drawable-xxxhdpi-v4/ic_textsms_grey_32dp.png SHA1-Digest: Nf/LIN1pRUA77kNNOrXYPAT4DlI= Name: res/drawable-v21/abc_action_bar_item_background_material.xml SHA1-Digest: VikGrClarpkvTVwTS9DEpzyZFsI= Name: res/drawable-xxhdpi-v4/list_focused_holo.9.png SHA1-Digest: FsvLP65iWVfEfIkCPXw4wimwY7M= Name: res/drawable-hdpi-v4/ic_arrow_forward_dark.png SHA1-Digest: 056yrQG7i5TNI25jBLHiQIBh1q0= Name: res/drawable-mdpi-v4/ic_attach_grey600_24dp.png SHA1-Digest: s2S4+X1D/i5/fww5Bc2lWtoAHYo= Name: res/drawable-xxhdpi-v4/ic_arrow_forward_dark.png SHA1-Digest: sGjoiE9yeNeYB84qMmM+lB1oPDw= Name: res/drawable-xxhdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png SHA1-Digest: A1jmf+4/FK84T7WYmxH0Y09wAFg= Name: res/menu/conversation_list_batch_unarchive.xml SHA1-Digest: tZfXEUqLPwLow1ZywhOELowedy8= Name: res/layout/share_list_item_view.xml SHA1-Digest: FlaBySyWODQ+ObFVK+rk6yeR7+o= Name: META-INF/services/com.fasterxml.jackson.core.ObjectCodec SHA1-Digest: mECZ0InRcm6Sm6/P0dIQdmb5YtU= Name: res/drawable-xxhdpi-v4/ic_emoji_objects_activated_dark.png SHA1-Digest: 0Vqi28h81Efl3XxkfQcTf/X+BVQ= Name: res/drawable-hdpi-v4/ic_block_grey600_18dp.png SHA1-Digest: 4I6jmoZyyJOg2EoZu9OHXTOtd8U= Name: res/drawable-hdpi-v4/ic_refresh_white_24dp.png SHA1-Digest: lCrkNOkTGMEpPkiZpK43eSE6ybU= Name: res/drawable-xxxhdpi-v4/abc_ic_star_black_16dp.png SHA1-Digest: SWImInYsdKUpa45H1laBJKZNpMI= Name: res/drawable-mdpi-v4/ic_photo_library_white_24dp.png SHA1-Digest: jjO4ijdaa414z67rjvWBCzBUEY8= Name: res/drawable-xxhdpi-v4/ic_emoji_recents_normal_light.png SHA1-Digest: 1nDUl89fzQc53ObCvzXXlnqnf/A= Name: res/drawable-mdpi-v4/ic_action_warning_red.png SHA1-Digest: c5kWZr/E79wMkqq4a33Ia/tw47g= Name: res/layout/conversation_item_sent_audio.xml SHA1-Digest: ouckIGU21lUqk4E/TL3qF5ZQpro= Name: res/drawable-xhdpi-v4/switch_thumb_activated_holo_light.9.png SHA1-Digest: W+Hupcm4+5Vmhoa+hMuaWAPbj9Y= Name: res/drawable-mdpi-v4/ic_message_gray.png SHA1-Digest: mRK05SwodJgRWHjl6kcUKHfVo/c= Name: res/drawable-mdpi-v4/ic_image_dark.png SHA1-Digest: 6vfvi40T+wAZp2GCPPindGeF1oM= Name: res/color-v23/abc_color_highlight_material.xml SHA1-Digest: d3fTZZ8N/686AarGmf1fVY0oMIk= Name: res/xml/preferences_advanced.xml SHA1-Digest: Mny1c+qoGQuIvGsDXqTswa3bonE= Name: res/drawable-xxhdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png SHA1-Digest: IVjsZMMVr/ce0JFlSQDbVTn2lZ8= Name: res/drawable-xxhdpi-v4/ic_attach_grey600_24dp.png SHA1-Digest: iMQLLyiw1c9Dv5YdxKJ0aKPSIes= Name: res/layout-v17/conversation_list_item_view.xml SHA1-Digest: aN+hQEMZcHYue5msEQjMH4v7qi0= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_995 SHA1-Digest: qCXtFZpw6cj0RMgs3HecypVQnr4= Name: res/layout-v16/design_bottom_sheet_dialog.xml SHA1-Digest: xB2jHM3k+/qdUXqVnuv5nmONmZ8= Name: res/drawable-v11/emoji_category_recent_light.xml SHA1-Digest: M/SBX1z1roN+u5+TvQZXKJDNEyA= Name: res/drawable-xxhdpi-v4/ic_message_black.png SHA1-Digest: Z+M+yxOP45UFN3lnWU00BTJm5cY= Name: res/drawable/notification_tile_bg.xml SHA1-Digest: GASJ/JPWuTyKrvBkfdmK7mtYvlc= Name: res/menu/conversation_secure_sms.xml SHA1-Digest: Umly1//KqmlELY6mwG2+4bTMi78= Name: res/drawable-xxhdpi-v4/lockscreen_watermark_dark.png SHA1-Digest: nyEXs/BKk4Ioez2E62mpWxZ+B6U= Name: res/drawable-hdpi-v4/switch_thumb_holo_light_v2.9.png SHA1-Digest: KtN2rASYoM9JbiYC5rZ+EHNeOWo= Name: res/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_light.9.p ng SHA1-Digest: iN/uNjBfhVbAIr76ujTy7rKk9Iw= Name: res/layout/time_zone_item.xml SHA1-Digest: vnlWmMcNga+AfJgFWDNQIIoLj/M= Name: res/layout-v17/abc_alert_dialog_title_material.xml SHA1-Digest: V1sQ9uyt90Q5ztWU9OddyNDnJm8= Name: res/drawable-xhdpi-v4/textfield_default_holo_light.9.png SHA1-Digest: DuXFeUGOvd3j97HhEpwhlm8QBrg= Name: res/drawable-mdpi-v4/import_database.png SHA1-Digest: ohkWM7042kXKM8DsVK4FYl0OmB8= Name: res/anim/design_bottom_sheet_slide_in.xml SHA1-Digest: JZvF3dH3kK4CROiDGCiyzk0bcCI= Name: res/drawable-xhdpi-v4/ic_image_dark.png SHA1-Digest: pG2xg3lvc0kKIbVUDBgntEps8rQ= Name: res/drawable-xxhdpi-v4/ic_emoji_people_normal_light.png SHA1-Digest: RLKT4JKFh+bDCbS3OE2m2TqLJ2M= Name: res/layout-v13/conversation_item_last_seen.xml SHA1-Digest: nVh5GMSO8uG5b0Ff3hCCIwcZBrA= Name: res/drawable/play_icon.xml SHA1-Digest: sAos14jJZv5f8bMTKeO94bYtOok= Name: res/animator/scale_with_alpha.xml SHA1-Digest: tn55l/2e75ToW4LXM0LeHHxAjTo= Name: res/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_000.png SHA1-Digest: nRtiU5b/2GCMrB/FhPJC0XFk+lU= Name: res/drawable-v11/abc_textfield_search_material.xml SHA1-Digest: Qps1rIzG6yKql3AjAF66l6BFKZ4= Name: res/drawable-hdpi-v4/ic_emoji_nature_activated_dark.png SHA1-Digest: nodqipSEKiA1Wh7Zi4TH5mZ9CU8= Name: res/drawable-xxhdpi-v4/abc_switch_track_mtrl_alpha.9.png SHA1-Digest: IgT0lCbG3uY9vQQnsJCrHog+mlg= Name: res/drawable/done_background_color.xml SHA1-Digest: KQZWh7MuvIw/BvNz3xBDxWt2YgM= Name: res/layout/conversation_item_update.xml SHA1-Digest: yICdPauTzp4uWodLV+0ThZ02PLM= Name: res/drawable-hdpi-v4/ic_clear_search_holo_light.png SHA1-Digest: lySLLFGrRykDN0crMWsDOJvAcPI= Name: res/layout-v16/radial_time_header_label.xml SHA1-Digest: zfzul0N8Pl40HpZdLUdndsD3EKs= Name: res/anim/abc_slide_in_top.xml SHA1-Digest: YBdDQbyB2IFfhjwKI6NSPOXqz7g= Name: res/drawable-xhdpi-v4/ic_menu_search_holo_light.png SHA1-Digest: /ZUrJRkPX8UDursj5Y0cjKzHQk8= Name: res/drawable/emoji_category_emoticons_light.xml SHA1-Digest: Ix5KZgvXSTgzlXU43c2s3+pyEsY= Name: res/drawable-xhdpi-v11/icon_notification.png SHA1-Digest: NTiNSLa7t3TTK0mWOo029dATyoc= Name: res/drawable-xxhdpi-v4/ic_emoji_flags_activated_dark.png SHA1-Digest: FF6h02gP05ugJ46mQGGdoUQTpbU= Name: res/drawable-xxhdpi-v4/ic_save_white_24dp.png SHA1-Digest: vAda17ocZp3K9sSQIG73S3rYY2M= Name: res/layout-v17/import_fragment.xml SHA1-Digest: lTK3hNRJT1fDJbpu1P/q1t0IIhc= Name: res/anim/animation_toggle_in.xml SHA1-Digest: +tj+Zh9Sc3CL9SYyjJU2Itw9c70= Name: res/drawable-xhdpi-v4/ic_emoji_objects_activated_dark.png SHA1-Digest: lKmnwHsEXpfHOrnZpMfxeFQz3Ak= Name: res/drawable-v11/emoji_category_people_dark.xml SHA1-Digest: b/kZoL3i0JG3olAcNzagfvhDi6Q= Name: res/color/abc_tint_edittext.xml SHA1-Digest: sTAI8SOOW/SEHRZMp87XoIXU7cY= Name: res/drawable/edit_text_holo_light.xml SHA1-Digest: KPbOOjkx/j1wRjSSr6Ew1fVQ7Lc= Name: res/drawable-xxhdpi-v4/spinner_focused_holo_light.9.png SHA1-Digest: 7FDASvJfc8AEzERJoNcGwpNM0As= Name: res/drawable-mdpi-v4/ic_recurrence_bubble_outline_disabled.png SHA1-Digest: Wi1XLPwgN/UKKy6kXcjWQgVKmrk= Name: res/drawable-xhdpi-v4/ic_check_white_24dp.png SHA1-Digest: EWTW7qDBAFhOZzexW1mjDojOJ34= Name: res/drawable-mdpi-v4/ic_emoji_flags_normal_light.png SHA1-Digest: xxZCgGAanMLE7VRtyfrK/RS3zT0= Name: res/xml-v12/badge_widget_provider.xml SHA1-Digest: LYzz2MiGdgQYCIgbO3arb3t4YVI= Name: res/drawable-xxhdpi-v4/quick_shutter_button.png SHA1-Digest: YQw6DY43TseRa7+ahBFTptNrSrM= Name: res/drawable-xhdpi-v4/spinner_default_holo_light.9.png SHA1-Digest: Yv8DQV5iCOq6B/hrpnjziMEY1oE= Name: res/drawable-hdpi-v4/abc_ic_star_half_black_36dp.png SHA1-Digest: 9T7OtiKOgE9YHg0K0KlcW6X1OxY= Name: res/animator-v11/bottom_pause_to_play_animation.xml SHA1-Digest: EKWk/sJYqCBErBCnJ88Vs9WwB0U= Name: res/drawable-mdpi-v4/ic_arrow_forward_light.png SHA1-Digest: CbRHxj+5CferrcctmIZ1d0jIDjI= Name: res/drawable-xxhdpi-v4/ic_content_copy_dark.png SHA1-Digest: i++l+AM4yAegDH3qEA21iwiTAsA= Name: res/layout/message_details_activity.xml SHA1-Digest: rCNh6NSBINEtZvsZM7XZ6ovpoUQ= Name: res/drawable/abc_ic_voice_search_api_material.xml SHA1-Digest: omhkmF07gC6wuDBUijeWjNr1lmM= Name: res/drawable-mdpi-v4/ic_create_white_24dp.png SHA1-Digest: dMrdSae/0y0uItmi1TvH7LIG8rk= Name: res/layout/export_fragment.xml SHA1-Digest: acn2Tib5zIDYiwWUQ8+DROsnE3k= Name: res/drawable-xhdpi-v4/ic_lock_black_18dp.png SHA1-Digest: N7y019Qm4MTsPDJvUf6xpcjmLOg= Name: res/drawable/key_background_dark.xml SHA1-Digest: /33Cy7m3UkKOcki5nldzXnDJowU= Name: res/layout/design_text_input_password_icon.xml SHA1-Digest: Lpg93JzhkRdWxr07dxz16VeVgHg= Name: res/color-v23/abc_tint_default.xml SHA1-Digest: JNakLap6TZmoq0IZZTxldEdBsQ8= Name: res/drawable/abc_btn_colored_material.xml SHA1-Digest: c1kBk3kYH1Q2Zf0o2yN8Btg8MFI= Name: res/drawable-xhdpi-v4/ic_keyboard_white_24dp.png SHA1-Digest: uih6E5rFfQHK6fTNT9qs0cTmLTo= Name: res/drawable-xhdpi-v4/ic_reply.png SHA1-Digest: E6A43gDKrTDEXYlV747+gpcFSZ0= Name: res/drawable-mdpi-v4/ic_reply_white_36dp.png SHA1-Digest: 2LpCVIVzMYRpSLyRHyXWzO5I/mI= Name: res/drawable-xxxhdpi-v4/ic_photo_camera_light.png SHA1-Digest: E4gfHIxVLweUS1I6YWO8jy4rKUY= Name: res/drawable-xhdpi-v4/abc_ic_star_black_48dp.png SHA1-Digest: eNgvY49POsWnKG684klRhS5BjwI= Name: res/drawable-mdpi-v4/ic_movie_creation_light.png SHA1-Digest: RAzHQaaPAravxZQZiW0TtJUPDhs= Name: res/layout/hms_picker_dialog.xml SHA1-Digest: kbj1F48T2S6DbCNNs+03w0ebBmc= Name: res/drawable-xhdpi-v4/check.png SHA1-Digest: q8Wdw4VtUWgyMZHvzafRrdm7Fck= Name: res/drawable-hdpi-v4/abc_cab_background_top_mtrl_alpha.9.png SHA1-Digest: J10MbRypNxo+JeKfGf61OMkWgdY= Name: res/drawable-hdpi-v4/abc_ic_star_half_black_48dp.png SHA1-Digest: GV2BrBF8/MHHPwyzNe+cYQSsr8s= Name: res/drawable-mdpi-v4/ic_keyboard_grey600_24dp.png SHA1-Digest: 8qGI1WetA5BPcdLcZ533TtLteWg= Name: res/layout/keyboard.xml SHA1-Digest: i8FnKajJyiLgB5vJQQQ79ZM+vrs= Name: res/drawable/key_background_light.xml SHA1-Digest: 6hucLMUPMI5lbi0CQdnO07Alz4U= Name: res/drawable-hdpi-v4/check.png SHA1-Digest: 9Dw9zTBc9ZC39tlsMH2jDt4hnaY= Name: res/layout/message_details_header.xml SHA1-Digest: rVNpy6Ud1KSAZukWd3bF7JmQY3s= Name: res/drawable/reminder_background.xml SHA1-Digest: ch+x5ouRv1Skv9FSpccJXX4ysfY= Name: res/drawable-xxhdpi-v4/last_seen_background.9.png SHA1-Digest: AcZa88WjmAgL9QcaLEep+IS+fDw= Name: res/drawable-xxhdpi-v4/abc_ic_star_black_48dp.png SHA1-Digest: X8m2s5TyuTw6/NjutpgGA9c1lho= Name: res/drawable-xhdpi-v4/list_longpressed_holo_light.9.png SHA1-Digest: DbbsJ/A8Zk/Z2Q8z6jeVTrNtcKw= Name: res/drawable-hdpi-v4/ic_warning_light.png SHA1-Digest: qalX8/VUDauzBFywTYURgE1L9Qk= Name: res/color-v23/abc_btn_colored_text_material.xml SHA1-Digest: iPtKeCtxBDsPlPY18AN/Fz+9bAA= Name: res/drawable-mdpi-v4/ic_send_sms_insecure.png SHA1-Digest: YLdCNPPxIhI9bmuUabKrE5JPUYw= Name: res/drawable-mdpi-v4/alert.png SHA1-Digest: sSyzRDtWJ5MWIR7PVNG6R5JZD6Q= Name: res/drawable-hdpi-v4/ic_badge_24dp.png SHA1-Digest: BiyuZ+b94otM0TefNe5IDA6Ynqc= Name: res/drawable/badge_drawable.xml SHA1-Digest: aiMhken5i5apS16OJesivKFzhxs= Name: res/drawable-xhdpi-v4/notification_bg_low_pressed.9.png SHA1-Digest: bcGROFguSllVLTSUpbQeY5V6A54= Name: res/drawable-xxhdpi-v4/ic_emoji_people_activated_light.png SHA1-Digest: bWbQisF0+mbPPIfJslvYQ4MIw1M= Name: res/layout-v11/notification_template_custom_big.xml SHA1-Digest: YpS/OEfHDCMgbdA0sBuqh4Hw8gU= Name: res/color-v23/abc_tint_switch_track.xml SHA1-Digest: j8Ow8A7D/juc9qKCl0uOhS7FiGo= Name: res/drawable-hdpi-v4/ic_play_circle_fill_white_48dp.png SHA1-Digest: CG6EW3H6BZYbjlrkr0ioncRLKAQ= Name: res/layout-v16/selected_recipient_list_item.xml SHA1-Digest: IoTIQcdfhF5yj/bZbVuL4GTD1As= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_506 SHA1-Digest: fSwyg4KxEaIctkOMUXXbP0UnACc= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_505 SHA1-Digest: dkhqE6jk0X2rJBCd5h+xJ2vZwls= Name: res/drawable-xxxhdpi-v4/abc_text_select_handle_left_mtrl_dark.pn g SHA1-Digest: nKZVF0m1PUkIw27hETwzR4eJs9A= Name: res/layout/selected_recipient_list_item.xml SHA1-Digest: duqiHkirDUOdtYcYOK4BSsgiKvk= Name: res/drawable-ldrtl-hdpi-v17/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: 2gdfs4MdNrmZ5fPzRYQKwf3z8nA= Name: res/drawable-mdpi-v4/ic_video_dark.png SHA1-Digest: IWblTbgIV8kQKFhGJwVzpyd5L9o= Name: res/layout/recycler_view_fast_scroller.xml SHA1-Digest: yj2pdZt+7FUOalySQMltDj72Ruc= Name: res/drawable-xhdpi-v4/ic_archive_white_24dp.png SHA1-Digest: 9rhe+ODYJADw9F+ZIJy7XnzieYo= Name: res/drawable-xhdpi-v4/import_database.png SHA1-Digest: kT7Dxt0ieDTf8EaNh6ARZMyYdvQ= Name: res/menu/group_create.xml SHA1-Digest: zeZeiPaRvC1mx93uqTHqpR7cl38= Name: res/drawable-xhdpi-v4/ic_emoji_places_activated_dark.png SHA1-Digest: FM3dLeEaQNZQzXXRsyRTRiaVSvE= Name: res/drawable-xhdpi-v4/ic_menu_remove_holo_light.png SHA1-Digest: l5JGHVyNioatN5tnVH3EIvs4nRA= Name: res/layout/media_preview_activity.xml SHA1-Digest: faMYzcwlYnIh7K8g5B/gWS4inw4= Name: res/drawable-xxhdpi-v4/ic_emoji_recents_activated_light.png SHA1-Digest: r0bI+AnVCes3xF/lEu/EnAyGvpU= Name: res/color/abc_background_cache_hint_selector_material_light.xml SHA1-Digest: 6zQV9p9NddLltjdGn1qBYsiO04o= Name: res/drawable-v11/emoji_category_objects_dark.xml SHA1-Digest: 5oHBFdRp6A/AB1/rjl617YZmGjU= Name: assets/fonts/AndroidClockMono-Thin.ttf SHA1-Digest: nDLU3MtBsUBWd/Jq7PrvujP5/YE= Name: res/anim/abc_shrink_fade_out_from_bottom.xml SHA1-Digest: tUIF7X/jI8K8Q3PAJpeZVS4JPi8= Name: res/drawable/abc_seekbar_thumb_material.xml SHA1-Digest: R+zfNUVLkXYZ8GH32A2aK443lBQ= Name: res/drawable-mdpi-v4/ic_audio_light.png SHA1-Digest: M/LxQZgQkGn584KOjwnSsyS3TIE= Name: res/drawable-sw600dp-mdpi-v13/ic_backspace_disabled_dark.png SHA1-Digest: NzveXyIeX/Q8a9YPSBUiW3bhSmk= Name: res/drawable-xxhdpi-v4/ic_emoji_recents_activated_dark.png SHA1-Digest: jVMrr+nZhoszz6VRNSntfqS0cTU= Name: res/xml/preferences_manual_mms.xml SHA1-Digest: E2rymzAKN4LCdZRLsP2mRgX8og0= Name: res/drawable-xxhdpi-v4/ic_volume_off_grey600_18dp.png SHA1-Digest: cZCdGmEQ/C1DSNf8MpfnVFuEcSk= Name: res/drawable-xxhdpi-v4/abc_list_pressed_holo_light.9.png SHA1-Digest: I2JJHnuKjt9jtF8C76fBatEScaE= Name: res/drawable-xhdpi-v4/ic_delete_white_24dp.png SHA1-Digest: OBvkuQzFVSmxufu8IhWrya0IXaQ= Name: res/drawable/abc_cab_background_top_material.xml SHA1-Digest: gLHAZPEH/WYlWCNIPwRV1Ypbx70= Name: res/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_015.png SHA1-Digest: T5slVQklwytRhhFRjSw66UZR3vQ= Name: res/drawable-mdpi-v4/ic_attach_white_24dp.png SHA1-Digest: thQt7cIcZ0mL01x5FsL1R1A1rBo= Name: res/drawable-xhdpi-v4/dialog_full_holo_dark.9.png SHA1-Digest: Xv7q5ITHzmlsgg58AkKDmIAOIx8= Name: res/drawable-hdpi-v4/ic_lock_white_24dp.png SHA1-Digest: 0dcinbm1XmG7pxuKJQyIWyyg1Mw= Name: res/drawable-hdpi-v4/ic_volume_up_dark.png SHA1-Digest: 9Q/rSxq9vdebifqVdmXC41yK7HU= Name: res/drawable-xhdpi-v4/ic_message_gray.png SHA1-Digest: Udx+B3tG4BGz7szLTOV5UqcLSjw= Name: res/layout/outgoing_sms_preference.xml SHA1-Digest: vUmctb+/JCb+YUO7nhCrunZB9uM= Name: res/layout/number_picker_view.xml SHA1-Digest: Y/yClXAuZWNCc1yyjnZBe1NNIVg= Name: res/drawable-xhdpi-v4/ic_lock_light.png SHA1-Digest: 5Dtpi+WAU1zUT7j2ltzqejkiJzo= Name: res/layout-v17/design_layout_snackbar_include.xml SHA1-Digest: nwIcVUJMLdU2ENDUFLbne+hEx2o= Name: res/drawable-xxhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png SHA1-Digest: kjQh/adr8XS+S465gr9pzFibMnM= Name: res/color/switch_thumb_material_dark.xml SHA1-Digest: vTE9UvBWe0T4UHYQNlyBx5kaZp4= Name: res/drawable-xxhdpi-v4/ic_visibility_off_white_24dp.png SHA1-Digest: VgkSbkRBLyW/56dKPaAQLXk12rs= Name: res/drawable-mdpi-v4/ic_push_registration_reminder.png SHA1-Digest: R/89BRJe6hI+pc6YvD3EaC53Rog= Name: res/drawable-mdpi-v4/dialog_full_holo_light.9.png SHA1-Digest: cPS/8GrbED05T5hrf5U6qfxSYiQ= Name: res/layout-sw600dp-v13/design_layout_snackbar.xml SHA1-Digest: HJOl8PfLoX71EWOMZy+PDFI8yBc= Name: res/drawable/actionbar_icon.xml SHA1-Digest: 4ggDqvnA//4/gUTrCi8SAWhqAUs= Name: res/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.pn g SHA1-Digest: QfpcSdSZHMZJtyvdOvxgAoeFBBk= Name: res/layout/abc_list_menu_item_layout.xml SHA1-Digest: J8RjKYf2o/zzS700bKt+p7lC0q8= Name: res/drawable-mdpi-v4/ic_movie_creation_dark.png SHA1-Digest: 72EYKIbguQFmHPAn+pcWWulmcM4= Name: res/drawable-v21/abc_edit_text_material.xml SHA1-Digest: nDa2DDAkLij1tWInVt1evpeEAJY= Name: res/drawable-mdpi-v9/icon_notification.png SHA1-Digest: jbGkbjzccJX6xAOT664dgUrYNGo= Name: res/drawable-xxhdpi-v4/ic_refresh_white_24dp.png SHA1-Digest: nOASh5umDXH9u9l5Y3Y7r1MjKpU= Name: res/drawable/progress_background.xml SHA1-Digest: zK7FJQT3jdkLOJAs5Y7jL9uLgX0= Name: res/drawable-xxhdpi-v4/list_pressed_holo_light.9.png SHA1-Digest: I2JJHnuKjt9jtF8C76fBatEScaE= Name: res/drawable-xhdpi-v4/abc_textfield_search_activated_mtrl_alpha. 9.png SHA1-Digest: 3u3fLmehvZBhy/5ikwcph94VGWM= Name: res/drawable-mdpi-v4/textfield_disabled_focused_holo_light.9.png SHA1-Digest: DyvZuMUjf2liRGFrEuf0bX7J6Co= Name: res/drawable-xhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png SHA1-Digest: RwOTCkvoy8JfKjFQZXnNiOHbxpQ= Name: res/xml/preferences.xml SHA1-Digest: FCzeWlMFqgZgIHKHcnRE8FHhsYk= Name: res/anim/abc_slide_out_bottom.xml SHA1-Digest: GcBbKJcMWdQ42ssCQexb9kGH6us= Name: res/drawable-mdpi-v4/spinner_disabled_holo_light.9.png SHA1-Digest: hCV+UPDT8uh5rAO/BFyqYTBW/rI= Name: res/drawable/emoji_category_places_light.xml SHA1-Digest: i5LwYGeXLGbsZlLUNAlCLX6WES4= Name: res/menu/conversation_group_options.xml SHA1-Digest: Cz1LHRVTK/n/Yr9i820CGDhZdpM= Name: res/drawable-xxxhdpi-v4/abc_text_select_handle_right_mtrl_dark.p ng SHA1-Digest: TZRpCX4hkbb2R6dA0PyLbOZ1pWY= Name: res/drawable-xhdpi-v4/ic_emoji_nature_normal_dark.png SHA1-Digest: dgs2idcig8HR1aMZTR/mP1DWxg8= Name: res/drawable-ldrtl-xhdpi-v17/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: 5LeNKf2Di1jUSAKDjrtFAYF0634= Name: res/drawable-xhdpi-v4/design_ic_visibility_off.png SHA1-Digest: HGLLL59KFe3wyaLeYNev5PF0038= Name: res/menu/share.xml SHA1-Digest: nP4tL520r8S6X/uEIUuk5rCxtnk= Name: res/drawable-mdpi-v4/spinner_focused_holo_light.9.png SHA1-Digest: V9tjL1cMxuMvNGabgo8kTf8q/oQ= Name: res/drawable-mdpi-v4/ic_unarchive_white_24dp.png SHA1-Digest: GZWbFYYJlpwMTVooN+m9zrREUas= Name: res/drawable-xhdpi-v4/ic_send_white_24dp.png SHA1-Digest: GCB6MFxVku0xwGVLmqI4gkI75nM= Name: res/drawable-mdpi-v4/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: h5X7BIPdIFf8dpb/b/WA1vYdwkc= Name: res/drawable-hdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png SHA1-Digest: IwzRNkVJWfy8agwdJdTuG1InFsM= Name: res/animator/rotate_90_animation.xml SHA1-Digest: AhVLtjcJdoeXGcim/ix1HCO/gQw= Name: res/drawable-xxhdpi-v4/ic_forward_white_24dp.png SHA1-Digest: R7Bez8u9DT2s6Muw5uQAQlYJaQQ= Name: res/drawable-xxhdpi-v4/ic_notifications_black.png SHA1-Digest: 1Fk4e6G2BE2BiZXoO6Pn2b1UG4Q= Name: res/layout/message_recipient_list_item.xml SHA1-Digest: TePFz2FsUOserdUzGiKVTfzN5CA= Name: res/drawable-mdpi-v4/ic_send_push.png SHA1-Digest: ANGo0/ZMpydXfvuzx4jOs2aojRk= Name: res/drawable/abc_spinner_textfield_background_material.xml SHA1-Digest: k4PYrKN6q/ExQP5RdV8dDVaO8Js= Name: res/drawable-mdpi-v4/ic_pause_circle_fill_white_48dp.png SHA1-Digest: dnwza4w6JREr7ooIFzyvE9lJaGE= Name: res/layout/single_recipient_panel.xml SHA1-Digest: XIK0TSNn9d/BVsSHZvDmZ78IV1Q= Name: res/drawable-mdpi-v4/abc_ic_star_black_48dp.png SHA1-Digest: 4f3D3QSNCzMFGqafojrMfwWdbXM= Name: res/layout/select_dialog_multichoice_material.xml SHA1-Digest: kd5khEvhkv1mHuCX1lHN2++UPis= Name: res/drawable-xxhdpi-v4/ic_warning_light.png SHA1-Digest: ruGvzbqHAMH2FRafTgK65crjaH8= Name: META-INF/buildserverid SHA1-Digest: PFAoK3vAw7CF29BtzhTdrgabIU8= Name: res/layout-v11/notification_template_big_media.xml SHA1-Digest: +TFjHcyzZJEJr490AyyXdhaDiMk= Name: res/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_015.png SHA1-Digest: QZ9FkSY1uLrLNUoYvFP8D6yQGLQ= Name: res/drawable-mdpi-v4/ic_menu_login.png SHA1-Digest: EcClc4RJzMSNChXRIX1XlD/+bEc= Name: res/drawable-mdpi-v4/ic_forward_white_24dp.png SHA1-Digest: KDZDv/eC+vZwebB9bgUbCiHcOwQ= Name: res/drawable-mdpi-v4/abc_textfield_search_activated_mtrl_alpha.9 .png SHA1-Digest: YsHF4VJihRr1oEZ76cu42zsHjek= Name: res/drawable/conversation_item_background.xml SHA1-Digest: 3zP1JNDyPjgLfcHlwQ81OLVB0KI= Name: res/color/abc_background_cache_hint_selector_material_dark.xml SHA1-Digest: JW1Wg9XMsM+FF68MpbJdFc2Yh8U= Name: res/drawable-hdpi-v4/ic_delete_white_24dp.png SHA1-Digest: A0vA8rAkCLZNYoF5HPt9eLe8h4Q= Name: res/anim-v21/design_bottom_sheet_slide_out.xml SHA1-Digest: AGi5g5tvoZK7WNsIL0yZE9rdwnw= Name: res/layout-sw600dp-land-v13/calendar_date_picker_dialog.xml SHA1-Digest: DTEvwBiBAs8Zx8lzI8d7Yxok/cg= Name: res/layout-w270dp-h560dp-v13/calendar_date_picker_dialog.xml SHA1-Digest: 0EXb515hkEqCoPlqNWo2641c6Tc= Name: res/layout/design_navigation_item.xml SHA1-Digest: OBUxoOt71etSxXAmAB0RNSxD4Qs= Name: res/drawable-xhdpi-v4/ic_contact_picture.png SHA1-Digest: oJXz8IZJ6Y95+0ZdP1hqcL2FiPA= Name: res/drawable-xhdpi-v4/ic_push_gray.png SHA1-Digest: alLOpqE4oBaoHod/XGuYJOmQews= Name: res/drawable-hdpi-v4/ic_menu_login.png SHA1-Digest: PO+FcUw8v6AARSGgankkXFPCUEQ= Name: res/drawable-hdpi-v4/ic_emoji_flags_activated_light.png SHA1-Digest: zMws9NE3NlZRKmz8R1wjKhi9whg= Name: res/layout/notification_action_tombstone.xml SHA1-Digest: AwtVhrNIO8jY58Wb9p1zLoAnCrU= Name: res/drawable-hdpi-v4/abc_textfield_activated_mtrl_alpha.9.png SHA1-Digest: H53d9SOkoWezKsVvcOALraOdTFo= Name: res/drawable-xhdpi-v4/ic_group_photo.png SHA1-Digest: oL/kNS4eqBr8RAy9D+FzsG79WkQ= Name: res/drawable-xxhdpi-v4/fab_shadow.png SHA1-Digest: SzS1ucPl8evgFkx0dlXzK0DjLNY= Name: res/drawable-xhdpi-v4/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: co+pW0+xme4l0m6WE+SgOOn2PRc= Name: res/drawable-xhdpi-v4/ic_visibility_off_white_24dp.png SHA1-Digest: sCCf80UsuBkBgQm6R/rr8qLYLKI= Name: res/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_dark.9.pn g SHA1-Digest: vq3AaVX19jU0c0v1npZsAQOh+CI= Name: res/drawable-hdpi-v4/ic_archive_white_24dp.png SHA1-Digest: KbWim3MsiUKD8touScr3oNt4H70= Name: res/drawable-xhdpi-v4/ic_backspace_disabled_light.png SHA1-Digest: fY8wrBom1Rs7BcwNpzmN9KBBDT4= Name: res/layout/select_dialog_item_material.xml SHA1-Digest: E4PLWhmMlEqiZ2c7cb1WZw6h5xc= Name: res/layout/view_identity_activity.xml SHA1-Digest: sdfI5G2rE7lANKYrX52VPeV7uyA= Name: res/layout/design_navigation_item_subheader.xml SHA1-Digest: G/GTeUU3cMIzAHRn1M6boiTStpk= Name: res/layout-v21/notification_action_tombstone.xml SHA1-Digest: DLKxAEny9fK1E7eLn5Id4MMMYWk= Name: res/layout/share_intent_list.xml SHA1-Digest: fd3NhPVV0DCVVNLVlfNEQk+I6mU= Name: res/drawable-mdpi-v4/fab_shadow_mini.png SHA1-Digest: P10uXNSh+EnI7Pj0+KYPZJgMBA4= Name: res/drawable-hdpi-v4/icon.png SHA1-Digest: 3JRiO1Xv3zqBcWZXCMTRCD5uC64= Name: res/drawable-hdpi-v4/switch_thumb_pressed_holo_light.9.png SHA1-Digest: UW8twZMlDStRuqjFewmFD3itfrQ= Name: res/drawable-xxxhdpi-v4/ic_archive_white_36dp.png SHA1-Digest: M5idSMjFl4jMkh7Ph3QB7sogHC0= Name: res/drawable-xxhdpi-v4/ic_emoji_places_normal_dark.png SHA1-Digest: unSBHnvE/dIccJCGZxkcnq9NATs= Name: res/drawable-xxxhdpi-v4/ic_save_all_white_24dp.png SHA1-Digest: lUQYmGbtIp+HCVrKWOxWYTtqiZ4= Name: res/drawable-xxhdpi-v4/ic_delete_gray.png SHA1-Digest: A1p5mUcS5MqrAS52rhbf4X29ol4= Name: res/drawable-xhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png SHA1-Digest: Bii9JPddV76dH8va+pLHDS/1H2I= Name: res/drawable-hdpi-v4/ic_emoji_emoticons_activated_light.png SHA1-Digest: jmlTwrZJp/RWlsACB6z6XA51nTk= Name: res/drawable-mdpi-v4/abc_textfield_search_default_mtrl_alpha.9.p ng SHA1-Digest: D6dilO+UMcglambujyMOhNbLZuY= Name: res/drawable-xxhdpi-v4/ic_textsms_black_32dp.png SHA1-Digest: U/wm8M32OvVbolXxe15KdIdPx+E= Name: res/drawable-hdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: MMkP0OZqp3er4oTF2Gl+RImzkzI= Name: res/layout/group_create_activity.xml SHA1-Digest: F/Q/V0mWyJ8d7KnG/y8b0Gx+xFw= Name: res/drawable-xxhdpi-v4/ic_volume_off_white_18dp.png SHA1-Digest: dl1JwJfw24ecb/xMq4AABXXFAe0= Name: res/drawable/emoji_category_symbol_dark.xml SHA1-Digest: 851XjUQCOZEjfyEEgWCW8kAGbfE= Name: res/drawable-hdpi-v4/ic_delete_gray.png SHA1-Digest: Uiq37k4GzEgR/Ce0lqUdjCHVz5U= Name: org/spongycastle/x509/CertPathReviewerMessages.properties SHA1-Digest: OGIe7v0JVQeuizExOPQ4Cf/+RXo= Name: res/drawable-mdpi-v4/ic_emoji_people_activated_light.png SHA1-Digest: XodEEfpbmDfbGrSJnks2UgUIzJQ= Name: res/drawable-xhdpi-v4/actionbar_icon_holo_dark.png SHA1-Digest: DAQ7h+0M3pk7vKhzp4y4JzYnzqc= Name: res/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_000.png SHA1-Digest: F15Y7TDgoQ90hOj/LqmJmzvUv5I= Name: res/drawable-xhdpi-v4/ic_visibility_off_grey600_24dp.png SHA1-Digest: 6OfLCQcJqSkKVVduAE1sIGO7ud4= Name: res/drawable/abc_ic_ab_back_material.xml SHA1-Digest: BARhPfk2bP/lJe+gy67bgfoy+tI= Name: res/layout/design_navigation_menu_item.xml SHA1-Digest: Es36qkrs2ohFy3uijRP+Ur+CQl8= Name: res/drawable-v21/touch_highlight_background.xml SHA1-Digest: 6IadWpveEX8PumPwP847BweJlgg= Name: res/drawable-xxhdpi-v4/abc_text_select_handle_middle_mtrl_light. png SHA1-Digest: MwB5KqjjRjtmWFZ0l1ohdSVBfmk= Name: res/drawable-mdpi-v4/abc_list_divider_mtrl_alpha.9.png SHA1-Digest: f5w1/P3BOViOfigUbV/eR0uuTmE= Name: res/drawable-mdpi-v4/ic_reply.png SHA1-Digest: eKIvQlTj+MqJkkhH83v4XJEf2Cg= Name: res/drawable-xhdpi-v4/ic_emoji_objects_normal_light.png SHA1-Digest: mHYvK5ryHcFU0pYhXyA8BL9bxRE= Name: res/drawable-xhdpi-v4/ic_emoji_people_activated_dark.png SHA1-Digest: QNnJR4N5xGz+RltmJ6P3PkrriA8= Name: res/layout-v17/notification_template_media_custom.xml SHA1-Digest: rdASOHsCejAJ60Z7EWUQWinWYII= Name: res/animator/bottom_play_to_pause_animation.xml SHA1-Digest: 7f8HiUwoTj84cBIvXQhtx6kFMlc= Name: res/drawable-xhdpi-v4/ic_emoji_places_activated_light.png SHA1-Digest: h++4GsX2DR3yZjHveZN6Un2AmhQ= Name: res/layout/switch_compat_preference.xml SHA1-Digest: BcoiqEYKt0pTDgHI781bnYowk54= Name: res/drawable-hdpi-v4/abc_list_divider_mtrl_alpha.9.png SHA1-Digest: f5w1/P3BOViOfigUbV/eR0uuTmE= Name: res/drawable-mdpi-v4/ic_menu_barcode.png SHA1-Digest: /5GmDIrH2/6CRmnDFfrS9MmAmZQ= Name: res/drawable-xhdpi-v4/ic_audio_light.png SHA1-Digest: dFHlft4ev/OLD6O3/IxOV/VT9YM= Name: assets/backward SHA1-Digest: r/6p7b+IrWfsXOtXuSRa3XRryRU= Name: res/drawable-xhdpi-v4/ic_emoji_recents_normal_light.png SHA1-Digest: D5tvJODHVXxHRnrhM5wVnuF7PMQ= Name: res/drawable-xxhdpi-v4/ic_push_gray.png SHA1-Digest: c8b/usgphM6aewlBpulpNeXZ1KE= Name: res/layout/load_more_header.xml SHA1-Digest: sAB0PTtgkiBIW07vp3p5I8ymCfg= Name: res/drawable-xhdpi-v4/ic_missing_thumbnail_picture.png SHA1-Digest: EudZfqzfejDaDRqbpEr36SAilfQ= Name: res/layout/abc_action_menu_item_layout.xml SHA1-Digest: GVqWcYFG/JNanYa8Su924kaY0Ls= Name: res/drawable/conversation_list_item_unread_background_dark.xml SHA1-Digest: EsbJbXnqytwl+8RcQbOlwf8B+aA= Name: res/drawable-mdpi-v4/switch_bg_focused_holo_light.9.png SHA1-Digest: Zb5ZNlmnSJm17S8X88rrHismQoQ= Name: res/drawable-mdpi-v4/ic_advanced_black.png SHA1-Digest: xQTyMzRG1ABoqleiO9T2DU2xP0Y= Name: res/color/done_text_color.xml SHA1-Digest: dxC6/vV+0J6sCuda4BXCTjDxBc4= Name: res/drawable-hdpi-v4/abc_list_longpressed_holo.9.png SHA1-Digest: KQunCQh0E4bP0utgN0cHdQr9OwA= Name: res/layout/splash_screen_activity.xml SHA1-Digest: WhcxHp/AKpO+Q8ubyonRo7Nk+F0= Name: res/drawable-mdpi-v4/ic_app_protection_gray.png SHA1-Digest: l1oCP68e0zJsdRpoZiPDnEBMukA= Name: res/drawable-xxhdpi-v4/sms_selection_icon.png SHA1-Digest: 6Bxf623AFbKO/pbJNEBH5Xy6xAM= Name: res/drawable-hdpi-v4/sent_bubble.9.png SHA1-Digest: JGqPgezZhUUOMdpS7YyeaEXvFW4= Name: res/drawable-mdpi-v4/icon_dialog.png SHA1-Digest: 0tdoFlEu5jnsaJOE7xLDH96MevA= Name: res/drawable-mdpi-v4/ic_visibility_off_grey600_24dp.png SHA1-Digest: Aj01Gk5lbxDET1LAcsCb4YeErmQ= Name: res/drawable-xhdpi-v4/list_pressed_holo_light.9.png SHA1-Digest: 5rSZbdJDOTdM5kJhhIdl8m8briI= Name: res/drawable-xhdpi-v4/ic_unarchive_white_24dp.png SHA1-Digest: aBQ0fXhx8K9gwvMaHRRhQX5W9lI= Name: res/layout/timezonepickerview.xml SHA1-Digest: Dj3lhNq+C7ds1/CQyHXO1n8GvrU= Name: res/drawable-xhdpi-v4/ic_check_light_disabled.png SHA1-Digest: FX86kw3Z1JfWrWBIzFp81EFI38w= Name: res/drawable-xhdpi-v4/textfield_focused_holo_light.9.png SHA1-Digest: 9fXYckUA6bXM1wEDQ0rXYeMvIfw= Name: res/layout/color_preference_item.xml SHA1-Digest: vqvYzwEC3xr2q5l3nzPHqKleTXc= Name: res/layout/transport_selection_list_item.xml SHA1-Digest: /CADOXbj5pHVDjUwN4fw7XuRxSQ= Name: res/drawable-mdpi-v4/actionbar_icon_holo_dark.png SHA1-Digest: fXNn5dSPlex7zo8fJRc/GykpXo0= Name: res/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png SHA1-Digest: OGTAGSMNcF0Z/ZC0uBc4qemdptI= Name: res/drawable-xhdpi-v4/ic_menu_barcode.png SHA1-Digest: HEJnV9zA4JiO7drUo5P8axm6NFY= Name: res/drawable/import_export_item_background_light.xml SHA1-Digest: o7o721xldYwB6g8LEp/bYpO63n8= Name: res/drawable-xxhdpi-v4/ic_app_protection_black.png SHA1-Digest: o14xUEEPx8oZYathbadSli6ZQsI= Name: res/drawable/emoji_category_flags_light.xml SHA1-Digest: sG+4lQ00+HnzttTFyWXu9NBIhIM= Name: res/layout/abc_alert_dialog_material.xml SHA1-Digest: 0/JjElpoOkX474wjYAxVW9ldr9Q= Name: res/color/dialog_text_color_holo_dark.xml SHA1-Digest: OUiI84uJcXDDztFngu8VSJQ6LQY= Name: res/drawable-hdpi-v4/ic_visibility_grey600_24dp.png SHA1-Digest: +5MKdx1pD6i7rpUKoYjN5xCqBSY= Name: res/layout-sw600dp-v13/three_keys_view_leftright.xml SHA1-Digest: i5CqIH9cS4ef/6W5mCUC+ftHnEs= Name: res/anim/abc_popup_enter.xml SHA1-Digest: ZKpMd1TuL9jAkYWPue9RXki708E= Name: res/layout/blocked_contacts_fragment.xml SHA1-Digest: Zn/WBahw+yXO6vRYXgLbJQ3Lp4E= Name: res/drawable-mdpi-v4/abc_tab_indicator_mtrl_alpha.9.png SHA1-Digest: z0xEJNNl6qN3MKa3Uq4y93mF7Cw= Name: res/drawable-hdpi-v4/abc_ic_star_half_black_16dp.png SHA1-Digest: +fmiW7NvYuyLGVRupHZWlrAFb2o= Name: res/drawable-xxhdpi-v4/splash_open_padlock.png SHA1-Digest: 88Z9EUnY9DAqtmsw/olzjASMn08= Name: res/drawable-xxhdpi-v4/design_ic_visibility.png SHA1-Digest: zbNzwAi/FPJPX3HPChgFLOupALc= Name: assets/zone.tab SHA1-Digest: d0US6Zajzyow3w/OX7A+6NT3Oy8= Name: res/drawable-hdpi-v4/notify_panel_notification_icon_bg.png SHA1-Digest: inKyhhyZgO65645KR/OH06l6dAc= Name: res/layout-v16/conversation_list_item_view.xml SHA1-Digest: ewOd5Y16nNg3t9kHFpvyiQ/ivRo= Name: res/layout/notification_template_custom_big.xml SHA1-Digest: nZH2+ma7Ypd4nFBdIcnX7o8EGas= Name: res/layout-sw600dp-v13/calendar_date_picker_dialog.xml SHA1-Digest: 0EXb515hkEqCoPlqNWo2641c6Tc= Name: res/drawable-v11/emoji_category_nature_dark.xml SHA1-Digest: CX83I14m6Cjn4yX3nf46xs45J3o= Name: res/drawable-mdpi-v4/notification_bg_normal.9.png SHA1-Digest: ZmUYoZRjV5S78oUGJgKjRsWijjs= Name: res/layout/centered_app_title.xml SHA1-Digest: Lha/pO4JgIapzSiXkG3RPia9xJQ= Name: res/drawable-xxhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png SHA1-Digest: mXQuXT+E6ctyqZNbnaBtZKfg0ZU= Name: res/drawable-hdpi-v4/ic_info_outline_light.png SHA1-Digest: yLfG2w486Xwg1gGhemkuibPaH7g= Name: res/drawable-mdpi-v4/ic_block_white_18dp.png SHA1-Digest: lcCRmfNUadRfENG/y7V0SukFJpg= Name: res/drawable-xxhdpi-v4/ic_info_outline_grey600_24dp.png SHA1-Digest: hUsQ+oKof/B1wXzOG2wczuBlXoY= Name: res/drawable-hdpi-v4/ic_recurrence_bubble_fill.png SHA1-Digest: A/gWISXw+9VDKN9tNw4Tl2Rlup4= Name: res/color/abc_primary_text_disable_only_material_dark.xml SHA1-Digest: fztyDM09XiKUbzo6Y6O2r9Xqs6k= Name: res/drawable/info_round.xml SHA1-Digest: UZ/381JABO8YY/CyQ+EQwB67nZs= Name: res/drawable-v21/avd_hide_password.xml SHA1-Digest: 3QtcdW2ge+OCJqEkWDqgxvWUHhI= Name: res/drawable-hdpi-v4/ic_launch_white_24dp.png SHA1-Digest: 5UIDgrlIZSwC+oevXwNDr7Mf37g= Name: res/drawable-mdpi-v4/ic_unarchive_white_36dp.png SHA1-Digest: i0NdcFQ/sn3N2wNU4pRTsoj9Hqs= Name: res/drawable-xxxhdpi-v4/fab_shadow.png SHA1-Digest: wbG2dpL50mv2M+7ytx2Z9btKlcg= Name: res/anim/slide_from_top.xml SHA1-Digest: NRMSsU5qemKGLU44qx35gMLtOZg= Name: res/drawable-mdpi-v4/ic_warning_dark.png SHA1-Digest: imXjuG9SUFEzM5Ky7Iz6004sLK0= Name: res/drawable-hdpi-v4/ic_content_copy_light.png SHA1-Digest: fk6cDF9XDO/tPVoXH7Au9mra318= Name: res/drawable-hdpi-v4/received_bubble.9.png SHA1-Digest: l1DcWbaW/Gm1hFu3pEriKWh+Z2g= Name: res/layout/keyboard_right_drawable.xml SHA1-Digest: WUmUZMy5YUW6uStd30yKBHU48lI= Name: res/drawable-hdpi-v4/abc_list_pressed_holo_dark.9.png SHA1-Digest: igV6Z9qyPsoUBNkEZPzj+DDt0kE= Name: res/drawable-xhdpi-v4/ic_lock_white_24dp.png SHA1-Digest: TJpUHsE2NBGPP9IuYWNr4vSPCI0= Name: res/drawable-xhdpi-v4/ic_reply_white_36dp.png SHA1-Digest: nmRdqTp2g/pdSXEHGdcZgtemSvg= Name: res/color-v11/abc_tint_default.xml SHA1-Digest: 1hpqbE55rVWDemrdHwXlQDB32zA= Name: res/xml/preferences_sms_mms.xml SHA1-Digest: JE6Lkr6vRU/ZICk6TH00Bmq7oQw= Name: res/drawable-xhdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png SHA1-Digest: tdbpGRMh8KHxMYAIK8x8FwOqXzM= Name: res/drawable-mdpi-v4/ic_emoji_places_normal_dark.png SHA1-Digest: uZ5dEURRi9chSSqRsAIvTm7dsvo= Name: res/drawable-xxhdpi-v4/ic_emoji_emoticons_normal_light.png SHA1-Digest: 76IJVDUWfrmZO8Tgc/4U7gYqgec= Name: res/drawable-hdpi-v4/import_database.png SHA1-Digest: UcPkcSNbC1STw6zeBomTq2Dwymc= Name: res/drawable-sw600dp-xhdpi-v13/ic_backspace_disabled_dark.png SHA1-Digest: kMBzMnDevZ0XLt1+5ae3cmCuN78= Name: res/drawable-xhdpi-v4/ic_emoji_objects_normal_dark.png SHA1-Digest: 6p2Zi3wq60U2o77Ut0VYOXS4tG4= Name: res/drawable-xhdpi-v4/ic_app_protection_gray.png SHA1-Digest: Dwj18TzfpDuVCp+Vs4gvwRqFiVc= Name: res/drawable-hdpi-v4/ic_action_warning_red.png SHA1-Digest: XOfrmlnFJIZFJRa3Nnl3j/T+uyo= Name: res/drawable-hdpi-v4/ic_info_outline_dark.png SHA1-Digest: 19ADfI6tdEL9JS+w9C3ODAtiQnc= Name: res/drawable-hdpi-v4/ic_account_box_light.png SHA1-Digest: U6N4kCu8QpPN3kdynkIG05UqFaM= Name: res/drawable-hdpi-v4/ic_notifications_black.png SHA1-Digest: 5obbL5gsVnHoftrtjUskEiQvqeA= Name: res/drawable-xxxhdpi-v11/icon_cached.png SHA1-Digest: sHpchMgX/CLVvvi8pYX0k2GJg90= Name: res/drawable-mdpi-v4/fab_shadow.png SHA1-Digest: udoU/cJmx1Xc951df0+aQCglRXc= Name: res/drawable-xxhdpi-v4/switch_thumb_disabled_holo_light.9.png SHA1-Digest: knt1e74vSbTtmi79u+13KXh3GPA= Name: res/drawable-hdpi-v4/alert.png SHA1-Digest: CsIZIT9nICR7yOVCgD/4N8RrL6Y= Name: res/drawable-hdpi-v4/ic_emoji_places_normal_light.png SHA1-Digest: Tjx0H33peYsF2Wqw77RtgtiKG40= Name: res/drawable-hdpi-v4/ic_reply_white_36dp.png SHA1-Digest: wkw+giaxX7aLi+E45Cu0fEnc5fQ= Name: res/drawable-xhdpi-v4/spinner_focused_holo_light.9.png SHA1-Digest: GULvT2ExbYbkv75q+kEpZUH9u2M= Name: res/drawable-xhdpi-v4/ic_create_white_24dp.png SHA1-Digest: YErWmfqMB9JsmsehTToG6eMaslM= Name: res/drawable/conversation_list_item_read_background.xml SHA1-Digest: 29/kx1aQosM0bao66+TnKaMQG4o= Name: res/xml/preferences_appearance.xml SHA1-Digest: nsZ3qRLFSqqkrR3E0p7Lr8zoqqM= Name: res/drawable-xxhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png SHA1-Digest: AEtucgE23w85/isDYqNTWlxruFg= Name: res/anim/abc_slide_out_top.xml SHA1-Digest: 8TSJifDdlA1J4leugOVG9Peg+k4= Name: res/drawable-mdpi-v4/spinner_default_holo_light.9.png SHA1-Digest: nxjthQ61TKMyJJ5/85W2SC6qs+M= Name: res/color-v23/abc_tint_switch_thumb.xml SHA1-Digest: AYqXR24Imt/KEDO9CrmMOPStaIc= Name: res/drawable-xxhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png SHA1-Digest: Yq5HoWLW1F/u1kVDMfrxjLA2Z9Q= Name: res/color-v23/abc_tint_spinner.xml SHA1-Digest: BBcfe9ziniPVPStDrP3v4C+knKk= Name: res/drawable/design_bottom_navigation_item_background.xml SHA1-Digest: CWW4mfISMH+Ot1PsBcU5OOmhiCU= Name: res/layout-v11/notification_template_big_media_custom.xml SHA1-Digest: 6K8wc7cnTvNaDsSKT7OY8MSGQI8= Name: res/drawable-v21/conversation_list_item_read_background.xml SHA1-Digest: CcD3lybuOgRWRC9JfV7U+/9POCc= Name: res/drawable-mdpi-v4/ic_delete_black.png SHA1-Digest: TYWWTcngvQ+noNg5VY2/mObifLE= Name: res/layout/conversation_list_fragment.xml SHA1-Digest: 3l/kgDKbrMCrbne+eAbLMwR4KlQ= Name: res/drawable-xhdpi-v4/ic_notifications_black.png SHA1-Digest: /SY0QU8mINEjkvYVAlsPZ4ZzPVs= Name: res/raw/whisper.store SHA1-Digest: hLdMCWiNl4nJacL59TYQ8lK+JUs= Name: res/drawable-hdpi-v4/ic_emoji_recents_activated_dark.png SHA1-Digest: Yk8oAfmNOUCBzGorthoUhHeImk4= Name: res/anim/fade_scale_out.xml SHA1-Digest: lhxvAKLBK4FCXkyEAaT5FHhx6Eg= Name: res/drawable-xxhdpi-v4/ic_video_light.png SHA1-Digest: rXa1DG9CfPTUoWc9l10WRyKbjZA= Name: res/drawable-hdpi-v4/ic_reply.png SHA1-Digest: aS2epjYciCOwQeQwokaHqSA0Kkk= Name: res/drawable-xhdpi-v4/ic_image_light.png SHA1-Digest: Lu0PosNPxOVGN+KYCd9o6C8JBDE= Name: res/drawable-xxhdpi-v4/abc_textfield_default_mtrl_alpha.9.png SHA1-Digest: p9584WImSwr0082/N/zkcvVq7yo= Name: res/drawable/conversation_item_header_background_dark.xml SHA1-Digest: wfTAaLO+JvtusD4leaJ4hBj59Wg= Name: res/drawable/emoji_category_recent_dark.xml SHA1-Digest: S0AnVp/pVgSOiX3IhSGDso30eUg= Name: res/drawable-ldrtl-xhdpi-v17/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: xzR4QYhDLijnhAqvCWT+8WMmqNQ= Name: res/drawable-xxhdpi-v4/ic_emoji_symbols_normal_light.png SHA1-Digest: Ap996kL1vRTFcK4uAPr/M6yhL1Y= Name: res/drawable-mdpi-v4/ic_forum_black_32dp.png SHA1-Digest: 2VihTgtkrcGRaPjMvAtOMPloPs8= Name: res/drawable-xxhdpi-v4/ic_lock_white_24dp.png SHA1-Digest: 3pS9rdIUkQKp5S30wMJ3YxeXMK8= Name: res/drawable-mdpi-v4/ic_textsms_black_32dp.png SHA1-Digest: 4FVbrPZlHa+YXKQHs3sbv+9p4sY= Name: res/drawable-hdpi-v4/ic_contact_picture.png SHA1-Digest: IwJgFsT9XfMJXcvoeXXuGl9CJVA= Name: res/drawable-hdpi-v4/ic_push_registration_reminder.png SHA1-Digest: o5uLzQ3Wi/5qGCLAszhvBS9UPVs= Name: res/drawable-mdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png SHA1-Digest: 7HpkfQXcTxrewbqOQTtoDixKAiE= Name: res/drawable-xxhdpi-v4/spinner_pressed_holo_light.9.png SHA1-Digest: tkF8+78AlJ7clz2yc6mvf/TVJfQ= Name: res/drawable/design_password_eye.xml SHA1-Digest: C+kKIgD0x3Pqpcr7269QZUkuaEQ= Name: res/drawable-xxxhdpi-v4/ic_clear_white_24dp.png SHA1-Digest: JpERTN3Wave8LS2gQZdD90HYHmA= Name: res/menu/media_preview.xml SHA1-Digest: BeeyU6JLag0xKxUdir2wHZygYOM= Name: res/drawable-mdpi-v4/switch_thumb_pressed_holo_light.9.png SHA1-Digest: MvirMfKCPj8aRdrk/qCwNQly7iQ= Name: res/drawable-mdpi-v4/ic_emoji_emoticons_activated_light.png SHA1-Digest: fI8cELlPlmEyJ3q/LmWYESynNn0= Name: res/drawable-xxhdpi-v4/ic_scroll_down.png SHA1-Digest: 2pNphPFslQVi4EypJwZlUbnSc1w= Name: res/drawable-hdpi-v4/ic_group_white_24dp.png SHA1-Digest: APgBld24JEB5OrspdN2DrUDntTQ= Name: res/drawable-hdpi-v4/abc_list_pressed_holo_light.9.png SHA1-Digest: 8fFdZoyOA0FyEP0K/a0QnLk0bbE= Name: res/layout-v21/message_details_header.xml SHA1-Digest: YO8xAg/qe0msCZ8FJl74U3Y+yMk= Name: res/drawable/abc_ratingbar_small_material.xml SHA1-Digest: gaRS2sbjCfcJo3xOrkhIdr9XwZg= Name: res/drawable-mdpi-v4/abc_text_select_handle_middle_mtrl_light.pn g SHA1-Digest: EAjKJ0Rc7Iao0PObDMnje62giVA= Name: res/drawable-xxhdpi-v4/abc_text_select_handle_right_mtrl_light.p ng SHA1-Digest: SRzXekbq93VNBlcB9Jps0im8dQs= Name: res/drawable-xxhdpi-v11/icon_notification.png SHA1-Digest: NCFI5Mn5oUMHXPpvT/+2fHeApgE= Name: res/drawable-mdpi-v4/ic_menu_remove_holo_light.png SHA1-Digest: nKigmEPh2ytFH29tSmzdel83ejA= Name: res/layout/abc_activity_chooser_view_list_item.xml SHA1-Digest: W0JUnTKi0F5FyHdiy48rrT0PvHA= Name: res/drawable-xxxhdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png SHA1-Digest: in/uM6gaoddhlniDyLN3qnCoO90= Name: res/drawable-xhdpi-v4/abc_textfield_search_default_mtrl_alpha.9. png SHA1-Digest: s9/qxuNt34tuDKZEbu3WbQxLGWs= Name: res/color/text_color_dark_theme.xml SHA1-Digest: xtQOr/sxxRTItllz5dWSIu9GbqA= Name: res/drawable-xhdpi-v4/ic_emoji_symbols_normal_light.png SHA1-Digest: 4Bp9wp3TULFiZtRxucglP1XqE5c= Name: res/drawable-mdpi-v4/ic_badge_24dp.png SHA1-Digest: s2Qq8SnVVSxEmxkyiOdFOMdRf2w= Name: res/drawable-xxhdpi-v4/ic_delete_black.png SHA1-Digest: D9qcTOg7POaY2NfJUD96EghjQr8= Name: res/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_000.png SHA1-Digest: u8lEY+2Bl006RY/NojCiasl0Huw= Name: res/drawable-xxhdpi-v4/ic_reply_white_36dp.png SHA1-Digest: Et1pDHvXSBblxuF1HtzUgxVHrS8= Name: res/drawable-xxxhdpi-v4/ic_circle_fill_white_48dp.png SHA1-Digest: U56E2atwabxebtuVEkDueTNjFiE= Name: res/drawable-xhdpi-v4/dialog_full_holo_light.9.png SHA1-Digest: glc2B1J33SBfEnymVLanXh/77ko= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_972 SHA1-Digest: Tl50phuH8I0GxBh/Drf9vHens0Q= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_971 SHA1-Digest: US/xxHef76UTD882Ez5EnNvcaws= Name: res/drawable-v21/design_bottom_navigation_item_background.xml SHA1-Digest: KvnwLqUMXEglxgfoi5W0JShH0ks= Name: res/layout-v16/audio_view.xml SHA1-Digest: njJJ1HHW5uJdG/n0LTZHePpOQS0= Name: res/drawable/conversation_list_divider_shape_dark.xml SHA1-Digest: 9iXwhZT5/M0X6Yhcmm4h+YjTnLs= Name: res/layout-v22/abc_alert_dialog_button_bar_material.xml SHA1-Digest: ifIi2EmqhnYhwUyaZKxE7+oG+a8= Name: res/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png SHA1-Digest: YO4TlWAjr+5kRYUxAOUp6QEa7gg= Name: res/layout/push_recipients_panel.xml SHA1-Digest: EzGjF1IPF7U6lur8BBhcBJU9gfA= Name: res/layout/blocked_contact_list_item.xml SHA1-Digest: lqVgNxm8BmYDMiL5ZlGDMl1H4WM= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_595 SHA1-Digest: Rdp/JhmBpcj6Pr5wipf91JAKESY= Name: res/drawable/emoji_category_symbol_light.xml SHA1-Digest: Ju9NiYprgQLlxTm5XBhkYezLm/g= Name: res/drawable-hdpi-v4/ic_emoji_emoticons_normal_dark.png SHA1-Digest: r8Ri5hv5SAmtXNCrj1CYsb0/zJM= Name: res/drawable-xxhdpi-v4/abc_list_pressed_holo_dark.9.png SHA1-Digest: VPmKAqmLJ6ke7a8XellbYKiIBh8= Name: res/drawable-xhdpi-v4/ic_emoji_nature_activated_light.png SHA1-Digest: sKVcvD9Wh8iWkzK9kzNai9xOAnw= Name: res/drawable-xhdpi-v4/icon_cached.png SHA1-Digest: G7TNBOQsnyDH/X5A0H7KlD7+X84= Name: res/drawable-hdpi-v4/switch_bg_disabled_holo_light.9.png SHA1-Digest: Evi73cVw1F7NXXrV76QvRIFOeFA= Name: res/drawable-mdpi-v4/ic_emoji_nature_normal_dark.png SHA1-Digest: Sl1nqozZKUy0xSe37ZInTPLypIo= Name: res/drawable/ic_backspace_light.xml SHA1-Digest: ArAaZ6HHiiuf0ps1yq9gj8Okqvg= Name: res/drawable-xhdpi-v4/ic_forum_black_32dp.png SHA1-Digest: SmJttX2gOPzZ3n7t+N5MtOr3pMU= Name: res/drawable-hdpi-v4/ic_emoji_places_activated_light.png SHA1-Digest: ayvZGbMCE9vA/RrSp056ftDDN88= Name: res/drawable-hdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png SHA1-Digest: fOZLRa6EGLts4vAJ9jZTI2UOyZ0= Name: res/drawable/rounded_rectangle.xml SHA1-Digest: OjIEQM0LIvEj7gE45R6ehI0mFJ8= Name: res/drawable-xhdpi-v4/ic_lock_white_18dp.png SHA1-Digest: yPHmivjr7+10Uc69s0UTzHHdczs= Name: res/drawable-hdpi-v4/lockscreen_watermark_light.png SHA1-Digest: kZukE3axdMWdS8KMYqwFzRR9cf4= Name: res/drawable-hdpi-v4/ic_lock_light.png SHA1-Digest: yr0Gtpwz3cFbLVAd0HaJokYcN8w= Name: res/layout/conversation_activity_attachment_editor_stub.xml SHA1-Digest: abwLqp13I+gFzfpj6+uenDioU0A= Name: res/drawable-xhdpi-v4/ic_forum_grey_32dp.png SHA1-Digest: 5tHLlYfg6OF+oA1ZeZ0y94dizG8= Name: res/layout/color_fragment.xml SHA1-Digest: mxjiLCZfoiy62pssAJkMzJ1cSSs= Name: res/drawable/widget_unread_count_background.xml SHA1-Digest: /4n7PCi4asBAtgNk/kz6nukmZ04= Name: res/drawable-xxxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png SHA1-Digest: 3kAOCvPKDybNG1/Fr21Y+cg522o= Name: res/drawable-v21/circle_touch_highlight_background.xml SHA1-Digest: RCp6OOrQn1/KjE6jGOF2niZjcBY= Name: res/layout-v21/recipient_preference_activity.xml SHA1-Digest: WOfr0gullD80mtt/Fc79KMZbteQ= Name: res/drawable-mdpi-v19/switch_thumb_pressed_holo_light.9.png SHA1-Digest: UGB8G0Ku26t0HqFX7D5HJk45fq0= Name: res/drawable-xxhdpi-v4/ic_video_dark.png SHA1-Digest: Fg668StlRQ043EOocA2qQhycAsc= Name: res/drawable-xxxhdpi-v4/icon.png SHA1-Digest: o5/gjAEwK5uCNV8+mM/jhtLwPP0= Name: res/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005 .png SHA1-Digest: TdzAFNg4ycPCAcJ8yYIT8wvN194= Name: res/drawable-ldrtl-hdpi-v17/ic_send_white_24dp.png SHA1-Digest: wdHEaIW5RR6TSdUi7MzjLO+dLlo= Name: res/drawable-xxxhdpi-v4/ic_archive_white_48dp.png SHA1-Digest: /rdVh0e9MrmxrFT2l+kvrf7Oggk= Name: res/drawable/emoji_category_objects_dark.xml SHA1-Digest: Y6B+kuodwXhJDYZQpE1FkS9LxIw= Name: res/drawable-xxhdpi-v4/fab_shadow_mini.png SHA1-Digest: JuuXLwnTGlBkJag042XseCTGUSQ= Name: res/layout/conversation_item_received_audio.xml SHA1-Digest: sVV0Ye74Ir/9JHHGuQQ2rJBdcAg= Name: res/drawable-mdpi-v4/sent_bubble.9.png SHA1-Digest: 1sjPXZyhkKG475gQNSuvAeTaun4= Name: res/drawable-xxhdpi-v4/ic_attach_white_24dp.png SHA1-Digest: ZvVKksE6mfF73WzczOAzcllfguw= Name: res/drawable/compose_background.xml SHA1-Digest: zAZp74C8XCW9PDL4CsRYvvQmq9c= Name: res/layout/date_picker_view.xml SHA1-Digest: kZyt8l2Ojc7TCWDbo5idrz4PSzk= Name: res/drawable-mdpi-v4/ic_content_copy_dark.png SHA1-Digest: uj1qp2YktZnz25DDjfAxQAbU04U= Name: res/drawable-mdpi-v4/ic_emoji_recents_normal_dark.png SHA1-Digest: DJe+I+bmT3wwxrAjpBSgs6u1NVk= Name: res/drawable-mdpi-v4/dialog_full_holo_dark.9.png SHA1-Digest: f6ia9cfObNSnjO92EThmcdso0Qg= Name: res/drawable-mdpi-v4/abc_ic_star_half_black_36dp.png SHA1-Digest: KFgfLmmiYai76gReK6O3CrVx8ns= Name: res/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_015.png SHA1-Digest: tpEM52vWcakmOwaErjJ4ZPrPYyg= Name: res/drawable-mdpi-v4/divet_lower_right_dark.png SHA1-Digest: WIoUPZdYM6t3CwssccpkwtWG3fI= Name: res/drawable-xxhdpi-v4/ic_image_light.png SHA1-Digest: edv/Y1KdCwrrt1Z54bVHCWtcKyc= Name: res/menu/contact_selection.xml SHA1-Digest: POaHN1ChfLneiqRwV1PnCum0mVs= Name: res/drawable-xhdpi-v4/ic_menu_search_holo_dark.png SHA1-Digest: FtrLmstk5hLDWAxdslzlf3AHtY8= Name: res/drawable-hdpi-v4/dialog_full_holo_dark.9.png SHA1-Digest: 6D+naJ/vT+snQDqAQOf8FDr7pCM= Name: res/color/abc_tint_switch_thumb.xml SHA1-Digest: v8XhH2hUxG24k0yvjO3FaMwufGk= Name: res/drawable-hdpi-v4/ic_backspace_disabled_light.png SHA1-Digest: nnubVwr7Sy/Q0WLycs3D4sO5LGE= Name: res/drawable-xxhdpi-v4/ic_reply.png SHA1-Digest: QaSH4wLqEhMDOSvU8Sg3e6uFNVY= Name: res/drawable-hdpi-v4/ic_message_white.png SHA1-Digest: MkdV8JUVcPsxsccNYv0v5s95uvE= Name: res/drawable-xxhdpi-v4/ic_send_insecure_white_24dp.png SHA1-Digest: 7B6dnoYSRH6lkxfWGOJo95HKRo0= Name: res/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.pn g SHA1-Digest: p9AZr65Fs0yg5A5RKqfJElcikR8= Name: res/layout-v17/abc_popup_menu_header_item_layout.xml SHA1-Digest: 4bETilyMf1f471rW0prWDl+hKLE= Name: res/layout-v17/notification_action.xml SHA1-Digest: 8ZRmxwDdiPexmskS8rI24tCoRvE= Name: res/drawable/background_pane.9.png SHA1-Digest: uRUD8GBrgiNG4l5dimWEZT7nc20= Name: res/layout-v16/conversation_item_received.xml SHA1-Digest: GK5H2YaM+chtPJOP1mZ3to7TgsU= Name: res/drawable-xhdpi-v4/ic_arrow_forward_light.png SHA1-Digest: q9x2E1eADGdmpgXLDmjo0qb6Bzk= Name: res/drawable/emoji_category_people_light.xml SHA1-Digest: JWHxgdaJ5JIkkd00fQZEJAuJ8KY= Name: res/layout/notification_template_media_custom.xml SHA1-Digest: oNH5XYRZJWEkM0v/OygHz8hJfIg= Name: res/drawable-xhdpi-v4/ic_forward_white_24dp.png SHA1-Digest: xdw1k9Z4ZZfFwqQXdPErH1TZvXU= Name: res/drawable-xxhdpi-v4/ic_error_red_18dp.png SHA1-Digest: +2M7xp+/T/hKg+NkVPdbZ0DyTqU= Name: res/drawable-xhdpi-v4/ic_message_black.png SHA1-Digest: uKaKfpxeOu4b8ZJ5Qtd7MB6+zUA= Name: res/drawable-xxhdpi-v4/ic_keyboard_white_24dp.png SHA1-Digest: b+mYcSoWD7nfLADe99gyCWpwKis= Name: res/drawable/emoji_category_recent_light.xml SHA1-Digest: Ou8VeFgJTkCmSB3Aw6SoPPZapVY= Name: res/drawable-xxhdpi-v4/ic_app_protection_gray.png SHA1-Digest: eIck3aADlr+yZAQftO893QqUP84= Name: res/anim-v21/design_bottom_sheet_slide_in.xml SHA1-Digest: /sfmaMejemtjucshId3pph9anUM= Name: res/drawable-xhdpi-v4/list_selected_holo_light.9.png SHA1-Digest: H2X9BKxBdFAOYEppP+vczoJ/LCU= Name: res/drawable-xhdpi-v4/ic_send_insecure_white_24dp.png SHA1-Digest: BKk82nammTaZyWZU4Zot4YHuTcs= Name: res/drawable-hdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png SHA1-Digest: kv8Z2aiviTOXDoPOY4/vyUE5lng= Name: res/drawable-xhdpi-v4/notification_bg_normal_pressed.9.png SHA1-Digest: XRK+0qTSsEHgbRKmsFa87e2SI/4= Name: res/drawable-xxxhdpi-v4/ic_scroll_down.png SHA1-Digest: bhMqEDS1tdSsjY7xeFk7dQKKg9U= Name: res/drawable-xxxhdpi-v4/abc_text_select_handle_left_mtrl_light.p ng SHA1-Digest: TQlbr5inRLGdVAzp0VH/BNJZyNo= Name: res/drawable-mdpi-v4/ic_app_protection_black.png SHA1-Digest: Vmif57DOxJYBXpueUYz/Dy2QiwY= Name: res/drawable-xxhdpi-v4/ic_content_copy_light.png SHA1-Digest: /03qSwRDQLrgFxWcRhejRF0k1fU= Name: res/drawable-xxhdpi-v4/ic_error_white_18dp.png SHA1-Digest: zLCyWgp+se7ARtP1rpa9t4vXC6k= Name: res/layout/abc_screen_toolbar.xml SHA1-Digest: LjpbeMlhRLwfimRRepF3E1Wd3iM= Name: res/drawable-xxhdpi-v4/abc_ic_star_half_black_48dp.png SHA1-Digest: QnhqhmaaBESNVdVhbQn1hIhZFYA= Name: res/layout/database_upgrade_activity.xml SHA1-Digest: 8ToclyWzXUYSqPU6SHA3neEmVgI= Name: res/drawable-v11/emoji_category_symbol_dark.xml SHA1-Digest: Bsh6VYChXsMvueGZpvzRmBkyrq8= Name: res/drawable-mdpi-v4/ic_download_circle_fill_white_48dp.png SHA1-Digest: 9/qDSW2eRP9jfOP/Z0iKMg+C39g= Name: res/drawable-xxxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: OqSIVlkrKIYR7cyOW2HdJP/h5io= Name: res/drawable-xhdpi-v4/ic_select_all_white_24dp.png SHA1-Digest: ad6/USV2mN6REVsn/edWPnEIH64= Name: res/drawable-xhdpi-v4/switch_bg_disabled_holo_light.9.png SHA1-Digest: lihXWFZsEX3Y2VZnZQ8xgJ4HqYc= Name: res/layout/transfer_controls_view.xml SHA1-Digest: kUkmavCCLbl+w7XsCCRzVqtjybQ= Name: res/drawable-mdpi-v4/sms_system_import_icon.png SHA1-Digest: l5z4MnNJTB2P8G2sJd2dJ/GakvY= Name: res/drawable-xhdpi-v4/icon.png SHA1-Digest: QhfVY7UBQilNAfrHJXWil0t74RI= Name: res/drawable-xxhdpi-v4/abc_text_select_handle_left_mtrl_light.pn g SHA1-Digest: ivQtj+4di/y5dhzH685N6IbzXYE= Name: res/anim/slide_from_right.xml SHA1-Digest: R/EvCIayWDXTgntzi87/TffROjA= Name: res/drawable-mdpi-v4/ic_emoji_places_normal_light.png SHA1-Digest: MarlqNR+06iKTB/2P128Kbrw4L4= Name: res/drawable-xxhdpi-v4/switch_thumb_pressed_holo_light.9.png SHA1-Digest: rdXvsbLrMDJEfRgxFdrCnH6Oj6A= Name: res/layout/design_layout_snackbar.xml SHA1-Digest: Qm0yXxP750AN9Zs3M+gCLmrfBWk= Name: res/drawable-mdpi-v4/textfield_default_holo_light.9.png SHA1-Digest: UnLnYU6MD2MOR62lCItQOD29xjE= Name: res/drawable-hdpi-v4/ic_menu_add_field_holo_light.png SHA1-Digest: /GOsJbP0W9Qv2JEkpnr3LP2Lsr0= Name: res/layout-v17/export_fragment.xml SHA1-Digest: qYX7mhpFkMcMxFoqI373UpjRDTY= Name: res/drawable-xxhdpi-v4/ic_unlocked_white_24dp.png SHA1-Digest: WXDbx5f4KO73GnbhLd1QjgZXBoA= Name: res/layout/reminder_header.xml SHA1-Digest: sXqJA2ZQKdHSur+fn8XUDpanODA= Name: res/drawable-mdpi-v4/ic_emoji_people_normal_light.png SHA1-Digest: NFERmN1aL/T2081V6Bhvcp/GNno= Name: res/drawable-xxhdpi-v4/ic_send_push.png SHA1-Digest: uyrpO+blmlxacSsDRtn8/QX++G0= Name: res/drawable-xxhdpi-v4/ic_image_dark.png SHA1-Digest: NUtzuGCNGCNK8WMP9hjCr5MVsBw= Name: res/drawable-xhdpi-v4/ic_done_white_18dp.png SHA1-Digest: 4vMrikq9aYsg1DjcpDsaiNrYP50= Name: res/drawable-xxhdpi-v4/list_longpressed_holo_light.9.png SHA1-Digest: I+5+I8Glvy2IsIw0hQ/hFirU8cE= Name: res/drawable-hdpi-v4/notification_bg_low_normal.9.png SHA1-Digest: kk7ZIosN3+pslvIcX8e6jJgtitw= Name: res/drawable-xhdpi-v4/ic_download_circle_fill_white_48dp.png SHA1-Digest: RIvuVHlDozhalhYGjVDd5DOtFGk= Name: res/drawable-xxhdpi-v4/ic_send_sms_secure.png SHA1-Digest: x1sdT9HIlRjIOfhHiIBrV2ijbLQ= Name: res/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_015.png SHA1-Digest: W6K3P94iAz0CiSFCp6GiJlxogqs= Name: res/drawable/abc_list_selector_background_transition_holo_light. xml SHA1-Digest: AdlBQF7mCKx3VlJQ4HaRjQeNXyo= Name: res/layout/recurrencepicker_freq_item.xml SHA1-Digest: P7PQYxGG9LY7vr1fAs/e5NanpgM= Name: res/drawable-xhdpi-v4/ic_arrow_forward_dark.png SHA1-Digest: QhnF5j0tTP2JZzbe3Yy2IDBpLKw= Name: res/drawable-xhdpi-v4/notification_bg_low_normal.9.png SHA1-Digest: 0ugTUuZHAnkDPHn8gE19ZKsgmZw= Name: res/drawable-mdpi-v4/abc_text_select_handle_left_mtrl_dark.png SHA1-Digest: ZmbQ2i0OTo0eavn7LnXVqs7Kbl0= Name: res/drawable-hdpi-v4/ic_content_copy_dark.png SHA1-Digest: Lm6gLN2ljsitsRROc7Ux+A4FXiU= Name: res/layout-v17/notification_template_big_media_narrow.xml SHA1-Digest: Jr3BP0TMtCz20tWWd1csBv2DWXw= Name: res/drawable-mdpi-v4/ic_volume_up_dark.png SHA1-Digest: Ky6UbWwiL7NHQoImRhrIq1TsNng= Name: res/drawable-mdpi-v4/ic_volume_off_white_18dp.png SHA1-Digest: 2tno0ARsgceSjzJjWPa2teDkmCw= Name: res/drawable-xhdpi-v4/ic_audio_dark.png SHA1-Digest: pvZ/oBqSVFnUnQsvwfQhgsk1KpY= Name: res/drawable-hdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png SHA1-Digest: 9I5uBrEaa3rXA0AACtIBgaW++Q4= Name: res/color/abc_primary_text_material_dark.xml SHA1-Digest: Zzpm2HGH6H5LoI27zVpNdjRi+qI= Name: res/layout/notification_template_media.xml SHA1-Digest: vZ3txGgpJJnhLxb+zSvtWDjuaas= Name: res/drawable-xhdpi-v4/list_focused_holo.9.png SHA1-Digest: Kw0Qo9eKlw06/oxLHYSWR6VftBw= Name: res/drawable-hdpi-v4/list_selector_background_selected.9.png SHA1-Digest: otna3L08LP49gXxuQvuRvsKnTT4= Name: res/drawable-xhdpi-v4/ic_emoji_places_normal_dark.png SHA1-Digest: N9KlLkDYf8JVppzfm/IbuAbzWIw= Name: res/drawable-hdpi-v4/ic_call_split_white_24dp.png SHA1-Digest: p7+qYquJusVV+/JHiMfkFBB2uZ4= Name: res/drawable-xxhdpi-v4/transfer_controls_background.9.png SHA1-Digest: YwBh/LyZpJuphfkJ+yVu50osyR8= Name: res/layout-v13/select_dialog_singlechoice_material.xml SHA1-Digest: DFY+69ktUBOWthKRwMCsCRPDpG4= Name: res/layout-v17/notification_template_custom_big.xml SHA1-Digest: gs8LQ39s5+1YXyvWg3XT+3ocV+Y= Name: res/drawable-hdpi-v4/abc_text_select_handle_middle_mtrl_light.pn g SHA1-Digest: 0CPerofud1XH0R30L0HWs3Eevyk= Name: res/drawable/conversation_item_sent_indicator_text_shape_dark.xm l SHA1-Digest: JovCfRQ/2H0EkjnIp1jWoRlqvbo= Name: res/drawable-xxhdpi-v4/abc_ic_star_half_black_36dp.png SHA1-Digest: L+/mwEcCSClPjbtRIz+isSJt7Zc= Name: res/color/abc_tint_switch_track.xml SHA1-Digest: 2+T5h4qZT3tgSEpBE5EDOFVT4QE= Name: res/drawable-xxxhdpi-v4/ic_send_insecure_white_24dp.png SHA1-Digest: 5mN8PxdM1CEhGcDgRLhjvN4aenA= Name: res/drawable-mdpi-v4/telephone.png SHA1-Digest: 9FGPw0WAKpSSaTd0HEd05vpiQt8= Name: res/drawable-mdpi-v4/ic_save_all_white_24dp.png SHA1-Digest: 5gQT69RlzWI04CFd1FnTJZmwDJM= Name: res/layout-v21/notification_action.xml SHA1-Digest: PEhf48jOXBA5qkj5jCO+sKO3Xk8= Name: res/drawable/navigation_empty_icon.xml SHA1-Digest: dGWI+PA1xIe4F96rHxKHFJxaka4= Name: res/drawable-xhdpi-v4/ic_emoji_recents_activated_dark.png SHA1-Digest: K/zgXHsDeAiskqa9a/PUoAb2AvE= Name: res/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png SHA1-Digest: NRcHxLdsX/Th2xTrioD1KYFYeK8= Name: res/drawable-xxhdpi-v4/sent_bubble.9.png SHA1-Digest: JlBo2LcLmyvycEGbrbpgPJ1rbv8= Name: res/drawable/switch_track_holo_light.xml SHA1-Digest: Eo5MokNAcjuPCs208WPinvrsjSk= Name: res/drawable-hdpi-v4/ic_emoji_emoticons_normal_light.png SHA1-Digest: FgmZlOfVN1rD+CH766Mmvh3NhAA= Name: res/drawable-xxhdpi-v4/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: aLOtkEElPKVQnb/x08i/wBkFiH8= Name: res/drawable-xhdpi-v4/abc_ic_menu_share_mtrl_alpha.png SHA1-Digest: DTeGNcY/gdR9X+UQ3ft0flJ139w= Name: res/drawable-mdpi-v11/icon_cached.png SHA1-Digest: bWjXi9cQeu6bWJMLj3jYj2X5PAE= Name: res/layout/abc_activity_chooser_view.xml SHA1-Digest: 6NrTRoAPSzCvGGEddu+u1rad9lA= Name: res/drawable-xxhdpi-v4/ic_menu_search_holo_light.png SHA1-Digest: oqGMNvyOAw/Sdy8/PletKcOIEa4= Name: res/menu/key_scanning.xml SHA1-Digest: UctbhwtsFtrITbdZGf/9Cs79RAc= Name: res/layout-v16/conversation_item_sent.xml SHA1-Digest: ptvJ+benw2A+ikCMWM9UitsRJPw= Name: res/drawable-hdpi-v4/ic_emoji_nature_normal_dark.png SHA1-Digest: QYocdBCKKv2e2ofEk8wfVdfVbx4= Name: res/drawable-xhdpi-v4/ic_mood_white_24dp.png SHA1-Digest: PRxbL+zUh8rXMbA8cU6w7aum2O4= Name: res/layout-v17/notification_template_big_media_custom.xml SHA1-Digest: mxosU1f61wPXGIvZfg/T6gkImcM= Name: res/layout/media_view_remove_button.xml SHA1-Digest: Z9uZCVkqmrC5DOX/oXvQagCoNbQ= Name: res/drawable/conversation_attachment_close_circle.xml SHA1-Digest: Hq4kBHAnVS0k5VX3vLOaMLmM/1I= Name: res/drawable-hdpi-v4/ic_push_gray.png SHA1-Digest: 1sFcllHROkVQm/p7MnDHmYz5eoQ= Name: res/animator/bottom_pause_to_play_animation.xml SHA1-Digest: 7f8HiUwoTj84cBIvXQhtx6kFMlc= Name: res/drawable-xhdpi-v4/ic_emoji_emoticons_normal_light.png SHA1-Digest: 6dRyqVq/Bpj470mPRDxw+j+gv1M= Name: res/drawable-xxhdpi-v4/switch_bg_focused_holo_light.9.png SHA1-Digest: NhiFyZpL/UFmyLAi93FEdt3bouY= Name: res/layout/empty2.xml SHA1-Digest: wnS9P8OkImc/tnKJnsSet9DvBz0= Name: res/layout/design_menu_item_action_area.xml SHA1-Digest: +CaSrRO+YIeuLR//AbmNORoSW6o= Name: res/drawable-v11/emoji_category_symbol_light.xml SHA1-Digest: S4KbeTJw5wwr/9tLDcglMDRZ4A4= Name: res/layout-land/calendar_date_picker_dialog.xml SHA1-Digest: DTEvwBiBAs8Zx8lzI8d7Yxok/cg= Name: res/color/abc_tint_spinner.xml SHA1-Digest: 4iVhO6HftwPxxzWhGE9nvzm3wdM= Name: res/drawable/ic_backspace_dark.xml SHA1-Digest: kK6WMDP0553tSL5Ig3R8OsalYh4= Name: res/color-v23/abc_tint_btn_checkable.xml SHA1-Digest: +QyTGetrtaNPbuACHNcF9nOfp2c= Name: res/layout/keyboard_right_drawable_with_header.xml SHA1-Digest: FAC3tnMsk157+Mb8A6YeI7YQN8s= Name: AndroidManifest.xml SHA1-Digest: pos9Uo0H8CciJ4P55bBrbNkzTu8= Name: res/drawable-xxxhdpi-v4/ic_reply_white_36dp.png SHA1-Digest: JFrKb7Z9QNRfu6OtxfHY6NeGjLg= Name: res/drawable-hdpi-v9/icon_notification.png SHA1-Digest: PuSZfSqVgmCdbkGoQ/wSfTfKWXM= Name: res/layout/fragment_submit_log.xml SHA1-Digest: kbXx9AP2PSn4e7wJ1TWIialIBbQ= Name: res/drawable-mdpi-v4/list_selector_background_selected.9.png SHA1-Digest: qxEi8kmZgQ876B6Q57MNXtffTj0= Name: res/drawable-xhdpi-v4/sent_bubble.9.png SHA1-Digest: x1LavT6RtZ4zK44/4apQftPRZf4= Name: res/drawable-mdpi-v4/ic_lock_white_24dp.png SHA1-Digest: k38KhyZ93Rj0ZJ6bTEynyrgD7UU= Name: res/drawable-mdpi-v4/ic_push_gray.png SHA1-Digest: 13WJHd5q2Ahp9uU8HAipqXAjWc8= Name: res/drawable-xhdpi-v4/textfield_disabled_holo_light.9.png SHA1-Digest: 6kr6+a7d5GsQfVMreRc+SmQOKzc= Name: res/color/abc_tint_default.xml SHA1-Digest: Cj0w9Ew2rX4ZyCzvg/1RtsNqBUc= Name: lib/mips/libcurve25519.so SHA1-Digest: fnEtlnyCW+CCsOTkWuRjerMx3Tk= Name: res/drawable-xxhdpi-v4/ic_create_white_24dp.png SHA1-Digest: Qv2FReVOsuiuXc6rlNON/RF0QGY= Name: res/drawable/pause_to_play_animation.xml SHA1-Digest: V3CIgB0TLJoQjO+eGe31gEnqOKk= Name: res/drawable-hdpi-v4/ic_attach_white_24dp.png SHA1-Digest: hxmJQR+Pz9G2zaJ1fO47E36ilVo= Name: res/drawable-mdpi-v4/ic_emoji_recents_normal_light.png SHA1-Digest: 7fYNOpcf+J5rpJM+V2hxgtJga/I= Name: res/drawable/touch_highlight_background.xml SHA1-Digest: 9D8FMGAktPIKHe1QYVlbL4T2bHA= Name: res/drawable-xhdpi-v4/ic_play_circle_fill_white_48dp.png SHA1-Digest: ZxSr9NEiosFeSFcKMWj2TyuCn9M= Name: res/layout-v11/notification_media_action.xml SHA1-Digest: xk6Nv+akCynB9a9MstuHUvrigc0= Name: res/drawable-xhdpi-v4/ic_warning_light.png SHA1-Digest: q0UxUvig08oexgA/mJG+pHXZeig= Name: res/drawable-xxhdpi-v4/ic_forum_grey_32dp.png SHA1-Digest: zfLrcaLw9MDbUGCChbbJC6X2vQo= Name: res/animator-v11/rotate_90_animation.xml SHA1-Digest: vCHon/zb8+I+tgv5eAXXGWcch9Q= Name: res/drawable-xhdpi-v4/received_bubble.9.png SHA1-Digest: gcv90BhHf7spJ97oEUWp1vl90m0= Name: res/drawable-xxhdpi-v4/divet_lower_right_dark.png SHA1-Digest: jyB7LGFFsfpMRiD5cBDnVpU2RF8= Name: res/drawable-hdpi-v4/ic_send_secure_white_24dp.png SHA1-Digest: tkxExImE54L1mrPJnbnsEFe7YKQ= Name: res/drawable-xhdpi-v4/design_ic_visibility.png SHA1-Digest: XzXZlPxYfuQXzdfnGMLOPy2zBys= Name: res/drawable-v21/conversation_list_item_unread_background.xml SHA1-Digest: N1Iz07XE+nqdqBg9fH6xj5xds+0= Name: res/drawable-xxhdpi-v4/ic_emoji_nature_activated_dark.png SHA1-Digest: Zwbx2B77yBJ2KFCLfem8UvQ7/d4= Name: res/drawable-ldrtl-mdpi-v17/ic_send_white_24dp.png SHA1-Digest: d9D+dFHq5pcFrHc+3b4nVL6Jpr4= Name: res/drawable-xhdpi-v11/icon_cached.png SHA1-Digest: WXYwe2ZPEkhUlCqRpy7Fi6mr9TM= Name: res/drawable-mdpi-v4/ic_emoji_flags_normal_dark.png SHA1-Digest: LZZgv0dmbJRyZidsyghMmuTpP1A= Name: res/drawable-xxhdpi-v4/abc_text_select_handle_left_mtrl_dark.png SHA1-Digest: 5z9/n+cRKfgbsXkUM056zH3FCVY= Name: res/drawable-sw600dp-xhdpi-v13/ic_backspace_disabled_light.png SHA1-Digest: kMBzMnDevZ0XLt1+5ae3cmCuN78= Name: res/layout-v13/database_migration_activity.xml SHA1-Digest: Vfp5/D6oZcKvcg7J1GUVRHlGWp8= Name: res/drawable-xxhdpi-v4/ic_movie_creation_light.png SHA1-Digest: J6AGqej2x+M+XJ8JN3JtZ/6Wx8U= Name: res/drawable-hdpi-v4/ic_add_white_24dp.png SHA1-Digest: d8VcBCnSk44fNTKCt4XSFXPtyZo= Name: res/drawable-hdpi-v4/fab_shadow.png SHA1-Digest: QcPJ+aww0O/T4fX/NdSxxz0gL5E= Name: res/drawable-v21/conversation_list_item_unread_background_dark.x ml SHA1-Digest: SritqTfucM34VdX3Wq5TrcRj3A0= Name: res/drawable-mdpi-v4/ic_info_outline_light.png SHA1-Digest: hDBWUneztadWl+2LCS2PF3PVayM= Name: res/layout-sw600dp-v13/three_keys_view_right_drawable.xml SHA1-Digest: Ed3lqHofQXUKJnEKuPzOOoZNkEA= Name: res/drawable-xhdpi-v4/ic_brightness_6_gray.png SHA1-Digest: In1N9+Z54wMBLaMQk7yhzQEK+UY= Name: res/drawable-xhdpi-v4/abc_text_select_handle_left_mtrl_light.png SHA1-Digest: g81CUa1lR0Ts/TFU+9EVs79w2q4= Name: res/drawable-v21/design_password_eye.xml SHA1-Digest: HVHJTN2P1VIy7McjbW2zKNHTZ/k= Name: res/drawable-v11/emoji_category_nature_light.xml SHA1-Digest: APCRNVaaYVwvFd3ETZY/JfKdzKg= Name: res/anim/slide_to_top.xml SHA1-Digest: b/7F73oaOgl8QTgwjZirDWc5DsI= Name: res/drawable-xhdpi-v4/ic_emoji_emoticons_activated_light.png SHA1-Digest: S6TvtzA7Bo/XtCkIK2VkoIS82ik= Name: res/drawable-xhdpi-v4/ic_delivery_delivered_dark.png SHA1-Digest: YVsN6slHWNaCzpokvQgLqC+fq6I= Name: res/drawable-xxhdpi-v4/abc_list_divider_mtrl_alpha.9.png SHA1-Digest: 0MMPUBC/hxFmt1Ak92Vmj3X0hfs= Name: assets/fonts/Roboto-Light.ttf SHA1-Digest: pjPMJmlNtysc9kyqUeZLQ8N3mzo= Name: res/drawable-xxxhdpi-v4/ic_play_circle_fill_white_48dp.png SHA1-Digest: HC3H3QKMcIn/XvG7NTnesc4XN60= Name: res/drawable-xxhdpi-v4/ic_save_all_white_24dp.png SHA1-Digest: l3gWuGNSHrqMQXWG0OPvuIaQ3Kk= Name: res/drawable-xxhdpi-v4/ic_send_sms_insecure.png SHA1-Digest: wVnl3pGKiCgCUmX2o2XZJ185DhY= Name: res/layout/abc_alert_dialog_title_material.xml SHA1-Digest: eHB3qMi9x448kTfErbhY0wKGOGw= Name: res/drawable-mdpi-v4/abc_scrubber_track_mtrl_alpha.9.png SHA1-Digest: F8nLQoXKGiQPJCjl3TNIR/eklGw= Name: res/drawable/spinner_background_holo_light.xml SHA1-Digest: FkM2Y5/fZGxEDF75TigYjOv/pBw= Name: res/drawable-xhdpi-v4/fab_shadow_mini.png SHA1-Digest: K6jX5AoiUHx8WZvpb4TNE/aBNps= Name: res/drawable-xxhdpi-v4/abc_ic_star_black_36dp.png SHA1-Digest: WfH571yq6iMoRrhqJrcQ5L9wd34= Name: res/drawable-hdpi-v4/ic_missing_thumbnail_picture.png SHA1-Digest: AkapvGWfA79lmTGbR9Wzo/42GwY= Name: res/layout-v17/abc_search_view.xml SHA1-Digest: w/EaiCfthqVUJ4hNIf3hUGNJISc= Name: res/drawable-mdpi-v4/ic_emoji_objects_activated_light.png SHA1-Digest: alEiHBp0PYCvmpzbGa01iDpAWXQ= Name: res/drawable/conversation_list_item_unread_background.xml SHA1-Digest: Fmy9ZHMz/W9uNp5AftjihiWw9rw= Name: res/drawable-hdpi-v4/abc_textfield_search_default_mtrl_alpha.9.p ng SHA1-Digest: Uaax8TsSlV1ssfdd4JM/P9lAyjc= Name: res/xml/badge_widget_provider.xml SHA1-Digest: +ZlTyPrkmuFlP4u7gmyhFqYltX8= Name: res/drawable-ldrtl-xxxhdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.pn g SHA1-Digest: e4+xS2IHT21cqoB/yQU6OyS1b7o= Name: res/drawable-xxhdpi-v4/ic_badge_24dp.png SHA1-Digest: dzOpM+GS7bMorn2a/IVSkZlYVHA= Name: res/drawable-mdpi-v4/ic_play_circle_fill_white_48dp.png SHA1-Digest: bvQz4mTshp6coddKsCQyDxXU/Q0= Name: res/drawable-mdpi-v4/ic_emoji_symbols_activated_light.png SHA1-Digest: AY6BCs4NmmdcSafgRSNwfOVNmjY= Name: res/layout/design_bottom_navigation_item.xml SHA1-Digest: zJmONTRCmYo9XB0TlPWgbXf5xdY= Name: res/drawable-mdpi-v4/ic_backspace_normal_dark.png SHA1-Digest: E+HzcnHe62jO/lohBxlGEbdT0ms= Name: res/drawable-mdpi-v4/abc_text_select_handle_left_mtrl_light.png SHA1-Digest: I7wS5ZKCeDKsgaNc6QtAyJ+0CnU= Name: res/drawable-xhdpi-v4/ic_check_normal_dark.png SHA1-Digest: 1XD1KsYvae/WOB8WnfjzrdtJBzk= Name: res/xml/preferences_chats.xml SHA1-Digest: SH8XF6Rr8C59ppD1B4e0phGULBc= Name: res/layout/radial_time_picker_dialog.xml SHA1-Digest: rnZqvjrWjvkn0JbM8JD/R3oXOMQ= Name: res/drawable-xhdpi-v4/ic_menu_add_field_holo_light.png SHA1-Digest: qkM0nsehJp2malHucAuSFp92PDk= Name: res/drawable/background_pattern.png SHA1-Digest: te6lQlxaf+qKIDNGC4udnhKhgr0= Name: res/layout/abc_popup_menu_item_layout.xml SHA1-Digest: jA9dptKvdESOx5FotTJaJllrdMw= Name: res/drawable-hdpi-v4/ic_download_circle_fill_white_48dp.png SHA1-Digest: gNRhVl6SKU2LKdsU3uaIn96oBI4= Name: res/layout/hms_picker_view.xml SHA1-Digest: n4jSoVkT0j3uRcsS1tyGutHDKuc= Name: res/drawable-mdpi-v4/ic_emoji_people_normal_dark.png SHA1-Digest: FxxkOb3eliTm0v2G3ujs7dHQZ6o= Name: res/drawable-mdpi-v4/ic_account_box_light.png SHA1-Digest: Xmih+rt8esnUfRPfBmqy1oEug6g= Name: res/layout/media_overview_activity.xml SHA1-Digest: +IX8tuRvJSRL1nnI3aSQGCpc8eE= Name: res/drawable-hdpi-v4/ic_save_all_white_24dp.png SHA1-Digest: fTqBtx3+VRpQQgh21GoAIgIYZFM= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_84 SHA1-Digest: cM9Igo/aYhfEFUXrYtfhy+rGfTA= Name: res/drawable-hdpi-v4/design_ic_visibility.png SHA1-Digest: +hcSUcB9RDUJTOimdB4ICvT3arQ= Name: res/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_015.png SHA1-Digest: Liu4ZSvXVbRTfKfw/Sf1BCXStdc= Name: res/layout-v16/verify_identity_activity.xml SHA1-Digest: abOUHfeCLJJaQ91jpxtdZSSDzkQ= Name: res/drawable-xhdpi-v4/switch_thumb_pressed_holo_light.9.png SHA1-Digest: UztIfkg+4xXbDDfXpkylsY0bawQ= Name: res/drawable-xhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png SHA1-Digest: 8QLweU4p1rehkS9Zii3jepzESPg= Name: res/drawable-ldrtl-xxxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: dT9O498/3E1mpkpzpSmdy7tcxxU= Name: res/drawable/notification_bg.xml SHA1-Digest: THPM7d4fjttZeFlOLyUSXRHqhH0= Name: res/drawable-mdpi-v4/ic_message_black.png SHA1-Digest: zX0Isnvpx4aSgpL+VtqlSA4mp4o= Name: res/drawable-hdpi-v4/abc_textfield_default_mtrl_alpha.9.png SHA1-Digest: NPD/eXAUHpJIZ0Gue4mGW/Q6oXI= Name: res/drawable-hdpi-v4/abc_ic_star_black_16dp.png SHA1-Digest: FQyC2AygbGjHIwHNyQK6rfa+lU4= Name: res/drawable/abc_ic_arrow_drop_right_black_24dp.xml SHA1-Digest: GQi7GLUlkJLHiD+gB14bbxFEMxg= Name: res/layout/design_layout_tab_text.xml SHA1-Digest: hGylEWtLV6PowlIJAnKyrFqhGEo= Name: res/drawable-xxhdpi-v4/ic_refresh_white_18dp.png SHA1-Digest: Q15fNzEUSMunWUNIiHQsywHTQxw= Name: res/color/design_tint_password_toggle.xml SHA1-Digest: tXHSF7zejvqCXCSnNyLjRNye5ZI= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_81 SHA1-Digest: daBwnRVtz216PB28MApBfpfM6OY= Name: res/color/design_error.xml SHA1-Digest: 6eBLuAiTIJDL9jItNuNpsAB6IjQ= Name: res/layout-v21/conversation_fragment.xml SHA1-Digest: vykdFaKcvfe80HYf0fSDEj84t3s= Name: res/drawable-mdpi-v4/ic_keyboard_white_24dp.png SHA1-Digest: xeYwu7r+BgqvcqSiy6WKyBFn0PU= Name: res/drawable/last_seen_divider_text_background_light.xml SHA1-Digest: SKAPPzKllQI/8GW+6JgqUOxszCQ= Name: res/drawable-xxxhdpi-v4/fab_shadow_mini.png SHA1-Digest: HDUgGlNwLol/QjCoQ1CAJRsFzAo= Name: res/drawable-mdpi-v4/ic_send_sms_secure.png SHA1-Digest: 7RUK/SH4FbWSoWnknRUMq6EWjbs= Name: res/drawable-xxxhdpi-v4/ic_arrow_forward_white_24dp.png SHA1-Digest: kmuYpbwg9hm+zYqSY4xgXUNrUh8= Name: res/drawable-mdpi-v4/textfield_focused_holo_light.9.png SHA1-Digest: Osswqo8kfRGKahOnjpi0n93nS1Y= Name: res/color-v11/abc_hint_foreground_material_light.xml SHA1-Digest: 0+TtbyFWq3KwgFpqHVEftodeMQI= Name: res/drawable-ldrtl-mdpi-v17/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: nhOdszX2MHoKx6H7uBb+tEWPyJ0= Name: res/drawable-xhdpi-v4/abc_text_select_handle_middle_mtrl_dark.pn g SHA1-Digest: qIyIPrdPc6Iq8AOMfE1vzfxsbTs= Name: res/color-v23/abc_btn_colored_borderless_text_material.xml SHA1-Digest: TsIbuUrE/6o0oDATCM4a2QUvxJg= Name: res/drawable-hdpi-v4/fab_shadow_mini.png SHA1-Digest: H2qyAE5qLgTtU/9FhzpezlRiwVA= Name: res/drawable/emoji_category_objects_light.xml SHA1-Digest: JDQouPeLrbGMSt3Uc/WHtIWqhSQ= Name: res/layout/emoji_drawer.xml SHA1-Digest: Dd/8q/DvT7ilOEXIiORvUQ7HDK4= Name: res/drawable-xxhdpi-v4/ic_menu_remove_holo_light.png SHA1-Digest: GbOqf2Yga6qVAxaA3ec35ac0Yio= Name: res/color/abc_search_url_text.xml SHA1-Digest: ULqUPkxlcpqU/WycHleKoU9uLlU= Name: res/layout-land/radial_time_picker_dialog.xml SHA1-Digest: LLbkgnMksutub2cRM1nsU8FpJoY= Name: res/layout/calendar_date_picker_dialog.xml SHA1-Digest: NUtG90BZ+8EsAe+kzPDU+xv2GjI= Name: res/drawable-mdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png SHA1-Digest: bZVk/7JyPqpb9FPgqFjfBJURWhA= Name: res/drawable-xxxhdpi-v4/ic_unarchive_white_36dp.png SHA1-Digest: 9cXrWWjq7GXj9DC1D4MTcb7KJO0= Name: res/drawable-v11/edit_text_holo_light.xml SHA1-Digest: hxVxfVfZWEOaImpM3nIRR206O3Q= Name: res/drawable-mdpi-v4/ic_video_light.png SHA1-Digest: J3v9bGC1UXW6oWWeoGjtijwgDQQ= Name: res/drawable-mdpi-v4/ic_info_outline_dark.png SHA1-Digest: /PF66Z+zUl+MpR95R4Usmp9061c= Name: res/drawable-mdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png SHA1-Digest: 6odRFxWrjmo6tHxritbB5cYdjWI= Name: res/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png SHA1-Digest: /hpvHveM+a3Mx49n/3P19bBBgiI= Name: res/color/abc_secondary_text_material_dark.xml SHA1-Digest: jVKXpTEzxPaBeJwNCxDpj2X/w74= Name: res/drawable-hdpi-v4/ic_notifications_gray.png SHA1-Digest: Pd6jNrp5QpPHay891JKXphkSd6g= Name: res/layout-v17/notification_template_lines_media.xml SHA1-Digest: tz2lYMQAF7sxUin88+DuDAtQOqg= Name: res/layout/design_navigation_menu.xml SHA1-Digest: vl1zV6hLnTZFqcV+cyuW1MeII3Q= Name: res/drawable-xxhdpi-v4/ic_contact_picture.png SHA1-Digest: twSQpXhWmjQ7CWO9m0F8nUDc7A4= Name: res/layout-v17/abc_popup_menu_item_layout.xml SHA1-Digest: 8DtItPqMurboslrZKDDQ1XmfM+E= Name: res/drawable-xhdpi-v4/abc_ic_star_half_black_36dp.png SHA1-Digest: GV2BrBF8/MHHPwyzNe+cYQSsr8s= Name: res/drawable-hdpi-v4/ic_send_white_24dp.png SHA1-Digest: YeisgUij4OcmXinn/cWMdZz3TBc= Name: res/menu/conversation_list_batch_archive.xml SHA1-Digest: D8Lq/UUufIVGdgLWYsizYBLTqBo= Name: res/drawable-hdpi-v4/ic_done_white_18dp.png SHA1-Digest: KQifE++1R42/hv8mw6aOLGraIQc= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_94 SHA1-Digest: iFng5Rg8uXcO1Wad8WzQjXXbaSA= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_95 SHA1-Digest: 6+a5S3YBqGkTp77eRI98wZppshU= Name: res/layout/share_intent_row.xml SHA1-Digest: hEFfaanmx0xw0zSH1atx6iZAH5s= Name: res/xml/preferences_notifications.xml SHA1-Digest: p4OAaRpNlmyOg9HyN+lTj8L8WJs= Name: res/drawable/notification_icon_background.xml SHA1-Digest: VGX+wieCo2SajK2CMLMDgU1/Aos= Name: res/drawable-xhdpi-v4/switch_bg_focused_holo_light.9.png SHA1-Digest: /LzkB2YWBf8/BEEXg0QTgGcw1zo= Name: res/drawable-xxhdpi-v4/ic_info_outline_light.png SHA1-Digest: f/SRAbWGdLggjG49cpPDrZ8GR1o= Name: res/layout/prompt_passphrase_activity.xml SHA1-Digest: ZPPyAUKsFokJGPAQtWrHF7MbIyE= Name: res/drawable/button_background_light.xml SHA1-Digest: 6hucLMUPMI5lbi0CQdnO07Alz4U= Name: res/drawable-v11/emoji_category_flags_dark.xml SHA1-Digest: K6wG2meKj+58nMR2LS7Tlrk29+Y= Name: res/drawable-xhdpi-v4/alert.png SHA1-Digest: LPSO3FYapsRHFP0T+o4zkdxUEhY= Name: res/layout-v16/calendar_date_picker_header_view.xml SHA1-Digest: 5Wnpaad+1uIjUuhr3iEY2o+38u4= Name: res/layout/contact_selection_activity.xml SHA1-Digest: 4URmy7POdpnO01RqOKKR1jvxUSs= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_91 SHA1-Digest: hd0u/1mAj3Ir3hNqdmnilV5SSVM= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_90 SHA1-Digest: 7WrMiEDONSaE+X9BTfPKgXzIz+g= Name: res/menu/conversation_list.xml SHA1-Digest: uCFkIKxt/KfXVT/jn5kJboO0aVc= Name: res/drawable-xxhdpi-v4/ic_message_gray.png SHA1-Digest: haNfxks1gclytpmzOfPF775nqok= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_49 SHA1-Digest: lJyFdjLImuA15HlomNveCTDcnAc= Name: res/drawable-mdpi-v4/ic_save_white_24dp.png SHA1-Digest: K14JTtfEHf/fT8ZgbB4MHymv7H8= Name: res/drawable/compose_divider_background.xml SHA1-Digest: GVnpKW3S5n6mjpAhT6hMqjKIs0o= Name: res/drawable-xxhdpi-v4/ic_action_warning_red.png SHA1-Digest: 11cnBsIwAg6MESM4rNvhhq30SW0= Name: res/drawable-mdpi-v4/textfield_disabled_holo_light.9.png SHA1-Digest: fdGCIi27zMMr34hbp5pyUowldrs= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_44 SHA1-Digest: N1nuhYaREi9z6iAeXxLcra4rL5s= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_43 SHA1-Digest: mIFkru/j+coHhbRh6/nN2br+Xak= Name: res/drawable/ic_check_light.xml SHA1-Digest: D6ryoNpQPcPyGevgOmJjdbBwuMw= Name: res/drawable-hdpi-v4/ic_menu_search_holo_dark.png SHA1-Digest: gL/VDRxvMbN3cvW+cG+h0LN2kJM= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_36 SHA1-Digest: hWS0Op4dc6LF44g9BIFft/f3QH0= Name: res/drawable-xxhdpi-v4/ic_emoji_symbols_activated_light.png SHA1-Digest: +nPlVQ0H32v53pvZ8POlrZlaOxY= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_31 SHA1-Digest: KuLNytr4ZRl4fcSWuquXOt81/60= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_30 SHA1-Digest: Bh8tv057544lV4r7kRT1zzTlaA8= Name: res/drawable-xhdpi-v4/ic_volume_up_light.png SHA1-Digest: gbftuNpGqiLFP54XEsAgE9pLWno= Name: res/drawable-xxxhdpi-v4/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: Gr88G2zQ2X0grlFxAco+5IsVZzU= Name: res/drawable/notification_bg_low.xml SHA1-Digest: 2//CmepC2cWfyNKA2qTMrqNQ8Kc= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_34 SHA1-Digest: O3GRzsWEr1+UF6z/veTcYUIikdU= Name: res/drawable-xhdpi-v4/ic_visibility_grey600_24dp.png SHA1-Digest: /jSu43bsM7FYf8VJaW3R8jv/Zu8= Name: res/drawable-xxhdpi-v4/icon_cached.png SHA1-Digest: Z1o2fG8R1cjAjLh2p1kMQkm2hak= Name: res/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_000.png SHA1-Digest: qyyA8++tpZMeE5woicJ8hRb+SDY= Name: res/drawable-mdpi-v4/ic_brightness_6_black.png SHA1-Digest: zsvLkyXq+dXOYXZXkUrBRkt5NCA= Name: res/drawable/design_fab_background.xml SHA1-Digest: 2IXtIQ8BMr6/gZ9iOW0d/IwZH6A= Name: res/drawable-xxhdpi-v4/ic_account_box_light.png SHA1-Digest: V8BFS/R93Ol03XXTMz0mU5JZryU= Name: res/drawable-hdpi-v4/ic_delete_black.png SHA1-Digest: bJh8n1jViDW0f3jgxMWC1Q2rHQA= Name: res/layout-sw600dp-v13/three_keys_view_text.xml SHA1-Digest: DVMEFp/Bk6iawn0lWSLRKucfq78= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_66 SHA1-Digest: ZFpoKe4t4pLWyhWH1RNMJcPf+fE= Name: res/animator-v11/upper_pause_to_play_animation.xml SHA1-Digest: 7SpUy2/cGRb7Pfid2amb6pYHwiA= Name: res/drawable-xxhdpi-v4/ic_select_all_white_24dp.png SHA1-Digest: 8pvrUMgikaLGOMW8rQ65pwo3A2E= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_62 SHA1-Digest: Ic1OQ0X5xM4WirGTkp+cG+BXfuU= Name: res/drawable-hdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png SHA1-Digest: CBej+P8bwYybMFQCDCEkHRsc8Sk= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_61 SHA1-Digest: 7c51UKlqpVDI3o2A/s0k4nNgKCA= Name: res/drawable-hdpi-v4/ic_dialpad_white_24dp.png SHA1-Digest: oYtNZ3NSPqaVWzVfYJ60vDte8ug= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_63 SHA1-Digest: a7U/pmtZHFBo5obxPjewjKWkGa8= Name: res/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png SHA1-Digest: O6x52IgsWeKV4Xdu5U2H2IxbVgc= Name: res/drawable-mdpi-v4/icon_lock.png SHA1-Digest: g7e66g+Oh4i7GrhKslnYfHt8/tc= Name: res/drawable-hdpi-v4/ic_recurrence_bubble_outline.png SHA1-Digest: coXedWnlopPeR6mVw+fcRrRfPOY= Name: res/layout-v17/abc_alert_dialog_button_bar_material.xml SHA1-Digest: /LFV3VauCOFVr2jNXldDXPvIhwQ= Name: res/drawable-xhdpi-v4/abc_list_selector_disabled_holo_light.9.pn g SHA1-Digest: bwjSzuahpvwVgJavscLUKen/ZqQ= Name: res/layout/abc_action_bar_title_item.xml SHA1-Digest: JePlqdhFAVxMv4b6ytoiCrX6ghM= Name: res/layout/color_preference_items.xml SHA1-Digest: qKDb1gO+Hu23/dgZi/JwhHAQlWc= Name: res/layout/notification_template_part_chronometer.xml SHA1-Digest: dzQtd/RKeHhfMLTfmeJLOxUNfdA= Name: res/drawable-xxhdpi-v4/ic_emoji_nature_normal_light.png SHA1-Digest: 1KoGyd1xjlqfyoipZIQQGvpyKyY= Name: res/layout/zooming_image_view.xml SHA1-Digest: v8hYwtg/deZRi/NqPvzpCqBUaM4= Name: res/animator/upper_play_to_pause_animation.xml SHA1-Digest: 7f8HiUwoTj84cBIvXQhtx6kFMlc= Name: res/drawable-mdpi-v4/ic_volume_off_grey600_18dp.png SHA1-Digest: iGS7mESVFIWuKWvAPvF2zPotpes= Name: res/drawable-hdpi-v4/ic_send_insecure_white_24dp.png SHA1-Digest: 9+5i19e2XcxBJ2xJIfLEkMDY3dQ= Name: res/drawable-xhdpi-v4/ic_photo_camera_dark.png SHA1-Digest: S1YYRIEas6QV9ZuYT5lIwspAza0= Name: res/drawable-mdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png SHA1-Digest: deH5E0yKjBo6CYdnvx70e1ZcVb4= Name: res/drawable-xhdpi-v4/ic_block_white_18dp.png SHA1-Digest: uvN0KqWUheooWW50U/4DZBpqJn4= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_58 SHA1-Digest: LqgBINJBQXrfS7qSEUdO2YKapSc= Name: res/drawable-hdpi-v4/ic_emoji_flags_normal_dark.png SHA1-Digest: AY66CHRZpDIF8mLkrCS9dfohLHc= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_55 SHA1-Digest: aHXhcJ44Nq+1uITpH9udVnAuQjI= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_54 SHA1-Digest: 0pJTmVMR2tNAUtn+uRmLAqWmQnM= Name: res/drawable-xxhdpi-v4/ic_warning_dark.png SHA1-Digest: 84NAvhniTYBghOjjZJa8ekyhqAo= Name: res/drawable-xxhdpi-v4/ic_delivery_delivered_dark.png SHA1-Digest: vBsabKr/2Z/PNGjK64TGLuWPr50= Name: res/drawable-hdpi-v4/ic_brightness_6_black.png SHA1-Digest: utPotC6A3fvHewhtmFhU7Is33wk= Name: res/anim/abc_popup_exit.xml SHA1-Digest: HpgqoyyC+fdyFrYE8t6l+v0+Y4c= Name: res/drawable-hdpi-v4/abc_scrubber_track_mtrl_alpha.9.png SHA1-Digest: dEml7NSraw7t0+4lZ4iFeNS5MxI= Name: res/drawable-xhdpi-v4/abc_switch_track_mtrl_alpha.9.png SHA1-Digest: DnUPb3c/aCYMPIdhLVRqT1eh/J8= Name: res/drawable-xxhdpi-v4/ic_cancel_white_24dp.png SHA1-Digest: UEXAoM6inwKjrBc8YeEghK54aKQ= Name: res/drawable-mdpi-v4/ic_done_all_white_18dp.png SHA1-Digest: XlJDM5+CSYTJBdW7iBfdkb0S8Cw= Name: res/drawable-mdpi-v4/ic_brightness_6_gray.png SHA1-Digest: z1fiTQfnlGYaEzTtQgwudZSeas4= Name: res/drawable-xhdpi-v4/ic_emoji_flags_activated_light.png SHA1-Digest: 4TlxtnLnrRyRWS9ZwCKcvKFtkNY= Name: res/drawable-mdpi-v4/design_ic_visibility_off.png SHA1-Digest: 0WaQYJLtIRBRLvcCp5FssXE3Izo= Name: res/drawable-hdpi-v4/ic_photo_camera_light.png SHA1-Digest: PvngzhGtMP2JKnNVwyBgLk+zboE= Name: res/drawable-hdpi-v4/ic_image_light.png SHA1-Digest: crJiZlW6XjUC0iMXZGBpmuDB2pc= Name: assets/emoji_symbols.png SHA1-Digest: n7FK0HOrvqZV7o1ufIX1wGOrcIg= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_675 SHA1-Digest: yhEc8jlPKXbvDhLFNca0Uc/VhxE= Name: res/drawable-xhdpi-v4/ic_done_all_white_18dp.png SHA1-Digest: eeXVSa6PUMPTyojiB8gOI30kMvc= Name: res/drawable-xhdpi-v4/ic_delete_gray.png SHA1-Digest: SvQxwXgVblHRBe9fS7BnhcdQ6tw= Name: res/drawable-xxhdpi-v4/ic_textsms_grey_32dp.png SHA1-Digest: J0LDzREI8Ublaf5VBwVwdBVynxM= Name: res/drawable-mdpi-v4/ic_lock_white_18dp.png SHA1-Digest: 9qjL2cP9rKXe4FzEjfH29rs68jA= Name: res/drawable-hdpi-v19/switch_thumb_pressed_holo_light.9.png SHA1-Digest: uOrxuPdeG1Hgke4uVegUhdTfRG0= Name: res/drawable-hdpi-v4/ic_emoji_recents_normal_light.png SHA1-Digest: PHQwvfi9AKmY2plUmIgrEgTgJ5w= Name: res/drawable-mdpi-v4/ic_send_secure_white_24dp.png SHA1-Digest: DOjlQyUuAhurwo0Uk3UNk0Qh68M= Name: res/drawable-xxxhdpi-v4/ic_block_grey600_18dp.png SHA1-Digest: sYYGqQ5gDXfoXZOA1PBxXc4iWII= Name: res/drawable-xhdpi-v4/switch_thumb_disabled_holo_light.9.png SHA1-Digest: MYtF9U4u3mtwL6bJwMkzyLB2Ubo= Name: res/drawable-xhdpi-v4/ic_info_outline_white_24dp.png SHA1-Digest: sZNtJLPCCI7ia/PLaXUm9Dar+AI= Name: res/drawable-xhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png SHA1-Digest: Zj1YE4I/aNMmHr4LVwFo4H/yZ5U= Name: res/drawable/design_snackbar_background.xml SHA1-Digest: 8T4TLSdRXRXbJ+StbJBFy8qpjbQ= Name: res/layout-v16/conversation_item_pending_v11.xml SHA1-Digest: RhsSVPab9bHet3xJ91y/5FGeApk= Name: res/drawable-hdpi-v4/ic_create_white_24dp.png SHA1-Digest: QB3FM8a3lWDcakzTeXFZ4D/juUM= Name: res/layout/key_caching_notification.xml SHA1-Digest: oUYU7tYvlAGnAROZzyClW6M/Z5w= Name: res/drawable-xxhdpi-v4/textfield_activated_holo_light.9.png SHA1-Digest: VMleSAHQjnh30LIfWAOzY1IDlbw= Name: res/drawable-xxhdpi-v4/ic_movie_creation_dark.png SHA1-Digest: jGF3U1BDovYM9lN+7ct+VrKxnxs= Name: lib/armeabi/libcurve25519.so SHA1-Digest: c7mgPDTVx0d7ZVWqg7scxKx/6u4= Name: lib/x86/libcurve25519.so SHA1-Digest: EnxNgvXsAP0+4XwonU5rQjozT5U= Name: res/drawable-mdpi-v4/ic_menu_search_holo_light.png SHA1-Digest: z0HRwPObMd21n50Meu7NnoYtfEY= Name: res/drawable-xxhdpi-v4/abc_textfield_search_activated_mtrl_alpha .9.png SHA1-Digest: Ay1qOaJ2aLiCf8NAaujbkp0H1cQ= Name: res/drawable-hdpi-v4/abc_ic_star_black_48dp.png SHA1-Digest: 84VFkBa9KP++pv1aritXYQWuD68= Name: res/drawable-mdpi-v4/abc_text_select_handle_middle_mtrl_dark.png SHA1-Digest: 1EAZ3n1TgfThsvhrnqhd8KcFdQQ= Name: res/anim/abc_fade_in.xml SHA1-Digest: ohPEA4mboaFUu9LZMUwk7FmjbPI= Name: res/drawable-xxhdpi-v4/ic_lock_dark.png SHA1-Digest: vWoogoEKXCva1zQwhs2P8evL3Y0= Name: res/drawable-xxxhdpi-v4/ic_archive_white_24dp.png SHA1-Digest: nUlpgvqiQ8gTITXcyGd9vKR8R2M= Name: res/drawable-hdpi-v4/ic_volume_off_grey600_18dp.png SHA1-Digest: C+a5oEByuM8SSgYeU25/MraUpRM= Name: res/drawable-sw600dp-hdpi-v13/ic_backspace_normal_dark.png SHA1-Digest: chdWLuSp41Ygjhu4NcpXdLWh9sc= Name: res/drawable-xxhdpi-v4/ic_recurrence_bubble_outline_disabled.png SHA1-Digest: KwldDErOBJI8BaxA5Lx0y+g5/U0= Name: res/layout/abc_screen_simple.xml SHA1-Digest: L+lDjRkMzyxbAEO55AhMboq9FFA= Name: res/layout/abc_search_dropdown_item_icons_2line.xml SHA1-Digest: aFhBmo0lBKAVM55W6TMirZfSaOM= Name: res/layout-v17/conversation_title_view.xml SHA1-Digest: /lcEBZpaKIsZUFfHyc1tpm5ueGY= Name: res/layout/conversation_item_sent.xml SHA1-Digest: I3KB8bXRPrBy2mfFyBFvtBHnGMQ= Name: res/drawable/share_list_divider_shape.xml SHA1-Digest: JKSChmT2fc3TH0THPN+Ic8jMJq4= Name: res/drawable-hdpi-v4/abc_text_select_handle_right_mtrl_light.png SHA1-Digest: 15/Lgr8XtZjo4bQQgTlTC4gG2Mw= Name: res/drawable-xhdpi-v4/ic_pause_circle_fill_white_48dp.png SHA1-Digest: 94h57IA/h+ABdExw4oY+jcr1UR0= Name: res/drawable-xxhdpi-v4/design_ic_visibility_off.png SHA1-Digest: 6/g8nk7pRid9D24FOlgafLT3EXk= Name: res/drawable-hdpi-v4/ic_emoji_symbols_activated_dark.png SHA1-Digest: OUgUKsKg5gpj6PSDf1EeZK7ZvBg= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_255 SHA1-Digest: T8Y8UPJDNNY3gi+RvAerX30aAJ4= Name: res/drawable-xxhdpi-v4/abc_list_focused_holo.9.png SHA1-Digest: FsvLP65iWVfEfIkCPXw4wimwY7M= Name: res/drawable-xxhdpi-v4/textfield_disabled_holo_light.9.png SHA1-Digest: IbsyrIi5P4z5+3CcgDwoUkpzMUI= Name: res/drawable-hdpi-v4/ic_menu_barcode.png SHA1-Digest: V1LV2ko7FekGujcSQETjbZKZG8E= Name: res/layout-v21/notification_template_custom_big.xml SHA1-Digest: RZJXVBX9p1L/7vQbjeCBRdqCzZM= Name: res/drawable-xxhdpi-v4/sms_system_import_icon.png SHA1-Digest: X4mRUtd65sev9HuIeU+o1KVCieg= Name: res/color-v23/abc_tint_edittext.xml SHA1-Digest: BBcfe9ziniPVPStDrP3v4C+knKk= Name: res/drawable-xxxhdpi-v4/transfer_controls_background.9.png SHA1-Digest: 4Ou2gycZRud/GAupu9OHpU/2qqE= Name: res/layout/conversation_title_view.xml SHA1-Digest: p8gGaGnktrziXPgC2LsWIVnUruQ= Name: res/drawable-mdpi-v4/ic_emoji_recents_activated_dark.png SHA1-Digest: 9HHpxbJae6/CS4sveioFjGZtnWY= Name: res/drawable-xhdpi-v4/abc_list_pressed_holo_light.9.png SHA1-Digest: 5rSZbdJDOTdM5kJhhIdl8m8briI= Name: res/drawable-mdpi-v4/ic_clear_white_24dp.png SHA1-Digest: dfoLSz8moBfkGsytGq89kj+x18w= Name: res/drawable-xxxhdpi-v4/ic_forum_black_32dp.png SHA1-Digest: JC82uvRHpOuaKQOwol/LEB8u8ik= Name: res/drawable-xxxhdpi-v4/abc_ic_star_half_black_36dp.png SHA1-Digest: QnhqhmaaBESNVdVhbQn1hIhZFYA= Name: res/layout-v17/notification_template_big_media_narrow_custom.xml SHA1-Digest: fXziI3HkMDGRYbhw6t+nLo4mSqo= Name: res/drawable-mdpi-v4/ic_advanced_gray.png SHA1-Digest: 5gnrbk5AthLhEXt3YdcuSwsrJ4s= Name: res/menu/conversation_list_batch.xml SHA1-Digest: IgltNUuFQ8Yx8Fk0/0HdbERA+/w= Name: res/drawable-xhdpi-v4/fab_shadow.png SHA1-Digest: kwb+NfpJkRntsi1qHriUyrhjuwc= Name: res/drawable-hdpi-v4/textfield_disabled_holo_light.9.png SHA1-Digest: P9M5tQrzNeUD6Wa598XwOxFN4hg= Name: res/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_000.png SHA1-Digest: kvy6NVZis2HTuWhGbjSTUHivrS8= Name: res/drawable-hdpi-v4/ic_check_white_24dp.png SHA1-Digest: quY3cxjleDPvMFafdmbJPpD8D3A= Name: res/drawable-xhdpi-v4/ic_volume_off_white_18dp.png SHA1-Digest: JqO+SIz5f5/dzmEA7KCmj0FBDj4= Name: res/drawable-xxhdpi-v4/ic_block_white_18dp.png SHA1-Digest: rrLtIOHjE+jSEj6kxoOcZ2O1U2A= Name: res/drawable-xhdpi-v4/ic_emoji_emoticons_activated_dark.png SHA1-Digest: QJrW1iKOkorI8NMyy5uac4ObL+Q= Name: res/drawable-xhdpi-v4/ic_warning_dark.png SHA1-Digest: 4RzhY8lcSo3SKqcyPt9ntyV16J8= Name: res/drawable-xxxhdpi-v4/ic_unarchive_white_24dp.png SHA1-Digest: lykWjibfTBC/zovVXNmenA9+uys= Name: res/drawable-hdpi-v4/ic_visibility_off_grey600_24dp.png SHA1-Digest: eoKvoESbsfjYq4hRm1CDGIlQho4= Name: res/drawable-v11/emoji_category_recent_dark.xml SHA1-Digest: 0yO+4Tr5fhkHQluSgM5xxlwkAb0= Name: res/drawable-xhdpi-v4/ic_emoji_symbols_normal_dark.png SHA1-Digest: 76fPfhfCu4HVav8hLSmRsYCQgwA= Name: res/layout-v21/conversation_title_view.xml SHA1-Digest: nIAlcpBCsxSi/3fp5Q65GA2qifY= Name: res/drawable-mdpi-v4/ic_content_copy_light.png SHA1-Digest: qqQJESs0EIV1vVXC6f550e7/FCI= Name: res/drawable-xxhdpi-v4/ic_visibility_off_grey600_24dp.png SHA1-Digest: I7RnYghIM1uYNG89Jx0OyjCWWnA= Name: res/drawable-mdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png SHA1-Digest: rWEkIJT/DhekegJTLoLY7vlStb8= Name: res/drawable-hdpi-v4/ic_group_photo.png SHA1-Digest: wokVkjOa08RdAyBaFTS01G6Vjeo= Name: res/menu/conversation_list_empty.xml SHA1-Digest: jYhZY4UeWjDynfYgrxyDfgW5i7c= Name: res/drawable-hdpi-v4/ic_backspace_disabled_dark.png SHA1-Digest: nnubVwr7Sy/Q0WLycs3D4sO5LGE= Name: res/drawable-v11/emoji_category_objects_light.xml SHA1-Digest: iBMvAA5/+zPuG1HSUhaIO4kjoBI= Name: res/drawable-xhdpi-v4/ic_send_sms_insecure_dark.png SHA1-Digest: 65hZGruTDS+kO2Ilh6udEE4Hsvk= Name: ws/com/google/android/mms/pdu/package.html SHA1-Digest: zW3J5ZXNfuDLZKkBuTBJYYW1zpk= Name: res/drawable-xhdpi-v4/ic_emoji_recents_normal_dark.png SHA1-Digest: f15CLkwxERZfMzNTRSFCSMtMMvI= Name: res/drawable-mdpi-v4/notify_panel_notification_icon_bg.png SHA1-Digest: cz2cTpSbxUR34pkCMo3M7a+mSXk= Name: res/drawable-xxhdpi-v4/ic_emoji_emoticons_normal_dark.png SHA1-Digest: sJUQ6MkVAwKpoBNLjQycrSP/miQ= Name: res/drawable-xhdpi-v4/divet_lower_right_light.png SHA1-Digest: ZlxiUipE7U2T0Z+xbqG5Lm/SrvA= Name: res/drawable-xhdpi-v4/ic_recurrence_bubble_disabled.png SHA1-Digest: /uf5Hf8/xPVdDiTbEWAZHk3ePaI= Name: res/drawable-xxhdpi-v4/ic_forum_black_32dp.png SHA1-Digest: 6VPn4QNKWtzR9AMceQXX1KfZnlo= Name: res/drawable-v23/abc_control_background_material.xml SHA1-Digest: qeTahfTuJMcVEUOeqjCyDaNa8uU= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_679 SHA1-Digest: 6/VdOl5YznGBEI9ms/gjN2EAmLM= Name: res/drawable-hdpi-v4/ic_backspace_grey600_24dp.png SHA1-Digest: 9j5TixAtozyqz2GxHu4Q+CybMhA= Name: res/drawable-hdpi-v4/notification_bg_normal_pressed.9.png SHA1-Digest: TZoq5fn2jjj23LAmyukLzy8TVPA= Name: res/layout/time_zone_filter_item.xml SHA1-Digest: 8GhtA8tcunJ4HJU+H5F5gv6PaQE= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_676 SHA1-Digest: 1XvAC59RhdvXt568Lp9q68Lo95M= Name: res/drawable/conversation_list_divider_shape.xml SHA1-Digest: Wz32SpctHXyVcpEtsfCh8vOI5QU= Name: res/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_000.png SHA1-Digest: jniuuw+ps9CtTIC7MeCedJBG1rs= Name: res/layout/select_dialog_singlechoice_material.xml SHA1-Digest: qhKkBqKT2hoMRK2usuQjUCCU5hA= Name: res/layout/conversation_fragment.xml SHA1-Digest: NlDn3tD3Js21YwVeWX3jdjJryHg= Name: res/drawable-xxhdpi-v4/ic_add_white_24dp.png SHA1-Digest: 03jXVNGWPMsGK3Xg3HWpiEtRhzc= Name: res/xml/preferences_app_protection.xml SHA1-Digest: /04M6lZaLCP/MC4yaLzm3ZTXm2g= Name: res/color/abc_primary_text_material_light.xml SHA1-Digest: ggJcJQnCkCLHvTmVDR7b7H8fPPk= Name: res/drawable-hdpi-v4/ic_circle_fill_white_48dp.png SHA1-Digest: +7XseN+JhezFYkkaQ6oRB5Ov5PM= Name: res/drawable-xhdpi-v4/ic_visibility_white_24dp.png SHA1-Digest: BIVvglNqIXn7Q5OjqW5+wUSfiEM= Name: res/drawable-v21/conversation_list_item_read_background_dark.xml SHA1-Digest: hcx2wJmCBLgC9qTvdtq5xWJA1UA= Name: res/drawable-xhdpi-v4/transfer_controls_background.9.png SHA1-Digest: 8DAsQxUNQf9+eMV1afbdEo/rFik= Name: res/drawable-v11/emoji_category_places_dark.xml SHA1-Digest: cQtDGjtc28B+LSswR0p8fsxe4MA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZA SHA1-Digest: O/3iDLWPPvW2HI1gEX7lRiOIRco= Name: res/drawable-xxhdpi-v4/ic_error_red_24dp.png SHA1-Digest: xWMRRZlbSsjgAbHJZNRmvWrw+44= Name: res/drawable-mdpi-v4/switch_thumb_holo_light_v2.9.png SHA1-Digest: 7aafjURul6zc7RhhsHx7QCLPozc= Name: res/drawable-xxhdpi-v4/ic_emoji_objects_normal_light.png SHA1-Digest: 0RCvcHCYcO+99fHXT0n+nqryk00= Name: res/drawable-hdpi-v11/icon_cached.png SHA1-Digest: ag2zVjSIyL3kLU9QVj0s7SbWNNo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_YE SHA1-Digest: uTpmi/ET3QJvZyW1bX1KTGol+c8= Name: res/drawable-hdpi-v4/spinner_disabled_holo_light.9.png SHA1-Digest: MGzyk0nLOAXBSKZz0u82JCFSpS8= Name: res/drawable-xhdpi-v4/ic_emoji_nature_normal_light.png SHA1-Digest: 6AUNAyK5WVkf8o/aoXqgRhFUYuM= Name: res/drawable-mdpi-v4/abc_list_selector_disabled_holo_dark.9.png SHA1-Digest: +bjkZfnp7jH8HvA5wzYQ85O04Ic= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZW SHA1-Digest: P+mZTYQAfq5OKUqLR5WHleClnxI= Name: res/drawable/abc_switch_thumb_material.xml SHA1-Digest: sujPDGksEdg29cR87ymiy/LIS08= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_800 SHA1-Digest: Q+v2QtFpRmcNgV/ghp33lLyeLIY= Name: res/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png SHA1-Digest: eQ8hrqPRD0qhhaJWghhXuxRIxBA= Name: res/drawable-hdpi-v4/ic_emoji_recents_activated_light.png SHA1-Digest: boHWHgmHYtW3tdcX4PjGYrHGqjQ= Name: res/drawable/psts_background_tab.xml SHA1-Digest: vOj1M+G3LYJopTV3rVV2ec0Pz7A= Name: res/layout-v16/transport_selection_list_item.xml SHA1-Digest: C+Xa1oepxsEmQ+/BrYjp6zA1THk= Name: res/drawable-xxhdpi-v4/actionbar_icon_holo_dark.png SHA1-Digest: SBNfDOIoGi7vrQ81c1aC8nNoTXI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_808 SHA1-Digest: LR5DzJ+FtlDUO7u4/hR2FS3DAv0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM SHA1-Digest: fo3+ic1IYN/khzc8yHNMPsXcYVc= Name: res/layout/support_simple_spinner_dropdown_item.xml SHA1-Digest: SzOzDLQ2fKoah8SIlmI92JurR+g= Name: org/spongycastle/x509/CertPathReviewerMessages_de.properties SHA1-Digest: 5WleEyCLesz39ayL3AH9lOktT8k= Name: res/drawable-xxhdpi-v4/ic_emoji_emoticons_activated_dark.png SHA1-Digest: p+ssPoFtPIXsYWDXXVbkL9WWpAU= Name: res/drawable-hdpi-v4/icon_dialog.png SHA1-Digest: 8dZkVmxxSs1WycNGs/t5UCk4WQk= Name: res/drawable-xhdpi-v4/ic_account_box_light.png SHA1-Digest: xaixNvIFNKRQlbn8rUGqt1IJJzk= Name: res/drawable-mdpi-v4/ic_message_white.png SHA1-Digest: ZSTTg4aXgzA9uh//DTGBNWrxHu0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_WS SHA1-Digest: WEt+4epzNo4d8ROnBGfRpvsLQHA= Name: res/menu/conversation_context.xml SHA1-Digest: AaGrOcRy8OqLuFMB0Ecc1nET/LY= Name: res/color-v11/abc_hint_foreground_material_dark.xml SHA1-Digest: iAs9P3JrooTyCSdiERlRSPflh7A= Name: res/drawable-xxhdpi-v4/ic_audio_dark.png SHA1-Digest: F1wOc1YlSlBMbaB3zSjZN44wyYk= Name: res/drawable-xxhdpi-v4/switch_bg_holo_light.9.png SHA1-Digest: FgKH/FinWMkRgm9Fn4PzClBvwZM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_WF SHA1-Digest: KiLYxnJzp+EeAhl5k+uMqNG6DRs= Name: res/drawable-hdpi-v4/ic_video_light.png SHA1-Digest: jxTLhK8yR3OeqUxxJ8LsnApV0cY= Name: res/drawable-hdpi-v4/icon_cached.png SHA1-Digest: XkOZtQyk5wSpIySmc226NFqlRR8= Name: res/drawable-hdpi-v4/spinner_default_holo_light.9.png SHA1-Digest: /GXGxE5W4VqGLNi5sm4OsXq19RM= Name: res/drawable-hdpi-v4/ic_warning_dark.png SHA1-Digest: z4qMFoNq7AKIJHQmoN85DgOzKfE= Name: res/drawable-hdpi-v4/ic_unlocked_white_24dp.png SHA1-Digest: HClEuF7VisWvnoTUktxxSSQhaPo= Name: res/drawable-xxxhdpi-v4/ic_dialpad_white_24dp.png SHA1-Digest: QNe5Y7PSFHDxqSF/kcdXdYen/jY= Name: res/drawable-xxhdpi-v19/switch_thumb_pressed_holo_light.9.png SHA1-Digest: c+lEvuW/Yx/kDPuWk7ZqybxGgAA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VI SHA1-Digest: 1LjKCQQJgyuMAMO1iYig3jWtPSs= Name: res/drawable-xhdpi-v4/ic_block_grey600_18dp.png SHA1-Digest: 5mqVsrUSSLrWE4LWBwReJDduvCE= Name: res/drawable-xxhdpi-v4/ic_emoji_nature_activated_light.png SHA1-Digest: YfP1tgpbi+G7epjImNMhiByBkhE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VG SHA1-Digest: +vAhsOiiHugHwBSbJI4edUWsDr0= Name: res/drawable-hdpi-v4/abc_list_selector_disabled_holo_dark.9.png SHA1-Digest: h7hNXJrcbvKMv9bbGrTrvd0dOgs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VU SHA1-Digest: 2l35bRpp9XiNPbbb+0pHyvOO21Y= Name: assets/emoji_nature.png SHA1-Digest: UzSuz2fUlzCNe6CCmT2tNzzmzVs= Name: res/layout/expiration_picker_dialog.xml SHA1-Digest: cSNAbfN6bagC7X6qIr5kE0j17nM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VN SHA1-Digest: GrWHYUO3Cev7KpuTRQB5z8HW1f4= Name: res/drawable-hdpi-v4/ic_info_outline_white_24dp.png SHA1-Digest: pM6XYFrBDZyJGDCo7FzObXJ4Fy8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_UZ SHA1-Digest: NkYYZfkGo/K8LO99CQgOlCszblk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_UY SHA1-Digest: ONUgqpO4eHKCbc4I9lt0hnXcTZ0= Name: res/drawable-mdpi-v4/ic_emoji_recents_activated_light.png SHA1-Digest: oB3akohAY54ZwWkalbMRsXtYJ+U= Name: res/drawable-mdpi-v4/ic_select_all_white_24dp.png SHA1-Digest: 7ivqkSaxLcomol/I2K5TOieuxZU= Name: res/drawable-xhdpi-v4/ic_recurrence_bubble_outline.png SHA1-Digest: 6nGJjRcbSAQJ+oBqTB9ru86djWM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VC SHA1-Digest: OXIzY/KjvYdZT/LXQBAoqp7pamY= Name: res/drawable/abc_edit_text_material.xml SHA1-Digest: Kcap9wHIg3pDdpEtot8/QDSYxXI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VE SHA1-Digest: oG66iy9xkV2aj1MY/szR3pj8zE0= Name: res/drawable-mdpi-v4/ic_visibility_off_white_24dp.png SHA1-Digest: bR7uL9bUTt+rLUgg+5lpRftVxgA= Name: res/layout/abc_action_bar_view_list_nav_layout.xml SHA1-Digest: KWG1Bk0+gHtAKZtYRzqAkVrkAmA= Name: res/drawable-xxxhdpi-v4/abc_switch_track_mtrl_alpha.9.png SHA1-Digest: NdBd5wlMLy/yNmcs71lpwiAvUZ8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VA SHA1-Digest: gvuxOs/muxRZu5a4PRHrPdz7+Wk= Name: res/drawable-mdpi-v4/ic_emoji_nature_normal_light.png SHA1-Digest: ChFdBSWimcTj6jLaIGmNhUjaek4= Name: res/drawable-xhdpi-v4/divet_lower_right_dark.png SHA1-Digest: 5vtzSsOWxrOZPIbZK7ymPuLRTrI= Name: res/drawable-hdpi-v4/ic_video_dark.png SHA1-Digest: kaJwgqosYawCWKdXN6jELspjBmQ= Name: res/layout-v17/select_dialog_singlechoice_material.xml SHA1-Digest: BjU8OwKuERrbzVtBQKEjPAd4R+c= Name: res/drawable-hdpi-v4/ic_emoji_flags_activated_dark.png SHA1-Digest: gIY9sjCgyZyEH3Q+xIqsz4CoLwg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_UG SHA1-Digest: ammP0D/tLcrgu7hqA70yejT+V0Y= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_US SHA1-Digest: 0jE/PFzhpjHEgp+Pmo0sBinBYSg= Name: res/drawable-xhdpi-v4/ic_brightness_6_black.png SHA1-Digest: zpe/yLQkStMLoIK4EePIruR3x5U= Name: res/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.p ng SHA1-Digest: MCXQ3UO/ZjROJv+Q9oQkLeDNszE= Name: res/color/abc_tint_btn_checkable.xml SHA1-Digest: 8u8Tkxy9mJwO/fhpdihKSt6YMxs= Name: res/drawable/share_list_divider_shape_dark.xml SHA1-Digest: MrLZ34H0lbSocNuprow3bYuFs34= Name: res/drawable-hdpi-v4/notification_bg_normal.9.png SHA1-Digest: e39HWYSRdaO+/NhxvCOzRk3gTPg= Name: res/drawable-mdpi-v4/ic_textsms_grey_32dp.png SHA1-Digest: GutqMf3V/mo5rCoh6b/6RKJOatE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_US SHA1-Digest: Co+5n+uLZ3R2GbAfhiLsCy3lXnc= Name: res/drawable-hdpi-v4/ic_arrow_forward_light.png SHA1-Digest: F7mFOvujVqkYNv9201+kMLbpnjY= Name: res/drawable/abc_btn_default_mtrl_shape.xml SHA1-Digest: si9J2ga8fSgrnHUBNteE65S6TvA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UY SHA1-Digest: OHJSVIjgb3PkN3QctmplPc8uJ9w= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UZ SHA1-Digest: 0s3VgLWiElGLZPndvLU2QydhMxI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_UA SHA1-Digest: mCqgyKIiKl2VZcjZsBnWTjipBEc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TV SHA1-Digest: 2nS3XZ4w3DR065o1M/M/JsUM7ok= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TW SHA1-Digest: GVxJianmDusEC/HGf+VGoksOHP0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TT SHA1-Digest: OX+mha4+0Q+/ayJpV68aaht5DJ0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TZ SHA1-Digest: T30rgRQOY5w9wvhUTHpOSdju6Yg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC SHA1-Digest: 0FQA2XuDN5Xp9xp2ulaenWGj0Fk= Name: res/layout/verify_identity_activity.xml SHA1-Digest: 4DkQ6qCV5V+d0tpZ8oMUdT2OS0Y= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VA SHA1-Digest: i9QWJCLFZdmNZlXnq4Sc3iWpfho= Name: res/drawable-xxhdpi-v4/ic_visibility_grey600_24dp.png SHA1-Digest: ElbVxbxM8SCqTcTX9GZlAwmdzyY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VG SHA1-Digest: jMJ1+TYrOk+FIDOyezSCgEBBlAA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TO SHA1-Digest: 8C2NrVJjiJ2VIe6e2SG9HRbUpeY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TN SHA1-Digest: FED4CTFMsRktTSDFVozGKFfgHC8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TM SHA1-Digest: wRKs89xVZ3eszAjOGyW6biIB59k= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VE SHA1-Digest: YRMBRAOz+UrjXKnZn89Vv2xzlOg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TL SHA1-Digest: 02qXcniA01s8q0mCsBvCAV66nBo= Name: res/drawable-hdpi-v4/ic_menu_lock_dark.png SHA1-Digest: OLS0Y7LkHAjTgKke4t+ssbaqi1I= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TR SHA1-Digest: It6YpUXvKTZrvmvKnlrtkaH94lQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VI SHA1-Digest: REBe+ajxqSZL9NxThXUUem3jnhg= Name: res/drawable-sw600dp-mdpi-v13/ic_backspace_normal_dark.png SHA1-Digest: yOibY2yAUSDo2MVgX9+sZmBY1nQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TG SHA1-Digest: OOqLD1pizqDxzLCgvpj7hP/B3Ls= Name: res/anim/abc_slide_in_bottom.xml SHA1-Digest: ZliTihZ+8kHBA4SfvPIPI00Y7uE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN SHA1-Digest: BGrGk+xkmzXMOUHG2ROAbBMZ6Yc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TD SHA1-Digest: fXGWbLcwO2uUDV3/v65+7z+ydSI= Name: res/drawable-hdpi-v4/check_dark.png SHA1-Digest: OF10knMqMePug2wsSUoTZ6zZPuQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TJ SHA1-Digest: sVzKUygsCtLduYavdSUOyP+Jafw= Name: res/drawable/abc_textfield_search_material.xml SHA1-Digest: stH8NpmjaXc5dKXq4DDXvkOo1rI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TH SHA1-Digest: to5ZNkVbbaTn9dWFGsdYNwYZUsk= Name: res/drawable-xxhdpi-v4/ic_lock_light.png SHA1-Digest: zf4j7GjJkOaQL/LXahXOCd8Qcto= Name: res/drawable-mdpi-v4/ic_search_holo_light.png SHA1-Digest: IwmnK2HQagqd/ZKXegQEzdknk+Q= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VU SHA1-Digest: idsA4gg5WlN5iTnrErnMvnumtyI= Name: res/drawable-v21/abc_ratingbar_material.xml SHA1-Digest: rf6f8HRUlLAVKAAEFPxwQP5tJB4= Name: res/drawable-mdpi-v4/textfield_activated_holo_light.9.png SHA1-Digest: CSfVZiTZ8M4gHRjhPdVvKlLuXxE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TC SHA1-Digest: h+VNblfdfvL08K4jtRyzB1SniKE= Name: res/layout/alert_view.xml SHA1-Digest: gHWVI8pn6LJxYjY/B5qPNjEDAK0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ST SHA1-Digest: Fh2rqEApU4sgPD+1dLHzfQW0Jlo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SV SHA1-Digest: NW7eQYaa6OCN5JxFIIcMXiUCkfg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SX SHA1-Digest: qPJl1K9ZBaGHWAbdxiA1XFP1nhQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SY SHA1-Digest: pxJxXcMSf7F47SEwPXqXfT7Of9g= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SZ SHA1-Digest: HXFHOSrj8KkBc9h+CUe97BcSQL8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SL SHA1-Digest: P/qdv4quNvaRviFdLBcbuaqT7H0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_WF SHA1-Digest: YH2qvLQxCEFNdK3scMbqJ1rLPPE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SK SHA1-Digest: sfxakNdqV0E1+2FJQAaJVY7qBaM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SN SHA1-Digest: S1dW2CSdGrAqy9X2PaSCEadYfV4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SM SHA1-Digest: 9LpXm9Hhi0DHNDXZxoZmtMiZXZo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SO SHA1-Digest: kgpJUydtRlnt+/5S1EKn6EGM5jU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SR SHA1-Digest: CgemZGqbkZ1IkPlJdSZuOB5vs4k= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SD SHA1-Digest: FMCY1LyqhOjb1Ji7UBJiSFhW9b8= Name: res/drawable-xhdpi-v4/ic_backspace_normal_dark.png SHA1-Digest: AGrzhqB0uojxu55l0U6P3vce3So= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SC SHA1-Digest: 4A+CKfsEVbCeov+6aFk2zY9twcY= Name: res/drawable-xhdpi-v4/ic_check_dark_disabled.png SHA1-Digest: c9TvWCMataZvt30VdBp4tsgJl0A= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SE SHA1-Digest: uafcIzQdY3gb3eq5lMhvKBc4krw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SH SHA1-Digest: qwfHH84D0ixUkP6FbEog8mNRe50= Name: res/layout/log_submit_activity.xml SHA1-Digest: mFxIQHJrxfWuKHCZZYnmdr10TFg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SG SHA1-Digest: dqZElj+XoAesFoVwrH5/RGTNpfM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SJ SHA1-Digest: Dy5q310EumwWHG7yi/9247XEwlA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_WS SHA1-Digest: mkxRWWtguUpaF6vYRb6vVK8FhaM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SI SHA1-Digest: XZCXpndTs5uKYlFqYZNUWvJ/9V4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SA SHA1-Digest: dSNaPvwq9X3O12zoD0La+ED1U5U= Name: res/drawable-mdpi-v4/ic_emoji_symbols_activated_dark.png SHA1-Digest: gi9eHLJ2IcuCuAP5FyZvLT0e9Yc= Name: res/drawable/notify_panel_notification_icon_bg_tile.xml SHA1-Digest: 728zuKsXYlpvrBKue1cT2+FVRU8= Name: res/layout-v11/conversation_activity.xml SHA1-Digest: a4IfYX1vcDiV/pqSYJahTFTCJeo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SB SHA1-Digest: +Hu3Krmmlzl4N3wTcxEY9rvo0Po= Name: res/drawable-hdpi-v4/actionbar_icon_holo_dark.png SHA1-Digest: 3LtRBykdTucmKV3dkReQtHb+vlY= Name: res/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png SHA1-Digest: wTxntWArKB7sDc4M27U+PpjZhyU= Name: res/drawable-xxhdpi-v4/ic_emoji_emoticons_activated_light.png SHA1-Digest: 3Iw4yaQ6kcuNfC0TE9JRZ3iqC6w= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RW SHA1-Digest: 9v2nu80N7tOJxq51ZS9SUMzXyy0= Name: res/drawable-ldrtl-mdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: 1dQmPH4BF7Otx7V4njYiASwi5/k= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RU SHA1-Digest: KLS5yyTbZVBMs07/kzbMl9FDcy0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RS SHA1-Digest: Gp5fY4V+3mepr0fZAycPZAv5kI4= Name: res/drawable-hdpi-v4/ic_recurrence_bubble_outline_disabled.png SHA1-Digest: NTDdpWYLs7t9Osus1VojraeDZrU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RO SHA1-Digest: 7pkIrynGenMlOimp1uNOzx4a9ME= Name: res/drawable-hdpi-v4/ic_send_push.png SHA1-Digest: fgtuvJ9AGUtDw5cbcZIfQilMQb4= Name: res/drawable-ldrtl-xxhdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: PqzD1Bva41x/4FJI5xe2uDeGmiE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RE SHA1-Digest: 8BDvFUhSb3GswgQiUCYWtWx3CEU= Name: res/drawable/abc_seekbar_tick_mark_material.xml SHA1-Digest: DuFih8Np+ruXlGXOIY3g382yoTU= Name: res/drawable-hdpi-v4/ic_textsms_grey_32dp.png SHA1-Digest: iwBnh2xlTCgXXMytlUgYStjLpmU= Name: res/drawable-xxhdpi-v4/ic_emoji_flags_activated_light.png SHA1-Digest: 7HAHnpuwQT+utT89EKz2N/g7t3c= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_870 SHA1-Digest: wrVTblBRAtogCy0iVfpXEH6KlBQ= Name: res/drawable-xhdpi-v4/ic_info_outline_dark.png SHA1-Digest: /S7xBBhg1FIWb4g4lwlhLdCerxE= Name: res/drawable-xxhdpi-v4/ic_unarchive_white_24dp.png SHA1-Digest: 76V7Hze7OYOCHtxTFbFp6y2qvCw= Name: res/drawable-v11/emoji_category_places_light.xml SHA1-Digest: 0oWB2rwfMOzZwePPI6yYOKPyde8= Name: res/drawable-hdpi-v4/ic_mood_grey600_24dp.png SHA1-Digest: yyAr/jsi2L76IozhIsSVcPJ/gVo= Name: res/drawable-xxxhdpi-v4/ic_textsms_black_32dp.png SHA1-Digest: 1LjX+QtnTvVgfcv5Rj7Vu66qJbk= Name: res/drawable-xxxhdpi-v4/design_ic_visibility_off.png SHA1-Digest: zSrspL1HfRffZw4aQdBEi0VyTH8= Name: res/layout/share_fragment.xml SHA1-Digest: tSSIU/XwofYsCDc/RBo+PvGxjPA= Name: res/drawable-xxhdpi-v4/abc_list_longpressed_holo.9.png SHA1-Digest: VJa6PrhxyIRS2huzDuIN1KH+I2c= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_YE SHA1-Digest: iWn4VA5oTnB/1SJio1WmtTzxIVA= Name: res/drawable/abc_ratingbar_indicator_material.xml SHA1-Digest: jSCetwmEsQWxASeYyjO7YhmGUG0= Name: res/drawable-hdpi-v4/ic_keyboard_white_24dp.png SHA1-Digest: gm7lHGB1QYwGm36NdoEeWP40kYI= Name: res/drawable-hdpi-v4/textfield_disabled_focused_holo_light.9.png SHA1-Digest: GAqpkknnxMFqolFn7Q0O1q26ziE= Name: res/drawable-xxhdpi-v4/ic_emoji_places_activated_dark.png SHA1-Digest: kBQvXnVBBQAXrqJsZnOaqMHK60M= Name: res/layout-v13/message_details_header.xml SHA1-Digest: naq0XxW2Md+akCHCs+/SOYtFnQI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_YT SHA1-Digest: ogcQkkoCGMY8nCyJK4aMLc8rhgk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_878 SHA1-Digest: ru2D0tMTr43HNk9n8YNkwk5hGmc= Name: res/drawable-xhdpi-v4/abc_text_select_handle_right_mtrl_light.pn g SHA1-Digest: 9Xk7OPEfyHSOAHCD7Mwan5cJXnA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_QA SHA1-Digest: slbTHMPLw/mmyQ2E0xEPrlrO4/4= Name: res/drawable-xxhdpi-v4/textfield_focused_holo_light.9.png SHA1-Digest: yTySMaFvSlprEgpEyEgjuVbWIFM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PA SHA1-Digest: fCZKN8Ehp845RUn/9sjnTx4rhxw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_883 SHA1-Digest: X2TcGpqy0IDrFCgWXalvi/FxY4w= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_882 SHA1-Digest: 3fDO2V9ovqhY9kDKG5wczXGwaks= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PE SHA1-Digest: tvR2SBCPV/svYtRXJcjnaVOw4Qs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_888 SHA1-Digest: +nKjS9d1/WYwuDLO7dQS2W5u25Y= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PF SHA1-Digest: /tlLAeslldW1EMfh0/r0nmtik2o= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RO SHA1-Digest: s9CR+P7gvF4BQHm2xZ6+Q8n+nTY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PG SHA1-Digest: PqaHYtXnRREfBVJdJtQGthBM6Mk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PH SHA1-Digest: //vvt5FSIATQwkpUj8jsLjb4k5Q= Name: res/drawable-xhdpi-v4/icon_lock.png SHA1-Digest: x9v02bq0ywac6jle/lMC9N2f8xQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PK SHA1-Digest: 6PpXjrxYrpwZm86B4lrad9K0Tjk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PL SHA1-Digest: 9C3SaoX/Y6RhlzaZ3vZUrlZYvao= Name: res/drawable-xhdpi-v4/abc_ic_star_black_16dp.png SHA1-Digest: GT/QfWDQh959gQPTphPPRr+uGOA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RE SHA1-Digest: lN4hO/zfjPGWlxlXPt1nQG4QJZ0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PM SHA1-Digest: CwesdCPcB4nCSn+T+YSoOMSlyME= Name: res/drawable-mdpi-v4/switch_bg_disabled_holo_light.9.png SHA1-Digest: BhD8bo9CPDyMD8yAOdeT+l8P5Jk= Name: res/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.pn g SHA1-Digest: WqxwEUexvYh0cT/zvmtdxmv8z34= Name: res/drawable-mdpi-v4/transfer_controls_background.9.png SHA1-Digest: Lvtopp/2tRzPP+kXqYiM9od0lTc= Name: res/layout/abc_expanded_menu_layout.xml SHA1-Digest: +K8i1UxIGMVynpvxcjq1tU6AL8s= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PR SHA1-Digest: ff7WU4GqkjoPRUAuysmgqkwvTfA= Name: res/layout/conversation_activity.xml SHA1-Digest: VAyoHr5vzJv9wm/D6nJ/RgnQVM8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PT SHA1-Digest: 0yfhznPNvG4b4UITlM9tJsOwIys= Name: res/drawable-mdpi-v4/abc_cab_background_top_mtrl_alpha.9.png SHA1-Digest: 6eRtpYyE2B45gWd2aZtCG4kO5FM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PW SHA1-Digest: czrqNkXCl59UCFT6eIBMD5X4yB8= Name: res/drawable-hdpi-v4/abc_list_focused_holo.9.png SHA1-Digest: zND8CPcT8wBLOji5D5ZGNvi5kR8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PY SHA1-Digest: HBYBVp4jk/ST4eBs8jk7XDqpUoM= Name: res/layout/emoji_grid_layout.xml SHA1-Digest: NnZDJdnyddzo7hWV77sEuQm1Enk= Name: res/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png SHA1-Digest: rG5iJ8LJqs0d2oExcr38IP+z/7s= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_881 SHA1-Digest: adrqPFT39BGEc9L6ihSloFCvqrU= Name: res/layout/abc_alert_dialog_button_bar_material.xml SHA1-Digest: U7wENYGNxvfAavK6fN4rpU8GLgI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SK SHA1-Digest: OpWPnEd6/Jmlmpv8WaU3DT4LItA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SL SHA1-Digest: xRAKr0QrWNRv0tF/LfsWZ2Hq/sM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SI SHA1-Digest: GVkOdITub41bNG8Fig/9vPSNo2k= Name: res/drawable-hdpi-v4/divet_lower_right_light.png SHA1-Digest: hcKGWDmNLo452sGyK4oSdDMB/+E= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SJ SHA1-Digest: Qh2tQvrXM3wEadaOQ7twcRlMF74= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SO SHA1-Digest: Yz0C8pi4T1L56Nlm3TVwaGLjyQc= Name: res/layout/abc_dialog_title_material.xml SHA1-Digest: jS6bbgBynF3zebyNioiwNxGkv7Y= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SM SHA1-Digest: Sy0eWRdE16v7G2ETphVPHohO/Dc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SN SHA1-Digest: T9THj+HSTo2G8LZHVtDZy2ZH6OU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SC SHA1-Digest: 69OaYaEUAquIxWPBTMT96D3mFgs= Name: res/drawable-xxhdpi-v4/ic_backspace_grey600_24dp.png SHA1-Digest: uwFPcHYZCGXqW5sIGeYIEnS0wa4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SD SHA1-Digest: sPYOURylxFZznupFTubdXbaMb2o= Name: res/drawable-mdpi-v4/ic_unlocked_white_24dp.png SHA1-Digest: Pw8CS4BIJ+QJuZGGUxyPnuuWaxg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA SHA1-Digest: RvkQygRBDVcw1a7hjEYX88hwfMA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SB SHA1-Digest: ahGNI4eO1DCgd1DUDdain8akS5A= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_OM SHA1-Digest: Qqh5G0srcW9p2rsj7xSDXf2geNc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG SHA1-Digest: AAObEaJer/GPWCRYsABtWl6JbnM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SH SHA1-Digest: d4MFXmziQLRwnIOBDrApxGXs6p0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE SHA1-Digest: whEALd1LVuwaUn4et+r9hlsMiEM= Name: res/menu/conversation_send_drafts.xml SHA1-Digest: wiaYJJqiQjiNcqPbv6uNj6hnVJo= Name: res/drawable-hdpi-v4/ic_attach_grey600_24dp.png SHA1-Digest: nazUEJrIvYZ9UJHATYmPIOkBU6E= Name: res/drawable-xhdpi-v4/ic_emoji_people_normal_light.png SHA1-Digest: AaSPvsfgBVFXQjc/6zd5sSaehQ4= Name: res/drawable/emoji_category_flags_dark.xml SHA1-Digest: AgeTyeBmCPuLJuPBxfjtUWAnQjY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RS SHA1-Digest: fceCOonAoNK2vZg1X3HFpazjNwQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RW SHA1-Digest: diwT4/eaFAC0RrngvvaAorhEyRk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RU SHA1-Digest: SjLiYb5elyZp4CxuG/jPZiGkAvU= Name: res/drawable-ldrtl-hdpi-v17/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: StjC3BA1LtHVLp7GTDic4k0PU08= Name: res/drawable-xxhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png SHA1-Digest: CzvvFFc7BaWc8x/Y+tvpZvFkY9w= Name: res/drawable-hdpi-v4/ic_app_protection_gray.png SHA1-Digest: U6eZmhJFhi6M4ifbdNv4p2+q+m4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TN SHA1-Digest: sRM3isN8XNXBUejDL/3XVmi7CP0= Name: res/drawable-hdpi-v4/ic_emoji_symbols_normal_light.png SHA1-Digest: DcAYFKgBBakJIAriXXOZQ/swcoI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NC SHA1-Digest: 3Ha+QOSOso/ZuUnEndSttTCui2I= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TO SHA1-Digest: dE14YSWn1Q82IuAx7bz59IzeUJE= Name: res/drawable-xhdpi-v4/ic_advanced_black.png SHA1-Digest: uKoepOzDCewgO7hPUSxctUNm9a0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NE SHA1-Digest: tszF9OIdzcNjcSHbzXrfTPqwfd0= Name: res/layout/time_picker_dialog.xml SHA1-Digest: oPJIQ5mohdAVRZl2D0jhDmbx1ns= Name: res/drawable-xxhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png SHA1-Digest: TLfjxp5bknlrmh6zJTSYD2AfmTo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TJ SHA1-Digest: YnI7JHZGkgVea6QH+ndC7RXc5t8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TK SHA1-Digest: Depjsuzhk7mtPoM47CDzUSt6AHE= Name: res/drawable-xhdpi-v4/spinner_disabled_holo_light.9.png SHA1-Digest: 90BefocA3jktdxbeMYf9CMCWV3w= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TL SHA1-Digest: E1XJpx2P54sMuwGSGIjqbyqPB9s= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TM SHA1-Digest: +Rt8RtJkczgUqGlsGrhLJCqOfYg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NA SHA1-Digest: 9G6kvgsYzJojWoiCuKs4LFfCQbA= Name: res/drawable-ldrtl-xxxhdpi-v17/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: RlASjFlsAOIfgzOVaMJeKCTDJ3o= Name: res/drawable-hdpi-v4/spinner_focused_holo_light.9.png SHA1-Digest: 9+5viI+b67liCPiPkELWte9HLXc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG SHA1-Digest: xoRihj6KFFTCZEu2DwjE9wkwjCU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH SHA1-Digest: 4Y+fNQiUYoj/adZKdK6FuT4WFKw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NL SHA1-Digest: L481Tp19PmS40cOvmGOKjpiEZVs= Name: res/layout-v17/abc_dialog_title_material.xml SHA1-Digest: iO2ZwhbDlmITcxVKw57R4GTbcW8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NF SHA1-Digest: IdRiuvAntLUe8r8EQiIk2dtb7bo= Name: res/drawable-xhdpi-v4/ic_group_white_24dp.png SHA1-Digest: v+akTbrOyt63fqnB2m8icaXOQ9A= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NG SHA1-Digest: 2nRUBrCNwLf9EEuCsttbqsVYO5Y= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC SHA1-Digest: GxO1H9LUjukADYAq3al7uBln2WQ= Name: res/drawable-mdpi-v4/ic_backspace_disabled_light.png SHA1-Digest: 8UicXzhNTwHx9Z6gKpFQy8Nq+pQ= Name: res/drawable-xhdpi-v4/notify_panel_notification_icon_bg.png SHA1-Digest: cuJ+cwlm5QO6frAFAjbS9w6zhJ4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TD SHA1-Digest: l+JUZji7wvWwRHePO5f6TBqB3Hk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NI SHA1-Digest: rKpi204I76lvISSARcMzH0LUASI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NR SHA1-Digest: tmbcQ1088LZxiFMYWOqzJ7JECIE= Name: res/drawable-hdpi-v4/ic_volume_up_light.png SHA1-Digest: AmrZQKKPy5VxiBOPfjNXb/eoMiw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NU SHA1-Digest: Krbxcr6/EQRZATYij5QxbMA0M00= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TA SHA1-Digest: zxdsRgGax6ubk8hnD3UU1Ruk808= Name: res/drawable-hdpi-v4/ic_send_sms_insecure.png SHA1-Digest: ZRQWrB//EkYHtK8Cif4HEouXWeI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SZ SHA1-Digest: y7fpRnOAUa5FZ2J07+kj+xlYZtk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NO SHA1-Digest: YduDYCJDzKt3jB1F5FzjA8CRfPE= Name: res/drawable-xhdpi-v4/ic_emoji_people_activated_light.png SHA1-Digest: ySVeYNO7XxKPjLiwanuv5kUKnKM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SY SHA1-Digest: 51xhmb8BiQjfjHf6fUfxEy6ARiA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NP SHA1-Digest: 0eDpSvIShOUr9yJLkxJBQ3zhJrk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SV SHA1-Digest: APTfTay2dBhczPvWxHVungEgdsI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NZ SHA1-Digest: cqczT+ATmJlNQNnCYDCwcK7Bz6A= Name: res/drawable-hdpi-v4/ic_lock_white_18dp.png SHA1-Digest: SadMiv0GE5LgIJr778HH3KfimtI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX SHA1-Digest: u6hdteFIcfA4Qh6VU1ZTlOmM8Gc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SR SHA1-Digest: QRN9HaIk98/GKlRjpnAs35W3AAY= Name: res/drawable/unread_widget_icon.xml SHA1-Digest: iJJBohPJXzhBScSRFgh6D9b+hpI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ST SHA1-Digest: 2R6NCIAJ8vXbvobZaNkGyw4Fwlk= Name: res/animator-v11/scale_with_alpha.xml SHA1-Digest: VL4imnI1LOFLVsR92Vrab3fF2tE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SS SHA1-Digest: qDHuPDISr9FHIMONMSIrxIlL0xQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MC SHA1-Digest: hGXW2RGjkZnTJzSXIYWADTf7Q7E= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MD SHA1-Digest: xPoHwRDHL6SrjfKT6+g3sNDP1L8= Name: res/layout-v16/contact_selection_list_item.xml SHA1-Digest: gaxyPsb4J5av/qTTgQvisFr9004= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MA SHA1-Digest: sP8aiUoFfUnDvMa4cZ+KjOpWvJY= Name: res/color/abc_primary_text_disable_only_material_light.xml SHA1-Digest: ha0iBG12VF3cEliu/mL5oLsMBCg= Name: res/drawable-xxhdpi-v4/ic_done_all_white_18dp.png SHA1-Digest: WYGP92FJ9q+BZE8E04vg3vwsD6Q= Name: res/color/abc_hint_foreground_material_dark.xml SHA1-Digest: bwmaFbphxna9+xPcugTHZO8XbEY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MK SHA1-Digest: TgHeYY6bKAkWQ84KO/nME5j9nvk= Name: res/drawable-v11/psts_background_tab.xml SHA1-Digest: JywLhgDxib9atxdXInt/S2REuBU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ML SHA1-Digest: +YIOrG20mY4pRKZoLogFQUq6H0k= Name: res/drawable-xxhdpi-v4/ic_clear_white_24dp.png SHA1-Digest: 3fWIHkcMQ9WUZtG2f/nvgPZi7Vc= Name: res/drawable-xxhdpi-v4/ic_emoji_people_activated_dark.png SHA1-Digest: cuvXxnmfuV3zSYU+7+D4Of1zOnY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG SHA1-Digest: HDRbGR4PZPk+mCDGl2fLERJfNR8= Name: res/drawable-xhdpi-v4/abc_text_select_handle_left_mtrl_dark.png SHA1-Digest: n1RWb4t/Atpj+FOtAslnzwcFcuM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MG SHA1-Digest: 9xXZ4pv619b38rhecTjCvpGsRgY= Name: res/drawable-mdpi-v4/ic_emoji_flags_activated_dark.png SHA1-Digest: 0MDts2HilwKeFl9r2d+WrnJLkSY= Name: res/drawable-mdpi-v4/ic_emoji_emoticons_normal_dark.png SHA1-Digest: WzpU4P6ZqqN18ywBS5qllHIenMA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MH SHA1-Digest: ksr60vxlNQ+S2vGB4wQjQ035rzk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ME SHA1-Digest: C9XunjvBRg674eV5hJicqisH1dA= Name: res/drawable-xhdpi-v4/ic_recurrence_bubble_fill.png SHA1-Digest: gsvxIo7mxvWa3lLcSOklKG4lNLw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MF SHA1-Digest: yHAVCZYdYpFSGFHYZKmru+Lz1Vg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MT SHA1-Digest: ZzGfRKQsOkLMM4rNVZQNdlkhKUw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MS SHA1-Digest: 53kFgC2lWvkg0RQdoSOeZDHGWqI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA SHA1-Digest: pS3fmypW2sTisbd+dNqclx/Hhsk= Name: res/drawable-mdpi-v4/ic_group_grey600_24dp.png SHA1-Digest: NT/pB/ZWCdlgfDjNs1M7YixRR9g= Name: res/drawable-xhdpi-v4/ic_save_white_24dp.png SHA1-Digest: 62+3ju3WbD3do5qYlPVUCFA4ehY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MR SHA1-Digest: BzTGjjro6Xd4KK/3Nd9HDm6Uy9g= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MQ SHA1-Digest: WV7Wb4F0J6tSNdwwkzDdM6iowqw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MP SHA1-Digest: 8JJXIP2nBNzz7H5t4EVdX6K6h58= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MO SHA1-Digest: 7ygX4YP5g568rrukemALUJsQWQ4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MN SHA1-Digest: 2OQsgx6XE9s+gZaHd5es6PyizR0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TZ SHA1-Digest: yb7+qWRrTQ3WMTbdNSafeUjKvSE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MM SHA1-Digest: CgbvC0cEQfEags/cuKxFG+4qQ7I= Name: res/drawable-xxhdpi-v4/ic_play_circle_fill_white_48dp.png SHA1-Digest: zT/J3NHuQMBOslX9Rlc7oUkxZC0= Name: res/drawable-xxhdpi-v4/ic_launch_white_24dp.png SHA1-Digest: S3hKxaIQGJZXm85iAx5LXVvztZo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MZ SHA1-Digest: JaxxJGL+HEM7oBQ1R88V+uJhSS0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TW SHA1-Digest: NfD+3Fztm7C3XxQbq2pBOGqKeJ4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TV SHA1-Digest: Ris17D+/QUvHhHkNr4mTv2xEAGU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MY SHA1-Digest: A61ZRtmC1TVH1R/EQS/6YoBFKLI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MX SHA1-Digest: BcP7PPzqBoh8HeIjfnNqKtg8DcM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MW SHA1-Digest: eFP6Uqji/vptrfcrmraniTYNVdU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT SHA1-Digest: TyGqulSnIfD7kWr7GUtD5bTD1H0= Name: res/drawable-hdpi-v4/ic_emoji_places_normal_dark.png SHA1-Digest: 92ovqQTOA4J0s8cuOIbED129tcA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MV SHA1-Digest: ugqf4ZviM65EcJuzO/E8sIeATLk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TR SHA1-Digest: 72/i0hSlhQT+73c2QiQD7/gVc8k= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MU SHA1-Digest: NyvG1+2xAYXpmxUrZaoP7/4ynOo= Name: res/drawable-xxhdpi-v4/ic_message_white.png SHA1-Digest: nFyuhA9Xrpw2K5ndU20hX2trY0w= Name: res/drawable-xxhdpi-v4/abc_text_select_handle_middle_mtrl_dark.p ng SHA1-Digest: PSeedHvDkZY2LIfg9EBkZrlW8W8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LI SHA1-Digest: 5c5oQUtfCEAEPDk6dFi8DWOMBwQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NA SHA1-Digest: v6Uz30xFp7jzUIOs4lQhcDOmzII= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NC SHA1-Digest: dFhp4MlENpx/8otef5KGD9JQIw8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LK SHA1-Digest: xZy3jJkV+z/SLJKkqwCNKOtsPAI= Name: res/drawable-xxxhdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png SHA1-Digest: Vhfvv1y0wkBw2X/iXEqs7JGlm+o= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NE SHA1-Digest: U7FuPCtu97pxXgaLy4jZP/8OL4g= Name: res/drawable-mdpi-v4/check.png SHA1-Digest: avkwoshYVlbnHtetx9GPvFN8ZqE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG SHA1-Digest: MgajsYmpKYwMV53K9bTUweEND8s= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NF SHA1-Digest: uqOstg+ldbNhMjzpHuh0izKK+jc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NI SHA1-Digest: gTqxDh/MRul6/h8LYqEZPtshll8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LA SHA1-Digest: py3X9u/lE6xMR6fi8lzV86sO1hM= Name: res/drawable-xxhdpi-v4/ic_recurrence_bubble_disabled.png SHA1-Digest: V5oZHMEOJ7E3o/CODskCp3rKJYw= Name: res/drawable-mdpi-v4/abc_ic_star_half_black_16dp.png SHA1-Digest: FHMsjUZwrKpDGM7XpRyQGuhOHMs= Name: res/drawable-xhdpi-v4/ic_emoji_places_normal_light.png SHA1-Digest: kA4yyxqYzjB7kHrP66hy/awfdUQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LC SHA1-Digest: 00HknFCmZjohOMWi6P6q1g1nDfs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LB SHA1-Digest: K1FxC84R/q8VHjnvJmF8YpJuWhQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MK SHA1-Digest: 2NXj053RfuUBxSIFat1D5IYDyjk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LT SHA1-Digest: fb/ckx5EjSMVyJ4Bdr7L762q5Hs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML SHA1-Digest: TmBs7z4K7qZfn3YuuMPnlQo9Wrk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LU SHA1-Digest: ob0QLVUzjPJBuULFaESbiAvv4H0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM SHA1-Digest: fU2WheWE8sFw3uoYuP70+TNfyOQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LV SHA1-Digest: otR531NPPcrIotMjlVeaYW+GOZU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN SHA1-Digest: /gvOpSnmCSfZXF1CLm98DWyru8E= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO SHA1-Digest: aQSCgNvOHl4+xuMdKH41mYE8ryg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LY SHA1-Digest: /By5pIbDyT8f6wuNJjPX+TySrpI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP SHA1-Digest: osX2XD0hfucZvxJH1g5j6P2+1FU= Name: res/drawable-mdpi-v4/ic_add_white_24dp.png SHA1-Digest: pT3SpNkEzuNyoBwc5Wr6Ur9ZMpk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MQ SHA1-Digest: uRO4iP2NyZsAxClqG5n7A6fBGc4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MR SHA1-Digest: 22eFX78st0eT0IR308l3k7Ixdc0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS SHA1-Digest: m15+ICDC8TN6qGgyxI9fGIq1r0Q= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MT SHA1-Digest: II8edaEOsL/kdVLxs1neIm2RZrU= Name: res/drawable-xhdpi-v4/ic_app_protection_black.png SHA1-Digest: 7pSYUGzZYGidYb/M0JtUFkeusog= Name: res/drawable-xxhdpi-v4/ic_emoji_objects_normal_dark.png SHA1-Digest: 4C4L1wrESZ3UVMCMyGXEByUQv8A= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MU SHA1-Digest: 4hPw5iNm8AAa9K8Smv66ARGBrVw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MV SHA1-Digest: z2uEx8PGk1pYjANMIWvmiWzn9Pg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MW SHA1-Digest: GJDPn4E5DbpCYuQruKsoe+52ZRQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX SHA1-Digest: 4lhjsOHVa5BQpdDNiFpsm1nG+OI= Name: res/drawable-mdpi-v4/ic_account_box_dark.png SHA1-Digest: 7YhW8AZtzBWHE9ZeieJvih7NR50= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY SHA1-Digest: wVg7EA8+tRlJz87G5FU/Tc2Mbag= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LR SHA1-Digest: osiKYK17TsMEMpxwUSdWIH0VNtc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LS SHA1-Digest: w64d6l2qMRu/hc1FezgCU60XUaY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MZ SHA1-Digest: rKcRh8hcFnOXhYfgSvawBWQxcSQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_27 SHA1-Digest: nEYbSuXRF/uctKuasoKct6HqEFw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KE SHA1-Digest: 7Eb+9olO5an4TwFHi55sQfOqZsY= Name: res/drawable-xhdpi-v4/ic_volume_up_dark.png SHA1-Digest: mfULAXM3aV46dhmKC0I1/BVFjY8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KI SHA1-Digest: VgndwACstWBLpIyzd00I3DsAgzY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KH SHA1-Digest: WwDjEfSaYYvxvjzp9kuZw0wKTz8= Name: res/drawable-xhdpi-v4/ic_volume_off_grey600_18dp.png SHA1-Digest: I47X7flSnPoPB8eb42nJUP1aPgo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KG SHA1-Digest: jSk/TwIasSlFmnZhTWrCWwmOPmU= Name: res/drawable/error_round.xml SHA1-Digest: /dc/CUQ2SFAXgoplWG74eEB36w0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NO SHA1-Digest: XIwuQ06+W3t7V0wUlyRBNu/1DyA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NL SHA1-Digest: +/Y4Of7cCkZTB8fn4MrZSKPN7go= Name: res/drawable-xhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png SHA1-Digest: pBR99OG39RSH5mvInfhWhS5HH80= Name: res/drawable-xxxhdpi-v4/ic_pause_circle_fill_white_48dp.png SHA1-Digest: xN33rFibRxouC9pfWIRBsJ/nDcg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NR SHA1-Digest: SiNwROtI47UYTzWL8hqcJ11u8Dw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KY SHA1-Digest: jWCt/+g+/sNLdENqqAtaUlvbqmY= Name: res/drawable-xxhdpi-v4/switch_thumb_activated_holo_light.9.png SHA1-Digest: FZ0jvocMQHbBY6GfdO1/lyn4CAI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KZ SHA1-Digest: DxmO0yjUvvuXGC4nK8NuAZrOW4w= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NP SHA1-Digest: 2g5uGte/BTNum9b1mAxNElqDCpE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KW SHA1-Digest: cEw4Jm39ArCO3iOm52+C9sLdDZM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KM SHA1-Digest: riY4/v0MIgCE8l9iMpTLN8m5tOs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KN SHA1-Digest: 3O4gZzoMqkKgHs7s1u3KCL+PR+8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NU SHA1-Digest: gTUt0Nzsr87sGj6sgNtddpWwhAw= Name: res/layout/conversation_item_header.xml SHA1-Digest: OV9Q3kbpbDwb2wxp4ZtsdOgxUSI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ SHA1-Digest: D1QjtPWapV8sDGRu8jlTmbg9CiY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KR SHA1-Digest: kKTdqSpVpt4zAI7ytiAadhPJ8Iw= Name: res/drawable-mdpi-v4/abc_list_pressed_holo_light.9.png SHA1-Digest: tbKOWkoq8X/O9SqZLE2Z7VwIrfw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KP SHA1-Digest: 58tT5gudlbJRzpqqFyua7jkMGjw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE SHA1-Digest: 2/wViBuGamXrqaTPx4xhDh/kR6s= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA SHA1-Digest: xkDyNu/va2uiNSGtY+SbV/uUvKQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JE SHA1-Digest: pdeQRQM5r+R2TwhSD3dAlw9Ii6w= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PK SHA1-Digest: 3K58UkbBgfsBn+w1WYyrLGg1Vs4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PM SHA1-Digest: 1eKd1jGumli5KScCSRe7W8FtzPg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PL SHA1-Digest: ZZRfZwKbj5nBaRSEyzDy4oVNL3Y= Name: res/drawable-xxhdpi-v4/ic_brightness_6_black.png SHA1-Digest: hT3Q5aI6chKgjr3u96CzIytR26Q= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG SHA1-Digest: O/wvabhcicXGnHyFO5zY9nBEMzw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PF SHA1-Digest: wFTU4LaoIUUeY8deZsANu+eyMB8= Name: res/drawable-xxhdpi-v4/ic_menu_search_holo_dark.png SHA1-Digest: qf7PAA/agfGHmWMb/SvP5kBKVko= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH SHA1-Digest: 781vcW1KyIN83oPhMi587TC/tmk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_OM SHA1-Digest: iPQ/4sahDPUNj7CLb4X+eEMNY2s= Name: res/drawable-mdpi-v4/ic_circle_fill_white_48dp.png SHA1-Digest: V/bvSL+GAYkgI4E2eJefZNA6EMM= Name: res/layout/abc_action_mode_bar.xml SHA1-Digest: 8cOoh4SHfS1Uld3Y198MHRMf1p0= Name: res/drawable-xxhdpi-v4/ic_brightness_6_gray.png SHA1-Digest: tHdz55QDyJozOXlcobBxkQ8hYLI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JO SHA1-Digest: KTnuJeszCYuiahu4zflNUDJa9yg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JP SHA1-Digest: QpQOc4vADA1q7EahWr87MV5uWDg= Name: res/anim/abc_fade_out.xml SHA1-Digest: MTJWZc22b5LNeBboqBhxcQh5xHQ= Name: res/layout-v16/reminder_header.xml SHA1-Digest: +w3ZpcGYIF5kKzcLuC/LKEO3/MI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JM SHA1-Digest: OTB7tR826TJrULJiPuDXwX36dZc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IE SHA1-Digest: mcKFsH0GatsbmdTjQdRh0jztICI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ID SHA1-Digest: BkBerSKlrQMQY3/KH5RNV+n5huU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA SHA1-Digest: WICjeFr27fN7anVdxio0RVkYeGg= Name: res/drawable-xhdpi-v4/abc_list_pressed_holo_dark.9.png SHA1-Digest: WYYEXP9zXPHmkO70T8BA20aSj+U= Name: res/color/date_picker_year_selector.xml SHA1-Digest: 7HDV3N/ftFQRROQYt5WCO9Is5Jw= Name: res/drawable-xhdpi-v19/switch_thumb_pressed_holo_light.9.png SHA1-Digest: 58f1EtXQ3wizMEJeTAgSgdZA5uA= Name: res/drawable-hdpi-v4/textfield_default_holo_light.9.png SHA1-Digest: fuY+WIlRJ8vgPwAzkl65YeJKVPo= Name: res/drawable-hdpi-v4/abc_list_selector_disabled_holo_light.9.png SHA1-Digest: BLQq1kPx0/JPxPxgp/MrxD6Ft1Q= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT SHA1-Digest: FTSRD+8krf2I/fe/q8jN/pky5RM= Name: res/drawable-mdpi-v4/ic_arrow_forward_dark.png SHA1-Digest: UtdFAKXRarbKVaIUUO5i/4PmAUY= Name: res/drawable-xhdpi-v4/ic_movie_creation_light.png SHA1-Digest: 8qN3jMnnkv7nQG2Nt9i6hF8XknQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR SHA1-Digest: W7pvgFF3VzVSM9IGog1S1WZP4mw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PS SHA1-Digest: IGHtSws25qiaMxsqlBXqtxSsvMA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IS SHA1-Digest: JvYMu8OKrL9lcqfrYDV9I4ltcFs= Name: res/animator-v11/upper_play_to_pause_animation.xml SHA1-Digest: vpzxwaaL5PRRSeJChzUUaEwd3iQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IT SHA1-Digest: CatC4fTYOKpgZJbH2mM3f/nSBU0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IQ SHA1-Digest: VFc4xI5nUj1n8/U6qztKBLpJp48= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IR SHA1-Digest: 6nXRpbNbAuqDvlBHdtG30O0CRG4= Name: res/drawable-hdpi-v4/ic_send_sms_insecure_dark.png SHA1-Digest: GDJMSStAh7EYNszWCaxubbfHoWk= Name: res/drawable-xxhdpi-v4/icon.png SHA1-Digest: 0sRkUHHzVMQ90JPNC0VwdWFolPI= Name: res/layout/led_pattern_dialog.xml SHA1-Digest: tswBD0QJriEDClR9AywmEXzI4nQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IM SHA1-Digest: TaW3gRKjop4Pi5G+R3Dk6vm0V+U= Name: res/drawable-xhdpi-v4/ic_save_all_white_24dp.png SHA1-Digest: Gx+5fK2ckaZdBfgGtgchP2Ohl4M= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IN SHA1-Digest: BYe7nV7/sNQ9Pohqd3g8yQY2qgU= Name: res/drawable-mdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png SHA1-Digest: j4YCzt0aE3XiVuR90dIkNXUHnHE= Name: res/layout-v16/fragment_submit_log.xml SHA1-Digest: PWVivlzjiCq6ovVB2zlarg82dyQ= Name: res/drawable-mdpi-v4/switch_thumb_activated_holo_light.9.png SHA1-Digest: bnXBtaKF7a29jCEvIOWErkhFvv4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PY SHA1-Digest: 0YjHGDh9jac/0gpxStTX8wtMr78= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IL SHA1-Digest: noPCK0eckpRYQhQWHyZztIoLLvo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PW SHA1-Digest: phVp2GMskybPur1giJmEDXf4+mk= Name: res/drawable-xhdpi-v4/ic_info_outline_light.png SHA1-Digest: 6a9eNZD07GQajIG06leuESyJ/Ck= Name: res/drawable-xxhdpi-v4/spinner_default_holo_light.9.png SHA1-Digest: Q96rsORloNyw2WFYTUl9VA/zlUc= Name: res/drawable-hdpi-v4/list_selected_holo_light.9.png SHA1-Digest: 8+a6kSVhZ1n87KOe3NWXssOoSRY= Name: res/drawable/emoji_category_nature_light.xml SHA1-Digest: RzDuk6h6UEkqappk7hYx6pgKeCs= Name: res/layout/expiration_picker_view.xml SHA1-Digest: ken0b/R8av4QZrSzp1tlprkgdog= Name: res/color/abc_tint_seek_thumb.xml SHA1-Digest: wCFz+npXjWt6jSRAejKK29canhU= Name: res/drawable-mdpi-v4/ic_backspace_grey600_24dp.png SHA1-Digest: gUiX8RH5wH4fZj1wG+l03S3ZlOc= Name: res/drawable-hdpi-v4/abc_switch_track_mtrl_alpha.9.png SHA1-Digest: +BAInzzGimhbNKEsUcg4H+12pT0= Name: res/drawable-mdpi-v4/ic_emoji_symbols_normal_dark.png SHA1-Digest: tljO68WW5/+x0yJR9GWMpSppcoc= Name: res/anim/design_fab_in.xml SHA1-Digest: 88HYAVsN9aX1xNbLpWMveab3t7w= Name: res/drawable-mdpi-v4/ic_group_white_24dp.png SHA1-Digest: zLcWCyxyVrdWkFDGj8/ZlLWVwUc= Name: res/layout-v11/notification_media_cancel_action.xml SHA1-Digest: FOKQ0fSwhQySQM6fclToJK+8huE= Name: res/layout/abc_select_dialog_material.xml SHA1-Digest: R48Z4M6YIfsfL/+YdwRm1HaHYU8= Name: res/drawable-hdpi-v4/ic_photo_camera_dark.png SHA1-Digest: wbyQ2OL70KZRwipbMxfW86M9cqA= Name: res/color/recurrence_bubble_text_color.xml SHA1-Digest: m+qPsVs0ZrAZd+YF4dsuJraUJy4= Name: res/drawable-hdpi-v4/ic_emoji_nature_activated_light.png SHA1-Digest: 76iZVIwm+2dITVc13qDTowynlgE= Name: res/drawable-hdpi-v4/textfield_activated_holo_light.9.png SHA1-Digest: bLHdUYUynLqsA32+N3F3BJ4EBHQ= Name: res/drawable-xhdpi-v4/switch_bg_holo_light.9.png SHA1-Digest: c+JwYiQCZPeynR8o/HjhfKjOc5g= Name: res/drawable-mdpi-v4/ic_lock_light.png SHA1-Digest: wbLs3mArn7d1bmp55eoiuIsD9uc= Name: assets/emoji_objects.png SHA1-Digest: EJCaAiWW33tUKJXv05D8xPp76zg= Name: res/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png SHA1-Digest: 53DYKltMU34zhaYZHtlNZkme+Co= Name: res/layout/prompt_apn_activity.xml SHA1-Digest: PSJ0tS+8D/+87BKr2ZmQlJvwOoY= Name: res/drawable-hdpi-v4/ic_backspace_normal_dark.png SHA1-Digest: J8qgDWuh2640WfVZ8mD4dTE+oH8= Name: res/drawable-hdpi-v4/ic_emoji_objects_normal_light.png SHA1-Digest: BWs4UA8bueEb3x1ZmUnbACZAn5k= Name: res/drawable-ldrtl-xxhdpi-v17/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: 6bGD4jGKEnE3B0EkCpW5Emm9up8= Name: res/drawable-sw600dp-hdpi-v13/ic_backspace_disabled_light.png SHA1-Digest: 1xOse/knAUkmdSJRE7Gm2BWULK4= Name: assets/databases/apns.db SHA1-Digest: bg0zKqxv61OZoXbea65pDG9cXQA= Name: res/drawable-mdpi-v4/ic_photo_camera_light.png SHA1-Digest: eML/v5Eu4g3ks/r8WhFGLPooEnk= Name: res/layout/abc_search_view.xml SHA1-Digest: WWRqmfw7obFK3n7n8Ekl14zUCQ4= Name: res/drawable-hdpi-v4/ic_mood_white_24dp.png SHA1-Digest: dESTHN33RlDCjHon6Kf+jlE1F0c= Name: res/drawable-xhdpi-v4/ic_dialpad_white_24dp.png SHA1-Digest: Oh4t33wvgPLVjp/NgDXxHwmovIo= Name: res/drawable/blocked_indicator_background.xml SHA1-Digest: qucbHTNZYboQObVToh9BCpVzgKc= Name: res/drawable/emoji_category_people_dark.xml SHA1-Digest: L8yyopzaoxR0l4b5y3XQlPcwFGU= Name: res/menu/media_overview.xml SHA1-Digest: grIZlxlp22/PsVq3047Q+M5M+8M= Name: res/drawable/list_selector_background_transition_holo_light.xml SHA1-Digest: 36TGchgA+ugMLzqfO+wPp3RPDTE= Name: res/drawable-xxhdpi-v4/check.png SHA1-Digest: jUcinrMdcOv+FeVYA9vv/xaXxKA= Name: res/drawable-xxxhdpi-v4/ic_done_all_white_18dp.png SHA1-Digest: sgI8NP8L5ChzE3bcd23XivS4RiI= Name: res/layout/import_export_activity.xml SHA1-Digest: QrAeBaxysnjPdSsDza4Dk9mY72w= Name: res/drawable-mdpi-v4/ic_send_insecure_white_24dp.png SHA1-Digest: TxuIHLBVnnWehzVdeGsxh9kPSPs= Name: res/drawable-mdpi-v4/ic_launch_white_24dp.png SHA1-Digest: 3SGP5nUEOjd+H8x09S0Q/mpe51c= Name: res/drawable-xhdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: LHNDVgsME9Yj4JPg5CLyVd0Eld4= Name: res/drawable-xhdpi-v4/abc_popup_background_mtrl_mult.9.png SHA1-Digest: rkfYN21U5rNNgOOcXyHtDvlAuDE= Name: res/drawable-xhdpi-v4/ic_textsms_grey_32dp.png SHA1-Digest: /fWA+opeZhwsYgI19Ktiy9Te0Cg= Name: res/layout/keyboard_text.xml SHA1-Digest: kTgoLBL3RvY7DUrytit4SJ/vNH0= Name: res/drawable-mdpi-v4/ic_forum_grey_32dp.png SHA1-Digest: bZmFrMHRVPaYNDiszshXCN+e26k= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_7 SHA1-Digest: ++F/BtCrUwz7P52Agrem1zBo7MI= Name: res/layout-v17/conversation_fragment.xml SHA1-Digest: hUD2cxgYhFE4EC6kkjKssmXtITg= Name: res/drawable/recurrence_bubble_fill.xml SHA1-Digest: hY1/dq5DoGqB5nB5bzt/+w0aZyU= Name: res/color/date_picker_selector.xml SHA1-Digest: jP08qV5xeDoCPMazM+vaHEgiNsI= Name: res/drawable-xhdpi-v4/ic_unlocked_white_24dp.png SHA1-Digest: qik7+MvynFEnE85vFo7abDFksWY= Name: res/drawable-xxhdpi-v4/switch_thumb_holo_light_v2.9.png SHA1-Digest: U/4Z3gd25jwQChkbsD5VnRLBt4I= Name: res/drawable-xhdpi-v4/textfield_activated_holo_light.9.png SHA1-Digest: If3Wai5q4G/7HwWXms7HMa+ezus= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_350 SHA1-Digest: 1dsh1jmlpctbk3mLLs20rDvMeHw= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_352 SHA1-Digest: wG8Amf2IUehX/g5l0F2/BDWC8XM= Name: res/drawable-xhdpi-v4/ic_mood_grey600_24dp.png SHA1-Digest: F9axoAJFCcB9w59XB74IOFQf5pk= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_351 SHA1-Digest: Mms7D5naQaHUlKhoBn+xBnme4nc= Name: res/drawable-xxhdpi-v4/ic_emoji_places_normal_light.png SHA1-Digest: IhAGTP1mcBfaaxqhff8dvaHPfBA= Name: res/layout/conversation_list_item_action.xml SHA1-Digest: daYMlc9s7/cMUHhdCnx2cD09hyk= Name: res/drawable-xhdpi-v4/abc_text_select_handle_right_mtrl_dark.png SHA1-Digest: e5xqNys69NyvQS8VE/Kly997E88= Name: res/layout/abc_list_menu_item_icon.xml SHA1-Digest: dYFR+O7lTgJC28aXyfVTftOMwDM= Name: res/drawable-hdpi-v4/sms_selection_icon.png SHA1-Digest: l56HHr5n4oBQUmb/lPX166v9h6s= Name: res/drawable-ldrtl-xhdpi-v17/ic_send_white_24dp.png SHA1-Digest: FJqvMGpZ+kYijHSTH4NUm5WLcK8= Name: res/drawable-hdpi-v4/ic_group_grey600_24dp.png SHA1-Digest: U9+6tpgExRqQgcJbv4ViVKDi4U8= Name: res/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000 .png SHA1-Digest: VW4JPwMwHw0CzAlOEqerGs/L5mk= Name: res/layout/calendar_date_picker_done_button.xml SHA1-Digest: Ml84ZNS7dAwwhGV+Zjg8U5T0xwg= Name: res/animator-v11/bottom_play_to_pause_animation.xml SHA1-Digest: KjERMZ7qyZ9ZxIR+ZWsV0a+EASA= Name: res/drawable/ic_check_dark.xml SHA1-Digest: kzu80h7wvQqqqewEavCQ/lVgDGc= Name: res/drawable-hdpi-v4/abc_text_select_handle_right_mtrl_dark.png SHA1-Digest: GN5clQjLYHfNj0bF9YP+ewaJstM= Name: res/menu/log_submit.xml SHA1-Digest: IIBD+uio+9ejz7nuBNfS4Ezk38A= Name: res/menu/local_identity.xml SHA1-Digest: 1Igdxj3Es0r2GRwRynPPb8aRm1c= Name: res/drawable-mdpi-v4/abc_switch_track_mtrl_alpha.9.png SHA1-Digest: Goj79xYi41d5Ug2oovkSjYvLbAI= Name: res/layout/notification_action.xml SHA1-Digest: MCcUfGwh0zhVoDOGdKkwzOOaqsE= Name: res/drawable-xhdpi-v4/ic_badge_24dp.png SHA1-Digest: Tfz8+fJWe82EAe380KhmRoQTH2A= Name: res/drawable-mdpi-v4/ic_emoji_nature_activated_dark.png SHA1-Digest: PxSSUiNH5BEinHzkqqlOmKZtXNw= Name: res/drawable/abc_tab_indicator_material.xml SHA1-Digest: V5veQwsCSGKsSBtGwB7BwIrrJ60= Name: res/drawable-hdpi-v4/ic_visibility_off_white_24dp.png SHA1-Digest: tnIaP+YN1dmNBPvKkSvfab/zHcA= Name: res/drawable-xxhdpi-v4/abc_ic_star_half_black_16dp.png SHA1-Digest: nw6+x+wmtucgkuXTdFCndlFazP4= Name: res/drawable-xxhdpi-v4/ic_menu_lock_dark.png SHA1-Digest: PEehXVb+1FiSNRhfemMMdfIHCmE= Name: res/drawable-hdpi-v4/ic_message_black.png SHA1-Digest: 9olkHBpQePze7UF4D89/MzfUZgg= Name: res/drawable-mdpi-v4/ic_send_sms_insecure_dark.png SHA1-Digest: 8C0HRt8QBOlAtUs0AncturKJswA= Name: res/drawable-xhdpi-v4/sms_system_import_icon.png SHA1-Digest: /lk35fCQRfDoJENySR3K7xJI8Kw= Name: res/drawable-mdpi-v4/ic_backspace_disabled_dark.png SHA1-Digest: 8UicXzhNTwHx9Z6gKpFQy8Nq+pQ= Name: res/color/text_color_secondary_dark_theme.xml SHA1-Digest: 2zbnbYOg6F9G58wfP1T5Q6MwdjI= Name: res/drawable-xxhdpi-v4/ic_lock_white_18dp.png SHA1-Digest: 6bUAVeqsigwcdBuAJg2dYp7OazA= Name: res/drawable-mdpi-v4/abc_text_select_handle_right_mtrl_dark.png SHA1-Digest: T7V6hKiMczkLkUlKXFHH2u21kKk= Name: res/layout/conversation_list_item_view.xml SHA1-Digest: 3VfyPkj8uWV2HoQiXx925UVCMt0= Name: META-INF/fdroidserverid SHA1-Digest: PFAoK3vAw7CF29BtzhTdrgabIU8= Name: res/drawable-xhdpi-v4/ic_group_grey600_24dp.png SHA1-Digest: sIzL5sw6bxV7HQIwylPrh+ASMPQ= Name: res/drawable-mdpi-v4/list_selected_holo_light.9.png SHA1-Digest: w5jMjyx0n/lk3stiPGrcn7tdZT8= Name: res/drawable-xhdpi-v4/ic_refresh_white_24dp.png SHA1-Digest: 3d7TIrGejbmbXYCCR0kiPE3trQQ= Name: res/layout/recurrencepicker.xml SHA1-Digest: jYVg/v1x2v2k6GmliiB7aM3R5hA= Name: res/layout/radial_time_header_label.xml SHA1-Digest: cAfMyqMdkLB5b0WtSjoDKDQDR8U= Name: res/drawable-v11/notification_bg_low.xml SHA1-Digest: noAsyGBDHDbAwoxMmtFFogehgFM= Name: res/drawable-xxhdpi-v4/ic_group_grey600_24dp.png SHA1-Digest: gtMIy0EuLn065qk2JYPIzVtEYs8= Name: res/drawable-mdpi-v4/ic_emoji_emoticons_activated_dark.png SHA1-Digest: zgvg/rmsY3NPoHn7SKkEL/vK/uc= Name: res/drawable-mdpi-v4/icon.png SHA1-Digest: 8dZkVmxxSs1WycNGs/t5UCk4WQk= Name: res/drawable-xxhdpi-v4/ic_missing_thumbnail_picture.png SHA1-Digest: 8Z3J3yRXgM7avwVxV616Z64GKEw= Name: res/layout-v17/notification_action_tombstone.xml SHA1-Digest: chGkI32GuGZuzpKxpJHM32oPvTo= Name: res/drawable-mdpi-v4/ic_done_white_18dp.png SHA1-Digest: /pqJedk+4F0QhMNq7QpU4sFpem0= Name: res/drawable-xhdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png SHA1-Digest: c4WhrXmf1QDquO48zO95xrhdWlo= Name: res/anim/abc_grow_fade_in_from_bottom.xml SHA1-Digest: iPapUKcPYcYoPV86U6jl9kw3Fqs= Name: res/drawable-mdpi-v4/abc_ic_star_black_16dp.png SHA1-Digest: voXnHOu9kqbuYTOgvWgQQ6GK7aw= Name: res/drawable-mdpi-v4/ic_dialpad_white_24dp.png SHA1-Digest: Ain67lOpHc1Y5kMFqXv0COHP+H8= Name: res/drawable-xxhdpi-v4/ic_send_sms_insecure_dark.png SHA1-Digest: vqkeZqvUMKhiKa06vnvzfpo0EZg= Name: res/drawable-xhdpi-v4/ic_emoji_nature_activated_dark.png SHA1-Digest: odYh9SPOOjO2DQl8Zt3SeZFoqmc= Name: res/drawable-mdpi-v4/notification_bg_low_pressed.9.png SHA1-Digest: X/lHyqy/i66+Lvhw/RlUttGZCjY= Name: res/layout/recurrencepicker_end_text.xml SHA1-Digest: ju0lW/ZJaH7yy30lekFEcJmudJQ= Name: res/drawable-xxhdpi-v4/ic_block_grey600_18dp.png SHA1-Digest: pEOEbcAFQKdMqhGRWKNrf1itfA4= Name: res/drawable-xxxhdpi-v4/abc_ic_star_half_black_16dp.png SHA1-Digest: 1wJ8llQYggoHcTVA4eV+lgO9viY= Name: res/layout/abc_action_menu_layout.xml SHA1-Digest: Jpw86cr0Dg4qeYri6LCMkdNhQFs= Name: res/layout/media_overview_item.xml SHA1-Digest: 5HQKdf8GTT2QADM6MEH4xRAsvHM= Name: res/layout-v13/recipient_preference_activity.xml SHA1-Digest: 5Qb/c6BKOAMHD2WUyKb01qeChBM= Name: res/drawable-mdpi-v4/ic_recurrence_bubble_disabled.png SHA1-Digest: 4UNh+VZOMQGfV/EWOFVQKNJ4t2s= Name: res/drawable-ldrtl-xxhdpi-v17/ic_send_white_24dp.png SHA1-Digest: +26QRCNXvQKsaRcFvLCjUHNlbKQ= Name: res/drawable-hdpi-v4/ic_movie_creation_dark.png SHA1-Digest: X4S4jWmvJYk/d5OFGYuP3aGezSc= Name: res/anim/animation_toggle_out.xml SHA1-Digest: lBabkCAcL5u2zNS3a/RsxhDIuzE= Name: res/drawable-v21/abc_ratingbar_small_material.xml SHA1-Digest: BADt3Ef1toHfWLOP4cHWQg7zFsc= Name: res/drawable-hdpi-v4/abc_popup_background_mtrl_mult.9.png SHA1-Digest: WvazyKPHGN7DcTmhPWllEqzaoY0= Name: res/drawable-hdpi-v4/ic_emoji_places_activated_dark.png SHA1-Digest: vW42hojyb/7zMg8g+ZHjfbjKHig= Name: res/drawable-xhdpi-v4/ic_backspace_grey600_24dp.png SHA1-Digest: zFl9M6wNCdsM8+JRt/4BePJ1o8k= Name: res/drawable-mdpi-v4/icon_cached.png SHA1-Digest: 1ZRpuZ4qBoONtSR91+hdajO52ZA= Name: res/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png SHA1-Digest: byuQvpWXS6brcdPpZzFwfkUGtWE= Name: res/drawable-mdpi-v4/divet_lower_right_light.png SHA1-Digest: AdwhpOtOoV6YRjHdKI6e5wdJhu4= Name: res/layout/notification_template_icon_group.xml SHA1-Digest: y1Lzv2C59QEKq/zSclTkuZPGQbU= Name: res/drawable-xxhdpi-v4/ic_unarchive_white_36dp.png SHA1-Digest: Q6T3KOG3SavoxEseiE9x/2cUQAk= Name: res/layout/create_passphrase_activity.xml SHA1-Digest: jjTR2QVsPkhdxzsHK5TyF4z71XA= Name: res/layout/calendar_date_picker_selected_date.xml SHA1-Digest: 1jiVfxuc+lsKJV2sPGxYSD8bBnU= Name: res/drawable/emoji_category_emoticons_dark.xml SHA1-Digest: jxqIHC1Ar9qSvcTM0qecJ1TzykA= Name: res/drawable-xxhdpi-v4/ic_search_white_24dp.png SHA1-Digest: csXrkuTLSQec0kz4TC9YLbHaeA8= Name: res/drawable-xxxhdpi-v4/abc_text_select_handle_right_mtrl_light. png SHA1-Digest: x+xo9M5OW92JI6xyR8PIyBI7/z4= Name: res/menu/conversation.xml SHA1-Digest: 7yYqFxougH3U/WKlbDHlh1Rjuz0= Name: res/drawable-hdpi-v4/ic_block_white_18dp.png SHA1-Digest: s5DcKQrrdp5tnwxDsPPAEXGV7vg= Name: assets/emoji_flags.png SHA1-Digest: fICcDebwlX2ZuBVzl4Qb4kBjJtY= Name: res/drawable/circle_tintable.xml SHA1-Digest: uxoUcTKEKLFALgd7oOxFZ539jXo= Name: res/color/abc_btn_colored_text_material.xml SHA1-Digest: GA5CCAEAJGneufY304mtMRAiO9s= Name: res/drawable-xhdpi-v4/ic_attach_white_24dp.png SHA1-Digest: l8lRdroTUNq09WhBtmW6L5h7TSc= Name: res/drawable/abc_dialog_material_background.xml SHA1-Digest: l0M3oq0dSvqXzuiDjFty5ess9ic= Name: res/layout/custom_default_preference_dialog.xml SHA1-Digest: 3GcmVR89CH5c8qh05Ffh7NhKcfA= Name: res/drawable-mdpi-v4/ic_recurrence_bubble_outline.png SHA1-Digest: jU1zZ2OQvuou3WdF4Q1ex+PByB4= Name: res/drawable-hdpi-v4/ic_emoji_symbols_normal_dark.png SHA1-Digest: Q6yw9PCSn4s9WxapNJ9P/UniXl0= Name: res/layout-v21/conversation_item_received.xml SHA1-Digest: qJO0hW4gVDi5SUt7UCnSnBWsb/c= Name: res/drawable-hdpi-v4/ic_emoji_people_activated_light.png SHA1-Digest: 7lrgliE4H7Akj6QYt3qPutlzV3Y= Name: res/layout/keyboard_with_header.xml SHA1-Digest: 9OmkAJj9hLLmYIaJ+sAWk4yDPSY= Name: res/drawable-xxxhdpi-v4/ic_block_white_18dp.png SHA1-Digest: tdEuPGdERhjcavNdrUHecQxrI1M= Name: res/layout/change_passphrase_activity.xml SHA1-Digest: COCPB4ujbEhRgTyyOhEd1SmcEzQ= Name: res/drawable-xhdpi-v4/ic_emoji_objects_activated_light.png SHA1-Digest: JLDo2LqyRd/Sb3CTnsrzQe5u34U= Name: res/layout/abc_action_bar_up_container.xml SHA1-Digest: lgDm2CXl2GfnCEk1PC3+/9seBjU= Name: res/drawable-xxxhdpi-v4/ic_done_white_18dp.png SHA1-Digest: zCCYacrKvxwJ8dWHhJij+mQ2bW8= Name: res/drawable-xhdpi-v4/ic_photo_library_white_24dp.png SHA1-Digest: 5SaD4ioS9S/I9vBJf/jrXH8DkZw= Name: res/color-v11/abc_background_cache_hint_selector_material_dark.x ml SHA1-Digest: RvuWyz0R/TOa0YMWKY4Z70Jd7r8= Name: res/drawable-mdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: 4oU1S0T6qbsEVVg1vrykxhO0l2Y= Name: res/drawable-hdpi-v4/ic_menu_remove_holo_light.png SHA1-Digest: fJ8PTsrpYrWc6H7e3ctCsDSiaAY= Name: res/layout/calendar_year_label_text_view.xml SHA1-Digest: NWuaYel21R2U+Zfgy0SkpnIWlVs= Name: res/drawable-xhdpi-v4/ic_delete_black.png SHA1-Digest: Z6tz8hyRKhxub173/+bxBF+8CaQ= Name: res/drawable-hdpi-v4/dialog_full_holo_light.9.png SHA1-Digest: N91bFRXerR/vcloVH441Xx6Nhi4= Name: res/drawable-xxhdpi-v4/ic_group_white_24dp.png SHA1-Digest: shdzcIyfq7XffvVJiqihdtguosU= Name: res/drawable/contact_photo_background.xml SHA1-Digest: y2aQJR62snrVPJNn7N/Ve0pGy2s= Name: res/menu/conversation_unmuted.xml SHA1-Digest: JdmeZPjIQqeKw6uBcbpoVq8/Gfw= Name: res/layout/design_navigation_item_header.xml SHA1-Digest: NxhEFPzXVmTWKfRFuaYzZQ0kbfI= Name: res/layout/thumbnail_view.xml SHA1-Digest: A77EQLfZjnF/tU2umw1/QfbWivA= Name: res/drawable-hdpi-v4/switch_thumb_disabled_holo_light.9.png SHA1-Digest: HySzs67maedHt7T5DQ9b62NVMUw= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_358 SHA1-Digest: BdiB3G40E33JhpAaQnPmGM6npwk= Name: res/drawable/clickable_card_light.xml SHA1-Digest: VIl5o/NWq1nCN2BBNgoezFbXwbU= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_359 SHA1-Digest: OH/iiqVq50dBV79hJSr2rKoXM5E= Name: res/drawable-mdpi-v4/ic_contact_picture.png SHA1-Digest: gBiGaxFOuYDSl8ly2bHD9ylC4Bw= Name: res/drawable-mdpi-v4/lockscreen_watermark_light.png SHA1-Digest: hEboIczR1JMpRKVdEHPAqTIePyU= Name: res/drawable-xxxhdpi-v4/ic_forum_grey_32dp.png SHA1-Digest: 0LcJ5CBccaXbVS27DsjRwtYc/wA= Name: res/drawable-mdpi-v4/ic_emoji_objects_activated_dark.png SHA1-Digest: QW4LHwogF6+394neX42yQ2CbiP4= Name: res/drawable-xxxhdpi-v4/ic_launch_white_24dp.png SHA1-Digest: ix9Sk+r3UdDblFBjwgjFcnJQs4o= Name: res/drawable-xhdpi-v4/ic_menu_login.png SHA1-Digest: bL+Gp/eJvyBxO7SIeGLohs7bQMQ= Name: res/layout-v11/notification_action_tombstone.xml SHA1-Digest: diK9MlILrXv87mG85BLdUWk57sg= Name: res/drawable-mdpi-v4/abc_ic_star_half_black_48dp.png SHA1-Digest: nw6+x+wmtucgkuXTdFCndlFazP4= Name: res/layout/audio_view.xml SHA1-Digest: g5DfJ3OqZpmDV75jbXDWRewGoNw= Name: assets/emoji_faces.png SHA1-Digest: VF2bbkibGKhCNeUQxTwNIcjghSs= Name: res/animator/upper_pause_to_play_animation.xml SHA1-Digest: 7f8HiUwoTj84cBIvXQhtx6kFMlc= Name: res/drawable-mdpi-v4/ic_delete_gray.png SHA1-Digest: xHXFGYmF/EQrCANgkZsDN8EBF/Y= Name: res/drawable-mdpi-v4/ic_clear_search_holo_light.png SHA1-Digest: QAFEm0zCvZ4Xmc8sOzVOr0LSD4k= Name: res/drawable-mdpi-v4/ic_menu_lock_dark.png SHA1-Digest: nFOkYB6yVhnjOnwnTC/yyO2v3ok= Name: res/drawable-xxhdpi-v4/ic_emoji_objects_activated_light.png SHA1-Digest: bVR43kSrdn2gpPFIHV7aZgin258= Name: res/layout-v11/color_fragment.xml SHA1-Digest: WJb0933SsY9u/EtpCZLJS4UP8x4= Name: res/drawable-hdpi-v4/ic_pause_circle_fill_white_48dp.png SHA1-Digest: YPZvKW9wYirAUH9HUj2e8gGAiDM= Name: res/drawable-xxhdpi-v4/ic_mood_white_24dp.png SHA1-Digest: BXGpNcX8TerVRVxm8RjBkcK5bLU= Name: res/drawable-v21/notification_action_background.xml SHA1-Digest: 0sQTHXDbz/T3B0nMS6oSuhoVMI4= Name: res/drawable-xhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png SHA1-Digest: MtrqRaF9hHgDajQUiUZsdukbh0o= Name: res/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.p ng SHA1-Digest: VyxMaY4GkM7F0rJ6OUhPiMeP/GU= Name: res/drawable-mdpi-v4/ic_send_white_24dp.png SHA1-Digest: oNDT6r9WHuzyoWCkGNccF9jLbmo= Name: res/drawable-xxhdpi-v4/ic_advanced_gray.png SHA1-Digest: L1jWZJK/JGkcsvUnYnjVMdAzZiM= Name: res/drawable/background_pattern_repeat.xml SHA1-Digest: oB3Wz023ADDvA6nID9pWNGXhWiU= Name: res/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_000.png SHA1-Digest: TGHVlpw1mq1IC2cB7ulwjQ18wdc= Name: assets/emoji_places.png SHA1-Digest: 0Rb7g/OTs83cL8rMbtjEYfViINc= Name: res/drawable-ldrtl-xhdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: LVFgBAoPE9W6WKtEYtOUGWf+dzk= Name: res/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005. png SHA1-Digest: LrZts7m/Oija8l6P5TTB5GFdNx0= Name: res/drawable-xxhdpi-v4/ic_dialpad_white_24dp.png SHA1-Digest: EiylrBvuYC5ZY31xUIxumtdyMvk= Name: res/layout-v16/color_fragment.xml SHA1-Digest: qi3u3HGfeY707g+vtbNcQqNMQG0= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_373 SHA1-Digest: cSjMHtHIeYx8NPtkRndSSBuoZ98= Name: res/drawable-mdpi-v4/quick_shutter_button.png SHA1-Digest: hX6aYSlgrIrNR97AVRVBn+Zc420= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_372 SHA1-Digest: JZwfMXoGUZqHYvczzIvFBYzPVG8= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_375 SHA1-Digest: 4gnH58JyJO9ZBj8MNMws2LGhIEM= Name: res/drawable-mdpi-v4/ic_emoji_people_activated_dark.png SHA1-Digest: 17tlH62BvU2XtvzB0q0pMq4pFK4= Name: res/drawable-mdpi-v11/icon_notification.png SHA1-Digest: xSGFNF2FY64/dBhoUeJo/qFx81w= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_YT SHA1-Digest: cXbMKe6pREwZBzSVUa1rEcqWfyI= Name: res/layout-v17/notification_template_media.xml SHA1-Digest: d7SiUv5/rMArNhSFS9axXXveZmQ= Name: res/drawable-xhdpi-v4/switch_thumb_holo_light_v2.9.png SHA1-Digest: aHisXBhA4tSuq4zWW5w1PYjuGys= Name: res/drawable/abc_ic_menu_overflow_material.xml SHA1-Digest: AYT5D3IjptZzIlt4X8LKmKNh3eM= Name: res/layout/badge_widget.xml SHA1-Digest: gSeZLI0hbbQMvqppcrQtnWL0GU0= Name: res/menu/conversation_mms_group_options.xml SHA1-Digest: m2VD0D/7c0WQtNc6WyaFjEnEgg4= Name: res/drawable-mdpi-v4/spinner_pressed_holo_light.9.png SHA1-Digest: MBDjTotrSL6afNoJE5Mq5I6WF4M= Name: res/drawable-xhdpi-v4/quick_shutter_button.png SHA1-Digest: nLmuwLtwDgQhLHYyY81GFkAA5QM= Name: res/layout-v17/contact_selection_list_item.xml SHA1-Digest: o9XZZrqY4ZL7dueiXpGJW1i/Baw= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_380 SHA1-Digest: ooR6xh/a/iu1b6CXk+RjF7LeHoc= Name: res/drawable-hdpi-v4/transfer_controls_background.9.png SHA1-Digest: Cngz5DtX5FWcrNq0lMnsLWpu6cM= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_381 SHA1-Digest: 2JnA+oMJ+vJKy4hQpTtSxQVpZ5Q= Name: res/drawable-xxhdpi-v4/ic_mood_grey600_24dp.png SHA1-Digest: kc3UUSV68fYd/8O4pirHTfqw4Ck= Name: res/drawable-mdpi-v4/ic_menu_search_holo_dark.png SHA1-Digest: QXwY//zJFwvYzqfcyaPoso3TqJY= Name: res/drawable-hdpi-v4/list_selected_holo_dark.9.png SHA1-Digest: 8+a6kSVhZ1n87KOe3NWXssOoSRY= Name: res/drawable-xxhdpi-v4/ic_visibility_white_24dp.png SHA1-Digest: yxLNHuaKVBrTKsUUFdp96DIp5Yc= Name: res/drawable-xxhdpi-v4/splash_logo.png SHA1-Digest: aXmy7BI2jCI0KzC+31RQwr4XuOA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ZA SHA1-Digest: I29bUQkgyXligJyPjjZSktYPO2E= Name: res/layout-v17/conversation_item_received.xml SHA1-Digest: KgJudOLpZCLYQnWA64j03EINKKE= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_385 SHA1-Digest: yPAb2zGtOtW4C/VTuGdD9hVTPww= Name: res/menu/conversation_secure_identity.xml SHA1-Digest: xmKZehi6uJvWFuhq7VmaEPTlLIQ= Name: res/drawable-xhdpi-v4/telephone.png SHA1-Digest: MNupQJZq5K+m8XkBhXUBZo+eIqQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ZW SHA1-Digest: 5Ii48yDkdhHoOHP0+seCyvTM67k= Name: res/drawable-xxxhdpi-v4/ic_send_secure_white_24dp.png SHA1-Digest: ewbLoz2BxWy1dEqspuEHPrDizG0= Name: res/drawable-mdpi-v4/abc_text_select_handle_right_mtrl_light.png SHA1-Digest: 9Yadvmu5mRjm6q0/FxjSOjaktBs= Name: res/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png SHA1-Digest: 4YsKb2IwvWnlnKLr79msGTpIdXg= Name: res/drawable-xhdpi-v4/ic_action_warning_red.png SHA1-Digest: GTAHKyMIHvaE49HCfIDu+Qh6ACY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ZM SHA1-Digest: DXJorIOTg3+wqBCneGeb+yEd0qk= Name: res/drawable-xhdpi-v4/spinner_pressed_holo_light.9.png SHA1-Digest: ojrB5ql2Tg5clwEbaxKtvWw90HQ= Name: res/drawable-v21/abc_ratingbar_indicator_material.xml SHA1-Digest: V8JrLj4745FQ4gUvuKziXuLT2Ac= Name: res/drawable/abc_cab_background_internal_bg.xml SHA1-Digest: 9JWJR0qt9ACSmUHvHpdMc/ljSx0= Name: res/layout/conversation_item_pending.xml SHA1-Digest: oRpXliWIDPflbkT3VdkLewDNoyc= Name: res/drawable-mdpi-v4/ic_missing_thumbnail_picture.png SHA1-Digest: EJXnMu3Q2GZ996ZVbDQ9QHZC8jU= Name: res/drawable-ldrtl-xxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: LRWlMCeV4/Lq+wNklDndVFmtRHU= Name: res/layout/import_fragment.xml SHA1-Digest: MFdCCdeFAzLVqj/DJM8wfp7f97s= Name: res/drawable-xxhdpi-v4/ic_info_outline_white_24dp.png SHA1-Digest: aB9sX6vK5FrIx5rZuc/gkLtA1tc= Name: res/layout-v13/select_dialog_multichoice_material.xml SHA1-Digest: HGp4EP1iVseXgznQe0HcWWQAK0c= Name: res/drawable-mdpi-v4/sms_selection_icon.png SHA1-Digest: gMsauvPGyGNru1K9fJZFRVMguYI= Name: res/drawable-hdpi-v4/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: a2PqqMawE/5F/kuBuWS4K8kdtOo= Name: res/drawable-xhdpi-v4/ic_recurrence_bubble_outline_disabled.png SHA1-Digest: JH3JYUHK6GPX9wicPgy3301y510= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_855 SHA1-Digest: COUdI62w67El5HnnJocGdX/mrQU= Name: res/drawable-mdpi-v4/ic_emoji_objects_normal_dark.png SHA1-Digest: +VtsjXm+z9kYoGwIcG+sBp0DE8o= Name: res/drawable-hdpi-v4/abc_tab_indicator_mtrl_alpha.9.png SHA1-Digest: NJuMq0n7Coq8s/ff6QHhDQhI9uw= Name: res/drawable-xxhdpi-v4/ic_call_white_24dp.png SHA1-Digest: jMVaLm8rUBBL6UaOEgNh1uR2LY8= Name: res/drawable/abc_ic_clear_material.xml SHA1-Digest: 3H791RZwhlVQMbLwc+lrDya3mkU= Name: res/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.pn g SHA1-Digest: DVBX9SO92lStCRmZbxE3WeIe28w= Name: res/layout/conversation_item_received.xml SHA1-Digest: YferUO9TZrPpEnzT+PAB6QWCD20= Name: res/drawable/abc_list_selector_background_transition_holo_dark.x ml SHA1-Digest: LVSNyw7X6tB9DukmioIVl33ZyuQ= Name: res/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000. png SHA1-Digest: IL+CVRaU8e6508PLcaiJwuRr+AM= Name: res/drawable/clickable_card_dark.xml SHA1-Digest: wZlGP0IxpIpOD5dFtkQgwYtVbd0= Name: res/drawable-xxhdpi-v4/ic_emoji_recents_normal_dark.png SHA1-Digest: fJm3H8d8bXfKaasBd6ueOrRoeu0= Name: res/drawable-anydpi-v21/design_ic_visibility_off.xml SHA1-Digest: /d9K4kz+PEEXzPkb7nC/4aBqj+0= Name: res/drawable-xhdpi-v4/ic_backspace_normal_light.png SHA1-Digest: feAfnm3lpkZOOCFvCpL0csdz6xw= Name: res/drawable-hdpi-v4/abc_scrubber_control_off_mtrl_alpha.png SHA1-Digest: bRj1VtphY6uBpf6lW7kaUSr9O08= Name: res/drawable-xxxhdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: +3A3jUbzRBRBAJ8oRmGYp+sMfXc= Name: res/drawable-hdpi-v4/ic_textsms_black_32dp.png SHA1-Digest: IYNs/eeCZQu1jrg8UQ/BjQ16OH8= Name: res/drawable/import_export_item_background_dark.xml SHA1-Digest: FlWeBUjp1SlfU5ll7qfh03DRIHo= Name: res/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png SHA1-Digest: yP2hhhdWfqPQ6VTBFpcZM+5I8sg= Name: res/drawable-hdpi-v4/abc_text_select_handle_left_mtrl_light.png SHA1-Digest: ivlhy5czDUxb5mLUAXmPi72eh/s= Name: res/drawable-xxxhdpi-v4/ic_send_white_24dp.png SHA1-Digest: 85AZAjtkxwcSRGXJg2lwVURxbjo= Name: res/drawable-mdpi-v4/ic_visibility_grey600_24dp.png SHA1-Digest: 3eP6tI7Ay04/hS70aKMd4FRS2wk= Name: res/drawable-xhdpi-v4/ic_movie_creation_dark.png SHA1-Digest: DGSQCdIvB4x6Fcc8o1O6q7FnRz0= Name: res/drawable-sw600dp-xhdpi-v13/ic_backspace_normal_light.png SHA1-Digest: JHjJGulNyd35UOk1LoXOt1ofcDw= Name: res/drawable-xxxhdpi-v4/abc_ic_star_black_36dp.png SHA1-Digest: X8m2s5TyuTw6/NjutpgGA9c1lho= Name: res/drawable-hdpi-v4/ic_emoji_emoticons_activated_dark.png SHA1-Digest: 7ygAp299B58BWYeEKdULEBvW/xE= Name: res/drawable-hdpi-v4/switch_thumb_activated_holo_light.9.png SHA1-Digest: Wh0P8RRSA74oEeBgIjQxEpqcoME= Name: res/drawable-xhdpi-v4/ic_content_copy_light.png SHA1-Digest: +2RjblKDrYCroX9fWbYVAUyzmyA= Name: res/menu/conversation_muted.xml SHA1-Digest: YEPj/UNVHGEmdggQWj/jvZdFi3c= Name: res/layout/country_list_item.xml SHA1-Digest: r1mS7yS/DEnkOyfbMBd3mCVpbQU= Name: res/drawable-hdpi-v4/quick_shutter_button.png SHA1-Digest: QjtAszUFv66UUx2q7V/I7LHTkR0= Name: res/color/done_text_color_dark.xml SHA1-Digest: IKB7Djz1Q+EIn/NVDzkU7VIqAz0= Name: res/anim/fade_scale_in.xml SHA1-Digest: 7e1v5wyirlR6VHusnyFJ2Hy9Soc= Name: res/layout/calendar_date_picker_view_animator.xml SHA1-Digest: F0bVbT2ZKibioHhAV9cjVDr9Yso= Name: res/layout/three_keys_view_leftright.xml SHA1-Digest: qvylvsnZgiNW8Idjqvase6z+Qa4= Name: res/drawable-hdpi-v4/notification_bg_low_pressed.9.png SHA1-Digest: EU8fWX1eKN47RKlWWD9QqF/AGSQ= Name: res/drawable-hdpi-v4/ic_menu_search_holo_light.png SHA1-Digest: UQ0lpCGANHHgI2mpV5r5DkJWUwc= Name: res/drawable-hdpi-v4/ic_recurrence_bubble_disabled.png SHA1-Digest: UgH13/I6FVTNeKKxXr+zwBeKxew= Name: res/layout/design_bottom_sheet_dialog.xml SHA1-Digest: ggp4eiRPFjw7xpnansSaAuamCC8= Name: res/drawable-xxhdpi-v4/ic_emoji_people_normal_dark.png SHA1-Digest: 6TIk7p6tZSIWizqeMUNg0406Lpc= Name: res/drawable-xhdpi-v4/ic_photo_camera_light.png SHA1-Digest: 6cxiCmI31PdRdpf/9J2Ut2NgHH0= Name: res/drawable-hdpi-v4/ic_photo_library_white_24dp.png SHA1-Digest: xjW11RhiWcKttHxxzexpB5ufoZ0= Name: res/layout/abc_action_mode_close_item_material.xml SHA1-Digest: ol6exvHt2AXbYJh63ykzCPOeek0= Name: res/drawable-xhdpi-v4/ic_content_copy_dark.png SHA1-Digest: yfTX/EsIDROEEgyNXostm1MwYQs= Name: res/drawable-xxhdpi-v4/ic_info_outline_dark.png SHA1-Digest: Q/jHAmsUzBHImAlxLBv8CNiyLRc= Name: res/layout/design_layout_tab_icon.xml SHA1-Digest: 1oW2wUEHsS3deIrUBKUEwpNALgo= Name: res/drawable-hdpi-v4/spinner_pressed_holo_light.9.png SHA1-Digest: 2AU1b4tODlUJW7aRFT0bcz4flrA= Name: res/drawable/item_background_holo_light.xml SHA1-Digest: jQeNZ4KNIW1aa77T9tnO6w2jY/4= Name: res/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png SHA1-Digest: e//ti7f9UjoZyXMyT5IRTahD3PQ= Name: res/drawable-xhdpi-v4/ic_backspace_disabled_dark.png SHA1-Digest: fY8wrBom1Rs7BcwNpzmN9KBBDT4= Name: res/layout-v11/notification_template_big_media_narrow_custom.xml SHA1-Digest: c2pXGdyJHysVThqhDQeqzNKal3Y= Name: res/drawable-v21/abc_btn_colored_material.xml SHA1-Digest: D6vZuC+PxnPYmIv2/fsVSWVSDeg= Name: res/drawable-xxxhdpi-v4/ic_download_circle_fill_white_48dp.png SHA1-Digest: +o6A0Rp5Jw9L8+tAx/yo6VoewgU= Name: res/drawable-v11/notification_bg.xml SHA1-Digest: i+Eh+TUCXzBztY9fc7tQAEoaoXw= Name: res/layout/notification_template_lines_media.xml SHA1-Digest: wPkfHDF1gfeniSNJr/05TBfWeGc= Name: res/drawable-mdpi-v4/ic_refresh_white_24dp.png SHA1-Digest: HsxZE2QPxw8uE/sghJClLGul0DQ= Name: res/drawable-anydpi-v21/design_ic_visibility.xml SHA1-Digest: qEznbTUH0S7OP3v84l+B+dYFowc= Name: res/drawable-mdpi-v4/abc_textfield_default_mtrl_alpha.9.png SHA1-Digest: 6BStYFTiYO5hj6qjB+1tC6u+FNA= Name: res/menu/conversation_callable.xml SHA1-Digest: e+Qo7fum/zXigIiwflf9n+jDVTs= Name: res/drawable/abc_btn_radio_material.xml SHA1-Digest: UTYOeeEsntRapgE5ZWUWf1IlU/I= Name: res/drawable-hdpi-v4/ic_advanced_black.png SHA1-Digest: HlPPmpibdkooNzi58MYteXB5Npg= Name: res/drawable-v11/emoji_category_people_light.xml SHA1-Digest: DrKa3ghgfZjL+KHGdcveooLEhNs= Name: res/drawable-mdpi-v4/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: q8RqfUM2laeQX8n/UUH1IoDcBlg= Name: res/drawable-hdpi-v4/ic_emoji_people_normal_dark.png SHA1-Digest: zueG+phX6wlp3c7eGn1nsFV3nEI= Name: res/drawable-xxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png SHA1-Digest: K3ucg8inS6QEpdWRjFnNMV6IIbo= Name: res/layout/keyboard_text_with_header.xml SHA1-Digest: 7toqNa34ScBiaSMyRVjDcks+LCA= Name: res/layout/transfer_controls_stub.xml SHA1-Digest: Y7StVJ+2zbCAJ57fSpB7K1nvlzk= Name: res/drawable-xxxhdpi-v4/ic_keyboard_white_24dp.png SHA1-Digest: zpOmathsmWASUKLLjXnT8xd6f+w= Name: res/drawable-hdpi-v4/ic_backspace_normal_light.png SHA1-Digest: +Cm39iWdZnxZySdet1mlC7GeEGA= Name: res/drawable-hdpi-v4/ic_emoji_nature_normal_light.png SHA1-Digest: yePBAFENDZpbEeeQiP2wvNeQ7aA= Name: res/layout/calendar_date_picker_header_view.xml SHA1-Digest: jcCkvgNadjtCZ9BqIBCmCIO4qdo= Name: res/drawable-mdpi-v4/design_ic_visibility.png SHA1-Digest: u5ybIs/Fy+4WcXRY5rghbiikii8= Name: res/drawable-xhdpi-v4/abc_ic_star_black_36dp.png SHA1-Digest: 84VFkBa9KP++pv1aritXYQWuD68= Name: res/drawable-xxhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png SHA1-Digest: QqPpbBwEr9nywoEL/OHp+2+gZ1Q= Name: res/drawable-xhdpi-v4/ic_message_white.png SHA1-Digest: m76UF09N8rD9hTuj8T2rDxALlkc= Name: res/drawable-mdpi-v4/abc_scrubber_control_off_mtrl_alpha.png SHA1-Digest: mtgMXZE7hreEmqDe9Sm7MomopLw= Name: res/drawable-sw600dp-hdpi-v13/ic_backspace_normal_light.png SHA1-Digest: KWGKSf/BwbfOnB2o4M3/SIKQwgM= Name: res/drawable-xxhdpi-v4/ic_account_box_dark.png SHA1-Digest: g6fZdXTYQ/um9rFwes2raFGyJU8= Name: res/drawable-hdpi-v4/divet_lower_right_dark.png SHA1-Digest: P3P19wRqcDaC8i6CnpJfN4dh650= Name: res/layout-v16/centered_app_title.xml SHA1-Digest: BgyFyU3H6I8jKXmUAVmoYtGdL2A= Name: res/menu/conversation_insecure_no_push.xml SHA1-Digest: qkHAGttTsShSQO4xvqE892992NI= Name: res/drawable-mdpi-v4/ic_scroll_down.png SHA1-Digest: +euyL+tn7NhbEyrgkkSHM6QhGM8= Name: res/drawable-mdpi-v4/ic_delivery_delivered_dark.png SHA1-Digest: kskydZAMuGYG9PTEtrB84KZQ7+A= Name: res/drawable/abc_item_background_holo_light.xml SHA1-Digest: fDShwzepkR49aya4UNh+v22s1Nw= Name: res/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png SHA1-Digest: hOoziuoJ3C2IMcfDzYzmL7E6Tm8= Name: res/color-v23/design_tint_password_toggle.xml SHA1-Digest: uKmyWahGcwpgv98l1DYuTUPcE0M= Name: res/drawable-xhdpi-v4/ic_keyboard_grey600_24dp.png SHA1-Digest: qDBBlKnX8bs+TVPhSny6CzeMhRs= Name: res/animator/rotate_minus_90_animation.xml SHA1-Digest: AhVLtjcJdoeXGcim/ix1HCO/gQw= Name: res/drawable-hdpi-v4/ic_image_dark.png SHA1-Digest: h+QGEnOGB5w5rMVo94ZB9dxDRMc= Name: res/drawable-xhdpi-v4/textfield_disabled_focused_holo_light.9.pn g SHA1-Digest: OzQ1tHx9DB5q6GA0ZRNG3prDizY= Name: res/layout/abc_popup_menu_header_item_layout.xml SHA1-Digest: PhE+1WCDHuZ2z9mTXon6ESNGUC4= Name: res/layout/database_migration_activity.xml SHA1-Digest: 0L3RLBOxpA1MVL/q8lNfKLqe9KU= Name: res/drawable-xxhdpi-v4/ic_pause_circle_fill_white_48dp.png SHA1-Digest: YSwwVKAlS7zW/b95XI5PflY7GKE= Name: res/drawable-xxhdpi-v4/ic_volume_up_light.png SHA1-Digest: 1Qxa+uqLhL9bsx+Xo7zWBMQw9l4= Name: res/drawable-xxhdpi-v4/ic_circle_fill_white_48dp.png SHA1-Digest: ggrDW7v0qnp5WAbHjQQS7zpIvkQ= Name: res/layout-v17/conversation_item_sent.xml SHA1-Digest: ak7Kolh67Y68W+PPjTvedX/qw5E= Name: res/drawable-xxhdpi-v11/icon_cached.png SHA1-Digest: ua/0ckOAoVPgxZWb2msmMkbF8FE= Name: res/drawable/conversation_item_sent_indicator_text_shape.xml SHA1-Digest: Y+VvRJBHBMH3e3FleYI1UZWhQpo= Name: res/drawable-xxhdpi-v4/ic_emoji_nature_normal_dark.png SHA1-Digest: tnWnyvoZo4GVHUFkjHBiuft4KmI= Name: res/layout/video_player.xml SHA1-Digest: ZDQfiwr4ntdWq3CAZLvCBrn9kJk= Name: res/drawable-mdpi-v4/ic_backspace_normal_light.png SHA1-Digest: ZOX3U8jCVDPmfkZ3UzQdobzyd3A= Name: res/drawable-xhdpi-v4/icon_dialog.png SHA1-Digest: qPa6NvQ42VAtw8T4KKsrCGPFs/g= Name: res/drawable-hdpi-v4/ic_search_holo_light.png SHA1-Digest: q0rMt4Ru61/YE5rrmHEeki5RDW0= Name: res/color/recurrence_spinner_text_color.xml SHA1-Digest: QH+LNgcJnXMaHumk/oa+/LvF/K8= Name: res/drawable-xxxhdpi-v4/icon_cached.png SHA1-Digest: aNW2LVhGxXQgGuxWTs5xFr2hFTA= Name: res/drawable-hdpi-v4/ic_brightness_6_gray.png SHA1-Digest: rOJAkQKZKFJtBPUn7YrLuC2vkig= Name: res/anim/design_bottom_sheet_slide_out.xml SHA1-Digest: b7nLwVuguqkRn/0QJ5T+s+s304Y= Name: res/drawable-hdpi-v4/ic_advanced_gray.png SHA1-Digest: HrebOCo27YqFksFwsGqwRxkOABw= Name: res/drawable/abc_ratingbar_material.xml SHA1-Digest: eEVopjQX6W514WoHxn9rLKQ1T5Y= Name: res/drawable-xxxhdpi-v4/ic_photo_camera_dark.png SHA1-Digest: 0QgWvdvDxdowlh4HYdQLm8l/1TY= Name: res/layout-v21/abc_screen_toolbar.xml SHA1-Digest: RSm7QsJv1orHpN4/fzQ0JV8cXgw= Name: res/layout/date_picker_dialog.xml SHA1-Digest: aR0MM8nTd1RA826WRCiVc46R2Z0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_979 SHA1-Digest: MRnTvzcPicoarmNssXPD0gjcHTs= Name: res/drawable/white_radius.xml SHA1-Digest: vJ/dDcwo+MQQr8+spnN4wPHrpBk= Name: res/drawable/abc_item_background_holo_dark.xml SHA1-Digest: EYfXWBiFkD5pE+x4VQkg8UKkBDw= Name: res/drawable-hdpi-v4/sms_system_import_icon.png SHA1-Digest: 0zG+KUxYtsfx/OZaI5FkMcq4ySs= Name: res/drawable-hdpi-v4/ic_push_black.png SHA1-Digest: 7fJv39n+mRT4hrun73lCTuWrJEM= Name: res/drawable-hdpi-v4/ic_emoji_flags_normal_light.png SHA1-Digest: TDH6Q0QaGikzI8z9SSXhPTBi1Hs= Name: res/drawable-xhdpi-v4/abc_list_longpressed_holo.9.png SHA1-Digest: C4a5xmVEzcIJxede0Urh0qZwCmg= Name: res/drawable-xxhdpi-v4/ic_done_white_18dp.png SHA1-Digest: wOg5S1bkowRA9IfOe4Ml8vDq6CY= Name: res/drawable-xhdpi-v4/ic_textsms_black_32dp.png SHA1-Digest: AlYxqxaWCxZWc/iDBFSY1Somp+I= Name: res/layout-v17/abc_select_dialog_material.xml SHA1-Digest: B6frzo4lLBVPjLWlbHfkHH/2zLU= Name: res/drawable-xhdpi-v4/ic_push_registration_reminder.png SHA1-Digest: /es9AZtoQI8Ta4GTB/HyJcy0FHM= Name: res/drawable-xxhdpi-v4/ic_send_white_24dp.png SHA1-Digest: xcpEXKnjWlSqUlpQEMnvkLUWJpA= Name: res/layout/conversation_activity_emojidrawer_stub.xml SHA1-Digest: C7rRCyzp/GaaBT0HAenRiFKOMGw= Name: res/drawable-xhdpi-v4/ic_add_white_24dp.png SHA1-Digest: l9WuayKKYwSKF3BAAXsFfIlAn1g= Name: res/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_015.png SHA1-Digest: PIrE1bETED2AcFA+Z0PCJDOewO4= Name: res/drawable-xhdpi-v4/ic_clear_white_24dp.png SHA1-Digest: doY0jLzMBaeknvZcaHU55mEcNDQ= Name: res/drawable-xxxhdpi-v4/ic_photo_library_white_24dp.png SHA1-Digest: 4hbdFtP1OVvSP9H1SmvqJlhV6T4= Name: res/drawable-xhdpi-v4/abc_ic_star_half_black_16dp.png SHA1-Digest: 4NZnda4yf8qiNhg33fnhquq094o= Name: res/drawable-xhdpi-v4/notification_bg_normal.9.png SHA1-Digest: j66Eu60yXsTt2+rWG7/Bbt3KErg= Name: res/drawable-xhdpi-v4/ic_check_normal_light.png SHA1-Digest: 8QlwtJ2fccupMeU2If04UCygxos= Name: res/drawable-mdpi-v4/ic_archive_white_24dp.png SHA1-Digest: b7Q2pRkgVfvE4IxfNchLHu03+kM= Name: res/layout/psts_tab.xml SHA1-Digest: ut5zIC2Qke40czbjy2bU3/eq8ck= Name: res/drawable-mdpi-v4/ic_emoji_flags_activated_light.png SHA1-Digest: z9sgNyG1jC/CSDWTcLWRT5hppOg= Name: res/drawable-hdpi-v4/ic_audio_dark.png SHA1-Digest: re7dh5kEFBeVfcfrVP5pPVEd3fc= Name: res/layout-v11/conversation_fragment.xml SHA1-Digest: wBy1lqSfDOIFs+SjnAHEMdnPwzQ= Name: res/drawable-hdpi-v4/ic_app_protection_black.png SHA1-Digest: R8rC9HaXHQ0BpzxXbFIyIdzn9uE= Name: res/drawable-hdpi-v4/ic_select_all_white_24dp.png SHA1-Digest: GKLYH4WsrWYSOLbxzYJ2C3+29V4= Name: res/drawable-xxhdpi-v4/ic_photo_library_white_24dp.png SHA1-Digest: P2xr3ZeQwJcQR/qA6Vk/FmMxNHU= Name: res/drawable-mdpi-v4/ic_recurrence_bubble_fill.png SHA1-Digest: 7rU4lnig2n/p1+EnQKX2RGhw+5g= Name: res/layout/conversation_item_last_seen.xml SHA1-Digest: Ud6D9VpTZ59BZFWRquIaLsnz0D8= Name: res/drawable-xxhdpi-v4/ic_advanced_black.png SHA1-Digest: PdC6cKv/SDMc+zLeLgZg7lAN2SM= Name: res/drawable-xxhdpi-v4/ic_recurrence_bubble_fill.png SHA1-Digest: SvktZ/4DTpGiosr5uLgnDHEreWs= Name: res/layout/contact_selection_recyclerview_header.xml SHA1-Digest: nA+tCTWyXEXLRp0lp0EY09gGbDc= Name: res/drawable-xhdpi-v4/ic_emoji_symbols_activated_dark.png SHA1-Digest: DnNQnLERDE4Vcc/1yBfNui3lYIc= Name: res/drawable-hdpi-v4/icon_lock.png SHA1-Digest: 6BXCijrQeXipalz9npuKqy4DSRA= Name: res/menu/conversation_insecure.xml SHA1-Digest: hZ6jvcpMSW+ZgJOALoh2/efSXOw= Name: res/drawable-mdpi-v4/abc_list_longpressed_holo.9.png SHA1-Digest: GFCjouEOsx2zwJ4qrfooYQ63590= Name: res/layout/three_keys_view.xml SHA1-Digest: Spo4b3TNfcBUjvX7FkKwcGwVFas= Name: res/layout/time_picker_view.xml SHA1-Digest: i/HO6Ciac9XpXg6MhQnXpWGMAPw= Name: res/drawable-xhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png SHA1-Digest: aGoDqShCvfRBOcYadujzbODhe1U= Name: res/drawable-xxhdpi-v4/abc_popup_background_mtrl_mult.9.png SHA1-Digest: qQpaYoGWL908h/WoyV81hrJSp9E= Name: res/drawable-xhdpi-v4/ic_send_sms_secure.png SHA1-Digest: /7klwvylPYsOKFO7iQV7v/Vo0eU= Name: res/drawable-hdpi-v4/ic_delivery_delivered_dark.png SHA1-Digest: 6jdYE2gOPsro7FC7U4wm1vci6A8= Name: res/drawable-xxxhdpi-v4/design_ic_visibility.png SHA1-Digest: QprzI4wdBmyk04hYKt3GSMEip/g= Name: res/drawable-xxhdpi-v4/ic_call_split_white_24dp.png SHA1-Digest: BdsShD0Cdwp93ix2AzbIdNWTrX4= Name: res/color/abc_secondary_text_material_light.xml SHA1-Digest: wP7WZmVV6oEHTqT4ks25UoAPyNU= Name: res/drawable-hdpi-v4/ic_emoji_people_activated_dark.png SHA1-Digest: moTnub9fz8+d7mL751FiGsF5Wog= Name: classes.dex SHA1-Digest: uE2fNrxx2qKrqL76ikYJU/MgbbI= Name: res/layout/abc_screen_content_include.xml SHA1-Digest: 5b3DomolwZfchrtJxjtLR+9TEkg= Name: res/drawable-hdpi-v4/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: HDJoTnQuLh9V9/4kv+/UeX7wGTY= Name: res/drawable-hdpi-v4/switch_bg_focused_holo_light.9.png SHA1-Digest: x7N6bd7BQ9gunVUj5pyMTy+B3f0= Name: res/drawable-xhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png SHA1-Digest: RnQxBqnfZP2w/UH+bBFTojv2UoA= Name: res/color/abc_hint_foreground_material_light.xml SHA1-Digest: KuAFKms2hZw9E3Is9w+s2zDVQcQ= Name: res/drawable/switch_thumb.xml SHA1-Digest: 3JRoidAeg5CQDYIHfLmmbm9T2jM= Name: res/drawable-xhdpi-v4/ic_send_push.png SHA1-Digest: 9BvcpB99/bvxWwSpv7b58B2Vo7Y= Name: res/drawable-xhdpi-v4/ic_send_sms_insecure.png SHA1-Digest: qo8obCTtUBe01tBhGExdX+cZ8Yg= Name: res/drawable-mdpi-v4/abc_list_focused_holo.9.png SHA1-Digest: jJIIxBXFlVwxMesuJlFFhjvLhPM= Name: res/drawable-mdpi-v4/ic_audio_dark.png SHA1-Digest: HE0MxO6bxPvZrPqI1/FWkOpxN24= Name: res/layout/conversation_item_pending_v11.xml SHA1-Digest: tdwgB5sGkESfShcr5E/hJrXnWHE= Name: res/drawable-hdpi-v4/ic_unarchive_white_36dp.png SHA1-Digest: GWA5xmtnP7HH6n1ZdZ5dGKAOhNk= Name: res/drawable-xxhdpi-v4/ic_photo_camera_light.png SHA1-Digest: GToFtYpo05K8zJYrl7aHSua6fg8= Name: res/drawable/done_background_color_dark.xml SHA1-Digest: Rlncna6lQ7w11D50KF0uWHMiDkY= Name: res/drawable/abc_ic_go_search_api_material.xml SHA1-Digest: WlVPR6cSq9TAkubAAkePiOlg8nY= Name: res/drawable-xhdpi-v4/abc_textfield_default_mtrl_alpha.9.png SHA1-Digest: L12XNgC05BSQghB6JCrs8Us9eEo= Name: res/drawable-xxxhdpi-v4/ic_badge_24dp.png SHA1-Digest: ZCzHQl4OQDCch8q9Z2NUHjque90= Name: res/color/switch_thumb_material_light.xml SHA1-Digest: vXyvBrnI6VAMvOAaXTZ3qrpE58I= Name: res/drawable-xxhdpi-v4/ic_push_black.png SHA1-Digest: Wo6Su4ZMOSWk13DHcWQKIB8yHMk= Name: res/animator-v11/rotate_minus_90_animation.xml SHA1-Digest: dAr9tiloBMntrmMmfeQ1JW7RJVM= Name: res/drawable-ldrtl-hdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: u6/uL8RpuH0uA4j5k6GHmFtKKaA= Name: res/color/dialog_text_color_holo_light.xml SHA1-Digest: tw9Z15LR92IEz7YWFseQJAyVUpU= Name: res/drawable-xhdpi-v4/ic_menu_lock_dark.png SHA1-Digest: DJRuq8KIu10VVbJLKiaYrYWc/Cs= Name: res/drawable-xxhdpi-v4/icon_dialog.png SHA1-Digest: QhfVY7UBQilNAfrHJXWil0t74RI= Name: res/drawable-mdpi-v4/ic_check_white_24dp.png SHA1-Digest: oTQ8U+Rgg+M3vuYmqxlxC0toJ0g= Name: res/drawable-hdpi-v4/ic_save_white_24dp.png SHA1-Digest: N5LsvDNhv9nEwWmboKHAvvwMRNo= Name: res/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_015.png SHA1-Digest: Txi4nHde0NvRVGH4WjelV6dyOKU= Name: res/drawable-hdpi-v4/abc_text_select_handle_left_mtrl_dark.png SHA1-Digest: K41jD6ysbp47ZcvjjR+O3lf5WDY= Name: res/drawable-xxhdpi-v4/switch_bg_disabled_holo_light.9.png SHA1-Digest: JxRwd3DKJhNPzikP2NFPrwYD4WQ= Name: res/drawable/pause_icon.xml SHA1-Digest: dCkVzXnnMv4YZfjzO1Mja5vbw2o= Name: res/drawable-hdpi-v4/ic_keyboard_grey600_24dp.png SHA1-Digest: VVc0f3FyhPmzq7mzgvY/w0IHt6w= Name: res/drawable-hdpi-v4/textfield_focused_holo_light.9.png SHA1-Digest: NfEGOtZ0YkueMDHG9onUNJVuHAM= Name: res/drawable-xxhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png SHA1-Digest: 07+MMsIKk8a3BObx9eEkeKwYSSk= Name: res/drawable-hdpi-v4/ic_movie_creation_light.png SHA1-Digest: URIg5P3muuPYdqOpqn+pX8knF5c= Name: res/drawable/recycler_view_fast_scroller_handle.xml SHA1-Digest: lId/oCzHC4v97KJfaSwHpjh8Vk0= Name: res/drawable-v11/emoji_category_flags_light.xml SHA1-Digest: C23igqMnLW5kCfUE8FpsQeZLIos= Name: res/drawable-hdpi-v4/switch_bg_holo_light.9.png SHA1-Digest: CpRZZ1GTLscTpuMbiso8PfUMFTA= Name: res/drawable-hdpi-v4/ic_emoji_people_normal_light.png SHA1-Digest: PjxiZtdcSi0eepYbqyq295v8sn8= Name: res/drawable-xxhdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: QluevaTHgv86WnKHj0Dyu1BcXpk= Name: res/drawable-xhdpi-v4/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: 2SSuJk3m1pafpmf81TSs7M6iuf0= Name: res/drawable-xxhdpi-v4/abc_text_select_handle_right_mtrl_dark.pn g SHA1-Digest: 69lnE53qPLgE18gtGzVrdAF6RUM= Name: res/drawable-xhdpi-v4/ic_notifications_gray.png SHA1-Digest: Df/E+k9TSsm3RF962SHeTO3gQ9Y= Name: res/drawable-hdpi-v4/telephone.png SHA1-Digest: PV63hNvLQzhizICDSsAmwazBLzM= Name: res/layout/number_picker_dialog.xml SHA1-Digest: g9Bf7abBubKlGpI+LWdj4jh1Y3M= Name: res/layout/country_selection_fragment.xml SHA1-Digest: 9FP5VBphB5dDjtyb6LGAejYRDDk= Name: res/drawable-mdpi-v4/ic_emoji_symbols_normal_light.png SHA1-Digest: vXmDmMJ5oQnedF/DCmXdsXqUysI= Name: res/drawable-hdpi-v4/ic_visibility_white_24dp.png SHA1-Digest: z1F8ZsbpCOHYL3gHNmkhEoMwocA= Name: res/drawable-v21/avd_show_password.xml SHA1-Digest: PizmnkTFwNC7csslcnSb00Iv2GY= Name: res/drawable-xxhdpi-v4/spinner_disabled_holo_light.9.png SHA1-Digest: /azIzHZ1133FIi3w99IeVESqufs= Name: res/drawable/abc_vector_test.xml SHA1-Digest: 4yJGw44hdFgotEL2tng9U1c82Mw= Name: lib/armeabi-v7a/libcurve25519.so SHA1-Digest: oYaBWE6Prj5toeF6ZASmtunvkoU= Name: res/menu/conversation_add_to_contacts.xml SHA1-Digest: fh+QfduspZw3FJJnfpxs4X/FuWQ= Name: res/drawable-sw600dp-hdpi-v13/ic_backspace_disabled_dark.png SHA1-Digest: 1xOse/knAUkmdSJRE7Gm2BWULK4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LK SHA1-Digest: ko6X10FJKBj0QYuPsWPrM62WUX4= Name: res/drawable-mdpi-v4/ic_visibility_white_24dp.png SHA1-Digest: 2/xp3jjRLpzFxQ6sZaLc973TvBo= Name: res/drawable-mdpi-v4/notification_bg_low_normal.9.png SHA1-Digest: WuL2/toxWwVCkWEMRxb1EQOyMhA= Name: res/anim/design_snackbar_out.xml SHA1-Digest: tSHapqXFI6k7SCynouBmerWDWcs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ER SHA1-Digest: CiK7I1Sa10t6+pGTRT46H57PswA= Name: res/drawable-xhdpi-v4/ic_search_holo_light.png SHA1-Digest: Krgj7/Cu7xR6w6ZP7BIU1glKUck= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ET SHA1-Digest: oG3J7YbEOKhS6dN6m3XElR76Uqw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ES SHA1-Digest: P8KZt3DVwQNU9U3dDlFGFurQorE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LS SHA1-Digest: 3eHHAZpI08lTuNESlnVb1GPdI9A= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR SHA1-Digest: SEm2FwEPAdTVDqCx7lLTp/n2T8E= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EE SHA1-Digest: GenDAfyKn99KSYfib/3FBalvi28= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LU SHA1-Digest: q8g4fZ6rCb3VSyKBk8zr8G94pXs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EH SHA1-Digest: +KAelbDxTopdKY8tZcrGeGOy6/E= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EG SHA1-Digest: NOmrr8EO8An5VQB/Ewan7/3BILs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LT SHA1-Digest: 9zEJajp/2WPawy2bxkvAbcMAcGY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LV SHA1-Digest: Rf7pQcatiPUybVQYtoNWVkQF2N0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LY SHA1-Digest: FRsttQtKnO+HTkhZ8nNthNU8Q1c= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EC SHA1-Digest: HOPN0fJQ2e8M9uI+aAM8pAMDKVI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA SHA1-Digest: N7hVhtzF5rIvSTX/OkpGKsFn9eg= Name: res/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_015.png SHA1-Digest: sSo2eVyCVNeDBah+XyDsR3c+eao= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MC SHA1-Digest: d9Onu4cbK9qIPE3m/bRARrOwNEs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD SHA1-Digest: HKD2beGJlD8Q+iDF3BhRoYu498Q= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ME SHA1-Digest: eieLvW4At5ftphyCQqxR2nZYY9w= Name: res/layout/notification_template_part_time.xml SHA1-Digest: W/kytmaWkF2VPENQ086DWVdFzxY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MF SHA1-Digest: XbV+szql0zBvzg+l2YNVpZk59cs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MG SHA1-Digest: TqdHY+Aneh9NS3ecdbhZff6WRIc= Name: res/drawable-mdpi-v4/ic_notifications_gray.png SHA1-Digest: nR8L8PHu6qYWyc+B0FbA7NLEUaw= Name: res/drawable-xhdpi-v4/ic_emoji_flags_activated_dark.png SHA1-Digest: m1hXrT9B1hmf35sVuclo7StZqR8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MH SHA1-Digest: eBu/3cUGVq/NDguCg8djRra8Vi4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DZ SHA1-Digest: 26RxyOaL6MJyB7ZDvc/iWY2kIlk= Name: res/layout/recipient_filter_item.xml SHA1-Digest: QntBBcYW90Shhm0OV1e7vvuiEmM= Name: res/drawable-v11/emoji_category_emoticons_dark.xml SHA1-Digest: Nr4UYN3LOdgJhjONAidin3Hgigw= Name: res/color-v23/abc_tint_seek_thumb.xml SHA1-Digest: Vnia/GdLsxJAaJPbtccRc+DNCGQ= Name: res/drawable-xxxhdpi-v4/abc_ic_menu_share_mtrl_alpha.png SHA1-Digest: zswdlAwmLMUdC8KexYY+VmSOxS8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FO SHA1-Digest: nRQLplgu/j5xCs6/Xs6iIcgTKJY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KI SHA1-Digest: UvEWzbq1iY+eYvwm6FrE2jkONw8= Name: res/layout-v21/notification_template_icon_group.xml SHA1-Digest: XLOAqJg1tab9l8hNVNyDb6OXchg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KP SHA1-Digest: vFoLsjHOWFHvSfUiE1X2la4Cnao= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN SHA1-Digest: McwX1/3qNv2fWPXVHVDT9rWPOzU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KM SHA1-Digest: fVwGfcTe+ypNcEutqQVh4hZ+WhQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FR SHA1-Digest: zjLXabCdm6RwLsAbGMUGIID4iuc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FI SHA1-Digest: Gq5V4OY0faJ1vzbpXJe2eeX2LTM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR SHA1-Digest: Zmuire8Vc0o/q0jD42zY9FbAVFs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FM SHA1-Digest: FRwN00RDtX/xywLB27kNRjXaddo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW SHA1-Digest: p+A43cemg6fJ42DHd3uVUd23SME= Name: res/drawable-mdpi-v4/ic_emoji_emoticons_normal_light.png SHA1-Digest: n50CsI8Tev0fRuP1872Pd0izlsE= Name: res/drawable-hdpi-v4/ic_emoji_objects_activated_dark.png SHA1-Digest: 3vgsFON2BBKOUhTKy32/9MfPJ90= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FK SHA1-Digest: usWIisE23KlcNfPSmc+1c9tyJKM= Name: res/drawable-mdpi-v4/abc_list_selector_disabled_holo_light.9.png SHA1-Digest: S/+WIalIT7QGoZ4J/VOqr0XEGEM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FJ SHA1-Digest: ++PSC+2VIAd/orrJf/FYj9tbSZU= Name: res/drawable-xhdpi-v4/ic_lock_dark.png SHA1-Digest: apj3XDFuBznvT8FqnzsC8hUgSzU= Name: res/drawable/play_to_pause_animation.xml SHA1-Digest: lC2jsFFRN0P5AV5WRfTxog4PtKE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY SHA1-Digest: +DUNnjadV+WtxMMiD2BjXTb/Xos= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KZ SHA1-Digest: y2WBJ/nXi6ntXL181uUBl0hjwmo= Name: res/drawable-xxhdpi-v4/ic_emoji_places_activated_light.png SHA1-Digest: scW4BrCBqv0pjWht85aaGs9ApCs= Name: res/anim/design_fab_out.xml SHA1-Digest: eqyMleghgi0F32G8QHJUnftDRAc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA SHA1-Digest: gS+NRXuxsM0J7poj3wGnfcgO4pw= Name: res/drawable/button_background_dark.xml SHA1-Digest: /33Cy7m3UkKOcki5nldzXnDJowU= Name: res/drawable/abc_ic_search_api_material.xml SHA1-Digest: fUkZfr9l9WcTa5TsedyqQlEfT8Y= Name: res/drawable-mdpi-v4/switch_thumb_disabled_holo_light.9.png SHA1-Digest: h+7dgWRgNzZ6qYbj0pMQoC2C4No= Name: res/drawable-xhdpi-v4/ic_emoji_recents_activated_light.png SHA1-Digest: r2UoA5vgl7VxlE/U+jaISJmY46g= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB SHA1-Digest: V7Znjaco9f/Iy2AVoZGzEHgFrto= Name: res/drawable-hdpi-v4/ic_lock_dark.png SHA1-Digest: j7x65/O64r4egbF3Vpw2+AGuv9U= Name: res/drawable-xhdpi-v4/ic_unarchive_white_36dp.png SHA1-Digest: 76V7Hze7OYOCHtxTFbFp6y2qvCw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LC SHA1-Digest: U2v7sNQUX871iIgs0rB0Omj6/Lc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LI SHA1-Digest: W+xasLluPUD63y6iVyNGkRRSFo4= Name: res/drawable-xhdpi-v4/list_selector_background_selected.9.png SHA1-Digest: YJ9zp2BVWbYoWuD1G3xXbV47jvM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GT SHA1-Digest: dvrpscpscAUgxE4hiom8hsER1/o= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM SHA1-Digest: oCB0maGB/LsuiBZSstc8Jq0MnJE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JO SHA1-Digest: BuohdoPOVZoe9JBbRmGBloJIWkw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GU SHA1-Digest: 818Cc0DjonRGxvR1hmDeLr33fd8= Name: res/drawable-sw600dp-xhdpi-v13/ic_backspace_normal_dark.png SHA1-Digest: Aw8aqi+S0LDgyLzdEtK2UroA02Y= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GP SHA1-Digest: +UQmfbXc0KRcxLLkqK5LUVN9cVw= Name: res/drawable-v11/emoji_category_emoticons_light.xml SHA1-Digest: Z+gMiNhbCpygIX9WwGge//a90Fk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GR SHA1-Digest: MyEGCggYEB0nER9VELLNbVM4nPM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GL SHA1-Digest: /IqyEOK/kj1QOxvYC7Z8yHkuds4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GN SHA1-Digest: +OCSKP9M7LZN2mc4egttWfQbspc= Name: res/drawable/emoji_category_nature_dark.xml SHA1-Digest: 4m2xH9BcG4ZfhSK8nWd+qBUG6vg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GM SHA1-Digest: yvPOdH0m/84dAXizn6oP3tr2Qyw= Name: res/layout/three_keys_view_text.xml SHA1-Digest: KMedMcKk3gA8FYjf6+amYb9MZyw= Name: res/layout-v21/conversation_item_sent.xml SHA1-Digest: bjlzPTTyRH8puCCeWefXtdCq5+s= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GH SHA1-Digest: 7tyVPL7CR8hqZrZL8J42Zb4f9Vs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GG SHA1-Digest: w9mwhy8uAaRZYw9eKYx4vOH5jY0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP SHA1-Digest: kZtQzweakUTtB6umzZYno/rm5ms= Name: res/drawable-mdpi-v4/ic_warning_light.png SHA1-Digest: m1T8ZK8xW9wGNyF/ScOxmQjmMdY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GI SHA1-Digest: cVLCl6ZK6aazb8dfbTLDEmDbt3I= Name: res/xml/recipient_preferences.xml SHA1-Digest: FNVn3EmgV9mPuhyGbO41W2l+hcA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GD SHA1-Digest: 23f1WPq1tadou7YxZCenIiHx5Sw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GE SHA1-Digest: ewLccLbCd3W7UTEMs3WH3wFSwJE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GF SHA1-Digest: kDeHudl55sl+4Fmq9m9oiCDt2ko= Name: res/drawable-xxhdpi-v4/ic_delete_white_24dp.png SHA1-Digest: fo26gQ1rTD74Xa4FxnDkjcSsmyU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GA SHA1-Digest: KGZCYMIxAAyrB4sT17e9MxpYhts= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GB SHA1-Digest: c2SE5JUFbRwtVCGW3D53NJuPjIk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE SHA1-Digest: jWlj6xDyZ5cjFZU0PFtz4SqPRoI= Name: res/layout/icon_list_item.xml SHA1-Digest: W6DrW/IO8lkbYV8VVYoqni4fB9A= Name: res/layout-v17/notification_template_big_media.xml SHA1-Digest: BRD+EvTCwQbpHEpE0Gm45+E226w= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG SHA1-Digest: gtqR6K//aPYG32NSAU8kVcV+ltU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH SHA1-Digest: Zx7MhNm+QMlmk9IpN6rpPr+ZmHw= Name: res/drawable-xxhdpi-v4/ic_keyboard_grey600_24dp.png SHA1-Digest: OBuIDBljM8VNe5SpGBht4pv7GXM= Name: res/drawable-xhdpi-v4/ic_video_dark.png SHA1-Digest: 6nBugjicr6a673HUCCmJW8Q2Tts= Name: res/drawable-hdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png SHA1-Digest: cK/LCW7Y07tXQ8e5BdotU64US0I= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN SHA1-Digest: 0zQlSUUDB9rFqElM6jcUMxiLntU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IM SHA1-Digest: rzZujVGPgGiwBibfVR3e97DmYhY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL SHA1-Digest: BJBBAs/mxIFQVJAjfdLf24Xhh+s= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HU SHA1-Digest: cNe4OzWlBFBSMv+CcO+AE7m1Jt4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HT SHA1-Digest: qAHFHFiqfqrSRBndW5w98Lkfmrw= Name: res/drawable-xxxhdpi-v4/abc_ic_star_black_48dp.png SHA1-Digest: 71NIJQvOQ0vvgmCgwLtmHxelFyc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HR SHA1-Digest: dqsUO43PgYgm7aFDv22LyKkd58Q= Name: res/drawable-xhdpi-v4/ic_attach_grey600_24dp.png SHA1-Digest: eP8SP5FjNQp/DbNhAUa+6SSjP/Q= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HN SHA1-Digest: jFRQ55QAcI37lIk+q2SlTR3XQWA= Name: res/drawable-xhdpi-v4/ic_emoji_flags_normal_dark.png SHA1-Digest: xqJQwPDxU7dGMfeBydeKOClG/wQ= Name: res/drawable-xxhdpi-v4/ic_archive_white_24dp.png SHA1-Digest: gbr5qA65hgC92sdOpoFVMacpVxE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT SHA1-Digest: Qagj8Yf+lzuwmuSR369/BX3wn5w= Name: res/drawable-mdpi-v4/list_selected_holo_dark.9.png SHA1-Digest: w5jMjyx0n/lk3stiPGrcn7tdZT8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS SHA1-Digest: EU6eNECplfpb6ZjxrSmM7LKzfT4= Name: res/drawable-xxhdpi-v4/ic_group_photo.png SHA1-Digest: Amux783eUEcFs+YIx6Ho4QwFmuk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR SHA1-Digest: FxzShd80T65+VHCAVMpqR4RLVts= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HK SHA1-Digest: ZdcNCKGviOCbNheKAwIBsGeGh0Y= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IQ SHA1-Digest: bSeQ7rQuW3w1sp6XJ9w3BjUAc4A= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IO SHA1-Digest: LCU2bG18IExWKOFnWvywd+yyXN8= Name: res/layout-v16/notification_template_custom_big.xml SHA1-Digest: 6Cc+22UvH+lxCnlhjT1zkyJL+PI= Name: res/drawable-xxhdpi-v4/ic_emoji_flags_normal_light.png SHA1-Digest: Ude+n/pbQCHeuTUCYUnBND+DjF0= Name: res/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_000.png SHA1-Digest: WXKtpz66pJSKelShj899BDnb29U= Name: res/drawable-mdpi-v4/ic_info_outline_white_24dp.png SHA1-Digest: qgNNf5R+lfdKfdLL2XwIyLo1Pfc= Name: res/drawable-mdpi-v4/ic_photo_camera_dark.png SHA1-Digest: gMUfLyp6cNpmLdmoRShpG6JDlVA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JE SHA1-Digest: HYBvWI2Z0tlb1LIu2hHO9zr5s80= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GY SHA1-Digest: mxcavk/xn8Yb5iJm/8+WVxfGvSo= Name: res/drawable-mdpi-v4/ic_emoji_nature_activated_light.png SHA1-Digest: yJXAdPAwUHY28PneOgCbctsGxzQ= Name: res/color/abc_btn_colored_borderless_text_material.xml SHA1-Digest: WW68R7XHb3JiHwrYdxFmx073AyI= Name: res/drawable-xxhdpi-v4/received_bubble.9.png SHA1-Digest: W4de+5UEqZE2m7rCCt25/Z1CxWI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GW SHA1-Digest: RQiV1VkMzFqN9303Z4US/5oq7UQ= Name: res/drawable-xxhdpi-v4/ic_audio_light.png SHA1-Digest: 1BwT4HEB1FH0e8ErUvvw9UVQqqM= Name: res/drawable/last_seen_divider_text_background_dark.xml SHA1-Digest: S9qKuKzACOFXweC2S3e7be8G510= Name: res/layout-v11/custom_default_preference_dialog.xml SHA1-Digest: 39iUnvmNYHFHassDu5Sf3avA4oY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HN SHA1-Digest: wmdwU8MxPnbinZsXDJTGUL071ls= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AC SHA1-Digest: GSmldQS0V0LF8rbhzh3xXNxJoQU= Name: res/drawable-mdpi-v4/switch_bg_holo_light.9.png SHA1-Digest: vON82tQz84Bild5sO6RktMAlv6M= Name: res/drawable-xxhdpi-v4/ic_notifications_gray.png SHA1-Digest: 3Zb0LfM9HhNjEGyz0Fy5a1z6KPc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AD SHA1-Digest: ar9/1nU9D5hgsnOcx5u0PZwJ/9c= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AE SHA1-Digest: lqJvEENSJdhMOioyyZbiJZOjwI8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR SHA1-Digest: mtcNesgfP/cR+8TfEcqAxeLWRSA= Name: res/animator-v21/design_appbar_state_list_animator.xml SHA1-Digest: TK0TaKV09WhgYkWapszUr/I61Bk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AF SHA1-Digest: sSPsntPXIT4zP2TQYmy3KUo2TBM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HT SHA1-Digest: LyVHo6yRt1b4lxnNknSrW3pelEM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AG SHA1-Digest: P7W5c/VJCbLW7GK6jxGqHH5W5Gw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HU SHA1-Digest: 7vClN02DV7yKBbUWMeHRDD79ffs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AI SHA1-Digest: 27Y8YvEVm8dFdgLgQmCAkFcqBPM= Name: res/drawable-hdpi-v4/ic_forum_grey_32dp.png SHA1-Digest: ipBt0rZC+mrVcuHRhn+zOZXNqE8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AL SHA1-Digest: 79eU7sRCV2FUU4rHUeTSjB+TPmE= Name: res/drawable-hdpi-v4/ic_emoji_recents_normal_dark.png SHA1-Digest: vJP0sjFkcW8TqSxRhE41UHjrvw8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AM SHA1-Digest: jRQ4Uqvixmh7O4V+pQJ7zA3LEXk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK SHA1-Digest: lJp/+67ca+qqknJ9kDKOt6H9nhc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AO SHA1-Digest: 2p80j0O5NxrtyBlDTtd4AZMnXuE= Name: res/anim/design_snackbar_in.xml SHA1-Digest: QPiYcwJRp7LvVEneHabhK9QbisA= Name: res/drawable-xxhdpi-v4/abc_ic_star_black_16dp.png SHA1-Digest: 4f3D3QSNCzMFGqafojrMfwWdbXM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ID SHA1-Digest: C51MJ2ito4WlNqmr7FT+LSn9+I8= Name: res/drawable-xhdpi-v4/list_selected_holo_dark.9.png SHA1-Digest: H2X9BKxBdFAOYEppP+vczoJ/LCU= Name: res/drawable-xxxhdpi-v4/ic_volume_off_grey600_18dp.png SHA1-Digest: PwJ//ed9C27FraSJpbRCsuUYdeA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IE SHA1-Digest: XYmcF2wTQfoGYFukTxsGG60BQ64= Name: res/drawable-mdpi-v4/ic_emoji_objects_normal_light.png SHA1-Digest: ++tNTRbddExtaGnaProLukt1LcY= Name: res/drawable-mdpi-v4/ic_delete_white_24dp.png SHA1-Digest: 3VIWeLi4JOiNOJs4hQZKGwXNuGw= Name: res/drawable/abc_list_selector_holo_dark.xml SHA1-Digest: Zlmbg+JWzYfCIIOn1SxRANlh8xo= Name: res/drawable-xxhdpi-v4/ic_emoji_flags_normal_dark.png SHA1-Digest: 2z1yxZchowADwapp1FtAcalT87Y= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BD SHA1-Digest: FMKTkoiTZVY6rZ8nrm4weFu/Zjs= Name: res/layout/recipient_preference_activity.xml SHA1-Digest: TwR0zonxICqK+vJnKYRTU4PbElg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GP SHA1-Digest: Ry+gEADWJc5F0hk/fPoOgFU6Zi4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BE SHA1-Digest: C9OBMomKeH56Rf8D3kJRK/BornU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GM SHA1-Digest: +Ea0U4Y1zXwD/iNz00D2jjWBiuI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BB SHA1-Digest: 76fqxVMoyy5WsRrZ5YUJP7z/qzk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GN SHA1-Digest: JV96ZaK8wwScichqahTFuYVo+Tg= Name: res/drawable-hdpi-v4/ic_forum_black_32dp.png SHA1-Digest: 5b2v6D+cVzuh/Q0GQHqrKvzoZgE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BH SHA1-Digest: qXk6y18VjNtehZAEohPg+PCWfTg= Name: res/drawable-xxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: kKM7t2gcUV2hJsYu4H6GhDJ44Ww= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GT SHA1-Digest: Vk1e7Ww3lQq9Nupht0/l1aj0Zy4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BI SHA1-Digest: 5MEw8Am0U8NskpQQkpv7T/DZoLI= Name: res/drawable-xxhdpi-v4/ic_volume_up_dark.png SHA1-Digest: FnmNVs6FsUpOBx13HvJPiuwSNww= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BF SHA1-Digest: 6qcmbL8lS/pCTJZTRpOBUoGqRoM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GQ SHA1-Digest: JgkggPpwcMssM4KZKyh07cO/d+M= Name: res/drawable-xxhdpi-v4/ic_emoji_symbols_normal_dark.png SHA1-Digest: sWyrOJ6a5eO3vPY9IN3l5lZ9j4A= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GR SHA1-Digest: 1PL0qWwecYHiBYKr42CyQBe4CKI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BG SHA1-Digest: 3xp8HkBNTYnuCpHGqhpSYsMgvIY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BL SHA1-Digest: ZibVzjuWtBO/2c4mChDoqtZ+qdM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GG SHA1-Digest: G2VhFcm6X+dFHZpUQ4lW9xXyTag= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BM SHA1-Digest: zrSOwjYO7AtSm3hj60CgJ2/xDK8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GH SHA1-Digest: DxHHS+t+GyG/R9rR+Uz3odQsX5c= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BJ SHA1-Digest: D7lSdeZxzBNos8ni5lDZSFv6Tss= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GE SHA1-Digest: h5JogMDM41xhSu1CUMqPgGiiQsA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GF SHA1-Digest: iC1HFHkrIMJDXC9hMk91NTcdNg0= Name: res/layout/share_activity.xml SHA1-Digest: +qEhm4MuxpYYXQPa20C5FCrspiE= Name: res/drawable-hdpi-v4/ic_emoji_objects_normal_dark.png SHA1-Digest: 4CIbOZU3lmgOy9Rvb0Cwb6Xdi+I= Name: res/drawable-mdpi-v4/ic_volume_up_light.png SHA1-Digest: RcmL04qbOKaWF1+mFY7trDsJHaA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BQ SHA1-Digest: 8l6KqnSUMnvDnudq+9jkpx4KEKk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GL SHA1-Digest: 43id6HucRFVSRKQaZ1ZB9yr6cuA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GI SHA1-Digest: EVrXphk2FtWJnoFlU5SDxNqpH7c= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BN SHA1-Digest: 0bTllnIWPvsvqBDNC4yJLPEZZKI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BO SHA1-Digest: BDVs7zW3rHow3lXcsgH04Lv4QXY= Name: res/anim/slide_to_right.xml SHA1-Digest: odD3qfm4+8xLhJn/hGAfXAz+aZ4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AT SHA1-Digest: 3YZ3jvwarlFuCBRiPDHchuW4pdM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AS SHA1-Digest: y+wkj2RLzvL3te7HqxfRdRNDFlw= Name: ws/com/google/android/mms/package.html SHA1-Digest: zW3J5ZXNfuDLZKkBuTBJYYW1zpk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AR SHA1-Digest: mliNA/kZeJg2zEWHmdCzRxPXgRQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AX SHA1-Digest: upADZFWuDDzOFyOXZACn3y1YpKc= Name: res/drawable-xhdpi-v4/lockscreen_watermark_light.png SHA1-Digest: f3uR83//pKLF+IvoV5IDGhpgv7s= Name: res/drawable/conversation_item_header_background.xml SHA1-Digest: ltMtF0mlyQqMyjfRF3u1wqyKwE0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AW SHA1-Digest: 0h40YMhR4HoZ59JDI9dW+he7AIk= Name: res/layout-v11/conversation_list_fragment.xml SHA1-Digest: P2AiPoZu/JLDBPzaaZU7hPX9/30= Name: res/drawable-xxhdpi-v4/ic_send_secure_white_24dp.png SHA1-Digest: PH3CozxQ0hy2yhJtvCJLIWU2bB8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AU SHA1-Digest: EilomLb4KFVrkUSLAF8j40YiZ7E= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GW SHA1-Digest: UqW5JGp5uQlbQLl0uV7uc5sdVbc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AZ SHA1-Digest: yDTx//QhJ6De8XRzJaEzny+z158= Name: res/color-v11/abc_background_cache_hint_selector_material_light. xml SHA1-Digest: 5ZLto+P8lE/ONeMwLGzH/8b7W/M= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GU SHA1-Digest: patID8hn7rFEAwM5FSvMAG+gDsg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BA SHA1-Digest: QfHbCGXOy0A65DpYF1RDwxSSnZg= Name: res/drawable/emoji_category_places_dark.xml SHA1-Digest: nAiCejcIDiqsQR2iIrzfyJaJZ1M= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GY SHA1-Digest: tkL4Idg3qX8PFTAiGgoILpOQw74= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CG SHA1-Digest: vyzpX2JZpDz2/DpSIGBMzLcvcwI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CH SHA1-Digest: nH20B0lZhunuR+ZoqsjyWIPFOZI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CI SHA1-Digest: JLyrJK5dx5XHcE5eGorZLdanoms= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR SHA1-Digest: NSzWXVJ5iFb8tzoFPw1usnVOahM= Name: res/drawable-ldrtl-v17/actionbar_icon.xml SHA1-Digest: WB6RqmtbPrs8sxSmdHke+npJQ1o= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CC SHA1-Digest: ft6e6WMLpBd45l3R1ppgxx0vyaY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FM SHA1-Digest: sVD3Buz/PGDNLNJbfPgAEaWN2BE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CD SHA1-Digest: tA8KqrQ4BLG0VvS20MauUcnart8= Name: res/drawable-hdpi-v4/ic_done_all_white_18dp.png SHA1-Digest: NQkeb4KFOxkPuhTFwbONV/rjtuw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CF SHA1-Digest: 7fXS+/JiYC9W+1iAu3QwB83sqRw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO SHA1-Digest: Eed6XquaU8clgiXBCRkU2qqxVRQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CO SHA1-Digest: xp4Dv0QXpTvjgDGF55mKnqL6bVw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FI SHA1-Digest: TREZSxewZ4tpAJu6YGW9GTCDVQM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ SHA1-Digest: Jq2zK1ZUyYzPXjezFUC5l4BAZrk= Name: res/drawable-mdpi-v4/notification_bg_normal_pressed.9.png SHA1-Digest: brlMet9T126SG7tLyf7uBXl9NeU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FK SHA1-Digest: +/BGHWPyWHdcoXh0rd6ESfKQbtc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CR SHA1-Digest: S6EbqlwJP7S3VTyfb1EbfRpn1tA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CK SHA1-Digest: 3e0jDTESc2z0h053k1NFfL00sDk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CL SHA1-Digest: aqK/v7h1wAl6Q7b8PgVR1kL0TeA= Name: res/drawable-xhdpi-v4/ic_scroll_down.png SHA1-Digest: sUnicSMEn6dqaf1oVQrVWzwF8j8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CM SHA1-Digest: MUw7u/ISsywyLZocUXooE6+UHek= Name: res/drawable-mdpi-v4/abc_textfield_activated_mtrl_alpha.9.png SHA1-Digest: tB4B5H9j3pm0Xv62OAovdHEjuyk= Name: res/drawable-xhdpi-v4/sms_selection_icon.png SHA1-Digest: opocNNou97ui7HliabjkMqEJByk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CN SHA1-Digest: /ncr74UKT07ZCifM5WB+L2zm9QM= Name: res/drawable-xhdpi-v4/abc_text_select_handle_middle_mtrl_light.p ng SHA1-Digest: JkjhWOAKXEQ5GsY9qUsQ3JIuhZo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB SHA1-Digest: bQ2vlkEAjXxrWJpjbwBWUAk87Ms= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BW SHA1-Digest: y3Q+s4TM2YndHpz03AEkShZskt8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GA SHA1-Digest: k2Jen0TsqWGNKWRD2IT05C0QNXg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD SHA1-Digest: YnAZm8K6O+IRkrRbCm9BqT+cZtI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BY SHA1-Digest: ONYixx4PDDMAl3N3TQrV7RHbqow= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BS SHA1-Digest: kPjgljRRGXH5y9mvVxSgb77zZN8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BR SHA1-Digest: oD01nNi1cJYUxq6Zau3rnjD4OwU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BT SHA1-Digest: XT7RRQoPXAkuG12nePHULTWbMNQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CA SHA1-Digest: k5baZNgjeWiIpVlJiSZjCdt1dQw= Name: res/layout/empty_time_zone_item.xml SHA1-Digest: oDk4IqvqM8H6e/pK3UH3Lf0q0g8= Name: res/drawable-xxxhdpi-v4/abc_ic_star_half_black_48dp.png SHA1-Digest: hMrx/1G3oK/JDzKrsj4fVhrzc7w= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BZ SHA1-Digest: 3UbcDoFyPHe8PwYlureTP8zD4b4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DJ SHA1-Digest: OCxhQq7DILLkBHn8R16qpX3ARWI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DK SHA1-Digest: j4XiHePQQtda/JK+77klvy3Ghic= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ER SHA1-Digest: P0uJuBjfKLpEp3lG9coxQLxx3Vo= Name: res/layout/country_selection.xml SHA1-Digest: 6NViX+HrI12AtP7KbHukzq6VRpg= Name: res/layout/dots_text_view.xml SHA1-Digest: EeO1nY+bgs6bEIMj/kAY4xDXtDw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DE SHA1-Digest: Xs2mYBUnwBta5Nws962+jlJfbTY= Name: res/drawable-xhdpi-v4/ic_emoji_emoticons_normal_dark.png SHA1-Digest: SiayuB+wX/S0slsZ2npWsZjecBY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EG SHA1-Digest: WJQxoN3AarAunmow6xGyBuTGCUQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EH SHA1-Digest: fgANQPgg19kRhwU/+ukN1BFpVZA= Name: res/drawable-hdpi-v11/icon_notification.png SHA1-Digest: 5RfIPQeF2eDVTCzeZfL4Z/Shwq8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE SHA1-Digest: 74TJQTDaCgbnCRpE0OdRL4qRfII= Name: res/drawable-sw600dp-mdpi-v13/ic_backspace_normal_light.png SHA1-Digest: YrP5gVwIfhEX37AgcwI4RunV0AY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DO SHA1-Digest: yCZJ1mOSxKKKE4nA7LCejMRJ3Ak= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC SHA1-Digest: 6ZuNJ8mGXy7wh3bVWp23t42Z8sE= Name: res/drawable-hdpi-v4/design_ic_visibility_off.png SHA1-Digest: NIsXamkuhAzt6ldG5G4ar1YeZko= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DM SHA1-Digest: lCxy6fdz9COgrWQOljkNmlZuuHg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CZ SHA1-Digest: UIj6c1xplrAfRxxnH+WRoGi8Ldc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CY SHA1-Digest: mzylAzyX7YTSC1/mBd4Xu0XbJho= Name: res/drawable-mdpi-v4/received_bubble.9.png SHA1-Digest: Cw0YMXapgMp4/S7dKrcGoiAWX0Y= Name: res/drawable-mdpi-v4/ic_image_light.png SHA1-Digest: V3hgc8Z5xQ0lxr7M8a+0K3+kyKs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CX SHA1-Digest: N7O+pAZHYKuo//s7uat1CPoD0RU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CW SHA1-Digest: 93FSBejkt7reOcHSWaXM88FuODY= Name: res/layout/contact_selection_list_fragment.xml SHA1-Digest: CkRXrY5QAeLdWwVs9DBq3tDMdz4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CV SHA1-Digest: XDId5wsWqiw49DKaJV9OTbZRhdI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CU SHA1-Digest: n7qaE3KPafkJF6Dbmnr5XmhTt4E= Name: res/layout-v11/notification_template_big_media_narrow.xml SHA1-Digest: tQibd00mdVAWLymwdJ/kNBDS+CQ= Name: assets/fonts/Roboto-Bold.ttf SHA1-Digest: 0xOrLEV1a/TpcmR/WyrWka0lCZA= Name: res/drawable/circle_touch_highlight_background.xml SHA1-Digest: +vrejfE86g5jlzpEsT1T1kPkZkw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ET SHA1-Digest: ZgHaxsiotkHOcLboOBdAmEcPbSU= Name: res/drawable-xhdpi-v4/abc_list_divider_mtrl_alpha.9.png SHA1-Digest: f5w1/P3BOViOfigUbV/eR0uuTmE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES SHA1-Digest: A471eyB6g1l3oxwstU+e3iFFbsQ= Name: res/drawable-mdpi-v4/ic_mood_white_24dp.png SHA1-Digest: F1jZ+RPCYZYnhrdyEobaqc4HDds= Name: res/drawable-xhdpi-v4/lockscreen_watermark_dark.png SHA1-Digest: hlEs6EtN2kUs2+CrmYa3eux6s+o= Name: res/drawable-mdpi-v4/lockscreen_watermark_dark.png SHA1-Digest: seLgq7oT0J1fGJEos/BvHUn9HxM= Name: res/drawable-hdpi-v4/abc_text_select_handle_middle_mtrl_dark.png SHA1-Digest: Ho2ikNhvPPbPXcRViwyhs0XepR0= Name: res/drawable-xhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png SHA1-Digest: BmwsKC3uNvwcF8agRRgehS1CAm0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DZ SHA1-Digest: nHslb+1sPO2Ce59WWMSXaVXQqG8= Name: res/drawable-hdpi-v4/ic_volume_off_white_18dp.png SHA1-Digest: wGLI3kD/AHJTZ9cmBaHUMgwUmjw= Name: res/layout/receive_key_dialog.xml SHA1-Digest: N6rKDVnVaim5Ngk5WMkQA07ODx8= Name: res/drawable-xhdpi-v4/ic_emoji_flags_normal_light.png SHA1-Digest: lzTZ5KC+L1NXjN1Lc0RUX4B+kwY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE SHA1-Digest: k7ftp7Ib+g0G5Q6CUxuEzYND4u0= Name: res/drawable-xhdpi-v4/check_dark.png SHA1-Digest: iE2tfQLkrgNIvYZN3a0MlRJpleA= Name: META-INF/services/com.fasterxml.jackson.core.JsonFactory SHA1-Digest: wj+dD6oGz5YGyIP+iorCZD19Vfo= Name: res/drawable-sw600dp-mdpi-v13/ic_backspace_disabled_light.png SHA1-Digest: NzveXyIeX/Q8a9YPSBUiW3bhSmk= Name: res/drawable-xxhdpi-v4/divet_lower_right_light.png SHA1-Digest: fUkn0IXtb3K2laJRdKjS0QP90ik= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM SHA1-Digest: oYpfMM+VLHotoNXuW6U6yMp75BQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK SHA1-Digest: 2hI98L4j3X8dPES6LCFfu76+bg4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DJ SHA1-Digest: OeJYJhL1wPAee7j/UM285LVtMs4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO SHA1-Digest: uRNgcVKJn/gRsZVHGsxP6QiO3Pg= Name: res/drawable-hdpi-v4/lockscreen_watermark_dark.png SHA1-Digest: SNi3m+8aly9MoEzOODURLRT2dgc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CR SHA1-Digest: EviDQ8EathIn293mluU6XBg73EA= Name: res/layout/abc_screen_simple_overlay_action_mode.xml SHA1-Digest: shGoP8DkqV4/9zkW62jOT5c6dTM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CU SHA1-Digest: mRNK7K4HUg/JaI/rNhJxzMzQ1Cg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CV SHA1-Digest: RVIN2mYGimgGwrX5Vtj0T3GtE8c= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CW SHA1-Digest: F59PQe3PRWWiEpDzRg1cIssLgvg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CX SHA1-Digest: gSq5dJocBDebtC3H3up10Q0VVXE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CY SHA1-Digest: jDnqEUSgx6Werj9xL6K7MNfZGZU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ SHA1-Digest: xx5oz1l40WoFgtXw5Zv13SzDDXU= Name: res/drawable-xhdpi-v4/ic_launch_white_24dp.png SHA1-Digest: ixUFVWh56fsEoPry/wBlNYTpgzM= Name: res/drawable-xxhdpi-v4/ic_arrow_forward_light.png SHA1-Digest: JgsrnATQt1egl0kfbJbKYMJY3FE= Name: res/layout-v17/select_dialog_multichoice_material.xml SHA1-Digest: 6GoUVzn6/X2e2d0g7MP0o+/2Gjw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA SHA1-Digest: w8zaxguC8zeZPWdUkglpBqHhUP4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CD SHA1-Digest: 9+I21RpqnaRIC6/Xr/CImt36Pn8= Name: res/menu/text_secure_normal.xml SHA1-Digest: NaZEidwFPpPT7hrGo6Ju/ysx0c4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CC SHA1-Digest: O7xyeOuzTRUJYrBlldvjkX4DqAE= Name: res/drawable-mdpi-v4/ic_push_black.png SHA1-Digest: rUKpp3tR4GRM6n8viBjxaVQ0Tgo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CF SHA1-Digest: Zb150rGevGBapWuqzyutTvSGC60= Name: res/drawable-xhdpi-v4/ic_push_black.png SHA1-Digest: yPg6Ws1FUPLGcxmjbMjLK7q+IK0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CH SHA1-Digest: eH3zu6OTr8s9tl+AreAyQGP1GZ4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CG SHA1-Digest: bw9rbUzTOmaojAI7sHfQ0uGC234= Name: res/drawable-mdpi-v4/abc_ic_star_black_36dp.png SHA1-Digest: 5iJ2OwOvvq9Mq0WIYEcsSLKKghY= Name: res/drawable-xhdpi-v4/ic_circle_fill_white_48dp.png SHA1-Digest: NBKLet+soFmGPPvFv8en3NizT6A= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI SHA1-Digest: Z+GKCwhOSabtrPuvRNUNEegV+xA= Name: res/drawable-hdpi-v4/abc_ic_menu_share_mtrl_alpha.png SHA1-Digest: 15Em2L2dzqYc4FpCIRN6G9jDl+w= Name: res/drawable-hdpi-v4/ic_send_sms_secure.png SHA1-Digest: C9M7P4sTqQTkrm9c1b7a5JiCswM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL SHA1-Digest: o2jhWQILjzidYdpzlPTyHweU3Lc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CK SHA1-Digest: EwIARx8u+BnBm/OxE5+eF7icSZU= Name: res/layout/delivery_status_view.xml SHA1-Digest: rY8G9XatzpovR5oZJo+0aWjkcMU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN SHA1-Digest: GpiwtSYl7aT20iutUnqh1jtH2dY= Name: res/layout/abc_list_menu_item_checkbox.xml SHA1-Digest: +jlKh058XvxdeJU7n5iJbTnWP38= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM SHA1-Digest: OrHRr+X/4FSmYJKlf4qmRgcKkfc= Name: res/drawable-xxhdpi-v4/ic_lock_black_18dp.png SHA1-Digest: m6B0U6dWbBizykEnQpeR0RoOj4c= Name: res/drawable-xxxhdpi-v11/icon_notification.png SHA1-Digest: v3D0kz34jttPWcbQoYLpiWGJS3E= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO SHA1-Digest: 8nTagABMmOjMblfD0WuHGCelKRc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW SHA1-Digest: 9zeEobPgAk0QePW1vwEK3YN5bFc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT SHA1-Digest: oWKvwYKJy2599iCVKzxxe1kx/WA= Name: res/drawable-xxhdpi-v4/ic_emoji_symbols_activated_dark.png SHA1-Digest: KDZRFcJ7sq1qh1EB6ZOte3n3y/E= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR SHA1-Digest: mSQseCW+AqVyEfdmZQzZfNMDLRg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS SHA1-Digest: SBwAaf2sVMF1XXKqfucd9PIC4IA= Name: res/drawable-hdpi-v4/ic_unarchive_white_24dp.png SHA1-Digest: i0NdcFQ/sn3N2wNU4pRTsoj9Hqs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BQ SHA1-Digest: l/O/YwXNQfrAK+3iAFAuunSAKBE= Name: res/drawable-ldrtl-mdpi-v17/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: rIBNxxH8rn0XchnrLO+YkM759P8= Name: res/drawable-xhdpi-v4/ic_clear_search_holo_light.png SHA1-Digest: 3amzDMs5C1zU0+T2IQhw6+cxKro= Name: resources.arsc SHA1-Digest: 7C0XCh6TfFh0dCc6wu1cJXIvQhQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ SHA1-Digest: bZ0DVTWtAaor7LTbuyteUblHZqE= Name: res/drawable-hdpi-v4/ic_forward_white_24dp.png SHA1-Digest: VsmydyZ0FPEoCwy7r8eNB6lNGGg= Name: res/drawable-xxhdpi-v4/textfield_disabled_focused_holo_light.9.p ng SHA1-Digest: EVVtSa4tBxIM4sQfg3efMbAd73k= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BY SHA1-Digest: qyps4AOsSxAwsfkf9C4I37F49lk= Name: res/drawable-mdpi-v4/ic_lock_black_18dp.png SHA1-Digest: y1vas11JhCozCPoOdEJ4aufqvWk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BG SHA1-Digest: z0s/VLZXEOpDzndI7ML2UuBuGuk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF SHA1-Digest: 14+L8OZSyZLzlXyYpyaMlIhX+P0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE SHA1-Digest: QbvpQbvC8CE1LiMJeKI6rrnnTAY= Name: res/drawable-mdpi-v4/check_dark.png SHA1-Digest: eNnJ7BgEqrocb7op+R+cxUCOil0= Name: res/drawable-xhdpi-v4/list_selector_disabled_holo_light.9.png SHA1-Digest: bwjSzuahpvwVgJavscLUKen/ZqQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BD SHA1-Digest: BXF+lPM0reGE7KxlqdrAjx2Krq4= Name: res/drawable-v12/recycler_view_fast_scroller_bubble.xml SHA1-Digest: fK9A5ABKj0zZace6jtRt8OOyBgI= Name: res/drawable-xxhdpi-v4/abc_ic_menu_share_mtrl_alpha.png SHA1-Digest: cvp+pWujiXpQMYoa2y9EetK0U4s= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB SHA1-Digest: ICtoY5/KdxJUczDlFKI0mImUg9k= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BA SHA1-Digest: ikwEIIEnzXMPWnRGDVHU3KORNCc= Name: res/drawable-xhdpi-v4/ic_emoji_symbols_activated_light.png SHA1-Digest: 6v6XV3wISkj8+48sJjxhmdrSpko= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO SHA1-Digest: lXEPfhd8iCjSHfu3grvFp/fSMdM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BN SHA1-Digest: +iKXGqbJ7+S7/z8wnIVGL/nbTtQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM SHA1-Digest: DeS+/JuqN2wJgvboIyl7VLpVuT8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BL SHA1-Digest: T5HDy99O+ftVavMq1U6gd3Ajrzc= Name: res/drawable-mdpi-v4/ic_mood_grey600_24dp.png SHA1-Digest: 4P/X40qJCsjuFRNhUQ0rsVMqm3k= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ SHA1-Digest: EQX7sTl6NxbTJhLLvCTpK6MZKpE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BI SHA1-Digest: +ur7EMKohdoIn+4cWbSzKm5Cosw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH SHA1-Digest: 5kaLaTaOJh1E0yCJVI8LkQPpxEE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS SHA1-Digest: lFPVh6MGBKlowOwE3bQti9UQBmY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT SHA1-Digest: hqGb37qZDfDlQmLhc2O5J4E0Oxo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AU SHA1-Digest: pUYpWj7Mbq1jKgqzU6FKQcC0ris= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AO SHA1-Digest: rSWdt7x0gLvGsQEg/RNjE2uaOH8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR SHA1-Digest: wACsMm8/e/4g5yMOLykrkLt4Wic= Name: res/drawable-xxhdpi-v4/ic_photo_camera_dark.png SHA1-Digest: IwWP0PnycjoKHklZ8+OMobwsg6g= Name: res/drawable-hdpi-v4/ic_scroll_down.png SHA1-Digest: l8b//nR9nd7fiUinyLXS0Sj6zno= Name: res/layout-v17/timezonepickerview.xml SHA1-Digest: vl37WDSnud4WlCno8BOR8EA5h0A= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AW SHA1-Digest: forQYq6WWbzM8JB5icXx3pqJh1g= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AX SHA1-Digest: xXXhU0wibZJgRbagTefH5FsETL8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AZ SHA1-Digest: CJrPQMosQCfPKIYPRW1Dd8pUTj8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AD SHA1-Digest: gfIYvmYpbQKJZ55/DXhtY+TJO7o= Name: res/layout-v16/conversation_item_pending.xml SHA1-Digest: M+G4c6n3fpwhlz4QRj/jsnVzldA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AC SHA1-Digest: jhb/OjTha//hkw0P6kxXqaNRmo4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AF SHA1-Digest: msh1yQtOY6p3MDgBy0RJQz+hJoI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AE SHA1-Digest: 2pmWArmMF8XPBhUHB1BDUk6sU48= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AL SHA1-Digest: wHqLey8AvcafXdaSY+why0BZAKo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM SHA1-Digest: OWp+yIi/MST0sFxWWd8YlBZEVKk= Name: res/drawable-mdpi-v4/ic_block_grey600_18dp.png SHA1-Digest: 4iXvvFIaFAoVQOcDOOX+doa1kwM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG SHA1-Digest: IREC7VmaNyp2z6TlD/gOqjKgru8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI SHA1-Digest: +2+HU3m74y5TWONWX3hrGSVnPic= Name: res/drawable-xhdpi-v4/ic_account_box_dark.png SHA1-Digest: LFnuytM5maL4Lfl/eg1UkXoCtRY= Name: res/drawable-hdpi-v4/ic_clear_white_24dp.png SHA1-Digest: 9zM7YW9BmOj9UKEqe7OeHH9kimE= Name: res/drawable-xxhdpi-v4/ic_download_circle_fill_white_48dp.png SHA1-Digest: 8ve31VPRX9mkBi1B2ygHSSQrvlg= Name: res/drawable-mdpi-v4/ic_lock_dark.png SHA1-Digest: i4whup9/nTIGg/wXaZ8QuIZ70KU= Name: res/drawable/abc_seekbar_track_material.xml SHA1-Digest: 17M1OyJgbSyvZxbg3tUg5REGwOg= Name: res/drawable-mdpi-v4/ic_call_split_white_24dp.png SHA1-Digest: 0YrgcnO5k1/uSRgpvjxausMrXVw= Name: res/drawable-mdpi-v4/ic_emoji_places_activated_light.png SHA1-Digest: Ud3W8vS6D8D45zBZyKIU0mEZuJM= Name: res/layout/abc_list_menu_item_radio.xml SHA1-Digest: agsopWn5fspPqFiahI2wYYvv2Ig= Name: res/drawable-mdpi-v4/ic_emoji_places_activated_dark.png SHA1-Digest: TTKosBID71Fu9FE1ZH87ZoyxMZA= Name: res/drawable-xhdpi-v4/ic_call_split_white_24dp.png SHA1-Digest: 4imrsk3nBfyAcr1rcf4NRimxPdg= Name: res/drawable-mdpi-v4/abc_ic_menu_share_mtrl_alpha.png SHA1-Digest: RsYa9PHKHTGXi9SGr7dikHjzRmA= Name: res/drawable-xhdpi-v4/ic_emoji_people_normal_dark.png SHA1-Digest: eej5DAUXKUi/6JE0ukV+yZhF6P0= Name: res/layout-sw600dp-v13/three_keys_view.xml SHA1-Digest: PeshPVCO5Wp22jO8OB976nxhq/g= Name: res/drawable/abc_list_selector_holo_light.xml SHA1-Digest: y4DqLE9ZMUXA7mpN9gzH7cgYblE= Name: res/drawable-xxhdpi-v4/lockscreen_watermark_light.png SHA1-Digest: AYNtsBVsxmSt1MgC8RP6Pd1pBao= Name: res/drawable-ldrtl-xxxhdpi-v17/ic_send_white_24dp.png SHA1-Digest: IeLbm+xeGshzGwFPXOgB3CPFAIg= Name: res/drawable-hdpi-v4/ic_account_box_dark.png SHA1-Digest: Ii8tkZLRASna4Emp7tR3oRPvpLg= Name: res/drawable-mdpi-v4/ic_file_download_white_36dp.png SHA1-Digest: UY6G3irYxV+vXtOBJkHhAL96QqA= Name: res/drawable-xxhdpi-v4/ic_push_registration_reminder.png SHA1-Digest: Cm0M0XIBlw7BRiSi4j3+PluhFuY= Name: res/drawable-mdpi-v4/ic_menu_add_field_holo_light.png SHA1-Digest: XcK6Zy+//GXKE2tbr8mkSr6ZVZo= Name: res/layout-v17/custom_default_preference_dialog.xml SHA1-Digest: HUQHHYyxai0hDOmCZJWChGinyio= Name: res/layout/contact_selection_list_item.xml SHA1-Digest: Aeg8JWmT0UeWUU7c1k2DEEyDmk4= Name: res/drawable-xhdpi-v4/ic_send_secure_white_24dp.png SHA1-Digest: eVPdl3BecE8ulLAEb8nyJkwRGH0= Name: res/drawable-xhdpi-v4/abc_list_selector_disabled_holo_dark.9.png SHA1-Digest: e6ZxO30OB+oHpoct3gGLBY0gYXA= Name: res/layout/three_keys_view_right_drawable.xml SHA1-Digest: hwXL753+YQ37R1QjWOgBImsKzbo= Name: res/drawable-xxhdpi-v4/textfield_default_holo_light.9.png SHA1-Digest: HnMo01YraOS60C6Mfei/HvkA/0E= Name: res/drawable/abc_btn_borderless_material.xml SHA1-Digest: rPL1lJzRovUC1nEamnoL6zg2+0U= Name: res/menu/conversation_popup.xml SHA1-Digest: Fsb8H1dyYNJVIJb7UjI4pZgeoFQ= Name: res/drawable-xxhdpi-v4/abc_textfield_search_default_mtrl_alpha.9 .png SHA1-Digest: bHADGZ86aGisr0oBfZBoU7RHX/g= Name: res/drawable/abc_text_cursor_material.xml SHA1-Digest: e08kbab0hCmZ+bodjZ7WbbBG5g4= Name: res/drawable-hdpi-v4/abc_ic_star_black_36dp.png SHA1-Digest: lLeiPraqvP94YGRcJ58nUBYrU0s= Name: res/drawable-mdpi-v4/abc_popup_background_mtrl_mult.9.png SHA1-Digest: 8uS5dzxcWfvqLPd6VcABucDe9VM= Name: res/drawable-xxxhdpi-v4/ic_volume_off_white_18dp.png SHA1-Digest: 5dpYsBDaejTp8Sj0/LycIcwqUjE= Name: res/drawable-hdpi-v4/ic_message_gray.png SHA1-Digest: HEBF0Kk39LkBPbBAQ3oPqFNlBJc= Name: res/drawable-xxhdpi-v4/ic_check_white_24dp.png SHA1-Digest: 1ybum7+f/AW95nocQgY4HgUAwVA= Name: res/drawable-xxhdpi-v4/ic_content_copy_white_24dp.png SHA1-Digest: QluevaTHgv86WnKHj0Dyu1BcXpk= Name: res/drawable-xxhdpi-v4/ic_recurrence_bubble_outline.png SHA1-Digest: p8Ew5K1+rS0MDt8d1dNhXOyaeXE= Name: res/drawable-mdpi-v4/ic_group_photo.png SHA1-Digest: H5p61NfNmfjKp56IugjyXBMV034= Name: res/drawable-xxhdpi-v4/splash_padlock.png SHA1-Digest: XmBC9O8eAJQJFddDq6/Wz6i0FcA= Name: res/drawable/conversation_list_item_read_background_dark.xml SHA1-Digest: R/Bz3042zFeI4ZV+832gVyj097g= Name: res/drawable-xhdpi-v4/abc_list_focused_holo.9.png SHA1-Digest: Kw0Qo9eKlw06/oxLHYSWR6VftBw= Name: res/drawable/recycler_view_fast_scroller_bubble.xml SHA1-Digest: wRRdXv08lnaiKNy7Vz1zDb1gdTs= Name: res/drawable-hdpi-v4/ic_emoji_objects_activated_light.png SHA1-Digest: pa3Pmzz6WAvI0UR5AYU6YhqyLDI= Name: res/drawable-xxxhdpi-v4/ic_menu_lock_dark.png SHA1-Digest: 4wi2CULelc+GDc9h9IuPIgQKozc= Name: res/drawable-hdpi-v4/ic_emoji_symbols_activated_light.png SHA1-Digest: lzeQS2wqbqmpwSgJEDzVCsxXQWs= Name: res/drawable-mdpi-v4/abc_list_pressed_holo_dark.9.png SHA1-Digest: MoCLKmenbTlsz905dAkmwWiKKG0= Name: res/layout/design_layout_snackbar_include.xml SHA1-Digest: /FYbLwQJjqORI4i5Hm55yKJy7dk= Name: res/layout/contact_selection_list_header.xml SHA1-Digest: bl+2m53uDPHKWPgEkbbRgrufOc4= Name: res/layout/preference_list_fragment.xml SHA1-Digest: CZYRwRnR40i+N4BeZNClol3VSbE= ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9243832 fdroidserver-2.3a1/tests/metadata/org.smssecure.smssecure/signatures/135/0000755000175000017500000000000014620351546025235 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/org.smssecure.smssecure/signatures/135/28969C09.RSA0000644000175000017500000000245614620351225026562 0ustar00hanshans0* *H 01 0 +0  *H c0_0G?w~0  *H  0`1 0 UUK1 0 UORG1 0 UORG10U  fdroid.org10 U FDroid10 UFDroid0 150403094515Z 420819094515Z0`1 0 UUK1 0 UORG1 0 UORG10U  fdroid.org10 U FDroid10 UFDroid0"0  *H 0 Q_aI.r4Px@ K{F}!aPB({d9(AN>(ue>kkIXxꃑ¨ CN@jz`jU ZpJpFk"{mZ Ab&nk2ok ^<@SL7u%v2 [ސ"X\40  *H  Y N~lP V'3hC-v=rǞ`%9'>xڢ<(͐K63y\'^HݴbY+kFe+!)7 HM.6]] viҀQM+GQJexHJt<1zWYyO}QϾ̢{: 6~pkw\\_K'lʸ>7-p^#%g(CiM3fAŧVcIVvxܺ؎m~SM Ų100h0`1 0 UUK1 0 UORG1 0 UORG10U  fdroid.org10 U FDroid10 UFDroid?w~0 +0  *H N øQ36g=<6"he#YJ}V. @1WDC ɶR5A-D#QZ^cג8"3J?:BKŁ ⽴`Rd8[ MN%k.]Tz>yD J*OR4Y:^Z~cl/ 5}>9|ђBcJ(4A?KDz+y_(Z././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/org.smssecure.smssecure/signatures/135/28969C09.SF0000644000175000017500000070551014620351225026446 0ustar00hanshansSignature-Version: 1.0 SHA1-Digest-Manifest-Main-Attributes: rEl8fnPMQh1rq1BuTuB1Ry1XYRg= Created-By: 1.7.0_121 (Oracle Corporation) SHA1-Digest-Manifest: BBOlC1NFW1J6ufJv9Il0JboXzRc= Name: res/drawable-xhdpi-v4/abc_ic_star_half_black_48dp.png SHA1-Digest: EmJpVhbB6cz/PQADmxVzyVNMusw= Name: res/drawable/abc_btn_check_material.xml SHA1-Digest: YFDDnTUd6St4932sE/Xk6H0HMoc= Name: res/drawable-xhdpi-v4/ic_video_light.png SHA1-Digest: BGO/xCluvDTkwWDprkpQDgEc60E= Name: res/drawable-hdpi-v4/ic_lock_black_18dp.png SHA1-Digest: tsXHhh2ccnNTEGew41PTgDSThgo= Name: res/layout/design_navigation_item_separator.xml SHA1-Digest: Rop+L/oPNw275ck8glcXZA481BY= Name: res/drawable-hdpi-v4/abc_textfield_search_activated_mtrl_alpha.9 .png SHA1-Digest: 3TVJoKotGhu2qu7nxOP+9dmuUfQ= Name: res/drawable-xhdpi-v4/ic_advanced_gray.png SHA1-Digest: YLJ9SvpsZRDIbaydeSWXUX+Y3j4= Name: res/drawable-mdpi-v4/ic_notifications_black.png SHA1-Digest: WcvuIg056OtSX/LWMfMDbERHkks= Name: res/drawable-hdpi-v4/ic_audio_light.png SHA1-Digest: cZFumcd+UgZuJnK8UFfkM0ojUUQ= Name: res/drawable-xxxhdpi-v4/ic_textsms_grey_32dp.png SHA1-Digest: l/2TAEyiMaEqIsMf/UHBB98WuYg= Name: res/drawable-v21/abc_action_bar_item_background_material.xml SHA1-Digest: KV90fjq9oUm4oE6kD9IDK7IG1zg= Name: res/drawable-xxhdpi-v4/list_focused_holo.9.png SHA1-Digest: 2/qW1KJgIeUV4L7+Rd9kqNoxB2E= Name: res/drawable-hdpi-v4/ic_arrow_forward_dark.png SHA1-Digest: eqfqRWlSKpxiJF1tASHfrv2+W1s= Name: res/drawable-xxhdpi-v4/ic_arrow_forward_dark.png SHA1-Digest: 4Ppky2q92+b9PMoI1/MVOVpJKM0= Name: res/drawable-mdpi-v4/ic_attach_grey600_24dp.png SHA1-Digest: kWU9fVGPTBhcZ0y79ZcbrlX/lrs= Name: res/drawable-xxhdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png SHA1-Digest: 3cGsKipfgybfWKKMdG932/zCITU= Name: res/menu/conversation_list_batch_unarchive.xml SHA1-Digest: 0s3RSDcaD1sgaGLGFQqDYueUiR8= Name: res/layout/share_list_item_view.xml SHA1-Digest: cwy28T30itaOeMaYIP3myLWkRKE= Name: META-INF/services/com.fasterxml.jackson.core.ObjectCodec SHA1-Digest: TUt3WJOdFSbY0ZddbRq3WmcKOBM= Name: res/drawable-xxhdpi-v4/ic_emoji_objects_activated_dark.png SHA1-Digest: Oel3aZlAYvXA7ntzP46gFjfRvYA= Name: res/drawable-xxxhdpi-v4/abc_ic_star_black_16dp.png SHA1-Digest: 9nUV5uGG9nx8q07XftbT3Na7NqM= Name: res/drawable-hdpi-v4/ic_block_grey600_18dp.png SHA1-Digest: sgiSdfDsqVZSYm42xezzjLluyGA= Name: res/drawable-hdpi-v4/ic_refresh_white_24dp.png SHA1-Digest: M/UZ7uCz9xZwERFtAq0Qj/eh38w= Name: res/drawable-mdpi-v4/ic_photo_library_white_24dp.png SHA1-Digest: E+IxUDHLaaCHl0VENbQA7TdPX0c= Name: res/drawable-xxhdpi-v4/ic_emoji_recents_normal_light.png SHA1-Digest: vqnDTAJRzaAKJdrODeHv5fee3nc= Name: res/drawable-mdpi-v4/ic_action_warning_red.png SHA1-Digest: imrAA59c4hj9zsWIT58CO7ERIJQ= Name: res/layout/conversation_item_sent_audio.xml SHA1-Digest: Kti5J9pFVRrQcrtt17na/DLsPo0= Name: res/drawable-xhdpi-v4/switch_thumb_activated_holo_light.9.png SHA1-Digest: 3Ss5k8ep2Mrg+rgvOa7GGRfjpF8= Name: res/drawable-mdpi-v4/ic_message_gray.png SHA1-Digest: hoiZW7MdOHC0Iby+Gd1rcKOLG0c= Name: res/drawable-mdpi-v4/ic_image_dark.png SHA1-Digest: G2gpXgHeSeHrZWnIAaxkcSiUu+Y= Name: res/color-v23/abc_color_highlight_material.xml SHA1-Digest: qY6zpcmSjeBP4i3CkOTY8zxtwB8= Name: res/drawable-xxhdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png SHA1-Digest: UscVpd7V3jMjLzVpfsG2IbdRqvY= Name: res/xml/preferences_advanced.xml SHA1-Digest: FC8tIXzwmm5OKrtgOX2dwn/qqnc= Name: res/drawable-ldrtl-hdpi-v4/ic_send_white_24dp.png SHA1-Digest: SWlD/H1XB3xcc5Y8usXOJnlLhwM= Name: res/drawable-xxhdpi-v4/ic_attach_grey600_24dp.png SHA1-Digest: huvdgLTmrMUD+DPHPMH/FBNmRFw= Name: res/layout-v17/conversation_list_item_view.xml SHA1-Digest: BJmBhKhNpJxHVSKViobHSvse4J4= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_995 SHA1-Digest: VQZUHqW605gJIqlz9jltq9FdR3o= Name: res/layout-v16/design_bottom_sheet_dialog.xml SHA1-Digest: 4e8NhkRAJcZiADs1jZKcnpw/Ucg= Name: res/drawable-v11/emoji_category_recent_light.xml SHA1-Digest: ey84TlREh39UDPRR+wfQ382pg2k= Name: res/drawable-xxhdpi-v4/ic_message_black.png SHA1-Digest: P4uJ9lf3VIwuGWrX4FNch+CFgjo= Name: res/drawable/notification_tile_bg.xml SHA1-Digest: 4xAQ7hEyW8eB4JxXX1UzIjFqcPY= Name: res/drawable-xxhdpi-v4/lockscreen_watermark_dark.png SHA1-Digest: yD27OTvbBk1jpS1o/+kZQko/Sug= Name: res/menu/conversation_secure_sms.xml SHA1-Digest: e4pbyINrig3CE7vbpn9e8WbN5gA= Name: res/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_light.9.p ng SHA1-Digest: 4maqTaWq3BEXw6ShM7wJMon1kU8= Name: res/drawable-hdpi-v4/switch_thumb_holo_light_v2.9.png SHA1-Digest: dUoJcdYHBaB65zOYYoaEwJLGORI= Name: res/layout-v17/import_export_fragment.xml SHA1-Digest: VJ5WSeX+8T1nXMoe6GeyuVJEBaY= Name: res/layout/time_zone_item.xml SHA1-Digest: 6vPto9xswZvuZa3tTuCf0lqdRnA= Name: res/layout-v17/abc_alert_dialog_title_material.xml SHA1-Digest: NKD1P7TOYluzzXBm47dQperSbo8= Name: res/drawable-xhdpi-v4/textfield_default_holo_light.9.png SHA1-Digest: tlklNYajvvNexKXzCLXina5RJ4w= Name: res/anim/design_bottom_sheet_slide_in.xml SHA1-Digest: H3e/zshhR8lSEOvNJ1F7meqRXT0= Name: res/drawable-mdpi-v4/import_database.png SHA1-Digest: 3haEEMPstl/DDC+BlD5TuI2h15w= Name: res/drawable-xhdpi-v4/ic_image_dark.png SHA1-Digest: 34kW/vCnV6Y0mDgbvz440s781Jg= Name: res/layout-v13/conversation_item_last_seen.xml SHA1-Digest: LKCgoKkL2vB1Xwn2MzNS2iilUxw= Name: res/drawable-xxhdpi-v4/ic_emoji_people_normal_light.png SHA1-Digest: 2rpfD+NY4xRIiknmrubWGmcND7M= Name: res/drawable/play_icon.xml SHA1-Digest: y0KZBhP64W+5E+b01cawPIx1Z3s= Name: res/animator/scale_with_alpha.xml SHA1-Digest: dkkt5ydwuaxd0Vix8/d+HhT1TAA= Name: res/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_000.png SHA1-Digest: EJcEC6U7l1ByKjRFT4I+NP5SA+w= Name: res/drawable-hdpi-v4/ic_emoji_nature_activated_dark.png SHA1-Digest: ozyVwJeR5Vvc6N0nstBfvDxkt6U= Name: res/drawable-v11/abc_textfield_search_material.xml SHA1-Digest: khlWpwwJ/BpuCBb0uDcegE9Qi7A= Name: res/drawable-xxhdpi-v4/abc_switch_track_mtrl_alpha.9.png SHA1-Digest: 0/qHVKsPWinDgoCSCJ2tYnOQHDk= Name: res/drawable/done_background_color.xml SHA1-Digest: YhJEMqwhzaLqXsNhftrT8BJGpFc= Name: res/layout/conversation_item_update.xml SHA1-Digest: zTAp/M2/nwDDANB7UAsuq/K4eyU= Name: res/drawable-hdpi-v4/ic_clear_search_holo_light.png SHA1-Digest: bMAmi23A7C/2T81UWdUJrPAiGgA= Name: res/layout-v16/radial_time_header_label.xml SHA1-Digest: 5+8D6aI/+s8WRtg0oJVSv2oRQVQ= Name: res/drawable/emoji_category_emoticons_light.xml SHA1-Digest: MULA/KyofssSNnEJtJw9ja4MtBU= Name: res/anim/abc_slide_in_top.xml SHA1-Digest: ps83fDCN37hSi5vdARGgPEjdET8= Name: res/drawable-xhdpi-v4/ic_menu_search_holo_light.png SHA1-Digest: aJk1cIss5mXDeXsVR3MB/OZxxFQ= Name: res/drawable-xhdpi-v11/icon_notification.png SHA1-Digest: cLSQZK5yIZN+Q1i/Dvf7T142nBo= Name: res/drawable-xxhdpi-v4/ic_emoji_flags_activated_dark.png SHA1-Digest: DFPRNsIBHb5NdyahxEP22SzqQKQ= Name: res/drawable-xxhdpi-v4/ic_save_white_24dp.png SHA1-Digest: P7ESxivMW9iNSV3BsUYdz/w2D6s= Name: res/anim/animation_toggle_in.xml SHA1-Digest: dRaYBsOfLqP23qwFMXALeJ6iGYM= Name: res/drawable-xhdpi-v4/ic_emoji_objects_activated_dark.png SHA1-Digest: 8PK4PuyIjB/HTzBTXvk7nVFyDuQ= Name: res/drawable-v11/emoji_category_people_dark.xml SHA1-Digest: 95RO/j45d+Krtv4b3RQeH/mAE1U= Name: res/drawable/edit_text_holo_light.xml SHA1-Digest: C4sB8NwynUqgyunbb7TzvQIqVe8= Name: res/color/abc_tint_edittext.xml SHA1-Digest: NDf3mHgsT7bsGplB82V0W1fYqHE= Name: res/drawable-xxhdpi-v4/spinner_focused_holo_light.9.png SHA1-Digest: GoRgB1Li7RZqzAPwAgLgd0fqnmg= Name: res/drawable-mdpi-v4/ic_recurrence_bubble_outline_disabled.png SHA1-Digest: d61P7qoMGt67a4HhUdeQoBO3tFY= Name: res/drawable-xhdpi-v4/ic_check_white_24dp.png SHA1-Digest: 78JbZauasH21gF+Y0lsAHUlAZpg= Name: res/drawable-mdpi-v4/ic_emoji_flags_normal_light.png SHA1-Digest: Zz+YX+HHOmmtVOvPRXbJ2d4L+so= Name: res/xml-v12/badge_widget_provider.xml SHA1-Digest: 0lZ+wV/192wEtNjI4Kd4DNGr8aI= Name: res/drawable-xxhdpi-v4/quick_shutter_button.png SHA1-Digest: tM6vusyRri2ZxMKLxUn1jpr/h9k= Name: res/drawable-xhdpi-v4/spinner_default_holo_light.9.png SHA1-Digest: 8z6OMkzlDtz6BaebwU13NRMiwGc= Name: res/drawable-hdpi-v4/abc_ic_star_half_black_36dp.png SHA1-Digest: WYHzqaIFGhxi7pUghVL542WmTfs= Name: res/animator-v11/bottom_pause_to_play_animation.xml SHA1-Digest: KNPF3kfWr3xJ+UqIibDLQRBRPvE= Name: res/drawable-xxhdpi-v4/ic_content_copy_dark.png SHA1-Digest: 7+NUcLRqL1d+ls7fNAMW+Hps74M= Name: res/drawable-mdpi-v4/ic_arrow_forward_light.png SHA1-Digest: UU22Z20OF19oG73++TW4xNN+d6A= Name: res/layout/message_details_activity.xml SHA1-Digest: azLss1HqZc+OGoasvbh3/pmvfVU= Name: res/drawable/abc_ic_voice_search_api_material.xml SHA1-Digest: 5ugYXzpY74baRVq3UQ+hVyltOOw= Name: res/drawable-mdpi-v4/ic_create_white_24dp.png SHA1-Digest: EvglZuWn1kWrtP9Vu40ifhzH5eQ= Name: res/drawable-xhdpi-v4/ic_lock_black_18dp.png SHA1-Digest: BHfmCHr+L1mAJXAj3f/Pa35mojA= Name: res/drawable/key_background_dark.xml SHA1-Digest: 4dA80hRKa9MiaTulvKa2adsaUAs= Name: res/layout/design_text_input_password_icon.xml SHA1-Digest: jR+6eNBNR1vmNPQjDZjNzwnH7iU= Name: res/color-v23/abc_tint_default.xml SHA1-Digest: rc6jB/Oj1KFzKdG2xnI7wiNPkwI= Name: res/drawable/abc_btn_colored_material.xml SHA1-Digest: 5in2GRrYzWn1M5K8rINJqJPTOtg= Name: res/drawable-xhdpi-v4/ic_keyboard_white_24dp.png SHA1-Digest: 6rPDrkokO6ExvMFZkZ6dUVRihkk= Name: res/drawable-xhdpi-v4/ic_reply.png SHA1-Digest: EqxlL9HBYa08+CVzrwfmhkUaWUI= Name: res/drawable-mdpi-v4/ic_reply_white_36dp.png SHA1-Digest: WWRxqg1IHF+2cbj/RQ2Sl6lOvh4= Name: res/drawable-xxxhdpi-v4/ic_photo_camera_light.png SHA1-Digest: Dwiib5e97pV5agTjyPTNjyki93o= Name: res/drawable-xhdpi-v4/abc_ic_star_black_48dp.png SHA1-Digest: FtlphNkBunKHFyn4YCJf+uB9r5Y= Name: res/drawable-mdpi-v4/ic_movie_creation_light.png SHA1-Digest: eOHkrzkeRo6ziDmk1BAVpLSgwMo= Name: res/layout/hms_picker_dialog.xml SHA1-Digest: tAWByK5zJb4G91bvhGLA5uOPOs8= Name: res/drawable-xhdpi-v4/check.png SHA1-Digest: trr1Y1AvaQ40pvN9HENeXxTaUnc= Name: res/drawable-hdpi-v4/abc_cab_background_top_mtrl_alpha.9.png SHA1-Digest: bKDAz/GvMsK2qKIXXjfzdAwCtG4= Name: res/drawable-hdpi-v4/abc_ic_star_half_black_48dp.png SHA1-Digest: ITuAj9GLxIU8m+qyHDgR794ap3w= Name: res/drawable-mdpi-v4/ic_keyboard_grey600_24dp.png SHA1-Digest: zdlURX5i7BYZIXKORABBap/3RMA= Name: res/layout/keyboard.xml SHA1-Digest: TVzGEgiaoAB2JVPuFjgDcgIAbao= Name: res/drawable/key_background_light.xml SHA1-Digest: ioA3FeBjrk2CUgaieHM8D4jJXKQ= Name: res/drawable-hdpi-v4/check.png SHA1-Digest: b+8u2c2RSD3vaZMSx7nKC/DkXdw= Name: res/layout/message_details_header.xml SHA1-Digest: JW9IPIijzH9fD5fsgqGPA+UnVi0= Name: res/drawable/reminder_background.xml SHA1-Digest: U1dUNAaqsEAw8QxlFPBiuLa2ERU= Name: res/drawable-xxhdpi-v4/last_seen_background.9.png SHA1-Digest: o+wL4yJDNpiNHf5ZhMPaWIKOIEw= Name: res/drawable-xxhdpi-v4/abc_ic_star_black_48dp.png SHA1-Digest: 50lQ01X/2aI5rh53asY/AX4Fkhw= Name: res/drawable-xhdpi-v4/list_longpressed_holo_light.9.png SHA1-Digest: wjffxg4gtxSXtviI33Wu5A+pD0U= Name: res/drawable-hdpi-v4/ic_warning_light.png SHA1-Digest: QteIiirlmwEHFWKiSwLdtXWoTIA= Name: res/color-v23/abc_btn_colored_text_material.xml SHA1-Digest: QfOopQVyGBK5764AtyzCeSxgY30= Name: res/drawable-mdpi-v4/alert.png SHA1-Digest: y6zmCiTCuYWhldLerBNyvH+ECDs= Name: res/drawable-hdpi-v4/ic_badge_24dp.png SHA1-Digest: ZdBBadrqXr7xPO+TKG+AOzCF5Pg= Name: res/drawable/badge_drawable.xml SHA1-Digest: Xdl+2jhWvmt0+HuZDaWK9vBlmQ0= Name: res/drawable-xhdpi-v4/notification_bg_low_pressed.9.png SHA1-Digest: OOefFpggagskOSa29mfgruzOhPQ= Name: res/drawable-v21/avd_hide_password_3.xml SHA1-Digest: 7QAGh6qveXCv/E9W58DOloyvZkg= Name: res/drawable-xxhdpi-v4/ic_emoji_people_activated_light.png SHA1-Digest: 0KRXuSpv/e6708+wbgz9YCOY4k0= Name: res/layout-v11/notification_template_custom_big.xml SHA1-Digest: 1Qx442anRGyxW0wgyeJMt0vT/hk= Name: res/color-v23/abc_tint_switch_track.xml SHA1-Digest: HnhXpMCgkXuPJieDuAMwRhXU4II= Name: res/drawable-hdpi-v4/ic_play_circle_fill_white_48dp.png SHA1-Digest: qN3xIQ/mmkkkS+xAMiHrU4LIHC4= Name: res/layout-v16/selected_recipient_list_item.xml SHA1-Digest: AzEF8ESv6dxauh7AJe31k89QnVQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_506 SHA1-Digest: /BptlPYGlVrO6aOiRVQIw8Ezzhk= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_505 SHA1-Digest: GPF+v2ktP3tCtgbBVUwLwURztCE= Name: res/drawable-xxxhdpi-v4/abc_text_select_handle_left_mtrl_dark.pn g SHA1-Digest: 1Z/j1p/Oxn+dx4ArUNCWfP80d1M= Name: res/layout/selected_recipient_list_item.xml SHA1-Digest: ZwMoe3tueFRM1XJsSKuaiPw4MZI= Name: res/drawable-ldrtl-hdpi-v17/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: HFivDekYna/HGttXT/KmXBD3Fmk= Name: res/drawable-mdpi-v4/ic_video_dark.png SHA1-Digest: 0BQoC1g4XFBRM0TQ1l3SocRVjqQ= Name: res/layout/recycler_view_fast_scroller.xml SHA1-Digest: rrvwcHdb2KbpCtGjKolNk69QOOM= Name: res/drawable-xhdpi-v4/import_database.png SHA1-Digest: rDR3tnpd7erN4LOxG5WFjosNC4s= Name: res/drawable-xhdpi-v4/ic_archive_white_24dp.png SHA1-Digest: Gae7ytyNb0Xft8WyyIiqL1V9x38= Name: res/menu/group_create.xml SHA1-Digest: vMZZOchmeOZssDjuO6v+J7rzo0w= Name: res/drawable-xhdpi-v4/ic_emoji_places_activated_dark.png SHA1-Digest: a3uDG0MTGuXgvTnN6BUXwXZbLiY= Name: res/drawable-xhdpi-v4/ic_menu_remove_holo_light.png SHA1-Digest: BeNFT6m2uMhTvp5g9THjCC3H0o4= Name: res/layout/media_preview_activity.xml SHA1-Digest: k9t13Px9YTbsRvDBaV/rq2B9drw= Name: res/drawable-xxhdpi-v4/ic_emoji_recents_activated_light.png SHA1-Digest: 3XqZDNHd2rDv0WMBctcfIJcaQJ4= Name: res/color/abc_background_cache_hint_selector_material_light.xml SHA1-Digest: mnPrYggTiTtLeSJMGhhI7MazdiQ= Name: res/drawable-v11/emoji_category_objects_dark.xml SHA1-Digest: kP3MaxgIRF2Mf+XiNYIBvVsu8Yg= Name: assets/fonts/AndroidClockMono-Thin.ttf SHA1-Digest: zFQStQ34LrLFalq5xe3Uxd6yuVU= Name: res/anim/abc_shrink_fade_out_from_bottom.xml SHA1-Digest: bncgNmwtn5WUMmKg+YNicoakQlQ= Name: res/drawable/abc_seekbar_thumb_material.xml SHA1-Digest: 3gcgKKHkoQO20Qass3DY4tt02lc= Name: res/drawable-mdpi-v4/ic_audio_light.png SHA1-Digest: 5hLRbrHX51BWfRUHMdSUaHUM8dc= Name: res/drawable-sw600dp-mdpi-v13/ic_backspace_disabled_dark.png SHA1-Digest: so4LY3SJgjbol1mOpd4tofs9SG4= Name: res/drawable-xxhdpi-v4/ic_emoji_recents_activated_dark.png SHA1-Digest: S3D4QA/vjbvCM0ipLSV32x8pZMA= Name: res/drawable-xxhdpi-v4/ic_volume_off_grey600_18dp.png SHA1-Digest: xyShsMFVKL/taZguHjNYVafhUCA= Name: res/xml/preferences_manual_mms.xml SHA1-Digest: bihOojDIOySM3xIwH4cmp7iQwFI= Name: res/drawable-xxhdpi-v4/abc_list_pressed_holo_light.9.png SHA1-Digest: rDoVKQUYnqgVz5KStlGT59UHjW4= Name: res/drawable-xhdpi-v4/ic_delete_white_24dp.png SHA1-Digest: J8LvNs0MhIh3BoduSNyTYjx8LQk= Name: res/drawable/abc_cab_background_top_material.xml SHA1-Digest: Z+2EBs+zMxbPCCEkmiGm2pj627E= Name: res/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_015.png SHA1-Digest: Sd1OkxgWYvHeM4ODIZu3S1hWhJQ= Name: res/drawable-mdpi-v4/ic_attach_white_24dp.png SHA1-Digest: p9K8MPl4UVAiHO4BW2iW0u1lrJg= Name: res/drawable-xhdpi-v4/dialog_full_holo_dark.9.png SHA1-Digest: mgx4FmtAVykjmDt5bIzhpACjqt4= Name: res/drawable-hdpi-v4/ic_lock_white_24dp.png SHA1-Digest: cLkNiQWRwlh8UgGblzdxBspbVB4= Name: res/drawable-hdpi-v4/ic_volume_up_dark.png SHA1-Digest: j5+kaaW+uEa9OqNuM3XL+k6grLI= Name: res/drawable-xhdpi-v4/ic_message_gray.png SHA1-Digest: HlcSvHzI8JnPB5h4DUjQmwj+leQ= Name: res/layout/outgoing_sms_preference.xml SHA1-Digest: 3nd7EfpO4R6Dk74R9VjfestQ3RM= Name: res/layout/number_picker_view.xml SHA1-Digest: 3tuhjqFbmNtKOSuEhNpijVWCoz8= Name: res/drawable-xhdpi-v4/ic_lock_light.png SHA1-Digest: jkurql42fRwoUwJ9dQ4E1U1sqvc= Name: res/layout-v17/design_layout_snackbar_include.xml SHA1-Digest: J7eBMH/8NR1GSJHI2w1sf/rcKjo= Name: res/drawable-xxhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png SHA1-Digest: Jrc7Wnxi6R1ydjCdOBfCkiBqY5s= Name: res/color/switch_thumb_material_dark.xml SHA1-Digest: bpqZBZv76bgn7Mk1BtTThkcOx+E= Name: res/drawable-xxhdpi-v4/ic_visibility_off_white_24dp.png SHA1-Digest: +JlWwxq/HVPvQ6/dnBTL+tKVXO4= Name: res/drawable-mdpi-v4/ic_push_registration_reminder.png SHA1-Digest: Uisn5CHa/R/wnrVYWnBDuxeMjao= Name: res/drawable-mdpi-v4/dialog_full_holo_light.9.png SHA1-Digest: DeKy7GsN0S4R0sogsQeaHfjUcTA= Name: res/layout-sw600dp-v13/design_layout_snackbar.xml SHA1-Digest: pg2FV1KIEizDuQjBXGl2wPbkQA8= Name: res/drawable/actionbar_icon.xml SHA1-Digest: Zolvi6pYeS++UJxxiH9TjkqRRJs= Name: res/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.pn g SHA1-Digest: hZVZo6Q2zbo8jok1iFFNncAE3yQ= Name: res/layout/abc_list_menu_item_layout.xml SHA1-Digest: sojzCe+xZ74CQbQlqlg6DAKLMkw= Name: res/drawable-mdpi-v4/ic_movie_creation_dark.png SHA1-Digest: pqnNLm2HbqECEQqV/CWKQELBIlY= Name: res/drawable-v21/abc_edit_text_material.xml SHA1-Digest: odhxqQ9YoX/pjZCSMFLixnq44m0= Name: res/drawable-mdpi-v9/icon_notification.png SHA1-Digest: gdz7Utm6zHfttFBV1/waHt+y/pg= Name: res/drawable-xxhdpi-v4/ic_refresh_white_24dp.png SHA1-Digest: azW0GPmTz46IuM2bCfyFef1OFnc= Name: res/drawable/progress_background.xml SHA1-Digest: vOhG7l3qzc7lUlqnjnghMamRR1I= Name: res/drawable-xxhdpi-v4/list_pressed_holo_light.9.png SHA1-Digest: 7Gks0mPw3HB/OmNgzPxInAEdGvw= Name: res/drawable-xhdpi-v4/abc_textfield_search_activated_mtrl_alpha. 9.png SHA1-Digest: XhJt+0uemfensB5jPL5pYEy1IQs= Name: res/drawable-mdpi-v4/textfield_disabled_focused_holo_light.9.png SHA1-Digest: zyu+XV9QUyEyfMxKPq2khDJwXU0= Name: res/drawable-xhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png SHA1-Digest: j7oKd56yOLmG/qIDUU3a+2EFFV4= Name: res/anim/abc_slide_out_bottom.xml SHA1-Digest: QE0YUwjYdedmgPyovw3+5mmYlYE= Name: res/xml/preferences.xml SHA1-Digest: aT1SF6JAwkWWHutmFsRg+R6Zcbs= Name: res/drawable-mdpi-v4/spinner_disabled_holo_light.9.png SHA1-Digest: yVf+7rXpW8kOGpk0VoFsOF3qLus= Name: res/drawable/emoji_category_places_light.xml SHA1-Digest: jHPgby+3qY7Ujw9pfRzvrx1CdPc= Name: res/menu/conversation_group_options.xml SHA1-Digest: c29cQhgl/UN7yvyz4kPHAQRr2a8= Name: res/drawable-xxxhdpi-v4/abc_text_select_handle_right_mtrl_dark.p ng SHA1-Digest: bgS7Y9u7G+otDRLOCvvqXphgw98= Name: res/drawable-xhdpi-v4/ic_emoji_nature_normal_dark.png SHA1-Digest: W3vwBQWHXo5i1OZUZm/hX1lplJA= Name: res/drawable-ldrtl-xhdpi-v17/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: 7EcOfBvuzL3CgvHqFSF/PzLjcQc= Name: res/drawable-xhdpi-v4/design_ic_visibility_off.png SHA1-Digest: BMTOD/vDIsCXobMddP47f9l0tkg= Name: res/menu/share.xml SHA1-Digest: xmMhiGZ5tC6kAUMIbJn3lqEShjI= Name: res/drawable-mdpi-v4/spinner_focused_holo_light.9.png SHA1-Digest: PkIQHK1gQev4CH5s1HE8eer4Q7A= Name: res/drawable-mdpi-v4/ic_unarchive_white_24dp.png SHA1-Digest: nEUZoefnyShaKejwZEZia9gphjw= Name: res/drawable-xhdpi-v4/ic_send_white_24dp.png SHA1-Digest: 1wW51ZVvnOTyWSWVFXLLo6dltK4= Name: res/drawable-mdpi-v4/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: oQXUTVCmKbEkuIGzA7hY1v2BYpE= Name: res/drawable-hdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png SHA1-Digest: zfh5PyI9Lqjbn44yzO7hvkJSsfk= Name: res/animator/rotate_90_animation.xml SHA1-Digest: uK/YW8CFLkvobgn+SDKh5dvJKnc= Name: res/drawable-xxhdpi-v4/ic_forward_white_24dp.png SHA1-Digest: xp/9QSw9ASrlEivYBbN9fcMKCOM= Name: res/drawable-xxhdpi-v4/ic_notifications_black.png SHA1-Digest: dF5+n+zqtdP+ka7/LdSAxnDtmgg= Name: res/layout/message_recipient_list_item.xml SHA1-Digest: cO6Ul1S0F6vmX1DhiUJkAPKYw38= Name: res/drawable/abc_spinner_textfield_background_material.xml SHA1-Digest: VxVhP39ECkMfDcnEy/uhMtmv8LA= Name: res/drawable-mdpi-v4/ic_pause_circle_fill_white_48dp.png SHA1-Digest: EeIiwplPXadZAoahDjmjyd0kmjI= Name: res/layout/single_recipient_panel.xml SHA1-Digest: zsFe0OdCFRTk7jPnGiyHaoumgv8= Name: res/drawable-mdpi-v4/abc_ic_star_black_48dp.png SHA1-Digest: FaUwj2ktP/Mx8BZm5lDgykR/aVk= Name: res/layout/select_dialog_multichoice_material.xml SHA1-Digest: 46ryfXlYBGkcboB0y0GjlBuMusI= Name: res/drawable-xxhdpi-v4/ic_warning_light.png SHA1-Digest: GNPOCgZ4syQiiVSBBzHn18YuiU0= Name: META-INF/buildserverid SHA1-Digest: xhNZchncMZQXytaTDWWDf2VsOkI= Name: res/layout-v11/notification_template_big_media.xml SHA1-Digest: oo4THErHbQ8SdBiHW/8EHh9Ys+Y= Name: res/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_015.png SHA1-Digest: Es6oBCiowN0wRwOhe4WNu1jjzYI= Name: res/drawable-mdpi-v4/ic_forward_white_24dp.png SHA1-Digest: Fu+RxWE5w8GdxSU1DCKwPIEG1y8= Name: res/drawable/conversation_item_background.xml SHA1-Digest: h6SLLN+ps25Trx7l30cz6Mioc7c= Name: res/drawable-mdpi-v4/abc_textfield_search_activated_mtrl_alpha.9 .png SHA1-Digest: 8MDSDpYFD8fxl8tEamhg6/oSBig= Name: res/color/abc_background_cache_hint_selector_material_dark.xml SHA1-Digest: EkWMqlaBHrpcPaV0xhKAKJtZbBU= Name: res/drawable-hdpi-v4/ic_delete_white_24dp.png SHA1-Digest: J+w109mQxWhOYjM+qp1D7EpZq3M= Name: res/anim-v21/design_bottom_sheet_slide_out.xml SHA1-Digest: p2/uhdWZ4yTGAbU/lBqEQJKJUt4= Name: res/layout-w270dp-h560dp-v13/calendar_date_picker_dialog.xml SHA1-Digest: W74q95Q7a5HSbwCxj2nfLP+L77E= Name: res/layout-sw600dp-land-v13/calendar_date_picker_dialog.xml SHA1-Digest: GOPa/Ci6BmPcCb9LOPRYtRAp1U0= Name: res/layout/design_navigation_item.xml SHA1-Digest: Z2LAX4Z45Q9c5ScpVvdhIl296zY= Name: res/drawable-xhdpi-v4/ic_contact_picture.png SHA1-Digest: 07gvt3zBJHPCeYeZlmnq8pkjvXY= Name: res/drawable-xhdpi-v4/ic_push_gray.png SHA1-Digest: pOCxg+EJqcno1tAdL3omHl5TAMY= Name: res/drawable-hdpi-v4/ic_emoji_flags_activated_light.png SHA1-Digest: NmtVPrNT07HF8JkEdWy/S3QHA5k= Name: res/layout/notification_action_tombstone.xml SHA1-Digest: XQeaU7Egiq2DtYHNjs0SMCrT8/Y= Name: res/drawable-hdpi-v4/abc_textfield_activated_mtrl_alpha.9.png SHA1-Digest: PIZprngie1clc1fat6kH+iHy6P4= Name: res/drawable-xhdpi-v4/ic_group_photo.png SHA1-Digest: WnjST0J5e2XQOJAD8kdAiO08P1k= Name: res/drawable-xxhdpi-v4/fab_shadow.png SHA1-Digest: x9M/KJyVED6D5/Cg3TpamvVVc0c= Name: res/drawable-xhdpi-v4/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: noUbrA0YTfnyTN3qU6nIC6HIi2Y= Name: res/drawable-xhdpi-v4/ic_visibility_off_white_24dp.png SHA1-Digest: reD5BI2mdKU65i+N+wFDVbkYi1k= Name: res/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_dark.9.pn g SHA1-Digest: e8DEB+kwT5rrQOaL1UepmHHnW0M= Name: res/drawable-hdpi-v4/ic_archive_white_24dp.png SHA1-Digest: eeCQonDlHipVzbJ6m65VayQq7G4= Name: res/drawable-xhdpi-v4/ic_backspace_disabled_light.png SHA1-Digest: FvX9DtFBzEZNWx3ub/2oTnBJSzE= Name: res/layout/select_dialog_item_material.xml SHA1-Digest: GUNv1jzQMrsB/0NDNXTw8VXAN7c= Name: res/layout/view_identity_activity.xml SHA1-Digest: ZxYsEzUbqWB1fd31cKcAig8JDhs= Name: res/layout/design_navigation_item_subheader.xml SHA1-Digest: xcHXe/zAAc7FC3sqIMA7/TiN+RE= Name: res/layout-v21/notification_action_tombstone.xml SHA1-Digest: aV/gWa/js2N+8wB6XvVkSGnNUSw= Name: res/layout/share_intent_list.xml SHA1-Digest: /OHFqV8MJVHfwnbde21PTpxrK2o= Name: res/drawable-mdpi-v4/fab_shadow_mini.png SHA1-Digest: m9/szLEMoxYSEP7udguD4fDjL1c= Name: res/drawable-hdpi-v4/icon.png SHA1-Digest: YzSLNbDXnqM/2zu4zYoA+QIsVzM= Name: res/drawable-hdpi-v4/switch_thumb_pressed_holo_light.9.png SHA1-Digest: 85bARtoMmHSPqKgl57lX2txB7Sg= Name: res/drawable-xxxhdpi-v4/ic_archive_white_36dp.png SHA1-Digest: ka4rxVO7H4WEPB3680GcHOZSYWU= Name: res/drawable-xxhdpi-v4/ic_emoji_places_normal_dark.png SHA1-Digest: D+xbr+08WYh4PZpSnQN4FXZleUI= Name: res/drawable-xxxhdpi-v4/ic_save_all_white_24dp.png SHA1-Digest: VldTJ9341lkKln91ap5+0NkeH0g= Name: res/drawable-xxhdpi-v4/ic_delete_gray.png SHA1-Digest: SDeqOr2a1ZZDjr4coXlkzAbayc4= Name: res/drawable-xhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png SHA1-Digest: bTNFsVJfPn6MYG0AqtJNqG+o5hs= Name: res/drawable-hdpi-v4/ic_emoji_emoticons_activated_light.png SHA1-Digest: GuuTGR/EH4/yVL2IFPt3b32WxkA= Name: res/drawable-mdpi-v4/abc_textfield_search_default_mtrl_alpha.9.p ng SHA1-Digest: IKTGIARYbmam8Kefq6089z/0k98= Name: res/drawable-xxhdpi-v4/ic_textsms_black_32dp.png SHA1-Digest: dY2WYdqBdIVm2MnbgiHBzPTZUjw= Name: res/drawable-hdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: 65aQz5QMXj+UAVHCsbn073ly7KA= Name: res/layout/group_create_activity.xml SHA1-Digest: k4AP0tqSuRSD7P+1g/dRlhTYZ1A= Name: res/drawable/emoji_category_symbol_dark.xml SHA1-Digest: dzEqAStAWicUXbOWCC/SIc3ASCM= Name: res/drawable-xxhdpi-v4/ic_volume_off_white_18dp.png SHA1-Digest: OkFrZtMHjtYzIxy94ZW7uTW0seQ= Name: res/drawable-hdpi-v4/ic_delete_gray.png SHA1-Digest: GK23DhSbaqklFDToW0tkfpKqW5s= Name: org/spongycastle/x509/CertPathReviewerMessages.properties SHA1-Digest: J41SvstF2si4wHzfzilAP7QU0lQ= Name: res/drawable-mdpi-v4/ic_emoji_people_activated_light.png SHA1-Digest: f/TH7ItlEg/niyKj2GAr0sLV064= Name: res/drawable-xhdpi-v4/actionbar_icon_holo_dark.png SHA1-Digest: TZatVkrjHmlxY7IlBlujhU5BAlY= Name: res/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_000.png SHA1-Digest: bazEYewUnilv0P6pckaiMrtQjTA= Name: res/drawable-xhdpi-v4/ic_visibility_off_grey600_24dp.png SHA1-Digest: 3bgJfHp4RhHGV2kMtin4ebCYM/o= Name: res/drawable/abc_ic_ab_back_material.xml SHA1-Digest: t28C57S8eCJuIjC2my++spL9/m0= Name: res/layout/design_navigation_menu_item.xml SHA1-Digest: nQaPVu6/W8ZpMDF8QEt9cSW0r3c= Name: res/drawable-v21/touch_highlight_background.xml SHA1-Digest: LXWsYtf9CleMEE9F2d2jKTU65FA= Name: res/drawable-xxhdpi-v4/abc_text_select_handle_middle_mtrl_light. png SHA1-Digest: YwrO8vgjHUmvObRSq+AnITPZC2E= Name: res/drawable-mdpi-v4/abc_list_divider_mtrl_alpha.9.png SHA1-Digest: gLcFerBxZUHHCrWZLH3iEvl0WT0= Name: res/drawable-mdpi-v4/ic_reply.png SHA1-Digest: 9lPFP5ez5joY2ong87wLU1XP1NQ= Name: res/drawable-xhdpi-v4/ic_emoji_objects_normal_light.png SHA1-Digest: vFhjx3BEAMCrDnw4ySDUpntYmUE= Name: res/layout-v17/notification_template_media_custom.xml SHA1-Digest: gzUkzEoypfAgJr6T3G4Icb7DIJg= Name: res/drawable-xhdpi-v4/ic_emoji_people_activated_dark.png SHA1-Digest: c/MMC1XZ+gxe5QwxIZ+gcaZ//1M= Name: res/animator/bottom_play_to_pause_animation.xml SHA1-Digest: noAqkjThR2pnIhrGEXxZ9yulSK8= Name: res/drawable-xhdpi-v4/ic_emoji_places_activated_light.png SHA1-Digest: xPpIhlJVBKYVrfdXQgmh5VeRY3c= Name: res/layout/switch_compat_preference.xml SHA1-Digest: SCvYTOQBF2ZhtbA8eqD7WWHhPMQ= Name: res/drawable-hdpi-v4/abc_list_divider_mtrl_alpha.9.png SHA1-Digest: BY8cHWBjISmMI2i+RFH96y5MQfc= Name: res/drawable-mdpi-v4/ic_menu_barcode.png SHA1-Digest: WRiRsH9ERDjUXiQi3mLSuzR1G+Y= Name: res/drawable-xxhdpi-v4/ic_push_gray.png SHA1-Digest: EKAW04fIdkE5eZtqX2agFEei4nI= Name: assets/backward SHA1-Digest: hgif/oUAa/79gSRPr7FCRJRVfvk= Name: res/drawable-xhdpi-v4/ic_audio_light.png SHA1-Digest: pzLZ/JTZjtDf/M2zEMIL9SuNrns= Name: res/drawable-xhdpi-v4/ic_emoji_recents_normal_light.png SHA1-Digest: SJMYsCgc/8fCuja29M3R6NbsVFA= Name: res/layout/load_more_header.xml SHA1-Digest: hPvXpdQKy7YDux7jOh1HBtNOyFw= Name: res/drawable-xhdpi-v4/ic_missing_thumbnail_picture.png SHA1-Digest: 69jYTqmN2tp4O9u6ohWhADlvUsQ= Name: res/layout/abc_action_menu_item_layout.xml SHA1-Digest: WBRWjBB6NmqhNMmPgLKikjYT+as= Name: res/drawable/conversation_list_item_unread_background_dark.xml SHA1-Digest: svRyOBu2+whEW37LlkqNjyQKg9E= Name: res/drawable-mdpi-v4/switch_bg_focused_holo_light.9.png SHA1-Digest: VaARP+7lQEpru1o/MCLqYUFQzRo= Name: res/color/done_text_color.xml SHA1-Digest: vLb4XWbtbiVRId+NRHZPOBIzsfg= Name: res/drawable-mdpi-v4/ic_advanced_black.png SHA1-Digest: wr7WCN0fcSAi5JW5m8myf55Rveg= Name: res/drawable-hdpi-v4/abc_list_longpressed_holo.9.png SHA1-Digest: xcQ0bHWRc+R9tuxQ3wgY1a2eY0k= Name: res/layout/splash_screen_activity.xml SHA1-Digest: eJryvlJWhqRzVH04OAQTL3dHvJE= Name: res/drawable-mdpi-v4/ic_app_protection_gray.png SHA1-Digest: q1NxUnsB8IEjVdrzkFlbjOkvVXA= Name: res/drawable-xxhdpi-v4/sms_selection_icon.png SHA1-Digest: nMUgtPxv8ssxVwF/6dKCmqiMWAo= Name: res/drawable-hdpi-v4/sent_bubble.9.png SHA1-Digest: FdfowFhHZNhFmrm59JSxASd+t3E= Name: res/drawable-mdpi-v4/ic_visibility_off_grey600_24dp.png SHA1-Digest: jtzcfEAVv3vxG3LfkfzexCfO5M0= Name: res/drawable-mdpi-v4/icon_dialog.png SHA1-Digest: sN1A7orUCP1wS6ay7YTobIJO7sE= Name: res/drawable-xhdpi-v4/list_pressed_holo_light.9.png SHA1-Digest: o6uQudI4iPo5plFaQ6Lklwf2dTY= Name: res/drawable-xhdpi-v4/ic_unarchive_white_24dp.png SHA1-Digest: z3y5F8v+7qRcfmyV/3sy7TiJ+1M= Name: res/layout/timezonepickerview.xml SHA1-Digest: PoG/lSYx+ggur9vjpGIzlSwFFiQ= Name: res/drawable-xhdpi-v4/ic_check_light_disabled.png SHA1-Digest: cywK3BhZXLadkndqRLvlZ5YWrRc= Name: res/drawable-xhdpi-v4/textfield_focused_holo_light.9.png SHA1-Digest: GTkseIIJxb2K4BmEEabgcA60SSU= Name: res/layout/color_preference_item.xml SHA1-Digest: 8pDpvvYOnDd3vfLlQ+Q9WfMGf/M= Name: res/layout/transport_selection_list_item.xml SHA1-Digest: XNz03gqniZYh5CPr9sFy3CTqunc= Name: res/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png SHA1-Digest: o6T1nENnpl79GnrVrE8AKfzN0kU= Name: res/drawable-mdpi-v4/actionbar_icon_holo_dark.png SHA1-Digest: /cj9MZ2+estI4chV3tWfVOlf1jE= Name: res/drawable-xhdpi-v4/ic_menu_barcode.png SHA1-Digest: wTyjejvUpn89HCtyeYcelozizeU= Name: res/drawable/import_export_item_background_light.xml SHA1-Digest: LebjrX09YTvkPFojCNp9TxoTHdw= Name: res/drawable/emoji_category_flags_light.xml SHA1-Digest: 2cusWJDjvxQv4dc6oJNAKVfKSs4= Name: res/drawable-xxhdpi-v4/ic_app_protection_black.png SHA1-Digest: 40GtO8uqUrQds7WklErRCNNcr9U= Name: res/layout/abc_alert_dialog_material.xml SHA1-Digest: ZUWbXMo/VjOtdZ/T3ZdDS1bn+7w= Name: res/color/dialog_text_color_holo_dark.xml SHA1-Digest: 4Q/QsARcQeky254Q4d695fPiL8k= Name: res/drawable-hdpi-v4/ic_visibility_grey600_24dp.png SHA1-Digest: y8hXlqbSpjn5i0MMpjrExISMEsQ= Name: res/layout-sw600dp-v13/three_keys_view_leftright.xml SHA1-Digest: MUBcRcFXaDRAK8Q8DZH7MO67ECc= Name: res/anim/abc_popup_enter.xml SHA1-Digest: mW6OQN3tih7Y8FA4hLg0FHa+E8g= Name: res/layout/blocked_contacts_fragment.xml SHA1-Digest: 30DM/Wpgi4Ma6C9rrA0uhEsKBUY= Name: res/drawable-mdpi-v4/abc_tab_indicator_mtrl_alpha.9.png SHA1-Digest: ToVo2KPSLrpwpzwqt2DA6d7KLWk= Name: res/drawable-hdpi-v4/abc_ic_star_half_black_16dp.png SHA1-Digest: QHQgoF3m7FlwHEI02KkUv35XO4k= Name: res/drawable-xxhdpi-v4/splash_open_padlock.png SHA1-Digest: 9X6kQxtwOAjhykjRzH1PrBSB/nQ= Name: res/drawable-xxhdpi-v4/design_ic_visibility.png SHA1-Digest: 1hq21CJLEjOqRp4hk2eb1egstEo= Name: assets/zone.tab SHA1-Digest: DB2JMeHIQyU6vbJXRUlLcMwvciM= Name: res/drawable-hdpi-v4/notify_panel_notification_icon_bg.png SHA1-Digest: +WaWq164+JEgAS3SD7a6bgQZgMc= Name: res/layout-v16/conversation_list_item_view.xml SHA1-Digest: OyJ30/ayut9fWwKSipo+q31JMk8= Name: res/layout/notification_template_custom_big.xml SHA1-Digest: lXs5xrTOn4+b7s8FYWdvQVtlJEQ= Name: res/layout-sw600dp-v13/calendar_date_picker_dialog.xml SHA1-Digest: 7A3C6mu/nfuE/ZOx3v+PHDrH5uE= Name: res/drawable-v11/emoji_category_nature_dark.xml SHA1-Digest: tzM7XM6jXz5ibx/c5oh3hYXuTjY= Name: res/drawable-mdpi-v4/notification_bg_normal.9.png SHA1-Digest: Q3acMTlGj6UQhONPvMrXTfJYYHU= Name: res/layout/centered_app_title.xml SHA1-Digest: c0q2NKq9aTKPwK1WRla9BgWTNWE= Name: res/drawable-xxhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png SHA1-Digest: boG5dcozMnSrJdbSbLX0TBOMATU= Name: res/drawable-hdpi-v4/ic_info_outline_light.png SHA1-Digest: 3U33QULK0J7RuE3cBwPGjUbRVBg= Name: res/drawable-mdpi-v4/ic_block_white_18dp.png SHA1-Digest: vCQBWKrCBsUXUIzg00jbJKpYDVU= Name: res/drawable-xxhdpi-v4/ic_info_outline_grey600_24dp.png SHA1-Digest: MaI496aqVWHrODDpXxhJa19mm3s= Name: res/drawable-hdpi-v4/ic_recurrence_bubble_fill.png SHA1-Digest: N0RlHgCdtk7/v3uisCq9UFt1zKQ= Name: res/color/abc_primary_text_disable_only_material_dark.xml SHA1-Digest: PMhnRzfrwY1jlNfoIvzhOutdgIg= Name: res/drawable/info_round.xml SHA1-Digest: EQHFy9KXlVRBd3MTQYLkJoHhHec= Name: res/drawable-v21/avd_hide_password.xml SHA1-Digest: tCMN1pa7/72S99g/osWbGg8uwMY= Name: res/drawable-hdpi-v4/ic_launch_white_24dp.png SHA1-Digest: BDelJhu97+vnx9fccEH+FD6CdUw= Name: res/drawable-mdpi-v4/ic_unarchive_white_36dp.png SHA1-Digest: anNidWfeepDjyPgAIZKa8Ks9mn0= Name: res/drawable-xxxhdpi-v4/fab_shadow.png SHA1-Digest: HyRQIsHzzBNID4cwXCdz7aHwQTo= Name: res/anim/slide_from_top.xml SHA1-Digest: dpPiD0hLamwYer/Zh9GESUYkkl8= Name: res/drawable-mdpi-v4/ic_warning_dark.png SHA1-Digest: mQDXjcj9f73wMhnSFRpT8LlqDK4= Name: res/drawable-hdpi-v4/ic_content_copy_light.png SHA1-Digest: Kc+x06w+bAcZdacvH0QEgCtLLvI= Name: res/drawable-hdpi-v4/received_bubble.9.png SHA1-Digest: I12yNJInw7EAeJ+dan826X5qFys= Name: res/layout/keyboard_right_drawable.xml SHA1-Digest: O8O7eJxdOH0gZkW5Q+ok6QTtgrk= Name: res/drawable-hdpi-v4/abc_list_pressed_holo_dark.9.png SHA1-Digest: 0zBo9Tp1wTO3RHYh5z1M+TUN+H8= Name: res/drawable-xhdpi-v4/ic_lock_white_24dp.png SHA1-Digest: 3xuHKI/HcZ+RqZMLXhn2A97T2FA= Name: res/drawable-xhdpi-v4/ic_reply_white_36dp.png SHA1-Digest: 8FtXNX+a3aLdkMF4Ye1lu5YGUi0= Name: res/color-v11/abc_tint_default.xml SHA1-Digest: 5QwBDkHEzTgTemwvQXm0FJqBCcI= Name: res/xml/preferences_sms_mms.xml SHA1-Digest: CNZE1mjiY2DPiaB0mWAXNrBBXSk= Name: res/drawable-xhdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png SHA1-Digest: r/h/FWdsW/T/8uq+xHKyl+iJKz0= Name: res/drawable-xxhdpi-v4/ic_emoji_emoticons_normal_light.png SHA1-Digest: UP3HNQi1TrWx5jfn6AKRiPu1SJo= Name: res/drawable-mdpi-v4/ic_emoji_places_normal_dark.png SHA1-Digest: W6IBMjE4M2iGTNNWmOe2vxsnXQs= Name: res/drawable-hdpi-v4/import_database.png SHA1-Digest: ycFAKEbBj2c3oO83GGoVCF2sVyo= Name: res/drawable-sw600dp-xhdpi-v13/ic_backspace_disabled_dark.png SHA1-Digest: MOsT5ebuo+XKKaakAt9/WeSeP1U= Name: res/drawable-xhdpi-v4/ic_emoji_objects_normal_dark.png SHA1-Digest: jGC2iFS0Wfg/WDmaseQgQaykEbE= Name: res/drawable-xhdpi-v4/ic_app_protection_gray.png SHA1-Digest: EOfgE1fjZaclo3c0va+a33QIxMM= Name: res/drawable-hdpi-v4/ic_action_warning_red.png SHA1-Digest: GFcZA1im1MVaPolBF19LyzD4ok0= Name: res/drawable-hdpi-v4/ic_info_outline_dark.png SHA1-Digest: aCTUUUUQ4+v7lkGanhwuQqp7mkA= Name: res/drawable-hdpi-v4/ic_account_box_light.png SHA1-Digest: GPGp+rEnVGmzHqCJEspudbAH/UU= Name: res/drawable-xxxhdpi-v11/icon_cached.png SHA1-Digest: uYGv++9QgJscjBiLG2dew5sowmE= Name: res/drawable-hdpi-v4/ic_notifications_black.png SHA1-Digest: Dog7/fcdUr3lbwLolw6ZDkZQIFw= Name: res/drawable-xxhdpi-v4/switch_thumb_disabled_holo_light.9.png SHA1-Digest: RvDI/d1z/we6bQc9ZS9oXdPJnPo= Name: res/drawable-mdpi-v4/fab_shadow.png SHA1-Digest: 45XV1wLqQqgJWEWEUK4mH+j+4kI= Name: res/drawable-hdpi-v4/alert.png SHA1-Digest: M4mo8M2sCrIJH+vZuoNCICj0CKA= Name: res/drawable-hdpi-v4/ic_emoji_places_normal_light.png SHA1-Digest: MgdPAKeTtnfyUo2ng3EoaRB223I= Name: res/drawable-hdpi-v4/ic_reply_white_36dp.png SHA1-Digest: VhtJFYVXZ+cs1YSh6gAB6UBMiqU= Name: res/drawable-xhdpi-v4/spinner_focused_holo_light.9.png SHA1-Digest: CGrl1FRXVxrvA14ueVH03Fn2em0= Name: res/drawable/conversation_list_item_read_background.xml SHA1-Digest: xo2V+lsQf/r0itDPFGirB+bS9IE= Name: res/drawable-xhdpi-v4/ic_create_white_24dp.png SHA1-Digest: XHYLWABpP3mGUN3uyqc8bQoo+aQ= Name: res/xml/preferences_appearance.xml SHA1-Digest: wW5nZrcFeOc1L2k8Q3tFzK44KJE= Name: res/drawable-xxhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png SHA1-Digest: /SHIbNyt1+Fo97bGAhsp65znrc4= Name: res/anim/abc_slide_out_top.xml SHA1-Digest: NM9nWh/XI2zag3rBwIXEqrpl9XA= Name: res/drawable-mdpi-v4/spinner_default_holo_light.9.png SHA1-Digest: s/npsTa4f6dHCangZu461npuSrQ= Name: res/color-v23/abc_tint_switch_thumb.xml SHA1-Digest: edQ0GZeXV46rMhldev7VspmKHD4= Name: res/drawable-xxhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png SHA1-Digest: am9o4CCMkLbqK7tqn2d7aY98YtM= Name: res/drawable/design_bottom_navigation_item_background.xml SHA1-Digest: q/tAvUCKzH/tN0gPUEzccAp698k= Name: res/color-v23/abc_tint_spinner.xml SHA1-Digest: g5nC+lgyeU60gIu/wJqF+3SdbSo= Name: res/layout-v11/notification_template_big_media_custom.xml SHA1-Digest: d8BqWJoZKRqdvlw9kvQm2Jtb2sg= Name: res/drawable-v21/conversation_list_item_read_background.xml SHA1-Digest: Kp+lqb42WaFm0e6LoTHrdtz5xkE= Name: res/drawable-mdpi-v4/ic_delete_black.png SHA1-Digest: mIOI+jdJeaXXrfU+pDakcPF4biQ= Name: res/layout/conversation_list_fragment.xml SHA1-Digest: gMh57swYNwbCfzhX8KeQTr2LNyM= Name: res/drawable-xhdpi-v4/ic_notifications_black.png SHA1-Digest: 5xxTLdG9MaRREbXunrtHf5KYHoY= Name: res/raw/whisper.store SHA1-Digest: XHW+g7lvAC9+4Celnl0Js28aCVo= Name: res/drawable-hdpi-v4/ic_emoji_recents_activated_dark.png SHA1-Digest: s+VUH60cHG3DQHn/KDRKcrw32Pc= Name: res/anim/fade_scale_out.xml SHA1-Digest: Uir4/KEtcVOVxHtCmwcmNzM0Nnc= Name: res/drawable-xxhdpi-v4/ic_video_light.png SHA1-Digest: cIp1SG7udNqwshEULUT0m2Zx4WE= Name: res/drawable-hdpi-v4/ic_reply.png SHA1-Digest: yW8DB5L+UjcqFxvPb5iuS/mfNH8= Name: res/drawable-xxhdpi-v4/abc_textfield_default_mtrl_alpha.9.png SHA1-Digest: sNds9Ym0phYx3ALXo+MZX8xlc30= Name: res/drawable-xhdpi-v4/ic_image_light.png SHA1-Digest: jRfUT1SOm0NWCHN8mTP06GkG3LE= Name: res/drawable/conversation_item_header_background_dark.xml SHA1-Digest: 3zJGQhq7efNb8O1pcgs6FzHcZtw= Name: res/drawable/emoji_category_recent_dark.xml SHA1-Digest: 3LNTUa6nHUMOLhf8Ghy3oolZzzg= Name: res/drawable-ldrtl-xhdpi-v17/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: P6e0iLoIQdVv5zYT47sluTSi/8U= Name: res/drawable-xxhdpi-v4/ic_emoji_symbols_normal_light.png SHA1-Digest: 5LwZJ27P0paPxRx7F4OyAndvSS0= Name: res/drawable-mdpi-v4/ic_forum_black_32dp.png SHA1-Digest: WPgUSq8gt52EyqrxEYbAT0DMhNk= Name: res/drawable-xxhdpi-v4/ic_lock_white_24dp.png SHA1-Digest: htLTvYWN+EgD7hulQ8vXHu5ROKY= Name: res/drawable-ldrtl-xxhdpi-v4/ic_send_white_24dp.png SHA1-Digest: ESPL9d41EpIb26lvmx+kRw7JfjE= Name: res/drawable-mdpi-v4/ic_textsms_black_32dp.png SHA1-Digest: aPyQLe1M5CIKEHMt880bCAo9BDU= Name: res/drawable-hdpi-v4/ic_contact_picture.png SHA1-Digest: J1/9vNqI7GpiHcC/MlfugImp7eU= Name: res/drawable-hdpi-v4/ic_push_registration_reminder.png SHA1-Digest: rqdC/GFKtQiSFjmW/fq1at8m6+s= Name: res/drawable-mdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png SHA1-Digest: iHSmoed/iXLMYG1Wapa0CvCYopQ= Name: res/drawable-xxhdpi-v4/spinner_pressed_holo_light.9.png SHA1-Digest: y35Cc9pdVLFODoXVqOPGVcSrZMs= Name: res/drawable/design_password_eye.xml SHA1-Digest: Ip+zp9WKcMYKDC/1FcIw9dGmhd0= Name: res/drawable-xxxhdpi-v4/ic_clear_white_24dp.png SHA1-Digest: aZFL0sBndjS4MOKenJmwnPQbYec= Name: res/menu/media_preview.xml SHA1-Digest: TUG4x5DmL3L7mQAfYiWNBIYy9P8= Name: res/drawable-mdpi-v4/switch_thumb_pressed_holo_light.9.png SHA1-Digest: VyxRoouO+Z7ITDC+bYAPridmWf4= Name: res/drawable-mdpi-v4/ic_emoji_emoticons_activated_light.png SHA1-Digest: VhIQ5RxVdV3k3W3X17qkKMlzqxE= Name: res/drawable-xxhdpi-v4/ic_scroll_down.png SHA1-Digest: 9Uzxtz02mh/U059QfstpbDG0+nM= Name: res/drawable-hdpi-v4/ic_group_white_24dp.png SHA1-Digest: uM/cr5yN0CYCGsC1huqKr8pKMBY= Name: res/drawable-hdpi-v4/abc_list_pressed_holo_light.9.png SHA1-Digest: +pi/Z1BDTC/eHcG86xxdoFAyukA= Name: res/layout-v21/message_details_header.xml SHA1-Digest: IwErlBffc82CUVeFFihw7lOCdc4= Name: res/drawable/abc_ratingbar_small_material.xml SHA1-Digest: /P2KXIWbMuyOgftOHbBQa8ym+uI= Name: res/drawable-xxhdpi-v4/abc_text_select_handle_right_mtrl_light.p ng SHA1-Digest: xmNf1ImJ9zRw/jShIY6T+TQEFiI= Name: res/drawable-mdpi-v4/abc_text_select_handle_middle_mtrl_light.pn g SHA1-Digest: rzBEG5E2MZ8ThruZL2oRv/S33oo= Name: res/drawable-xxhdpi-v11/icon_notification.png SHA1-Digest: dC3ZDCE4hgbvLcSF8i/dtyEG2DI= Name: res/drawable-mdpi-v4/ic_menu_remove_holo_light.png SHA1-Digest: BQFtfz+X7xkDAjh7SE2eENwuCXA= Name: res/layout/abc_activity_chooser_view_list_item.xml SHA1-Digest: a+iaKMdtxOa/B0g49Cz7dJwCQFk= Name: res/drawable-xxxhdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png SHA1-Digest: WWeCz1VpFVwQ378BwOFriTLP1x8= Name: res/drawable-xhdpi-v4/abc_textfield_search_default_mtrl_alpha.9. png SHA1-Digest: P2nXckVhoat9mgVUXkNB8jHu5sU= Name: res/color/text_color_dark_theme.xml SHA1-Digest: +r5qAEASxwVUq+72lZIJoOu6N+Y= Name: res/drawable-xhdpi-v4/ic_emoji_symbols_normal_light.png SHA1-Digest: xJRFg2lT8pCNLPi6NCbB7K2dtiY= Name: res/drawable-mdpi-v4/ic_badge_24dp.png SHA1-Digest: cJ3CJ+jyxtHeApCtlGzENIl0ugA= Name: res/drawable-xxhdpi-v4/ic_delete_black.png SHA1-Digest: U7JXpz2+U8hC48B4evSn8MjewL0= Name: res/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_000.png SHA1-Digest: hd7Xhf7r8tiMaj3TA7e8mD5AaWk= Name: res/drawable-xxhdpi-v4/ic_reply_white_36dp.png SHA1-Digest: q1IMO8sC5U7/zGVWmUfd+VXf8vE= Name: res/drawable-xxxhdpi-v4/ic_circle_fill_white_48dp.png SHA1-Digest: WVB9yHE8xW+1eSVkrlKOLFEa/Eo= Name: res/drawable-xhdpi-v4/dialog_full_holo_light.9.png SHA1-Digest: 4a/lXtrHhDyTJ5J/FXa5QOYmYFk= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_972 SHA1-Digest: wAYIltvc6+i6ruNDh7sN4H7KQtQ= Name: res/drawable-v21/design_bottom_navigation_item_background.xml SHA1-Digest: pr4lHw2CyDnUXBosj+Dtzxdp1Go= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_971 SHA1-Digest: hXcyXUcpEkkPh5oyJGLDlCa0gj4= Name: res/layout-v16/audio_view.xml SHA1-Digest: cLq5qBUOjLJvq7rciTXcC3OfLB0= Name: res/drawable/conversation_list_divider_shape_dark.xml SHA1-Digest: fWos81hHhRxDA19IMaROPe9RF/g= Name: res/layout-v22/abc_alert_dialog_button_bar_material.xml SHA1-Digest: BGg02XJg5Rm7Hon/HR5TED1+xGA= Name: res/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png SHA1-Digest: x6v2WXfb5dlObVj7r3apFaVYbqU= Name: res/layout/push_recipients_panel.xml SHA1-Digest: V9+FCGlL81aEfDHsTJjEq/vXCic= Name: res/layout/blocked_contact_list_item.xml SHA1-Digest: O2MH8iSEZ/gnJ7/+O30PtzbPZ/o= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_595 SHA1-Digest: Yclq7RFkgBMoTXIDcvEQSp9M8ok= Name: res/drawable/emoji_category_symbol_light.xml SHA1-Digest: AXYq5JMOM7ytemsBcrJ/iZRr5GU= Name: res/drawable-hdpi-v4/ic_emoji_emoticons_normal_dark.png SHA1-Digest: hAVGK8+r2aV6kpGq3D0wI2GPvU8= Name: res/drawable-xxhdpi-v4/abc_list_pressed_holo_dark.9.png SHA1-Digest: LdyLROvWFgig9Vsgsaypd9fZOJY= Name: res/drawable-xhdpi-v4/ic_emoji_nature_activated_light.png SHA1-Digest: 4lPutF935FySe8C9WkMbfnRwTtw= Name: res/drawable-xhdpi-v4/icon_cached.png SHA1-Digest: YFST3niSlSLLmcZHPhBmo/JGETE= Name: res/drawable-hdpi-v4/switch_bg_disabled_holo_light.9.png SHA1-Digest: 8JhypYeb6T5pv+9W/UUzEOwHvyI= Name: res/drawable-mdpi-v4/ic_emoji_nature_normal_dark.png SHA1-Digest: QaZ6rwfPQ4lc5WIJun2DFKbP7Mc= Name: res/drawable/ic_backspace_light.xml SHA1-Digest: YHhJ2M17Nwf63uXOZsa/rXaXSiI= Name: res/drawable-xhdpi-v4/ic_forum_black_32dp.png SHA1-Digest: 3l7T8riC3mgNo6J1olUj+hRqoUU= Name: res/drawable-ldrtl-xxxhdpi-v4/ic_send_white_24dp.png SHA1-Digest: bxEMeGjTEUMf6/VMTJgYOWnNAAc= Name: res/drawable-hdpi-v4/ic_emoji_places_activated_light.png SHA1-Digest: dtZ0oh5dGwA3n/PYE9vMAKw/mSc= Name: res/drawable-hdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png SHA1-Digest: BZJDbJr+DqrwOb7xOhkTBDzBHlg= Name: res/drawable/rounded_rectangle.xml SHA1-Digest: W1PIBWXgXwieJFzg924AzyFFCQI= Name: res/drawable-xhdpi-v4/ic_lock_white_18dp.png SHA1-Digest: QRmXgmOtRZSMLuw4lzyyvEzxODA= Name: res/drawable-hdpi-v4/lockscreen_watermark_light.png SHA1-Digest: AXK2KP2ApxC2Z2yzuty9it93QuI= Name: res/drawable-hdpi-v4/ic_lock_light.png SHA1-Digest: Y+MO7y5qQbcsoqrpg2zSVCsJf3M= Name: res/layout/conversation_activity_attachment_editor_stub.xml SHA1-Digest: xP5sF5FP2CHmgHqc2J4zXFClT/c= Name: res/drawable-xhdpi-v4/ic_forum_grey_32dp.png SHA1-Digest: UFnYU3r7D0HoFnktokFTaP/pPT4= Name: res/layout/color_fragment.xml SHA1-Digest: JbZaOBLv7+acnwkjCmd3xaK8LUc= Name: res/drawable/widget_unread_count_background.xml SHA1-Digest: Yy/nLAIfCf1bcX2jic2d+rlzGbw= Name: res/drawable-xxxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png SHA1-Digest: 3fhmc4V2nmgfmXePbvfRvhgIwJY= Name: res/drawable-v21/circle_touch_highlight_background.xml SHA1-Digest: o2UQBTWYlJ9QXTjKaXy9nlvVkd0= Name: res/layout-v21/recipient_preference_activity.xml SHA1-Digest: LAb6OqLhhlHIK//g73HVsj6zs1A= Name: res/drawable-mdpi-v19/switch_thumb_pressed_holo_light.9.png SHA1-Digest: CFRP5NlSZZOns7feha7lGxerPGg= Name: res/drawable-xxhdpi-v4/ic_video_dark.png SHA1-Digest: XtOnQnOLPbi3t0IrtZ85LaIyetg= Name: res/drawable-xxxhdpi-v4/icon.png SHA1-Digest: WtQHPcTXiUt+2Q8CVkBaKIpO47M= Name: res/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005 .png SHA1-Digest: vemTSSQdycMQQJlthk4udlWVCtA= Name: res/drawable-xxxhdpi-v4/ic_archive_white_48dp.png SHA1-Digest: dKISf3rbvALxLw+0EofvQox3t2s= Name: res/drawable/emoji_category_objects_dark.xml SHA1-Digest: kfXqnfoLc6+1LbnHmJXTPQ5ZSRM= Name: res/drawable-xxhdpi-v4/fab_shadow_mini.png SHA1-Digest: 50Pk6/PSs/mMVgqjsfxR1iLTd4I= Name: res/layout/conversation_item_received_audio.xml SHA1-Digest: rJfl43B7j5swgx4K6TQ86nw5hvk= Name: res/drawable-mdpi-v4/sent_bubble.9.png SHA1-Digest: oWvWoFrpRQdCV4lAcWNy0a6DydY= Name: res/drawable-xxhdpi-v4/ic_attach_white_24dp.png SHA1-Digest: sdTAMI30OBxgl8xmIxijVZVm7vU= Name: res/drawable/compose_background.xml SHA1-Digest: 77YF5OthBZArbShPc+i58Aql40g= Name: res/drawable-mdpi-v4/ic_content_copy_dark.png SHA1-Digest: prKV/2e2z+B34cHOsghLSPcAWIA= Name: res/layout/date_picker_view.xml SHA1-Digest: TswBiM1KZTeAkVH/lhpSjEaZsWs= Name: res/drawable-mdpi-v4/ic_emoji_recents_normal_dark.png SHA1-Digest: brmCWGpFBHeALX69UF3hDMOTJg4= Name: res/drawable-mdpi-v4/dialog_full_holo_dark.9.png SHA1-Digest: q3ptg6feoBdTrvEzjNt9NgzKcHM= Name: res/drawable-mdpi-v4/abc_ic_star_half_black_36dp.png SHA1-Digest: ZXAwjCRHDKMA1FtoZL8+AhM9yvI= Name: res/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_015.png SHA1-Digest: J3SGWA4N2NBzGxZuD1OYrO+kvSg= Name: res/drawable-mdpi-v4/divet_lower_right_dark.png SHA1-Digest: rq1MiOtAGeYqXA9AuuCSqoHYMpE= Name: res/drawable-xxhdpi-v4/ic_image_light.png SHA1-Digest: oe1zE4t4f6sTrfGOtL7BoqGWqBI= Name: res/menu/contact_selection.xml SHA1-Digest: O2r1ScXr8uDumtySR2i8JA4uR2M= Name: res/drawable-xhdpi-v4/ic_menu_search_holo_dark.png SHA1-Digest: bKDlYP7RsBc0UlbbwR/gqgFqq8w= Name: res/color/abc_tint_switch_thumb.xml SHA1-Digest: JY0G52hUE4OcvW5M6WzWjE/j1DM= Name: res/drawable-hdpi-v4/dialog_full_holo_dark.9.png SHA1-Digest: gYRi3qcewvv4DpgH7WRa5oontHM= Name: res/drawable-hdpi-v4/ic_backspace_disabled_light.png SHA1-Digest: I3l9fO+XlM3GMEc7mJi0gIh8HXc= Name: res/drawable-xxhdpi-v4/ic_reply.png SHA1-Digest: qG0hBkDSQm7dAysBPD1VzEHexIE= Name: res/drawable-hdpi-v4/ic_message_white.png SHA1-Digest: 4hH67nLDLSDpO/PkUE3B2tJ0VTo= Name: res/drawable-xxhdpi-v4/ic_send_insecure_white_24dp.png SHA1-Digest: UlsVGjyXvlutgo7jPc9VP3zCRN0= Name: res/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.pn g SHA1-Digest: 3qnimsnK10WL03+kpBN2qzg7V1Y= Name: res/layout-v17/abc_popup_menu_header_item_layout.xml SHA1-Digest: YsoJ5ydfgQxhRDOJEIiXUol6dJw= Name: res/layout-v17/notification_action.xml SHA1-Digest: LO/ceel3QXArZD+w3cRZ8aS+08I= Name: res/drawable/background_pane.9.png SHA1-Digest: DebSplvlRk4ibCyCE6fVr4Rye5w= Name: res/layout-v16/conversation_item_received.xml SHA1-Digest: J278vdGN8exGkzLY9BUHAFJ0fvo= Name: res/drawable-xhdpi-v4/ic_arrow_forward_light.png SHA1-Digest: 8B3KLzM+ZxxKUaz31Ub711ckJuE= Name: res/drawable/emoji_category_people_light.xml SHA1-Digest: +Bv974WbkFqfpxT9EBtPeHcRw20= Name: res/layout/notification_template_media_custom.xml SHA1-Digest: Rb07Oq0AWSU5fpwtGOsf+Y01S48= Name: res/drawable-xhdpi-v4/ic_forward_white_24dp.png SHA1-Digest: GqaeuX6n1vKxkKLK4mh1fr7Ut60= Name: res/drawable-xxhdpi-v4/ic_error_red_18dp.png SHA1-Digest: AGBDwVaOj112bQa4oENKtcShlzs= Name: res/drawable-xhdpi-v4/ic_message_black.png SHA1-Digest: 6352Bc/8+QYJrkmMMMsNvpKPjM8= Name: res/drawable-xxhdpi-v4/ic_keyboard_white_24dp.png SHA1-Digest: 9taTcawrGNSChnJvoiXAHzNR1T8= Name: res/drawable/emoji_category_recent_light.xml SHA1-Digest: 3r2NNEnmR57jtcSYEixH1j6WcLw= Name: res/drawable-xxhdpi-v4/ic_app_protection_gray.png SHA1-Digest: 2TVhdC+MvGJJXfzGaHhucghUJrc= Name: res/anim-v21/design_bottom_sheet_slide_in.xml SHA1-Digest: P5+oT0+JVe2tOF/nHLy58E5nCQg= Name: res/drawable-xhdpi-v4/list_selected_holo_light.9.png SHA1-Digest: U9jUfNg6H8NNFEsehvr9ue8J/zc= Name: res/drawable-xhdpi-v4/ic_send_insecure_white_24dp.png SHA1-Digest: JE4aO/E1KAIkIlzWL4s0wvVAf/M= Name: res/drawable-hdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png SHA1-Digest: Eh+ZTEk9nWC3r6F65kTTCqFuv/0= Name: res/drawable-xhdpi-v4/notification_bg_normal_pressed.9.png SHA1-Digest: oXhMxqCdTU9FU0k6ZW87SKaXIv4= Name: res/drawable-xxxhdpi-v4/ic_scroll_down.png SHA1-Digest: RDfbOziQ77bQwxk2APgk8L8KRz0= Name: res/drawable-xxxhdpi-v4/abc_text_select_handle_left_mtrl_light.p ng SHA1-Digest: LleVLIYRudbFAD34tHNTJEZxhXw= Name: res/drawable-mdpi-v4/ic_app_protection_black.png SHA1-Digest: 0zIOC4EHHt1nv71/50ASJr1ExAw= Name: res/drawable-xxhdpi-v4/ic_content_copy_light.png SHA1-Digest: Ikhdvy4kc7KWV6wQ6mAT8SEXCCk= Name: res/drawable-xxhdpi-v4/ic_error_white_18dp.png SHA1-Digest: +asFYpuUKal6m9VEZlRuBhyaQ4s= Name: res/layout/abc_screen_toolbar.xml SHA1-Digest: uU227asMSuWQIBX4+4P+jVpjaOA= Name: res/drawable-xxhdpi-v4/abc_ic_star_half_black_48dp.png SHA1-Digest: LOaqUgdDJCkzcFxWg8tmL0IBRoQ= Name: res/layout/database_upgrade_activity.xml SHA1-Digest: rixOXNhHj2qjtL8u7smjMKsXm4w= Name: res/drawable-v11/emoji_category_symbol_dark.xml SHA1-Digest: USyM6X1uv2WWZWGfnmw7E5d69KY= Name: res/drawable-mdpi-v4/ic_download_circle_fill_white_48dp.png SHA1-Digest: lwooWBeYZiU+VTxoZN/ghJZ2LtM= Name: res/drawable-xxxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: hlPg0mO16g5nYlkb2LmahKOZAG8= Name: res/drawable-xhdpi-v4/ic_select_all_white_24dp.png SHA1-Digest: R7TBs96lHI2rHtkBdpfJQj5XvqM= Name: res/drawable-xhdpi-v4/switch_bg_disabled_holo_light.9.png SHA1-Digest: R8GV7kb6QAwT3efgJTdnB9VOJAo= Name: res/layout/transfer_controls_view.xml SHA1-Digest: rGvBRBRjABRAHbISc9Klc2KXzkY= Name: res/drawable-xhdpi-v4/icon.png SHA1-Digest: ZX0Na7vYQj2M/TBdj+eQoSk7YR8= Name: res/drawable-mdpi-v4/sms_system_import_icon.png SHA1-Digest: 4FpxWz1BwQb5Kp2ZiRbEm2oyAKU= Name: res/drawable-xxhdpi-v4/abc_text_select_handle_left_mtrl_light.pn g SHA1-Digest: o3UnPa5xQWf+9sW1xzSf4Z35vmk= Name: res/anim/slide_from_right.xml SHA1-Digest: TfPszWadpReLtTNx99WycfoyUO4= Name: res/drawable-mdpi-v4/ic_emoji_places_normal_light.png SHA1-Digest: Z0VaVHOx9e28oBU4v9FfnuF5+qU= Name: res/drawable-xxhdpi-v4/switch_thumb_pressed_holo_light.9.png SHA1-Digest: E/oARIhpfJfx3+nGJCpSww+s2hs= Name: res/drawable-mdpi-v4/textfield_default_holo_light.9.png SHA1-Digest: HHVoeIoiPaZGrfV/J675mX9mKZE= Name: res/layout/design_layout_snackbar.xml SHA1-Digest: 8ybNZ/e1PZuEOTyEoWLg2z2iy5s= Name: res/drawable-v21/dialog_background.xml SHA1-Digest: DavJrkoaA6avP9NleoDSEf06dSc= Name: res/drawable-hdpi-v4/ic_menu_add_field_holo_light.png SHA1-Digest: ULfeQw0hAmEOAi1XJUliX5NzZMM= Name: res/drawable-xxhdpi-v4/ic_unlocked_white_24dp.png SHA1-Digest: OLI3oTlEzJinF3GuHri9mip1thU= Name: res/layout/reminder_header.xml SHA1-Digest: vcf19058p0wwcoK5BD/6Op4ZIM4= Name: res/drawable-mdpi-v4/ic_emoji_people_normal_light.png SHA1-Digest: SpLsdXeONmvVc2/mA0Q8tOGXOTw= Name: res/drawable-xxhdpi-v4/ic_image_dark.png SHA1-Digest: 5QWssaiS3uzxGdVkntaRBMH6wNI= Name: res/drawable-xhdpi-v4/ic_done_white_18dp.png SHA1-Digest: KBL2mzmCV7ECTCI1eGxjvKVjB2E= Name: res/drawable-xxhdpi-v4/list_longpressed_holo_light.9.png SHA1-Digest: CBiyFOEOkN4G8LwWwkREd/FYJhs= Name: res/drawable-hdpi-v4/notification_bg_low_normal.9.png SHA1-Digest: GqlxeUYi9nderviC+XwD6tRD5Kg= Name: res/drawable-xhdpi-v4/ic_download_circle_fill_white_48dp.png SHA1-Digest: qyfgqeIjZuk6EpczzzExcGu6zD0= Name: res/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_015.png SHA1-Digest: ehXR0id2qmpKXDOMM66scpMAeFg= Name: res/drawable/abc_list_selector_background_transition_holo_light. xml SHA1-Digest: GmT6IMAyeHMrj3HfwELKNXx7GjY= Name: res/drawable-xhdpi-v4/ic_arrow_forward_dark.png SHA1-Digest: n/kEo/gBinlbUxHmmkL7EXndGK4= Name: res/layout/recurrencepicker_freq_item.xml SHA1-Digest: EvbG/hd0LGdj3UPmFOorUS5ig+c= Name: res/drawable-xhdpi-v4/notification_bg_low_normal.9.png SHA1-Digest: skfmh8AKXvj2Y90RQYRWGn6cYvs= Name: res/drawable-mdpi-v4/abc_text_select_handle_left_mtrl_dark.png SHA1-Digest: +hxtgSGCnF5TH+4LvSwYRLnVzDw= Name: res/drawable-hdpi-v4/ic_content_copy_dark.png SHA1-Digest: T3QObin9mzq6kKqgsPOkyG3imgc= Name: res/layout-v17/notification_template_big_media_narrow.xml SHA1-Digest: kD4TuSCXVYPjwJvXlcG7T13k38Q= Name: res/drawable-mdpi-v4/ic_volume_up_dark.png SHA1-Digest: AbY5CujgEDn/CHHf3fPQ/zzzWGQ= Name: res/drawable-mdpi-v4/ic_volume_off_white_18dp.png SHA1-Digest: /Gl91aCUE+H597QunvAYC+8mTOo= Name: res/drawable-xhdpi-v4/ic_audio_dark.png SHA1-Digest: KCG8HUU7Z5VlICyAaXx6vDcy+RI= Name: res/color/abc_primary_text_material_dark.xml SHA1-Digest: t7dOMP7ur0YJrU60kQgbx1E/KP0= Name: res/drawable-hdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png SHA1-Digest: QT06M8jIu5PbB6orRZr5qtxv3oI= Name: res/layout/notification_template_media.xml SHA1-Digest: APsr5r93KLHuij35wf2E5vipLT0= Name: res/drawable-xhdpi-v4/list_focused_holo.9.png SHA1-Digest: OMRGZ9NZcF46RZNFPM1PA5UDfDk= Name: res/drawable-xhdpi-v4/ic_emoji_places_normal_dark.png SHA1-Digest: NkFXJ9PnewoPQmwyaxvViVST/Zg= Name: res/drawable-hdpi-v4/list_selector_background_selected.9.png SHA1-Digest: hwr6dZUS/iDuJ78l2mF0/dfJL+8= Name: res/drawable-hdpi-v4/ic_call_split_white_24dp.png SHA1-Digest: aDXhmmrFzHZqOyCGYZVWSG61/AI= Name: res/drawable-xxhdpi-v4/transfer_controls_background.9.png SHA1-Digest: j7LzaIHFeP182GCKU70DBB8X2+Q= Name: res/layout-v13/select_dialog_singlechoice_material.xml SHA1-Digest: msQSXB79DdKW3CGw6eCSN11yWMo= Name: res/layout-v17/notification_template_custom_big.xml SHA1-Digest: Z0vGiLZztPzEw8qLt43/XBk8KBQ= Name: res/drawable-hdpi-v4/abc_text_select_handle_middle_mtrl_light.pn g SHA1-Digest: w8Uc/kI2V1M3yMQqT3OQtJzclbo= Name: res/drawable/conversation_item_sent_indicator_text_shape_dark.xm l SHA1-Digest: ni1zsLQFwrR7vllFnS41NOG8hXI= Name: res/drawable-xxhdpi-v4/abc_ic_star_half_black_36dp.png SHA1-Digest: /qTnweOfRMZPcyM1eqEsdwUZTD4= Name: res/color/abc_tint_switch_track.xml SHA1-Digest: G+p1U+cLARvJsg+xCLdCCItwTlU= Name: res/drawable-xxxhdpi-v4/ic_send_insecure_white_24dp.png SHA1-Digest: IGX4QelGg0sG9EmeHNme4rw9h0U= Name: res/drawable-mdpi-v4/telephone.png SHA1-Digest: DvkA3yTuKRtejM5DM72hMvzdg8g= Name: res/drawable-mdpi-v4/ic_save_all_white_24dp.png SHA1-Digest: LvVW7F2kcUdf2bMZgGOhWD+M6jk= Name: res/layout-v21/notification_action.xml SHA1-Digest: jtD5IGq/mY1IwmkPG/EiEhVS9Zw= Name: res/drawable/navigation_empty_icon.xml SHA1-Digest: oj14w4XpXH1NupwME3lJQMfohLM= Name: res/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png SHA1-Digest: pekxWTKwrzIagiU2Ssj+otR4tkc= Name: res/drawable-xhdpi-v4/ic_emoji_recents_activated_dark.png SHA1-Digest: ZKrYvfOfQEtUyhAgWxp/Qvlw9RY= Name: res/drawable-xxhdpi-v4/sent_bubble.9.png SHA1-Digest: KdAs5emUzdEgIGy2K1/+aDjasdE= Name: res/drawable/switch_track_holo_light.xml SHA1-Digest: ehEfLsAvoiTHBcWoc6LkpZu3AJs= Name: res/drawable-xxhdpi-v4/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: MMbSz4/uGhdnvziZg4e9XLvFodM= Name: res/drawable-hdpi-v4/ic_emoji_emoticons_normal_light.png SHA1-Digest: gY6ENGDAhIy/TJ7GuavgvuEIcmw= Name: res/drawable-xhdpi-v4/abc_ic_menu_share_mtrl_alpha.png SHA1-Digest: yapGdXFczOwfYLF7DNP0aaN/cJs= Name: res/drawable-mdpi-v11/icon_cached.png SHA1-Digest: WSol70AKPymO+ekZisb8wkIhroQ= Name: res/layout/abc_activity_chooser_view.xml SHA1-Digest: d11uhgWLGQufvde+7eDb56ysfKU= Name: res/drawable-xxhdpi-v4/ic_menu_search_holo_light.png SHA1-Digest: VJwbHZDpQuhmErJr0dA/acV913k= Name: res/menu/key_scanning.xml SHA1-Digest: VWVXWVDoPEKSUkvxwbRUcxZB6k4= Name: res/layout-v16/conversation_item_sent.xml SHA1-Digest: /yCrsUvoHLTrGjMYrs4hf6pFT9U= Name: res/drawable-hdpi-v4/ic_emoji_nature_normal_dark.png SHA1-Digest: aupznj5AeeBq4ZgMoj3awvKGjnE= Name: res/drawable-xhdpi-v4/ic_mood_white_24dp.png SHA1-Digest: +bjHZR3nwnfhNnrDuHzsHRYSt48= Name: res/layout-v17/notification_template_big_media_custom.xml SHA1-Digest: Z9irvX+ZFO9iWrgVgqV7AnLQ/Cs= Name: res/layout/media_view_remove_button.xml SHA1-Digest: 7BYliZmJN68yTXwLqRUR7Zh1sfc= Name: res/drawable/conversation_attachment_close_circle.xml SHA1-Digest: g1HIrRmL54DnYsdzyXEclQwlGcU= Name: res/drawable-hdpi-v4/ic_push_gray.png SHA1-Digest: qwDOd8MkzJg2NE2FSkvFji0695U= Name: res/animator/bottom_pause_to_play_animation.xml SHA1-Digest: sGztQN6FsfBHdy/lArM6hyYwIhI= Name: res/drawable-xhdpi-v4/ic_emoji_emoticons_normal_light.png SHA1-Digest: EE2p4bcPFBUfjL3C5+qfXjNxc7A= Name: res/drawable-xxhdpi-v4/switch_bg_focused_holo_light.9.png SHA1-Digest: 8Bdi9UbmuTXrnFgMObpGUILEjXw= Name: res/layout/empty2.xml SHA1-Digest: IM3rg1Lz0mEteG8vDVjHrpIkzV0= Name: res/layout/design_menu_item_action_area.xml SHA1-Digest: MAjBXF+TiqbN8ABwvCY22FbLaDM= Name: res/drawable-v11/emoji_category_symbol_light.xml SHA1-Digest: PlLwcnhZX3fatUFRaaqTl4EKUVg= Name: res/layout-land/calendar_date_picker_dialog.xml SHA1-Digest: 4DDhwL/zYY0LD3vXbx63CiJbBR0= Name: res/color/abc_tint_spinner.xml SHA1-Digest: SJW1ArIZ5Gg0BZUUA+p5I1sV0wI= Name: res/drawable/ic_backspace_dark.xml SHA1-Digest: vF9FMkPaMolfqCsJb/Sfv+5SBJI= Name: res/color-v23/abc_tint_btn_checkable.xml SHA1-Digest: pL2E8PJwKlEZNBwJnEzAGOdaOus= Name: res/layout/keyboard_right_drawable_with_header.xml SHA1-Digest: 7YBuE+1NgS1CgWLvx/MgT2aRKbE= Name: AndroidManifest.xml SHA1-Digest: 7IBTP9znBQHFa28nWpjw8Tg2/2k= Name: res/drawable-xxxhdpi-v4/ic_reply_white_36dp.png SHA1-Digest: pAb2FT+NmH4VNJzIqRY5ynzHWN0= Name: res/drawable-v21/avd_show_password_2.xml SHA1-Digest: k8oF40K3UGPcSOYDsDn3XpL7WFg= Name: res/drawable-hdpi-v9/icon_notification.png SHA1-Digest: gxWj9G+mn7RrswOMWTx3KqDlWz0= Name: res/drawable-xhdpi-v4/sent_bubble.9.png SHA1-Digest: PpPeKJZDE+OFnELluMlghGwM1wY= Name: res/drawable-mdpi-v4/list_selector_background_selected.9.png SHA1-Digest: KwBrnNhffw2ctqQgbBLetHzxQ0I= Name: res/layout/fragment_submit_log.xml SHA1-Digest: iko4zsMoqVEyStIpA6x8AQRs7tI= Name: res/drawable-mdpi-v4/ic_lock_white_24dp.png SHA1-Digest: eM6/Ca/CtwmeqtigzFQg6yeNSEg= Name: res/drawable-xhdpi-v4/textfield_disabled_holo_light.9.png SHA1-Digest: u+PyBkFnG5V7GBXX1PAbySEqGP4= Name: res/drawable-mdpi-v4/ic_push_gray.png SHA1-Digest: lX66OZiM5UocV2fv6a5Q/8CvPKM= Name: res/color/abc_tint_default.xml SHA1-Digest: 5NWuzpmorAh0/ov9AByYREIg4bQ= Name: lib/mips/libcurve25519.so SHA1-Digest: qgVowzBaSoaP+GSRhbrA1rjE2/4= Name: res/drawable-xxhdpi-v4/ic_create_white_24dp.png SHA1-Digest: RfhPAykdREtk24rWpt7Y6cFPPpk= Name: res/drawable/pause_to_play_animation.xml SHA1-Digest: MUwc2Q15c93uaEn9kkkP6yGi8Bc= Name: res/drawable-hdpi-v4/ic_attach_white_24dp.png SHA1-Digest: C8fybOOfDGXaxzaXgPOLB+33VWI= Name: res/drawable-mdpi-v4/ic_emoji_recents_normal_light.png SHA1-Digest: mtWkcSTn40XORuPT7JitlWcEluc= Name: res/drawable/touch_highlight_background.xml SHA1-Digest: E0nAyvgGtm+X7Zl4fIL9bsCc4cQ= Name: res/drawable-xhdpi-v4/ic_play_circle_fill_white_48dp.png SHA1-Digest: M8uau5BNu20fQGSY7qcQ6f8T17E= Name: res/layout-v11/notification_media_action.xml SHA1-Digest: CkAaakbqf4jYotOJaDjwZg8NsTg= Name: res/drawable-xhdpi-v4/ic_warning_light.png SHA1-Digest: 8nDKrfBm2tFrJzuMJ5Ua3GTWWbc= Name: res/drawable-v21/avd_show_password_3.xml SHA1-Digest: gt7hpVcp4EkVi9E+Ha+CR1YLEnY= Name: res/drawable-xxhdpi-v4/ic_forum_grey_32dp.png SHA1-Digest: fsT+RhZObPOxX4RoQaZY9402+sU= Name: res/animator-v11/rotate_90_animation.xml SHA1-Digest: YzPrKibA72xHWsJAnRDFda8WNqk= Name: res/drawable-xhdpi-v4/received_bubble.9.png SHA1-Digest: +GeQlo7tx1PQjC4nJMfJ9I7o6aM= Name: res/drawable-xxhdpi-v4/divet_lower_right_dark.png SHA1-Digest: QyXT0s0vW9257dECSdKBbJbJcrg= Name: res/drawable-hdpi-v4/ic_send_secure_white_24dp.png SHA1-Digest: WI/kUnDCawLuobN/tMTdZhznmds= Name: res/drawable-xhdpi-v4/design_ic_visibility.png SHA1-Digest: llhGqQb01dAZAjbBny5AcnTOn2o= Name: res/drawable-v21/conversation_list_item_unread_background.xml SHA1-Digest: XqYYWhECxEj/NQRflZTLiYgaWFM= Name: res/drawable-xxhdpi-v4/ic_emoji_nature_activated_dark.png SHA1-Digest: 44rlgeG5FLzt6DnaIIL6ABJA94E= Name: res/drawable-xhdpi-v11/icon_cached.png SHA1-Digest: xv4C/SPdVPz1BqbexmssO5m5wpQ= Name: res/drawable-mdpi-v4/ic_emoji_flags_normal_dark.png SHA1-Digest: Qj/u3uhxRZP+VK/+Z5TGEFvOtNI= Name: res/drawable-xxhdpi-v4/abc_text_select_handle_left_mtrl_dark.png SHA1-Digest: lqY9vuhB2Y6PNyO4cqhGHU3U5oE= Name: res/drawable-sw600dp-xhdpi-v13/ic_backspace_disabled_light.png SHA1-Digest: ZTUs4+rwQCv1lnyeFEIZ/LTtTTs= Name: res/layout-v13/database_migration_activity.xml SHA1-Digest: 4Lu3OMDcNHESEO7q+5+vklOmAdA= Name: res/drawable-xxhdpi-v4/ic_movie_creation_light.png SHA1-Digest: 3avYuy1gUqsBtTYWwcQ3xX8TVwo= Name: res/drawable-hdpi-v4/ic_add_white_24dp.png SHA1-Digest: KRHgaTCip00LKkZBaj+tRNRBxB8= Name: res/drawable-hdpi-v4/fab_shadow.png SHA1-Digest: urxZbfLe/2Yp+efwbm06EByfg+w= Name: res/drawable-v21/conversation_list_item_unread_background_dark.x ml SHA1-Digest: kQWRKKADhTzqqod8HS4VFglnQwY= Name: res/drawable-mdpi-v4/ic_info_outline_light.png SHA1-Digest: bSpfJGIqffZUzhrm2KQAq5PWZcA= Name: res/layout-sw600dp-v13/three_keys_view_right_drawable.xml SHA1-Digest: 3UxQ1CMcy/Awo8H7BsWSzYjz0SU= Name: res/drawable-xhdpi-v4/ic_brightness_6_gray.png SHA1-Digest: a1pVZU6D2cQlaEWgopesbgagP4E= Name: res/drawable-xhdpi-v4/abc_text_select_handle_left_mtrl_light.png SHA1-Digest: NMyg1BB4Pz2cvQ21qDTnVO4XKPg= Name: res/drawable-v21/design_password_eye.xml SHA1-Digest: 0z5lKVTTsmwzIox9AxI2XZDgt/4= Name: res/drawable-v11/emoji_category_nature_light.xml SHA1-Digest: 3jnMU7AWp91TmpOTVd8QqDytHZ4= Name: res/anim/slide_to_top.xml SHA1-Digest: 45OutUfVJ6qV4vsLcKjIbCltGPU= Name: res/drawable-xhdpi-v4/ic_emoji_emoticons_activated_light.png SHA1-Digest: ffAuA0TCS0VuJhIviwBP10B8vtE= Name: res/drawable-xhdpi-v4/ic_delivery_delivered_dark.png SHA1-Digest: iMwTCPyaIeLrnuVsWQzH41T2DXs= Name: res/drawable-xxhdpi-v4/abc_list_divider_mtrl_alpha.9.png SHA1-Digest: L4kldLqb9NR6DgoipZDWi2jQHbs= Name: assets/fonts/Roboto-Light.ttf SHA1-Digest: z9omPT1JG8UmPzMe032DUuqIgHc= Name: res/drawable-xxxhdpi-v4/ic_play_circle_fill_white_48dp.png SHA1-Digest: xsX3CduYe2M6cFiULGgZrtFGYa0= Name: res/drawable-xxhdpi-v4/ic_save_all_white_24dp.png SHA1-Digest: Ga5H2uBqKDBhxYd6qVNd9xicD0g= Name: res/layout/abc_alert_dialog_title_material.xml SHA1-Digest: JrY9ZYOkd6vkSu9aWGp4FObinoQ= Name: res/drawable-mdpi-v4/abc_scrubber_track_mtrl_alpha.9.png SHA1-Digest: fCw4/3GZJ6HvBRrlhVpfPdRbS48= Name: res/layout/import_export_fragment.xml SHA1-Digest: iyi5Y1njPnk/hKgkJrKdN/85UWM= Name: res/drawable/spinner_background_holo_light.xml SHA1-Digest: xCke46CrQrXfmojAbPIr4ODOHcc= Name: res/drawable-xhdpi-v4/fab_shadow_mini.png SHA1-Digest: a/sbG72ElizD4BCcegQYSqBmP4k= Name: res/drawable-xxhdpi-v4/abc_ic_star_black_36dp.png SHA1-Digest: 4JsTvfBdbaRSqVTy3mD7njRhb4s= Name: res/drawable-hdpi-v4/ic_missing_thumbnail_picture.png SHA1-Digest: NsUwvvdHHjfhLcuy5Cju9pM7uqQ= Name: res/layout-v17/abc_search_view.xml SHA1-Digest: h0EM0StoVFk6mqeuOaQFwX3xq4k= Name: res/drawable-mdpi-v4/ic_emoji_objects_activated_light.png SHA1-Digest: l0NabfIDi6pqTPGty4K97JYQjyw= Name: res/drawable/conversation_list_item_unread_background.xml SHA1-Digest: AsA+NB0zaiiLbn83PXUIuNRXFY0= Name: res/drawable-hdpi-v4/abc_textfield_search_default_mtrl_alpha.9.p ng SHA1-Digest: VtmcSWaUIf6+DhHt/mnXkgUFXH4= Name: res/xml/badge_widget_provider.xml SHA1-Digest: LsJqn1nWU4h8RLWEzbA/V6EicCo= Name: res/drawable-ldrtl-xxxhdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.pn g SHA1-Digest: ku1x+FSTuug9J98a2Pyp41uY6hU= Name: res/drawable-xxhdpi-v4/ic_badge_24dp.png SHA1-Digest: JBOTu5IsmntHowwu9e/zjoaWCHw= Name: res/drawable-mdpi-v4/ic_play_circle_fill_white_48dp.png SHA1-Digest: /uRMGGxF+sOCAzRp9uChhsJB1XA= Name: res/drawable-mdpi-v4/ic_emoji_symbols_activated_light.png SHA1-Digest: Tf66Xu0ryQTG7WWGNuG6b1rhzSo= Name: res/drawable-mdpi-v4/ic_backspace_normal_dark.png SHA1-Digest: xrvbueJnGuy7cXpAwlPELU6TQbw= Name: res/layout/design_bottom_navigation_item.xml SHA1-Digest: KApZ/A8qcI7DERPlgu57owrb24Y= Name: res/drawable-mdpi-v4/abc_text_select_handle_left_mtrl_light.png SHA1-Digest: jEtv5fNe5zMTwAdDEwTqqcIg9Bo= Name: res/drawable-xhdpi-v4/ic_check_normal_dark.png SHA1-Digest: id0GOEomTYZmQove2BYkq+Aaxu4= Name: res/layout/radial_time_picker_dialog.xml SHA1-Digest: VWueYQ9Pg7GzwSaRPzMr//4qhS4= Name: res/xml/preferences_chats.xml SHA1-Digest: ubYPAyIXyng1+PL91/YsEpd4yZQ= Name: res/drawable-xhdpi-v4/ic_menu_add_field_holo_light.png SHA1-Digest: 4qhWi7dfFyiswnx3DLEcu2LjxKY= Name: res/drawable/background_pattern.png SHA1-Digest: jf+Ousfom0Sy7n4UojJP8Tl+1Q8= Name: res/layout/abc_popup_menu_item_layout.xml SHA1-Digest: e/3HrZPNigFwLM6o71EyUba5qdU= Name: res/drawable-hdpi-v4/ic_download_circle_fill_white_48dp.png SHA1-Digest: XJ3foMGdZHO9k/ogu3qCjm0T4kQ= Name: res/layout/hms_picker_view.xml SHA1-Digest: Bfabx6v4Ye7Z8+y+MxNXjZjy4gQ= Name: res/drawable-mdpi-v4/ic_emoji_people_normal_dark.png SHA1-Digest: 550x1oOfcFdLIWXiKicI8Q9koPg= Name: res/drawable-mdpi-v4/ic_account_box_light.png SHA1-Digest: 63xcUi3qw7O4z7lBPDQ2lyQ2it8= Name: res/layout/media_overview_activity.xml SHA1-Digest: DE0hCTjpLY24k2I3p8pVHPsCJhY= Name: res/drawable-hdpi-v4/ic_save_all_white_24dp.png SHA1-Digest: rs/B/BxQ/hdXkBjmqTq0OYriDRk= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_84 SHA1-Digest: RXg8ZCyGT2W/pQDo6jOOCucmFYE= Name: res/drawable-hdpi-v4/design_ic_visibility.png SHA1-Digest: /v0kpQ1j5mTM2XhSiofpFxtnVB0= Name: res/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_015.png SHA1-Digest: nmJdfiNISdfmbhXzZPqmMVghsi8= Name: res/layout-v16/verify_identity_activity.xml SHA1-Digest: 1Vo8qWyzSua09sH8qcQKGAbGSLc= Name: res/drawable-xhdpi-v4/switch_thumb_pressed_holo_light.9.png SHA1-Digest: VTcVro7tRSB7dCiFLkcjEK1gte8= Name: res/drawable-xhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png SHA1-Digest: n3rquhXmVYjYpHMG9RG+SAJc+rA= Name: res/drawable-ldrtl-xxxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: IiQ92KKKcRVz1q2BpPfR0GMDdtA= Name: res/drawable/notification_bg.xml SHA1-Digest: inV7SLogUBJZh+fioqpUMrGI5ys= Name: res/drawable-mdpi-v4/ic_message_black.png SHA1-Digest: XONTB0EheJN6Y0Tk/oZV9xuMrgE= Name: res/drawable-hdpi-v4/abc_ic_star_black_16dp.png SHA1-Digest: x902XiMoneAAmor81DbeuuMoYo8= Name: res/drawable-hdpi-v4/abc_textfield_default_mtrl_alpha.9.png SHA1-Digest: Rmk8UREagQdf47LncSS6fq9RbAo= Name: res/drawable/abc_ic_arrow_drop_right_black_24dp.xml SHA1-Digest: 0ovJ6X1/yGYcWSv7KAif8aiFzgo= Name: res/drawable-xxhdpi-v4/ic_refresh_white_18dp.png SHA1-Digest: eyBOpIskeHEHN+nVbRODD11snoc= Name: res/layout/design_layout_tab_text.xml SHA1-Digest: SIz1wfljARNQwBdK8NWsBSfi3dc= Name: res/color/design_tint_password_toggle.xml SHA1-Digest: nbryhDBq0BMU8ljp7cpVWU+9ZFo= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_81 SHA1-Digest: A1I5nxwmM7Cjx2rfURezn1a/kIM= Name: res/color/design_error.xml SHA1-Digest: VN6gMqWm3MTl2CIOHZrGVo8LQEQ= Name: res/layout-v21/conversation_fragment.xml SHA1-Digest: 6J/DzJSUjJEKzW0Jg/5fEMwTq34= Name: res/drawable-mdpi-v4/ic_keyboard_white_24dp.png SHA1-Digest: C6WoVhStJ78OHjddSQ1hiVKfzlI= Name: res/drawable/last_seen_divider_text_background_light.xml SHA1-Digest: Ul0NPZmH9ZneiNyrb/06iwknEHY= Name: res/drawable-xxxhdpi-v4/fab_shadow_mini.png SHA1-Digest: z0yIZFkPA9uo98ME+c7hYQWjXMI= Name: res/drawable-xxxhdpi-v4/ic_arrow_forward_white_24dp.png SHA1-Digest: 2M3A5LhILbVRYwellmh5yDtMgXs= Name: res/drawable-mdpi-v4/textfield_focused_holo_light.9.png SHA1-Digest: HZ9iQgcyhTz2F7RRfnq0smD0pLo= Name: res/drawable-ldrtl-mdpi-v17/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: nXZ4V1mFaOHaCmrZgjirnAh+5fg= Name: res/color-v11/abc_hint_foreground_material_light.xml SHA1-Digest: IFfq6CDFKWH4V76zx2clnsqSalw= Name: res/drawable-xhdpi-v4/abc_text_select_handle_middle_mtrl_dark.pn g SHA1-Digest: yfAguILD5aQrWq/KdWarpxXTKb0= Name: res/color-v23/abc_btn_colored_borderless_text_material.xml SHA1-Digest: DmroyQoPzNOJOorwtew2WEsQr08= Name: res/drawable-hdpi-v4/fab_shadow_mini.png SHA1-Digest: ulgb8PFS0FBM+8t64mYseonic74= Name: res/drawable/emoji_category_objects_light.xml SHA1-Digest: WKttpPtRpX6qMo4nYwqVlC6+RlI= Name: res/layout/emoji_drawer.xml SHA1-Digest: QD7D8QJ4kauvhmEPLmXleoEU/zY= Name: res/drawable-xxhdpi-v4/ic_menu_remove_holo_light.png SHA1-Digest: Hf0tLw73DTiA5ARoJff4Mu2sRkg= Name: res/color/abc_search_url_text.xml SHA1-Digest: mgOeEFdKIOmQBIiUEKXZ+y4FBn8= Name: res/layout-land/radial_time_picker_dialog.xml SHA1-Digest: ermst0JTCZ8NcgoQK6T2MUfpcLM= Name: res/layout/calendar_date_picker_dialog.xml SHA1-Digest: JW7fq1c9kaT0wG58A+Gnb6MzRkU= Name: res/drawable-mdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png SHA1-Digest: eF/LuENYUMfZZS3fHrJi1byAVZU= Name: res/drawable-xxxhdpi-v4/ic_unarchive_white_36dp.png SHA1-Digest: x1jt5NVel5ImQ6leOJH2slbEXiU= Name: res/drawable-v11/edit_text_holo_light.xml SHA1-Digest: c7kQ51Lq+a7ZnX0hxv4Ar/AGXBA= Name: res/drawable-mdpi-v4/ic_video_light.png SHA1-Digest: dnsYkAg2UoYNYsMuC472jETNYiM= Name: res/drawable-mdpi-v4/ic_info_outline_dark.png SHA1-Digest: Z6+bkPmQKJPQiU3cmT9sz/TqIb4= Name: res/drawable-mdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png SHA1-Digest: nuld1RomiGBKqE5EsGnC+AbnNZ4= Name: res/drawable/dialog_background.xml SHA1-Digest: IcoPMLhS51+d0m1LQoLCmVU7jlo= Name: res/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png SHA1-Digest: 6jnEZnvF6Wf/iso9scq8BExu9D4= Name: res/color/abc_secondary_text_material_dark.xml SHA1-Digest: VOKwFxcyYLgm73Ve4W6WEInTWec= Name: res/drawable-hdpi-v4/ic_notifications_gray.png SHA1-Digest: F9T+s5F1UrZYIGRUeHMHI6P868s= Name: res/layout-v17/notification_template_lines_media.xml SHA1-Digest: 4NVmpeYrD66piDRF9hNgynINL+U= Name: res/drawable-xxhdpi-v4/ic_contact_picture.png SHA1-Digest: nc4ws16xOfkKzFG5l8XN7Dgae8M= Name: res/layout/design_navigation_menu.xml SHA1-Digest: ukHjw6xaRQ5PkWljLcrkNy7Zn58= Name: res/layout-v17/abc_popup_menu_item_layout.xml SHA1-Digest: rGUyJKgrpE0AI0G5Po2rWnZpOsI= Name: res/drawable-xhdpi-v4/abc_ic_star_half_black_36dp.png SHA1-Digest: jz/B6EDUP81CMkk6OyDhBLizPLY= Name: res/drawable-hdpi-v4/ic_send_white_24dp.png SHA1-Digest: miDa5p2kSfS26Ry3tkIO1JFi/6E= Name: res/drawable-hdpi-v4/ic_done_white_18dp.png SHA1-Digest: jVtoFesoojMic3mQ3HzsqLUMirk= Name: res/menu/conversation_list_batch_archive.xml SHA1-Digest: /sRRtPJlCyQnM51wHqCoRmIZAek= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_94 SHA1-Digest: W0CSkKs60WzDI0QUZ1mhx6CmIPI= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_95 SHA1-Digest: owiIKf9pjSZoNZMs63sucQc8p64= Name: res/layout/share_intent_row.xml SHA1-Digest: /qI4T5Xw817feCxvMolDV866zmY= Name: res/xml/preferences_notifications.xml SHA1-Digest: S0e/C8cCZslhZLxwy30EYr5l5D8= Name: res/drawable/notification_icon_background.xml SHA1-Digest: W3i7jt5Pavj518bWIUVG8PRBQ3I= Name: res/drawable-xhdpi-v4/switch_bg_focused_holo_light.9.png SHA1-Digest: OIa2+0APqiitnkIjp1qmRxaODoE= Name: res/drawable-xxhdpi-v4/ic_info_outline_light.png SHA1-Digest: RWrz7w+g7OnrbVMf3wNJnVcQZLc= Name: res/layout/prompt_passphrase_activity.xml SHA1-Digest: 6FiLZ+pqHKv0TwZE6SftRX0zT3g= Name: res/drawable/button_background_light.xml SHA1-Digest: 6V7KWIGPftLpVqdHModNEVbbYEA= Name: res/drawable-v11/emoji_category_flags_dark.xml SHA1-Digest: Ea7jGoDtsl9tk/MSigQEQHYAAFc= Name: res/drawable-xhdpi-v4/alert.png SHA1-Digest: VnyUO6MNfl9DN4ulAmyGzyZzrUg= Name: res/layout-v16/calendar_date_picker_header_view.xml SHA1-Digest: 4E+gsH/vmjzH9Fb9y+N9/fy7FqI= Name: res/layout/contact_selection_activity.xml SHA1-Digest: BoBPqDIoK6TIyiddmkBzZzh2PaE= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_91 SHA1-Digest: 4FrcOuE406a6sLJ2iX+nQ0towuo= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_90 SHA1-Digest: xmD9UZpmrXmHXGBwgKcnUgG3prY= Name: res/drawable-xxhdpi-v4/ic_message_gray.png SHA1-Digest: FM0SgppOLNYekXyH7s7y65qy0Eg= Name: res/menu/conversation_list.xml SHA1-Digest: paS/IQBsFMNRIIpyauMfigaYuVc= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_49 SHA1-Digest: 5u8Emu23ipjQSHPDBp+rNN5gLes= Name: res/drawable-mdpi-v4/ic_save_white_24dp.png SHA1-Digest: CTvZxHcXz4WQcVzU5MgcNzoWhrw= Name: res/drawable/compose_divider_background.xml SHA1-Digest: TaNBJJg7z7cx4qEtNifzBNqTRCo= Name: res/drawable-xxhdpi-v4/ic_action_warning_red.png SHA1-Digest: DiY5Iib3+U2SZmokiRxU9aII0oA= Name: res/drawable-mdpi-v4/textfield_disabled_holo_light.9.png SHA1-Digest: y0PPuveb+rmvZE0XoVdCwXnL0Yk= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_44 SHA1-Digest: TVnQ8NXIFuFz2qYs35e/XIiGJek= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_43 SHA1-Digest: YwmvuPrm5iistAma7bavl8QEvkw= Name: res/drawable/ic_check_light.xml SHA1-Digest: tct7jdk7izG4C835TjRCIr7EVOA= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_39 SHA1-Digest: GwstlZcw4BzlZVzFB96jvV7cCZU= Name: res/drawable-hdpi-v4/ic_menu_search_holo_dark.png SHA1-Digest: cpjUnuXseXeegZHwQG7JZa8HqaU= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_36 SHA1-Digest: Q6P0BgyIFO14RidwktMDzIKtUAc= Name: res/drawable-xxhdpi-v4/ic_emoji_symbols_activated_light.png SHA1-Digest: lMC9QAxWQz9KeWUC0xEBc5pKXBo= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_31 SHA1-Digest: r/DBDrMghpy33Q11YD6SwLXaCCg= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_30 SHA1-Digest: zX3yz7FhjbZayv9D47R7u97JH+E= Name: res/drawable-xhdpi-v4/ic_volume_up_light.png SHA1-Digest: Ml/mEuVtsf/hO3+boEno2nw5ldk= Name: res/drawable-xxxhdpi-v4/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: HYDPd61Ck9Ifum3cvWl+fOfD9xk= Name: res/drawable/notification_bg_low.xml SHA1-Digest: 22SYjMhzjkMiHHELUtuy6uYI0EU= Name: res/drawable-xhdpi-v4/ic_visibility_grey600_24dp.png SHA1-Digest: rsZYHEAucgs+0D7w1hJFv4VVIYY= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_34 SHA1-Digest: QJCaGbU/lFnE77x7YIoqtsjah/M= Name: res/drawable-xxhdpi-v4/icon_cached.png SHA1-Digest: ADOq8ZSSoqUxZumCMwIwLAiXaX4= Name: res/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_000.png SHA1-Digest: Syjf1WOGXYnoSy9XVDy49z2PpVc= Name: res/drawable-mdpi-v4/ic_brightness_6_black.png SHA1-Digest: NDjKISb8k2SICUl/bOuTxMEgAqU= Name: res/drawable/design_fab_background.xml SHA1-Digest: RnDZ4YODuNg44An4VRSM13iDsgI= Name: res/drawable-xxhdpi-v4/ic_account_box_light.png SHA1-Digest: /N6llAIhrlw2YQNIxiJp4CDO1vI= Name: res/drawable-hdpi-v4/ic_delete_black.png SHA1-Digest: WPk50dgPU79B3wWF/bHdMDoXiBI= Name: res/layout-sw600dp-v13/three_keys_view_text.xml SHA1-Digest: HcqqebIe5IczAB9EHSyWkzSizhY= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_66 SHA1-Digest: sAk8V+6UnOy3rXvWnM6/28B9JCM= Name: res/animator-v11/upper_pause_to_play_animation.xml SHA1-Digest: 63IcO2AyaIcRtq5+lM6ichKDMzc= Name: res/drawable-xxhdpi-v4/ic_select_all_white_24dp.png SHA1-Digest: 0nwBYEUkMnH0RBueAHaPuj2qxqc= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_62 SHA1-Digest: 1Noowsqek546G7Ohzzvb11nDfDo= Name: res/drawable-hdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png SHA1-Digest: hFfrmpffeUhFY9P1rmOGIFG2AzQ= Name: res/drawable-hdpi-v4/ic_dialpad_white_24dp.png SHA1-Digest: 7vQAxqeBS9GbalGsUuIHf9/zcbs= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_61 SHA1-Digest: y6DIvaz5WnaAn2TRzoK2bvfLQ7o= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_63 SHA1-Digest: z55xt2Ayw/sf1cZS1n7htuZln00= Name: res/drawable-hdpi-v4/ic_recurrence_bubble_outline.png SHA1-Digest: f9uw5y2KnxQNrG1es6CoBFBqBHs= Name: res/drawable-mdpi-v4/icon_lock.png SHA1-Digest: WteLaSMqiN9bmBnpeXU1mwSa3fI= Name: res/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png SHA1-Digest: Lr8CV2APFenrT2CnF18DHzPxPmc= Name: res/layout-v17/abc_alert_dialog_button_bar_material.xml SHA1-Digest: u9IMbu9+yIpomdhnGc9HxebDDZ4= Name: res/drawable-xhdpi-v4/abc_list_selector_disabled_holo_light.9.pn g SHA1-Digest: 55f4pDcLSMwJ2///c7EjaRD4TtY= Name: res/layout/abc_action_bar_title_item.xml SHA1-Digest: QzmSVkZhkH/CGOFdlrZ9s21SgS8= Name: res/layout/color_preference_items.xml SHA1-Digest: xVhV4MgGbJBF6h9TueYdJHa7hq4= Name: res/layout/notification_template_part_chronometer.xml SHA1-Digest: N3bpzPkHEH/egwMXsQQ5MXKZrfM= Name: res/drawable-xxhdpi-v4/ic_emoji_nature_normal_light.png SHA1-Digest: 0jiwcjLEKePMy8m0RMoIhT4ocWg= Name: res/layout/zooming_image_view.xml SHA1-Digest: wjmUQd8KKCMX7JN384NxM9U03W4= Name: res/animator/upper_play_to_pause_animation.xml SHA1-Digest: 1TOkjm6F2/DzGTLmzL7Ol4HlHJM= Name: res/drawable-hdpi-v4/ic_send_insecure_white_24dp.png SHA1-Digest: jcPOs6NbnJ2g4wWmsSf9mQfzv5o= Name: res/drawable-mdpi-v4/ic_volume_off_grey600_18dp.png SHA1-Digest: kI7nw769qk2yR3SPs8rgcvoqq0w= Name: res/drawable-xhdpi-v4/ic_photo_camera_dark.png SHA1-Digest: ngJmjiQc3w1O0KPlXZbXufep6Zg= Name: res/drawable-mdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png SHA1-Digest: EYD0L7FYlUYj4vZvX1mmqzIwLBE= Name: res/drawable-xhdpi-v4/ic_block_white_18dp.png SHA1-Digest: 9z2lHTtH/PPnEg81YtRrU2ZFm+o= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_58 SHA1-Digest: hkt/emROO5dafVOiI7Zx7fKidEI= Name: res/drawable-hdpi-v4/ic_emoji_flags_normal_dark.png SHA1-Digest: l4ASGy17UUsb7ymwG5cl6ndH71I= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_55 SHA1-Digest: fv4z5lbCDxm8xUvQIY8+gDq08Nk= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_54 SHA1-Digest: EjExNy18aod1tZNDB5Mvc+z5EJs= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_52 SHA1-Digest: GfA+N9jSreUFUdFVVb+RZfhngSI= Name: res/drawable-xxhdpi-v4/ic_warning_dark.png SHA1-Digest: D1uEsGlc/SRlmOvLMXa4vPQeaeA= Name: res/drawable-xxhdpi-v4/ic_delivery_delivered_dark.png SHA1-Digest: Q52p/VabHg+UfldUrx4S5s8j9zg= Name: res/drawable-hdpi-v4/ic_brightness_6_black.png SHA1-Digest: WJnVdOMWsjuVdEtW9GXmA1T6DnI= Name: res/anim/abc_popup_exit.xml SHA1-Digest: 6uAxkSAqOnz6wM+5oio7//G38vY= Name: res/drawable-hdpi-v4/abc_scrubber_track_mtrl_alpha.9.png SHA1-Digest: bbu4U1Z2FReSVaAwtf9Uj+pAXxA= Name: res/drawable-xhdpi-v4/abc_switch_track_mtrl_alpha.9.png SHA1-Digest: xe5aMoZuNGwGdXksGOYPSE3NVpk= Name: res/drawable-xxhdpi-v4/ic_cancel_white_24dp.png SHA1-Digest: uIPdERWoB0Xbmn7TtJ53Yt6T8lU= Name: res/drawable-mdpi-v4/ic_done_all_white_18dp.png SHA1-Digest: 6RtNXtvHEJtyBGz7CC+8pcu+2k8= Name: res/drawable-mdpi-v4/ic_brightness_6_gray.png SHA1-Digest: qvlbB6O1T6oNI0cJQ+TLEQOAUCc= Name: res/drawable-xhdpi-v4/ic_emoji_flags_activated_light.png SHA1-Digest: YohQNFrhXEWY8IR4TwCKjPYIPz4= Name: res/drawable-mdpi-v4/design_ic_visibility_off.png SHA1-Digest: ipLLCgBkk/K/KbY3zZsJ8rEwkqc= Name: res/drawable-hdpi-v4/ic_photo_camera_light.png SHA1-Digest: bfG4OOhLunHje5La/8WZ2Tm+2Js= Name: res/drawable-hdpi-v4/ic_image_light.png SHA1-Digest: nxC2CR2PJMIo6QwSZvh9JIlrvD4= Name: assets/emoji_symbols.png SHA1-Digest: XE9qEioRlR74jFdnavx4j39xY3k= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_675 SHA1-Digest: Egbq8VQn3A6YTmNLqQtbJWXPR8Q= Name: res/drawable-xhdpi-v4/ic_done_all_white_18dp.png SHA1-Digest: +vPvdEMP/fdCA6U51cIygAU9BxM= Name: res/drawable-xhdpi-v4/ic_delete_gray.png SHA1-Digest: 9BGTYrElt+IOXRoukCyrJru6/EQ= Name: res/drawable-xxhdpi-v4/ic_textsms_grey_32dp.png SHA1-Digest: w7FTP8fokSOQc5a18rh5ZAnyeBw= Name: res/drawable-mdpi-v4/ic_lock_white_18dp.png SHA1-Digest: pBQx290amd9nTX5NiMqlPcL3v1o= Name: res/drawable-hdpi-v19/switch_thumb_pressed_holo_light.9.png SHA1-Digest: K3YgpyXSgJr++z61OECZhndc9kM= Name: res/drawable-hdpi-v4/ic_emoji_recents_normal_light.png SHA1-Digest: dO0i3/TnoJlyPzUsORXFNVSttVg= Name: res/drawable-mdpi-v4/ic_send_secure_white_24dp.png SHA1-Digest: S4iduCbVpmJnEpp0TrtDu0tibZA= Name: res/drawable-xxxhdpi-v4/ic_block_grey600_18dp.png SHA1-Digest: Y5lhWQ5y7+bHF0sQgxkxtsQaf2s= Name: res/drawable-xhdpi-v4/switch_thumb_disabled_holo_light.9.png SHA1-Digest: ljpsvOw3MQTa68v5CQddL5JUS+A= Name: res/drawable-xhdpi-v4/ic_info_outline_white_24dp.png SHA1-Digest: ohuZr+SPmjW9HPIu+b8s3HtsmCs= Name: res/layout-v16/conversation_item_pending_v11.xml SHA1-Digest: 3uW3DbHLcnvjpSvvoxu1+oy04gc= Name: res/drawable/design_snackbar_background.xml SHA1-Digest: 9Xn8nraZC6Vcz6OSelNnzt+1PV0= Name: res/drawable-xhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png SHA1-Digest: B2HfhtZm7f+8V429AdZbU7mrLo8= Name: res/drawable-hdpi-v4/ic_create_white_24dp.png SHA1-Digest: wtYt9ob7eMgSOIyEUvlDncpuCCU= Name: res/layout/key_caching_notification.xml SHA1-Digest: Q3VhQitFF+cVcnu1P7hMzsahwNI= Name: res/drawable-xxhdpi-v4/textfield_activated_holo_light.9.png SHA1-Digest: v1cd6v0pRkDauAh+/cr18dBMykA= Name: res/drawable-xxhdpi-v4/ic_movie_creation_dark.png SHA1-Digest: hq/HDlKrkU+CD/2b1avbgug0cvY= Name: lib/armeabi/libcurve25519.so SHA1-Digest: nEVHde0KFMHgixmh+GIOePj6EWY= Name: lib/x86/libcurve25519.so SHA1-Digest: H5Egy82jimewQZPkEoJOFBJrWiE= Name: res/drawable-mdpi-v4/ic_menu_search_holo_light.png SHA1-Digest: 6htuxL+VQAoB64kEmH2Kj0/iC0E= Name: res/drawable-xxhdpi-v4/abc_textfield_search_activated_mtrl_alpha .9.png SHA1-Digest: WQ8PqUvvH8nOnzNH5uPMzVsVa+Q= Name: res/drawable-hdpi-v4/abc_ic_star_black_48dp.png SHA1-Digest: QbDpX67R5eyTWuNm150bgcl3Sgw= Name: res/drawable-mdpi-v4/abc_text_select_handle_middle_mtrl_dark.png SHA1-Digest: l6V40h1Kq8Tu3O9lUBPWpUqJtoc= Name: res/drawable-xxhdpi-v4/ic_lock_dark.png SHA1-Digest: NFzTV/6qvcpJans9yAngc04n9eA= Name: res/anim/abc_fade_in.xml SHA1-Digest: wE1QEZhFkLBWMw4TRtxPdsiMRtA= Name: res/drawable-xxxhdpi-v4/ic_archive_white_24dp.png SHA1-Digest: /ApVfvY7TZ7UT1V1/bHQ1w9LsWs= Name: res/drawable-hdpi-v4/ic_volume_off_grey600_18dp.png SHA1-Digest: FIVzTZsmvBIpwjzWaajuDk8CFGU= Name: res/drawable-sw600dp-hdpi-v13/ic_backspace_normal_dark.png SHA1-Digest: f4M6VvhQl88T3RVSBKSNc68yPyk= Name: res/drawable-xxhdpi-v4/ic_recurrence_bubble_outline_disabled.png SHA1-Digest: w1Z6Ozki8nTQaPLHtp4Di5h/gok= Name: res/layout/abc_search_dropdown_item_icons_2line.xml SHA1-Digest: loHBySvilcR0ZDgxQ9eAttNBuHM= Name: res/layout/abc_screen_simple.xml SHA1-Digest: wcPlv/nr5pkFN65VKYp3t34HJzY= Name: res/layout-v17/conversation_title_view.xml SHA1-Digest: E2oUf4eLPGUwwEmq1Cllhbls214= Name: res/layout/conversation_item_sent.xml SHA1-Digest: 9UHjMglE9L9EerONxG5mTuBqo6A= Name: res/drawable/share_list_divider_shape.xml SHA1-Digest: oze/+hk+C+xljs/Mpyq1oVRhM1Y= Name: res/drawable-hdpi-v4/abc_text_select_handle_right_mtrl_light.png SHA1-Digest: zwcMW0GH3RqmlBghFwMH6OEhqXQ= Name: res/drawable-xhdpi-v4/ic_pause_circle_fill_white_48dp.png SHA1-Digest: CVaieu6GpA9k9kxl3q7rTb4UYYU= Name: res/drawable-xxhdpi-v4/design_ic_visibility_off.png SHA1-Digest: PlrfwchzE7z/k1/X+4BUE0VacAY= Name: res/drawable-hdpi-v4/ic_emoji_symbols_activated_dark.png SHA1-Digest: pvBThWhMdTa9M3bExnEkZK73MGc= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_255 SHA1-Digest: GR5suOXxRCRSaPOoEXvpBezuIsM= Name: res/drawable-xxhdpi-v4/abc_list_focused_holo.9.png SHA1-Digest: qCddjZI8yABkWFvWCWlg+bQVD7M= Name: res/drawable-xxhdpi-v4/textfield_disabled_holo_light.9.png SHA1-Digest: 8uAr5Lt4boLAicIMjYMnfGSIX3w= Name: res/drawable-hdpi-v4/ic_menu_barcode.png SHA1-Digest: /8U9t3Qy9/S8IxwFbzkiqnSfQN8= Name: res/layout-v21/notification_template_custom_big.xml SHA1-Digest: LS7+cQspjhKEwdQsTahMw+haArU= Name: res/drawable-xxhdpi-v4/sms_system_import_icon.png SHA1-Digest: u8BglbLgaKCMbPyu2Fk8HHsEb3U= Name: res/drawable-xxxhdpi-v4/transfer_controls_background.9.png SHA1-Digest: eBXpns72mgHZbdQjLQLPnbzbCqo= Name: res/color-v23/abc_tint_edittext.xml SHA1-Digest: XnHYiEdQh7sZ+aQwfddZYqipJNo= Name: res/layout/conversation_title_view.xml SHA1-Digest: QxEoar7Oh/SO2HIYUpNRM1psNqE= Name: res/drawable-mdpi-v4/ic_emoji_recents_activated_dark.png SHA1-Digest: x5kFiFfBeI4gfPvnGuKZRnIVgi0= Name: res/drawable-xhdpi-v4/abc_list_pressed_holo_light.9.png SHA1-Digest: 4CNgdraLjH84scvRJUfzItc3PbA= Name: res/drawable-xxxhdpi-v4/ic_forum_black_32dp.png SHA1-Digest: eJFu4ty1Y+n1Kkwbcs+Kk/ogaME= Name: res/drawable-mdpi-v4/ic_clear_white_24dp.png SHA1-Digest: yNBPrtJwCZAL8kzkOTtUs+nlZic= Name: res/drawable-xxxhdpi-v4/abc_ic_star_half_black_36dp.png SHA1-Digest: QX+e7+1s5MHT2dUAaC7VUR+efz4= Name: res/layout-v17/notification_template_big_media_narrow_custom.xml SHA1-Digest: 484cKP4O32SZ90cmD99/AMvzJGs= Name: res/drawable-mdpi-v4/ic_advanced_gray.png SHA1-Digest: hKAQATuQ9Hfgy7kRH+Blepsttsk= Name: res/menu/conversation_list_batch.xml SHA1-Digest: VsKmzXOd1qCHb7daXAwYd+ZxTMY= Name: res/drawable-hdpi-v4/textfield_disabled_holo_light.9.png SHA1-Digest: DMgBrgDQzsNJNgByJKxx8cQ1G48= Name: res/drawable-xhdpi-v4/fab_shadow.png SHA1-Digest: u4AjjXO/B15x/thNhKzE1yUPWJw= Name: res/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_000.png SHA1-Digest: qohFhg6cHeSRc5iV72L4bfUwcjM= Name: res/drawable-xxhdpi-v4/ic_block_white_18dp.png SHA1-Digest: dl8Q1j2xp1eDvyiDdX8aWsrf3w4= Name: res/drawable-hdpi-v4/ic_check_white_24dp.png SHA1-Digest: PcMRcVMKp3TNAr0vXLbxQo98W0g= Name: res/drawable-xhdpi-v4/ic_volume_off_white_18dp.png SHA1-Digest: unTCKvTLaI3OtXUhb0MBtR/LYXg= Name: res/drawable-xhdpi-v4/ic_emoji_emoticons_activated_dark.png SHA1-Digest: jlfodHPaYKBJF8uY+2oGqQYV01Q= Name: res/drawable-xhdpi-v4/ic_warning_dark.png SHA1-Digest: /Pz/2YqdiI+6JZuf3PjPmZHJfCs= Name: res/drawable-xxxhdpi-v4/ic_unarchive_white_24dp.png SHA1-Digest: pcY8XnRaYgqxWMnB51jCtO6EPlM= Name: res/drawable-hdpi-v4/ic_visibility_off_grey600_24dp.png SHA1-Digest: SY0HrM3WEh/fL3xG9vqRHex/Gmg= Name: res/drawable-v11/emoji_category_recent_dark.xml SHA1-Digest: 72TtZirKpfYUmBHYB1jXqck4b2o= Name: res/layout-v21/conversation_title_view.xml SHA1-Digest: Pbf7I6lbd/dAn9Aw8qYCtQhQd0E= Name: res/drawable-xhdpi-v4/ic_emoji_symbols_normal_dark.png SHA1-Digest: Qg4qhV+3W7kY6vC3Q9cwvnyj46w= Name: res/drawable-xxhdpi-v4/ic_visibility_off_grey600_24dp.png SHA1-Digest: EMdNrmJoDjeay7cUBHlX0b1lhbE= Name: res/drawable-mdpi-v4/ic_content_copy_light.png SHA1-Digest: G4hoGZhtM2+rT9QAyilbCKfnbOU= Name: res/drawable-mdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png SHA1-Digest: xtSRUA6yPL0pgx6e3nVwE/7dLxw= Name: res/drawable-hdpi-v4/ic_group_photo.png SHA1-Digest: nwCmWxGD6l0rTt3McSY3ocjDX+g= Name: res/menu/conversation_list_empty.xml SHA1-Digest: /kPBckj2D9elLCRpFOgpv0BZPBQ= Name: res/drawable-hdpi-v4/ic_backspace_disabled_dark.png SHA1-Digest: poOmHvJuBZ1uvPEANwZvD2LZUPI= Name: res/drawable-v11/emoji_category_objects_light.xml SHA1-Digest: 0mfjchr4HIqg2LJUtn4hINkhVdI= Name: res/drawable-xhdpi-v4/ic_emoji_recents_normal_dark.png SHA1-Digest: pc7ZjWa6ugeu91Y4N8eXss/bLZE= Name: res/drawable-mdpi-v4/notify_panel_notification_icon_bg.png SHA1-Digest: y9fFL7ZwxVmqnnOis/943Gj9mHg= Name: res/drawable-xxhdpi-v4/ic_emoji_emoticons_normal_dark.png SHA1-Digest: jRiMqBvgouoMECLzB/qztT2moII= Name: res/drawable-xhdpi-v4/divet_lower_right_light.png SHA1-Digest: 69RKSTN6id2LNthh544gDm1Prpk= Name: res/drawable-xhdpi-v4/ic_recurrence_bubble_disabled.png SHA1-Digest: x9jgrgeVg7r5sjgjER7QRO5r2IE= Name: res/drawable-xxhdpi-v4/ic_forum_black_32dp.png SHA1-Digest: icvjkc8Dhix7m3Pu5GeiSO7g/vI= Name: res/drawable-v23/abc_control_background_material.xml SHA1-Digest: HqYpnSNEZBO85KEVY5nqiNXSmq4= Name: res/drawable-hdpi-v4/ic_backspace_grey600_24dp.png SHA1-Digest: dsle4x3iWPHanbPGqgDa6C6L6dw= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_679 SHA1-Digest: brii8vx5U3th9K0hIr7b19MpKXY= Name: res/drawable-hdpi-v4/notification_bg_normal_pressed.9.png SHA1-Digest: tLTtgWwmC52vFV8WmsQe/d9txW4= Name: res/layout/time_zone_filter_item.xml SHA1-Digest: Ajn+lJ73oUOV2RXoYL7LLRQLGzQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_676 SHA1-Digest: 4gGxM0M6k+qIXUWmmdKRACJhT44= Name: res/drawable/conversation_list_divider_shape.xml SHA1-Digest: a6RRumBJjeheOC+CUKII6imo1qA= Name: res/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_000.png SHA1-Digest: pIyZCVrTOqpTmBSlPcfEpBjoxJ8= Name: res/layout/select_dialog_singlechoice_material.xml SHA1-Digest: wXy6nQUC4xRU72eF5/tCCdjY7kE= Name: res/layout/conversation_fragment.xml SHA1-Digest: hKDQgyNaO2UxROSPx71x+YUqOqQ= Name: res/drawable-xxhdpi-v4/ic_add_white_24dp.png SHA1-Digest: 03jjfUIpNA5cQ9Q0YOOfLaIQvxI= Name: res/xml/preferences_app_protection.xml SHA1-Digest: DiKzUDzp4hGHFF2ovIkOJRhzDvE= Name: res/color/abc_primary_text_material_light.xml SHA1-Digest: dCntfvSV9J+hVwyRYNjfEdYySvI= Name: res/drawable-hdpi-v4/ic_circle_fill_white_48dp.png SHA1-Digest: 0Xf59WTDmGhbNA5/xUzyt+T0Flk= Name: res/drawable-xhdpi-v4/ic_visibility_white_24dp.png SHA1-Digest: NcT+AoCHgy0H/PGv36QKQW19jCU= Name: res/drawable-v21/conversation_list_item_read_background_dark.xml SHA1-Digest: UlYh4LalEHUe5ePNFOotY3pa2h8= Name: res/drawable-xhdpi-v4/transfer_controls_background.9.png SHA1-Digest: CmzcrZNC8r+1hIxDz084H5GZEDw= Name: res/drawable-v11/emoji_category_places_dark.xml SHA1-Digest: lyHwoErSUiKm/pF3o8jRyeldiuU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZA SHA1-Digest: U0Yd53nbLp1PRjJ4mY7AZ5X63fI= Name: res/drawable-xxhdpi-v4/ic_error_red_24dp.png SHA1-Digest: FAWsyfxJi/Sl5xyojYE61hGmBLY= Name: res/drawable-xxhdpi-v4/ic_emoji_objects_normal_light.png SHA1-Digest: 0hS3kX5JkU1pYENPHjxV9LatZSU= Name: res/drawable-mdpi-v4/switch_thumb_holo_light_v2.9.png SHA1-Digest: w8Dy0yH3VYRGd70FBZl2zVgtszM= Name: res/drawable-hdpi-v11/icon_cached.png SHA1-Digest: lrYsY9ZN9V40fp3p1mzWvwtvqrI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_YE SHA1-Digest: dVyncrRBMtw9bH8eVfdkKLz+dTw= Name: res/drawable-hdpi-v4/spinner_disabled_holo_light.9.png SHA1-Digest: wiWkHAPVenl8UL3CUN7wiwB68o8= Name: res/drawable-xhdpi-v4/ic_emoji_nature_normal_light.png SHA1-Digest: 7pHBYBd5ijeoA+3wdnBydEqxiAg= Name: res/drawable-mdpi-v4/abc_list_selector_disabled_holo_dark.9.png SHA1-Digest: 0lawN0TfON5HQhuTBR7Om1xGxUI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZW SHA1-Digest: hdKqCqXMjdL67/W/uAIBtmGqRdA= Name: res/drawable/abc_switch_thumb_material.xml SHA1-Digest: GMLceoxorxIv4SfySzjNiKy4yRk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_800 SHA1-Digest: Mqvhekjlq5rLsR/GHx5/lGvy6+4= Name: res/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png SHA1-Digest: DqYT/YomMpTVjcgLxNiWd75/E14= Name: res/drawable/psts_background_tab.xml SHA1-Digest: 9uvH4klnViC9JxQERHofBJQ0wEU= Name: res/drawable-hdpi-v4/ic_emoji_recents_activated_light.png SHA1-Digest: ubZ9biCY1B0TJL0CfSZIsrDu8x8= Name: res/drawable-v21/avd_show_password_1.xml SHA1-Digest: lEMe5NORMm0MqjqM7mrLbM1hB/E= Name: res/layout-v16/transport_selection_list_item.xml SHA1-Digest: Nw1L5zREyLlgrRDaXL+5b8Wy2Os= Name: res/drawable-xxhdpi-v4/actionbar_icon_holo_dark.png SHA1-Digest: OZCoH2YpLjQz8QeU2BFFntjlEg4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_808 SHA1-Digest: 1JDvM3Ny0doEEq4kfYb/HSkFbmw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM SHA1-Digest: krhQ3sQmvB4147GOBnvNGJ9k/t0= Name: res/layout/support_simple_spinner_dropdown_item.xml SHA1-Digest: OMWJqSywbwWFCtiu9pGbWBrzaBo= Name: org/spongycastle/x509/CertPathReviewerMessages_de.properties SHA1-Digest: JEtZ3RAGGTVEFFC7U8WRwNNTJXU= Name: res/drawable-xxhdpi-v4/ic_emoji_emoticons_activated_dark.png SHA1-Digest: NKcdFI0XGDZytPqshETKS5SaHtk= Name: res/drawable-hdpi-v4/icon_dialog.png SHA1-Digest: IklnSOYXNLOm1UnN74LhWWzyP2g= Name: res/drawable-mdpi-v4/ic_message_white.png SHA1-Digest: c2bVOl6Nn58TYkRLcFFBLhvCzgc= Name: res/drawable-xhdpi-v4/ic_account_box_light.png SHA1-Digest: +NO6SXuOd3UCnNzugZOF8k/kjR8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_WS SHA1-Digest: czgQN40vkNfm6v4HBiKFugKgzwY= Name: res/drawable-v21/avd_hide_password_2.xml SHA1-Digest: Y1ILAI8MUyhcBfZM74I0qwm1yl4= Name: res/menu/conversation_context.xml SHA1-Digest: pOBQ7VG5CflQkUSIQKLlKKsdyls= Name: res/color-v11/abc_hint_foreground_material_dark.xml SHA1-Digest: SJ2AWiQB6PrpRYln7M4KB3leYik= Name: res/drawable-xxhdpi-v4/switch_bg_holo_light.9.png SHA1-Digest: HDeWqBG3QxzY3hxSQPNe5n720HE= Name: res/drawable-xxhdpi-v4/ic_audio_dark.png SHA1-Digest: smz6yODujOWvBZrUKiWHPz8pbYk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_WF SHA1-Digest: wPlKXUFZ6+cNCsq5WNhHLEGmAQU= Name: res/drawable-hdpi-v4/ic_video_light.png SHA1-Digest: OFuhmb6FkVlgGx5tN0GrmXb1T04= Name: res/drawable-hdpi-v4/icon_cached.png SHA1-Digest: 4olkuaNuRZ/wX2HF+Z4NdxUi/bI= Name: res/drawable-hdpi-v4/spinner_default_holo_light.9.png SHA1-Digest: wNj51XPjwkpz5i7Qe8C0psbQlO8= Name: res/drawable-hdpi-v4/ic_warning_dark.png SHA1-Digest: atnJqjEwPybNJ1v/jbI243qw8JA= Name: res/drawable-hdpi-v4/ic_unlocked_white_24dp.png SHA1-Digest: cRFRs1Eh3cra62GcixZdycTy7po= Name: res/drawable-xxxhdpi-v4/ic_dialpad_white_24dp.png SHA1-Digest: 2kSKljXa90Dj6lIYAzpnGbN1L2E= Name: res/drawable-xxhdpi-v19/switch_thumb_pressed_holo_light.9.png SHA1-Digest: vOrQRbnBW344sB4vzWZnuvuoRho= Name: res/drawable-xxhdpi-v4/ic_emoji_nature_activated_light.png SHA1-Digest: XvpYzU9xVv3mCYAbmKYPMfQAnEQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VI SHA1-Digest: foVnsR9TPZ96hWgSc6Mc+Kgysok= Name: res/drawable-xhdpi-v4/ic_block_grey600_18dp.png SHA1-Digest: vGqqYp+8vgs+ZR+mveLUXUTI/Uk= Name: res/drawable-hdpi-v4/abc_list_selector_disabled_holo_dark.9.png SHA1-Digest: vVifsTusCsEMS/QLwleavhByCls= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VG SHA1-Digest: bsJEEDbPQhpQPPr9LB1ec8bYbv4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VU SHA1-Digest: e2UqijEw6P7d7KJgJdkVC5NDon8= Name: assets/emoji_nature.png SHA1-Digest: 3LR8FZBTV9dDX+3fPaFEdfQNKkQ= Name: res/layout/expiration_picker_dialog.xml SHA1-Digest: BcWCThF9XR0J7AErzxISmZVFSz0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VN SHA1-Digest: dxE4Qq3twfhDg+ZyYzk6h8N3hws= Name: res/drawable-hdpi-v4/ic_info_outline_white_24dp.png SHA1-Digest: NJM0SmJryxtj3luuPOr/aI3zt+I= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_UZ SHA1-Digest: sBsgHk6r7CosIOw6f55wEp78BZM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_UY SHA1-Digest: utktgIUNk5EHFxnsav5wZviQKXc= Name: res/drawable-mdpi-v4/ic_emoji_recents_activated_light.png SHA1-Digest: rCiJ1YBDhy5sB09CYoWok27enx8= Name: res/drawable-mdpi-v4/ic_select_all_white_24dp.png SHA1-Digest: TBiu2wjPq2uhTrSoBxA7RRkmAqo= Name: res/drawable-xhdpi-v4/ic_recurrence_bubble_outline.png SHA1-Digest: I6Z2if2VOZmKeNfFz+NB0WreeeY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VC SHA1-Digest: AYScUug7DAQKrecThlLqEd5WXfs= Name: res/drawable/abc_edit_text_material.xml SHA1-Digest: oiA6lTI8z8nUuKbfDkfiJVYFwwg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VE SHA1-Digest: OO5py+hE86Zvsbv0+nj0TMQJ4wg= Name: res/layout/abc_action_bar_view_list_nav_layout.xml SHA1-Digest: 51o0wd1RfWEfJUq63f13AZan+vM= Name: res/drawable-mdpi-v4/ic_visibility_off_white_24dp.png SHA1-Digest: Cp1dPyMZ/vjk/a+HvVQuBfflfQ0= Name: res/drawable-xxxhdpi-v4/abc_switch_track_mtrl_alpha.9.png SHA1-Digest: O9JInV5je9E+K0VDIh7tQxIyLAk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VA SHA1-Digest: ssuLZ4eLxP2vvwVBgzwnqCukstk= Name: res/drawable-mdpi-v4/ic_emoji_nature_normal_light.png SHA1-Digest: lK6Dk+nZb3Ge0b5k5J7obZVB2sE= Name: res/drawable-xhdpi-v4/divet_lower_right_dark.png SHA1-Digest: WL+2Tj0YNEKzd378aYnxkejif+E= Name: res/layout-v17/select_dialog_singlechoice_material.xml SHA1-Digest: rpGJfV0tirikFN4Xj46vZ6sETQE= Name: res/drawable-hdpi-v4/ic_video_dark.png SHA1-Digest: Ey7pCsneWAG6ggshi3ClRmTL10k= Name: res/drawable-hdpi-v4/ic_emoji_flags_activated_dark.png SHA1-Digest: Qk4RhA+73EGzSksMNqfjsZEOHkc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_UG SHA1-Digest: 4VAIezqoEYXQtcouEZrmKdPgGZs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_US SHA1-Digest: HqBnLlxl8we2BdQfgfG7D5x3DDs= Name: res/drawable-xhdpi-v4/ic_brightness_6_black.png SHA1-Digest: tU8zMbcX+8v4izG2zUUngkyo6Kk= Name: res/color/abc_tint_btn_checkable.xml SHA1-Digest: mcx05ORnk98iArpeDWcSnC5PJOI= Name: res/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.p ng SHA1-Digest: fU5gisHGI+zYrb29D3vQ+ofKD4I= Name: res/drawable/share_list_divider_shape_dark.xml SHA1-Digest: KKfJ+Fkfa2lc4+S6SckGvLXk2Qk= Name: res/drawable-hdpi-v4/notification_bg_normal.9.png SHA1-Digest: c5f+iD+5NWV0zWxwzUyh+V+QpkY= Name: res/drawable-mdpi-v4/ic_textsms_grey_32dp.png SHA1-Digest: 7XEhd9/4S8LupErI1szNn922CTE= Name: res/drawable-hdpi-v4/ic_arrow_forward_light.png SHA1-Digest: jMEH18/e6fwquQV6+DaEWLxpNbE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_US SHA1-Digest: ZT1gVON7U5vU0cyi+tSUpUmC6aE= Name: res/drawable/abc_btn_default_mtrl_shape.xml SHA1-Digest: SKMRXFrMMLv2CZ0xhHWsL5pijc8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UY SHA1-Digest: yIYOGVZR77ul2hObusA46tMaGOE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UZ SHA1-Digest: eiNIbGwLuX74E0o4Ko596usCtwA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_UA SHA1-Digest: NHLdVShkLuCqtyl3+7z3Gul3u+0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TV SHA1-Digest: LMrGXio9k6kL954+IlHsjNlcGH4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TW SHA1-Digest: cT5W1rkXudYqAeqGeTxS9oScNEM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TT SHA1-Digest: s0U0yH5dscjAnTh8sj4ocqY7n2o= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TZ SHA1-Digest: SAA8d6BxG+K7F4vCBlExtqPE1O8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC SHA1-Digest: SetGpLEb1/uYPF/hUoMGB7L2LS8= Name: res/layout/verify_identity_activity.xml SHA1-Digest: sj6L78ARmd9IiJQwM+guosx/NXE= Name: res/drawable-xxhdpi-v4/ic_visibility_grey600_24dp.png SHA1-Digest: p5AYMH028t5wu1emYkHh+5SBkC0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VA SHA1-Digest: w1Ob7RZ/usfNPy9Z7hs2DvfcLr4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TO SHA1-Digest: 2WNCdtcDzpFmao6jOrfsFKkPbLc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VG SHA1-Digest: Q4iBHZuUuAhPeSRQ/dKit61Pdrw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TN SHA1-Digest: Aul5TdO8m1UZFIduHGqBhtGENDY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TM SHA1-Digest: TqK1CJDn4tmApMmnaXtO+Ru9DiY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VE SHA1-Digest: xjQ+aMUsAS0GgnKoQpkPn7457Tw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TL SHA1-Digest: NIVLhqetQw6Z3X5c0/FYd/dzFRY= Name: res/drawable-hdpi-v4/ic_menu_lock_dark.png SHA1-Digest: wWkrOgayvF/16HUEuzLjCr5dF/8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TR SHA1-Digest: KjrtpwbnBEWOe6Xp5911rIcRS/s= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VI SHA1-Digest: J5qIZ/dQnYLg48SP+ajWFBgDO8k= Name: res/drawable-sw600dp-mdpi-v13/ic_backspace_normal_dark.png SHA1-Digest: Jd2rzGbYe7KSdh6FIv61QwLEt24= Name: res/anim/abc_slide_in_bottom.xml SHA1-Digest: 6SIMoqi7/LVEqpyfDSSCRJ9qRR4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TG SHA1-Digest: Whu0jzsUpKNydskGqtSIJJVjQgk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN SHA1-Digest: uK4R4Hk/ier0iSgBWiqRaFMlbdY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TD SHA1-Digest: N3g53pQRS7LmRznOhV6YWBiMUgQ= Name: res/drawable-hdpi-v4/check_dark.png SHA1-Digest: /olsGzw5BAgMsQCdc/G2C3skzG8= Name: res/drawable/abc_textfield_search_material.xml SHA1-Digest: t7aLlxSJ1jiAbfeYrS+TIQ9arVM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TJ SHA1-Digest: NHvu413s8LInAxXaqSV216Lv950= Name: res/drawable-xxhdpi-v4/ic_lock_light.png SHA1-Digest: vRmFIULSZteNv7VyxlZQSJxoWHg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TH SHA1-Digest: dartGP+4CLkopoeoVqgaDcEQ2hE= Name: res/drawable-mdpi-v4/ic_search_holo_light.png SHA1-Digest: +nb7+rYGQnKh7CsoAKxgG6iMM7A= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VU SHA1-Digest: y+wLsIMOIF651Cy6uOoBNn3K4Ds= Name: res/drawable-v21/abc_ratingbar_material.xml SHA1-Digest: lmjnTB/yh4tmiAkHkeKcav4nFGA= Name: res/drawable-mdpi-v4/textfield_activated_holo_light.9.png SHA1-Digest: 2tfE7kha7TRVkhq7YgpEw3Y9FzY= Name: res/layout/alert_view.xml SHA1-Digest: KJkimln1oNMz3/C4GGkF175t/Po= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TC SHA1-Digest: bUtXC6xypa1DHdZZI3HLMa8vabo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ST SHA1-Digest: Trx3SwRQbX2P45fPA4/ikYDloUc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SV SHA1-Digest: n+2fK9t+sy8oMw7+bRkqIf+tTxc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SX SHA1-Digest: AcaoNTcH4WcTw5nkA+qEfALkSTw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SY SHA1-Digest: dlx118m7pTffNHIC3uokalTuRME= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SZ SHA1-Digest: 0iwx55r9t0P+qVGR3LorJpxrMNM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SL SHA1-Digest: +Ialprbpk3u5rF4w11BkKCUzH8s= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_WF SHA1-Digest: FPfB0sW2cbCOKbkiLIuhbZjK1pY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SK SHA1-Digest: APpOTRTe4mLqbaaOuWxGdQj0qws= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SN SHA1-Digest: YqgXESj4KBdRhMOXhXCNxMjb+1M= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SM SHA1-Digest: tfI70YIJ8nJs5kHHWT2A4HLjmBc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SO SHA1-Digest: FBCYOe8abRWudaHxWC6jIBo8wus= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SR SHA1-Digest: c99QdQgXb2dYO3HlzuXnjILlM+c= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SD SHA1-Digest: 5UXZhfjjkzOt7i/0DowUSEqMxFM= Name: res/drawable-xhdpi-v4/ic_backspace_normal_dark.png SHA1-Digest: 5yDZmZceUzVe1iekfJAVc2IBmYU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SC SHA1-Digest: 78+gZzPZL5SnTu/+44ffkMNgjpY= Name: res/drawable-xhdpi-v4/ic_check_dark_disabled.png SHA1-Digest: MViTJyK0ai5eD+lcCbB/mfxqh7I= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SE SHA1-Digest: TCL/CAS8dInZOa+XOxk+S5GL/K8= Name: res/layout/log_submit_activity.xml SHA1-Digest: 5SPs9x/Yx0vnD3sfhyN1L9CePNM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SH SHA1-Digest: fAnqEs3w2n4PGMLOti+Dz36lvtw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SG SHA1-Digest: e9DnOnhdZCVdEi1GaqvAT04papo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SJ SHA1-Digest: FP+kcAEQH8XKo4FcaUfms749qjg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SI SHA1-Digest: LL02jvnO1WRwfKkV3M/73Kt+i78= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_WS SHA1-Digest: fE4AFos82Fa50/1pJ5MJ6FheYns= Name: res/layout-v11/conversation_activity.xml SHA1-Digest: +jzmxtjYsZ1jifdMk6T/lQIXibI= Name: res/drawable/notify_panel_notification_icon_bg_tile.xml SHA1-Digest: Puty61iA1yiPjNAnY1HrMV4r8fI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SA SHA1-Digest: Rw6bdwvuN6ckE3w54vszo+ILgUY= Name: res/drawable-mdpi-v4/ic_emoji_symbols_activated_dark.png SHA1-Digest: fd+FJxbgWnlzIzFFHDxRKwmRVSw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SB SHA1-Digest: n5X5IcdT/PcrFPlZTOV6eelcnRw= Name: res/drawable-hdpi-v4/actionbar_icon_holo_dark.png SHA1-Digest: AehHwQaKfDLJ7NPJ/kpPofiunqA= Name: res/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png SHA1-Digest: M5x5yhIyfAE00veLbT8o+OstFp0= Name: res/drawable-xxhdpi-v4/ic_emoji_emoticons_activated_light.png SHA1-Digest: +X71FEk4oZu8oDOebWPW3NaIa70= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RW SHA1-Digest: CR1Ctd1AWQ7U2YnBaMfbdhpJLoA= Name: res/drawable-ldrtl-mdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: d4vgddzsyizuUaFKPS8KV2adOac= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RU SHA1-Digest: R902pnYPoqWzcXmIui+lv2vqM2Q= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RS SHA1-Digest: bIAXMHU8vC6J7U+FkIbvJHQ3v+g= Name: res/drawable-hdpi-v4/ic_recurrence_bubble_outline_disabled.png SHA1-Digest: VmO20R2v1KWG/YAVUA4jPmlr6wQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RO SHA1-Digest: P/Uot9HnhODLuFy/liTyAT7xRSQ= Name: res/drawable-ldrtl-xxhdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: UcEHcms2r2N9yOnGvBk/CGupFMw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RE SHA1-Digest: WmnEcbAYuEoK0pjJ4NeAwt1zaDc= Name: res/drawable/abc_seekbar_tick_mark_material.xml SHA1-Digest: 2cfdudxPpdKT3phtRi1TXi7pHmE= Name: res/drawable-xxhdpi-v4/ic_emoji_flags_activated_light.png SHA1-Digest: tnQREFYcdkUKF+iId0ThBnT9utk= Name: res/drawable-hdpi-v4/ic_textsms_grey_32dp.png SHA1-Digest: l26hedZwIH9Yw+KlHBEHJu1/9pc= Name: res/drawable-xxhdpi-v4/ic_unarchive_white_24dp.png SHA1-Digest: XglYIsRIEU9WS/bkj4+V64hED6Y= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_870 SHA1-Digest: iirE1LkRVWUWs3G+Wot8wka0/VI= Name: res/drawable-xhdpi-v4/ic_info_outline_dark.png SHA1-Digest: A1oNDHh2looWz3V6e7KZfKEwDng= Name: res/drawable-v11/emoji_category_places_light.xml SHA1-Digest: Bg5yB7phDN6BvS8VFb1FcpSSPq4= Name: res/drawable-hdpi-v4/ic_mood_grey600_24dp.png SHA1-Digest: anUXtsk9vBN7WMxFmaNPS0hfqfE= Name: res/drawable-xxxhdpi-v4/ic_textsms_black_32dp.png SHA1-Digest: DyYIIIDS2lD7lKXGKwqgVZ8H6Ys= Name: res/drawable-xxxhdpi-v4/design_ic_visibility_off.png SHA1-Digest: 7f7aSHLckgKMnYWA1BlMPU8wxtI= Name: res/layout/share_fragment.xml SHA1-Digest: 9VHrZXYRt6ll801+ePxqAS3Ftko= Name: res/drawable-xxhdpi-v4/abc_list_longpressed_holo.9.png SHA1-Digest: 2lRuxodMxnuWn+IclaJShuAV5+Y= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_YE SHA1-Digest: otqw9kQnfp2A26BnjYrGGK7agAI= Name: res/drawable/abc_ratingbar_indicator_material.xml SHA1-Digest: 6gbbPFsN/J2Dxd3gmFcvpI6abI4= Name: res/drawable-hdpi-v4/ic_keyboard_white_24dp.png SHA1-Digest: bpM7nSvSapMQ2eXOFULJ+QgSLRo= Name: res/drawable-xxhdpi-v4/ic_emoji_places_activated_dark.png SHA1-Digest: uSERXFuo7exkXfiNEv/W3RsSSCM= Name: res/drawable-hdpi-v4/textfield_disabled_focused_holo_light.9.png SHA1-Digest: HeYl/nhHnXmTW6qa4lu35dzb3EY= Name: res/layout-v13/message_details_header.xml SHA1-Digest: dzr+nKgerzoqIPZhx8kULhTvIqA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_YT SHA1-Digest: QUIDz2h66HCRyArqB8mAs7C9zGs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_878 SHA1-Digest: NYlZaMkwixLnHvaYfXzZ2Hg2Uzk= Name: res/drawable-xhdpi-v4/abc_text_select_handle_right_mtrl_light.pn g SHA1-Digest: flcizXeMrBA+Puf2HkSGneGeqXI= Name: res/drawable-xxhdpi-v4/textfield_focused_holo_light.9.png SHA1-Digest: 3G+rFDxksENpDFDnnWmhx48KLpA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_QA SHA1-Digest: vgGevfjW4kSMRwT8SBzfDcMgunE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PA SHA1-Digest: g+cMBunvvG0x/NBD106EV2b0Zro= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_883 SHA1-Digest: 1yCxVXC6jU71UJIsJjT/zZvOlFo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_882 SHA1-Digest: Ww3F4MLSHSlpSGrZX3kXe8x+Xl4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PE SHA1-Digest: Swfk7rt9197+zIcLj/mvi1BqAGU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_888 SHA1-Digest: WNCT/ilHaJtsAO+IaHBVN0fxe7Y= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PF SHA1-Digest: OaVEczR2T7c7UMnRgyj+60lYsRs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PG SHA1-Digest: 5pD4SBpEfIENlVenA99QeZ4u8lg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RO SHA1-Digest: Sg7TmE2mL2KHhy156iS+2WLA/ds= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PH SHA1-Digest: WYtmudyR5ZkOG4VsCCuMjm0e9v4= Name: res/drawable-xhdpi-v4/icon_lock.png SHA1-Digest: nBj3JWja8wKe663qJT8bnEgGSr4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PK SHA1-Digest: 9YuRLN1ojY+MfVYKz4j2dFy+RTY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PL SHA1-Digest: rtVjcwLWkrhfKZelFtK9T/AMECY= Name: res/drawable-xhdpi-v4/abc_ic_star_black_16dp.png SHA1-Digest: qfvO9I4x0UCtfyxe9QDR8Aj93fU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PM SHA1-Digest: 3tAr+G/rtYrsjn3tCmum4OmCH9Y= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RE SHA1-Digest: ospVsbq3w3ACp8QAb9mEBmb4Ly8= Name: res/drawable-mdpi-v4/switch_bg_disabled_holo_light.9.png SHA1-Digest: 7UJHiJVoqpy2dRzN2BDZ8a3zlsk= Name: res/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.pn g SHA1-Digest: ADDoWZfz0cLwg7Xh81feHpftgWM= Name: res/drawable-mdpi-v4/transfer_controls_background.9.png SHA1-Digest: 0VZBt8Ugd3Md5Tz54Fi+nEEj8Dc= Name: res/layout/abc_expanded_menu_layout.xml SHA1-Digest: +exI9wLmf+pukhmoRdN8fQSVI20= Name: res/layout/conversation_activity.xml SHA1-Digest: JCuGu4e9AFvpmLPQw/eSCuyIVpo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PR SHA1-Digest: uhjkEX5co8+MDakVUl06dg9UrQk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PT SHA1-Digest: buewk/3TBiLhEHmkMB/+vrstIj4= Name: res/drawable-mdpi-v4/abc_cab_background_top_mtrl_alpha.9.png SHA1-Digest: kxSGYJoMOYG0HnE3IprNwOq5ou8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PW SHA1-Digest: lmwDhF2OtKNPjvF9kgQkmVYNac8= Name: res/drawable-hdpi-v4/abc_list_focused_holo.9.png SHA1-Digest: z5rmTEqRHuMsX24l4sP3B88dR3Q= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PY SHA1-Digest: LoxH7CJoB2xEj6Jt+hzSIAASwP8= Name: res/layout/emoji_grid_layout.xml SHA1-Digest: RGyPbcQcMAiCBpiJs8xEo+ouCjg= Name: res/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png SHA1-Digest: je+36x1Dzaic4ajfPsRCU+apd1k= Name: res/layout/abc_alert_dialog_button_bar_material.xml SHA1-Digest: 1EVmc0n14dsx+pzzxfAjcRa8AuI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_881 SHA1-Digest: fmYudsEOVI0LO3liKowBijUFG4k= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SK SHA1-Digest: forjBE2veoc0b7N9u+nMGs1DwGU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SL SHA1-Digest: WX0pXeNsWKDaChCoQEvH7TMJ7sM= Name: res/drawable-hdpi-v4/divet_lower_right_light.png SHA1-Digest: Sn2XrywfVIndmHvaI9ZNXf7SIAs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SI SHA1-Digest: RpNbJSYp9chNDX7VyEHiYFrU4w4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SJ SHA1-Digest: KTgyCNWF0btdbmNTedtXPIZuPVc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SO SHA1-Digest: EfoQJModNGFqwVfIBRht2Mnw+Qw= Name: res/layout/abc_dialog_title_material.xml SHA1-Digest: Fda1mG9GqBE3tbcI/D3sxasjrMg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SM SHA1-Digest: hLYQJPXcUyDq8pkRE8HxCbO0lAU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SN SHA1-Digest: NJsY1EG/lY+wIQHEiFgFDofenNQ= Name: res/drawable-xxhdpi-v4/ic_backspace_grey600_24dp.png SHA1-Digest: 6tk+OYq31v63pXbYsNu6XgSVlOI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SC SHA1-Digest: abjCxJ5NKjic5Q6+0u6Cgy3eAQw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SD SHA1-Digest: gr0PYn1eaG+kfMRct/KO9mFJZDU= Name: res/drawable-mdpi-v4/ic_unlocked_white_24dp.png SHA1-Digest: MFpgWW3bgmwfNQYBdkV1ru2qTwE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA SHA1-Digest: Q1fZAHVGEiFvJq4xmrYo6DDjCYU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SB SHA1-Digest: cFAxt8BUBueKLMX3n3nIrJVP2Yk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_OM SHA1-Digest: JxH7S2qXvrgvG8pty7IgW54Yc5c= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG SHA1-Digest: ymmFzkaI5Nh4wtYuSKk8byIyDNY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SH SHA1-Digest: wK67hSi3PFaLFfs5vCH6M2uf2m4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE SHA1-Digest: Xye654+IFUlWplS0j4hee/fyRXw= Name: res/menu/conversation_send_drafts.xml SHA1-Digest: OfffoLsFKNX8gA1QfLtk4YS2aPg= Name: res/drawable-hdpi-v4/ic_attach_grey600_24dp.png SHA1-Digest: QsTRfDdAWEFSFhbHCnCdQ2yF8xQ= Name: res/drawable-xhdpi-v4/ic_emoji_people_normal_light.png SHA1-Digest: zilt6IdWFIq64vxZpzlQFYJrCiQ= Name: res/drawable/emoji_category_flags_dark.xml SHA1-Digest: 0JFf3OxcA6r2FLsTS+D0fkmVgD0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RS SHA1-Digest: GgOHkc6UGGXJ9k4/dDlXUgJFWx4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RW SHA1-Digest: 1M3ux4iVBQq7zDB55HkliabGw1Q= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RU SHA1-Digest: sbdtUrhxGryDYlaGpivtZ431g6w= Name: res/drawable-ldrtl-hdpi-v17/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: mmQqcznq/m4DDsuC52g4NiTzwA0= Name: res/drawable-xxhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png SHA1-Digest: 0Pl9UW/jK8MjxYht0b46LIt5W8w= Name: res/drawable-hdpi-v4/ic_app_protection_gray.png SHA1-Digest: 18QacvjMEyh+2FcXmY+26N30YEE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TN SHA1-Digest: 99h57l6ZBRjnr+inn+c8TCUFo1I= Name: res/drawable-hdpi-v4/ic_emoji_symbols_normal_light.png SHA1-Digest: XuujeVAxdAw7FpLFvFI8LG6UwnA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NC SHA1-Digest: 4P4GNXoqdbXhV6aRFFcU6H3wdL8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TO SHA1-Digest: APU4R6D/Vv8viWygfXSTwlGuGuE= Name: res/drawable-xhdpi-v4/ic_advanced_black.png SHA1-Digest: aEWGKq2oc0pmwD+CCMp/K/m+PhQ= Name: res/layout/time_picker_dialog.xml SHA1-Digest: DqL5xtGQIU6GDmEWu+L0ONOXZJg= Name: res/drawable-xxhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png SHA1-Digest: i8wYHM8BdG6ZwwbsPcMgrtWVs1o= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NE SHA1-Digest: 0fayia/F7Ab9umXaPcgO8TOWNNE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TJ SHA1-Digest: WYEOoOaJuCUtX/nB3qQzbRncIg8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TK SHA1-Digest: Z+EAMEK1Vmga8/d1MKXEFWkn/fc= Name: res/drawable-xhdpi-v4/spinner_disabled_holo_light.9.png SHA1-Digest: L3IeDF0w/S5ny9zc564klAP7kUI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TL SHA1-Digest: lrpr3SLFw4KVzXShLgq53Il63W4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NA SHA1-Digest: bEb/e4iGvbSt7Yw+tftI2Ep01c0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TM SHA1-Digest: UW1s3z24ewJHVqxHCwrAQyvDsVM= Name: res/drawable-ldrtl-xxxhdpi-v17/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: RT5SHZxO8jR3cgSzvKqbmSM4LGU= Name: res/drawable-hdpi-v4/spinner_focused_holo_light.9.png SHA1-Digest: 3zmmBeKWyKRhH23IcfeYZhVwLyY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG SHA1-Digest: e9CF7qT76tycOG/U9vtloxhkk9M= Name: res/layout-v17/abc_dialog_title_material.xml SHA1-Digest: G4wrwZ9xzbCrJ28bLcqb1dFQec0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NL SHA1-Digest: 9jTzxoIyo+vdoFNqt44z/+Qxuc4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH SHA1-Digest: XFo+EspCXG/steY9Q8YrmvXvgEA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NF SHA1-Digest: JzcCqh9/sW1t7SXSbk3m5rijguQ= Name: res/drawable-xhdpi-v4/ic_group_white_24dp.png SHA1-Digest: q2Y3MKCRGPy99OB9eBgtzUxGBZM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NG SHA1-Digest: 4/KzgayS6YA+dWfJHxJIX25hl3w= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC SHA1-Digest: PUm0fbZcNeYyBF02GBCV5pIMlYo= Name: res/drawable-mdpi-v4/ic_backspace_disabled_light.png SHA1-Digest: mzPE8uTj99CEszbIAsFwvL1VkKE= Name: res/drawable-xhdpi-v4/notify_panel_notification_icon_bg.png SHA1-Digest: qZTXDPkLdLdgn9U7jvOCObBW7aU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TD SHA1-Digest: D6EcGdqsak6vSLimRmtu0bawkC0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NI SHA1-Digest: bAiz96WeXPimGsaoKxDZ5n3pE2I= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NR SHA1-Digest: /k8OZAhVw2vV7bJ7zVJhVjLKhk8= Name: res/drawable-hdpi-v4/ic_volume_up_light.png SHA1-Digest: 4UUxWJRWTZqLoMDVeKqWA4uRqtg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NU SHA1-Digest: rOBttdjHcKcW1VoXCPnSzpsPKtk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TA SHA1-Digest: UA/Ak8WQNt/+M+jCUt/SQcJ18E0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NO SHA1-Digest: qsRVGM5vdCzTjiYG+AUy3lN/dT0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SZ SHA1-Digest: mGbJkioIUevT5sqH50oxWJd04XE= Name: res/drawable-xhdpi-v4/ic_emoji_people_activated_light.png SHA1-Digest: HKfxHlBlqGPdoLM2e6sXxktasF0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SY SHA1-Digest: bxw3Q/FAMiLM6tf7R0mQd2X8mf8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NP SHA1-Digest: 56qxXcseP4XTSSOzVYBJLx+PU3E= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SV SHA1-Digest: 5VE8AK9Pgejuq7rHq8Kj+9NGGKo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NZ SHA1-Digest: FI7sSj1OC0j35Fe/QVvtQV7noks= Name: res/drawable-hdpi-v4/ic_lock_white_18dp.png SHA1-Digest: 6yFngiOvomqtBVlLBwYd3MNNRPA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX SHA1-Digest: yKBJ6fmDKgMHeGOBhH8pCF9urKM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SR SHA1-Digest: z5DFGYQVr718sSmTQt8sg8TrFR4= Name: res/drawable/unread_widget_icon.xml SHA1-Digest: U6Et7hDtdXBlrmcHiRFGcEJ6FiM= Name: res/animator-v11/scale_with_alpha.xml SHA1-Digest: VoONsngcyPaOcsxveoWj4d5Ytsk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ST SHA1-Digest: 0DyYfyWReGAZQklqQD/gI+Ae/X8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SS SHA1-Digest: I61gNlKBaXoFueer87eVyHqgHT4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MC SHA1-Digest: DJPCVBVZWaQmLjOosHspJvKuAb4= Name: res/layout-v16/contact_selection_list_item.xml SHA1-Digest: DcLhdrS0ZEwJjTo1M9SMxUKo+Jg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MD SHA1-Digest: dSEMtLs1XQZghSWnI7Bb70hHPmY= Name: res/drawable-xxhdpi-v4/ic_done_all_white_18dp.png SHA1-Digest: GBoQjEB/sF3zobnJ4+liG+V9zDU= Name: res/color/abc_primary_text_disable_only_material_light.xml SHA1-Digest: TpKwzuD1e5/ZOIvTHOUHlcLNSZA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MA SHA1-Digest: 8iGu/ODXHZBORf6zi0w3x2gCmGA= Name: res/color/abc_hint_foreground_material_dark.xml SHA1-Digest: pLQ1N5EZpBcE07mV9IB64JqJT/Y= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MK SHA1-Digest: kO2FRje+Jg4ejR6sOBgvrE323r0= Name: res/drawable-v11/psts_background_tab.xml SHA1-Digest: +upC5kygYEM4a20jZXPtDpT3kL4= Name: res/drawable-xxhdpi-v4/ic_emoji_people_activated_dark.png SHA1-Digest: ttWb4gx2rLAeA4LgaEFp7jwzay0= Name: res/drawable-xxhdpi-v4/ic_clear_white_24dp.png SHA1-Digest: Wg1iR9xrSa40Q3bt3RWY7jXg5GQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ML SHA1-Digest: x7VpHNww61rEud7WmOSbxt/Z8O8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG SHA1-Digest: Ckx6wsAY/qzwUIKjOLclgOcmWWw= Name: res/drawable-xhdpi-v4/abc_text_select_handle_left_mtrl_dark.png SHA1-Digest: mMc2vLuahJ9g89/mLStEyPQTEdM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MG SHA1-Digest: D4FQgAs1CLqaS3oinb+PQwWXO/g= Name: res/drawable-mdpi-v4/ic_emoji_emoticons_normal_dark.png SHA1-Digest: 34cW3jlK7zby1nmUyd/JdKqDzmc= Name: res/drawable-mdpi-v4/ic_emoji_flags_activated_dark.png SHA1-Digest: hmw72OlceE2gTL+0XuAYVvUmuuo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MH SHA1-Digest: rnRIgqHBiNWIkxhqmnbXsRCKCxc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ME SHA1-Digest: n6t4oLaUnGIBsRtLF5crGIkT208= Name: res/drawable-xhdpi-v4/ic_recurrence_bubble_fill.png SHA1-Digest: kzOwmlaEQx+ZqZPmsHPah/fUdkc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MF SHA1-Digest: W/pThMhbGUCY5UEKKIcPXjW2rtQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MT SHA1-Digest: 83r9pr9S/M7sWHTeIw5LO2cKTL8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MS SHA1-Digest: cKleUHuWOTFKI6PUj7MpJaWWDsw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA SHA1-Digest: Hf41BfpvHVZ8y4JX8M4kFv20Id8= Name: res/drawable-mdpi-v4/ic_group_grey600_24dp.png SHA1-Digest: Jz9hBapEr6aEW0ZxbgvHAGS3XhM= Name: res/drawable-xhdpi-v4/ic_save_white_24dp.png SHA1-Digest: xHUf3n0ocqUhiy7UtjDi11AMv28= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MR SHA1-Digest: 6pGkZclc2L6OFd1i1JDSLRFTZ6s= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MQ SHA1-Digest: LM8Co41lxsX2sohhmT8fBuVcYO0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MP SHA1-Digest: gd7vJ0VsE1kCxIoPhIm7LU5u4wc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MO SHA1-Digest: CSF1YTOB5p2xxh6vMCGSGynJStE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MN SHA1-Digest: waWo3Ma0BJ2xY0R/F6roBdVVbiU= Name: res/drawable-xxhdpi-v4/ic_play_circle_fill_white_48dp.png SHA1-Digest: +/+2KFT28uil40tRFWAnvEoR6Jc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MM SHA1-Digest: cOvTLbhfce5Mw+usAdWmYHyZSng= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TZ SHA1-Digest: uxvRqVZhPWcZIaOA+iEVU/Qayi8= Name: res/drawable-xxhdpi-v4/ic_launch_white_24dp.png SHA1-Digest: 5daD4D1Yk5OzmCD6VqLaIW3ZmIU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MZ SHA1-Digest: ERm3whxMRK0XWfwBgU3rQOKLKcA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TW SHA1-Digest: rd7BBrecyPJGMbMnXQmVSiuk98k= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MY SHA1-Digest: P4HbLBcRtw9vwWYcNXcM6Qkm8Ug= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TV SHA1-Digest: /hUsEJmae/km3CCJd2yvKX4Y9+c= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MX SHA1-Digest: fYLnvB9AT16JOqwbYi7VM0pzqSs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MW SHA1-Digest: vbx37+UO23fen6k8yZAZ/IreLDs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT SHA1-Digest: UvkXWknjHX3n38lXB7kMQj/742Y= Name: res/drawable-hdpi-v4/ic_emoji_places_normal_dark.png SHA1-Digest: bJ7uzN61XGZA78H7XHImWMvDu58= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MV SHA1-Digest: xlTWRs6OG6evca/8usxB1cHl3ZA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MU SHA1-Digest: 42DXRc0ck2A2UY9S1ZETptWFiDE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TR SHA1-Digest: hiO+Nyit+r48l5uIP+oHf89sgOU= Name: res/drawable-xxhdpi-v4/ic_message_white.png SHA1-Digest: Iu5pR15zuRxq+YyUPb0wFfPOGu4= Name: res/drawable-xxhdpi-v4/abc_text_select_handle_middle_mtrl_dark.p ng SHA1-Digest: hzjpkT1X7DDbbnWVWCVeingW0Rs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LI SHA1-Digest: DKsH7Jrm58WZMdEDJDCzC/VKTTE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NA SHA1-Digest: 0yZqQf0O5Oku7xt2tXCgnZotsv0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LK SHA1-Digest: jUllmpXcki/+3d7iX12FcRbdmKY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NC SHA1-Digest: jEbnjwsrwDHBJn5MiH4px1Wlal4= Name: res/drawable-xxxhdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png SHA1-Digest: iuBU+dvN1PvZNfhVx+viSlB9A8A= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NE SHA1-Digest: 7JI8KCU3Lxp9ktmPitxqtWYI+Ro= Name: res/drawable-mdpi-v4/check.png SHA1-Digest: q4mS1hYZGjnuqVbkX+UXqtjOpl8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG SHA1-Digest: S0FtuHhYtjwNyVmFQ6ocBHxEZFQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NF SHA1-Digest: kMLSUq9zScIzd6XEFEgxVM2z0GM= Name: res/drawable-xxhdpi-v4/ic_recurrence_bubble_disabled.png SHA1-Digest: YS63bBmWQvSy3dTfrlKeHhouJP0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LA SHA1-Digest: s0kOLL4WkJ5cUeLueaZUFc6j6rY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NI SHA1-Digest: ZGHWgwjHPoQM4bcUmwGprgLkP6g= Name: res/drawable-mdpi-v4/abc_ic_star_half_black_16dp.png SHA1-Digest: thKivdtNhA6Rr/l43Nn1hXPM3hg= Name: res/drawable-xhdpi-v4/ic_emoji_places_normal_light.png SHA1-Digest: ABnnSYU1O8on+DPSdiEWdcQDrMM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LC SHA1-Digest: 0kAiJcnznJ8l+5FzyRrxSZlrXJQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LB SHA1-Digest: 1C5cZVqlPtxdRN6c4OEtBi7aiOo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LT SHA1-Digest: 7gVbLYruXmfEOBqIcEuT7LBv/0o= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MK SHA1-Digest: ehSVzPzw8AMYov5oHC9GKqUfi64= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LU SHA1-Digest: z9ysDmzUhkTDE4NvAwDyPhR5JOI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML SHA1-Digest: fD4KOBkpbGD6VIao83JV1SMhF9I= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LV SHA1-Digest: LC24QLKfNlKOiTJtOdz3z5ch0Yg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM SHA1-Digest: dEqM5jViAa+i4qT+gHdxTyHI0qs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN SHA1-Digest: RWGHiwf0CTtz0N+Lq7lElVKq7/w= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO SHA1-Digest: jF/fcLgPaeui3HvlwfwqLNiBHFY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LY SHA1-Digest: C7Znjp7bCWkxeaUTMH4HD5NpndM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP SHA1-Digest: ukS6QltS+3SCKS83yLkKjhyFsHs= Name: res/drawable-mdpi-v4/ic_add_white_24dp.png SHA1-Digest: ibLr0ZOAKWtf1rQ2wtq3k3JVKUM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MQ SHA1-Digest: +0Bg5XIouXpcuV79FPVgtS9YHJM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MR SHA1-Digest: YKD1Q6kRPCdnb6MHCjRouTiH0kk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS SHA1-Digest: t0l1yeTr7yOHKuaQrFKIDma8cbk= Name: res/drawable-xxhdpi-v4/ic_emoji_objects_normal_dark.png SHA1-Digest: QVCUohZYOYpcrebuPU/ytqbzjpk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MT SHA1-Digest: eUk76xeEBLxlY3kag54gEtpx0DM= Name: res/drawable-xhdpi-v4/ic_app_protection_black.png SHA1-Digest: sx4KDtqwf98z7M9vnu6jwKO7/9U= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MU SHA1-Digest: pMM4Ov3SvdHmIEGwtg9o/jY+3go= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MV SHA1-Digest: UlZYa4EzSlMtn063PMuVoxMY534= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MW SHA1-Digest: iUXT4jwd/d2lJn1vQJZsN7kJ050= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX SHA1-Digest: GrVNqkVwhbhGqW8CxLWi1StAwcM= Name: res/drawable-mdpi-v4/ic_account_box_dark.png SHA1-Digest: ktxz2M2qiGpsbvBGd3qPMazfsug= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LR SHA1-Digest: dGWTtCyU6wu0jranhqTgoNxPkQ8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY SHA1-Digest: ajCAigFehz2F5yVh7vx0ZrLyvGY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LS SHA1-Digest: Oyd62Spp8f8rC6WspMX71/yCc7g= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MZ SHA1-Digest: OK8y+Eire3EtIQSgccV+EF+x5Lw= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_27 SHA1-Digest: mGMwCzLy54rC/B9P+BWgJ/aqtLI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KE SHA1-Digest: zztIQwqnXlb8rVJX8QWI+H2Tgq8= Name: res/drawable-xhdpi-v4/ic_volume_up_dark.png SHA1-Digest: pA6ZpR6tCw3HHDSkTBful+I1V4Y= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KI SHA1-Digest: VniZugADPcLjegwJKsQgkwTxs68= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KH SHA1-Digest: olRWDZcTY/K+QHCL1hCIf0UK5M8= Name: res/drawable-xhdpi-v4/ic_volume_off_grey600_18dp.png SHA1-Digest: 1nxne2iNm4monE41EEF68YW7x2g= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KG SHA1-Digest: dgPXXJMllCLT1joDXw28hAdnkSE= Name: res/drawable/error_round.xml SHA1-Digest: n67C+HKq1nJ8tJ9rWOj80CdjZKo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NO SHA1-Digest: RyPkLVH50Vzt/N/2+fORP5U7vqI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NL SHA1-Digest: Ni0NAn1V6pDW5c0ZQVQ8Y26AfQ4= Name: res/drawable-xxxhdpi-v4/ic_pause_circle_fill_white_48dp.png SHA1-Digest: dcZi5ZfI1VUvLPzvFv5KKjuQD1M= Name: res/drawable-xhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png SHA1-Digest: FIm3sVpLJf34SkU3SQ/694URh1w= Name: res/drawable-xxhdpi-v4/switch_thumb_activated_holo_light.9.png SHA1-Digest: nbKHqGXjI9Sq2g21/0iabe6/LKs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KY SHA1-Digest: /jrOTkkY3ySyoVpJPAafvKMwicQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NR SHA1-Digest: ZiSjQbpr0HhOtQfgL64vSncOTpQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KZ SHA1-Digest: j54PEwVb6Bewxs6wGGAd2lRgo50= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KW SHA1-Digest: AEjoT2OX4gkA43hFr/jGzTd2elU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NP SHA1-Digest: ffyHariyayWa3j2yopQbcKO78B8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KM SHA1-Digest: t7Lbz+yfyiEGH5H8kDZv0c9Lsh8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KN SHA1-Digest: le+ClvBNRmQqVWX1ltCvNXt5Cy8= Name: res/layout/conversation_item_header.xml SHA1-Digest: TQbJlk6h+rmcWOVwj736lG7Y/Gs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NU SHA1-Digest: 18lDHkcMGhJXZ4db4h6re3N2SZ8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ SHA1-Digest: A5wiCEHZiKMWgT1jvFBm6K4t2Sg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KR SHA1-Digest: OaYfTpWALiQjIbGiacNyTHYlG/0= Name: res/drawable-mdpi-v4/abc_list_pressed_holo_light.9.png SHA1-Digest: +VIFOUvUwxbnTdHmmjA8LWrUN0k= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KP SHA1-Digest: uUZIp+MjnW0fcz596c9DWCPM1bA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE SHA1-Digest: z8Bcu45r+44AYANbA4s6ua6RPow= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JE SHA1-Digest: o0+QID3niDoDG4kF8SCTAcrq9xc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA SHA1-Digest: 5KTKJLRc9TSE31PvMjUKXpez3Tk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PK SHA1-Digest: cLiN3jb6RQFdjfoAiZz5X/JuBgw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PM SHA1-Digest: BRiUoNKU3EWol0KAjZK/eoQiaWI= Name: res/drawable-xxhdpi-v4/ic_brightness_6_black.png SHA1-Digest: YTC3G4WDqRU9WhknJ2LGEGr3gr4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PL SHA1-Digest: 99SD+7wBWg5i3ULzOfvsIBdcfxg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG SHA1-Digest: 8pnXE42OyAMEI/fTSPobSACXJo8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PF SHA1-Digest: iVtxzepigYBrioYpgjgL4/zV11M= Name: res/drawable-xxhdpi-v4/ic_menu_search_holo_dark.png SHA1-Digest: I/r2cvlknD15rUGXW5nm9DVF/qY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH SHA1-Digest: 7hU7esILVhSkqD8f6sDcuxi7c6w= Name: res/layout/abc_action_mode_bar.xml SHA1-Digest: df/w06TWwAPAlfisvfE5RPZOdkA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_OM SHA1-Digest: enHQS8cZb0bMHhaWZSHw7JjV/5E= Name: res/drawable-mdpi-v4/ic_circle_fill_white_48dp.png SHA1-Digest: +hGOL77Oa+RQFPfsSRc5ZlJEP8c= Name: res/drawable-xxhdpi-v4/ic_brightness_6_gray.png SHA1-Digest: ZXvqne3E6RV4Q7axhDNG7G/3KYc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JO SHA1-Digest: cDydACEnjJQ3VRPft2ueyyOrZUw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JP SHA1-Digest: By35s5+LL76yKqlRkmmHS3KMKVM= Name: res/layout-v16/reminder_header.xml SHA1-Digest: RXIuzBt+Tjfn0jdUoSQcUcdbJ38= Name: res/anim/abc_fade_out.xml SHA1-Digest: MfCV1efdxSKtesRMF81I08Zyvvo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JM SHA1-Digest: ykBAAUK7ebJec7pPi/GPbrtNwV4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IE SHA1-Digest: 8m3bYBFol+2VXXdT0StUEQv5G/s= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ID SHA1-Digest: CPgOxZPJjD+1sj2wxoAuKLnlZKs= Name: res/color/date_picker_year_selector.xml SHA1-Digest: mzic+nE8/95kRepfSgWKMe2If+Y= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA SHA1-Digest: Q7+/DsbqBWpcodl5tp/zNX+HsU8= Name: res/drawable-xhdpi-v4/abc_list_pressed_holo_dark.9.png SHA1-Digest: I+f9Vf8JVX6hz0eqBuaNI+f4Rtc= Name: res/drawable-xhdpi-v19/switch_thumb_pressed_holo_light.9.png SHA1-Digest: YcyJfNOau/BOW/i7/AKIHt1H59o= Name: res/drawable-hdpi-v4/textfield_default_holo_light.9.png SHA1-Digest: xrFOt/AjhDtJdBUDzaDAa/6vFAw= Name: res/drawable-hdpi-v4/abc_list_selector_disabled_holo_light.9.png SHA1-Digest: 1gu0+JdGxgtkd7hnwaQbfLEaaZc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT SHA1-Digest: sQPprObv8wvwXNJSMeaTVSHxgIA= Name: res/drawable-mdpi-v4/ic_arrow_forward_dark.png SHA1-Digest: O5Qd9Jq8h7GlnewL1WOPfkZghrs= Name: res/drawable-xhdpi-v4/ic_movie_creation_light.png SHA1-Digest: zN1pLotK/okrFKF+MCECFOIPPoY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR SHA1-Digest: ZysPJunUa0T0rACj7ALZYCvs6MQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PS SHA1-Digest: SvxLEqOsfh1dOAUs1R8YHShra/4= Name: res/animator-v11/upper_play_to_pause_animation.xml SHA1-Digest: CH6i3wvXxZikQo+RDdI061uMQ44= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IS SHA1-Digest: YUWDp9NUreWoOr7ROJl5u3DmTFA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IT SHA1-Digest: KC5y45aL2Nc7FBvwsUqiAFxZ8AQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IQ SHA1-Digest: LfzsWJsxP3a6Qf8adFv3LTQrnzg= Name: res/drawable-xxhdpi-v4/icon.png SHA1-Digest: DF9F713jv+PmMazzAZGr/P2JxVw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IR SHA1-Digest: +7hdHrc9JJbgo0k9qBZad56aluk= Name: res/layout/led_pattern_dialog.xml SHA1-Digest: AJgxEyYRo9s2kZ9HvLVtLA0vzHI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IM SHA1-Digest: jv8BgLIst/kWfuqL/5mm2b6s9pw= Name: res/drawable-xhdpi-v4/ic_save_all_white_24dp.png SHA1-Digest: 3tp2j8TYT6D54seciaokjd5iT/Y= Name: res/layout-v16/fragment_submit_log.xml SHA1-Digest: Tp9v8hVCSzsufY/K0Wjimy/K6NY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IN SHA1-Digest: RR6+qxNlw78RwOp4avdOhJRxi5o= Name: res/drawable-mdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png SHA1-Digest: iw5pKwcqPnAN4tMkq40FTN1cl9Y= Name: res/drawable-mdpi-v4/switch_thumb_activated_holo_light.9.png SHA1-Digest: 37aTq/CoCuhzr5/FuGa2TR5yBiA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IL SHA1-Digest: eSh3TmfbgxUyI8XHgpTsE8pFZHE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PY SHA1-Digest: V6I4RhTfKMJkEbU8sViQzBiNimk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PW SHA1-Digest: zh3SBlvOt91/rr+pD8Ly4qVwaOw= Name: res/drawable-xhdpi-v4/ic_info_outline_light.png SHA1-Digest: sdxIp0ru8cC0FFPEai6mSxfHMzU= Name: res/drawable-xxhdpi-v4/spinner_default_holo_light.9.png SHA1-Digest: TcXBLoAjAlB5KEh8iwVEKiOanVI= Name: res/drawable-hdpi-v4/list_selected_holo_light.9.png SHA1-Digest: DS5Yp1zkxBKJsNnlKmSULzDXa7o= Name: res/drawable/emoji_category_nature_light.xml SHA1-Digest: XOW2DJi5AEuHa9UyAa/oHy0FlEA= Name: res/layout/expiration_picker_view.xml SHA1-Digest: /BAPvlFk6lxvGIC09fxHSrVgPrY= Name: res/color/abc_tint_seek_thumb.xml SHA1-Digest: FDKqDoo0BfucHiPLX7REsb4CYSE= Name: res/drawable-mdpi-v4/ic_backspace_grey600_24dp.png SHA1-Digest: pHDjzFjkheW4rZrnmh8p760MMqo= Name: res/drawable-hdpi-v4/abc_switch_track_mtrl_alpha.9.png SHA1-Digest: aq/s3PoS9wD33oPeDdmP98R6Bkk= Name: res/drawable-mdpi-v4/ic_emoji_symbols_normal_dark.png SHA1-Digest: FBvIHdZsFfYRON6AqPfYLAok0v4= Name: res/anim/design_fab_in.xml SHA1-Digest: dRcgYgcLN0gY/2aHKJnWN/oMfkI= Name: res/drawable-mdpi-v4/ic_group_white_24dp.png SHA1-Digest: QXHm8eyZboUzma/MK/o3+qFfxzk= Name: res/layout/abc_select_dialog_material.xml SHA1-Digest: m/HAYUMmUYOA2sV/u//sgq1vaM4= Name: res/layout-v11/notification_media_cancel_action.xml SHA1-Digest: /KZyZOzEiShP2cP0cqnTYl+6vGU= Name: res/drawable-hdpi-v4/ic_photo_camera_dark.png SHA1-Digest: IKp0/V8LAGAHfsN4JipH/ujhdDY= Name: res/color/recurrence_bubble_text_color.xml SHA1-Digest: idGG95iKAtZmusEgO3vjFXWCANc= Name: res/drawable-hdpi-v4/ic_emoji_nature_activated_light.png SHA1-Digest: wBlcPKixV6Bk+qfZr/ycmArmNwQ= Name: res/drawable-hdpi-v4/textfield_activated_holo_light.9.png SHA1-Digest: Afh8MLGJ3Tx9XRM7C/09jOu01ZE= Name: res/drawable-xhdpi-v4/switch_bg_holo_light.9.png SHA1-Digest: saSmYyqe/82/e2GZuWPAi3VYDPE= Name: res/drawable-mdpi-v4/ic_lock_light.png SHA1-Digest: TRdyBXSOem1dsUjaBzd8/ufLsOg= Name: assets/emoji_objects.png SHA1-Digest: vALA6/+WIvuV6gUb5XbcWg5VSS8= Name: res/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png SHA1-Digest: ycXiJ7g1XDwZNYF8OiLagssfXOA= Name: res/layout/prompt_apn_activity.xml SHA1-Digest: p5/2YIBeEGxZYeAJbvAKThhH7z4= Name: res/drawable-hdpi-v4/ic_backspace_normal_dark.png SHA1-Digest: 35+MSRD5ygupxDY0umiLF9T/ZgI= Name: res/drawable-hdpi-v4/ic_emoji_objects_normal_light.png SHA1-Digest: oW1o9u6laSE6YgoL40jv1x4TR4g= Name: res/drawable-ldrtl-xxhdpi-v17/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: KzIuknZAyLH6woubBE32LAuZqFM= Name: res/drawable-sw600dp-hdpi-v13/ic_backspace_disabled_light.png SHA1-Digest: H9IeEe0/jFQZOlID5e+NFaG/pbY= Name: assets/databases/apns.db SHA1-Digest: PvPGqzaWrCJm692iqCn6D7uqZrw= Name: res/drawable-mdpi-v4/ic_photo_camera_light.png SHA1-Digest: ZgixC6ooxM2zs7ANDtRkJ/6PGQA= Name: res/layout/abc_search_view.xml SHA1-Digest: X0QMGszzHYu5/xIJT5n3LBD5gLw= Name: res/drawable-hdpi-v4/ic_mood_white_24dp.png SHA1-Digest: mAWYrnNo+676Ppv2zP9Evc2kNgw= Name: res/drawable-xhdpi-v4/ic_dialpad_white_24dp.png SHA1-Digest: 0erSDWulaDULF69XKAVhXp3crZY= Name: res/drawable/blocked_indicator_background.xml SHA1-Digest: gweHS1jBesmRyU+v0uYavvSZZY8= Name: res/drawable/emoji_category_people_dark.xml SHA1-Digest: 9SFLcnIfRHzdjByBVaLzU3UPOBU= Name: res/menu/media_overview.xml SHA1-Digest: EwI1bqJOoKrYUQvxSrkG+J8bubY= Name: res/drawable/list_selector_background_transition_holo_light.xml SHA1-Digest: b1H87ZIpIiBv7j8kdjbZ6lJmBU0= Name: res/drawable-xxhdpi-v4/check.png SHA1-Digest: AHjC+CFtOBHmDfRHyZazIpV9Ty0= Name: res/drawable-xxxhdpi-v4/ic_done_all_white_18dp.png SHA1-Digest: wy16yLWb3UsNN+/u7g7sDkPLzJU= Name: res/layout/import_export_activity.xml SHA1-Digest: UpNSytODYyXtqkCrkmmHKvi48O0= Name: res/drawable-mdpi-v4/ic_send_insecure_white_24dp.png SHA1-Digest: 5khri+ycEOaa+uANreHte5bedcE= Name: res/drawable-mdpi-v4/ic_launch_white_24dp.png SHA1-Digest: R8WccwkebYOiH17djRNCJO1ZWHU= Name: res/drawable-xhdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: uEqQdj8O/DgiXxPIGMvGrKY7dTE= Name: res/drawable-xhdpi-v4/abc_popup_background_mtrl_mult.9.png SHA1-Digest: ZbFwYRiDS6lC6psf14qui2W4zQQ= Name: res/drawable-xhdpi-v4/ic_textsms_grey_32dp.png SHA1-Digest: cgCiwCpkSgZW5huIGhEXKOh3dAk= Name: res/layout/keyboard_text.xml SHA1-Digest: 1uoV25AMIO86X5CcKpAv2n3qp3c= Name: res/drawable-mdpi-v4/ic_forum_grey_32dp.png SHA1-Digest: 1z1SD83iKbd/LIIUa4Cjqv9Ukfc= Name: res/layout-v17/conversation_fragment.xml SHA1-Digest: LWMFmGevNKwiLFfhK1FKaZSy5AM= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_7 SHA1-Digest: R13VmLCbBwMg6K479CnJtnC+bXs= Name: res/drawable/recurrence_bubble_fill.xml SHA1-Digest: f3GCv6rhCWwIFFg/JzEgZSezfvU= Name: res/color/date_picker_selector.xml SHA1-Digest: Rf67bugjGG1v+PbKB7h61LPHgKY= Name: res/drawable-xhdpi-v4/ic_unlocked_white_24dp.png SHA1-Digest: lbswHZMt8w9hR/nYqPXIIluZHwk= Name: res/drawable-xxhdpi-v4/switch_thumb_holo_light_v2.9.png SHA1-Digest: /dwwrT/7gkG9oNAKszZBP8puxAs= Name: res/drawable-xhdpi-v4/textfield_activated_holo_light.9.png SHA1-Digest: Gmocm6iACu2JtEPjYWad8j6ha90= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_350 SHA1-Digest: FL/nPG4XaSrRGuHfx7krOQDoLG4= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_352 SHA1-Digest: AQbsxBOsaCrzJXI/KS99rfUChNg= Name: res/drawable-xhdpi-v4/ic_mood_grey600_24dp.png SHA1-Digest: Te4e3OJMxFFD1PNny1b3S6DU9f4= Name: res/drawable-xxhdpi-v4/ic_emoji_places_normal_light.png SHA1-Digest: LRzqMDxdNFEw41n3ZT5kGYiAUbI= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_351 SHA1-Digest: 8gUjWk4JW0A+ylZayZHRoen3pFU= Name: res/layout/conversation_list_item_action.xml SHA1-Digest: I1nQIFRFmKjx1XbSAms2IvXJat8= Name: res/drawable-xhdpi-v4/abc_text_select_handle_right_mtrl_dark.png SHA1-Digest: o0rLAcxJ1uf5HaqOAfX0y2STqh8= Name: res/layout/abc_list_menu_item_icon.xml SHA1-Digest: IHjMoWWbSOePG8X4KyBCdZH/r0I= Name: res/drawable-hdpi-v4/sms_selection_icon.png SHA1-Digest: sk1UsWnhwGIOfiwT3j8Jx762tcc= Name: res/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000 .png SHA1-Digest: w/MYb1Y/O4Mr/eHUFvYCPi7mkN4= Name: res/drawable-hdpi-v4/ic_group_grey600_24dp.png SHA1-Digest: 5F4bdAqt0YgzmXJCDpWZpzTA5Jw= Name: res/layout/calendar_date_picker_done_button.xml SHA1-Digest: gxPgQ8xj+t/2whmi1WrYjG5+QFo= Name: res/animator-v11/bottom_play_to_pause_animation.xml SHA1-Digest: 2HngVRTUpoolPPl48CkjVhPeluM= Name: res/drawable/ic_check_dark.xml SHA1-Digest: FdXDDSXEKEiwTZQtLi75Mh5C1zk= Name: res/drawable-hdpi-v4/abc_text_select_handle_right_mtrl_dark.png SHA1-Digest: AYI75XDJNXJcd4t4N9dhUkz5G4U= Name: res/menu/log_submit.xml SHA1-Digest: rxGA9EsEgMMsl4FbewMeXKJyMTY= Name: res/menu/local_identity.xml SHA1-Digest: TJYkQb/JH6dHdmcQHfGCke96cmU= Name: res/drawable-mdpi-v4/abc_switch_track_mtrl_alpha.9.png SHA1-Digest: QhKzfQqaMjEUNLGmR/QjnJ0PWe4= Name: res/layout/notification_action.xml SHA1-Digest: JmRjtkOSBAI3rsHo/PoIRtsj2y8= Name: res/drawable-xhdpi-v4/ic_badge_24dp.png SHA1-Digest: G9nZTCoNM7ie0lZLXF8gK7O34PE= Name: res/drawable-mdpi-v4/ic_emoji_nature_activated_dark.png SHA1-Digest: EMpCxgETUVL4ZUAnoRdLf3aCN6k= Name: res/drawable/abc_tab_indicator_material.xml SHA1-Digest: HLMNWYzS8Xr2+cGXFiCZarvGfLw= Name: res/drawable-hdpi-v4/ic_visibility_off_white_24dp.png SHA1-Digest: Ee1fJ0/c+3gTtFZObRlZN6iG1F8= Name: res/drawable-xxhdpi-v4/abc_ic_star_half_black_16dp.png SHA1-Digest: pj+V2r2pJOgJwGGNpeqxnykl0Nc= Name: res/drawable-xxhdpi-v4/ic_menu_lock_dark.png SHA1-Digest: 03Mv6ahkfeQYPbwTCNFniVzRa3w= Name: res/drawable-hdpi-v4/ic_message_black.png SHA1-Digest: MTfDuKQgatE5sG87kXcLreYWyMg= Name: res/drawable-xhdpi-v4/sms_system_import_icon.png SHA1-Digest: IAmHCAxi+fY3FkaMMeciB5ijY04= Name: res/color/text_color_secondary_dark_theme.xml SHA1-Digest: FcQtMrYBHKUcrsrYAJtGmMi4wYU= Name: res/drawable-mdpi-v4/ic_backspace_disabled_dark.png SHA1-Digest: H5+tE8X57E9mXFocXcA2hEo0+f8= Name: res/drawable-xxhdpi-v4/ic_lock_white_18dp.png SHA1-Digest: Kt/G+GU5idOPr2lY6h7w+DEv6p0= Name: res/drawable-mdpi-v4/abc_text_select_handle_right_mtrl_dark.png SHA1-Digest: Su848yQo1YikW7QsiNSK72I0OiY= Name: res/layout/conversation_list_item_view.xml SHA1-Digest: n97/uRTwX6TNoaWizjfLy8ehXWM= Name: META-INF/fdroidserverid SHA1-Digest: qOTzsGoP5INTEonrAW6n9b7mr+E= Name: res/drawable-xhdpi-v4/ic_group_grey600_24dp.png SHA1-Digest: Lr3KbNyfIHhtS8LsvIQUgd5PJKw= Name: res/drawable-mdpi-v4/list_selected_holo_light.9.png SHA1-Digest: nPWNtANp5FoH4n/kEIShr57wI3s= Name: res/drawable-xhdpi-v4/ic_refresh_white_24dp.png SHA1-Digest: N51rcLLXF/W6X5Pq2y5DQhdR/nw= Name: res/layout/recurrencepicker.xml SHA1-Digest: AvGW3h5hKVIh8gMmLOGPzVyLlPQ= Name: res/layout/radial_time_header_label.xml SHA1-Digest: jG/CTw9j1K3lcDFDIgdE5CyoIfA= Name: res/drawable-xxhdpi-v4/ic_group_grey600_24dp.png SHA1-Digest: Z2itXwWg1njYcU7Vx/87vK9U9+s= Name: res/drawable-v11/notification_bg_low.xml SHA1-Digest: Kupt+v67mjNiM4qtFnzAExBwrNU= Name: res/drawable-mdpi-v4/ic_emoji_emoticons_activated_dark.png SHA1-Digest: j5W6WrE76fGRF389dWTaNUyUR4s= Name: res/drawable-mdpi-v4/icon.png SHA1-Digest: bR38XMQJ/yvQLfhVPoKY+UcLYWM= Name: res/drawable-xxhdpi-v4/ic_missing_thumbnail_picture.png SHA1-Digest: 1iK6XuDBSv30IlCHuRdy3ZKossg= Name: res/layout-v17/notification_action_tombstone.xml SHA1-Digest: oohvgUyY9KkKf/x62dUuNKq99sQ= Name: res/drawable-mdpi-v4/ic_done_white_18dp.png SHA1-Digest: 3tzbFFmR3vxyZUfyIQUTGhGl/CY= Name: res/drawable-xhdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png SHA1-Digest: 6HHq6ho9WzMHZQyJ3+YbSbrpNCk= Name: res/anim/abc_grow_fade_in_from_bottom.xml SHA1-Digest: kWfUczBIbB0kTzFgtIQfNc6uPrA= Name: res/drawable-mdpi-v4/abc_ic_star_black_16dp.png SHA1-Digest: Qgvko8tYzI3XirPVbeipvcFF07I= Name: res/drawable-mdpi-v4/ic_dialpad_white_24dp.png SHA1-Digest: /phYMjwLhgWEqFdKp3sf0bZCetY= Name: res/drawable-xhdpi-v4/ic_emoji_nature_activated_dark.png SHA1-Digest: 3qKTC9l9Rgn/vIDiiVg9qEGZJvA= Name: res/drawable-mdpi-v4/notification_bg_low_pressed.9.png SHA1-Digest: sZI/MrQgBXh2aJFcQWzZXWRcBz0= Name: res/layout/recurrencepicker_end_text.xml SHA1-Digest: wXzrOR5iZtN/GsctD/Krbckccls= Name: res/drawable-xxxhdpi-v4/abc_ic_star_half_black_16dp.png SHA1-Digest: l5P17R7tfjGW/U6cw97ToLROGKg= Name: res/drawable-xxhdpi-v4/ic_block_grey600_18dp.png SHA1-Digest: ThyJLvDUQYnunmq8D2/6laaJdWU= Name: res/layout/abc_action_menu_layout.xml SHA1-Digest: whck/Mt3xmSgUFtEnQ+OiTzehFg= Name: res/layout/media_overview_item.xml SHA1-Digest: Zkyp88QoapfkHZKBQoxWNwvj268= Name: res/layout-v13/recipient_preference_activity.xml SHA1-Digest: PachDk/y8n0/Jj7THRp4GKshXUU= Name: res/drawable-mdpi-v4/ic_recurrence_bubble_disabled.png SHA1-Digest: rCUeT9mUua4IT1NK1wuImEuOvdM= Name: res/drawable-hdpi-v4/ic_movie_creation_dark.png SHA1-Digest: HeZenD7UJNHySCebYE7T/ULjL+s= Name: res/anim/animation_toggle_out.xml SHA1-Digest: h5RFa/NEbVssJaJQDR+GOgcbjF0= Name: res/drawable-v21/abc_ratingbar_small_material.xml SHA1-Digest: wPrz0/gmu9ygjwoOdEMFAq9SO+E= Name: res/drawable-hdpi-v4/abc_popup_background_mtrl_mult.9.png SHA1-Digest: Z6SIIC97mku9jiqDCLc6pgfmpn4= Name: res/drawable-hdpi-v4/ic_emoji_places_activated_dark.png SHA1-Digest: NwPCQzO7bnY5CbC66rOJvNyK5Rk= Name: res/drawable-xhdpi-v4/ic_backspace_grey600_24dp.png SHA1-Digest: 7ht7wvyJK0vJfBxK2iJ1af0sBAc= Name: res/drawable-mdpi-v4/icon_cached.png SHA1-Digest: 9qBwDJ7BPNIBC3zXO4Bicuzo2wY= Name: res/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png SHA1-Digest: u7p4+i+MbX5Isql4KGmTM6mrhJ8= Name: res/drawable-mdpi-v4/divet_lower_right_light.png SHA1-Digest: twJYsBFi/eZQzvXXVIMujFr3I3s= Name: res/layout/notification_template_icon_group.xml SHA1-Digest: 6qGSW9wFVndQ13DzZNecTnraDAs= Name: res/drawable-xxhdpi-v4/ic_unarchive_white_36dp.png SHA1-Digest: rF3YHRYfZzIzFX3CHCuhU8yuWR4= Name: res/layout/create_passphrase_activity.xml SHA1-Digest: hN8Af78Y/DR3tvVslR3BOzVVp4A= Name: res/layout/calendar_date_picker_selected_date.xml SHA1-Digest: zpS0QM2B4CzXty9Y5hrPXFeJY2Y= Name: res/drawable/emoji_category_emoticons_dark.xml SHA1-Digest: 11zp4K8bRQx+l2mlZfM0Gni86XM= Name: res/drawable-xxhdpi-v4/ic_search_white_24dp.png SHA1-Digest: JHy06egZz7rzVRiem3CUM66szEI= Name: res/drawable-xxxhdpi-v4/abc_text_select_handle_right_mtrl_light. png SHA1-Digest: zOCXfAxJchHRxMozw8XoHhVJJ3Q= Name: res/menu/conversation.xml SHA1-Digest: hSfHkyXysOtwJJEMx8X1yVNW7xU= Name: res/drawable-hdpi-v4/ic_block_white_18dp.png SHA1-Digest: 3y2ZHGdSmjVtP8PyEQd6Ss+S1SA= Name: assets/emoji_flags.png SHA1-Digest: +csJvSPQ400RI0ujnYElBq3F+Hk= Name: res/drawable/circle_tintable.xml SHA1-Digest: z8l8kMwAv5KMQnIRC+XEP+FC9Sw= Name: res/color/abc_btn_colored_text_material.xml SHA1-Digest: u4U/bWVgc1pHJlW6mCDxZUa/nwg= Name: res/drawable-xhdpi-v4/ic_attach_white_24dp.png SHA1-Digest: Z1lRPPOpob8mxDEUKsmL3h4bRPk= Name: res/drawable/abc_dialog_material_background.xml SHA1-Digest: mLGxn48GAFs7+4j22JOs3ea71o0= Name: res/layout/custom_default_preference_dialog.xml SHA1-Digest: 5nvWqkqbyYLDQhoAsNjl2z76MZI= Name: res/drawable-mdpi-v4/ic_recurrence_bubble_outline.png SHA1-Digest: xD9e+mYD3r++KKOwuVHCB7xzTOc= Name: res/layout-v21/conversation_item_received.xml SHA1-Digest: ReOpCLs5xCUjd8odU8FQz1kuUfg= Name: res/drawable-hdpi-v4/ic_emoji_symbols_normal_dark.png SHA1-Digest: xqJw3AR+/RRR5z9TNwngCdiYDEE= Name: res/drawable-hdpi-v4/ic_emoji_people_activated_light.png SHA1-Digest: k/ZDynZqj37HUstyx1QoGZgr7J8= Name: res/layout/keyboard_with_header.xml SHA1-Digest: wA00i1le3a5Rkzsu26QpDvTUGFI= Name: res/drawable-xxxhdpi-v4/ic_block_white_18dp.png SHA1-Digest: tZn04OM4AjY8u3ZIx4AfhTCX9bo= Name: res/layout/change_passphrase_activity.xml SHA1-Digest: jm/0knHyFdtiPzveSI6NAxp9Rq8= Name: res/drawable-xhdpi-v4/ic_emoji_objects_activated_light.png SHA1-Digest: 4dWl03s0Q3bS4dHBQ1e37GXJNWk= Name: res/layout/abc_action_bar_up_container.xml SHA1-Digest: YB9Q34xo4iOAMJD2OyrUmLDHoTg= Name: res/drawable-xxxhdpi-v4/ic_done_white_18dp.png SHA1-Digest: KUGfV0nSE93yLVYBtZzSzJULZBs= Name: res/drawable-xhdpi-v4/ic_photo_library_white_24dp.png SHA1-Digest: 3xGAmqq7T+1Rz9GezQHGhC+3WQU= Name: res/color-v11/abc_background_cache_hint_selector_material_dark.x ml SHA1-Digest: XEu3fV1TnwtDyw4lIFQ7Itsjbn0= Name: res/drawable-mdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: ZMcwudVDoUT8fuUQX58XOmOX7Qk= Name: res/layout/calendar_year_label_text_view.xml SHA1-Digest: /O2/BvuNy/vUR7Nw2Tr9GAZR9Xo= Name: res/drawable-hdpi-v4/ic_menu_remove_holo_light.png SHA1-Digest: xEu8Zhu8WHensenJ0i8frUqsgIA= Name: res/drawable-xhdpi-v4/ic_delete_black.png SHA1-Digest: Wmcf+HJHP8i85MraoQbpa1QnSEA= Name: res/drawable-hdpi-v4/dialog_full_holo_light.9.png SHA1-Digest: 504Hf96uSL+l0BR84bvm9i98TbA= Name: res/drawable-xxhdpi-v4/ic_group_white_24dp.png SHA1-Digest: t96AuBV2ou+QlUWMgBsZxR0KKtA= Name: res/drawable/contact_photo_background.xml SHA1-Digest: wcH56qoRh/roa5MfCRAUhY5VXOQ= Name: res/menu/conversation_unmuted.xml SHA1-Digest: iGPzWVNCvf+sAJqdMTdIpoAM4UA= Name: res/layout/design_navigation_item_header.xml SHA1-Digest: J2mqonDhWjJsKM5KGR7MNEsL25k= Name: res/layout/thumbnail_view.xml SHA1-Digest: T06Ye5dxfHId2W1rPjoJWvkqBkg= Name: res/drawable-hdpi-v4/switch_thumb_disabled_holo_light.9.png SHA1-Digest: Oiup3l4uNF0B12bFkgZ5ZbKU4eM= Name: res/drawable/clickable_card_light.xml SHA1-Digest: KWl99LsBvQRSQgTPb0LNhchkJUk= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_358 SHA1-Digest: VvyTT/9LksUV4HPNbIQ7v9P3pTA= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_359 SHA1-Digest: s/VIZLolJRrHzUwl20EGXxrhYHU= Name: res/drawable-mdpi-v4/ic_contact_picture.png SHA1-Digest: ZCfKulN5bb8ZikHdvhlcqyY9x04= Name: res/drawable-mdpi-v4/lockscreen_watermark_light.png SHA1-Digest: kSry/5rdpYVffPBKS2Yy/krmC2M= Name: res/drawable-xxxhdpi-v4/ic_forum_grey_32dp.png SHA1-Digest: rNQVPXBNhV93dqQ/Fiu5vNvLuBs= Name: res/drawable-mdpi-v4/ic_emoji_objects_activated_dark.png SHA1-Digest: 9PHPrHu/3aQtyxD1+RTbm9cibcE= Name: res/drawable-xxxhdpi-v4/ic_launch_white_24dp.png SHA1-Digest: P59Tq3p+JAxrOryrDqSOJi+TN8E= Name: res/layout-v11/notification_action_tombstone.xml SHA1-Digest: LvDZJkSa4kdT49E6SqH54/rMffQ= Name: res/drawable-mdpi-v4/abc_ic_star_half_black_48dp.png SHA1-Digest: zE/R5xsR97x8GBTk7wQpVwZn2kA= Name: res/layout/audio_view.xml SHA1-Digest: 2ADoSjXlHFHxmqJFwLvinFy0dP8= Name: assets/emoji_faces.png SHA1-Digest: 3iRFxvoz43yD5utC20esxUfeHtk= Name: res/animator/upper_pause_to_play_animation.xml SHA1-Digest: 04mBHR+Cgllch7nL8htY67n82OE= Name: res/drawable-mdpi-v4/ic_delete_gray.png SHA1-Digest: /iJSk3txqIMpR0Sdea7I5/nIgE4= Name: res/drawable-mdpi-v4/ic_clear_search_holo_light.png SHA1-Digest: pOnppS7KXFY3taOIxA+VL/9lAMk= Name: res/drawable-mdpi-v4/ic_menu_lock_dark.png SHA1-Digest: OciK3SpJATGkVfvuSS0zQTJozdo= Name: res/layout-v11/color_fragment.xml SHA1-Digest: yHf3YSStEI41oNH6Dqql6yiXuVM= Name: res/drawable-xxhdpi-v4/ic_emoji_objects_activated_light.png SHA1-Digest: 7hg/qeC1NwPtOHGwK5ewb+ARKUU= Name: res/drawable-xxhdpi-v4/ic_mood_white_24dp.png SHA1-Digest: aATDrQkGwh8G3SL4XUObM4bY3fA= Name: res/drawable-hdpi-v4/ic_pause_circle_fill_white_48dp.png SHA1-Digest: YMalFZPBey4XfYSiNduE3Lqso4I= Name: res/drawable-v21/notification_action_background.xml SHA1-Digest: gFNJlvGPCPdrqikkFXVxi9K4GPQ= Name: res/drawable-xxhdpi-v4/ic_advanced_gray.png SHA1-Digest: VOzt7g2O+/MLQEnTBXew6o2N/T4= Name: res/drawable-mdpi-v4/ic_send_white_24dp.png SHA1-Digest: iRHc4QuCP9H7s2/KnXUDs8sHrwE= Name: res/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.p ng SHA1-Digest: bfZIl6CVmkC/rfSoxwLRIE9yYeY= Name: res/drawable-xhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png SHA1-Digest: 1Ih2zOyUzHfQqptwXGLdPfBUSns= Name: res/drawable/background_pattern_repeat.xml SHA1-Digest: EEgb/vIb0/VFJJgS0/MIpgsTEn0= Name: assets/emoji_places.png SHA1-Digest: m/f0hGfQoPzldCayMIi+KuOkEX4= Name: res/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_000.png SHA1-Digest: VW+74R1Hvl4mKIUXFrQ1+5K+/cE= Name: res/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005. png SHA1-Digest: ZV+bRJxAcgFQ6LcFfSQS0pjmxiI= Name: res/drawable-ldrtl-xhdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: M5uPxBtgV+CMfjCXzk/6+os9DZs= Name: res/drawable-xxhdpi-v4/ic_dialpad_white_24dp.png SHA1-Digest: niV5rPhrG06CAAYbZlmaso9C+8g= Name: res/layout-v16/color_fragment.xml SHA1-Digest: lB1JB9yraLF+r5m5vyr7eduE144= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_373 SHA1-Digest: VeJdhu3EY8wQbzczMbiAueR3kcg= Name: res/drawable-mdpi-v4/quick_shutter_button.png SHA1-Digest: 2FtKBm5m6sU/LXkCiKFqhU9iNgQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_372 SHA1-Digest: 9XbPZyYd/EeHczEcjCTlJ2wquFM= Name: res/drawable-mdpi-v4/ic_emoji_people_activated_dark.png SHA1-Digest: bOl0syyt8YtGvRnYpNjqAOnFihU= Name: res/drawable-mdpi-v11/icon_notification.png SHA1-Digest: 0R2WWMtPDe6EymAwthJIbRcnyz4= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_375 SHA1-Digest: PNdFFZIpo4wtdnnyz/Wp8jU8VF8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_YT SHA1-Digest: +vjLMpF41agFrIHPfcAQNAFz5go= Name: res/layout-v17/notification_template_media.xml SHA1-Digest: iCf+9+sQE4RgdLhM+IWUq5vXtcY= Name: res/drawable-xhdpi-v4/switch_thumb_holo_light_v2.9.png SHA1-Digest: lTaQlla7wJWRfNbx/Hu+VJaDlXY= Name: res/drawable/abc_ic_menu_overflow_material.xml SHA1-Digest: C8lOzyzsDos77nJfisrycpBcUCg= Name: res/layout/badge_widget.xml SHA1-Digest: Foo9DmBJwFE77cIEKxYE5Gb0STw= Name: res/drawable-mdpi-v4/spinner_pressed_holo_light.9.png SHA1-Digest: O8B882Dl2Rt2oOS4plpeX8GCUAQ= Name: res/menu/conversation_mms_group_options.xml SHA1-Digest: 75WeWlg+lziJM4pv6UCGiv8nxtY= Name: res/drawable-xhdpi-v4/quick_shutter_button.png SHA1-Digest: MooO8IzRosO1l7jroeczOIZMyTo= Name: res/layout-v17/contact_selection_list_item.xml SHA1-Digest: xQXlGCgCZ6yfo118S4CvKiagNq4= Name: res/drawable-hdpi-v4/transfer_controls_background.9.png SHA1-Digest: bB3l+bAb+LvTfoWtF9LZilz3X5E= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_380 SHA1-Digest: E0pemWil3+yoXcDS1xZEp8+FN3I= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_381 SHA1-Digest: xZ5XwW7Jz0Hhq9Odxqo803v/5Ws= Name: res/drawable-xxhdpi-v4/ic_mood_grey600_24dp.png SHA1-Digest: TrEPgqLMZ0HTkvWT3Fsjtq1U2Vs= Name: res/drawable-mdpi-v4/ic_menu_search_holo_dark.png SHA1-Digest: mCM1XbeaaQT9LDW69E/m8yVI0PY= Name: res/drawable-hdpi-v4/list_selected_holo_dark.9.png SHA1-Digest: hSLKqpeDDArxDLbgz2eUcpI9DhU= Name: res/drawable-xxhdpi-v4/ic_visibility_white_24dp.png SHA1-Digest: bxaIi7BxLJzQBugWxh4e0S4BfcQ= Name: res/drawable-xxhdpi-v4/splash_logo.png SHA1-Digest: DJhdzzsZnMKXYBKbx/2F1HdjJ5Y= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ZA SHA1-Digest: MDbMTzJv7V7nvzivSW18VLtR6Ls= Name: res/layout-v17/conversation_item_received.xml SHA1-Digest: EXfi52n9T5OfD2VlPWwxWF5zGcs= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_385 SHA1-Digest: 800patLGNib6NsjVJcV7fh1yw1A= Name: res/menu/conversation_secure_identity.xml SHA1-Digest: SjTQDbxCR22ZkNvp2zoRjJdGXj8= Name: res/drawable-xhdpi-v4/telephone.png SHA1-Digest: x1+9Kjh+KyB5te9ykHhx1ZmZyUI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ZW SHA1-Digest: XJvwF0HzX3D/vt0YWBE9fDUaR64= Name: res/drawable-xxxhdpi-v4/ic_send_secure_white_24dp.png SHA1-Digest: xB8flOZLpwaCmv+8xCCq9BXKpAo= Name: res/drawable-mdpi-v4/abc_text_select_handle_right_mtrl_light.png SHA1-Digest: Fn9hoN8NVPqsAyN/H4QnXfMFpHM= Name: res/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png SHA1-Digest: I0mWJRAs02Uqa4cRGnhl0DCYnV8= Name: res/drawable-xhdpi-v4/ic_action_warning_red.png SHA1-Digest: XVJGgjYUTuNrKHUV8n2l95KDwI4= Name: res/drawable-xhdpi-v4/spinner_pressed_holo_light.9.png SHA1-Digest: l07AAjv4APfDSMj2gVcl4QIryn4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ZM SHA1-Digest: /g5ZwRrbhNlGJMPdpLYKeT4t61Y= Name: res/drawable-v21/abc_ratingbar_indicator_material.xml SHA1-Digest: TaCO4rsv95JHS3RML2c940eQ9U8= Name: res/drawable/abc_cab_background_internal_bg.xml SHA1-Digest: OpZTAPON/eHCLK5xEp9Ei2cska4= Name: res/layout/conversation_item_pending.xml SHA1-Digest: nooD6q7K9R3KibkZT0hYC2X0OC0= Name: res/drawable-mdpi-v4/ic_missing_thumbnail_picture.png SHA1-Digest: LJRLxFzzaZa2Oflozl2B3m/jl4M= Name: res/drawable-ldrtl-xxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: IsziyF2OBzAviNmnk3+DRoNCmAA= Name: res/drawable-xxhdpi-v4/ic_info_outline_white_24dp.png SHA1-Digest: U09I+1Jg2gjdjMrIofJjietJQ7c= Name: res/layout-v13/select_dialog_multichoice_material.xml SHA1-Digest: qt6tjVkKv4OpiJSnVVsh/3YlFTQ= Name: res/drawable-xhdpi-v4/ic_recurrence_bubble_outline_disabled.png SHA1-Digest: dEBKH2kB71bXNj5gEuYAB8XzOug= Name: res/drawable-mdpi-v4/sms_selection_icon.png SHA1-Digest: mJ+FIMWmluLTgfVkc8h5fkAwBoU= Name: res/drawable-hdpi-v4/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: qRCYZUzk2ijqbaq6h2ixzc8HbFg= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_855 SHA1-Digest: GFR3JT2vrXUV4AaCWsbkvT1AlX0= Name: res/drawable-mdpi-v4/ic_emoji_objects_normal_dark.png SHA1-Digest: bFOFdrV1PcYRI65aFXkfYM9OIuo= Name: res/drawable-hdpi-v4/abc_tab_indicator_mtrl_alpha.9.png SHA1-Digest: XUUeghiBJli27nxrwf5sxQ8N90c= Name: res/drawable-xxhdpi-v4/ic_call_white_24dp.png SHA1-Digest: C/IBlA9xde2di5j14wAyOnlqcA8= Name: res/drawable/abc_ic_clear_material.xml SHA1-Digest: PVn2E2PoeX3lHIOKqSVS61kIGmg= Name: res/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.pn g SHA1-Digest: /HAj2ZcakO1w66fyAe8GERxXwXk= Name: res/layout/conversation_item_received.xml SHA1-Digest: 5zUW5qPxJ3jySZXLTjoXqJDh4r0= Name: res/drawable/abc_list_selector_background_transition_holo_dark.x ml SHA1-Digest: fAkCuPln1zmCTatmP9A40U4lWak= Name: res/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000. png SHA1-Digest: Eve5+sY3kLylSmhDHmYnvjkZAps= Name: res/drawable/clickable_card_dark.xml SHA1-Digest: oEQHpgloj5YJZTiKGjP26F3EVak= Name: res/drawable-xxhdpi-v4/ic_emoji_recents_normal_dark.png SHA1-Digest: tgKx3liU6pxYwNWGnbyv5D/Czno= Name: res/drawable-anydpi-v21/design_ic_visibility_off.xml SHA1-Digest: zGvQADjKorrDtblDDeg+FD7MgFo= Name: res/drawable-xhdpi-v4/ic_backspace_normal_light.png SHA1-Digest: 9k6zQKR7o4w+qSjIuJGCRkAwQ+g= Name: res/drawable-hdpi-v4/abc_scrubber_control_off_mtrl_alpha.png SHA1-Digest: ayEN/y2/KZk92Zl774asitbOxNY= Name: res/drawable-xxxhdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: prowKilSHEAkLy2yRWje7IyMm2k= Name: res/drawable-hdpi-v4/ic_textsms_black_32dp.png SHA1-Digest: T1b4tBg9BfOzxxEg5zIb90C6M+Y= Name: res/drawable/import_export_item_background_dark.xml SHA1-Digest: cuztEmqbDw0+hjuQvpxQ5S+7z/8= Name: res/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png SHA1-Digest: kOF2VzVE6Z/WMHMU96aVNFLvUgk= Name: res/drawable-hdpi-v4/abc_text_select_handle_left_mtrl_light.png SHA1-Digest: JweLCjivdDkQIw/RDW237ctDdhA= Name: res/drawable-xxxhdpi-v4/ic_send_white_24dp.png SHA1-Digest: VJhy6vM0Wd7zLNSXmW5UJ0fiBC4= Name: res/drawable-xhdpi-v4/ic_movie_creation_dark.png SHA1-Digest: qFrKM25Y6qZQfSutjcCOI0U2nj8= Name: res/drawable-mdpi-v4/ic_visibility_grey600_24dp.png SHA1-Digest: IeExyS3cXlzMiSUr9M8L4tHef5k= Name: res/drawable-sw600dp-xhdpi-v13/ic_backspace_normal_light.png SHA1-Digest: JvEQ+dN6zZ+vNjuF4JNOiUFIEQI= Name: res/drawable-xxxhdpi-v4/abc_ic_star_black_36dp.png SHA1-Digest: m00Wj6Inxz/EKEeNQdJaHcF1hy8= Name: res/drawable-xhdpi-v4/ic_content_copy_light.png SHA1-Digest: tyiYOAvb1Pj2PkkR2KEECSm6iR4= Name: res/drawable-hdpi-v4/switch_thumb_activated_holo_light.9.png SHA1-Digest: CctxDSFOgITRJNMJX0mhtDzP4DE= Name: res/drawable-hdpi-v4/ic_emoji_emoticons_activated_dark.png SHA1-Digest: mxD0E+98fWCc8W65aC8ifthwl7U= Name: res/menu/conversation_muted.xml SHA1-Digest: oLlQ6zDh6JjQ3GcyRwCj5hFIHLU= Name: res/drawable-hdpi-v4/quick_shutter_button.png SHA1-Digest: AJ/I4nSNNjmjqQlpgJ1t93h2aps= Name: res/layout/country_list_item.xml SHA1-Digest: 5/z34addyDwgm8fiRrEEt8My/KM= Name: res/anim/fade_scale_in.xml SHA1-Digest: BGInYJ2dY+FwSHntv4EVZBJwXyI= Name: res/color/done_text_color_dark.xml SHA1-Digest: ZO32dm0XbbkLZ53hbG/m5fIEIPU= Name: res/layout/calendar_date_picker_view_animator.xml SHA1-Digest: XMknXL4ZPfacp06vBrvpWdGEgpw= Name: res/drawable-hdpi-v4/notification_bg_low_pressed.9.png SHA1-Digest: hlGgjwCibYSJn0dDvquLScOoXss= Name: res/layout/three_keys_view_leftright.xml SHA1-Digest: 3Zvdz1WMTx1gWMF1H6PIlTmH67g= Name: res/drawable-hdpi-v4/ic_recurrence_bubble_disabled.png SHA1-Digest: SF/O/d5wRLKs974J+KyU0q/gia4= Name: res/drawable-hdpi-v4/ic_menu_search_holo_light.png SHA1-Digest: bzg6ZIQFerI0gya11Ew4hH/lGn8= Name: res/layout/design_bottom_sheet_dialog.xml SHA1-Digest: MQHSSV5PkRdnhGb17LD8cgzm3WM= Name: res/drawable-xxhdpi-v4/ic_emoji_people_normal_dark.png SHA1-Digest: KfDQHtfO71TYmuwZVmajJOc6Mew= Name: res/drawable-xhdpi-v4/ic_photo_camera_light.png SHA1-Digest: 6LlVOreCblgzk/5Rj9Y7yOfH0G0= Name: res/drawable-hdpi-v4/ic_photo_library_white_24dp.png SHA1-Digest: 7QUTeWjJwNF/UW6h8VnnzmzjhHI= Name: res/layout/abc_action_mode_close_item_material.xml SHA1-Digest: J3ykV+zggY5f/fs0BNDqNYo7RQA= Name: res/drawable-xhdpi-v4/ic_content_copy_dark.png SHA1-Digest: 8IU/BwID29XOawGRqYad3rzMmpU= Name: res/drawable-xxhdpi-v4/ic_info_outline_dark.png SHA1-Digest: YjCmtV6QEFdYlXMB6H8OlYSYkf4= Name: res/drawable-hdpi-v4/spinner_pressed_holo_light.9.png SHA1-Digest: 5Tb20GpfyWPdfk68H93Ix+I70zE= Name: res/layout/design_layout_tab_icon.xml SHA1-Digest: OpgFVS39nmdZdRaCD4FzFLJt5h4= Name: res/drawable/item_background_holo_light.xml SHA1-Digest: uzat/IohpDi38vClmuzzWAe4jzg= Name: res/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png SHA1-Digest: sORfnhpPIEXLnh57veYnu5sMZD0= Name: res/drawable-xhdpi-v4/ic_backspace_disabled_dark.png SHA1-Digest: 9pEICN2PFZBO2rIgSYABn+Pu/Hg= Name: res/layout-v11/notification_template_big_media_narrow_custom.xml SHA1-Digest: DMo9YNwCiB5C0JnhlBJHZPL/PYE= Name: res/drawable-v21/abc_btn_colored_material.xml SHA1-Digest: Exeq8outkyCU3j4roUcAlNp7sYk= Name: res/drawable-v21/avd_hide_password_1.xml SHA1-Digest: 4YaBUn+peG7+cOkgZp0Zim5sCNk= Name: res/drawable-xxxhdpi-v4/ic_download_circle_fill_white_48dp.png SHA1-Digest: Dlun14V1F9MsfUVX4BJnFUy45is= Name: res/drawable-v11/notification_bg.xml SHA1-Digest: shqaU1xo6CnJHjS9n6uJU/+iDWY= Name: res/drawable-ldrtl-xhdpi-v4/ic_send_white_24dp.png SHA1-Digest: /XfzuAyMpTd4oRq967TmSMPFQoE= Name: res/layout/notification_template_lines_media.xml SHA1-Digest: 5jFV9mECqvwlwK/2rFI2E2lZFbM= Name: res/drawable-mdpi-v4/ic_refresh_white_24dp.png SHA1-Digest: T+dpNJOBOOXzJWpfpGz56lse084= Name: res/drawable-anydpi-v21/design_ic_visibility.xml SHA1-Digest: cZ/iOJiTHcK5pMXO7FqvaQ+pJGU= Name: res/drawable-mdpi-v4/abc_textfield_default_mtrl_alpha.9.png SHA1-Digest: QAKVB+ymS1bLJVZt/mVSPtEVFH4= Name: res/drawable/abc_btn_radio_material.xml SHA1-Digest: npSvWgijFi0d2VFF3dOZmjf+WBQ= Name: res/menu/conversation_callable.xml SHA1-Digest: ov4Os4DCSxUfWkbgOaDMX7H0mic= Name: res/drawable-hdpi-v4/ic_advanced_black.png SHA1-Digest: qsBeW8x58ZtILedlYH0pENyVK2o= Name: res/drawable-v11/emoji_category_people_light.xml SHA1-Digest: XJvG+zF28Yhvy0FkN8iONtG7u60= Name: res/drawable-mdpi-v4/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: fnkne9XWnuqM1yhMI+5Xc4n/ET8= Name: res/drawable-hdpi-v4/ic_emoji_people_normal_dark.png SHA1-Digest: x75kXO/dKZkftrHJ/90e+0iI7hI= Name: res/drawable-xxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png SHA1-Digest: DjgjddBKSH0OILJhqJkZXAYKmKg= Name: res/layout/keyboard_text_with_header.xml SHA1-Digest: Wv6BkNDNRiSE283YBFco4mR1gRk= Name: res/layout/transfer_controls_stub.xml SHA1-Digest: MX3Bo85Lp6Uf92KqntyrIFCQBWU= Name: res/drawable-xxxhdpi-v4/ic_keyboard_white_24dp.png SHA1-Digest: gN2uflFTrjbwxYFgNyxkQcEn7rA= Name: res/drawable-hdpi-v4/ic_backspace_normal_light.png SHA1-Digest: N34S904roS41hC3ClAToTJcqMMM= Name: res/drawable-hdpi-v4/ic_emoji_nature_normal_light.png SHA1-Digest: YJItxsRUeM8R8PpwH1uR1hxGWdg= Name: res/layout/calendar_date_picker_header_view.xml SHA1-Digest: ikveS6qboRdIDe5drG6q0/N+5R0= Name: res/drawable-mdpi-v4/design_ic_visibility.png SHA1-Digest: vetC9sqO4mgRjqLU13g5Rr/b+zY= Name: res/drawable-xxhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png SHA1-Digest: fWFzmRTvlhVZBzFAxTslbjQMJB4= Name: res/drawable-xhdpi-v4/abc_ic_star_black_36dp.png SHA1-Digest: ingvV99yU8o+utOuZ5On3REh0eY= Name: res/drawable-xhdpi-v4/ic_message_white.png SHA1-Digest: 6QpdcrrdXT6uAoawekcL1qni0Rc= Name: res/drawable-mdpi-v4/abc_scrubber_control_off_mtrl_alpha.png SHA1-Digest: Fjutt+gOkVGWRcWFLVw0yec4eGI= Name: res/drawable-sw600dp-hdpi-v13/ic_backspace_normal_light.png SHA1-Digest: xf5MwAWNNleSEorv2eI4d4oDxpU= Name: res/drawable-xxhdpi-v4/ic_account_box_dark.png SHA1-Digest: GsvbfizRDzbjjlC2VqxNCKayJP8= Name: res/drawable-hdpi-v4/divet_lower_right_dark.png SHA1-Digest: VgCDvu1t6hJk+F+dB7G/n8QTmC8= Name: res/layout-v16/centered_app_title.xml SHA1-Digest: n8KeQr1Oq7xk9uh5LaiQ0XwDCSY= Name: res/menu/conversation_insecure_no_push.xml SHA1-Digest: dZ99AatYbWrR+cuB4JuVHsLP5NA= Name: res/drawable-mdpi-v4/ic_scroll_down.png SHA1-Digest: 4UMDad9KZsBP08coQFbKrKfB1/c= Name: res/drawable-mdpi-v4/ic_delivery_delivered_dark.png SHA1-Digest: +hzNAViX2sH/Oq4hYo/Jzt/MBRE= Name: res/drawable/abc_item_background_holo_light.xml SHA1-Digest: ku9bJ9xYD07lS3GZhes5DH5hi7U= Name: res/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png SHA1-Digest: Bj6BC2+QG7pc8RQwt/bo9WgmUR0= Name: res/color-v23/design_tint_password_toggle.xml SHA1-Digest: wUyUHwcmGGXYL1JhhWMPQVcf7hA= Name: res/drawable-xhdpi-v4/ic_keyboard_grey600_24dp.png SHA1-Digest: ba6IHgRRfJ/4OZW2nznn9Ult9m8= Name: res/animator/rotate_minus_90_animation.xml SHA1-Digest: BuCc2mfyfzB/zJMaWWncVTSkoKM= Name: res/drawable-hdpi-v4/ic_image_dark.png SHA1-Digest: qDeccgIB1ZI6/06LmLZXRSm7bac= Name: res/drawable-xhdpi-v4/textfield_disabled_focused_holo_light.9.pn g SHA1-Digest: 5B5Y1sO935jPXP0SPaRMQdqzKvI= Name: res/layout/abc_popup_menu_header_item_layout.xml SHA1-Digest: y7fngb40bLUvCDoa8o2mc8LIJYk= Name: res/drawable-xxhdpi-v4/ic_pause_circle_fill_white_48dp.png SHA1-Digest: vzFzfQyNuhT89eChnal9tspeZsg= Name: res/layout/database_migration_activity.xml SHA1-Digest: z2yG2IDG8qxFlDIH7WygJ0zpdBs= Name: res/drawable-xxhdpi-v4/ic_volume_up_light.png SHA1-Digest: NT00jhNGLZ8Ny6I9bu2iaKmKylQ= Name: res/drawable-xxhdpi-v4/ic_circle_fill_white_48dp.png SHA1-Digest: WPdnScLoZXZq+BEx6sPmZiWl/dE= Name: res/layout-v17/conversation_item_sent.xml SHA1-Digest: MdzA2rieMwL44pCYA0CAQVc2SIA= Name: res/drawable-xxhdpi-v11/icon_cached.png SHA1-Digest: wJmPO5ZEOtTfYuF9/SjfEaakBdQ= Name: res/drawable/conversation_item_sent_indicator_text_shape.xml SHA1-Digest: BRZnbgGgP3/B4STOWiLHH0vbjKk= Name: res/drawable-xxhdpi-v4/ic_emoji_nature_normal_dark.png SHA1-Digest: jTPG18ir5W9htOIOpBCbFcZTAYE= Name: res/layout/video_player.xml SHA1-Digest: BuhNr7gl0JYIYva/P680FXCcprQ= Name: res/drawable-mdpi-v4/ic_backspace_normal_light.png SHA1-Digest: 7VNPeLEkk2fyRK2W095OIRZMMzQ= Name: res/drawable-xhdpi-v4/icon_dialog.png SHA1-Digest: T6mC39+Vb3aCPm8yTBOP0NXGcQY= Name: res/drawable-hdpi-v4/ic_search_holo_light.png SHA1-Digest: p8qeQgU+yMu9uC9l9d7sbEe0Ots= Name: res/color/recurrence_spinner_text_color.xml SHA1-Digest: KTMnjr+S6JCNPl2ruEYIIyJz260= Name: res/drawable-xxxhdpi-v4/icon_cached.png SHA1-Digest: BaH7d8VCsdzlxLuHsLX2q03DMd4= Name: res/drawable-hdpi-v4/ic_brightness_6_gray.png SHA1-Digest: ubRcZzc8X01gK0oBc4Og9MbuGpY= Name: res/anim/design_bottom_sheet_slide_out.xml SHA1-Digest: uTMw35lL6zfB58m4Npj1tkUwCKs= Name: res/drawable-hdpi-v4/ic_advanced_gray.png SHA1-Digest: PxHyaAavt/4FvSsD8I/KNTuoJZo= Name: res/drawable/abc_ratingbar_material.xml SHA1-Digest: dQYfnGBvF3NoNPyyD+NZnOWv73w= Name: res/drawable-xxxhdpi-v4/ic_photo_camera_dark.png SHA1-Digest: CNrxIWMbfMY4NawJIA3cDetDbww= Name: res/layout-v21/abc_screen_toolbar.xml SHA1-Digest: kDSm4GXLsz8OR1YX8n5lOFpNdUY= Name: res/layout/date_picker_dialog.xml SHA1-Digest: XyKMjo6lj4DuLnXlicH5pmbLScg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_979 SHA1-Digest: j0a3fBIi4xm5fCnN17oIGM+vnVg= Name: res/drawable/white_radius.xml SHA1-Digest: fmmwZ1xdiLKhbP7MVdTnY4KFGjc= Name: res/drawable/abc_item_background_holo_dark.xml SHA1-Digest: M0YVK8Qdk4ReRL9EAtEpVn58SLc= Name: res/drawable-hdpi-v4/sms_system_import_icon.png SHA1-Digest: kNjRatrvrZpV6kUpHfzc0mJ/SsY= Name: res/drawable-hdpi-v4/ic_push_black.png SHA1-Digest: sXEmWFhqjKFEWipqYB7tksawnDo= Name: res/drawable-hdpi-v4/ic_emoji_flags_normal_light.png SHA1-Digest: ZzWFcSV91qSF87GEePVsoqGaERM= Name: res/drawable-xhdpi-v4/abc_list_longpressed_holo.9.png SHA1-Digest: /HDLqKYSwxPWi6ihR75E/oot/mo= Name: res/drawable-xxhdpi-v4/ic_done_white_18dp.png SHA1-Digest: EDnKomUUnHQkMR2vV+OeoARosfQ= Name: res/drawable-xhdpi-v4/ic_textsms_black_32dp.png SHA1-Digest: NLdDR4CnBtbMUoNizjcRlymkUmA= Name: res/layout-v17/abc_select_dialog_material.xml SHA1-Digest: LcFH8UCfUCySOA9qwS2tde6YwTo= Name: res/drawable-xhdpi-v4/ic_push_registration_reminder.png SHA1-Digest: AwNzKs1sDdaRBwXEFxCZnMWF7K8= Name: res/drawable-xxhdpi-v4/ic_send_white_24dp.png SHA1-Digest: rRzu5B41HRdv1XCPH3CuWYOvjbY= Name: res/layout/conversation_activity_emojidrawer_stub.xml SHA1-Digest: t1a8C6MNcoHCQIVqcvozm7/mkuQ= Name: res/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_015.png SHA1-Digest: HgH+EY9WJEVfAXnClDsismo2FSs= Name: res/drawable-xhdpi-v4/ic_add_white_24dp.png SHA1-Digest: 2jueTHnQvZ8Vcp1RBEddwYmfIPI= Name: res/drawable-xhdpi-v4/ic_clear_white_24dp.png SHA1-Digest: yHUv19dhuyxVD7h9zgxetxzXdqY= Name: res/drawable-xxxhdpi-v4/ic_photo_library_white_24dp.png SHA1-Digest: f9ooqjuRjc2RhyRz8OrwLDiUzZo= Name: res/drawable-xhdpi-v4/abc_ic_star_half_black_16dp.png SHA1-Digest: ax5FNeazE4MliK4rtD/ZdnnN0e4= Name: res/drawable-xhdpi-v4/notification_bg_normal.9.png SHA1-Digest: VLNXFzqJn8hvw7NJ233yGma3RqA= Name: res/drawable-xhdpi-v4/ic_check_normal_light.png SHA1-Digest: gIPk0Pkh6BrTqBMHlIMxsy/fsIM= Name: res/drawable-mdpi-v4/ic_archive_white_24dp.png SHA1-Digest: Rr1ExUM306gRaqOSv4HKaV1Xi24= Name: res/layout/psts_tab.xml SHA1-Digest: o9imNXCn5LOJeFwUrKL9ym55zsc= Name: res/drawable-mdpi-v4/ic_emoji_flags_activated_light.png SHA1-Digest: zPy1Pc8+rE9Q8U/4XTf7EoBImLA= Name: res/drawable-hdpi-v4/ic_audio_dark.png SHA1-Digest: ROtOY9puzFiwgnK/NvE8YMfAK7s= Name: res/layout-v11/conversation_fragment.xml SHA1-Digest: Zrf7tBSSnWPkuZHmbTbumTdPWxM= Name: res/drawable-hdpi-v4/ic_app_protection_black.png SHA1-Digest: 76+U2Q62sJTzGwKBKxY3kZU8FWI= Name: res/drawable-hdpi-v4/ic_select_all_white_24dp.png SHA1-Digest: ZBW6w3UxvJRfJPrPZa1Udvx+mQ8= Name: res/drawable-xxhdpi-v4/ic_photo_library_white_24dp.png SHA1-Digest: MvZIueYnCMLN3w1vmKlzt7oRsZU= Name: res/drawable-mdpi-v4/ic_recurrence_bubble_fill.png SHA1-Digest: uiFiU8hCp8NzsUz+JXg/L5MRlKc= Name: res/layout/conversation_item_last_seen.xml SHA1-Digest: 99xLTy2kmZYjpoUuhkydWVW4UNk= Name: res/drawable-xxhdpi-v4/ic_advanced_black.png SHA1-Digest: 28gSkjtuEf65ZxhL1pPtc/oDqVA= Name: res/drawable-xxhdpi-v4/ic_recurrence_bubble_fill.png SHA1-Digest: ZSo/QYJ1szMc8WeMUxkJEkrh6Sg= Name: res/layout/contact_selection_recyclerview_header.xml SHA1-Digest: Fbz73NjxKw6n9EpmxRB7nv90lFA= Name: res/drawable-xhdpi-v4/ic_emoji_symbols_activated_dark.png SHA1-Digest: O6dw8MJmqbt5cVBfJwXjy9dl4Jw= Name: res/drawable-hdpi-v4/icon_lock.png SHA1-Digest: gf6covsCZXb38rxel/tOWhblXqU= Name: res/drawable-mdpi-v4/abc_list_longpressed_holo.9.png SHA1-Digest: jaCqE8RSPyJL2tSTf5ctOZ8Wkp8= Name: res/menu/conversation_insecure.xml SHA1-Digest: Bm4eGsmeWu2cWVDKzmcMJwOpaPY= Name: res/layout/three_keys_view.xml SHA1-Digest: QL+LQf6misGBfzokK3irE7HAkIs= Name: res/layout/time_picker_view.xml SHA1-Digest: q/a8HhO/XF2hxtrnk0SZbS8s1X0= Name: res/drawable-xxhdpi-v4/abc_popup_background_mtrl_mult.9.png SHA1-Digest: nM7eMb1IwRTSPeCUiRnPcn3CGRw= Name: res/drawable-xhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png SHA1-Digest: /UEK2xt/qrP3cCJflXSymHBKVrQ= Name: res/drawable-hdpi-v4/ic_delivery_delivered_dark.png SHA1-Digest: BVRTpt53DaJq8WorS14Mdsp2670= Name: res/drawable-xxxhdpi-v4/design_ic_visibility.png SHA1-Digest: pQ76Wd1817QL9Sc+XC/CD/ujbJk= Name: res/drawable-xxhdpi-v4/ic_call_split_white_24dp.png SHA1-Digest: wUanQMuGbW1mCBtd3BnTXMjQORY= Name: res/color/abc_secondary_text_material_light.xml SHA1-Digest: iShyfcc7mAW3Tmgrd7lTpEv94XA= Name: res/drawable-hdpi-v4/ic_emoji_people_activated_dark.png SHA1-Digest: woeh8Cf2QpEZQAUd2FWii6p8cEs= Name: classes.dex SHA1-Digest: up9o7kkx86uz0555YiFtqj2Keoo= Name: res/layout/abc_screen_content_include.xml SHA1-Digest: Qy4yTXeEqDx3ZNR+CxiliBg224M= Name: res/drawable-hdpi-v4/switch_bg_focused_holo_light.9.png SHA1-Digest: Uu0jDWQm42BXRa5E8t530Qt9aEI= Name: res/drawable-hdpi-v4/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: 9HmgRLugE7XLFQSCcDKTHa0FfIU= Name: res/drawable-xhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png SHA1-Digest: MRB8bfz87PDQFDWGNEetiXxTiwY= Name: res/color/abc_hint_foreground_material_light.xml SHA1-Digest: dU+09ohh1nGXdVn1YwT5kYY75b8= Name: res/drawable/switch_thumb.xml SHA1-Digest: IvXGnToGPmtHHStuwCl0CRw2CMk= Name: res/drawable-mdpi-v4/abc_list_focused_holo.9.png SHA1-Digest: P0wooDvrgcWxD6FuObhOb0leW5c= Name: res/drawable-mdpi-v4/ic_audio_dark.png SHA1-Digest: OkAdHB8vHceQc1gdyZ7SSMpOsjI= Name: res/layout/conversation_item_pending_v11.xml SHA1-Digest: u5JGoq0fZR2sCq+V4MwzeILpgwU= Name: res/drawable-hdpi-v4/ic_unarchive_white_36dp.png SHA1-Digest: A4dD2i++rUvQSqqhVEzLaBtFEAI= Name: res/drawable-xxhdpi-v4/ic_photo_camera_light.png SHA1-Digest: qVaGtedXyxNPp742wVrf0auwnPw= Name: res/drawable/done_background_color_dark.xml SHA1-Digest: klD8Om4Oyhxq25J/tEWVEWUlndE= Name: res/drawable/abc_ic_go_search_api_material.xml SHA1-Digest: yZz8O2XObxIk4l71uBM6N3jIgjw= Name: res/drawable-xhdpi-v4/abc_textfield_default_mtrl_alpha.9.png SHA1-Digest: wxS5Do9e7cCh/fgOCbgTwd/ZeDE= Name: res/drawable-xxxhdpi-v4/ic_badge_24dp.png SHA1-Digest: l+ZgxeTzG/JHg5kXG3JELU7eC2s= Name: res/color/switch_thumb_material_light.xml SHA1-Digest: 1POjnvuNvl/u8Sw0L4NVAn2aqDY= Name: res/drawable-xxhdpi-v4/ic_push_black.png SHA1-Digest: QFqUhx4kdTHTt7iTwQmAq1sTZFg= Name: res/animator-v11/rotate_minus_90_animation.xml SHA1-Digest: uBdoND/8IkPM8vaObJcyA86WNN0= Name: res/drawable-ldrtl-hdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: nqxFTHIyt1k31oTQzMBPMAnZrEM= Name: res/color/dialog_text_color_holo_light.xml SHA1-Digest: fjQQlGjoz6OJxVoLGckSMA2HUxs= Name: res/drawable-xhdpi-v4/ic_menu_lock_dark.png SHA1-Digest: QZH/9M43JN2CCsxUok8sZSJG9Vw= Name: res/drawable-xxhdpi-v4/icon_dialog.png SHA1-Digest: 7htL/8mxE7HuKjrIiEujDYbhXZ4= Name: res/drawable-mdpi-v4/ic_check_white_24dp.png SHA1-Digest: 7qddwVwLSbaqFPK2dT/svB0LhvU= Name: res/drawable-hdpi-v4/ic_save_white_24dp.png SHA1-Digest: InR15xj1S9NvTQQK+HFLXcsp/3g= Name: res/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_015.png SHA1-Digest: lhisDaprlUhlQTH+gRzBgtywArM= Name: res/drawable-hdpi-v4/abc_text_select_handle_left_mtrl_dark.png SHA1-Digest: rGE2d1k3CHBN3WEhJb2tWHl+aew= Name: res/drawable-xxhdpi-v4/switch_bg_disabled_holo_light.9.png SHA1-Digest: eBiELWDEVXjgDCShBHc8oAEmt+c= Name: res/drawable/pause_icon.xml SHA1-Digest: 1E0vzmWI1PnSBr5lNWo+Uj2DSnI= Name: res/drawable-hdpi-v4/ic_keyboard_grey600_24dp.png SHA1-Digest: geIXrNdM6qH9T37/duVF7NMT/MA= Name: res/drawable-xxhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png SHA1-Digest: CwBgZCf6HQH3oXQJ4vFliod7poc= Name: res/drawable-hdpi-v4/textfield_focused_holo_light.9.png SHA1-Digest: G+sjjsHiKMXPwXhMYcjptrXj5oc= Name: res/drawable-hdpi-v4/ic_movie_creation_light.png SHA1-Digest: CTk9Kqz4dTOKyZo43Z/Y9HaD7QU= Name: res/drawable/recycler_view_fast_scroller_handle.xml SHA1-Digest: SdRfCp+VhZO6lfe8HeZXlw0zYSs= Name: res/drawable-v11/emoji_category_flags_light.xml SHA1-Digest: ttQ2nNvjn9Pj39Q83yk2TJnYG5w= Name: res/drawable-hdpi-v4/switch_bg_holo_light.9.png SHA1-Digest: 84PBAh8/+LjExDRXzcAPH20FsL4= Name: res/drawable-hdpi-v4/ic_emoji_people_normal_light.png SHA1-Digest: /FqXRAc9eO3Tjk4s0SDzY9/l1wU= Name: res/drawable-xxhdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: KU5BEai+yKGXvI7Yk2+h3Ehn27Y= Name: res/drawable-xxhdpi-v4/abc_text_select_handle_right_mtrl_dark.pn g SHA1-Digest: MUn5sC0GfdFC4B7Ip1/TmztPQtg= Name: res/drawable-xhdpi-v4/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: x+Boa0yvhikp6dlPQH9/d26D60I= Name: res/drawable-xhdpi-v4/ic_notifications_gray.png SHA1-Digest: RHlQ/YPTlJWX50ainCEmbH8pgBQ= Name: res/drawable-hdpi-v4/telephone.png SHA1-Digest: MxX6VeK/T9XSe84OU42SBnzNieM= Name: res/drawable-mdpi-v4/ic_emoji_symbols_normal_light.png SHA1-Digest: 0azrRyQA/jmzM9lZPrhNhAFsD6M= Name: res/layout/country_selection_fragment.xml SHA1-Digest: Jc5OXlKL+7GgqXpkjMZR+rNJnLQ= Name: res/layout/number_picker_dialog.xml SHA1-Digest: Le726FpY12LCbDIm6GilXPFp+bE= Name: res/drawable-hdpi-v4/ic_visibility_white_24dp.png SHA1-Digest: AIFMF1dUX+iPlFX1UKe26p3qYYE= Name: res/drawable-v21/avd_show_password.xml SHA1-Digest: 5fCv+tkbIcgxieAGqs/ocKfepwA= Name: res/drawable-xxhdpi-v4/spinner_disabled_holo_light.9.png SHA1-Digest: 8gTbh5GWm8YanJkaogk407hMRAg= Name: res/drawable/abc_vector_test.xml SHA1-Digest: Nt9ckQDkCsYP2/LnUbJXmZv47z4= Name: lib/armeabi-v7a/libcurve25519.so SHA1-Digest: KYDdvdHDfH7wsXCmAa0/oDfTujQ= Name: res/menu/conversation_add_to_contacts.xml SHA1-Digest: QpUdRBt5UvIttq4lXdJyhp/2/RU= Name: res/drawable-sw600dp-hdpi-v13/ic_backspace_disabled_dark.png SHA1-Digest: VIxaGhgY+mSZKn1s31TESzn4DnM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LK SHA1-Digest: xvUg1ayJgz+trzgBfPMAXKkxhfA= Name: res/drawable-mdpi-v4/ic_visibility_white_24dp.png SHA1-Digest: q+X4gJgIMywD2Qz4G2+t5m5cxWA= Name: res/drawable-mdpi-v4/notification_bg_low_normal.9.png SHA1-Digest: Tnovl3GT2HHDBF1rlU8FPMsFpFA= Name: res/anim/design_snackbar_out.xml SHA1-Digest: fenowEI7s0OCQ7vzkP4haFTfB0I= Name: res/drawable-xhdpi-v4/ic_search_holo_light.png SHA1-Digest: FYvtYtw7d0ihu+BJKrRT7cqElJQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ER SHA1-Digest: Zdar+UL4xzdPQFt8dymAV+TfKwc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ET SHA1-Digest: /7J0J8WsgoOnz0nPfD0pAP8tGRc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ES SHA1-Digest: vO0+zuCILnYVGkdZTI/yNQSiMR4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LS SHA1-Digest: TgChEH00iWOw/4ZwmfgaKxrl6n4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EE SHA1-Digest: KvNmjHwk3dibtusK0UDPMueINoA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR SHA1-Digest: TMP0kr7CCX4rjYLxiKQAU1Wy1I4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EH SHA1-Digest: i24PgAgIVDhrmQ7zJsi1Tzwqk2I= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LU SHA1-Digest: HFO/p3FN3pqLbNDCaiXGieoLkp0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EG SHA1-Digest: oBabLZVIr24yhTlvIFLSUX9bGJI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LT SHA1-Digest: O/aISF2KQ2YXXPzzAnj/Qa3ViWg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LV SHA1-Digest: u7TnNLiTdTLDGu+v/kmweHT+MUE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LY SHA1-Digest: 3+EmMQaxwyc6MZoGT+6rI02KZnQ= Name: res/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_015.png SHA1-Digest: WCxduGC4/DHy03gNcIJSUEhQ28c= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EC SHA1-Digest: zPdyT97JKATonTxe7DGzFrLWaWs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA SHA1-Digest: KJoYmXEaBb/Lxaclv4aGQ6ZFAuA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MC SHA1-Digest: N0bWepyN5iWxuFlQNcAmaDGIRs8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD SHA1-Digest: G4PBmYaSDCyh/H+j/ghK2tX1hkw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ME SHA1-Digest: A8fjREffOU/zRBa5k02sVQjVvSg= Name: res/layout/notification_template_part_time.xml SHA1-Digest: LJb6bTMCYfMEF2qojVDiwIByprc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MF SHA1-Digest: ssuj/nWsAEEgbvmiD0lsIpCBRyE= Name: res/drawable-xhdpi-v4/ic_emoji_flags_activated_dark.png SHA1-Digest: +zOuSsFclhdcXHPhMp+42LgVol8= Name: res/drawable-mdpi-v4/ic_notifications_gray.png SHA1-Digest: 9eTMiewLGszMh0/QlBRqNfpi5RA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MG SHA1-Digest: t/2u8WW/YD++w2/vPANcZ8+bur8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MH SHA1-Digest: Pz3fbPeydh347yUkhnNODvX6hcE= Name: res/drawable-v11/emoji_category_emoticons_dark.xml SHA1-Digest: neGf9sfFwfZUmeK88rdNTn5VED0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DZ SHA1-Digest: OtKC5aNOYAusXeHTP01if/cBrlg= Name: res/layout/recipient_filter_item.xml SHA1-Digest: VUgdDdrc1IRnokXxcJhoEPy786k= Name: res/color-v23/abc_tint_seek_thumb.xml SHA1-Digest: IHjcOy8VwmGnfwQ8JwFcmWZVDDU= Name: res/drawable-xxxhdpi-v4/abc_ic_menu_share_mtrl_alpha.png SHA1-Digest: inKiiAaRqdYVz1OEfHB1GSgHGIg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FO SHA1-Digest: RGoqbxlX5EUZSPBF2+t08I8/jSc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KI SHA1-Digest: JpPpGDQXig+8TN7NxZgasg1ruaM= Name: res/layout-v21/notification_template_icon_group.xml SHA1-Digest: FQRV2YCzjKJGEsAwMn+JjMqsoDY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KP SHA1-Digest: QgBLukuMEssNUiTPgUPRc1bnaDE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN SHA1-Digest: Pz6/VS/F5Xy5F+i5U2QOyl90PXw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KM SHA1-Digest: vpMPjG0F+uX429EgpkO8aldKkMs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FR SHA1-Digest: a1QhUPJBZKLfMW2mqzccjKynwCs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FI SHA1-Digest: pqoxR+GHv88JjfxGVSEwMGxgGFE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR SHA1-Digest: vxibGn2a5MVeHMKC9f3WDx7YQxQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FM SHA1-Digest: iBw584EdcpYewCZM9eqnAEAoRCA= Name: res/drawable-mdpi-v4/ic_emoji_emoticons_normal_light.png SHA1-Digest: WQYTufWjozYfYc1AsHLpdiQQ4JU= Name: res/drawable-hdpi-v4/ic_emoji_objects_activated_dark.png SHA1-Digest: PTW42A8fqBz2RuIzgRxFghdDq+w= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW SHA1-Digest: 4W8tOBau5KRlWkbIcWS6SlGoGUY= Name: res/drawable-mdpi-v4/abc_list_selector_disabled_holo_light.9.png SHA1-Digest: VAWAgM1S6jdrYNnzjAk62DbHpA8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FK SHA1-Digest: 4xr9H2T0u2q9tTPPTA+UCu7HEK0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FJ SHA1-Digest: iBujGNQa9VzoRwcYiX6F0vzTDl0= Name: res/drawable-xhdpi-v4/ic_lock_dark.png SHA1-Digest: ePnd0/QetF3i37z+L8fX4D8MAdE= Name: res/drawable/play_to_pause_animation.xml SHA1-Digest: WBjtPZrdocKlkzf/Oaz+prePgf4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY SHA1-Digest: 03YFHsJFuVtv7/MXuL5EoSFcO6w= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KZ SHA1-Digest: Vik98XodqlUzDlftZvMPsVsLPVM= Name: res/drawable-xxhdpi-v4/ic_emoji_places_activated_light.png SHA1-Digest: ojFTc2I4LWyaz+hlCbtaV322O9I= Name: res/anim/design_fab_out.xml SHA1-Digest: xUTzztkV6DmAqFXiLoefobMOg3g= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA SHA1-Digest: UtIVhBub3YLaRbqe6yFbyWY+6rw= Name: res/drawable/button_background_dark.xml SHA1-Digest: OQDuvQ/O7NGuULqAMaeJVPFLf/w= Name: res/drawable/abc_ic_search_api_material.xml SHA1-Digest: /ppbqOVwWQ1J8clWZbd5QhdHqvU= Name: res/drawable-mdpi-v4/switch_thumb_disabled_holo_light.9.png SHA1-Digest: 6Q0egkPXcET6qWYJbaJnk1GKRsU= Name: res/drawable-xhdpi-v4/ic_emoji_recents_activated_light.png SHA1-Digest: 0/aR7+dXFWcZeERv9BVxvadKcdg= Name: res/drawable-xhdpi-v4/ic_unarchive_white_36dp.png SHA1-Digest: LgbdS76+tG/EFHzyN2nq+xK1uy8= Name: res/drawable-hdpi-v4/ic_lock_dark.png SHA1-Digest: mfKulURcVzJe1lP7MHqEuUoIv3w= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB SHA1-Digest: A47zFpjsEp2oHqVjFZk1nyYwApY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LC SHA1-Digest: YYSZYRoCs99cFSnyVozK5gBFcoY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LI SHA1-Digest: IxcZbMQggJZ3rS6jR/5cy69pLsc= Name: res/drawable-xhdpi-v4/list_selector_background_selected.9.png SHA1-Digest: 36Ws5DFmoLt4ptxx59DL2RNDQ0M= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM SHA1-Digest: gfTHJ7JIvH2FcN/XfII/udV7cCo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GT SHA1-Digest: w4bqh0t2vs7aL/WiwrNT6WarI8c= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JO SHA1-Digest: QCuQvaudkpdmN/dBAGz+sdJxpso= Name: res/drawable-sw600dp-xhdpi-v13/ic_backspace_normal_dark.png SHA1-Digest: qeVeLxFIzDtJH0EBcTdnLQ7kCOU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GU SHA1-Digest: pAyuUdxHxW/PKgKBclYUDwsKPOY= Name: res/drawable-v11/emoji_category_emoticons_light.xml SHA1-Digest: E4KZ1dsCkf8sxgM1ZKhNwq9BF78= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GP SHA1-Digest: a5TY3UmqlDgflovtP2fdJzA6pEw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GR SHA1-Digest: HBNQbfxC/KzzLOmKMQM48SLaL48= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GL SHA1-Digest: aGwRRU75gSEqB76DpdhLH0Xtofw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GN SHA1-Digest: LD08eDpn1LSqgPryFRH3OP25m2g= Name: res/drawable/emoji_category_nature_dark.xml SHA1-Digest: x1c8JXbGKvjf4IXtaKBICjhu3YI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GM SHA1-Digest: /gjxazZapZnNENgsCij3VeHn9B0= Name: res/layout-v21/conversation_item_sent.xml SHA1-Digest: pbM8/s6sL88a9dVFuR+J69jkRmc= Name: res/layout/three_keys_view_text.xml SHA1-Digest: h+bjvII4QuWBdOFH+qtumcSO8Vc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GH SHA1-Digest: UjSi4eufeZoKEzNpsNkT0JYOycg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP SHA1-Digest: SSR+hPZ9s61kX7QfXAtX966+cmo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GG SHA1-Digest: 9uNty6lAftB/f7giJQuzvrXNdcI= Name: res/drawable-mdpi-v4/ic_warning_light.png SHA1-Digest: u1vMXsBaygsm7ZU1o2ULBh426cA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GI SHA1-Digest: ht+QnpDNMdvdw1aoRFL9QVBLL8g= Name: res/xml/recipient_preferences.xml SHA1-Digest: +vst9aS+NsfarDq0EYJPfm1w6B4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GD SHA1-Digest: 5hRI5tVRi+aNtKzdEhXnYlnZZd0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GE SHA1-Digest: 9KzVWZk8A/NeUHePqU749neSgeo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GF SHA1-Digest: xTxouBP3mvzLAtkuIylyErno4b8= Name: res/drawable-xxhdpi-v4/ic_delete_white_24dp.png SHA1-Digest: ToTJe0rPC+51yOcMxUIJK2UQCrw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GA SHA1-Digest: tCQ1ixHgiI6+2py6KCJbrJaP4ew= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GB SHA1-Digest: g1Eb4DVhbm27yVWAs0C0RfHKmmk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE SHA1-Digest: hhxWybR+y1YJams/LDhV7TiqnRs= Name: res/layout-v17/notification_template_big_media.xml SHA1-Digest: zXWQtldpf9zwNEVBWcdN2N8ECF4= Name: res/layout/icon_list_item.xml SHA1-Digest: +hJCdR7mOUblkQr1DPdMI/uVIUA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG SHA1-Digest: c6dA5Pv9A55r1JYqhJuVtkrTQ3w= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH SHA1-Digest: gnM2PhW3SsRXuVJdcweloUK25Tg= Name: res/drawable-xxhdpi-v4/ic_keyboard_grey600_24dp.png SHA1-Digest: 71c0wkotfKgiVtUV5pSOk8Yxmas= Name: res/drawable-xhdpi-v4/ic_video_dark.png SHA1-Digest: gAfbndEESreJ2VMxsPLWhaQgx0Y= Name: res/drawable-hdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png SHA1-Digest: N0JreKvhlyMPBSf34DQond465n0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN SHA1-Digest: dzikC814fHA5FBIDVvYqjMfqXVQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IM SHA1-Digest: xEQJah46A1zC6FRnLhSSyhT2ApE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL SHA1-Digest: spjtV2zUrIL9JCb6SxUGcqwlXnk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HU SHA1-Digest: hiJid172D5b/yJ7aRcUnEUmlviA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HT SHA1-Digest: 6prl9nP9LulRjv1H4O7XSbhIdEc= Name: res/drawable-xxxhdpi-v4/abc_ic_star_black_48dp.png SHA1-Digest: 3Enw5tpILSKRTE47u38wsuHunBw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HR SHA1-Digest: PvTEEEpzEHP4YkdLq2jah8jZ3PE= Name: res/drawable-xhdpi-v4/ic_attach_grey600_24dp.png SHA1-Digest: dqjM1i80e/WZQt9+ivpn1HfepUk= Name: res/drawable-xhdpi-v4/ic_emoji_flags_normal_dark.png SHA1-Digest: aeFtQ2/DII4N35QshPIQSc9uGR4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HN SHA1-Digest: Ig0hgK32Cb1R4EtULlC7iBzY9gY= Name: res/drawable-xxhdpi-v4/ic_archive_white_24dp.png SHA1-Digest: PHczos0QcABX65YfRO/syErB4fo= Name: res/drawable-mdpi-v4/list_selected_holo_dark.9.png SHA1-Digest: t3gAnIT+AzQuQiC0J6HKptJhyA0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT SHA1-Digest: BXQa475MixzA/WHNEtEDyDkwxvQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS SHA1-Digest: iOYe7R9H2it3zfXOrSB51/nD43Q= Name: res/drawable-xxhdpi-v4/ic_group_photo.png SHA1-Digest: fEpeqS0uEBAKP5aLnnshyvAF/vs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR SHA1-Digest: LGNYDJdrySYvLVZbVR0zaLmruH8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HK SHA1-Digest: o/wKdkwQhz+hy4ErMiAoZv1Cw0M= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IQ SHA1-Digest: LQsMTV6YeGQ2NLDk13e4WOst9WY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IO SHA1-Digest: jR144GfBKUf8gV5R43c3k3rrNWk= Name: res/layout-v16/notification_template_custom_big.xml SHA1-Digest: KGbdcn1yUGxa4t9YC/Sh0WbtxuY= Name: res/drawable-xxhdpi-v4/ic_emoji_flags_normal_light.png SHA1-Digest: O5Auy59UiqkF7JkxK2Mrno1oY7o= Name: res/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_000.png SHA1-Digest: JjQKi93lV1YYH5MBZnohvbiJq3o= Name: res/drawable-mdpi-v4/ic_info_outline_white_24dp.png SHA1-Digest: rP3GXC5OLK1Fq5gEV//uGjxLFfs= Name: res/drawable-mdpi-v4/ic_photo_camera_dark.png SHA1-Digest: qsOkxexBIxDLCb9YTbMjKvv+y4Y= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JE SHA1-Digest: +nuIxQw6Yy7X4VT8csg3TbRsaso= Name: res/drawable-mdpi-v4/ic_emoji_nature_activated_light.png SHA1-Digest: GbE0vJgtzLLaX5m+zN7odPdJYeU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GY SHA1-Digest: JB4kcjLRupWKPLtH5t9ldviypos= Name: res/color/abc_btn_colored_borderless_text_material.xml SHA1-Digest: j7/lbt9HBfjrDGK6fL0EPmGwe1E= Name: res/drawable-xxhdpi-v4/received_bubble.9.png SHA1-Digest: lRkGDA4EzxKSjWgS/YcYGg9439Q= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GW SHA1-Digest: vcGsJHow6MVDu0Lji2JyVXdqjC0= Name: res/drawable-xxhdpi-v4/ic_audio_light.png SHA1-Digest: SO4y6nHCuojyG2d0FMlOtPu7Dr4= Name: res/drawable/last_seen_divider_text_background_dark.xml SHA1-Digest: XCTGK2lgiB+eOOFDixpc9pV4VkA= Name: res/layout-v11/custom_default_preference_dialog.xml SHA1-Digest: eSFfc9ed+WiY/Qww/nUHAE6U0mk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HN SHA1-Digest: cwMXeyaFRSBfPIyMvOTmt6KgSDM= Name: res/drawable-mdpi-v4/switch_bg_holo_light.9.png SHA1-Digest: peyvmv7NaxWpuLuoG2od8vf2QRU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AC SHA1-Digest: vIN3CttxrwPdAm8LEVzU4YpPSaA= Name: res/drawable-xxhdpi-v4/ic_notifications_gray.png SHA1-Digest: /m/AUbkxcdLI5dOBEswBzrLp8EM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AD SHA1-Digest: nRlB4W/DiPwwm9sKc4HOjrzoO5Q= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AE SHA1-Digest: ++6EG1jMumZ2UY3DsKsxhBBRsFg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR SHA1-Digest: Wt+zmOIQ08rJiw9cOy0Vz/MIqzU= Name: res/animator-v21/design_appbar_state_list_animator.xml SHA1-Digest: 50Dn3r1oXTLsMWULaUrUJuF6nPw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AF SHA1-Digest: z+1jWPywDDplv2dcHD4Irq91Ink= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AG SHA1-Digest: aJDSKP+g9lnCmAdhOw+oABROOiQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HT SHA1-Digest: CjU4H9LGnAdt4DnS8ldypm7b/mQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HU SHA1-Digest: zQluiYuJHBeF0akgyxmaSresyPg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AI SHA1-Digest: PK7Uc59oaW/qXE9U8T7IpEvpy1s= Name: res/drawable-hdpi-v4/ic_forum_grey_32dp.png SHA1-Digest: UHT9ShIpeHLykgEROozQy3xzShU= Name: res/drawable-hdpi-v4/ic_emoji_recents_normal_dark.png SHA1-Digest: dRR7oZdxhfC/XeN8ZwLoXy3Z3wI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AL SHA1-Digest: n6P0ZKfI1ChKdN0sdxmdnqRlSEU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AM SHA1-Digest: /dy7DbdyOq8VY+DuUiTpXTgrrqA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK SHA1-Digest: JMIy+xiPxeHnhMYL0uA5LbQ53Nk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AO SHA1-Digest: kFAU6/4S8vlMD6jE9VwiPAmbzAE= Name: res/drawable-xxhdpi-v4/abc_ic_star_black_16dp.png SHA1-Digest: n+HinWLESEjbz+LSJ3hFDhs1hsI= Name: res/anim/design_snackbar_in.xml SHA1-Digest: 6+HyUPWWyECHhvkn7FfU/SL24MA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ID SHA1-Digest: D1U+SYrU0I44sl+7t/yIy0YFu9M= Name: res/drawable-xhdpi-v4/list_selected_holo_dark.9.png SHA1-Digest: ddkFXkinX/KLQzbgj+uBDgSBNFU= Name: res/drawable-xxxhdpi-v4/ic_volume_off_grey600_18dp.png SHA1-Digest: 9nDlHIGm8wI0pVXGz3YjzpfveLU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IE SHA1-Digest: 6a5/hyzdWz2DOkVqPUFVF1juCDs= Name: res/drawable-mdpi-v4/ic_emoji_objects_normal_light.png SHA1-Digest: 8bIMp6ZGnSnKqvsqfHGF9H7IgwY= Name: res/drawable-mdpi-v4/ic_delete_white_24dp.png SHA1-Digest: z6KzQKHtFcbcmozOSn6HHLwaz8c= Name: res/drawable/abc_list_selector_holo_dark.xml SHA1-Digest: sfvAyXGl6drAr6es0R11c9d9BWE= Name: res/drawable-xxhdpi-v4/ic_emoji_flags_normal_dark.png SHA1-Digest: sJlblRDOGWvtx1he8SCgTQ6+d5Q= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BD SHA1-Digest: Sd9O4ZZ3sBJVxtp61RQSoMAoNpg= Name: res/layout/recipient_preference_activity.xml SHA1-Digest: nI+GgTFzDD5vtF7KMDrb8EhWU8s= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BE SHA1-Digest: 1FeBETP5tcQ+rKO2HTOUgkMA8Xg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GP SHA1-Digest: +AHBCvaMUwR5WR8ScZ7DF+fJfyw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BB SHA1-Digest: 20VuKO6cHZ1qH/bUD1e/fkU2DxY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GM SHA1-Digest: iXchZ5Ka/Tk+qVgTFvaCopIYO1g= Name: res/drawable-hdpi-v4/ic_forum_black_32dp.png SHA1-Digest: BmY3i7e9T0Ro2n9Ngq8dLbf4xKQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GN SHA1-Digest: 77m+Qpu01kiBk7oJ/r2iZK/2bfU= Name: res/drawable-xxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: cVnySG63cChr86Xl5aTin9ET16o= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BH SHA1-Digest: GO1tkKUHBn+2CU9V4yyS4HbQ6wI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BI SHA1-Digest: CDgPaufb53sX5LjRnO1qJPfAeB8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GT SHA1-Digest: zvE7DK/SMpGIz/43zTCcPsuSiak= Name: res/drawable-xxhdpi-v4/ic_volume_up_dark.png SHA1-Digest: dd3uIJyggz/MJzm4RKtXZhjy/s4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BF SHA1-Digest: FG5EUq6fZH8fT/LSeNN0EXcbIlc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GQ SHA1-Digest: 6c0GWsj9cqC30fwEc8BaLCAU1ak= Name: res/drawable-xxhdpi-v4/ic_emoji_symbols_normal_dark.png SHA1-Digest: yD3rsfn6iwOXaqSx+MIrVWJPLmQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BG SHA1-Digest: T+U7wCqZXSdix7+z1qPuCVxJ2jw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GR SHA1-Digest: AEHSrwsbyJ4H2vWSsYzLeyMXXhg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BL SHA1-Digest: ZuPRnQsFHTZWAzasmr+PfmgHq4k= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GG SHA1-Digest: pZPb/GbfmcFApldxhbfJlYKSbzI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BM SHA1-Digest: 31BpK6j6vY+dtbny3rj9k3PPVao= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GH SHA1-Digest: Obhc2qkx9ApiLjwjjRjeokZ/62o= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BJ SHA1-Digest: 4nM/3Uj3CBj2bJP/JwEDJPDxceo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GE SHA1-Digest: hY0YLU+5ACIRQ+92Bew22sXk03o= Name: res/drawable-hdpi-v4/ic_emoji_objects_normal_dark.png SHA1-Digest: +ELSno8p0YtqY+96A7MujNJi6ak= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GF SHA1-Digest: dO1yTJErRVAiQcLOB+T2ODVTeUs= Name: res/layout/share_activity.xml SHA1-Digest: Zh+yENYe4VAyNPssbwyFNUc9rF8= Name: res/drawable-mdpi-v4/ic_volume_up_light.png SHA1-Digest: aGwUsIMK4xipGLuaa+boq3rKmYg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BQ SHA1-Digest: TnaPSzSpwAJn3ZPig2YW6GAPU/A= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GL SHA1-Digest: sIgUqCcJiuWlsHwDUnGMvhmRgRA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BN SHA1-Digest: Djr6w42RtkSMKmIm3ZIMpbdIE0o= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GI SHA1-Digest: JLk3lgpICTHwNDEBXTRH/mWfBTg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BO SHA1-Digest: sxOe0MG6Pmg+YSk39kGbyRFNZ0U= Name: res/anim/slide_to_right.xml SHA1-Digest: 0bv28EjFYG0W9O86/FUEyVGaIDc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AT SHA1-Digest: oRS1jsJ83kKRsBrluWNrhbUXCls= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AS SHA1-Digest: p3jgCy3MqbH7l74OUev4NFimlqU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AR SHA1-Digest: k5/KeZoUIUKgjU9R/xpSG+rmTLY= Name: res/drawable-xhdpi-v4/lockscreen_watermark_light.png SHA1-Digest: 6lUHGvK7lN2atKOLCJlnvLhmeqI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AX SHA1-Digest: au5xw4Yhh3VSBRfAarRWUY1taTw= Name: res/drawable/conversation_item_header_background.xml SHA1-Digest: PkBtM4IfjAPJkWt/w+fC0XhKS5c= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AW SHA1-Digest: Fg/Imi/ZuwIgx8sXqAA8vbGz96Q= Name: res/layout-v11/conversation_list_fragment.xml SHA1-Digest: nSxfEzUUdkF4DsI87dXk4NAFW7U= Name: res/drawable-xxhdpi-v4/ic_send_secure_white_24dp.png SHA1-Digest: yM6Azpc4M0EQy+FKt/rEfZeTJ3Q= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AU SHA1-Digest: rNtriWF1bPuAzY6yT3tFywuvk78= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GW SHA1-Digest: tHYoWIo8foBpEPEiNe2PijXNE/I= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AZ SHA1-Digest: m9gma0XyqBhVujW4lEH8nHnpqM0= Name: res/color-v11/abc_background_cache_hint_selector_material_light. xml SHA1-Digest: vGI9qWZK86UPRnOAjUVBBgxhqoM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GU SHA1-Digest: WIWb4bRf3ipdNJBLq1zGXXHp2gA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BA SHA1-Digest: xl4bGHzTb1ONkQLxPjEsAmoBzj0= Name: res/drawable/emoji_category_places_dark.xml SHA1-Digest: Q9uMQ9IMOgzG5UHP4aZYv447Q0I= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GY SHA1-Digest: sVW5c2OBdc+R5QjGDn+pF9Ol39A= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CG SHA1-Digest: 49h7UcYYHZoInHM3E1miwqOYVYA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CH SHA1-Digest: p/TKBsfWqdiCPs8HHP/E/mPcfao= Name: res/drawable-ldrtl-v17/actionbar_icon.xml SHA1-Digest: Yy7GfAlLoeD86LGaO6/AyLJjuC4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CI SHA1-Digest: jyCDgLt/DZjar3UUKN3BDuazdVY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR SHA1-Digest: GTFH7TPPnk4kanUvtsG26CI3o1w= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CC SHA1-Digest: YOCUZ6W2OQRQBoQ1x+iyz9KuWeY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CD SHA1-Digest: gOjV58VpYgEFLCbdpOMvxHoKBZo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FM SHA1-Digest: h3m8uP8ZgphBtIf9P9857Jpwz3M= Name: res/drawable-hdpi-v4/ic_done_all_white_18dp.png SHA1-Digest: Voh4CAWcsOvG8zcGCHeDggnuO7Q= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CF SHA1-Digest: 5GGJE/y+2T8OjL3JM2MdOeyadDA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO SHA1-Digest: zdp8+9dsFOhc6t740lFqWb2ANjI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CO SHA1-Digest: 9MEc79rZITKNDzE/dwvOtCdTyqo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FI SHA1-Digest: jiBuaN4YG4PTv1veIxmvIG3TBfA= Name: res/drawable-mdpi-v4/notification_bg_normal_pressed.9.png SHA1-Digest: ahL1IX+Xa3VHwxUrKeuJQsGU4Rs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ SHA1-Digest: 65CaqQeneDMGoYSvhEvr8Q3ahew= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CR SHA1-Digest: sHfKGnXc4597cZdkX/uncowbW9c= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FK SHA1-Digest: tQpvHJid1sXnyHukmw6JaXIqmAY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CK SHA1-Digest: oT97kWguQsQJUswJcgE0cApkNpo= Name: res/drawable-xhdpi-v4/ic_scroll_down.png SHA1-Digest: 7mUXwCPFIDWuZ07Ho64JPZ10CEw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CL SHA1-Digest: iyE9q0jmA6cMek4EEo2yYBzZwoI= Name: res/drawable-xhdpi-v4/sms_selection_icon.png SHA1-Digest: wtrkdTQokfokr8L6uunormQ+5wA= Name: res/drawable-mdpi-v4/abc_textfield_activated_mtrl_alpha.9.png SHA1-Digest: LHgpBq22Tp/Uz7G6kTktjBB334g= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CM SHA1-Digest: UXzV02+ZbeZUahJeWjmBbvZrsEk= Name: res/drawable-xhdpi-v4/abc_text_select_handle_middle_mtrl_light.p ng SHA1-Digest: Q0JBWav3MG5gImPSBRDnr4igoT8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CN SHA1-Digest: UxIDGc1/Zsp7w3r8ayBpFcZ1Yeo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BW SHA1-Digest: CCPodHb3OXMU0phUndEdai3juLQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB SHA1-Digest: zwgwhzdgPiYe5GB75F5qikhL5BM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GA SHA1-Digest: mXTJ4JekKj83uzLUQ8GGZBRUx0c= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BY SHA1-Digest: mkIJ8Fnk2cwqunSzdN9oC7jeUKI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD SHA1-Digest: Tun1XnwGDHmR+zKcQOQUIAjK1Dg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BS SHA1-Digest: 11/QVxGwVGuN+tnb08ZAKRI2NJI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BR SHA1-Digest: 2Owu+rFtvtUqgowSakSIoXHXJ94= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BT SHA1-Digest: 8imG/8/yP5TVi7PC1lTjMn5m6zs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CA SHA1-Digest: LBQOBivyXTVPF5s9ec6DJIBUIuQ= Name: res/drawable-xxxhdpi-v4/abc_ic_star_half_black_48dp.png SHA1-Digest: vK8qEx+zPuCHitVVR+eyI1+y5S8= Name: res/layout/empty_time_zone_item.xml SHA1-Digest: uV3ERXa4BnpJU2qMX0278dny67Q= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BZ SHA1-Digest: CYVN63xJfXvDfB3Fqb9w8k74beM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DJ SHA1-Digest: nuoH5PgiCiqrHM2XgcckrZip6Rg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DK SHA1-Digest: keAd6yGDc5xreI60W5rbVEJTlMA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ER SHA1-Digest: 2B1bVCxBlyzCrhcwatJGXx4bJ+A= Name: res/layout/country_selection.xml SHA1-Digest: xAbtwp5RvpUqcs1VfEnelzP82hA= Name: res/layout/dots_text_view.xml SHA1-Digest: r2xnC1LIQwvev9hzjc4fbI+A2cM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DE SHA1-Digest: O6u5x7R23j22KmNHKTBjwELbeUA= Name: res/drawable-xhdpi-v4/ic_emoji_emoticons_normal_dark.png SHA1-Digest: gvYfcoP514wtkhSreB6JDJczoZ8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EG SHA1-Digest: QZfrehcNtoXOprJx2oKpTGYIkpg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EH SHA1-Digest: jMI99XT9IAcD8cWLnqhLySm7A4A= Name: res/drawable-hdpi-v11/icon_notification.png SHA1-Digest: FoRvCNK1ST0VgA8svxNX/EHXCas= Name: res/drawable-sw600dp-mdpi-v13/ic_backspace_normal_light.png SHA1-Digest: rXM6Yx12bhYdJ0eMIoZCItQ5Cx4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE SHA1-Digest: xyVERBugEAeC91y4qOmi9i8/o2U= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DO SHA1-Digest: jyNFaTKAVoAUCuDfVYCqZKgtx4Y= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC SHA1-Digest: VB1SSVwrv98pDqOPCTb7EKe9n/s= Name: res/drawable-hdpi-v4/design_ic_visibility_off.png SHA1-Digest: nkWvioUMjHczslPxcZZEyMkNViU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DM SHA1-Digest: KsHr4Ck3ZQln5ARS24zr+eVPxW4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CZ SHA1-Digest: ijxHfP7jkZp2P4mqOvmjZaWEORI= Name: res/drawable-mdpi-v4/received_bubble.9.png SHA1-Digest: x4/fSsrwLvIKbFtRM1k+uNrk6VU= Name: res/drawable-mdpi-v4/ic_image_light.png SHA1-Digest: qNmSEg+M63Ml3A51KLqsi4HIZd8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CY SHA1-Digest: ey6pjSYCIMI1FGXZQBrErXsLjIY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CX SHA1-Digest: iopB/+UJdyMuO+btbjm0X7ucaU0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CW SHA1-Digest: kRauL45KgJDW7izSTVtZz4p0ckc= Name: res/layout/contact_selection_list_fragment.xml SHA1-Digest: F4B1cmfBX1/iK16sEezJ2nGQxeM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CV SHA1-Digest: ZRkhuoOG2zs4dQ+RLfk406ZdpmY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CU SHA1-Digest: 4o+E5+gf3D1OOscHX8atbcy0kck= Name: res/layout-v11/notification_template_big_media_narrow.xml SHA1-Digest: oQnOkQJ8yn9gKNhR/QObx+1BzOU= Name: assets/fonts/Roboto-Bold.ttf SHA1-Digest: j1hyrMHyDgMGFiAB3rrPXhTUbow= Name: res/drawable/circle_touch_highlight_background.xml SHA1-Digest: o9QlrRMiE0mC1+dmj4+fg7vpBW8= Name: res/drawable-xhdpi-v4/abc_list_divider_mtrl_alpha.9.png SHA1-Digest: ORZEUwpye3vs2cpRUfvVYVg7UtU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ET SHA1-Digest: KYPXyUmVxhsuBMzC9KmijeCbJvs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES SHA1-Digest: MgeYrCD9Qz+kbs3eB9BTpLUsgJo= Name: res/drawable-mdpi-v4/ic_mood_white_24dp.png SHA1-Digest: dvtOkGjMXXW/uAykZXv4pzt/rro= Name: res/drawable-xhdpi-v4/lockscreen_watermark_dark.png SHA1-Digest: 0c85wNc0nV5Zztf7GsYMc7SKJTI= Name: res/drawable-mdpi-v4/lockscreen_watermark_dark.png SHA1-Digest: M0xsGNyKiuHwaBCCuPvJDCgOWgA= Name: res/drawable-hdpi-v4/abc_text_select_handle_middle_mtrl_dark.png SHA1-Digest: QmeO4XUWQssq7UOePsOcCnXMg80= Name: res/drawable-xhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png SHA1-Digest: kXL/oF0Wug/Gk2tR7sFuSTOQNZU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DZ SHA1-Digest: isb4iyWWPmCc4KaLPdAbG9LxUGI= Name: res/drawable-hdpi-v4/ic_volume_off_white_18dp.png SHA1-Digest: GaIIaoCJBoGZlHMg+T2u3TA3DtQ= Name: res/layout/receive_key_dialog.xml SHA1-Digest: umAL3zCxRPVhCLGnBBtyN3B/E/c= Name: res/drawable-xhdpi-v4/ic_emoji_flags_normal_light.png SHA1-Digest: lnap7s6+mfZWSa/l952QIfrjfU4= Name: res/drawable-xhdpi-v4/check_dark.png SHA1-Digest: wCknIutQ7PCuuGL3szqt8X3y6BY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE SHA1-Digest: veS2qCnXv2CIdekpR8wVY7S0YRg= Name: META-INF/services/com.fasterxml.jackson.core.JsonFactory SHA1-Digest: Ba5fEoE3Fm8wW/CHD7Agsn0j4D0= Name: res/drawable-sw600dp-mdpi-v13/ic_backspace_disabled_light.png SHA1-Digest: vkntS8T2+of7dvX5DqAoEZGa4a0= Name: res/drawable-xxhdpi-v4/divet_lower_right_light.png SHA1-Digest: AoEdVMbc2iqKwEMnSYBrDuGKNTU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM SHA1-Digest: MuSZ6z//YxaDeXfh9p7jLHN9jtA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK SHA1-Digest: QNYeeXfrzF2M3AHD8PH0lSFfBpQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DJ SHA1-Digest: TjL2tm/WEHORBFpPSB2iKzLin0w= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO SHA1-Digest: 4MQzhxGPh2UvA2hEAOmKuLmLjVg= Name: res/drawable-hdpi-v4/lockscreen_watermark_dark.png SHA1-Digest: jRk++D87ZgQBkJ2HLWlABxkEJJQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CR SHA1-Digest: djjUxEw6P+Un0fNmuek0Wj/unAg= Name: res/layout/abc_screen_simple_overlay_action_mode.xml SHA1-Digest: 5in0sNUsZqh4AJN6Pw4SP4w5RCg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CU SHA1-Digest: L4fGEd2b36x3B/ZkBQIPZrkxYFs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CV SHA1-Digest: 8oINpdPA1tfwd1xtwYLwl+JKJQM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CW SHA1-Digest: gxOB2dDgOPmp7DX7PY18i/keSY4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CX SHA1-Digest: ptOqYyu8NkyFsRkZKnSnBZ6zuzE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CY SHA1-Digest: SgfYT+e2ABNPV5gK+yC5VwknWyE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ SHA1-Digest: lMkate/GlFryo0WNt7Ds6eNKf0w= Name: res/drawable-xhdpi-v4/ic_launch_white_24dp.png SHA1-Digest: J4dUVgCgynf3FrSuG7+a6bU9mAc= Name: res/drawable-xxhdpi-v4/ic_arrow_forward_light.png SHA1-Digest: XhNliG5RxtJMFSBDJpJcoL5ZvZQ= Name: res/layout-v17/select_dialog_multichoice_material.xml SHA1-Digest: GBBt+uTGA7oIEPEWpuMqdMpUrUw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA SHA1-Digest: ySdxqBDls0+sF2Mtr7oXInkt2AM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CD SHA1-Digest: 44FmMe2H+uQGUDQWCxQHYmWtEJU= Name: res/menu/text_secure_normal.xml SHA1-Digest: F4X7SCTmX0Sx8aqQfkiGNZg1X8E= Name: res/drawable-mdpi-v4/ic_push_black.png SHA1-Digest: 7JH3YpKYQ89wj3uCww9JJrd/cKg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CC SHA1-Digest: bYV5mRwHKNV3xCqTq3G5S3wWv8g= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CF SHA1-Digest: W5Kaxj3DVMll60RPohluudL9TLg= Name: res/drawable-xhdpi-v4/ic_push_black.png SHA1-Digest: MBM5xqEiJZrPwf4T9dMQM/k96zo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CH SHA1-Digest: PaGyg6lSNaV+FhgV56fYVWsSp0g= Name: res/drawable-mdpi-v4/abc_ic_star_black_36dp.png SHA1-Digest: AkbIo7N/y4oNm7eUJCKzP6fxrhs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CG SHA1-Digest: NxbsruqXH5X1i3jA2NWgjPPXtJc= Name: res/drawable-xhdpi-v4/ic_circle_fill_white_48dp.png SHA1-Digest: Chtzf/JNBEcona4slrfjLZETkLo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI SHA1-Digest: k+ZcuCojRM7JtzU+49D2VbQtC8U= Name: res/drawable-hdpi-v4/abc_ic_menu_share_mtrl_alpha.png SHA1-Digest: rSfiuPx2H1NYOeY4GaO1qwFYRjE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL SHA1-Digest: EWYC041ztRwFr2Xm4lSi8eTLXzY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CK SHA1-Digest: ondrgHu3kQ/vOvsoKJ4ZnTv9MJY= Name: res/layout/delivery_status_view.xml SHA1-Digest: 6BRRUDIendx8RZks9Wb7bxwScGg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN SHA1-Digest: 57BACNq73zhveN70g8Gy8m1/B0o= Name: res/layout/abc_list_menu_item_checkbox.xml SHA1-Digest: 6BtxtrSj5417sUBtS2ccXrol3a8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM SHA1-Digest: btb3rwRKf/TH6qiEeUpx7j8hP+c= Name: res/drawable-xxhdpi-v4/ic_lock_black_18dp.png SHA1-Digest: +hVAizc6fLsbURNGbG9PNMZ+8LA= Name: res/drawable-xxxhdpi-v11/icon_notification.png SHA1-Digest: ut/jwoxWLjvDcTItFRuRYYMHw5U= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO SHA1-Digest: kvllo49+MjSxxsXzyYyAbbwF95M= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW SHA1-Digest: 7fX3UbjaTm1aofpSZ0dl5lHDKkU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT SHA1-Digest: ZPNerUvoDoeRRffvRPouac7IOlY= Name: res/drawable-xxhdpi-v4/ic_emoji_symbols_activated_dark.png SHA1-Digest: Oe6OgCJo8bzjcxo0MkFN6QDNdJI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR SHA1-Digest: 4RdHscY9hoBgTn3t4Z9oZ2dhb8g= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS SHA1-Digest: NWTvV7I25jpEPfSAVWAMloG6d8U= Name: res/drawable-hdpi-v4/ic_unarchive_white_24dp.png SHA1-Digest: SwaIQBYFv+ygqbJYuaoeyC0K3/k= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BQ SHA1-Digest: qvDii2e11KIo9mabPdcfrGte1UI= Name: res/drawable-xhdpi-v4/ic_clear_search_holo_light.png SHA1-Digest: ZmoEnVIiO/dvThjQLwtuajrNDlQ= Name: res/drawable-ldrtl-mdpi-v17/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: 4I3x9UHH+eskJQGXDUb2z+F6rrA= Name: resources.arsc SHA1-Digest: SZyPjShTOLc16yX0OCBeoMLqK6w= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ SHA1-Digest: 90eoTH1FLrCCCEVj6zQdv77LZwE= Name: res/drawable-hdpi-v4/ic_forward_white_24dp.png SHA1-Digest: YYTaVTQihbfmZTG56ilHXaNjsWg= Name: res/drawable-xxhdpi-v4/textfield_disabled_focused_holo_light.9.p ng SHA1-Digest: bpNO5KEKc7d4ScXs/viJJsIhwgw= Name: res/drawable-mdpi-v4/ic_lock_black_18dp.png SHA1-Digest: 2Io9MNnOrhJgjFuMDd5JepnF+6M= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BY SHA1-Digest: hlusA6zV6u+as/nPQWudxi+EAFs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BG SHA1-Digest: zPqZd34GtstxbJGqiQOmOGa/oTI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF SHA1-Digest: XhMVoHAMKx61FgYan9iATpjXhMg= Name: res/drawable-xhdpi-v4/list_selector_disabled_holo_light.9.png SHA1-Digest: GN6V3GwpXHWWT1+XcPJFYRdM3lM= Name: res/drawable-mdpi-v4/check_dark.png SHA1-Digest: Mmk/wQGsPx9qCwuG5XCItkQAUdU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE SHA1-Digest: PThzPqsNKhv6qvi0H9/XBjmSTBM= Name: res/drawable-v12/recycler_view_fast_scroller_bubble.xml SHA1-Digest: NEQxqwQjygZugYFJNUU8ybLfvxQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BD SHA1-Digest: zqr+fnU+QyiKBX1gohtaz8bqvTg= Name: res/drawable-xxhdpi-v4/abc_ic_menu_share_mtrl_alpha.png SHA1-Digest: k2FhN6sjfE6Vf2vHkeQqYXKKIVw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB SHA1-Digest: ZseUhGEUK9ofgYnmSxg6eyHMq68= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BA SHA1-Digest: HZBbXvY5yhwHJcXZvUavCYKSJ9I= Name: res/drawable-xhdpi-v4/ic_emoji_symbols_activated_light.png SHA1-Digest: tioux6wUodj2fXXVQfLAMMDOLJ4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO SHA1-Digest: WjQKJP65IaFuvsONV2pfU/9Xx9Q= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BN SHA1-Digest: MQAWvyb6WAl9Y9Jsro9OsLXY8pc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM SHA1-Digest: t9C26Uoex4q7CQMaTvWaPt1CYtw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BL SHA1-Digest: t2RZ5Fa6IAdcTGQ4w1l2GO+xPvE= Name: res/drawable-mdpi-v4/ic_mood_grey600_24dp.png SHA1-Digest: yePrmpaOitqbCUN/9v8Zw5DAd1M= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ SHA1-Digest: VTIJaH7v5WKM2XQTkB6RlitC5qU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BI SHA1-Digest: M7iEmpuB6P127+E1KBA9gDw1Odc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH SHA1-Digest: lYJDjH1V5r4IgdU9/5sh8cR9pfY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS SHA1-Digest: v+0D3G2lcYzniM5MF6acbNSI0wA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT SHA1-Digest: UEBKvpQ+V1kbUAp7cMUuXIx1Q88= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AU SHA1-Digest: 9OmMFEZiuaPs+0UbiHTj8yZiUaw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AO SHA1-Digest: Sf4t7Pm2Z8QsUU2iGZFbHRLw/KQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR SHA1-Digest: io8Y7Lth6xwkbP2wyFQQ3jH0VxA= Name: res/drawable-xxhdpi-v4/ic_photo_camera_dark.png SHA1-Digest: P2GVmoSvOhdWvxQH5hoRV8BVWxM= Name: res/drawable-hdpi-v4/ic_scroll_down.png SHA1-Digest: hjcZbb4w/B37ElipP9OIQY9mYT8= Name: res/layout-v17/timezonepickerview.xml SHA1-Digest: PU1pS6cdzIRNL3BQfCI/xZpwyDs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AW SHA1-Digest: MsQjiDH7ELCu5ikPZOz1q0MoLzM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AX SHA1-Digest: 9/3rbTTKIDRla/SGyXSpXs4xiZs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AZ SHA1-Digest: vnxwJVaHudcrOZMMihOXhAvy6IY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AD SHA1-Digest: kGr3DKbucyuf5taYSa0pQy3Qoh4= Name: res/layout-v16/conversation_item_pending.xml SHA1-Digest: 999cf8KEPIu3huSjteafAocQEvE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AC SHA1-Digest: KaSYORw7lBd0nuEayNDKf+xYA1s= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AF SHA1-Digest: mVW7BZcOqgD48kwg9vYsYl5RMfM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AE SHA1-Digest: 1WNDTfo5pRtjzhYWHkSWUfBdIwc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AL SHA1-Digest: tCtON8SyAKhTm86Cqe5BPa8uUYw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM SHA1-Digest: osV0gnDAdYG1jYIU9/jYn5DUnkY= Name: res/drawable-mdpi-v4/ic_block_grey600_18dp.png SHA1-Digest: LASlB+CdirTiKoljjDUau/XsTA4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG SHA1-Digest: Q5VezNyRzoOB2NnDorUA6iSJ9R0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI SHA1-Digest: 0+NqbX/WTN35/9eX1ohe0/ZmSxs= Name: res/drawable-xhdpi-v4/ic_account_box_dark.png SHA1-Digest: vjY+yRoWv57mSOllC5kxrEN3Vrw= Name: res/drawable-hdpi-v4/ic_clear_white_24dp.png SHA1-Digest: orS5Gk6WmH9NZSs1ijcs74Dx1sI= Name: res/drawable-xxhdpi-v4/ic_download_circle_fill_white_48dp.png SHA1-Digest: Y+Rs4lxQUsDRMnu2vxYCQURBSAM= Name: res/drawable-ldrtl-mdpi-v4/ic_send_white_24dp.png SHA1-Digest: CQX99LRiRyAaCoTHxWwoepI0OkY= Name: res/drawable-mdpi-v4/ic_lock_dark.png SHA1-Digest: 1w/kkUXbv9MJnbsM463SSV5cMiY= Name: res/drawable/abc_seekbar_track_material.xml SHA1-Digest: DOBvDIvN1gw9U5RRVtBGkfeW8rY= Name: res/drawable-mdpi-v4/ic_call_split_white_24dp.png SHA1-Digest: 8qL2gvSfUYlK4oyZ04vPGuorCmg= Name: res/drawable-mdpi-v4/ic_emoji_places_activated_light.png SHA1-Digest: ZhyqtFVMpNmbesgTdjHuEDUNDmA= Name: res/layout/abc_list_menu_item_radio.xml SHA1-Digest: CYF8DGDu/tGrm7bhmsGCFVCBKJ4= Name: res/drawable-mdpi-v4/ic_emoji_places_activated_dark.png SHA1-Digest: CAUz7psRrLauurScITHMToQj86w= Name: res/drawable-xhdpi-v4/ic_call_split_white_24dp.png SHA1-Digest: 5kaLNhHTd44FJJwLLasb5Xoe0AA= Name: res/drawable-xhdpi-v4/ic_emoji_people_normal_dark.png SHA1-Digest: yfTboLWV6BppCCwwtlckHxAS3Q8= Name: res/drawable-mdpi-v4/abc_ic_menu_share_mtrl_alpha.png SHA1-Digest: OdP7A+E6BkFvIe4CYZ3B3GbAUlU= Name: res/layout-sw600dp-v13/three_keys_view.xml SHA1-Digest: 3uGfWlElwgZa5k/lbEACoh96N34= Name: res/drawable/abc_list_selector_holo_light.xml SHA1-Digest: 97+5PTkiP0Ok/P9371JlRcH0xnQ= Name: res/drawable-xxhdpi-v4/lockscreen_watermark_light.png SHA1-Digest: JLCC2x8L/5GAbnfY3JOlgzQvBfU= Name: res/drawable-hdpi-v4/ic_account_box_dark.png SHA1-Digest: m50HVJzBJFBsdA+sXUO/+3a6hIg= Name: res/drawable-mdpi-v4/ic_file_download_white_36dp.png SHA1-Digest: szHldFj8d1T/007VtQmOUh/46Q4= Name: res/drawable-xxhdpi-v4/ic_push_registration_reminder.png SHA1-Digest: 1f6vjXn5e6byK+htQHRiUQFPVWE= Name: res/drawable-mdpi-v4/ic_menu_add_field_holo_light.png SHA1-Digest: BfyD3ORZvAkYbrmX4Ss/sRhwDdg= Name: res/layout-v17/custom_default_preference_dialog.xml SHA1-Digest: iGxN2JBtz3p68bBASElzuLFMZzU= Name: res/layout/contact_selection_list_item.xml SHA1-Digest: L5DreMhEMyEg5kzlMbcyxUnz1M4= Name: res/drawable-xhdpi-v4/ic_send_secure_white_24dp.png SHA1-Digest: R8maxjCmT/Qdys8DG1GTy+SK2bw= Name: res/drawable-xhdpi-v4/abc_list_selector_disabled_holo_dark.9.png SHA1-Digest: Iz14YLSRp9C85A2InSd7OO4Ga6U= Name: res/layout/three_keys_view_right_drawable.xml SHA1-Digest: jELF1tB3fATGtHRK/M3WuOSpTp8= Name: res/drawable-xxhdpi-v4/textfield_default_holo_light.9.png SHA1-Digest: DKeaMClqVsDdOOwdcsmTzm049Zg= Name: res/drawable/abc_btn_borderless_material.xml SHA1-Digest: 9+UIx5LzMU67HsEZH0vBreWiJPE= Name: res/drawable-xxhdpi-v4/abc_textfield_search_default_mtrl_alpha.9 .png SHA1-Digest: shUg8eUw5YmR+wQVpcO99B+3lpc= Name: res/menu/conversation_popup.xml SHA1-Digest: YiGcF2JRF0i4X43cCpg6L4zuPq4= Name: res/drawable/abc_text_cursor_material.xml SHA1-Digest: j7vrPa0Diwit3eZnv21AEhEOiLU= Name: res/drawable-hdpi-v4/abc_ic_star_black_36dp.png SHA1-Digest: 5eU75xlD5NF9nxHXpUHFwQBWZc4= Name: res/drawable-mdpi-v4/abc_popup_background_mtrl_mult.9.png SHA1-Digest: 6LMTm1InS590S2d/jvEnjLlAl54= Name: res/drawable-xxxhdpi-v4/ic_volume_off_white_18dp.png SHA1-Digest: efdJ0EGlIHkF/i7NUvlXuZJW81U= Name: res/drawable-hdpi-v4/ic_message_gray.png SHA1-Digest: Kmyuoij8UtDPhtnWiCaykXTj7CI= Name: res/drawable-xxhdpi-v4/ic_check_white_24dp.png SHA1-Digest: ajFOxsoiud71Y08tFYzc86nEu4I= Name: res/drawable-xxhdpi-v4/ic_content_copy_white_24dp.png SHA1-Digest: 3M5uyFkFu53/ZTVZB62Q7AKEK/k= Name: res/drawable-xxhdpi-v4/ic_recurrence_bubble_outline.png SHA1-Digest: Mws9Jj5swemHmSryIsLB2xf4VRQ= Name: res/drawable-mdpi-v4/ic_group_photo.png SHA1-Digest: 5ScMDwdp0mOd43Kk70YU/8oijzQ= Name: res/drawable-xxhdpi-v4/splash_padlock.png SHA1-Digest: QmhDw732whE2AFLQNdHLTT/WWa8= Name: res/drawable/conversation_list_item_read_background_dark.xml SHA1-Digest: LvClDZ10MhrY1cHLq+HuCrG8zow= Name: res/drawable-xhdpi-v4/abc_list_focused_holo.9.png SHA1-Digest: Odk0wSbJp0hyQ3RZGhgf+2IXqBU= Name: res/drawable/recycler_view_fast_scroller_bubble.xml SHA1-Digest: Ya8tiZ7KeS8UUktQeNFWslmEDhk= Name: res/drawable-hdpi-v4/ic_emoji_objects_activated_light.png SHA1-Digest: 8a4XJYRMdVDkIlsTr91XRxviM/E= Name: res/drawable-xxxhdpi-v4/ic_menu_lock_dark.png SHA1-Digest: Jo/vY59By3J9bFk1Tqks3sxoSZU= Name: res/drawable-hdpi-v4/ic_emoji_symbols_activated_light.png SHA1-Digest: OhvEmgGQJIMywrqr0FEEGPVRwts= Name: res/drawable-mdpi-v4/abc_list_pressed_holo_dark.9.png SHA1-Digest: o79LWrpVg8mMdhT8PFdC/uVHnB4= Name: res/layout/design_layout_snackbar_include.xml SHA1-Digest: JMAZAhRiLqpWuKlGO8ByuAUTsWk= Name: res/layout/contact_selection_list_header.xml SHA1-Digest: lKees/HLMOcN/YNRlkGFb3Q2mJI= Name: res/layout/preference_list_fragment.xml SHA1-Digest: 7aUJw5669SsXS2Ka8sy6fcP7F5c= ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/org.smssecure.smssecure/signatures/135/MANIFEST.MF0000644000175000017500000070534114620351225026673 0ustar00hanshansManifest-Version: 1.0 Built-By: Generated-by-ADT Created-By: Android Gradle 2.3.0 Name: res/drawable-xhdpi-v4/abc_ic_star_half_black_48dp.png SHA1-Digest: Mv+KiFiSaa+WMki+npzbbru9CxE= Name: res/drawable/abc_btn_check_material.xml SHA1-Digest: 4XHnecusACTIgtImUjC7bQ9HNM8= Name: res/drawable-xhdpi-v4/ic_video_light.png SHA1-Digest: MN62WNe3Z3Ix8KEzRhWfoTk1cZs= Name: res/drawable-hdpi-v4/ic_lock_black_18dp.png SHA1-Digest: S7n2/JX/yuDCLErq0/yirCHoKkw= Name: res/layout/design_navigation_item_separator.xml SHA1-Digest: ZrVCT50MLzsYssSmPSnwC2kz/Hs= Name: res/drawable-hdpi-v4/abc_textfield_search_activated_mtrl_alpha.9 .png SHA1-Digest: sM1tzoxIgcK5w/PwGSZxzucCBqY= Name: res/drawable-hdpi-v4/ic_audio_light.png SHA1-Digest: xNqmnd/y7K6e8YxxooF3JQdiXY0= Name: res/drawable-mdpi-v4/ic_notifications_black.png SHA1-Digest: 6ymoxV29wZYUy6sr+Ai7KRA6bho= Name: res/drawable-xhdpi-v4/ic_advanced_gray.png SHA1-Digest: Fwk8+Z5gi7yWa5u3g3okLYRzF2I= Name: res/drawable-xxxhdpi-v4/ic_textsms_grey_32dp.png SHA1-Digest: wrVuGOcGiNV6OEAJHeLccFCrPuo= Name: res/drawable-xxhdpi-v4/list_focused_holo.9.png SHA1-Digest: FsvLP65iWVfEfIkCPXw4wimwY7M= Name: res/drawable-v21/abc_action_bar_item_background_material.xml SHA1-Digest: VikGrClarpkvTVwTS9DEpzyZFsI= Name: res/drawable-hdpi-v4/ic_arrow_forward_dark.png SHA1-Digest: 1nsgbxW3dt92O/zOyIR6fu/oAuE= Name: res/drawable-xxhdpi-v4/ic_arrow_forward_dark.png SHA1-Digest: SBng7xmSEAoXdcYL69mZuFcTPGY= Name: res/drawable-mdpi-v4/ic_attach_grey600_24dp.png SHA1-Digest: Y2/Pddk+40XsYIjXZgcBpyy2rZ0= Name: res/drawable-xxhdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png SHA1-Digest: K1fb6Q4Ss1JZ+SleO0yJcwwYiRw= Name: res/menu/conversation_list_batch_unarchive.xml SHA1-Digest: SzOPIvPnn6JkS5tSou5ug6wsbcM= Name: res/layout/share_list_item_view.xml SHA1-Digest: 3AXSzFXHJv5n5OHUOFJHT8zp6hY= Name: META-INF/services/com.fasterxml.jackson.core.ObjectCodec SHA1-Digest: mECZ0InRcm6Sm6/P0dIQdmb5YtU= Name: res/drawable-xxhdpi-v4/ic_emoji_objects_activated_dark.png SHA1-Digest: a3H9kAQunORai9e7vsG5YLx4SSM= Name: res/drawable-xxxhdpi-v4/abc_ic_star_black_16dp.png SHA1-Digest: otncOZG21mw8ew/aFY/F4swt8TY= Name: res/drawable-hdpi-v4/ic_block_grey600_18dp.png SHA1-Digest: f7/aPVltrHbzIob5ZeThe5Gyzy4= Name: res/drawable-hdpi-v4/ic_refresh_white_24dp.png SHA1-Digest: JpHXJPqpDRr/RGu10JNw8PhDSQg= Name: res/drawable-xxhdpi-v4/ic_emoji_recents_normal_light.png SHA1-Digest: lD1pqxqDa0jPpEhYDLAsAXCftEU= Name: res/drawable-mdpi-v4/ic_photo_library_white_24dp.png SHA1-Digest: PYJmFGp8A2W69vJlZFZgRfvMp+M= Name: res/drawable-mdpi-v4/ic_action_warning_red.png SHA1-Digest: RjBwTELk56fDdub3UY9Udsc11No= Name: res/layout/conversation_item_sent_audio.xml SHA1-Digest: Lm4pT7mpM/AbEZi6RcSECga58s0= Name: res/drawable-xhdpi-v4/switch_thumb_activated_holo_light.9.png SHA1-Digest: W+Hupcm4+5Vmhoa+hMuaWAPbj9Y= Name: res/color-v23/abc_color_highlight_material.xml SHA1-Digest: AZcOKzrt8RFgMk7A8l3oYy0Zs8E= Name: res/drawable-mdpi-v4/ic_image_dark.png SHA1-Digest: tl9E+GRY38WjmIIqa5mfi5g/8gQ= Name: res/drawable-mdpi-v4/ic_message_gray.png SHA1-Digest: RAKiyIri5FnSjCa42A5wv+2fyoM= Name: res/xml/preferences_advanced.xml SHA1-Digest: aVAKjgCzKsMgjz7lTmTCIRgngeQ= Name: res/drawable-xxhdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png SHA1-Digest: ZqCBR70J+G8APLB6odEE4sbBMrY= Name: res/drawable-ldrtl-hdpi-v4/ic_send_white_24dp.png SHA1-Digest: uansiOchl/+vx7xiZ3nIiMiGCQk= Name: res/drawable-xxhdpi-v4/ic_attach_grey600_24dp.png SHA1-Digest: o55tAgatw4R2/OT1keYTGzj5Uq0= Name: res/layout-v17/conversation_list_item_view.xml SHA1-Digest: klXZl5scbw2zTdPmiNoDnxd4Ei0= Name: res/layout-v16/design_bottom_sheet_dialog.xml SHA1-Digest: 1rIpLJL0aeA/GPy2COzl5qHBWXk= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_995 SHA1-Digest: qCXtFZpw6cj0RMgs3HecypVQnr4= Name: res/drawable-v11/emoji_category_recent_light.xml SHA1-Digest: oPOiG2+0o/JkT7flAFeyAHvaMRg= Name: res/drawable-xxhdpi-v4/ic_message_black.png SHA1-Digest: NuI7D3PpQauURg/C+kxR7T3VtG4= Name: res/drawable/notification_tile_bg.xml SHA1-Digest: LgSTFvI2CxOfbLCHJppJbfr7rxM= Name: res/menu/conversation_secure_sms.xml SHA1-Digest: Umly1//KqmlELY6mwG2+4bTMi78= Name: res/drawable-xxhdpi-v4/lockscreen_watermark_dark.png SHA1-Digest: nyEXs/BKk4Ioez2E62mpWxZ+B6U= Name: res/drawable-hdpi-v4/switch_thumb_holo_light_v2.9.png SHA1-Digest: KtN2rASYoM9JbiYC5rZ+EHNeOWo= Name: res/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_light.9.p ng SHA1-Digest: iN/uNjBfhVbAIr76ujTy7rKk9Iw= Name: res/layout/time_zone_item.xml SHA1-Digest: YlBjC538EjDtp9P8TjEDmFrDQAE= Name: res/layout-v17/import_export_fragment.xml SHA1-Digest: hQ8M5oAwocq4Gs0f+qnxXP80mBY= Name: res/layout-v17/abc_alert_dialog_title_material.xml SHA1-Digest: R57u/fXK5HZURzoutFnsLdSlH5g= Name: res/drawable-xhdpi-v4/textfield_default_holo_light.9.png SHA1-Digest: DuXFeUGOvd3j97HhEpwhlm8QBrg= Name: res/anim/design_bottom_sheet_slide_in.xml SHA1-Digest: JZvF3dH3kK4CROiDGCiyzk0bcCI= Name: res/drawable-mdpi-v4/import_database.png SHA1-Digest: fmXUj235S97wYR7qTHYpjQq9fbE= Name: res/drawable-xhdpi-v4/ic_image_dark.png SHA1-Digest: Wc1oo+kvKKtXAmMpJm8cPMFfXdY= Name: res/layout-v13/conversation_item_last_seen.xml SHA1-Digest: nVh5GMSO8uG5b0Ff3hCCIwcZBrA= Name: res/drawable-xxhdpi-v4/ic_emoji_people_normal_light.png SHA1-Digest: srCBZKoPt9Jaqa8vWWUqk2sRnfw= Name: res/drawable/play_icon.xml SHA1-Digest: lkBA8RCo8EPDUO2fBtG5BPQmAjI= Name: res/animator/scale_with_alpha.xml SHA1-Digest: tn55l/2e75ToW4LXM0LeHHxAjTo= Name: res/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_000.png SHA1-Digest: 8Sb/L5pJ5dP5LYtTMluOvUh3sug= Name: res/drawable-hdpi-v4/ic_emoji_nature_activated_dark.png SHA1-Digest: x9M5xUjmYWNWSCQWFLQYHUuuEbM= Name: res/drawable-v11/abc_textfield_search_material.xml SHA1-Digest: Qps1rIzG6yKql3AjAF66l6BFKZ4= Name: res/drawable-xxhdpi-v4/abc_switch_track_mtrl_alpha.9.png SHA1-Digest: IgT0lCbG3uY9vQQnsJCrHog+mlg= Name: res/drawable/done_background_color.xml SHA1-Digest: 7ueXFtM7hTTfYaxhY/Wk2LkLW9Y= Name: res/layout/conversation_item_update.xml SHA1-Digest: yICdPauTzp4uWodLV+0ThZ02PLM= Name: res/drawable-hdpi-v4/ic_clear_search_holo_light.png SHA1-Digest: GappRCZ2yjTCkyb77wbsfrfr2mw= Name: res/layout-v16/radial_time_header_label.xml SHA1-Digest: WLRzqx7Uv9ULMutleCP5/vCzpT8= Name: res/drawable/emoji_category_emoticons_light.xml SHA1-Digest: 2FAU6vv7sPGDcgJK8ssIbr7cbTo= Name: res/anim/abc_slide_in_top.xml SHA1-Digest: YBdDQbyB2IFfhjwKI6NSPOXqz7g= Name: res/drawable-xhdpi-v4/ic_menu_search_holo_light.png SHA1-Digest: vZ6F2Jg1C+TGavPO7lrCWLFzJhk= Name: res/drawable-xhdpi-v11/icon_notification.png SHA1-Digest: LCqhXT3KEiWE2VoQR5IZnnSuP00= Name: res/drawable-xxhdpi-v4/ic_emoji_flags_activated_dark.png SHA1-Digest: FF6h02gP05ugJ46mQGGdoUQTpbU= Name: res/drawable-xxhdpi-v4/ic_save_white_24dp.png SHA1-Digest: sAK0BTkETpylaJTMYHVQPsJxYvM= Name: res/anim/animation_toggle_in.xml SHA1-Digest: +tj+Zh9Sc3CL9SYyjJU2Itw9c70= Name: res/drawable-xhdpi-v4/ic_emoji_objects_activated_dark.png SHA1-Digest: Vb/8P05ydTz2tlnWlBhqCxHIBvc= Name: res/drawable-v11/emoji_category_people_dark.xml SHA1-Digest: DrKa3ghgfZjL+KHGdcveooLEhNs= Name: res/drawable/edit_text_holo_light.xml SHA1-Digest: zTZ3rXIUm6a45VyuKxhROL/d2b8= Name: res/color/abc_tint_edittext.xml SHA1-Digest: 4uJWj3RC+LNAAjywKebgsX5EjHo= Name: res/drawable-xxhdpi-v4/spinner_focused_holo_light.9.png SHA1-Digest: 7FDASvJfc8AEzERJoNcGwpNM0As= Name: res/drawable-mdpi-v4/ic_recurrence_bubble_outline_disabled.png SHA1-Digest: zRSUvTMpuUG8fSqRq7C4tY+Bt2w= Name: res/drawable-xhdpi-v4/ic_check_white_24dp.png SHA1-Digest: QvCyJjo+HtNwdQ1nKZjy8iqqicA= Name: res/drawable-mdpi-v4/ic_emoji_flags_normal_light.png SHA1-Digest: xxZCgGAanMLE7VRtyfrK/RS3zT0= Name: res/xml-v12/badge_widget_provider.xml SHA1-Digest: m0ulyiJ4lgd6vIhg6VXxujTEa1M= Name: res/drawable-xxhdpi-v4/quick_shutter_button.png SHA1-Digest: KvyyenumTdpPrG8D4bMe2acXvig= Name: res/drawable-xhdpi-v4/spinner_default_holo_light.9.png SHA1-Digest: Yv8DQV5iCOq6B/hrpnjziMEY1oE= Name: res/drawable-hdpi-v4/abc_ic_star_half_black_36dp.png SHA1-Digest: q5BP6iz9no2ZdX9wgjUfIjqk8OY= Name: res/animator-v11/bottom_pause_to_play_animation.xml SHA1-Digest: oFZDtNQqOffhAkrXPBaDgRgyJt0= Name: res/drawable-xxhdpi-v4/ic_content_copy_dark.png SHA1-Digest: hhn2223i5kzrfsNUn6lURO64Jm4= Name: res/drawable-mdpi-v4/ic_arrow_forward_light.png SHA1-Digest: iaicJjzpqMa6uswTfQLd6ewu4KM= Name: res/layout/message_details_activity.xml SHA1-Digest: rCNh6NSBINEtZvsZM7XZ6ovpoUQ= Name: res/drawable/abc_ic_voice_search_api_material.xml SHA1-Digest: AnbktjACLylEEl0ccn+3np57M8c= Name: res/drawable-mdpi-v4/ic_create_white_24dp.png SHA1-Digest: SzyTWAmlxMrH8hL+e2A2/qyJYs0= Name: res/drawable-xhdpi-v4/ic_lock_black_18dp.png SHA1-Digest: N7y019Qm4MTsPDJvUf6xpcjmLOg= Name: res/drawable/key_background_dark.xml SHA1-Digest: vjYs0zd8wTeSSImwhd7SzCMvt3E= Name: res/layout/design_text_input_password_icon.xml SHA1-Digest: 8D2alFuhVd6gqYJyh/7GJ+MLiP0= Name: res/color-v23/abc_tint_default.xml SHA1-Digest: QmvGaAvI4emOb0xLdYeq9wlWw6o= Name: res/drawable/abc_btn_colored_material.xml SHA1-Digest: c1kBk3kYH1Q2Zf0o2yN8Btg8MFI= Name: res/drawable-xhdpi-v4/ic_keyboard_white_24dp.png SHA1-Digest: QmlBOgi9X59yQWRT5FwKxyBl9X8= Name: res/drawable-xhdpi-v4/ic_reply.png SHA1-Digest: E6A43gDKrTDEXYlV747+gpcFSZ0= Name: res/drawable-mdpi-v4/ic_reply_white_36dp.png SHA1-Digest: BeQkwEyqIS7XzKmiVB4cEpfkII4= Name: res/drawable-xxxhdpi-v4/ic_photo_camera_light.png SHA1-Digest: P+u4/QQtC7tIBQVcMn1wJJXHt6Y= Name: res/drawable-xhdpi-v4/abc_ic_star_black_48dp.png SHA1-Digest: pUh1yzyRb6c3D0mL7cI4wKExeTI= Name: res/drawable-mdpi-v4/ic_movie_creation_light.png SHA1-Digest: ll+Zf8EyVcEVp0tgfNkBYbp6TnI= Name: res/layout/hms_picker_dialog.xml SHA1-Digest: NTCwll4GJmpbJ6yInQY9S3eixuQ= Name: res/drawable-xhdpi-v4/check.png SHA1-Digest: dQfE3OFyk+3YoFOYwn+y+t8e7zw= Name: res/drawable-hdpi-v4/abc_cab_background_top_mtrl_alpha.9.png SHA1-Digest: J10MbRypNxo+JeKfGf61OMkWgdY= Name: res/drawable-hdpi-v4/abc_ic_star_half_black_48dp.png SHA1-Digest: xgnROefed1vgMaxaqCgtRMAIU/Q= Name: res/drawable-mdpi-v4/ic_keyboard_grey600_24dp.png SHA1-Digest: 0C4Saeb25DYu43+FGC1Z9DnkBIA= Name: res/layout/keyboard.xml SHA1-Digest: K6E6mKC8m2G6XyF1toWTaLmQB9s= Name: res/drawable/key_background_light.xml SHA1-Digest: 2ArVCjLjr02aFbyRYSeHh1WEUrE= Name: res/drawable-hdpi-v4/check.png SHA1-Digest: GYF1t9VttL+se1d6Il+emojcdXo= Name: res/layout/message_details_header.xml SHA1-Digest: XlVTimKNxmd+tFrX1/7ddxbVd9A= Name: res/drawable/reminder_background.xml SHA1-Digest: O2XBirGQxJDYU6A/4O3mZKlWr0g= Name: res/drawable-xxhdpi-v4/last_seen_background.9.png SHA1-Digest: AcZa88WjmAgL9QcaLEep+IS+fDw= Name: res/drawable-xxhdpi-v4/abc_ic_star_black_48dp.png SHA1-Digest: P/TePusgUK0jTzJbBXwUqj2ymIs= Name: res/drawable-xhdpi-v4/list_longpressed_holo_light.9.png SHA1-Digest: DbbsJ/A8Zk/Z2Q8z6jeVTrNtcKw= Name: res/drawable-hdpi-v4/ic_warning_light.png SHA1-Digest: bWchqS5mxrUz0jEXqPmNSp2dQyE= Name: res/color-v23/abc_btn_colored_text_material.xml SHA1-Digest: iPtKeCtxBDsPlPY18AN/Fz+9bAA= Name: res/drawable-mdpi-v4/alert.png SHA1-Digest: eaLxnhQSh/qDiCsxeefWPdSrua4= Name: res/drawable-hdpi-v4/ic_badge_24dp.png SHA1-Digest: F5QVt4jyFy9QAu6iHeG9kr+LGNs= Name: res/drawable/badge_drawable.xml SHA1-Digest: T2XKzv4ZjP7gDWfKmITyjP1H/gg= Name: res/drawable-v21/avd_hide_password_3.xml SHA1-Digest: G4VEl1xnzQqDzGNNopnaKto5JNc= Name: res/drawable-xhdpi-v4/notification_bg_low_pressed.9.png SHA1-Digest: 9MYmMKRnfwttaoRGc1WDg0jzgyY= Name: res/drawable-xxhdpi-v4/ic_emoji_people_activated_light.png SHA1-Digest: JmwHDfqoh/u3AajOzeVn+cJbhEY= Name: res/layout-v11/notification_template_custom_big.xml SHA1-Digest: IHHhQmMO1W+0BJYbRtm3HlkLGTM= Name: res/color-v23/abc_tint_switch_track.xml SHA1-Digest: io40yf4syWIZa4sAMqqnmDJ5ruw= Name: res/drawable-hdpi-v4/ic_play_circle_fill_white_48dp.png SHA1-Digest: lJitUpTdEPX/w2HQe4ET4fM55p4= Name: res/layout-v16/selected_recipient_list_item.xml SHA1-Digest: IoTIQcdfhF5yj/bZbVuL4GTD1As= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_506 SHA1-Digest: fSwyg4KxEaIctkOMUXXbP0UnACc= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_505 SHA1-Digest: dkhqE6jk0X2rJBCd5h+xJ2vZwls= Name: res/drawable-xxxhdpi-v4/abc_text_select_handle_left_mtrl_dark.pn g SHA1-Digest: FavPjuk6olEZey6sIq7rywmBBwY= Name: res/layout/selected_recipient_list_item.xml SHA1-Digest: duqiHkirDUOdtYcYOK4BSsgiKvk= Name: res/drawable-ldrtl-hdpi-v17/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: 2gdfs4MdNrmZ5fPzRYQKwf3z8nA= Name: res/drawable-mdpi-v4/ic_video_dark.png SHA1-Digest: xgX3HdiZ1/FlP1EZbUATFRtezMA= Name: res/layout/recycler_view_fast_scroller.xml SHA1-Digest: YJYkRqf9kmJnZ6ioHAYG/PoGmxs= Name: res/drawable-xhdpi-v4/ic_archive_white_24dp.png SHA1-Digest: dv+8iSp/u9VOCKmfF/uz7ojqMLU= Name: res/drawable-xhdpi-v4/import_database.png SHA1-Digest: KI04q70EXc7fJQgqbWFJ2KxNYsg= Name: res/menu/group_create.xml SHA1-Digest: /ecK7ty1S1TQH3znAj++GOgp7gs= Name: res/drawable-xhdpi-v4/ic_emoji_places_activated_dark.png SHA1-Digest: EjXH3Q1hCvFRWrwCYGmB5Fz54aM= Name: res/drawable-xhdpi-v4/ic_menu_remove_holo_light.png SHA1-Digest: SygzBPctWRFH6LDfo+w+DP/k2m0= Name: res/layout/media_preview_activity.xml SHA1-Digest: y9gWsqCJFG9jBKiJKU9APtvjnT8= Name: res/drawable-xxhdpi-v4/ic_emoji_recents_activated_light.png SHA1-Digest: T77IRcTGYBtfJ8Gd0tQKqhw0Gks= Name: res/color/abc_background_cache_hint_selector_material_light.xml SHA1-Digest: 6zQV9p9NddLltjdGn1qBYsiO04o= Name: assets/fonts/AndroidClockMono-Thin.ttf SHA1-Digest: nDLU3MtBsUBWd/Jq7PrvujP5/YE= Name: res/drawable-v11/emoji_category_objects_dark.xml SHA1-Digest: iBMvAA5/+zPuG1HSUhaIO4kjoBI= Name: res/drawable/abc_seekbar_thumb_material.xml SHA1-Digest: R+zfNUVLkXYZ8GH32A2aK443lBQ= Name: res/anim/abc_shrink_fade_out_from_bottom.xml SHA1-Digest: tUIF7X/jI8K8Q3PAJpeZVS4JPi8= Name: res/drawable-mdpi-v4/ic_audio_light.png SHA1-Digest: TRsHE+zwfiIvhq+iybeYWtbSf8M= Name: res/drawable-xxhdpi-v4/ic_emoji_recents_activated_dark.png SHA1-Digest: ritPDDx4JIboLAAoTEz26lD0vfk= Name: res/drawable-sw600dp-mdpi-v13/ic_backspace_disabled_dark.png SHA1-Digest: bBJa6fMJoP87GQtakbAV7tKOdHw= Name: res/xml/preferences_manual_mms.xml SHA1-Digest: DHV/b9/XvRlc1RH8WUMy7A0M3Mw= Name: res/drawable-xxhdpi-v4/ic_volume_off_grey600_18dp.png SHA1-Digest: odmgY1yq1ymCKnYPkGL9f0NabqA= Name: res/drawable-xxhdpi-v4/abc_list_pressed_holo_light.9.png SHA1-Digest: I2JJHnuKjt9jtF8C76fBatEScaE= Name: res/drawable-xhdpi-v4/ic_delete_white_24dp.png SHA1-Digest: zUHGzuXiGu6zW1HkGDFXAZcRaEc= Name: res/drawable/abc_cab_background_top_material.xml SHA1-Digest: gLHAZPEH/WYlWCNIPwRV1Ypbx70= Name: res/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_015.png SHA1-Digest: 0OG2GgwzcQVFzj+BwQ+1UYki6vU= Name: res/drawable-mdpi-v4/ic_attach_white_24dp.png SHA1-Digest: wvJ0dZjo9WO3IftZ1u1pDiLAYHo= Name: res/drawable-xhdpi-v4/dialog_full_holo_dark.9.png SHA1-Digest: Xv7q5ITHzmlsgg58AkKDmIAOIx8= Name: res/drawable-hdpi-v4/ic_lock_white_24dp.png SHA1-Digest: b/iJ/j70juEO115QXcuRbfob2vs= Name: res/drawable-hdpi-v4/ic_volume_up_dark.png SHA1-Digest: xrgQPS8hvvANCRdqfp0oeLL62kU= Name: res/drawable-xhdpi-v4/ic_message_gray.png SHA1-Digest: cipeLSWhQ3E8CaS3TkeT2+szopE= Name: res/layout/outgoing_sms_preference.xml SHA1-Digest: swLec1DtO3WJtnyXl/vJ0tZJfu8= Name: res/layout/number_picker_view.xml SHA1-Digest: ahHMCTOCOLOVgvMwVDE2rVvcuRY= Name: res/layout-v17/design_layout_snackbar_include.xml SHA1-Digest: hAKpqrRkn4zttzsruLPeWfbgUEo= Name: res/drawable-xhdpi-v4/ic_lock_light.png SHA1-Digest: zUHx9YJDrvMXb3UbuXPp4CH+PrQ= Name: res/drawable-xxhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png SHA1-Digest: kjQh/adr8XS+S465gr9pzFibMnM= Name: res/color/switch_thumb_material_dark.xml SHA1-Digest: f3zgtqci6QdPmbytbKTAcztzers= Name: res/drawable-xxhdpi-v4/ic_visibility_off_white_24dp.png SHA1-Digest: qHNgChQ6M9SFZjVLvn1YAf3YOY8= Name: res/drawable-mdpi-v4/ic_push_registration_reminder.png SHA1-Digest: kPTXYuPt5ht+S/b7il4MyfHvfHU= Name: res/drawable-mdpi-v4/dialog_full_holo_light.9.png SHA1-Digest: r4KUt0XX5nLAF9pkvj1Rfe1HuVA= Name: res/layout-sw600dp-v13/design_layout_snackbar.xml SHA1-Digest: aDZ/Y13hRjK2ExLFkIFrqs2EcgQ= Name: res/drawable/actionbar_icon.xml SHA1-Digest: 4ggDqvnA//4/gUTrCi8SAWhqAUs= Name: res/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.pn g SHA1-Digest: 1Sq+VOFFXYaggLRmUPg5CpP+b1M= Name: res/layout/abc_list_menu_item_layout.xml SHA1-Digest: LdonLq4y6EOPd12hm0st2FQeXp8= Name: res/drawable-mdpi-v4/ic_movie_creation_dark.png SHA1-Digest: +Jgq6bNeUNGTAc4VvdAQU7Z3dZ4= Name: res/drawable-v21/abc_edit_text_material.xml SHA1-Digest: QmBeXDdf25h+c59CK063xKJ8JdI= Name: res/drawable-mdpi-v9/icon_notification.png SHA1-Digest: d4hA4WTP2uFIyWtcRSmOiBlTFn8= Name: res/drawable-xxhdpi-v4/ic_refresh_white_24dp.png SHA1-Digest: H/LwcWWxX1VJzYfG76baNG9j7uY= Name: res/drawable/progress_background.xml SHA1-Digest: zK7FJQT3jdkLOJAs5Y7jL9uLgX0= Name: res/drawable-xxhdpi-v4/list_pressed_holo_light.9.png SHA1-Digest: I2JJHnuKjt9jtF8C76fBatEScaE= Name: res/drawable-mdpi-v4/textfield_disabled_focused_holo_light.9.png SHA1-Digest: j/bR5FhKXM3nZJ0PKlO3uo5Q9iI= Name: res/drawable-xhdpi-v4/abc_textfield_search_activated_mtrl_alpha. 9.png SHA1-Digest: 3u3fLmehvZBhy/5ikwcph94VGWM= Name: res/drawable-xhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png SHA1-Digest: RwOTCkvoy8JfKjFQZXnNiOHbxpQ= Name: res/xml/preferences.xml SHA1-Digest: DiuBw5gZWCbnu9P0aKZOXaiDtRM= Name: res/anim/abc_slide_out_bottom.xml SHA1-Digest: GcBbKJcMWdQ42ssCQexb9kGH6us= Name: res/drawable-mdpi-v4/spinner_disabled_holo_light.9.png SHA1-Digest: VDYagFVVDGkZFeYeouIICQC7/C0= Name: res/drawable/emoji_category_places_light.xml SHA1-Digest: wtp4eWxpCWzsWD/8Yle2TAo261U= Name: res/menu/conversation_group_options.xml SHA1-Digest: mKBEDK9co4Csvl1MFy1y8tETXTo= Name: res/drawable-xxxhdpi-v4/abc_text_select_handle_right_mtrl_dark.p ng SHA1-Digest: 1cl/IsP/z8hq0fSoUb3Z29rLRVM= Name: res/drawable-xhdpi-v4/ic_emoji_nature_normal_dark.png SHA1-Digest: qYlz+XXb7tPPlmwbdqrJ/RYyGYQ= Name: res/drawable-ldrtl-xhdpi-v17/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: +/cT3+0N8I+XSw0FPP5O3x2f5g4= Name: res/drawable-xhdpi-v4/design_ic_visibility_off.png SHA1-Digest: 0OVNK8kFZq2fgUG4Kc9y+NUoIyk= Name: res/menu/share.xml SHA1-Digest: 7RSgEelZF3uCMzV2wWHWuVCGtto= Name: res/drawable-mdpi-v4/spinner_focused_holo_light.9.png SHA1-Digest: V9tjL1cMxuMvNGabgo8kTf8q/oQ= Name: res/drawable-mdpi-v4/ic_unarchive_white_24dp.png SHA1-Digest: AnSJIPKgb/L7q2CsDFn2F/9JzWw= Name: res/drawable-xhdpi-v4/ic_send_white_24dp.png SHA1-Digest: UcvZZ00OMZ5tx1dwWXlgGHwkyPQ= Name: res/drawable-mdpi-v4/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: sc2f/SwoJ8sOO1ziZCDS+WfNDhI= Name: res/drawable-hdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png SHA1-Digest: KcAKbOCiTO5UMcKfzx/+vncLmXg= Name: res/animator/rotate_90_animation.xml SHA1-Digest: AhVLtjcJdoeXGcim/ix1HCO/gQw= Name: res/drawable-xxhdpi-v4/ic_forward_white_24dp.png SHA1-Digest: INkdmomUul9bP5BalXgMuqp+Fi0= Name: res/drawable-xxhdpi-v4/ic_notifications_black.png SHA1-Digest: DthaV+AqOozisZR0tlgc31EK20g= Name: res/layout/message_recipient_list_item.xml SHA1-Digest: DNfLiAGMM42qJiUBQ6ptbeD643s= Name: res/drawable/abc_spinner_textfield_background_material.xml SHA1-Digest: k4PYrKN6q/ExQP5RdV8dDVaO8Js= Name: res/drawable-mdpi-v4/ic_pause_circle_fill_white_48dp.png SHA1-Digest: GXf0+NjE+Jl37K5VWpmyDVcX4gc= Name: res/layout/single_recipient_panel.xml SHA1-Digest: Ju3oOig1mDOZq7HiJTjNDpvCc5w= Name: res/drawable-mdpi-v4/abc_ic_star_black_48dp.png SHA1-Digest: LYh5wO7mcgtiq4fyzNQBKw1XFk8= Name: res/layout/select_dialog_multichoice_material.xml SHA1-Digest: i/P6y+zKXgMOuFmhHqYzSjjnP9A= Name: res/drawable-xxhdpi-v4/ic_warning_light.png SHA1-Digest: RANpqRT7jrCv8AUuDx6Mc9LMvvs= Name: META-INF/buildserverid SHA1-Digest: PFAoK3vAw7CF29BtzhTdrgabIU8= Name: res/layout-v11/notification_template_big_media.xml SHA1-Digest: htwU5600qsSzOm2ExqJAffHmYEE= Name: res/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_015.png SHA1-Digest: xc9EUi8JbA506uG62boWpLo9DB8= Name: res/drawable-mdpi-v4/ic_forward_white_24dp.png SHA1-Digest: 7GEGOC+RhHCBHl4Ao8nOHtZ46Cs= Name: res/drawable/conversation_item_background.xml SHA1-Digest: EdHxKZVagGX+RrPmbiPZVYpFxZE= Name: res/drawable-mdpi-v4/abc_textfield_search_activated_mtrl_alpha.9 .png SHA1-Digest: YsHF4VJihRr1oEZ76cu42zsHjek= Name: res/color/abc_background_cache_hint_selector_material_dark.xml SHA1-Digest: JW1Wg9XMsM+FF68MpbJdFc2Yh8U= Name: res/drawable-hdpi-v4/ic_delete_white_24dp.png SHA1-Digest: lRuZfsQ7T+0nZmYvoYmmRVZJKcA= Name: res/anim-v21/design_bottom_sheet_slide_out.xml SHA1-Digest: AGi5g5tvoZK7WNsIL0yZE9rdwnw= Name: res/layout-w270dp-h560dp-v13/calendar_date_picker_dialog.xml SHA1-Digest: XJB0mJxqi+LHi8sY4BNCBVjCrKU= Name: res/layout-sw600dp-land-v13/calendar_date_picker_dialog.xml SHA1-Digest: iqpjA1eAjjWXIOu09vGX/wjNjVE= Name: res/layout/design_navigation_item.xml SHA1-Digest: ZumpzXxJd7SIBf8+JK3lrCjw+O4= Name: res/drawable-xhdpi-v4/ic_contact_picture.png SHA1-Digest: EV8R3SyK8TC2jq4eFsgX/nOEkgw= Name: res/drawable-xhdpi-v4/ic_push_gray.png SHA1-Digest: 6p2svB1tHSA2wBs/tIp59IcmQg8= Name: res/drawable-hdpi-v4/ic_emoji_flags_activated_light.png SHA1-Digest: X8a9+THL64lmtmwQq3YafciiCQ0= Name: res/layout/notification_action_tombstone.xml SHA1-Digest: 9Liuim7N5gRllPpEjgChbQINE+w= Name: res/drawable-hdpi-v4/abc_textfield_activated_mtrl_alpha.9.png SHA1-Digest: H53d9SOkoWezKsVvcOALraOdTFo= Name: res/drawable-xhdpi-v4/ic_group_photo.png SHA1-Digest: ELEua2TBuh/CXBT5dHekx5lpLoQ= Name: res/drawable-xxhdpi-v4/fab_shadow.png SHA1-Digest: rvLg9lLjuCblbuAMGXXeG6EXNoA= Name: res/drawable-xhdpi-v4/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: EWsVhp6Fuj87sih/RyDRPr/vOxY= Name: res/drawable-xhdpi-v4/ic_visibility_off_white_24dp.png SHA1-Digest: PtWxrz3Gu4HIRGshwwkTOzkL0WU= Name: res/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_dark.9.pn g SHA1-Digest: vq3AaVX19jU0c0v1npZsAQOh+CI= Name: res/drawable-hdpi-v4/ic_archive_white_24dp.png SHA1-Digest: isijXsHBVMlYiGaq2y3vFUJm3aM= Name: res/drawable-xhdpi-v4/ic_backspace_disabled_light.png SHA1-Digest: zKT/1vK3dByF8W/4TqDRB3P//8o= Name: res/layout/select_dialog_item_material.xml SHA1-Digest: YxkfyKn7F7LCilMhwA+JNDz8/LA= Name: res/layout/view_identity_activity.xml SHA1-Digest: sdfI5G2rE7lANKYrX52VPeV7uyA= Name: res/layout/design_navigation_item_subheader.xml SHA1-Digest: Fr3vjBNi2dHk1OoUaEeu1CAHHRg= Name: res/layout-v21/notification_action_tombstone.xml SHA1-Digest: gZ+1Ci2W9lg2B30peGxcdBYja8I= Name: res/layout/share_intent_list.xml SHA1-Digest: fd3NhPVV0DCVVNLVlfNEQk+I6mU= Name: res/drawable-mdpi-v4/fab_shadow_mini.png SHA1-Digest: ExMGDh75RUwD0Zl6Z5X6HYbRDuM= Name: res/drawable-hdpi-v4/icon.png SHA1-Digest: 7ooHofxVnyZj+EI2ktnjYQZw4O0= Name: res/drawable-hdpi-v4/switch_thumb_pressed_holo_light.9.png SHA1-Digest: UW8twZMlDStRuqjFewmFD3itfrQ= Name: res/drawable-xxxhdpi-v4/ic_archive_white_36dp.png SHA1-Digest: wBx4qyXr83v9MPqX3AU262pF2cM= Name: res/drawable-xxhdpi-v4/ic_emoji_places_normal_dark.png SHA1-Digest: HBbXwGgsDb284tHFuhyGbhHRpSw= Name: res/drawable-xxxhdpi-v4/ic_save_all_white_24dp.png SHA1-Digest: XmJstR6YFMPz6jfsWh8L4Sy0Rr8= Name: res/drawable-xxhdpi-v4/ic_delete_gray.png SHA1-Digest: hMQHqOg5ktgmQzEBHuIRG+MGyaU= Name: res/drawable-xhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png SHA1-Digest: Bii9JPddV76dH8va+pLHDS/1H2I= Name: res/drawable-hdpi-v4/ic_emoji_emoticons_activated_light.png SHA1-Digest: lC5K0zYxqjZPLfkbAMaA5JlvzZ8= Name: res/drawable-mdpi-v4/abc_textfield_search_default_mtrl_alpha.9.p ng SHA1-Digest: D6dilO+UMcglambujyMOhNbLZuY= Name: res/drawable-xxhdpi-v4/ic_textsms_black_32dp.png SHA1-Digest: KQFfNzbixlIhyj/W1wnoDgoBFLo= Name: res/drawable-hdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: MMW5ShwB1m9oRvGdlbR//t0h77U= Name: res/layout/group_create_activity.xml SHA1-Digest: le3p6Yw9tTaS5+N5l8NAXuSdngU= Name: res/drawable/emoji_category_symbol_dark.xml SHA1-Digest: Ju9NiYprgQLlxTm5XBhkYezLm/g= Name: res/drawable-xxhdpi-v4/ic_volume_off_white_18dp.png SHA1-Digest: JqvMHVRMiibxNcOhkh2oZIeF7NU= Name: res/drawable-hdpi-v4/ic_delete_gray.png SHA1-Digest: wxa+vcJFVu6N+ITAH1/7YNK2Ua4= Name: org/spongycastle/x509/CertPathReviewerMessages.properties SHA1-Digest: OGIe7v0JVQeuizExOPQ4Cf/+RXo= Name: res/drawable-mdpi-v4/ic_emoji_people_activated_light.png SHA1-Digest: pzhoFuemKY5gUDVDDQ0FAnHjdO4= Name: res/drawable-xhdpi-v4/actionbar_icon_holo_dark.png SHA1-Digest: 1Psmu0RM/nHRmEKkAhQ2EWpb3FY= Name: res/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_000.png SHA1-Digest: ivpLQ63tfOD0ISnUmDRNp3o0jBk= Name: res/drawable-xhdpi-v4/ic_visibility_off_grey600_24dp.png SHA1-Digest: aeh86VziSMlBPqpA/NXKOMBc3wc= Name: res/drawable/abc_ic_ab_back_material.xml SHA1-Digest: 6SFmoia7mNGpkW+jSqxSP95Szuo= Name: res/layout/design_navigation_menu_item.xml SHA1-Digest: EpleT5uGJY/Oz1oTPFa6A44+pcM= Name: res/drawable-v21/touch_highlight_background.xml SHA1-Digest: 6IadWpveEX8PumPwP847BweJlgg= Name: res/drawable-xxhdpi-v4/abc_text_select_handle_middle_mtrl_light. png SHA1-Digest: ZjoNfwYFY/w1heN9+GIDC4AUjSI= Name: res/drawable-mdpi-v4/abc_list_divider_mtrl_alpha.9.png SHA1-Digest: B+V5QEOwy10ghi7uX5XLTPFJGJs= Name: res/drawable-mdpi-v4/ic_reply.png SHA1-Digest: eKIvQlTj+MqJkkhH83v4XJEf2Cg= Name: res/drawable-xhdpi-v4/ic_emoji_objects_normal_light.png SHA1-Digest: qfh1k5CNGLoFk4UDObAK/Jf26Gc= Name: res/layout-v17/notification_template_media_custom.xml SHA1-Digest: POf37ImxgRTW1tCMpq3uc1uMOnw= Name: res/drawable-xhdpi-v4/ic_emoji_people_activated_dark.png SHA1-Digest: bgGJzgaYmyCW3yKqClSqCOPMdx8= Name: res/animator/bottom_play_to_pause_animation.xml SHA1-Digest: 7f8HiUwoTj84cBIvXQhtx6kFMlc= Name: res/drawable-xhdpi-v4/ic_emoji_places_activated_light.png SHA1-Digest: hKmWMiPG7DNsfcQHCQk/pQUXe9o= Name: res/layout/switch_compat_preference.xml SHA1-Digest: BcoiqEYKt0pTDgHI781bnYowk54= Name: res/drawable-hdpi-v4/abc_list_divider_mtrl_alpha.9.png SHA1-Digest: B+V5QEOwy10ghi7uX5XLTPFJGJs= Name: res/drawable-mdpi-v4/ic_menu_barcode.png SHA1-Digest: d55+P7bEEVaEbTTLH9RpILA30sk= Name: res/drawable-xxhdpi-v4/ic_push_gray.png SHA1-Digest: C0xTCzZJn9RVKjSqm5v2UC8GXmo= Name: assets/backward SHA1-Digest: r/6p7b+IrWfsXOtXuSRa3XRryRU= Name: res/drawable-xhdpi-v4/ic_audio_light.png SHA1-Digest: hZE6NPD9tvuKoyt48zhjv8yn1hA= Name: res/drawable-xhdpi-v4/ic_emoji_recents_normal_light.png SHA1-Digest: xBC9DCGDPMFtthnVidEzhWv1S3U= Name: res/layout/load_more_header.xml SHA1-Digest: HbT14W2VMV1p5/aX+7rMB42clVc= Name: res/drawable-xhdpi-v4/ic_missing_thumbnail_picture.png SHA1-Digest: KTPAovm6fHADFuua0zRb/i7JPBQ= Name: res/layout/abc_action_menu_item_layout.xml SHA1-Digest: OLXyHaAi29c7ywsCifM30HTfwUo= Name: res/drawable/conversation_list_item_unread_background_dark.xml SHA1-Digest: 2QVen9mJrbCui4pWQqhYnxMM0K0= Name: res/drawable-mdpi-v4/switch_bg_focused_holo_light.9.png SHA1-Digest: Zb5ZNlmnSJm17S8X88rrHismQoQ= Name: res/color/done_text_color.xml SHA1-Digest: i33wjub03ftpQpdSxyTxWIGUeew= Name: res/drawable-mdpi-v4/ic_advanced_black.png SHA1-Digest: y3+kEpasbWgXqfiLlAyDjJKQqRs= Name: res/drawable-hdpi-v4/abc_list_longpressed_holo.9.png SHA1-Digest: KQunCQh0E4bP0utgN0cHdQr9OwA= Name: res/layout/splash_screen_activity.xml SHA1-Digest: Lhg0tWz+QYPZtNwv9FYWrzA1hMA= Name: res/drawable-mdpi-v4/ic_app_protection_gray.png SHA1-Digest: 1diK8UP95sCL0e7+1g5/BrWYAc4= Name: res/drawable-xxhdpi-v4/sms_selection_icon.png SHA1-Digest: rPk7FEcQcnWcYTff9OdenlmidgM= Name: res/drawable-hdpi-v4/sent_bubble.9.png SHA1-Digest: JGqPgezZhUUOMdpS7YyeaEXvFW4= Name: res/drawable-mdpi-v4/ic_visibility_off_grey600_24dp.png SHA1-Digest: DlHropSKeKJ9EdIpCyTbBWnaEbo= Name: res/drawable-mdpi-v4/icon_dialog.png SHA1-Digest: PEUseDLpMhB/t/jQ7t/pQBsEvB4= Name: res/drawable-xhdpi-v4/list_pressed_holo_light.9.png SHA1-Digest: 5rSZbdJDOTdM5kJhhIdl8m8briI= Name: res/drawable-xhdpi-v4/ic_unarchive_white_24dp.png SHA1-Digest: s8blAW4vi9yw0uShZLX58NkJGIA= Name: res/layout/timezonepickerview.xml SHA1-Digest: JDj51OUGhcJia+1+hYcELLrgZPg= Name: res/drawable-xhdpi-v4/ic_check_light_disabled.png SHA1-Digest: oHkXjSaaob4YggB6wrPKOwv5e7Y= Name: res/drawable-xhdpi-v4/textfield_focused_holo_light.9.png SHA1-Digest: 9fXYckUA6bXM1wEDQ0rXYeMvIfw= Name: res/layout/color_preference_item.xml SHA1-Digest: 6mrfGRnCs8Ht9w2eadUQow/xnhc= Name: res/layout/transport_selection_list_item.xml SHA1-Digest: RwZyO8tL+GTMtAco6iT7aMDSwtc= Name: res/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png SHA1-Digest: OGTAGSMNcF0Z/ZC0uBc4qemdptI= Name: res/drawable-mdpi-v4/actionbar_icon_holo_dark.png SHA1-Digest: cqYzvjedowzINhKkhgaEAn/opZE= Name: res/drawable-xhdpi-v4/ic_menu_barcode.png SHA1-Digest: ahhRaU5LjrjteMiTicHEAqpalAw= Name: res/drawable/import_export_item_background_light.xml SHA1-Digest: Bi/t0qJA/KgWChbnN3t3p6wExyg= Name: res/drawable/emoji_category_flags_light.xml SHA1-Digest: V829J6Wxpxf94+asrWt4WSYZhDw= Name: res/drawable-xxhdpi-v4/ic_app_protection_black.png SHA1-Digest: MWTABT4q4vTfDu3fWQmicK+guaw= Name: res/layout/abc_alert_dialog_material.xml SHA1-Digest: ymGYlunu9ido4PijVKjcNyETIGQ= Name: res/color/dialog_text_color_holo_dark.xml SHA1-Digest: mhNkhbYqg2hBKryuU+d73yuTlIA= Name: res/drawable-hdpi-v4/ic_visibility_grey600_24dp.png SHA1-Digest: DyPAobxWgQJCc4ECQRE+Mbh1vC0= Name: res/layout-sw600dp-v13/three_keys_view_leftright.xml SHA1-Digest: tkyYWGtROWaZqUXQEwelz5Aenco= Name: res/anim/abc_popup_enter.xml SHA1-Digest: ZKpMd1TuL9jAkYWPue9RXki708E= Name: res/layout/blocked_contacts_fragment.xml SHA1-Digest: fuRQvQ2rM8IO/18Oa72aBZGsajY= Name: res/drawable-mdpi-v4/abc_tab_indicator_mtrl_alpha.9.png SHA1-Digest: z0xEJNNl6qN3MKa3Uq4y93mF7Cw= Name: res/drawable-hdpi-v4/abc_ic_star_half_black_16dp.png SHA1-Digest: pS2IISWVF11RXQXLyxHF6AODLJQ= Name: res/drawable-xxhdpi-v4/splash_open_padlock.png SHA1-Digest: AyU/qBSGe6ni0/ayORtW1Ba13dQ= Name: res/drawable-xxhdpi-v4/design_ic_visibility.png SHA1-Digest: 364a/+txT+QrBDJZ1GPgI2HwcMk= Name: assets/zone.tab SHA1-Digest: d0US6Zajzyow3w/OX7A+6NT3Oy8= Name: res/drawable-hdpi-v4/notify_panel_notification_icon_bg.png SHA1-Digest: inKyhhyZgO65645KR/OH06l6dAc= Name: res/layout-v16/conversation_list_item_view.xml SHA1-Digest: +V4vOPOUGByJCriRwZWAGAbbbUk= Name: res/layout/notification_template_custom_big.xml SHA1-Digest: zeYI3QMAjdBS9eNvHxgKfQp8pkY= Name: res/layout-sw600dp-v13/calendar_date_picker_dialog.xml SHA1-Digest: XJB0mJxqi+LHi8sY4BNCBVjCrKU= Name: res/drawable-v11/emoji_category_nature_dark.xml SHA1-Digest: APCRNVaaYVwvFd3ETZY/JfKdzKg= Name: res/drawable-mdpi-v4/notification_bg_normal.9.png SHA1-Digest: Wl4jBkhtPS9E+JkWaS0GOyoMbuw= Name: res/layout/centered_app_title.xml SHA1-Digest: 5rEeTeZFkuL3VoHq6nk4sfeB+jg= Name: res/drawable-xxhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png SHA1-Digest: mXQuXT+E6ctyqZNbnaBtZKfg0ZU= Name: res/drawable-hdpi-v4/ic_info_outline_light.png SHA1-Digest: /DlKgwON8BS4G8FmGnpmQItNuqc= Name: res/drawable-mdpi-v4/ic_block_white_18dp.png SHA1-Digest: FC+C3CmEUXCplFxVG7HWgvTGtNU= Name: res/drawable-xxhdpi-v4/ic_info_outline_grey600_24dp.png SHA1-Digest: xBmMFVK3FIxZKSB0TRZIYecVwfU= Name: res/drawable-hdpi-v4/ic_recurrence_bubble_fill.png SHA1-Digest: a/afiiaYmhSCSRPndEe7VVryElM= Name: res/color/abc_primary_text_disable_only_material_dark.xml SHA1-Digest: fztyDM09XiKUbzo6Y6O2r9Xqs6k= Name: res/drawable/info_round.xml SHA1-Digest: UZ/381JABO8YY/CyQ+EQwB67nZs= Name: res/drawable-v21/avd_hide_password.xml SHA1-Digest: n9KjH/8/CCI1IAA4WA95HxD7TSo= Name: res/drawable-hdpi-v4/ic_launch_white_24dp.png SHA1-Digest: buTvIITq3BWrN5RzvAzAkNJ3RR0= Name: res/drawable-mdpi-v4/ic_unarchive_white_36dp.png SHA1-Digest: j3jd65D0sfk5JumlC9jjVSsyKRM= Name: res/drawable-xxxhdpi-v4/fab_shadow.png SHA1-Digest: vzNoDRf8pV/kEmky3cnGOUTqQho= Name: res/anim/slide_from_top.xml SHA1-Digest: NRMSsU5qemKGLU44qx35gMLtOZg= Name: res/drawable-mdpi-v4/ic_warning_dark.png SHA1-Digest: URWCsTSGrzecwznLDboFrYlHiC0= Name: res/drawable-hdpi-v4/ic_content_copy_light.png SHA1-Digest: NAPM4erdO2ZajdfUwR7WwzzfiZg= Name: res/drawable-hdpi-v4/received_bubble.9.png SHA1-Digest: l1DcWbaW/Gm1hFu3pEriKWh+Z2g= Name: res/layout/keyboard_right_drawable.xml SHA1-Digest: K21qYkNJh5XhOn/Sn8+ArpXPZfI= Name: res/drawable-hdpi-v4/abc_list_pressed_holo_dark.9.png SHA1-Digest: igV6Z9qyPsoUBNkEZPzj+DDt0kE= Name: res/drawable-xhdpi-v4/ic_lock_white_24dp.png SHA1-Digest: Nd1pIdgHJVHHAL0NiktI2OyXbvY= Name: res/drawable-xhdpi-v4/ic_reply_white_36dp.png SHA1-Digest: 6t2iywD4iSB/rF/1KvmFyTQmOjk= Name: res/color-v11/abc_tint_default.xml SHA1-Digest: 6ivey668H5tMb8e/bAHFxBOxxVE= Name: res/xml/preferences_sms_mms.xml SHA1-Digest: zYPVqXv2rxnBFNr7kEFeLeEbYHw= Name: res/drawable-xhdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png SHA1-Digest: +F9A3ApomF++Ccyi3vyA4AvmXMw= Name: res/drawable-xxhdpi-v4/ic_emoji_emoticons_normal_light.png SHA1-Digest: O2BU/QZwoCiGacOuy8IsSEnxbVE= Name: res/drawable-mdpi-v4/ic_emoji_places_normal_dark.png SHA1-Digest: h9r6yBVXX9vIhW73Se25qH8kUu8= Name: res/drawable-hdpi-v4/import_database.png SHA1-Digest: rvHksthTPdZ+b/YtO2T38BEGR58= Name: res/drawable-sw600dp-xhdpi-v13/ic_backspace_disabled_dark.png SHA1-Digest: pofIFch+lQqiVC0cbD5xIaHHIbc= Name: res/drawable-xhdpi-v4/ic_emoji_objects_normal_dark.png SHA1-Digest: fVTk0dUWbK3IstNScMq7367Txrg= Name: res/drawable-xhdpi-v4/ic_app_protection_gray.png SHA1-Digest: KObsnbXsPlvVPykyR+NyQ2JQ5Bc= Name: res/drawable-hdpi-v4/ic_action_warning_red.png SHA1-Digest: 2P7OlMAKjtzeGD1WWU6aRcsMhRo= Name: res/drawable-hdpi-v4/ic_info_outline_dark.png SHA1-Digest: RU2a39U19aGRAPSGBhqT3/dOimo= Name: res/drawable-hdpi-v4/ic_account_box_light.png SHA1-Digest: auyN/CyGOQJJ9WUe3XAUVUBXj9E= Name: res/drawable-xxxhdpi-v11/icon_cached.png SHA1-Digest: vVTW2VnbAOubUz1Uw/wzUlWqN0A= Name: res/drawable-hdpi-v4/ic_notifications_black.png SHA1-Digest: ZfQORyIXtZxVt0UI5DfS/0h6tbM= Name: res/drawable-xxhdpi-v4/switch_thumb_disabled_holo_light.9.png SHA1-Digest: jATtINSdqgXWt2HXEF7xpSXBhyY= Name: res/drawable-mdpi-v4/fab_shadow.png SHA1-Digest: RqAVOrWqYhtmaGpjesdDpNjL9JI= Name: res/drawable-hdpi-v4/alert.png SHA1-Digest: r7pqtO1yHsM4QXsGGPPsbZDqN6Y= Name: res/drawable-hdpi-v4/ic_emoji_places_normal_light.png SHA1-Digest: E8FCabJLAd9/PEHPGM3T7HNt3qs= Name: res/drawable-hdpi-v4/ic_reply_white_36dp.png SHA1-Digest: bpDCb4aXWNRK/MO0ktD57dKMZYQ= Name: res/drawable-xhdpi-v4/spinner_focused_holo_light.9.png SHA1-Digest: GULvT2ExbYbkv75q+kEpZUH9u2M= Name: res/drawable/conversation_list_item_read_background.xml SHA1-Digest: xcSjIApmT8lvdb1b+qfO7Z3ohSE= Name: res/drawable-xhdpi-v4/ic_create_white_24dp.png SHA1-Digest: hjecZ+Yk3NTShxd3KTVCHRz1S+E= Name: res/xml/preferences_appearance.xml SHA1-Digest: uzgOR0TINN1MzVwVpddmu/6j+IU= Name: res/drawable-xxhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png SHA1-Digest: AEtucgE23w85/isDYqNTWlxruFg= Name: res/anim/abc_slide_out_top.xml SHA1-Digest: 8TSJifDdlA1J4leugOVG9Peg+k4= Name: res/drawable-mdpi-v4/spinner_default_holo_light.9.png SHA1-Digest: nxjthQ61TKMyJJ5/85W2SC6qs+M= Name: res/color-v23/abc_tint_switch_thumb.xml SHA1-Digest: bhKfYPTUVR2gp087h+Lq2DP8VnM= Name: res/drawable-xxhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png SHA1-Digest: Ouio2uWvH7XLWYfqzUwzwmjm/jM= Name: res/drawable/design_bottom_navigation_item_background.xml SHA1-Digest: CWW4mfISMH+Ot1PsBcU5OOmhiCU= Name: res/color-v23/abc_tint_spinner.xml SHA1-Digest: fRj3PTupUzBlYT1O+bKkZbmomws= Name: res/layout-v11/notification_template_big_media_custom.xml SHA1-Digest: lnCSMdxdluML3wH5DsZqz/3sUrs= Name: res/drawable-v21/conversation_list_item_read_background.xml SHA1-Digest: lmBx/sr78+ebREZT82kMdf0qLq4= Name: res/drawable-mdpi-v4/ic_delete_black.png SHA1-Digest: eX/Ck6P/dt7ey0W48PziO1coyoE= Name: res/layout/conversation_list_fragment.xml SHA1-Digest: xt20Np2/qZTXVHgGYRcw8uSHwt0= Name: res/drawable-xhdpi-v4/ic_notifications_black.png SHA1-Digest: smFpvPsUz0+QVjm5sc1F3iIqqtM= Name: res/raw/whisper.store SHA1-Digest: hLdMCWiNl4nJacL59TYQ8lK+JUs= Name: res/drawable-hdpi-v4/ic_emoji_recents_activated_dark.png SHA1-Digest: XcZvxaGT8PWZ+zWSPdAf28t3GxM= Name: res/anim/fade_scale_out.xml SHA1-Digest: lhxvAKLBK4FCXkyEAaT5FHhx6Eg= Name: res/drawable-xxhdpi-v4/ic_video_light.png SHA1-Digest: QHrdCTXe0XaJK4V7TnGjYgI5vQA= Name: res/drawable-hdpi-v4/ic_reply.png SHA1-Digest: aS2epjYciCOwQeQwokaHqSA0Kkk= Name: res/drawable-xxhdpi-v4/abc_textfield_default_mtrl_alpha.9.png SHA1-Digest: p9584WImSwr0082/N/zkcvVq7yo= Name: res/drawable-xhdpi-v4/ic_image_light.png SHA1-Digest: vNLYUm+Q1uaaY6KCo643W3T3i0Q= Name: res/drawable/conversation_item_header_background_dark.xml SHA1-Digest: wfTAaLO+JvtusD4leaJ4hBj59Wg= Name: res/drawable/emoji_category_recent_dark.xml SHA1-Digest: Ou8VeFgJTkCmSB3Aw6SoPPZapVY= Name: res/drawable-ldrtl-xhdpi-v17/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: xzR4QYhDLijnhAqvCWT+8WMmqNQ= Name: res/drawable-xxhdpi-v4/ic_emoji_symbols_normal_light.png SHA1-Digest: f/DVMcd6iAmf5YuZMmfbIpZP9SA= Name: res/drawable-mdpi-v4/ic_forum_black_32dp.png SHA1-Digest: i3yWkE76Gg6P8i9/QIWByBH1p3g= Name: res/drawable-xxhdpi-v4/ic_lock_white_24dp.png SHA1-Digest: JviQD0rQKh7EoL50IzwpezlyagY= Name: res/drawable-ldrtl-xxhdpi-v4/ic_send_white_24dp.png SHA1-Digest: neMCf3BKGMIjG3BpX7B7FovUlA0= Name: res/drawable-hdpi-v4/ic_contact_picture.png SHA1-Digest: qhRnJGObRC7YZLVHGoSvhBwTXCQ= Name: res/drawable-mdpi-v4/ic_textsms_black_32dp.png SHA1-Digest: I+EfkWfDMZiDUUBX9ePVNDmWy9o= Name: res/drawable-hdpi-v4/ic_push_registration_reminder.png SHA1-Digest: dlznighMw7183iJMxTr9dbJsIjs= Name: res/drawable-mdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png SHA1-Digest: jnLnSBDt0id1WrhEiz1zra3RW6M= Name: res/drawable-xxhdpi-v4/spinner_pressed_holo_light.9.png SHA1-Digest: tkF8+78AlJ7clz2yc6mvf/TVJfQ= Name: res/drawable/design_password_eye.xml SHA1-Digest: C+kKIgD0x3Pqpcr7269QZUkuaEQ= Name: res/drawable-xxxhdpi-v4/ic_clear_white_24dp.png SHA1-Digest: E9E+hrQdXlyQOjL2qvnFUBjtFaI= Name: res/menu/media_preview.xml SHA1-Digest: GaxiRvvAk1qGdqbi6bjS1OXbwEo= Name: res/drawable-mdpi-v4/ic_emoji_emoticons_activated_light.png SHA1-Digest: GJZwQNDqmqKM/Z3eNUCy074AQB0= Name: res/drawable-mdpi-v4/switch_thumb_pressed_holo_light.9.png SHA1-Digest: MvirMfKCPj8aRdrk/qCwNQly7iQ= Name: res/drawable-xxhdpi-v4/ic_scroll_down.png SHA1-Digest: yhd3mLL6H+JcdmLZj5Z406XYtOU= Name: res/drawable-hdpi-v4/ic_group_white_24dp.png SHA1-Digest: 61dvQcQoxhHeRLerio6OApFlLT8= Name: res/layout-v21/message_details_header.xml SHA1-Digest: 3gX04TU0Nkpyb5WVtUNCH0ZiZHE= Name: res/drawable-hdpi-v4/abc_list_pressed_holo_light.9.png SHA1-Digest: 8fFdZoyOA0FyEP0K/a0QnLk0bbE= Name: res/drawable/abc_ratingbar_small_material.xml SHA1-Digest: gaRS2sbjCfcJo3xOrkhIdr9XwZg= Name: res/drawable-mdpi-v4/abc_text_select_handle_middle_mtrl_light.pn g SHA1-Digest: izNlbouSIXW9/WiRR/UlgyT9VEs= Name: res/drawable-xxhdpi-v4/abc_text_select_handle_right_mtrl_light.p ng SHA1-Digest: Fv+MHn2EjJlYrnRlsip5/7aL0Wg= Name: res/drawable-xxhdpi-v11/icon_notification.png SHA1-Digest: 85ruvoq6PBpFplSac+00p8PBUsk= Name: res/drawable-mdpi-v4/ic_menu_remove_holo_light.png SHA1-Digest: 9pNClz9jSYsj/xjIXcqo7rWRk0c= Name: res/layout/abc_activity_chooser_view_list_item.xml SHA1-Digest: 4Hicu2mJTSHBznRK16UoQpE1Whk= Name: res/drawable-xxxhdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png SHA1-Digest: bvkSnzG+4r12dRWJRd9DLrqCzfU= Name: res/color/text_color_dark_theme.xml SHA1-Digest: fjkGte3Nla6U3vUNDDxp2dPLM2s= Name: res/drawable-xhdpi-v4/abc_textfield_search_default_mtrl_alpha.9. png SHA1-Digest: s9/qxuNt34tuDKZEbu3WbQxLGWs= Name: res/drawable-xhdpi-v4/ic_emoji_symbols_normal_light.png SHA1-Digest: aRSYzqP0HXhsdVDrbCyRbukPeiA= Name: res/drawable-mdpi-v4/ic_badge_24dp.png SHA1-Digest: BdJRa0IBis/loLKsIw0lGCrUqQo= Name: res/drawable-xxhdpi-v4/ic_delete_black.png SHA1-Digest: feENcEBXL3aQfblBa9o0842DEYk= Name: res/drawable-xxhdpi-v4/ic_reply_white_36dp.png SHA1-Digest: ooBQaFRd9+ZjgadIW/yiEt75/dw= Name: res/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_000.png SHA1-Digest: 21KY7k5nhCbUYd/od+FyqRUvm2Q= Name: res/drawable-xxxhdpi-v4/ic_circle_fill_white_48dp.png SHA1-Digest: 48zB9zw5i2vmnb/k/rzYZHb+CeQ= Name: res/drawable-xhdpi-v4/dialog_full_holo_light.9.png SHA1-Digest: bymS8SWJTYEscLT8l43bUsTt+Lg= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_972 SHA1-Digest: Tl50phuH8I0GxBh/Drf9vHens0Q= Name: res/layout-v16/audio_view.xml SHA1-Digest: 6GUjWKSxy/K5ZkyC9d3nuD6mN1I= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_971 SHA1-Digest: US/xxHef76UTD882Ez5EnNvcaws= Name: res/drawable-v21/design_bottom_navigation_item_background.xml SHA1-Digest: O27AiByKZrx4CKy6zEVZez3VUaQ= Name: res/drawable/conversation_list_divider_shape_dark.xml SHA1-Digest: RMH4uusB0dYbPXDmwQzuDD/bSH8= Name: res/layout-v22/abc_alert_dialog_button_bar_material.xml SHA1-Digest: iGOnSHYpoL++obhhMoiTd74IapQ= Name: res/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png SHA1-Digest: kBG1gtv3r0AKtRMQRJeeGdtStSk= Name: res/layout/push_recipients_panel.xml SHA1-Digest: f7123M9+YBkP1ZmIP/65nFaiIeE= Name: res/layout/blocked_contact_list_item.xml SHA1-Digest: f2DCf36iddblf5w+PSJRz1dehPw= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_595 SHA1-Digest: 9MZietuaP6dH4UDzQ6o0uNb4wl4= Name: res/drawable/emoji_category_symbol_light.xml SHA1-Digest: xjaDmLzBnB0hW1a4I4qll3kGmGw= Name: res/drawable-hdpi-v4/ic_emoji_emoticons_normal_dark.png SHA1-Digest: 7avTaMmRkZG49YogfofrfcXTirQ= Name: res/drawable-xxhdpi-v4/abc_list_pressed_holo_dark.9.png SHA1-Digest: VPmKAqmLJ6ke7a8XellbYKiIBh8= Name: res/drawable-xhdpi-v4/ic_emoji_nature_activated_light.png SHA1-Digest: iD0MX3tTshFLF26bw9o0rW/HaoE= Name: res/drawable-xhdpi-v4/icon_cached.png SHA1-Digest: swnypVnzZ3VLZov4zTo/innOTRw= Name: res/drawable-hdpi-v4/switch_bg_disabled_holo_light.9.png SHA1-Digest: Evi73cVw1F7NXXrV76QvRIFOeFA= Name: res/drawable-mdpi-v4/ic_emoji_nature_normal_dark.png SHA1-Digest: tq5oQ0ncJEa6wpFUeGkuUZWYoks= Name: res/drawable/ic_backspace_light.xml SHA1-Digest: XLvzKxzL6EDb31eem2HstBr+Ti0= Name: res/drawable-ldrtl-xxxhdpi-v4/ic_send_white_24dp.png SHA1-Digest: NtMB3MWJCzVmpluwSDyBqpeFgVw= Name: res/drawable-xhdpi-v4/ic_forum_black_32dp.png SHA1-Digest: I/jyPgMz5rDfZSv5f/8nG40VrMw= Name: res/drawable-hdpi-v4/ic_emoji_places_activated_light.png SHA1-Digest: Sgr83atHA6ctaDZrm2rSA+pUw4Y= Name: res/drawable-hdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png SHA1-Digest: GsekZVTmqt7NzcA9FoawMuFDm0E= Name: res/drawable/rounded_rectangle.xml SHA1-Digest: gcxzAPBwNA4efMc6M4NOp+2OQGs= Name: res/drawable-xhdpi-v4/ic_lock_white_18dp.png SHA1-Digest: cX/Nnkdcm8V9xd/cWBHr+aBant0= Name: res/drawable-hdpi-v4/lockscreen_watermark_light.png SHA1-Digest: kZukE3axdMWdS8KMYqwFzRR9cf4= Name: res/layout/conversation_activity_attachment_editor_stub.xml SHA1-Digest: 0wmFeB0MoEeiCtDugBWYJUu1Rnc= Name: res/drawable-hdpi-v4/ic_lock_light.png SHA1-Digest: FSvq/80FI0ee9qsxI/yelpUuUdw= Name: res/drawable-xhdpi-v4/ic_forum_grey_32dp.png SHA1-Digest: 3ZsizSTpofPJJ/hCVe1Pa1PrNBU= Name: res/layout/color_fragment.xml SHA1-Digest: FC02DqEKBA/g9hwoEHwtgyXOMA4= Name: res/drawable/widget_unread_count_background.xml SHA1-Digest: ci1aSzllcYoUo9M2Etp57yZTv6E= Name: res/drawable-xxxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png SHA1-Digest: 3kAOCvPKDybNG1/Fr21Y+cg522o= Name: res/drawable-v21/circle_touch_highlight_background.xml SHA1-Digest: RCp6OOrQn1/KjE6jGOF2niZjcBY= Name: res/layout-v21/recipient_preference_activity.xml SHA1-Digest: nbiRs4SeO9RtEoXZhPhIKjT8i5E= Name: res/drawable-mdpi-v19/switch_thumb_pressed_holo_light.9.png SHA1-Digest: UGB8G0Ku26t0HqFX7D5HJk45fq0= Name: res/drawable-xxhdpi-v4/ic_video_dark.png SHA1-Digest: r1SFHM1zyGuGIvLu1LQ9+3+NZhg= Name: res/drawable-xxxhdpi-v4/icon.png SHA1-Digest: o5/gjAEwK5uCNV8+mM/jhtLwPP0= Name: res/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005 .png SHA1-Digest: LpI9vSEdW/n3iNzTIDS8ecyd2BM= Name: res/drawable/emoji_category_objects_dark.xml SHA1-Digest: JDQouPeLrbGMSt3Uc/WHtIWqhSQ= Name: res/drawable-xxxhdpi-v4/ic_archive_white_48dp.png SHA1-Digest: rRMs1TNzzsRv7Yyw99xHFZ2zD5E= Name: res/drawable-xxhdpi-v4/fab_shadow_mini.png SHA1-Digest: PtjRVIdIcmcCzH1fbKoXaMb81yA= Name: res/layout/conversation_item_received_audio.xml SHA1-Digest: xSdWgwjagl0eqFLnjvPErH6cnP4= Name: res/drawable-mdpi-v4/sent_bubble.9.png SHA1-Digest: 1sjPXZyhkKG475gQNSuvAeTaun4= Name: res/drawable-xxhdpi-v4/ic_attach_white_24dp.png SHA1-Digest: glGWjWXhx73RSMBCTHMi/Yx1Z9s= Name: res/drawable/compose_background.xml SHA1-Digest: zAZp74C8XCW9PDL4CsRYvvQmq9c= Name: res/layout/date_picker_view.xml SHA1-Digest: n2p258FrajDnpOM4LTVOyAIaUwE= Name: res/drawable-mdpi-v4/ic_content_copy_dark.png SHA1-Digest: a6uq3VE/cFgA0V3jDMbP2hSkXwU= Name: res/drawable-mdpi-v4/dialog_full_holo_dark.9.png SHA1-Digest: f6ia9cfObNSnjO92EThmcdso0Qg= Name: res/drawable-mdpi-v4/ic_emoji_recents_normal_dark.png SHA1-Digest: dFtiEYS7qHuVIHVVbohEIZ3I0Jg= Name: res/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_015.png SHA1-Digest: 91+SjRwS48rnNSkJl3hukfpvmrk= Name: res/drawable-mdpi-v4/abc_ic_star_half_black_36dp.png SHA1-Digest: nEfj0nfPBbqur1eTMAml8UkS7G0= Name: res/drawable-mdpi-v4/divet_lower_right_dark.png SHA1-Digest: o9gMiS7KJCHI0ywxXuJxjHLuU9U= Name: res/drawable-xxhdpi-v4/ic_image_light.png SHA1-Digest: 5xOF+gE95fgQ0Gz1zSg+BVQk0aM= Name: res/menu/contact_selection.xml SHA1-Digest: SKnxzWsnmL/UIhUg70UxYUrDcgI= Name: res/drawable-xhdpi-v4/ic_menu_search_holo_dark.png SHA1-Digest: 2ACOo9oHVGu1g9Rx+lfr7Y09Jvg= Name: res/drawable-hdpi-v4/dialog_full_holo_dark.9.png SHA1-Digest: 6D+naJ/vT+snQDqAQOf8FDr7pCM= Name: res/color/abc_tint_switch_thumb.xml SHA1-Digest: kK0VL//OBUElY330yObYULISlj0= Name: res/drawable-hdpi-v4/ic_backspace_disabled_light.png SHA1-Digest: 8YzE4GMncrZ+4gIgTYYR3Eyhr9o= Name: res/drawable-xxhdpi-v4/ic_reply.png SHA1-Digest: QaSH4wLqEhMDOSvU8Sg3e6uFNVY= Name: res/drawable-xxhdpi-v4/ic_send_insecure_white_24dp.png SHA1-Digest: JAX6v03dmClzJWdLrZj6B+QQ5Gc= Name: res/drawable-hdpi-v4/ic_message_white.png SHA1-Digest: qwRVGYz+PZL+MPV3l+wOOTdgv28= Name: res/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.pn g SHA1-Digest: Fs9wHncn0Hs9X2gBgK72twTeEAg= Name: res/layout-v17/abc_popup_menu_header_item_layout.xml SHA1-Digest: 62MdoB5jCc06SiJOfv6kmJw8no8= Name: res/layout-v17/notification_action.xml SHA1-Digest: U+0PyL0Pd5Lunbf/DvhJXTLqMqk= Name: res/drawable/background_pane.9.png SHA1-Digest: uRUD8GBrgiNG4l5dimWEZT7nc20= Name: res/layout-v16/conversation_item_received.xml SHA1-Digest: WS7AMHAoLxDd2f3I3Gydci3EryY= Name: res/drawable-xhdpi-v4/ic_arrow_forward_light.png SHA1-Digest: Q8NfFFxKmV3ZlwaVDlTlAg69MFU= Name: res/drawable/emoji_category_people_light.xml SHA1-Digest: F9p5OjTrypOtdp8msjXNvhN3nnI= Name: res/layout/notification_template_media_custom.xml SHA1-Digest: wrwK3C537ItdoLZSN6BtoO9+hAY= Name: res/drawable-xxhdpi-v4/ic_error_red_18dp.png SHA1-Digest: 6+r7bLSguP1+dorc7POz7QL9T8A= Name: res/drawable-xhdpi-v4/ic_forward_white_24dp.png SHA1-Digest: N7S8d92IXyTHz0jDB+lI/mNNWCE= Name: res/drawable-xxhdpi-v4/ic_keyboard_white_24dp.png SHA1-Digest: KRcW9K/bL9qALOa7E3x8ohHWkAY= Name: res/drawable-xhdpi-v4/ic_message_black.png SHA1-Digest: VwXJ4mI146cTkwjCNDFc6P9CaRg= Name: res/drawable/emoji_category_recent_light.xml SHA1-Digest: YzLOI+cBWx5WayWrANYRRgk/t10= Name: res/drawable-xxhdpi-v4/ic_app_protection_gray.png SHA1-Digest: wDTdKPD083yELY3jtCNet04sGOA= Name: res/anim-v21/design_bottom_sheet_slide_in.xml SHA1-Digest: /sfmaMejemtjucshId3pph9anUM= Name: res/drawable-xhdpi-v4/list_selected_holo_light.9.png SHA1-Digest: H2X9BKxBdFAOYEppP+vczoJ/LCU= Name: res/drawable-xhdpi-v4/ic_send_insecure_white_24dp.png SHA1-Digest: PFKnv0x4g4imYkMEJ+V8ZDHyM/8= Name: res/drawable-hdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png SHA1-Digest: kv8Z2aiviTOXDoPOY4/vyUE5lng= Name: res/drawable-xhdpi-v4/notification_bg_normal_pressed.9.png SHA1-Digest: iJFesSsAAmE1zFB9XbiCZW1cKKU= Name: res/drawable-xxxhdpi-v4/ic_scroll_down.png SHA1-Digest: UtXgucam8A78b2zfRdwO5GI5Twk= Name: res/drawable-xxxhdpi-v4/abc_text_select_handle_left_mtrl_light.p ng SHA1-Digest: sbqUAnAP9Ic0aSxtt345LLubAZ0= Name: res/drawable-mdpi-v4/ic_app_protection_black.png SHA1-Digest: ENtLHs6kymUD5VLCkQWFsSvZ+fg= Name: res/drawable-xxhdpi-v4/ic_error_white_18dp.png SHA1-Digest: 6hF1pGQtVr3M91PDkMDkmiXGDRQ= Name: res/drawable-xxhdpi-v4/ic_content_copy_light.png SHA1-Digest: 9F6j9eOSjGQk85A6rAH1QAEZLT4= Name: res/layout/abc_screen_toolbar.xml SHA1-Digest: ZOJ5DhP8CmytjHpZxvV6Ox8Ivp0= Name: res/drawable-xxhdpi-v4/abc_ic_star_half_black_48dp.png SHA1-Digest: ELHP/ybr6BY6lvp/69V+RfkZTGQ= Name: res/layout/database_upgrade_activity.xml SHA1-Digest: ndP+rGDj7Cfsf8wp3rsVdbSo7H4= Name: res/drawable-v11/emoji_category_symbol_dark.xml SHA1-Digest: S4KbeTJw5wwr/9tLDcglMDRZ4A4= Name: res/drawable-mdpi-v4/ic_download_circle_fill_white_48dp.png SHA1-Digest: GOV2soF5+mD1AFiHQTBLOn79Ha4= Name: res/drawable-xxxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: OqSIVlkrKIYR7cyOW2HdJP/h5io= Name: res/drawable-xhdpi-v4/ic_select_all_white_24dp.png SHA1-Digest: KR2sKphgTXJ9QE7ONLcq1NDJHlk= Name: res/drawable-xhdpi-v4/switch_bg_disabled_holo_light.9.png SHA1-Digest: lihXWFZsEX3Y2VZnZQ8xgJ4HqYc= Name: res/layout/transfer_controls_view.xml SHA1-Digest: BsRRJ+OjUV6SDPbXjABWEiSxB6g= Name: res/drawable-mdpi-v4/sms_system_import_icon.png SHA1-Digest: HPSbBI5mtTAAmUMwy9xiWhVnzBQ= Name: res/drawable-xhdpi-v4/icon.png SHA1-Digest: QhfVY7UBQilNAfrHJXWil0t74RI= Name: res/drawable-xxhdpi-v4/abc_text_select_handle_left_mtrl_light.pn g SHA1-Digest: rSwsu8lyFJ2T0/pa5u4O8/J64aI= Name: res/anim/slide_from_right.xml SHA1-Digest: R/EvCIayWDXTgntzi87/TffROjA= Name: res/drawable-mdpi-v4/ic_emoji_places_normal_light.png SHA1-Digest: 58Y81AI4id/KD2w57lfiwUhD0dw= Name: res/drawable-xxhdpi-v4/switch_thumb_pressed_holo_light.9.png SHA1-Digest: 7rG4iG6xMyy/xID9Y4eo9y0SIgE= Name: res/layout/design_layout_snackbar.xml SHA1-Digest: yqHI1PppkPcFlQunVhDsTy2rRdA= Name: res/drawable-mdpi-v4/textfield_default_holo_light.9.png SHA1-Digest: UnLnYU6MD2MOR62lCItQOD29xjE= Name: res/drawable-hdpi-v4/ic_menu_add_field_holo_light.png SHA1-Digest: 0pX1gONP4nspRI/v0IbK5Z+P4Eg= Name: res/drawable-v21/dialog_background.xml SHA1-Digest: hxhcDAG+dKyz8Ah0OvgCPwSq9eM= Name: res/drawable-xxhdpi-v4/ic_unlocked_white_24dp.png SHA1-Digest: BjECE1oYoMzYSX45C/uZfe5tDxE= Name: res/layout/reminder_header.xml SHA1-Digest: Ns9bmVbQQKHOqKwAFfIX2UM4XL4= Name: res/drawable-mdpi-v4/ic_emoji_people_normal_light.png SHA1-Digest: A2Tz2rbQYHkLf15VCHn8gEVNyE4= Name: res/drawable-xxhdpi-v4/ic_image_dark.png SHA1-Digest: nwFOkQ8DjRor0j8GFbRNQcjfpig= Name: res/drawable-xhdpi-v4/ic_done_white_18dp.png SHA1-Digest: EvplcFpvBiScbuFWdSdMbXMu4QU= Name: res/drawable-xxhdpi-v4/list_longpressed_holo_light.9.png SHA1-Digest: I+5+I8Glvy2IsIw0hQ/hFirU8cE= Name: res/drawable-hdpi-v4/notification_bg_low_normal.9.png SHA1-Digest: D2PhKM51tYZo8a79riJ3XiUD2nc= Name: res/drawable-xhdpi-v4/ic_download_circle_fill_white_48dp.png SHA1-Digest: jsnHVwkh+0nHcrMtuFPHqgaMREg= Name: res/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_015.png SHA1-Digest: doXTq0PGlseahO7qxrAxAjB7JIA= Name: res/drawable/abc_list_selector_background_transition_holo_light. xml SHA1-Digest: AdlBQF7mCKx3VlJQ4HaRjQeNXyo= Name: res/layout/recurrencepicker_freq_item.xml SHA1-Digest: dHjPcT33piN4BkyJPRFjAA6NJpA= Name: res/drawable-xhdpi-v4/ic_arrow_forward_dark.png SHA1-Digest: 6cKLUxI1s8foaHCASWI1lB3ux9U= Name: res/drawable-xhdpi-v4/notification_bg_low_normal.9.png SHA1-Digest: dnObiFrk1DvtR5VGgJWQwE6oNeo= Name: res/drawable-mdpi-v4/abc_text_select_handle_left_mtrl_dark.png SHA1-Digest: Osfw11YL10WQkjXxgGt64AbLp0M= Name: res/drawable-hdpi-v4/ic_content_copy_dark.png SHA1-Digest: hnpe+tquN9xGysKN2t7576KXLfc= Name: res/layout-v17/notification_template_big_media_narrow.xml SHA1-Digest: BsNv3+dqgVFy8TCxis6ZPV+2cn0= Name: res/drawable-mdpi-v4/ic_volume_up_dark.png SHA1-Digest: e4xQamTr/9wBswXOayvmULk7s2s= Name: res/drawable-mdpi-v4/ic_volume_off_white_18dp.png SHA1-Digest: 5z/S7DZRXLmyKY2siPabSa5l9io= Name: res/drawable-xhdpi-v4/ic_audio_dark.png SHA1-Digest: EDy61rKaw8fTrPT3VUAiqhESnBc= Name: res/drawable-hdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png SHA1-Digest: 9I5uBrEaa3rXA0AACtIBgaW++Q4= Name: res/color/abc_primary_text_material_dark.xml SHA1-Digest: EtoRUbkcIiZooZPruurTjZllNt0= Name: res/layout/notification_template_media.xml SHA1-Digest: 6dpJaNdMjrssiZxrD+YNOMn8CeY= Name: res/drawable-xhdpi-v4/list_focused_holo.9.png SHA1-Digest: Kw0Qo9eKlw06/oxLHYSWR6VftBw= Name: res/drawable-hdpi-v4/list_selector_background_selected.9.png SHA1-Digest: otna3L08LP49gXxuQvuRvsKnTT4= Name: res/drawable-xhdpi-v4/ic_emoji_places_normal_dark.png SHA1-Digest: CQi33/WUEJ3O3cVy7wA3KmXUC4A= Name: res/drawable-xxhdpi-v4/transfer_controls_background.9.png SHA1-Digest: YwBh/LyZpJuphfkJ+yVu50osyR8= Name: res/drawable-hdpi-v4/ic_call_split_white_24dp.png SHA1-Digest: 4Luz8FsAMmkLDUFlDBPNdM6d2B4= Name: res/layout-v13/select_dialog_singlechoice_material.xml SHA1-Digest: PgA++QZN4J6HviFvlqLyaQTbPG0= Name: res/layout-v17/notification_template_custom_big.xml SHA1-Digest: akAGdgzPFfffe0XPHUWTo4fuwXo= Name: res/drawable/conversation_item_sent_indicator_text_shape_dark.xm l SHA1-Digest: oIWtXE+21oYZ9f0XB2vCLpNSc/8= Name: res/drawable-hdpi-v4/abc_text_select_handle_middle_mtrl_light.pn g SHA1-Digest: 10kBvBUte2AZyag/8SjtRBJJBog= Name: res/drawable-xxhdpi-v4/abc_ic_star_half_black_36dp.png SHA1-Digest: JPdqp3Utz4eGl5Yd4o1J/WbUozw= Name: res/color/abc_tint_switch_track.xml SHA1-Digest: Kal6SSve9vbSTh0eyJn+orXHHIw= Name: res/drawable-xxxhdpi-v4/ic_send_insecure_white_24dp.png SHA1-Digest: wBky0wcelBLG2sq2DsTGAKlibKU= Name: res/drawable-mdpi-v4/telephone.png SHA1-Digest: /zVGgLPtF+whyI9zAzCCUGVqt1M= Name: res/drawable-mdpi-v4/ic_save_all_white_24dp.png SHA1-Digest: 3pl9wu2bcFqQPin53Beo0TCY4wc= Name: res/layout-v21/notification_action.xml SHA1-Digest: +5NrwFa4hY8vqOpBznKVUXR48sk= Name: res/drawable/navigation_empty_icon.xml SHA1-Digest: McRL3inoRGPODvRa7Grnm7zZLr8= Name: res/drawable-xhdpi-v4/ic_emoji_recents_activated_dark.png SHA1-Digest: y0SRoxM8gzHC/WhQK2QoqoYWsAA= Name: res/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png SHA1-Digest: NRcHxLdsX/Th2xTrioD1KYFYeK8= Name: res/drawable-xxhdpi-v4/sent_bubble.9.png SHA1-Digest: JlBo2LcLmyvycEGbrbpgPJ1rbv8= Name: res/drawable/switch_track_holo_light.xml SHA1-Digest: Va1z0AM2djF/K7f2GOqxfWAVrPY= Name: res/drawable-hdpi-v4/ic_emoji_emoticons_normal_light.png SHA1-Digest: eJa0rEt3drbZs/CZ5jTBlNzn0rg= Name: res/drawable-xxhdpi-v4/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: vs5sXFVGnqpXFZuXg+uY+nALal4= Name: res/layout/abc_activity_chooser_view.xml SHA1-Digest: bm1dSgfcpygi99m3rg+75RoVcT0= Name: res/drawable-mdpi-v11/icon_cached.png SHA1-Digest: 1IT19k6a+GsikYVyLSFHJRGte/0= Name: res/drawable-xhdpi-v4/abc_ic_menu_share_mtrl_alpha.png SHA1-Digest: eobI6VkMzG98QREBV+/eaTz00LY= Name: res/drawable-xxhdpi-v4/ic_menu_search_holo_light.png SHA1-Digest: zArtT76Uh6rEAZylzjOFZOdJ0xc= Name: res/menu/key_scanning.xml SHA1-Digest: 7OX9fzhB/KnRXH168emKX9Qmmp0= Name: res/layout-v16/conversation_item_sent.xml SHA1-Digest: rYlPjTnG3eaUUmmlTdVh9VHpWrw= Name: res/drawable-hdpi-v4/ic_emoji_nature_normal_dark.png SHA1-Digest: B1ybbMnXI/G48h7heHEwxmULCOo= Name: res/layout-v17/notification_template_big_media_custom.xml SHA1-Digest: fZebd6F0W3rnnXGDkVTYqHKDtp4= Name: res/drawable-xhdpi-v4/ic_mood_white_24dp.png SHA1-Digest: oaZTnKdVIywIQl57pKnKCt3DOw0= Name: res/layout/media_view_remove_button.xml SHA1-Digest: tjJoTuSUP7T7iZmZHT3Dy/pkLGg= Name: res/drawable/conversation_attachment_close_circle.xml SHA1-Digest: x0pAqU4e/K7xUap+gtDmVChr00Q= Name: res/drawable-hdpi-v4/ic_push_gray.png SHA1-Digest: 3arYaP6KZtXoMW3ILggQe4fxYvA= Name: res/animator/bottom_pause_to_play_animation.xml SHA1-Digest: 7f8HiUwoTj84cBIvXQhtx6kFMlc= Name: res/drawable-xhdpi-v4/ic_emoji_emoticons_normal_light.png SHA1-Digest: U0tsH4HQqplILpRU9IYTDB1g+Bw= Name: res/drawable-xxhdpi-v4/switch_bg_focused_holo_light.9.png SHA1-Digest: 7Al4NEadlSNDthHtuP+MABLRxJs= Name: res/layout/empty2.xml SHA1-Digest: wnS9P8OkImc/tnKJnsSet9DvBz0= Name: res/layout/design_menu_item_action_area.xml SHA1-Digest: +CaSrRO+YIeuLR//AbmNORoSW6o= Name: res/drawable-v11/emoji_category_symbol_light.xml SHA1-Digest: COUSagF+F1d0/z9XTocQuYRdoVQ= Name: res/layout-land/calendar_date_picker_dialog.xml SHA1-Digest: iqpjA1eAjjWXIOu09vGX/wjNjVE= Name: res/drawable/ic_backspace_dark.xml SHA1-Digest: ArAaZ6HHiiuf0ps1yq9gj8Okqvg= Name: res/color/abc_tint_spinner.xml SHA1-Digest: w9Ukqef88kQScnBfLuUgAvsMqF4= Name: res/color-v23/abc_tint_btn_checkable.xml SHA1-Digest: DmZR1IvQ3zUPR3/rzr0yGhi4FgU= Name: res/layout/keyboard_right_drawable_with_header.xml SHA1-Digest: EujZ5fvmot/8WDge20sozmY1dEE= Name: AndroidManifest.xml SHA1-Digest: aSiqCQO2JS5dp2XosozmPgZuYDI= Name: res/drawable-xxxhdpi-v4/ic_reply_white_36dp.png SHA1-Digest: DTQXA52dZ/Aov2xiYYQ7Ob7wOOs= Name: res/drawable-hdpi-v9/icon_notification.png SHA1-Digest: TaP5pcnL3kExAb7rawMrwW/A/is= Name: res/drawable-v21/avd_show_password_2.xml SHA1-Digest: qzTtTY4E4ILGYDhNdhW0uOuFdm4= Name: res/layout/fragment_submit_log.xml SHA1-Digest: LWpzFy7pfL8GlXJToDVyMxKDMRo= Name: res/drawable-mdpi-v4/list_selector_background_selected.9.png SHA1-Digest: z7RgcGNXM0xZgKnWQDhCMI5jWU8= Name: res/drawable-xhdpi-v4/sent_bubble.9.png SHA1-Digest: x1LavT6RtZ4zK44/4apQftPRZf4= Name: res/drawable-mdpi-v4/ic_lock_white_24dp.png SHA1-Digest: Od4a/kCsNm29eQiGsbXnOXBRPpA= Name: res/drawable-mdpi-v4/ic_push_gray.png SHA1-Digest: d03BRjHQXMT5dxMInzZlfJyFgvs= Name: res/drawable-xhdpi-v4/textfield_disabled_holo_light.9.png SHA1-Digest: 6kr6+a7d5GsQfVMreRc+SmQOKzc= Name: res/color/abc_tint_default.xml SHA1-Digest: joM6fXjegJAOjP/K8fITfQbXaNY= Name: res/drawable/pause_to_play_animation.xml SHA1-Digest: ASS0dbMw+ywWJt8+9i8Ghf2NAEg= Name: res/drawable-xxhdpi-v4/ic_create_white_24dp.png SHA1-Digest: EKmwDF1HmTWNhbghgAJghsA4xTk= Name: lib/mips/libcurve25519.so SHA1-Digest: NF0l6yNnx4ptXGKTIP7BW3ZrJBc= Name: res/drawable-hdpi-v4/ic_attach_white_24dp.png SHA1-Digest: PSb/5+sj50OyW8z6vffHVCC1gSg= Name: res/drawable-mdpi-v4/ic_emoji_recents_normal_light.png SHA1-Digest: x6tdVSC9kMSRwb+iUYOgcFNhj80= Name: res/drawable/touch_highlight_background.xml SHA1-Digest: 0vN+oXyYyK2QUJlvoZa9aQ/hjl0= Name: res/layout-v11/notification_media_action.xml SHA1-Digest: xk6Nv+akCynB9a9MstuHUvrigc0= Name: res/drawable-xhdpi-v4/ic_play_circle_fill_white_48dp.png SHA1-Digest: nDgt5sLI0dxnit80P6JOMwBUxfM= Name: res/drawable-xhdpi-v4/ic_warning_light.png SHA1-Digest: udwVVOTRM5reilE7yAJKLaMHGcY= Name: res/drawable-v21/avd_show_password_3.xml SHA1-Digest: 8cb+Cb/wnTfMUkRNmCqPPMhQADM= Name: res/drawable-xxhdpi-v4/ic_forum_grey_32dp.png SHA1-Digest: 23qo1QLXrlfUfF5Eqhhxis1N7Xk= Name: res/animator-v11/rotate_90_animation.xml SHA1-Digest: vCHon/zb8+I+tgv5eAXXGWcch9Q= Name: res/drawable-xxhdpi-v4/divet_lower_right_dark.png SHA1-Digest: 7u76e0n4jj0tZe9nC/ILisA56kg= Name: res/drawable-xhdpi-v4/received_bubble.9.png SHA1-Digest: gcv90BhHf7spJ97oEUWp1vl90m0= Name: res/drawable-hdpi-v4/ic_send_secure_white_24dp.png SHA1-Digest: Pjohen4qe8BHqItpcnQLsgP79Kw= Name: res/drawable-xhdpi-v4/design_ic_visibility.png SHA1-Digest: Vl5TwBMiN5v++S+3P9T9173+CDE= Name: res/drawable-xxhdpi-v4/ic_emoji_nature_activated_dark.png SHA1-Digest: P6HchX55uRgUtx9k4TqeFSC7BCg= Name: res/drawable-v21/conversation_list_item_unread_background.xml SHA1-Digest: 7HbNlN7x9aDCWc1PA3Rn1AWku+4= Name: res/drawable-mdpi-v4/ic_emoji_flags_normal_dark.png SHA1-Digest: LZZgv0dmbJRyZidsyghMmuTpP1A= Name: res/drawable-xhdpi-v11/icon_cached.png SHA1-Digest: 6bdC1qEKQc3ehR3PNto+CUv4+bo= Name: res/drawable-xxhdpi-v4/abc_text_select_handle_left_mtrl_dark.png SHA1-Digest: GHXXmeZJAjb8EUS6oBJoqMQ0Mjg= Name: res/drawable-sw600dp-xhdpi-v13/ic_backspace_disabled_light.png SHA1-Digest: pofIFch+lQqiVC0cbD5xIaHHIbc= Name: res/layout-v13/database_migration_activity.xml SHA1-Digest: jjuIX4w9d/FstglsdrCiSpOLBYE= Name: res/drawable-xxhdpi-v4/ic_movie_creation_light.png SHA1-Digest: 2dGS1uf9JsTY2QBMa3u3WisZOhQ= Name: res/drawable-hdpi-v4/ic_add_white_24dp.png SHA1-Digest: eDLDjAoj3Aa+/QbuUjLGYJA6N3s= Name: res/drawable-hdpi-v4/fab_shadow.png SHA1-Digest: wGfZ2WL4AmVSxscVUGvQlQwMWP4= Name: res/drawable-mdpi-v4/ic_info_outline_light.png SHA1-Digest: Syo9p12wh15vMkgPW0hhnRarja8= Name: res/drawable-v21/conversation_list_item_unread_background_dark.x ml SHA1-Digest: rxvd8dvInRPnbVhpNTm0bkO8vU0= Name: res/layout-sw600dp-v13/three_keys_view_right_drawable.xml SHA1-Digest: hJIEke3HCJeFoTSsp3Fnr3ru1oM= Name: res/drawable-xhdpi-v4/ic_brightness_6_gray.png SHA1-Digest: RASxq+Vx8fv6bw+EefSqnNRxvy8= Name: res/anim/slide_to_top.xml SHA1-Digest: b/7F73oaOgl8QTgwjZirDWc5DsI= Name: res/drawable-v11/emoji_category_nature_light.xml SHA1-Digest: q91zOle9oQRxFFsMrVjfW5LncNw= Name: res/drawable-v21/design_password_eye.xml SHA1-Digest: HVHJTN2P1VIy7McjbW2zKNHTZ/k= Name: res/drawable-xhdpi-v4/abc_text_select_handle_left_mtrl_light.png SHA1-Digest: BrhcG9gnMxL5cZcJ0jDTmMfIM6o= Name: res/drawable-xhdpi-v4/ic_emoji_emoticons_activated_light.png SHA1-Digest: UUNraI2rSSmTZuRKp76+H6S34tw= Name: res/drawable-xhdpi-v4/ic_delivery_delivered_dark.png SHA1-Digest: q+GLHJiPjWZNX9rBcm75tWDwE0A= Name: res/drawable-xxhdpi-v4/abc_list_divider_mtrl_alpha.9.png SHA1-Digest: tC6uw2w2e+vYOuhd45mTIYRtoKE= Name: res/drawable-xxxhdpi-v4/ic_play_circle_fill_white_48dp.png SHA1-Digest: NH9ukfqebHQOumBZ8A+W0yLkURc= Name: assets/fonts/Roboto-Light.ttf SHA1-Digest: pjPMJmlNtysc9kyqUeZLQ8N3mzo= Name: res/drawable-xxhdpi-v4/ic_save_all_white_24dp.png SHA1-Digest: WR/22zimbblTw5FOPZt13OUTEAU= Name: res/layout/abc_alert_dialog_title_material.xml SHA1-Digest: jVZHwQ3okFh1QBuLZci4icsDWV4= Name: res/layout/import_export_fragment.xml SHA1-Digest: gasJgYghpkBfyEVIE76dsry19Vk= Name: res/drawable-mdpi-v4/abc_scrubber_track_mtrl_alpha.9.png SHA1-Digest: F8nLQoXKGiQPJCjl3TNIR/eklGw= Name: res/drawable/spinner_background_holo_light.xml SHA1-Digest: B0aXFxtzoLaEhbHHxuiXjae5Gog= Name: res/drawable-xhdpi-v4/fab_shadow_mini.png SHA1-Digest: LXN0FOE68TYP8JlxKq2MYPy1a4Q= Name: res/drawable-xxhdpi-v4/abc_ic_star_black_36dp.png SHA1-Digest: 4eyqloBe4i++Lnjut9rv30zXGjc= Name: res/layout-v17/abc_search_view.xml SHA1-Digest: bpToW9h3RZxHrVWHrYOhb4NsYgk= Name: res/drawable-hdpi-v4/ic_missing_thumbnail_picture.png SHA1-Digest: Alvw+lU2O9PD3nO/yAu9taOEZs4= Name: res/drawable/conversation_list_item_unread_background.xml SHA1-Digest: vtHZ4HtPOge1w3+fen0KNHUO/os= Name: res/drawable-mdpi-v4/ic_emoji_objects_activated_light.png SHA1-Digest: 6MaBPweMvqHaw8FgUp8UlSaTT8s= Name: res/drawable-hdpi-v4/abc_textfield_search_default_mtrl_alpha.9.p ng SHA1-Digest: Uaax8TsSlV1ssfdd4JM/P9lAyjc= Name: res/xml/badge_widget_provider.xml SHA1-Digest: BbkN2gHT30IIHuFy/mQKOhYMmKw= Name: res/drawable-ldrtl-xxxhdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.pn g SHA1-Digest: ZMTKws3Yf0EOK1CpWECY7+yKtn0= Name: res/drawable-xxhdpi-v4/ic_badge_24dp.png SHA1-Digest: f0Z1+ACf5AfSh6xkqW9se8lw96E= Name: res/drawable-mdpi-v4/ic_emoji_symbols_activated_light.png SHA1-Digest: 07UvaS4Vt2TdcWhTDIOJXiLICPo= Name: res/drawable-mdpi-v4/ic_play_circle_fill_white_48dp.png SHA1-Digest: pqjm1dRGDzQ8JZmZbqNZzr5lCEo= Name: res/layout/design_bottom_navigation_item.xml SHA1-Digest: LAhv7EglbmBNJita3rNPNDZ6Jww= Name: res/drawable-mdpi-v4/ic_backspace_normal_dark.png SHA1-Digest: rdghLsk72qbvJh/nssDD307QNTs= Name: res/drawable-mdpi-v4/abc_text_select_handle_left_mtrl_light.png SHA1-Digest: 8guTAEXvUmh+eaLeokeYvH7643o= Name: res/drawable-xhdpi-v4/ic_check_normal_dark.png SHA1-Digest: 2MQ0mNjQk8jSZjMS1PM6fadBQLU= Name: res/xml/preferences_chats.xml SHA1-Digest: CbW30JJLB0mFlH8JRMEmKx4hBcg= Name: res/layout/radial_time_picker_dialog.xml SHA1-Digest: 0qg20NInRmHHMeoeoX1qZtGuCIg= Name: res/drawable-xhdpi-v4/ic_menu_add_field_holo_light.png SHA1-Digest: 2wevLdiXjHIkTVcPtdT3YcMZQJk= Name: res/drawable/background_pattern.png SHA1-Digest: CTOBxrOS8ngBuJdnK7DkmHHCF3w= Name: res/layout/abc_popup_menu_item_layout.xml SHA1-Digest: 9KY6cTlIMTXELBZlS/lQJqma3no= Name: res/drawable-hdpi-v4/ic_download_circle_fill_white_48dp.png SHA1-Digest: fuRUb+7a8CDp2iushzsyHDNApGk= Name: res/layout/hms_picker_view.xml SHA1-Digest: E90edl4d9jK1Auvl9DQkc/OHxPI= Name: res/drawable-mdpi-v4/ic_account_box_light.png SHA1-Digest: Pn9U6zgZiaHjLMufo7m5UI3sqv0= Name: res/drawable-mdpi-v4/ic_emoji_people_normal_dark.png SHA1-Digest: o6u0xd82CT37/1jIsyd0EiR5CA8= Name: res/layout/media_overview_activity.xml SHA1-Digest: cqKNQw8HsS0zl7VKIHDH8/Kif90= Name: res/drawable-hdpi-v4/ic_save_all_white_24dp.png SHA1-Digest: BNtudXvSGAgIP4Xz6AMNSY0dWzw= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_84 SHA1-Digest: cM9Igo/aYhfEFUXrYtfhy+rGfTA= Name: res/drawable-hdpi-v4/design_ic_visibility.png SHA1-Digest: il2OWkYNYAmmPAdZJmHUqqQXceQ= Name: res/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_015.png SHA1-Digest: i6pCyKNDkCGzNzTp71ixAq/8VCM= Name: res/layout-v16/verify_identity_activity.xml SHA1-Digest: fViipTHHheUGccA3ejf2i3023hY= Name: res/drawable-xhdpi-v4/switch_thumb_pressed_holo_light.9.png SHA1-Digest: UztIfkg+4xXbDDfXpkylsY0bawQ= Name: res/drawable-xhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png SHA1-Digest: 8QLweU4p1rehkS9Zii3jepzESPg= Name: res/drawable-ldrtl-xxxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: dT9O498/3E1mpkpzpSmdy7tcxxU= Name: res/drawable/notification_bg.xml SHA1-Digest: bj5a80+E2BgDJ7UtZngYsYRoM3A= Name: res/drawable-mdpi-v4/ic_message_black.png SHA1-Digest: ufXFoyZsYQwoWX75dnNWMkffm/8= Name: res/drawable-hdpi-v4/abc_textfield_default_mtrl_alpha.9.png SHA1-Digest: NPD/eXAUHpJIZ0Gue4mGW/Q6oXI= Name: res/drawable-hdpi-v4/abc_ic_star_black_16dp.png SHA1-Digest: lC47V58n3eYOJicP+Ng5Di5wekE= Name: res/drawable/abc_ic_arrow_drop_right_black_24dp.xml SHA1-Digest: yfl/P7TCWvsLAw6+ItgG3AhNxR0= Name: res/layout/design_layout_tab_text.xml SHA1-Digest: hGylEWtLV6PowlIJAnKyrFqhGEo= Name: res/drawable-xxhdpi-v4/ic_refresh_white_18dp.png SHA1-Digest: dQc+eDIq1pnsTBTStjfhNl4FO1I= Name: res/color/design_tint_password_toggle.xml SHA1-Digest: 1bBz9XsGPIkliq4TDSak3qiheuM= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_81 SHA1-Digest: daBwnRVtz216PB28MApBfpfM6OY= Name: res/layout-v21/conversation_fragment.xml SHA1-Digest: Hb/NyJTA3nGqHaToCWjWyA0Nfhc= Name: res/color/design_error.xml SHA1-Digest: Es59RSWVXiKJovqODE9ReDu7QUQ= Name: res/drawable-mdpi-v4/ic_keyboard_white_24dp.png SHA1-Digest: 1b41v469NLXoyk0C8eEgDKy//vU= Name: res/drawable/last_seen_divider_text_background_light.xml SHA1-Digest: V+jBVY7mlKJH1EPCbcqpCeWfR7g= Name: res/drawable-xxxhdpi-v4/fab_shadow_mini.png SHA1-Digest: 2TqTOMvnZEi2P/x0zbtExFQryOY= Name: res/drawable-xxxhdpi-v4/ic_arrow_forward_white_24dp.png SHA1-Digest: ChZoygScVbCrHuKHdLovsttInZE= Name: res/drawable-mdpi-v4/textfield_focused_holo_light.9.png SHA1-Digest: Osswqo8kfRGKahOnjpi0n93nS1Y= Name: res/color-v11/abc_hint_foreground_material_light.xml SHA1-Digest: xfQnMbjkcgC7kuD+Hp7rD3X8Rzw= Name: res/drawable-ldrtl-mdpi-v17/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: nhOdszX2MHoKx6H7uBb+tEWPyJ0= Name: res/drawable-xhdpi-v4/abc_text_select_handle_middle_mtrl_dark.pn g SHA1-Digest: 2yBDAHgYTM0FfiL8gWf0VdNXNwA= Name: res/color-v23/abc_btn_colored_borderless_text_material.xml SHA1-Digest: ZoOvC29NE42ira4RG74k41hynCA= Name: res/drawable-hdpi-v4/fab_shadow_mini.png SHA1-Digest: hppvVugySDc93vDPDtj/YdWC9nE= Name: res/drawable/emoji_category_objects_light.xml SHA1-Digest: Sd8nRKN7U3KjNP28k3h5bQTceqs= Name: res/layout/emoji_drawer.xml SHA1-Digest: lL84YM61BuU5J1OZN8IHnco9kmA= Name: res/drawable-xxhdpi-v4/ic_menu_remove_holo_light.png SHA1-Digest: n8+8cFBa9+ptZR+rttySX8lU5NM= Name: res/color/abc_search_url_text.xml SHA1-Digest: ULqUPkxlcpqU/WycHleKoU9uLlU= Name: res/layout-land/radial_time_picker_dialog.xml SHA1-Digest: TfwEjFSvG9/SqnIVmSBDfEjpv54= Name: res/layout/calendar_date_picker_dialog.xml SHA1-Digest: a6D1iIW2yY84vwjUvErCg53sxnw= Name: res/drawable-mdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png SHA1-Digest: bZVk/7JyPqpb9FPgqFjfBJURWhA= Name: res/drawable-xxxhdpi-v4/ic_unarchive_white_36dp.png SHA1-Digest: OEYQYVABoR+2CE7ZA7yHLMEW1jw= Name: res/drawable-v11/edit_text_holo_light.xml SHA1-Digest: F+DtDSj0l98dcxb0XPI/r0kY9to= Name: res/drawable-mdpi-v4/ic_video_light.png SHA1-Digest: AHljVdelrMj8drM7jwGHprqJFmA= Name: res/drawable-mdpi-v4/ic_info_outline_dark.png SHA1-Digest: pNBgu6UtP9GYO3W6/NJwyRUiAEo= Name: res/drawable-mdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png SHA1-Digest: 6odRFxWrjmo6tHxritbB5cYdjWI= Name: res/drawable/dialog_background.xml SHA1-Digest: UEWSC5BKnYPbksgbsZfSkL3N3ks= Name: res/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png SHA1-Digest: /hpvHveM+a3Mx49n/3P19bBBgiI= Name: res/color/abc_secondary_text_material_dark.xml SHA1-Digest: GQ3rWNxlJ84ZAaPkwxO7VystcTs= Name: res/layout-v17/notification_template_lines_media.xml SHA1-Digest: DAyURKcw6XN72DiE6lYrFAfeAT8= Name: res/drawable-hdpi-v4/ic_notifications_gray.png SHA1-Digest: UBKxyCadglItZqfHFWo/NWq2kMU= Name: res/layout/design_navigation_menu.xml SHA1-Digest: fPFY6UdlecbjXNsn4YVofqtT7ys= Name: res/drawable-xxhdpi-v4/ic_contact_picture.png SHA1-Digest: 0QLSDRqpJz/6PixVRqg6TsEKdbw= Name: res/layout-v17/abc_popup_menu_item_layout.xml SHA1-Digest: H1kmEvfqPIpUL4c30NrLzcfeswk= Name: res/drawable-xhdpi-v4/abc_ic_star_half_black_36dp.png SHA1-Digest: 8XIl4bSeXq0sG4+FeucZZjHT7Qw= Name: res/drawable-hdpi-v4/ic_send_white_24dp.png SHA1-Digest: /UYoUVKGEI67dPfLwMLubQ0O18w= Name: res/menu/conversation_list_batch_archive.xml SHA1-Digest: f/k6AdLx/BkfHmuws2aE8gA4VZ8= Name: res/drawable-hdpi-v4/ic_done_white_18dp.png SHA1-Digest: hsrbmHP3Ca7VipiW3cqyhrrkxQk= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_94 SHA1-Digest: iFng5Rg8uXcO1Wad8WzQjXXbaSA= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_95 SHA1-Digest: 6+a5S3YBqGkTp77eRI98wZppshU= Name: res/layout/share_intent_row.xml SHA1-Digest: hEFfaanmx0xw0zSH1atx6iZAH5s= Name: res/xml/preferences_notifications.xml SHA1-Digest: 7d987UvRoWOjXVXe42qeTVWojXc= Name: res/drawable/notification_icon_background.xml SHA1-Digest: 9XV2y6Lq4+7VQc34MLXKGo0bK88= Name: res/drawable-xhdpi-v4/switch_bg_focused_holo_light.9.png SHA1-Digest: /LzkB2YWBf8/BEEXg0QTgGcw1zo= Name: res/drawable-xxhdpi-v4/ic_info_outline_light.png SHA1-Digest: ldG1yneMkBED1JCTqG2hVvc9508= Name: res/layout/prompt_passphrase_activity.xml SHA1-Digest: +ZXaHK1hsoQQvA5zR/XytZxf1TA= Name: res/drawable/button_background_light.xml SHA1-Digest: 2ArVCjLjr02aFbyRYSeHh1WEUrE= Name: res/drawable-v11/emoji_category_flags_dark.xml SHA1-Digest: C23igqMnLW5kCfUE8FpsQeZLIos= Name: res/layout-v16/calendar_date_picker_header_view.xml SHA1-Digest: +545VslRghtWl18ssktPG2+sHHg= Name: res/drawable-xhdpi-v4/alert.png SHA1-Digest: r0uY1AsW4BfEQ0neJobBHCaDZDg= Name: res/layout/contact_selection_activity.xml SHA1-Digest: o1xq3vcI/nhMiAp+92hqM9E2uN4= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_91 SHA1-Digest: lcsLkHVu72/rODkHdAAZAfP/bk8= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_90 SHA1-Digest: 7WrMiEDONSaE+X9BTfPKgXzIz+g= Name: res/menu/conversation_list.xml SHA1-Digest: KpevVWxQDbF5cuDPnZqzkRfPRxE= Name: res/drawable-xxhdpi-v4/ic_message_gray.png SHA1-Digest: 0STrwJfkSN+45t6UZF0HHjhNlrA= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_49 SHA1-Digest: lJyFdjLImuA15HlomNveCTDcnAc= Name: res/drawable-mdpi-v4/ic_save_white_24dp.png SHA1-Digest: mgACmxmFqQ+zs8iPY7oYpx7VXzI= Name: res/drawable/compose_divider_background.xml SHA1-Digest: RsAhKmH09jc4QKAZtjrZMgSO/n4= Name: res/drawable-xxhdpi-v4/ic_action_warning_red.png SHA1-Digest: lJyeXqkO3zENRDDbya7f7KvV+qc= Name: res/drawable-mdpi-v4/textfield_disabled_holo_light.9.png SHA1-Digest: h4/VO+f25Zj7CANfbDIPqcsPTeQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_44 SHA1-Digest: N1nuhYaREi9z6iAeXxLcra4rL5s= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_43 SHA1-Digest: mIFkru/j+coHhbRh6/nN2br+Xak= Name: res/drawable/ic_check_light.xml SHA1-Digest: UNOeSc0tns0fQsdGjNn6nMv2Rck= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_39 SHA1-Digest: DCU1im+wpc/coZrjso8xoYO7IjM= Name: res/drawable-hdpi-v4/ic_menu_search_holo_dark.png SHA1-Digest: 4dSQGHNaTKAj96679sXZ4xJ8A6o= Name: res/drawable-xxhdpi-v4/ic_emoji_symbols_activated_light.png SHA1-Digest: Z3d6uBgQscgF9jpY8JTh0/r0GQY= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_36 SHA1-Digest: hWS0Op4dc6LF44g9BIFft/f3QH0= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_31 SHA1-Digest: KuLNytr4ZRl4fcSWuquXOt81/60= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_30 SHA1-Digest: Bh8tv057544lV4r7kRT1zzTlaA8= Name: res/drawable-xxxhdpi-v4/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: BjYXNIGGhyqIB4Vq4khlEepKSZk= Name: res/drawable-xhdpi-v4/ic_volume_up_light.png SHA1-Digest: LfbmrD0YLMA9OlzM1Gk4P3X3+7w= Name: res/drawable/notification_bg_low.xml SHA1-Digest: IKiF8Z0by9Q2pqJeveIHUizqkp4= Name: res/drawable-xxhdpi-v4/icon_cached.png SHA1-Digest: /SZtInm1nKG4qAtbMelP08hKDBY= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_34 SHA1-Digest: O3GRzsWEr1+UF6z/veTcYUIikdU= Name: res/drawable-xhdpi-v4/ic_visibility_grey600_24dp.png SHA1-Digest: cryynexdcx/BHt6qYA/0iFTRfDg= Name: res/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_000.png SHA1-Digest: 0kKvPwdj7zBzN9UX4+jHAPKwyCA= Name: res/drawable-mdpi-v4/ic_brightness_6_black.png SHA1-Digest: bXR9+poSUACZSRXeejLBXqLMfBo= Name: res/drawable/design_fab_background.xml SHA1-Digest: 2IXtIQ8BMr6/gZ9iOW0d/IwZH6A= Name: res/drawable-xxhdpi-v4/ic_account_box_light.png SHA1-Digest: Jj9UOG98sbonLzTowZRWm5p9PYM= Name: res/layout-sw600dp-v13/three_keys_view_text.xml SHA1-Digest: lrd18VCqevhTKeg67U1GT6IrXxU= Name: res/drawable-hdpi-v4/ic_delete_black.png SHA1-Digest: qEmobDlgidBgvc4OoPk6XdEUEmY= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_66 SHA1-Digest: ZFpoKe4t4pLWyhWH1RNMJcPf+fE= Name: res/drawable-xxhdpi-v4/ic_select_all_white_24dp.png SHA1-Digest: immG58Mn+jJpWq3F2CTYfdXTMzw= Name: res/animator-v11/upper_pause_to_play_animation.xml SHA1-Digest: 8rY/CYehbUSswda3BXhrTPOxJnM= Name: res/drawable-hdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png SHA1-Digest: E/mBhY9wNG5VaFmW6qL4iXjAHvY= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_62 SHA1-Digest: C2zdTbDUsHHOOdTxAqDglz9LuHI= Name: res/drawable-hdpi-v4/ic_dialpad_white_24dp.png SHA1-Digest: ukq3bmPeQHlcjILimK53COmRM5I= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_61 SHA1-Digest: 7c51UKlqpVDI3o2A/s0k4nNgKCA= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_63 SHA1-Digest: a7U/pmtZHFBo5obxPjewjKWkGa8= Name: res/drawable-hdpi-v4/ic_recurrence_bubble_outline.png SHA1-Digest: 8mGZECazDoQbCTJL8WAIWh+KGPs= Name: res/drawable-mdpi-v4/icon_lock.png SHA1-Digest: 0w8rXRPZI28+gPou427g9RzDTUM= Name: res/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png SHA1-Digest: O6x52IgsWeKV4Xdu5U2H2IxbVgc= Name: res/layout-v17/abc_alert_dialog_button_bar_material.xml SHA1-Digest: JyQAez6kQCbcigDs2z/nSmQuSYo= Name: res/drawable-xhdpi-v4/abc_list_selector_disabled_holo_light.9.pn g SHA1-Digest: bwjSzuahpvwVgJavscLUKen/ZqQ= Name: res/layout/abc_action_bar_title_item.xml SHA1-Digest: JePlqdhFAVxMv4b6ytoiCrX6ghM= Name: res/layout/color_preference_items.xml SHA1-Digest: /OV6OKHQivYRh4P5Xmq1+fdcz8k= Name: res/layout/notification_template_part_chronometer.xml SHA1-Digest: dzQtd/RKeHhfMLTfmeJLOxUNfdA= Name: res/drawable-xxhdpi-v4/ic_emoji_nature_normal_light.png SHA1-Digest: irbPkaiv3NQ3eYZERKzfv9yBG0w= Name: res/layout/zooming_image_view.xml SHA1-Digest: v8hYwtg/deZRi/NqPvzpCqBUaM4= Name: res/animator/upper_play_to_pause_animation.xml SHA1-Digest: 7f8HiUwoTj84cBIvXQhtx6kFMlc= Name: res/drawable-hdpi-v4/ic_send_insecure_white_24dp.png SHA1-Digest: XNk5jZwbAktbwvDiJ9gFsob2ug8= Name: res/drawable-mdpi-v4/ic_volume_off_grey600_18dp.png SHA1-Digest: 7c0EwppLt2vWdCJHYSeZzLOerCg= Name: res/drawable-xhdpi-v4/ic_photo_camera_dark.png SHA1-Digest: xmGv8Id61t3QBoSXhTMQIuh1fMc= Name: res/drawable-mdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png SHA1-Digest: deH5E0yKjBo6CYdnvx70e1ZcVb4= Name: res/drawable-xhdpi-v4/ic_block_white_18dp.png SHA1-Digest: +mYTL+dLl37rrmzqXIMss3kAfWg= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_58 SHA1-Digest: LqgBINJBQXrfS7qSEUdO2YKapSc= Name: res/drawable-hdpi-v4/ic_emoji_flags_normal_dark.png SHA1-Digest: AY66CHRZpDIF8mLkrCS9dfohLHc= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_55 SHA1-Digest: aHXhcJ44Nq+1uITpH9udVnAuQjI= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_54 SHA1-Digest: 0pJTmVMR2tNAUtn+uRmLAqWmQnM= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_52 SHA1-Digest: a5Rio2BfCR5r/5jH/4aK85mYB60= Name: res/drawable-xxhdpi-v4/ic_warning_dark.png SHA1-Digest: /RxhT72cwoQLuIL6NL3fNyxrHAE= Name: res/drawable-xxhdpi-v4/ic_delivery_delivered_dark.png SHA1-Digest: wDUNsUxrly/X82wiKUkKCnSH9xQ= Name: res/drawable-hdpi-v4/ic_brightness_6_black.png SHA1-Digest: sNn2cEEK3mhmChlw56v3NZWc+PU= Name: res/anim/abc_popup_exit.xml SHA1-Digest: HpgqoyyC+fdyFrYE8t6l+v0+Y4c= Name: res/drawable-hdpi-v4/abc_scrubber_track_mtrl_alpha.9.png SHA1-Digest: dEml7NSraw7t0+4lZ4iFeNS5MxI= Name: res/drawable-xhdpi-v4/abc_switch_track_mtrl_alpha.9.png SHA1-Digest: DnUPb3c/aCYMPIdhLVRqT1eh/J8= Name: res/drawable-xxhdpi-v4/ic_cancel_white_24dp.png SHA1-Digest: qXcnrshlwqOoKMyTfdqDJvESxg4= Name: res/drawable-mdpi-v4/ic_done_all_white_18dp.png SHA1-Digest: cs2HuS0orrt73+am04haXgUKE68= Name: res/drawable-mdpi-v4/ic_brightness_6_gray.png SHA1-Digest: iZ7h/BCqiG1zxjUl+/NNSnjBD34= Name: res/drawable-xhdpi-v4/ic_emoji_flags_activated_light.png SHA1-Digest: MEtoOMqwvAYWz6fkJUBDVzRUkKY= Name: res/drawable-mdpi-v4/design_ic_visibility_off.png SHA1-Digest: 3oMRQReSGSp08y2pMlOzFR4ywCY= Name: res/drawable-hdpi-v4/ic_photo_camera_light.png SHA1-Digest: wUu5bASnG15UjJ3p/oz6Cbqsubg= Name: res/drawable-hdpi-v4/ic_image_light.png SHA1-Digest: LuLestvVAdcTp5lhGpkzn75c57Y= Name: assets/emoji_symbols.png SHA1-Digest: n7FK0HOrvqZV7o1ufIX1wGOrcIg= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_675 SHA1-Digest: yhEc8jlPKXbvDhLFNca0Uc/VhxE= Name: res/drawable-xhdpi-v4/ic_done_all_white_18dp.png SHA1-Digest: bds2Iuy5nv0qlbNhMazdU+Qx96M= Name: res/drawable-xhdpi-v4/ic_delete_gray.png SHA1-Digest: sbblR+7QPwVjl8EICQ8WnvL/CrQ= Name: res/drawable-xxhdpi-v4/ic_textsms_grey_32dp.png SHA1-Digest: rgFpKvXoZtZMqWY7J5a/bhjpYkM= Name: res/drawable-mdpi-v4/ic_lock_white_18dp.png SHA1-Digest: 0pWTZiXP7gNmX7x0dMXFWAxf4Es= Name: res/drawable-hdpi-v19/switch_thumb_pressed_holo_light.9.png SHA1-Digest: uOrxuPdeG1Hgke4uVegUhdTfRG0= Name: res/drawable-hdpi-v4/ic_emoji_recents_normal_light.png SHA1-Digest: 73HeZsh5EL0NGvcwdf4w0XrGYYk= Name: res/drawable-mdpi-v4/ic_send_secure_white_24dp.png SHA1-Digest: nCLy3tQbOKq07y50ZIUTpcjnhnc= Name: res/drawable-xxxhdpi-v4/ic_block_grey600_18dp.png SHA1-Digest: Wnx7f/cklcGcPj6qR93gMkqNkw4= Name: res/drawable-xhdpi-v4/switch_thumb_disabled_holo_light.9.png SHA1-Digest: MYtF9U4u3mtwL6bJwMkzyLB2Ubo= Name: res/drawable-xhdpi-v4/ic_info_outline_white_24dp.png SHA1-Digest: QPuwWkulg9WVT/Ig3MFtFD3gtQI= Name: res/layout-v16/conversation_item_pending_v11.xml SHA1-Digest: x9oNv7tpQZ8h//UjTjWDz9rEGbg= Name: res/drawable/design_snackbar_background.xml SHA1-Digest: awjecjomEXMebQo/pzfxBHj9VwI= Name: res/drawable-xhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png SHA1-Digest: TE1PNkVCa4/Qe4l6j08Ay94JJoI= Name: res/drawable-hdpi-v4/ic_create_white_24dp.png SHA1-Digest: Ngp6bz1KSL3ekincx4aKU3E5mfY= Name: res/layout/key_caching_notification.xml SHA1-Digest: 4pK9XkXluFEWCEkoL0lDgtVJAeY= Name: res/drawable-xxhdpi-v4/textfield_activated_holo_light.9.png SHA1-Digest: VMleSAHQjnh30LIfWAOzY1IDlbw= Name: res/drawable-xxhdpi-v4/ic_movie_creation_dark.png SHA1-Digest: 1ED3QTApITyFoHxJsk+Sjudbfqg= Name: lib/armeabi/libcurve25519.so SHA1-Digest: DZp6sKgPx0OIH7QnfWd10/xDWKo= Name: lib/x86/libcurve25519.so SHA1-Digest: UFYy6nU/81SXbTSt27hCeprBEmw= Name: res/drawable-mdpi-v4/ic_menu_search_holo_light.png SHA1-Digest: HtE3Ob4am+aTd0cb+2FlBJSI1WM= Name: res/drawable-xxhdpi-v4/abc_textfield_search_activated_mtrl_alpha .9.png SHA1-Digest: Ay1qOaJ2aLiCf8NAaujbkp0H1cQ= Name: res/drawable-hdpi-v4/abc_ic_star_black_48dp.png SHA1-Digest: nrSR6Cj5AAFhLDBo5XOuCzzOUCE= Name: res/drawable-mdpi-v4/abc_text_select_handle_middle_mtrl_dark.png SHA1-Digest: sk0rERRHxBHTLx83NS6FqhClw8o= Name: res/drawable-xxhdpi-v4/ic_lock_dark.png SHA1-Digest: uoZ2hSKRtpk3d1wsVK3LXBQdgSg= Name: res/anim/abc_fade_in.xml SHA1-Digest: ohPEA4mboaFUu9LZMUwk7FmjbPI= Name: res/drawable-xxxhdpi-v4/ic_archive_white_24dp.png SHA1-Digest: iju5YbRtUrYl8YP0bfxGlwX109c= Name: res/drawable-hdpi-v4/ic_volume_off_grey600_18dp.png SHA1-Digest: t/JN4l5yRXI5ZpGVy8IoYghOVUY= Name: res/drawable-sw600dp-hdpi-v13/ic_backspace_normal_dark.png SHA1-Digest: 1XmRIrHr1R9bw9Pzq9j8mLDE+4o= Name: res/drawable-xxhdpi-v4/ic_recurrence_bubble_outline_disabled.png SHA1-Digest: 9mCG2i/EzxrsD9HbYPQDcXflt/o= Name: res/layout/abc_search_dropdown_item_icons_2line.xml SHA1-Digest: Hg4wvo3SofqoQb9PWlHfHhYuR1w= Name: res/layout/abc_screen_simple.xml SHA1-Digest: L+lDjRkMzyxbAEO55AhMboq9FFA= Name: res/layout-v17/conversation_title_view.xml SHA1-Digest: 0pyo8pUsPgwnEZ8+uELR5HJoyv4= Name: res/layout/conversation_item_sent.xml SHA1-Digest: W1QeAnoXO2z0N2cryym2JlweNcc= Name: res/drawable/share_list_divider_shape.xml SHA1-Digest: 74uWk5jveXzr1FmYQ3DdIhPD8bs= Name: res/drawable-hdpi-v4/abc_text_select_handle_right_mtrl_light.png SHA1-Digest: 0Gfqa0wEfQSI0mKJkwlXlJWSicQ= Name: res/drawable-xhdpi-v4/ic_pause_circle_fill_white_48dp.png SHA1-Digest: 1z1oT+i1Qhlq1r7uREl2qmGlIZ0= Name: res/drawable-xxhdpi-v4/design_ic_visibility_off.png SHA1-Digest: VjW4QDbjDLSVWJK4Q5sW5G0r540= Name: res/drawable-hdpi-v4/ic_emoji_symbols_activated_dark.png SHA1-Digest: 62PkF1Y+j3pWj/LSKskVoqGfrTE= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_255 SHA1-Digest: T8Y8UPJDNNY3gi+RvAerX30aAJ4= Name: res/drawable-xxhdpi-v4/abc_list_focused_holo.9.png SHA1-Digest: FsvLP65iWVfEfIkCPXw4wimwY7M= Name: res/drawable-xxhdpi-v4/textfield_disabled_holo_light.9.png SHA1-Digest: IbsyrIi5P4z5+3CcgDwoUkpzMUI= Name: res/drawable-hdpi-v4/ic_menu_barcode.png SHA1-Digest: p14R9rQhMUiRkgh9WUV9xkIM0ek= Name: res/layout-v21/notification_template_custom_big.xml SHA1-Digest: +NAV2xQcf+GDqwoSFHM5HWE+f5M= Name: res/drawable-xxhdpi-v4/sms_system_import_icon.png SHA1-Digest: L2uEmxsqPsX+b2hwagV3mviRdwg= Name: res/drawable-xxxhdpi-v4/transfer_controls_background.9.png SHA1-Digest: wFp+tXS4iMWJJHESG7JNSLvEj4E= Name: res/color-v23/abc_tint_edittext.xml SHA1-Digest: fRj3PTupUzBlYT1O+bKkZbmomws= Name: res/layout/conversation_title_view.xml SHA1-Digest: JeLUgqidsv6MxG4zOZqri0P6L1k= Name: res/drawable-mdpi-v4/ic_emoji_recents_activated_dark.png SHA1-Digest: ZIQ+n3B5THl/aA/uXVzPpIVqpu8= Name: res/drawable-xhdpi-v4/abc_list_pressed_holo_light.9.png SHA1-Digest: 5rSZbdJDOTdM5kJhhIdl8m8briI= Name: res/drawable-xxxhdpi-v4/ic_forum_black_32dp.png SHA1-Digest: Qs+P4ybw3XFue+Vv0FWx4k95zPg= Name: res/drawable-mdpi-v4/ic_clear_white_24dp.png SHA1-Digest: HGIeDdMwnH0fkemT6lO7+z+z2Rs= Name: res/drawable-xxxhdpi-v4/abc_ic_star_half_black_36dp.png SHA1-Digest: dd2zj6sr+xRmZWNPRjYGn37/Nm8= Name: res/layout-v17/notification_template_big_media_narrow_custom.xml SHA1-Digest: qdhlc+Z9n+jv4RmCx3JQOeRSvWs= Name: res/drawable-mdpi-v4/ic_advanced_gray.png SHA1-Digest: UhBepQMxsiJjJCgarZj183ZjXrI= Name: res/menu/conversation_list_batch.xml SHA1-Digest: NYPIJ4od1qC/qiyUnYQLKAYhHVc= Name: res/drawable-hdpi-v4/textfield_disabled_holo_light.9.png SHA1-Digest: E/schz5NibOcz8He1B5Tsu3ujfk= Name: res/drawable-xhdpi-v4/fab_shadow.png SHA1-Digest: LbvYC5hiRMwHEfAlnuyydhdGSvs= Name: res/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_000.png SHA1-Digest: 6nL94lpOIDhHAcaZP6Numi9gbpw= Name: res/drawable-xxhdpi-v4/ic_block_white_18dp.png SHA1-Digest: nbznVH+OZUkhsULWW5q/YEszBpE= Name: res/drawable-hdpi-v4/ic_check_white_24dp.png SHA1-Digest: OxuZuuMKpWfGpoioNb4jTXrydVM= Name: res/drawable-xhdpi-v4/ic_volume_off_white_18dp.png SHA1-Digest: GbAswuzUqZ8xPXxHCKNWmwCYd6E= Name: res/drawable-xhdpi-v4/ic_emoji_emoticons_activated_dark.png SHA1-Digest: 65J8tJ8nazlcXEWEJIFnxPojdPQ= Name: res/drawable-xhdpi-v4/ic_warning_dark.png SHA1-Digest: TSk/H6nGa9ShavF3v2CooQifPqQ= Name: res/drawable-xxxhdpi-v4/ic_unarchive_white_24dp.png SHA1-Digest: Na2uHss6q/itXXPxfstb8nuqLqM= Name: res/drawable-hdpi-v4/ic_visibility_off_grey600_24dp.png SHA1-Digest: 5h5ymBcJ8muWnOdsJHDYhc4i6kQ= Name: res/drawable-v11/emoji_category_recent_dark.xml SHA1-Digest: M/SBX1z1roN+u5+TvQZXKJDNEyA= Name: res/layout-v21/conversation_title_view.xml SHA1-Digest: pwOa8NNzv9FW4Byauw63ZA3uUBw= Name: res/drawable-xhdpi-v4/ic_emoji_symbols_normal_dark.png SHA1-Digest: OCGkcF4VjaLue66XVwzxR4E/DVU= Name: res/drawable-xxhdpi-v4/ic_visibility_off_grey600_24dp.png SHA1-Digest: 4EhqySAhGMjjioXSTtBhegZniW4= Name: res/drawable-mdpi-v4/ic_content_copy_light.png SHA1-Digest: Tbu8D45KApwF0j9Iqaq3JNuAJzI= Name: res/drawable-mdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png SHA1-Digest: c+ieuII6udSDVml51EH3TH6KocA= Name: res/drawable-hdpi-v4/ic_group_photo.png SHA1-Digest: wgViwvlG62FHBV5ncMDu6PtEO6c= Name: res/menu/conversation_list_empty.xml SHA1-Digest: EH9NTV8PcFGMG++Hx8fJwoRaBFE= Name: res/drawable-hdpi-v4/ic_backspace_disabled_dark.png SHA1-Digest: 8YzE4GMncrZ+4gIgTYYR3Eyhr9o= Name: res/drawable-v11/emoji_category_objects_light.xml SHA1-Digest: dlH2HhMroPwNKuyPK/wa2qVt4us= Name: res/drawable-xhdpi-v4/ic_emoji_recents_normal_dark.png SHA1-Digest: wmITBG3cxEr5qR1vodWt+Zpdf78= Name: res/drawable-mdpi-v4/notify_panel_notification_icon_bg.png SHA1-Digest: cz2cTpSbxUR34pkCMo3M7a+mSXk= Name: res/drawable-xxhdpi-v4/ic_emoji_emoticons_normal_dark.png SHA1-Digest: lhZMiOtWUnBWeRzit1Bmdw5KA3A= Name: res/drawable-xhdpi-v4/divet_lower_right_light.png SHA1-Digest: IPMXi0EeD3blOSp6zdpBDLmMWEE= Name: res/drawable-xhdpi-v4/ic_recurrence_bubble_disabled.png SHA1-Digest: pWhbPlICjQK4kqJ4SHeDAGwgsVo= Name: res/drawable-xxhdpi-v4/ic_forum_black_32dp.png SHA1-Digest: Qfv76qYo5Erl/u83Fmx5Xn0Ibzw= Name: res/drawable-v23/abc_control_background_material.xml SHA1-Digest: pzxqKcGy9TVMKjKlYEXVvvN4i/Q= Name: res/drawable-hdpi-v4/ic_backspace_grey600_24dp.png SHA1-Digest: Hu8/khhYfWT5MFNQFFr6RHFMxkM= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_679 SHA1-Digest: 6/VdOl5YznGBEI9ms/gjN2EAmLM= Name: res/drawable-hdpi-v4/notification_bg_normal_pressed.9.png SHA1-Digest: 4j+L3Jzr2U70TU9dUenWhtYe/lU= Name: res/layout/time_zone_filter_item.xml SHA1-Digest: 28+6W1yXeXu6XFfaCFQdzrQ1Kv4= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_676 SHA1-Digest: 1XvAC59RhdvXt568Lp9q68Lo95M= Name: res/drawable/conversation_list_divider_shape.xml SHA1-Digest: zlApN9XJCVuXQ1We2otYrGYB9eg= Name: res/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_000.png SHA1-Digest: 4yQp5RGqcPJVhL3STB21W1r3uqI= Name: res/layout/select_dialog_singlechoice_material.xml SHA1-Digest: PmLkdr92f9FO1MAZiEy9sa3O7as= Name: res/layout/conversation_fragment.xml SHA1-Digest: imqcO0Qv55NXbDTUsWTLPyp7UIM= Name: res/drawable-xxhdpi-v4/ic_add_white_24dp.png SHA1-Digest: Qku8XatHjewVAawjvYnuiZY4LGU= Name: res/xml/preferences_app_protection.xml SHA1-Digest: 9K48G4lRnTbj45HtueNF62GZyUQ= Name: res/color/abc_primary_text_material_light.xml SHA1-Digest: EIjy4txXpS0l3VDPyUffGzfmq7s= Name: res/drawable-hdpi-v4/ic_circle_fill_white_48dp.png SHA1-Digest: w+y2NMFiofz+FELl4O5Fyv60DS4= Name: res/drawable-xhdpi-v4/ic_visibility_white_24dp.png SHA1-Digest: 2RQxp9VFspE9+RuD0icuTndloG8= Name: res/drawable-v21/conversation_list_item_read_background_dark.xml SHA1-Digest: n/NmqVLIR9zVMMnu7LxltyAUCeU= Name: res/drawable-xhdpi-v4/transfer_controls_background.9.png SHA1-Digest: 8DAsQxUNQf9+eMV1afbdEo/rFik= Name: res/drawable-v11/emoji_category_places_dark.xml SHA1-Digest: 0oWB2rwfMOzZwePPI6yYOKPyde8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZA SHA1-Digest: HWSEptWtloOrttDr/x5o5L1sJLQ= Name: res/drawable-xxhdpi-v4/ic_error_red_24dp.png SHA1-Digest: ijvKMR4e/QoYligG+DTtXzpURlQ= Name: res/drawable-xxhdpi-v4/ic_emoji_objects_normal_light.png SHA1-Digest: jS+19gJTC15KDBNIcerxbQGYb0U= Name: res/drawable-mdpi-v4/switch_thumb_holo_light_v2.9.png SHA1-Digest: 7aafjURul6zc7RhhsHx7QCLPozc= Name: res/drawable-hdpi-v11/icon_cached.png SHA1-Digest: fk0Ia1PUNcHHbOt6goi1SYZxllw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_YE SHA1-Digest: KwySfk0V8V1me0EHaLVWj+r29v4= Name: res/drawable-hdpi-v4/spinner_disabled_holo_light.9.png SHA1-Digest: MGzyk0nLOAXBSKZz0u82JCFSpS8= Name: res/drawable-xhdpi-v4/ic_emoji_nature_normal_light.png SHA1-Digest: 0UxsunD6MZeM52tav+Sx2ggqzMA= Name: res/drawable-mdpi-v4/abc_list_selector_disabled_holo_dark.9.png SHA1-Digest: +bjkZfnp7jH8HvA5wzYQ85O04Ic= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZW SHA1-Digest: zyxT3C3km6FQpGLM6uiQ5SXSmLg= Name: res/drawable/abc_switch_thumb_material.xml SHA1-Digest: sujPDGksEdg29cR87ymiy/LIS08= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_800 SHA1-Digest: VQ7yxCBmjjhBc2h0DHh2WZa6Plk= Name: res/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png SHA1-Digest: eQ8hrqPRD0qhhaJWghhXuxRIxBA= Name: res/drawable/psts_background_tab.xml SHA1-Digest: BcRKjO2FMY1kWhZ9ye4ab7iUMGY= Name: res/drawable-hdpi-v4/ic_emoji_recents_activated_light.png SHA1-Digest: 73TSiB2efL7RgRDQplbPAML1u7g= Name: res/drawable-v21/avd_show_password_1.xml SHA1-Digest: YuYYvVgGf2BDuviigWAZ6CSTUlI= Name: res/layout-v16/transport_selection_list_item.xml SHA1-Digest: mOTmOB34VU47Jv9iJNx/G3jS044= Name: res/drawable-xxhdpi-v4/actionbar_icon_holo_dark.png SHA1-Digest: Jy9cJ/v2OcBZ+s3nT0rWv5iYufo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_808 SHA1-Digest: secXPmyfPmQJi8JgLe+sgOvs3tI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM SHA1-Digest: IgMlNFS8WlUTmWFHpuatLuUd5L0= Name: res/layout/support_simple_spinner_dropdown_item.xml SHA1-Digest: iR6msV+/uQtXanyZ5kWveK47AO0= Name: org/spongycastle/x509/CertPathReviewerMessages_de.properties SHA1-Digest: 5WleEyCLesz39ayL3AH9lOktT8k= Name: res/drawable-xxhdpi-v4/ic_emoji_emoticons_activated_dark.png SHA1-Digest: YMPNigCFda0HibnB+2s6FAh+vJs= Name: res/drawable-hdpi-v4/icon_dialog.png SHA1-Digest: xu2YVmS2ywmCB69j7trlUUEPuZA= Name: res/drawable-mdpi-v4/ic_message_white.png SHA1-Digest: +w8RRj9KX7dPy/Adp2Qq+CIYA/E= Name: res/drawable-xhdpi-v4/ic_account_box_light.png SHA1-Digest: GhgV+uR3Z73NVnG3DuVxk/uZwcY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_WS SHA1-Digest: +RPU13Dhj2ssunWgDZrzz36ikAM= Name: res/drawable-v21/avd_hide_password_2.xml SHA1-Digest: RLmxslaJgHf4Ik5/GckT8IWoKqo= Name: res/menu/conversation_context.xml SHA1-Digest: 3utfdOyLlXhynowrazANJ8IGV9k= Name: res/color-v11/abc_hint_foreground_material_dark.xml SHA1-Digest: osswxebFdMfNI2xvUWBEke0BY54= Name: res/drawable-xxhdpi-v4/switch_bg_holo_light.9.png SHA1-Digest: ZkARNjiagqJDUodedGobTGvG6LA= Name: res/drawable-xxhdpi-v4/ic_audio_dark.png SHA1-Digest: zLGA7QqW1McCG5nfNBdVMglGmEM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_WF SHA1-Digest: /4S4qTkSykY+gjBJ020xd3Mt47s= Name: res/drawable-hdpi-v4/ic_video_light.png SHA1-Digest: xNkPXqmLwBtYEk4H/G9l6sD2cqk= Name: res/drawable-hdpi-v4/icon_cached.png SHA1-Digest: 9k1/m3HDHo/YBPFsVeGkA3z7Db8= Name: res/drawable-hdpi-v4/spinner_default_holo_light.9.png SHA1-Digest: /GXGxE5W4VqGLNi5sm4OsXq19RM= Name: res/drawable-hdpi-v4/ic_warning_dark.png SHA1-Digest: Wdv5gXdXqtarsNsBQ+zyjPB8zI4= Name: res/drawable-hdpi-v4/ic_unlocked_white_24dp.png SHA1-Digest: UysqWQKotJrYdp1DotaD3nKWT1o= Name: res/drawable-xxxhdpi-v4/ic_dialpad_white_24dp.png SHA1-Digest: 0huv0s6rm8+ETQqEkmQx7pTsSPw= Name: res/drawable-xxhdpi-v19/switch_thumb_pressed_holo_light.9.png SHA1-Digest: c+lEvuW/Yx/kDPuWk7ZqybxGgAA= Name: res/drawable-xxhdpi-v4/ic_emoji_nature_activated_light.png SHA1-Digest: ckvK4anIFUHTqiKLDXqzClObLSw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VI SHA1-Digest: u4QMKOB/UTKCIveQQx53+biWivk= Name: res/drawable-xhdpi-v4/ic_block_grey600_18dp.png SHA1-Digest: GtptkP4aFB4aFPBMWE8AYUYT1nY= Name: res/drawable-hdpi-v4/abc_list_selector_disabled_holo_dark.9.png SHA1-Digest: h7hNXJrcbvKMv9bbGrTrvd0dOgs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VG SHA1-Digest: u1dBl8DX8F6OTi0EIbNghWhH5/g= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VU SHA1-Digest: KluzeeNz90zUA0+WHVXi+IxkBm8= Name: assets/emoji_nature.png SHA1-Digest: UzSuz2fUlzCNe6CCmT2tNzzmzVs= Name: res/layout/expiration_picker_dialog.xml SHA1-Digest: Ba5U1l0bt1uC1+SbaWeaFa/YsxU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VN SHA1-Digest: co90EcVs313xpVAM1YRp/+HUSws= Name: res/drawable-hdpi-v4/ic_info_outline_white_24dp.png SHA1-Digest: XdMSJl8GFez0ez6Va9vW9b2uJio= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_UZ SHA1-Digest: /2xIxtVuHa5w34Wpiam/BcQwVcQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_UY SHA1-Digest: j5zMbXVAStT3gdUhhFL/LiX+uEY= Name: res/drawable-mdpi-v4/ic_emoji_recents_activated_light.png SHA1-Digest: BcL12X6gKFeCTD7rSc8Bn/txkl4= Name: res/drawable-mdpi-v4/ic_select_all_white_24dp.png SHA1-Digest: zvNzeJTvoRsgbjC9gA5khsnmeGc= Name: res/drawable-xhdpi-v4/ic_recurrence_bubble_outline.png SHA1-Digest: jYb94n9lCufbf+hthFfiSg6mnXg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VC SHA1-Digest: fpnjelH1AuqJw51MUNnInElgMt8= Name: res/drawable/abc_edit_text_material.xml SHA1-Digest: Kcap9wHIg3pDdpEtot8/QDSYxXI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VE SHA1-Digest: AJYFVptQOVKp4KU7zHPyPryZAdA= Name: res/layout/abc_action_bar_view_list_nav_layout.xml SHA1-Digest: jJclJPApMmkMg6WFlVS0OdEfW1I= Name: res/drawable-mdpi-v4/ic_visibility_off_white_24dp.png SHA1-Digest: 1Gh902UPnMaEV3xZb0/kZ9QSVOM= Name: res/drawable-xxxhdpi-v4/abc_switch_track_mtrl_alpha.9.png SHA1-Digest: NdBd5wlMLy/yNmcs71lpwiAvUZ8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VA SHA1-Digest: 9w+jf1huzkfR13xYd3N0vtF+wUI= Name: res/drawable-mdpi-v4/ic_emoji_nature_normal_light.png SHA1-Digest: M3ulDINItL0wOUdzkp1rqJOPFaY= Name: res/drawable-xhdpi-v4/divet_lower_right_dark.png SHA1-Digest: T3X3fDMT80ZbJwIEbajnSo8mJmk= Name: res/layout-v17/select_dialog_singlechoice_material.xml SHA1-Digest: 7HHmK3lZ6u8c9GLARn1n4FIoUCI= Name: res/drawable-hdpi-v4/ic_video_dark.png SHA1-Digest: sUzWLFSSc1qNA1S6d7ojj6htC68= Name: res/drawable-hdpi-v4/ic_emoji_flags_activated_dark.png SHA1-Digest: gIY9sjCgyZyEH3Q+xIqsz4CoLwg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_UG SHA1-Digest: gFH9T88Py82w/RocQ9Xc31cbmaY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_US SHA1-Digest: il/0ep0wuUDP0jDa0kSCoBvRkYU= Name: res/drawable-xhdpi-v4/ic_brightness_6_black.png SHA1-Digest: yFd3XDUwyUxk/5hkue5her15z08= Name: res/color/abc_tint_btn_checkable.xml SHA1-Digest: SGaPZV/IujUxg59cUi+b3Ps6gSw= Name: res/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.p ng SHA1-Digest: mEMOENu6EbIk3bOPlINzieiI52k= Name: res/drawable/share_list_divider_shape_dark.xml SHA1-Digest: 1wABzykpOZCe9blX2Jp1W/nfCUU= Name: res/drawable-hdpi-v4/notification_bg_normal.9.png SHA1-Digest: ralFi/xjLzZzimSmlAGCFAUgfbE= Name: res/drawable-mdpi-v4/ic_textsms_grey_32dp.png SHA1-Digest: UoW15gUaJg10ilF5zDll1OlPmAM= Name: res/drawable-hdpi-v4/ic_arrow_forward_light.png SHA1-Digest: NeO4gGycsp3aj8v/zJa1Ps1Ze0E= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_US SHA1-Digest: FguG/1bNC+VKBtliTjtv4mk2mDA= Name: res/drawable/abc_btn_default_mtrl_shape.xml SHA1-Digest: si9J2ga8fSgrnHUBNteE65S6TvA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UY SHA1-Digest: dgPt8YWiUyFD5V1kDUlLFSEvOMY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UZ SHA1-Digest: ETmSkp/kr3ETy3FpjTMB3cNQkw8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_UA SHA1-Digest: c1urxUE1X8cOZb134l7CWkhP3rs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TV SHA1-Digest: 8jbXaS3Q9+lFdBxmy8Jf/Aw+L6M= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TW SHA1-Digest: Bx0363s82M2yDQ3/PXBkPKxOgxQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TT SHA1-Digest: usJn33qlB78Wm+Mnsb/pbOTDXl8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TZ SHA1-Digest: H6C/AEzFuZvOMBs4onnHSvp6VPE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC SHA1-Digest: PnZ6nbbRHEsEanMMdu6SeYQM+BE= Name: res/layout/verify_identity_activity.xml SHA1-Digest: 04YjTi+jpVoDQz1sjtEvgEy3XY0= Name: res/drawable-xxhdpi-v4/ic_visibility_grey600_24dp.png SHA1-Digest: UB/rxIB0gqxdEkFZnuG+Zi980EE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VA SHA1-Digest: 188Mly82P5UZg8PYFx4iFxy3hT8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TO SHA1-Digest: tm7R7FWwpZtQ8KfvtEedQHM2T/E= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VG SHA1-Digest: UEROpdLmPPQdfd2uh9LGAcZs6Ho= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TN SHA1-Digest: i+pSpgdAHP1DEjGT5VAN0AB1FOQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TM SHA1-Digest: FKj05/S7SD0OGcmSf0Mnij28XzE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VE SHA1-Digest: 8tLlMmLIeS/VyFiohcvxYRN6g6Y= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TL SHA1-Digest: qk3P3aaSNAAZ7hcLrQQC9wLj7NU= Name: res/drawable-hdpi-v4/ic_menu_lock_dark.png SHA1-Digest: CSK9tQSV9EYPt8YQiRV20zlDKuI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TR SHA1-Digest: 4V4Zri42zI2GNSlL754ohVozew8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VI SHA1-Digest: /Y4YNwaXJvPLPCGT6sKZ5skh5Wg= Name: res/drawable-sw600dp-mdpi-v13/ic_backspace_normal_dark.png SHA1-Digest: 3pdkXG0U9+VaN4jTez3qBgj9kd8= Name: res/anim/abc_slide_in_bottom.xml SHA1-Digest: ZliTihZ+8kHBA4SfvPIPI00Y7uE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TG SHA1-Digest: +EJqYx+4+2fV4jy8BXB8Ju6AF4s= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN SHA1-Digest: ylwSFPDIGFBoDIZlkwEFVw15oJU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TD SHA1-Digest: Z8NWrFk5XT6IO7pxED6+3r2/6QE= Name: res/drawable-hdpi-v4/check_dark.png SHA1-Digest: JeAdAnO45vwsnB4Vrx6WWJkBvj0= Name: res/drawable/abc_textfield_search_material.xml SHA1-Digest: stH8NpmjaXc5dKXq4DDXvkOo1rI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TJ SHA1-Digest: ern0tUEKpLBiftv9icrLQBezF0w= Name: res/drawable-xxhdpi-v4/ic_lock_light.png SHA1-Digest: SWIn7r4svFznDykxDqMKDwr//Sw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TH SHA1-Digest: GoNQQZa72w2BLHU0jeRG3Evxo3s= Name: res/drawable-mdpi-v4/ic_search_holo_light.png SHA1-Digest: wl3lhUm2ZwGo28/ben0kwjKT8pA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VU SHA1-Digest: mQMFe27fmtRuUsiRy5e1Hz7kgtk= Name: res/drawable-v21/abc_ratingbar_material.xml SHA1-Digest: rf6f8HRUlLAVKAAEFPxwQP5tJB4= Name: res/drawable-mdpi-v4/textfield_activated_holo_light.9.png SHA1-Digest: CSfVZiTZ8M4gHRjhPdVvKlLuXxE= Name: res/layout/alert_view.xml SHA1-Digest: mDZtD4RPbsWmJmNgpKT/bBjKPKU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TC SHA1-Digest: Rj4tCkFDmTE77Y5vsRjSPFdSo2E= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ST SHA1-Digest: yxKmWo/k7slOiHCEWI4oTCfO44Y= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SV SHA1-Digest: bhAVs5VJO6Kglb9AhX4ZpmekpWA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SX SHA1-Digest: xFKI+cG3XqRTIbBQBcwbcP4ejOg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SY SHA1-Digest: Wghv1Ip+Ik1tzCY+cIbbwAWJtvs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SZ SHA1-Digest: lDImT3tOekqJXhoHcO1BZTmNuOk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SL SHA1-Digest: ViOHYZ5tA1kKYLU5oxd1T1NX81s= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_WF SHA1-Digest: zdHkQyT5NcHZEBl82LwJubdeIdc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SK SHA1-Digest: M0nkF1/dp7V7vVRMuhHC1Snssks= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SN SHA1-Digest: z/kRounLTc36PGhi1pw/lKJJzQk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SM SHA1-Digest: g53opthSVmnaVTV3atuKGOstmQU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SO SHA1-Digest: KSRNHIYQ0e6efkGKn+BGHdipOps= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SR SHA1-Digest: x8dytP/U1NDztnevXJAhcQgGCr0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SD SHA1-Digest: RsphnVUDcjIqd2Me7otSCTAsdYQ= Name: res/drawable-xhdpi-v4/ic_backspace_normal_dark.png SHA1-Digest: vCregZmhcawd3oxjzFAxaKv7+wo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SC SHA1-Digest: ATdljVBVkg0xyx1vlI+QYxVog/4= Name: res/drawable-xhdpi-v4/ic_check_dark_disabled.png SHA1-Digest: c9TvWCMataZvt30VdBp4tsgJl0A= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SE SHA1-Digest: wuMCC1cOCIxrb0gnIyBjA1O1+zY= Name: res/layout/log_submit_activity.xml SHA1-Digest: mFxIQHJrxfWuKHCZZYnmdr10TFg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SH SHA1-Digest: yUVejapiW053pX6aCnxUh8O/+RU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SG SHA1-Digest: P+c28dyzrj0X0EGA4zcCv4ZsodE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SJ SHA1-Digest: k/yiXJ4fBf9vcV81YwAK6HOIoG0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SI SHA1-Digest: CLN6AT7hAYgHQkrp7SzCH70HYDs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_WS SHA1-Digest: zQfKFkaBS3JP0SXs2Eb30E7wgB8= Name: res/layout-v11/conversation_activity.xml SHA1-Digest: BfJ0kawRbogOsVpVKpy6Y5h+MQc= Name: res/drawable/notify_panel_notification_icon_bg_tile.xml SHA1-Digest: NA2be1PD5DUBJvxTh1FhUBH7Wrc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SA SHA1-Digest: GWWoAi3+QWo6wXaQ+NnOuGHWu1w= Name: res/drawable-mdpi-v4/ic_emoji_symbols_activated_dark.png SHA1-Digest: vEgl+j5UI83zyi76+l+JT6WMbXw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SB SHA1-Digest: 7fpMXARgPmbr9UOIfYxICiywJyY= Name: res/drawable-hdpi-v4/actionbar_icon_holo_dark.png SHA1-Digest: XHg0D2LrDWJ4gItWJClD9/KdhAs= Name: res/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png SHA1-Digest: wTxntWArKB7sDc4M27U+PpjZhyU= Name: res/drawable-xxhdpi-v4/ic_emoji_emoticons_activated_light.png SHA1-Digest: Gj01Pa4hhcmgA0gbjkiZRER0neI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RW SHA1-Digest: RCYkwY0tiUMtrESFWp9a3Qducs0= Name: res/drawable-ldrtl-mdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: 4Hw7naTONE1358HTJi9mZTJ9Hto= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RU SHA1-Digest: NKxP239IZ2RFpqKUpcVtdIPdR/c= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RS SHA1-Digest: KfCSHnreYc10DXkyoqrQ7g1ohLU= Name: res/drawable-hdpi-v4/ic_recurrence_bubble_outline_disabled.png SHA1-Digest: //jfjpK0x0KAStiBOZcahuYO8/0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RO SHA1-Digest: fbKj3mr/MPcpJGDcmPL9yaVbqeY= Name: res/drawable-ldrtl-xxhdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: QyrilM6n+5uQi4WyzI0NsxXANtA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RE SHA1-Digest: VzGjkv2kIMpz6HaR4zDEQS26lWY= Name: res/drawable/abc_seekbar_tick_mark_material.xml SHA1-Digest: DuFih8Np+ruXlGXOIY3g382yoTU= Name: res/drawable-xxhdpi-v4/ic_emoji_flags_activated_light.png SHA1-Digest: tn9CFDbJqK8F8ll57BoZ4uOfPMU= Name: res/drawable-hdpi-v4/ic_textsms_grey_32dp.png SHA1-Digest: +btEygrkMpaWi8H27RKsxcYsIvs= Name: res/drawable-xxhdpi-v4/ic_unarchive_white_24dp.png SHA1-Digest: eGo7lFHOkrFuGtuMSR3rtlw1Dmg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_870 SHA1-Digest: 8o55DYA2mDrb+KQAHdgFwEx/Arw= Name: res/drawable-xhdpi-v4/ic_info_outline_dark.png SHA1-Digest: tfAOSivQsuBXllNPdqLwgnMkSrY= Name: res/drawable-v11/emoji_category_places_light.xml SHA1-Digest: otQWz5hG6GyV0LBHp4D53ScntYw= Name: res/drawable-hdpi-v4/ic_mood_grey600_24dp.png SHA1-Digest: sBjuE8eN8LsP4DgA/qf3R+VQhzU= Name: res/drawable-xxxhdpi-v4/ic_textsms_black_32dp.png SHA1-Digest: 1o7BWFksIfbiMrT6ULWnx4IGuig= Name: res/drawable-xxxhdpi-v4/design_ic_visibility_off.png SHA1-Digest: SkN1UCkcfqENTne0agcrTI4meiM= Name: res/layout/share_fragment.xml SHA1-Digest: Po6b1EYFz5RvkXc9Ej9y6nEYANE= Name: res/drawable-xxhdpi-v4/abc_list_longpressed_holo.9.png SHA1-Digest: VJa6PrhxyIRS2huzDuIN1KH+I2c= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_YE SHA1-Digest: mMAXt1ldfwA4jZOEV9L9APY/VS8= Name: res/drawable/abc_ratingbar_indicator_material.xml SHA1-Digest: jSCetwmEsQWxASeYyjO7YhmGUG0= Name: res/drawable-hdpi-v4/ic_keyboard_white_24dp.png SHA1-Digest: Xb8onJKRFqnjUkATX0pzbDFa1xw= Name: res/drawable-xxhdpi-v4/ic_emoji_places_activated_dark.png SHA1-Digest: bK61hZF4A5pJzsGBkjVYsmGMaXw= Name: res/drawable-hdpi-v4/textfield_disabled_focused_holo_light.9.png SHA1-Digest: oGMVOAgFtvWj0p2LugzZWDHKQac= Name: res/layout-v13/message_details_header.xml SHA1-Digest: HgcGcNE7DLdk+RiLkhsvANzr3BA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_YT SHA1-Digest: gOFCEJdJx614hIUgV7jJpJFm6+Q= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_878 SHA1-Digest: QviNnJSaWUoKjPaQIgJku4PUjd8= Name: res/drawable-xhdpi-v4/abc_text_select_handle_right_mtrl_light.pn g SHA1-Digest: MoCkoRXaiGThFVhhLr4wDS0VuM4= Name: res/drawable-xxhdpi-v4/textfield_focused_holo_light.9.png SHA1-Digest: yTySMaFvSlprEgpEyEgjuVbWIFM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_QA SHA1-Digest: mvoxqh9r7ANXEXsj08jCnSGDQ3Q= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PA SHA1-Digest: a8JPsP2b17sR1vLRvn4enB0M9cI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_883 SHA1-Digest: 2jum0IhxlGkbzkFJWFxDORTg6fA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_882 SHA1-Digest: 8Z8M+V2ZWW6JbKr8gpgeHmqkkDY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PE SHA1-Digest: LAGQyeqw0vpHmJahDVWjbicRypk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_888 SHA1-Digest: wMskIVvmx3HIcL5J2No10i2A9so= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PF SHA1-Digest: zWX+LROUq7crirPHVUe9wtvIDIk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PG SHA1-Digest: JB7/lwiKpgbnSjQZm0QdpWXgj6c= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RO SHA1-Digest: cRgBwAMis1D0rzYnNZC4yKikBoU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PH SHA1-Digest: VScGE9xLEHaBFBcEx52ltLOhRk0= Name: res/drawable-xhdpi-v4/icon_lock.png SHA1-Digest: CtVbaO3+Fr4E2yF9u45P4U9hUd0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PK SHA1-Digest: xgku4bi2sSKqu/lL62DBCeEoQJc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PL SHA1-Digest: 4xgcJ4W8i4tTJsX+E0X3cM4ubH4= Name: res/drawable-xhdpi-v4/abc_ic_star_black_16dp.png SHA1-Digest: oKK0tOor4SmX4ORpTg/URmuOtes= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PM SHA1-Digest: oN42s58DbAWKwv2QpbH/hma1ZPc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RE SHA1-Digest: SwTsoKIYmEECNmj4+b+e320o1Pc= Name: res/drawable-mdpi-v4/switch_bg_disabled_holo_light.9.png SHA1-Digest: BhD8bo9CPDyMD8yAOdeT+l8P5Jk= Name: res/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.pn g SHA1-Digest: 69Uq0XVEEDCz62q7/piNqhuoD7Q= Name: res/drawable-mdpi-v4/transfer_controls_background.9.png SHA1-Digest: Lvtopp/2tRzPP+kXqYiM9od0lTc= Name: res/layout/abc_expanded_menu_layout.xml SHA1-Digest: W73xs5NSOjkqj0jbh7TZZLI0Wy4= Name: res/layout/conversation_activity.xml SHA1-Digest: usVLHgIKhZH73OT/+CjrNGevW9A= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PR SHA1-Digest: Myj2w+M/4RtwVizSQNUpSsLshXg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PT SHA1-Digest: okeuHjNb06deDvLDcvN4klXUc0M= Name: res/drawable-mdpi-v4/abc_cab_background_top_mtrl_alpha.9.png SHA1-Digest: 6eRtpYyE2B45gWd2aZtCG4kO5FM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PW SHA1-Digest: fS+u0XFqL3+38hIyY0REsvwFj00= Name: res/drawable-hdpi-v4/abc_list_focused_holo.9.png SHA1-Digest: zND8CPcT8wBLOji5D5ZGNvi5kR8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PY SHA1-Digest: jO1LxycY4SzKsCcwo1eY0+FeJ/c= Name: res/layout/emoji_grid_layout.xml SHA1-Digest: agZG8EI3nmW4V9cyw7bheN43nUI= Name: res/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png SHA1-Digest: goxOqApFWDjSlcueZaQmSCez9dk= Name: res/layout/abc_alert_dialog_button_bar_material.xml SHA1-Digest: tMCjLtUjSJOYwttMnMsOHdX7sD0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_881 SHA1-Digest: yo5YOelCWqWBGVDlVa5WhxmL7w0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SK SHA1-Digest: 96rchRUbtAKU313zQVKgv0N3qKc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SL SHA1-Digest: OgDAr1TOCF/1N58CHLjTy1AgkUE= Name: res/drawable-hdpi-v4/divet_lower_right_light.png SHA1-Digest: HCYIERjn5GsGN9vKk35RvVJZUHk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SI SHA1-Digest: UZr7IlrTal2j3ipUJUod8x4qlyU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SJ SHA1-Digest: s4yyxk3g7P1pRuFzCSqGcpUjWQw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SO SHA1-Digest: htGLLtSOMKfLL12h6HYrkSiOMBg= Name: res/layout/abc_dialog_title_material.xml SHA1-Digest: zsuhiCNtRRoeFekZBUtVN9Jqp+4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SM SHA1-Digest: 5jAvH995sQVqVzNkgspOpG4x4X0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SN SHA1-Digest: WcmT7aKYXTBdfV10S6WkAoFTF8s= Name: res/drawable-xxhdpi-v4/ic_backspace_grey600_24dp.png SHA1-Digest: MFcDn5r/1R3v4bm/8x0bsiYx63c= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SC SHA1-Digest: GBrFpRv3u/6flWJZDlVEGJPyd2c= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SD SHA1-Digest: PdfJzWjB3AA3T9ZmdyKDEOn0UKA= Name: res/drawable-mdpi-v4/ic_unlocked_white_24dp.png SHA1-Digest: fK28/63l+5jbANOBm3m+4Aw23Vg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA SHA1-Digest: 9BRv6ebxRlIr8BZ1K6mNexyiC3Y= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SB SHA1-Digest: /4etoF1Zt2u/o5Z3umH/uXMSgz0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_OM SHA1-Digest: vAkieqUxYKf3YpstJSNeh0032jM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG SHA1-Digest: mrfe+RBUPqsrkjZMbEyO74CjSj4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SH SHA1-Digest: vOkdQKnNRrHoNV+Lg0zZ1yKf9vk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE SHA1-Digest: Z3aCo77hrh8r6KT4LHNMlVnynVM= Name: res/menu/conversation_send_drafts.xml SHA1-Digest: W+zYo2fXJG9Iv9FGkh4kEs/ZDr0= Name: res/drawable-hdpi-v4/ic_attach_grey600_24dp.png SHA1-Digest: DdR+W+yXTJheJrPCfVkH5Q07zPs= Name: res/drawable-xhdpi-v4/ic_emoji_people_normal_light.png SHA1-Digest: 96nNbN5E9bGPhAPE6ftBOob9vko= Name: res/drawable/emoji_category_flags_dark.xml SHA1-Digest: sG+4lQ00+HnzttTFyWXu9NBIhIM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RS SHA1-Digest: qj7G7obtB3uLg0HNuY55tuQ4pn4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RW SHA1-Digest: ckJDwl/jED6zpIyf8ryWBsmgmP4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RU SHA1-Digest: nq/Wsss67yMGaSyobPLEJymIgA0= Name: res/drawable-ldrtl-hdpi-v17/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: h4G5TeOQ9xufiMtoFfAe3fINBds= Name: res/drawable-xxhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png SHA1-Digest: rciAiTdJ+MRPTsG/UvNRmHGoqCA= Name: res/drawable-hdpi-v4/ic_app_protection_gray.png SHA1-Digest: QZT4aa2VzKHLAWpG+yj0gzMgQvo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TN SHA1-Digest: 9m/xZbONlPmO3PPKO3hPEbuDfdc= Name: res/drawable-hdpi-v4/ic_emoji_symbols_normal_light.png SHA1-Digest: 42oEklSS5CvG46vt+LMSl6l4mak= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NC SHA1-Digest: JC4FZSD4039H7qsAsEJC2S3S244= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TO SHA1-Digest: C6MlgyRSI18XYTMvo6+vckYaoMo= Name: res/drawable-xhdpi-v4/ic_advanced_black.png SHA1-Digest: uQSYijVK8clj+RuEcELsZ8TsiME= Name: res/layout/time_picker_dialog.xml SHA1-Digest: N+RWjCpsTTG7ym9CkToPYzHwKp0= Name: res/drawable-xxhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png SHA1-Digest: TLfjxp5bknlrmh6zJTSYD2AfmTo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NE SHA1-Digest: i8hZpLiSVyG8XQN8jzrbvqeUl8o= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TJ SHA1-Digest: swiu2z3fRHNYbl4wsV2XcRLnfzA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TK SHA1-Digest: p6n9j+WcmOxZEA8DcjPC6VRRHNc= Name: res/drawable-xhdpi-v4/spinner_disabled_holo_light.9.png SHA1-Digest: aSQLWb1sFD+uZE0dSc2Aj/zR7Yc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TL SHA1-Digest: IOWA1qVxhFVmaIGmrJRPW9MR8As= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NA SHA1-Digest: JVMN0Xl5tjxTcRYjj7M77IPmq3M= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TM SHA1-Digest: Cf9uOEFp9k9cjW0i5/8m6IvyvV4= Name: res/drawable-ldrtl-xxxhdpi-v17/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: C5G74tW2JFPwdcl//FtvBsXTaV8= Name: res/drawable-hdpi-v4/spinner_focused_holo_light.9.png SHA1-Digest: 9+5viI+b67liCPiPkELWte9HLXc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG SHA1-Digest: UKTB8RO8balQn3KQo/P864JvqUU= Name: res/layout-v17/abc_dialog_title_material.xml SHA1-Digest: iX/lOYt3bX1MSKeitXE5EuSqs1g= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NL SHA1-Digest: lu34xxm9iiTDnCLXh2bSbYe3D78= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH SHA1-Digest: SE95tqoq4j/d5OEOXBKd+RDtwmU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NF SHA1-Digest: FxhGK08kM8R1C1SJmIPRDbCoqOY= Name: res/drawable-xhdpi-v4/ic_group_white_24dp.png SHA1-Digest: mNjS6NAEYUiBqxZlnYyOEXQJeYo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NG SHA1-Digest: GXTV2v89Up62k60iQ4I5ZZfsW08= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC SHA1-Digest: EiZ1/iWaVVkT/vWuBvWPMPFgdvs= Name: res/drawable-mdpi-v4/ic_backspace_disabled_light.png SHA1-Digest: QaXYwpDpZhB56I9vu5guCCaGaGs= Name: res/drawable-xhdpi-v4/notify_panel_notification_icon_bg.png SHA1-Digest: cuJ+cwlm5QO6frAFAjbS9w6zhJ4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TD SHA1-Digest: byTDSRZBh8horEiaTJ6i5MuTNRw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NI SHA1-Digest: TjaggApGQjTxch/XqYR42H2EJu8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NR SHA1-Digest: MXq/gSlluenWT3REsEs/Ys5bEho= Name: res/drawable-hdpi-v4/ic_volume_up_light.png SHA1-Digest: l1of9/Hk1H1JBK5koBRKJtdbI84= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NU SHA1-Digest: 0D89o8jukFMElU/fD/VhWpazuVo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TA SHA1-Digest: jBeCx7ldTJlbk342eoyD8jRc75s= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NO SHA1-Digest: WxvbyTQWvHQ23DxpfMFVgZGtHvI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SZ SHA1-Digest: NlgzjkOHMNtUDcWVPTAeizQV+aU= Name: res/drawable-xhdpi-v4/ic_emoji_people_activated_light.png SHA1-Digest: WF9erMYR4jANtyyTuLRBFAuKK7U= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SY SHA1-Digest: jL7hDYnBAkPTHfPGL3SWk8goqlQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NP SHA1-Digest: r76/zkKxIL4gc8EMCY0Fns2QR+M= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SV SHA1-Digest: f7avWcSx/JD+mKPVftZLKA9cxGc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NZ SHA1-Digest: 0tvCGNL9zKa78qH0f/HLLDBXxlY= Name: res/drawable-hdpi-v4/ic_lock_white_18dp.png SHA1-Digest: ohYcGfFxrJMwPbXE6XVO0gcP4Og= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX SHA1-Digest: 1H/6pqPRYgFPVKMH3TFVXo2jM7E= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SR SHA1-Digest: dkm5v1snRr7OiqOaivJdmYmtfDM= Name: res/drawable/unread_widget_icon.xml SHA1-Digest: upRvtT06LesYocTJGPRPym344vA= Name: res/animator-v11/scale_with_alpha.xml SHA1-Digest: VL4imnI1LOFLVsR92Vrab3fF2tE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ST SHA1-Digest: WTXJHshgmiUapAxM4/VpRZH7eGY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SS SHA1-Digest: ed35M7DJ80y7wAtWthKtcXIk1TA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MC SHA1-Digest: cewXo/wdkjkeoxZ3Nee5WCBjhBM= Name: res/layout-v16/contact_selection_list_item.xml SHA1-Digest: pw672pQGRm0ISP6So9H2IsvV4Os= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MD SHA1-Digest: PjZy0CCmrLZU9zurTo30dtq9PJE= Name: res/drawable-xxhdpi-v4/ic_done_all_white_18dp.png SHA1-Digest: WkByP6D92j4bv/Pil9XHVM3RC9I= Name: res/color/abc_primary_text_disable_only_material_light.xml SHA1-Digest: ha0iBG12VF3cEliu/mL5oLsMBCg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MA SHA1-Digest: HSq7KlJ2FL4GbiLuFJZfmxCgXAs= Name: res/color/abc_hint_foreground_material_dark.xml SHA1-Digest: a31Xl9T4E/lWYRXr97OgmwLIGjA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MK SHA1-Digest: TfSJmoJW1SDd7cAwuH+xhvJsxSg= Name: res/drawable-v11/psts_background_tab.xml SHA1-Digest: FbO7BYaDOS6zhMZenOjUS0C+WPQ= Name: res/drawable-xxhdpi-v4/ic_emoji_people_activated_dark.png SHA1-Digest: os0Db3dkZuFsgJhCYA+MeGDNp+U= Name: res/drawable-xxhdpi-v4/ic_clear_white_24dp.png SHA1-Digest: GVe8Vwep32bd8xsL229mBmg2h4E= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ML SHA1-Digest: Tv12GdE6DSPyQ2XL6DlImd29teQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG SHA1-Digest: l1cY/LkGWOUk1EV46S2Oq92CSdk= Name: res/drawable-xhdpi-v4/abc_text_select_handle_left_mtrl_dark.png SHA1-Digest: h2tBvFGRUrlGIzFUqIYNFF4jBTY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MG SHA1-Digest: ZXB6A/xVxOOc248T3dx+w9LPvdo= Name: res/drawable-mdpi-v4/ic_emoji_emoticons_normal_dark.png SHA1-Digest: mPusmSVMFzZUGpBQ6E5NCbXkKX4= Name: res/drawable-mdpi-v4/ic_emoji_flags_activated_dark.png SHA1-Digest: 0MDts2HilwKeFl9r2d+WrnJLkSY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MH SHA1-Digest: IM7o6TBXSXYE0m4YjQ5qFh2QvfE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ME SHA1-Digest: N03ucXZJX7VgZU13+GWaFp9QJ4M= Name: res/drawable-xhdpi-v4/ic_recurrence_bubble_fill.png SHA1-Digest: VoWjBShGNU44SXtwuX6t5bpZrDA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MF SHA1-Digest: 2I28lsCM+6tu88L5imP3b+N4Akg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MT SHA1-Digest: jgXDYiiFvCeF1IL7iLa7xZPMFJ8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MS SHA1-Digest: +X9s8U7GGLIx930dv46iPPQ9RrA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA SHA1-Digest: t8XyhQ0mG1pCgDrQ1WTP4o1XXDI= Name: res/drawable-mdpi-v4/ic_group_grey600_24dp.png SHA1-Digest: aOL5qnoByZku+HzkTSlk11T7mWc= Name: res/drawable-xhdpi-v4/ic_save_white_24dp.png SHA1-Digest: 8mGf7Srmi+NaZnKZAZkX3jXJ4So= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MR SHA1-Digest: 4KdW7dYa6hIGvRWo1G5wDIwKSck= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MQ SHA1-Digest: MMRiuGVFqGxrV3dhvq2tye4CkuI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MP SHA1-Digest: ptf0bsMqULADeNlyO51oVJTynG4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MO SHA1-Digest: FOYt2nEEtrR4/3HVwVB6aSP/geU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MN SHA1-Digest: yPX7lx3cgbs8QuzsMJTxMS4j1O8= Name: res/drawable-xxhdpi-v4/ic_play_circle_fill_white_48dp.png SHA1-Digest: IKqNYGcSk58VM0AkhuBDY0am2YQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MM SHA1-Digest: OxIrWtC1QUxDT8JP+DmwrZIcCng= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TZ SHA1-Digest: 5W4ZJ6v7YvgqqIfI6EBozDRT/Ps= Name: res/drawable-xxhdpi-v4/ic_launch_white_24dp.png SHA1-Digest: WHTfhx19GRttt2NJzH4Y+XpE3nw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MZ SHA1-Digest: g3vFBJfNKd63I/WPalb0sCUYSqE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TW SHA1-Digest: Xjoo6t2HPHTH/BLNDymne073Kx0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MY SHA1-Digest: 6NMgbrEYk15vm9xI/1t/FMVIeMU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TV SHA1-Digest: 4wfvZKkRc1ykZm4kLF+zvygZZ7w= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MX SHA1-Digest: NRlLbBAuUn5RBX4zGlqVirmVCU4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MW SHA1-Digest: exAFvjs2eMnAs+pA3nWPuHOe+xw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT SHA1-Digest: iA2IpMDlGcuoM/RMHSCToK/Q38E= Name: res/drawable-hdpi-v4/ic_emoji_places_normal_dark.png SHA1-Digest: AFAumMkPg+T4P2fCg2JVJUOts8o= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MV SHA1-Digest: ZRa3kW4VGFC4ZKIpNPUHE7OUaRE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MU SHA1-Digest: oMn6DlkeuN1C8Joa/Df0HKwRzPQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TR SHA1-Digest: wRUY3MGMXlbw5WXu6s7J0zhc/TI= Name: res/drawable-xxhdpi-v4/ic_message_white.png SHA1-Digest: ifsACHNPhAVlm79oZ7iM/zm4PzQ= Name: res/drawable-xxhdpi-v4/abc_text_select_handle_middle_mtrl_dark.p ng SHA1-Digest: RFU8ebcpWdq1WfG1+5m0rjD3S0w= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LI SHA1-Digest: upsn6OwcOJdwVT+HHz74l+yPv4s= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NA SHA1-Digest: yEv2FgyaJAh8pGKhbvYhDfunkks= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LK SHA1-Digest: ZTGLfQsAjJEcrrmEHACGgSd3KMM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NC SHA1-Digest: ajH2DipKBiYyMX/FrrpauY8LLrI= Name: res/drawable-xxxhdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png SHA1-Digest: 1/FXt00E0Mr8GUWNIDQCnUx9Qzc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NE SHA1-Digest: MySQZ5vZlIUKnfLXrQZXNJoNIFs= Name: res/drawable-mdpi-v4/check.png SHA1-Digest: jLC9/pGW+MYKcYNm2cxfJyllBVw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG SHA1-Digest: Ejow+MuVgMnqqTPxvAJj8R/A254= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NF SHA1-Digest: OzvlR7fb7B4Cf+9Vk1zB/Yvxklc= Name: res/drawable-xxhdpi-v4/ic_recurrence_bubble_disabled.png SHA1-Digest: AV124HmknqvKyuUa/XYpjYLNqWc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LA SHA1-Digest: +OruRafiU57DRrxr/n3KMrKj3hU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NI SHA1-Digest: 3qyBNkHn0Gxh5NLv2pwLIbYpX9I= Name: res/drawable-mdpi-v4/abc_ic_star_half_black_16dp.png SHA1-Digest: LJhGIJ9ykH+SLTXwcnjoa1J97NE= Name: res/drawable-xhdpi-v4/ic_emoji_places_normal_light.png SHA1-Digest: YdZBCdKUNvOCrHQPwpzS0SIBgkQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LC SHA1-Digest: iiefFy3QmJIunB0DJ4DZfN6kvqA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LB SHA1-Digest: 1m0loiBMdY+emkN7eXEHbyfmgs8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LT SHA1-Digest: V1MnmtbPimo2ZrgI0uRK6L89FnM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MK SHA1-Digest: 1eF19PNyJ5as96s7rAVHDhEIE+8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LU SHA1-Digest: S6OsLuJRpTkIBjcrif9UqPjRL2A= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML SHA1-Digest: SbNPMzF0o5Uz6plQ6ImJScbYw1c= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LV SHA1-Digest: B0orY0nNVdXs9+BHvDXpUCNKVnY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM SHA1-Digest: iqsvsg2e8NJO+cklT7YhOnepdX4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN SHA1-Digest: HgDuGVsZnQIrDj7HXWzsphvMxmU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO SHA1-Digest: QJZXuiEWqdELKMqe8ZnsYKnki8Y= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LY SHA1-Digest: YltnLOUAyxdkzgJrwyjA2Od9FR0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP SHA1-Digest: zuEoWjXXHq4k2e5ja4pff4JoqHY= Name: res/drawable-mdpi-v4/ic_add_white_24dp.png SHA1-Digest: I6nQAaco1kzjbUS2FmJgI9sBFho= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MQ SHA1-Digest: 1GLz8hrqzsqLYKmVsx/76btejd0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MR SHA1-Digest: WLAbOuMp+0HQ5Endm6t4yonH1qc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS SHA1-Digest: uX4fVmMZ3f2BUUnYj7fIUssjE00= Name: res/drawable-xxhdpi-v4/ic_emoji_objects_normal_dark.png SHA1-Digest: JrXda+th5R9MfiCHfKZ174i1EFQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MT SHA1-Digest: puOfc4sATHCx2nrvay4JOuCYQbk= Name: res/drawable-xhdpi-v4/ic_app_protection_black.png SHA1-Digest: uApXkGW/FNT5k85RAUVhvMUtkXM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MU SHA1-Digest: zgs7t+DTo9IGr0J0AB10nZBo2w4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MV SHA1-Digest: WgbGdYHl3liXNyzSZrbaqzkgVuk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MW SHA1-Digest: /wIDxZ0YosDclUPBpYboB4pxUKc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX SHA1-Digest: +V2jO/Iwq2Ry3N6vmWCu86o69Qo= Name: res/drawable-mdpi-v4/ic_account_box_dark.png SHA1-Digest: 7wNRrjFr2m0teMaRg5GFeCkt2zA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LR SHA1-Digest: WsgB1nPq8MA0Fsjq4rXxFvPAoOg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY SHA1-Digest: aGkIDYkB8dtrYBTnrE3py4Ya2Ro= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LS SHA1-Digest: DgoKQf4lCEL2mtX2ILBwo5e+DIw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MZ SHA1-Digest: EF/iKcMSSP05GvwFeGiDWTJvSh4= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_27 SHA1-Digest: nEYbSuXRF/uctKuasoKct6HqEFw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KE SHA1-Digest: R8PMF1UnkmPg66U/bCgAxl7YAQw= Name: res/drawable-xhdpi-v4/ic_volume_up_dark.png SHA1-Digest: VWl14rkcGJkHVrs2Iays0IdaRCo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KI SHA1-Digest: NbWr5OoxAViKj6R9PpsQLAnuvhI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KH SHA1-Digest: JfUEQWocrRtdPojYHgAGuzgtaYo= Name: res/drawable-xhdpi-v4/ic_volume_off_grey600_18dp.png SHA1-Digest: OQ5o37s135Z/Q1vz8UrbG88saXM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KG SHA1-Digest: qLKWcgQFJeoF5MBnzwkRCHCv83Y= Name: res/drawable/error_round.xml SHA1-Digest: /dc/CUQ2SFAXgoplWG74eEB36w0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NO SHA1-Digest: P1ydPzbNWCbra5/uii8q0hUx11E= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NL SHA1-Digest: jVTgjUlKXg6pjCp7LSIdROs0nJo= Name: res/drawable-xxxhdpi-v4/ic_pause_circle_fill_white_48dp.png SHA1-Digest: w5Ny1a0SNHu2RQtcfJwZoIXwl8o= Name: res/drawable-xhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png SHA1-Digest: cG04d50tDB7eX3k8GXpvzf7ad6k= Name: res/drawable-xxhdpi-v4/switch_thumb_activated_holo_light.9.png SHA1-Digest: ra2//DL5yVUdjqqYTHr5wqVGdsU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KY SHA1-Digest: WJwe/k4JIc+T7ru1w72Un2d2iiU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NR SHA1-Digest: CtGvqiGAGpJTh7ODg5K6dUoL/y4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KZ SHA1-Digest: vtMfhVkSqr1CsD4NJls3aj1ssgY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KW SHA1-Digest: ReXjgTsJAekB6pgiCCmFNQsLHKA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NP SHA1-Digest: SdqHxcI16hFW1MFy515vwgT0olY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KM SHA1-Digest: 9HWdF77s8JEJFAC0dRThzQWVOUM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KN SHA1-Digest: andVqitx2nhGkwF4cBN14hnAmQk= Name: res/layout/conversation_item_header.xml SHA1-Digest: ZkV0210AY1aJ0OshuVCgO+Qbg/8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NU SHA1-Digest: xj1ph7v07RxQ3Tx2c3eOubdaMLA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ SHA1-Digest: Ozd8CQ8+nyIZ5WyoKRg6yDIoDiI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KR SHA1-Digest: EJJcyRP2SDc63SRFLttTQKyHNc4= Name: res/drawable-mdpi-v4/abc_list_pressed_holo_light.9.png SHA1-Digest: tbKOWkoq8X/O9SqZLE2Z7VwIrfw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KP SHA1-Digest: bhqbTHunDfw7sHn2SrjQVfu0PFA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE SHA1-Digest: vwjUPkmb3Z0JzHcZGbMAShRmI/c= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JE SHA1-Digest: YxhA1PAO+zoMV5FiRGs7g0JgEVM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA SHA1-Digest: aaskHG26vfikuQOobVbjvJkXjdg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PK SHA1-Digest: MeQ66zU6Noe05cqb545eOOeFCKQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PM SHA1-Digest: P0jxl/qu/pvOk9oI/jqIkgFqS1Y= Name: res/drawable-xxhdpi-v4/ic_brightness_6_black.png SHA1-Digest: HpV77ISECGzV/+AHPI9elXVuCCU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PL SHA1-Digest: RJMdCvEXRiO7/ljLTqvqswKVoJI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG SHA1-Digest: LrQt5BB84Fms4OSuqo+aIscuzu4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PF SHA1-Digest: PUgWb0bhPQJFK9TJz6w6O1yTBIk= Name: res/drawable-xxhdpi-v4/ic_menu_search_holo_dark.png SHA1-Digest: 7/js6D+0bH1CxZklb/lHp9DnMGM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH SHA1-Digest: je6mi+Yrig7wXaLZn99A1PpJXSU= Name: res/layout/abc_action_mode_bar.xml SHA1-Digest: H4FVEEhXPLP8buIJgatyzFrcvRE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_OM SHA1-Digest: klpn7S0WXsLenwC+5Iv4T2EM96U= Name: res/drawable-mdpi-v4/ic_circle_fill_white_48dp.png SHA1-Digest: ByK3gPD5yBtDvvqNOkOYzLN0U/4= Name: res/drawable-xxhdpi-v4/ic_brightness_6_gray.png SHA1-Digest: g9LDQa/2MUHF9144p9nuITN+iIo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JO SHA1-Digest: SalZsp+RivjFelAg5FqpqMSHQ8M= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JP SHA1-Digest: tjjCc4vBol1u+/hPlcnD9SlEyVc= Name: res/layout-v16/reminder_header.xml SHA1-Digest: BVckKRBJ305iYV1tAQ4J+xG4TcY= Name: res/anim/abc_fade_out.xml SHA1-Digest: MTJWZc22b5LNeBboqBhxcQh5xHQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JM SHA1-Digest: McBJ3SsWfVTtf3/GJheNxSPbz2k= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IE SHA1-Digest: DI0aTS9fd+KtRjmTLx69Y3zTbaY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ID SHA1-Digest: el6L9YnWqX/HKc+NRxogSB0HzTs= Name: res/color/date_picker_year_selector.xml SHA1-Digest: LzGQSVdgDN4IuJWDz3uu9BOEfUs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA SHA1-Digest: gtnWevKmSm5udS052naVPA6xKhU= Name: res/drawable-xhdpi-v4/abc_list_pressed_holo_dark.9.png SHA1-Digest: WYYEXP9zXPHmkO70T8BA20aSj+U= Name: res/drawable-xhdpi-v19/switch_thumb_pressed_holo_light.9.png SHA1-Digest: 58f1EtXQ3wizMEJeTAgSgdZA5uA= Name: res/drawable-hdpi-v4/textfield_default_holo_light.9.png SHA1-Digest: fuY+WIlRJ8vgPwAzkl65YeJKVPo= Name: res/drawable-hdpi-v4/abc_list_selector_disabled_holo_light.9.png SHA1-Digest: BLQq1kPx0/JPxPxgp/MrxD6Ft1Q= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT SHA1-Digest: /+jUg/fouhfWRr7QzkSlo/IQzjw= Name: res/drawable-mdpi-v4/ic_arrow_forward_dark.png SHA1-Digest: Dqyapq29+35To/xRxC+rxA9W2EM= Name: res/drawable-xhdpi-v4/ic_movie_creation_light.png SHA1-Digest: 5UU364nngw+I67lX3Wcaowdt+3g= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR SHA1-Digest: 7tnKmhKxP4lB+vx/VQ51lUA5Jl4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PS SHA1-Digest: phT+B6EkG0No5vWvOPJ550m13Bo= Name: res/animator-v11/upper_play_to_pause_animation.xml SHA1-Digest: pZ/KDmklLAhatNYLhss0HJP7bTI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IS SHA1-Digest: mTi+12JtOB/zIiarrK5U9SUG4ak= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IT SHA1-Digest: DvDU4JvSM/nExB4aABnCWuQr6co= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IQ SHA1-Digest: 6YJ6ozeNHqkSMFUYmEhXIvK0m/g= Name: res/drawable-xxhdpi-v4/icon.png SHA1-Digest: 0sRkUHHzVMQ90JPNC0VwdWFolPI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IR SHA1-Digest: n5sVB/BGiajK80KhghNVuu9FjTA= Name: res/layout/led_pattern_dialog.xml SHA1-Digest: Nu+KLZK1X/hgyrUT74E4LQ/xobE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IM SHA1-Digest: de6FVs0hfHzqCly5fmgVB4fM7zE= Name: res/drawable-xhdpi-v4/ic_save_all_white_24dp.png SHA1-Digest: DUh+gIlKJ/TTmuo0wHQAdR8IDeI= Name: res/layout-v16/fragment_submit_log.xml SHA1-Digest: fvFOUfp94WtgcKMVWy3hQkjX1BI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IN SHA1-Digest: 1b8VJJvfWSnyWygPcDExgAaYvuE= Name: res/drawable-mdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png SHA1-Digest: bjw5Qfj9OrAUagjyW3bicEthmg4= Name: res/drawable-mdpi-v4/switch_thumb_activated_holo_light.9.png SHA1-Digest: bnXBtaKF7a29jCEvIOWErkhFvv4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IL SHA1-Digest: p3ArTBn8YrJAEa6uQBzmZLCIhdg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PY SHA1-Digest: q3pMKhvhzPQr4o6JVGCRtI0TnBw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PW SHA1-Digest: oi0Rf1UzJ2gCIiry9jU+gwrNMZQ= Name: res/drawable-xhdpi-v4/ic_info_outline_light.png SHA1-Digest: AmfM36X3Zv8Y5Iv3niwqWm5WDNE= Name: res/drawable-xxhdpi-v4/spinner_default_holo_light.9.png SHA1-Digest: Q96rsORloNyw2WFYTUl9VA/zlUc= Name: res/drawable-hdpi-v4/list_selected_holo_light.9.png SHA1-Digest: 8+a6kSVhZ1n87KOe3NWXssOoSRY= Name: res/drawable/emoji_category_nature_light.xml SHA1-Digest: MvM5QlPGIDze+USr4SKXQ0fNc5k= Name: res/layout/expiration_picker_view.xml SHA1-Digest: zUaDCw/P0GnFa/asV/is1AvhoQ8= Name: res/color/abc_tint_seek_thumb.xml SHA1-Digest: N2+i8rVRimGZ58YjFfsmpqK0a2E= Name: res/drawable-mdpi-v4/ic_backspace_grey600_24dp.png SHA1-Digest: kHO0u80/vSCZSg5rvlhGl1iLd2o= Name: res/drawable-hdpi-v4/abc_switch_track_mtrl_alpha.9.png SHA1-Digest: +BAInzzGimhbNKEsUcg4H+12pT0= Name: res/drawable-mdpi-v4/ic_emoji_symbols_normal_dark.png SHA1-Digest: qUB0gCvTkMWF6nHa9ax6itaPdqo= Name: res/anim/design_fab_in.xml SHA1-Digest: 88HYAVsN9aX1xNbLpWMveab3t7w= Name: res/drawable-mdpi-v4/ic_group_white_24dp.png SHA1-Digest: 511LdJ4GYPViD/6dAXj345vG/CY= Name: res/layout/abc_select_dialog_material.xml SHA1-Digest: tjRrCY0x5FoakZqHn3Ut1ZwIeFg= Name: res/layout-v11/notification_media_cancel_action.xml SHA1-Digest: FOKQ0fSwhQySQM6fclToJK+8huE= Name: res/drawable-hdpi-v4/ic_photo_camera_dark.png SHA1-Digest: u2nmahIYst9Z9v2lZ8kLW6X2To4= Name: res/color/recurrence_bubble_text_color.xml SHA1-Digest: LTrVdygP++avEBn7g5W4u7gN8/E= Name: res/drawable-hdpi-v4/ic_emoji_nature_activated_light.png SHA1-Digest: m+ldTqupAssUp/UvEkLj7iQ2osU= Name: res/drawable-hdpi-v4/textfield_activated_holo_light.9.png SHA1-Digest: bLHdUYUynLqsA32+N3F3BJ4EBHQ= Name: res/drawable-xhdpi-v4/switch_bg_holo_light.9.png SHA1-Digest: c+JwYiQCZPeynR8o/HjhfKjOc5g= Name: res/drawable-mdpi-v4/ic_lock_light.png SHA1-Digest: 08GskiiL2N7wF6jvODez4muPFNM= Name: assets/emoji_objects.png SHA1-Digest: EJCaAiWW33tUKJXv05D8xPp76zg= Name: res/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png SHA1-Digest: +TY+I9fpZ38ftBWokyGPSIm59vQ= Name: res/layout/prompt_apn_activity.xml SHA1-Digest: CE8wnVZpaH6HPreItOyvd4STXwY= Name: res/drawable-hdpi-v4/ic_backspace_normal_dark.png SHA1-Digest: RwnuEGaHEztETyRi3umBZWHFTa0= Name: res/drawable-hdpi-v4/ic_emoji_objects_normal_light.png SHA1-Digest: PymWawe+nCbCtsSNOqtgwB3mIrs= Name: res/drawable-ldrtl-xxhdpi-v17/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: EW/WpNliEy+bQjDuiw+U1mX+yZk= Name: res/drawable-sw600dp-hdpi-v13/ic_backspace_disabled_light.png SHA1-Digest: RXmFGZr/Q0yvb7b872P8mGxd43Y= Name: assets/databases/apns.db SHA1-Digest: k6v+TN+cEVpPY0fC67VxFAVib38= Name: res/drawable-mdpi-v4/ic_photo_camera_light.png SHA1-Digest: WmiuSqmKFwE30U0LyMZxLH6BHsk= Name: res/layout/abc_search_view.xml SHA1-Digest: uvwsNoxNUjygjCCYkA9pnNpeJBQ= Name: res/drawable-hdpi-v4/ic_mood_white_24dp.png SHA1-Digest: uZNTsuQbAcrQLA+3xkTKaiOfX/M= Name: res/drawable-xhdpi-v4/ic_dialpad_white_24dp.png SHA1-Digest: mf5EtIftpkW/aAUGgvq5+CpN4JU= Name: res/drawable/blocked_indicator_background.xml SHA1-Digest: 1cWpsxVvS7coD0mOw3AbNatyz4I= Name: res/drawable/emoji_category_people_dark.xml SHA1-Digest: JWHxgdaJ5JIkkd00fQZEJAuJ8KY= Name: res/menu/media_overview.xml SHA1-Digest: lGduXSTm2MsdaEXPVkIlmCSzaa0= Name: res/drawable/list_selector_background_transition_holo_light.xml SHA1-Digest: d7FKlK9pScIw5O7f2CyRR9A91ko= Name: res/drawable-xxhdpi-v4/check.png SHA1-Digest: Cmlk6I4eMSx7Q1CnDR14+OGaGPc= Name: res/drawable-xxxhdpi-v4/ic_done_all_white_18dp.png SHA1-Digest: EVUOZ2QD0IMZA6mmJGnrvlwa7JU= Name: res/layout/import_export_activity.xml SHA1-Digest: eGZy6IF9v9OwCuU3RKROtX3PKMk= Name: res/drawable-mdpi-v4/ic_send_insecure_white_24dp.png SHA1-Digest: uKfZvmTIoTHVB+7pm+rP2+aTzek= Name: res/drawable-mdpi-v4/ic_launch_white_24dp.png SHA1-Digest: S5Taz5tU0amDaTCujYqnyRXr0iE= Name: res/drawable-xhdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: 5ThZFP/+iYVybD8ENFXZKyOzbaU= Name: res/drawable-xhdpi-v4/abc_popup_background_mtrl_mult.9.png SHA1-Digest: hjf9hvwtitJD8jRTc+L89zr4i1I= Name: res/drawable-xhdpi-v4/ic_textsms_grey_32dp.png SHA1-Digest: eZ389TICT2Hx+4lFASo82m7q/To= Name: res/layout/keyboard_text.xml SHA1-Digest: X3CNem6m9YL2iEnh8nZ1eJqnf38= Name: res/drawable-mdpi-v4/ic_forum_grey_32dp.png SHA1-Digest: 1FE//0VushWlCtrkrHNhGxNasyQ= Name: res/layout-v17/conversation_fragment.xml SHA1-Digest: IE7276GxKT7mkymeigejeQnuzc4= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_7 SHA1-Digest: ++F/BtCrUwz7P52Agrem1zBo7MI= Name: res/drawable/recurrence_bubble_fill.xml SHA1-Digest: hY1/dq5DoGqB5nB5bzt/+w0aZyU= Name: res/color/date_picker_selector.xml SHA1-Digest: aG7HwnsPwR4bvTJ0xUC75E7QK58= Name: res/drawable-xhdpi-v4/ic_unlocked_white_24dp.png SHA1-Digest: DG1qDD1yBLURh568diw8VcVqVQo= Name: res/drawable-xxhdpi-v4/switch_thumb_holo_light_v2.9.png SHA1-Digest: U/4Z3gd25jwQChkbsD5VnRLBt4I= Name: res/drawable-xhdpi-v4/textfield_activated_holo_light.9.png SHA1-Digest: If3Wai5q4G/7HwWXms7HMa+ezus= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_350 SHA1-Digest: 1dsh1jmlpctbk3mLLs20rDvMeHw= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_352 SHA1-Digest: wG8Amf2IUehX/g5l0F2/BDWC8XM= Name: res/drawable-xhdpi-v4/ic_mood_grey600_24dp.png SHA1-Digest: 8QptmIlGZy7I1PKYMYOAZkDxgUE= Name: res/drawable-xxhdpi-v4/ic_emoji_places_normal_light.png SHA1-Digest: ubA1ifimUPU7FvNe9Y28BXF3CnQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_351 SHA1-Digest: Mms7D5naQaHUlKhoBn+xBnme4nc= Name: res/layout/conversation_list_item_action.xml SHA1-Digest: daYMlc9s7/cMUHhdCnx2cD09hyk= Name: res/drawable-xhdpi-v4/abc_text_select_handle_right_mtrl_dark.png SHA1-Digest: GuKSrhMJG9+hk/tPX2xPNfs4cy0= Name: res/layout/abc_list_menu_item_icon.xml SHA1-Digest: dYFR+O7lTgJC28aXyfVTftOMwDM= Name: res/drawable-hdpi-v4/sms_selection_icon.png SHA1-Digest: gE90TmnrTARplW4NtpJw2qVXyUk= Name: res/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000 .png SHA1-Digest: WvHioMVsEnLk1hJoq6dqHvhFfjA= Name: res/drawable-hdpi-v4/ic_group_grey600_24dp.png SHA1-Digest: sLpgDX3ee/IC25YhvXQob4uLC+g= Name: res/layout/calendar_date_picker_done_button.xml SHA1-Digest: bjM9GoPLqr2UNSSwFri6bBp8tqQ= Name: res/animator-v11/bottom_play_to_pause_animation.xml SHA1-Digest: Dk5obpJ/mFs1fbROjx3K+Ox8YD8= Name: res/drawable/ic_check_dark.xml SHA1-Digest: Euauk3jOzmS98uKm55WarBWhabo= Name: res/drawable-hdpi-v4/abc_text_select_handle_right_mtrl_dark.png SHA1-Digest: OW+ZULMA0miOKqqKj1wk15SSUFQ= Name: res/menu/log_submit.xml SHA1-Digest: 76Vnv4QcUVKXSl0gg59C0Rd9uoM= Name: res/menu/local_identity.xml SHA1-Digest: 1Igdxj3Es0r2GRwRynPPb8aRm1c= Name: res/drawable-mdpi-v4/abc_switch_track_mtrl_alpha.9.png SHA1-Digest: Goj79xYi41d5Ug2oovkSjYvLbAI= Name: res/layout/notification_action.xml SHA1-Digest: p77JXXmQEVckcqQPCcH8E9U7U3A= Name: res/drawable-xhdpi-v4/ic_badge_24dp.png SHA1-Digest: VTflLV+eXJF3SNTJBgsDTECh3AQ= Name: res/drawable-mdpi-v4/ic_emoji_nature_activated_dark.png SHA1-Digest: 4z8a9EycWLfIskhOsuaE8ly5eGo= Name: res/drawable/abc_tab_indicator_material.xml SHA1-Digest: V5veQwsCSGKsSBtGwB7BwIrrJ60= Name: res/drawable-hdpi-v4/ic_visibility_off_white_24dp.png SHA1-Digest: L2bADlHYbxejSKrQRh8xy6jOpm4= Name: res/drawable-xxhdpi-v4/abc_ic_star_half_black_16dp.png SHA1-Digest: EikVyBT5I7pmbJO2k8qF0V5hUc0= Name: res/drawable-xxhdpi-v4/ic_menu_lock_dark.png SHA1-Digest: HeM57qf+HkgH2w82F9rhzcFaSAI= Name: res/drawable-hdpi-v4/ic_message_black.png SHA1-Digest: 1w1ZbYb9IYNUxrU6KYFv/cpJMOE= Name: res/drawable-xhdpi-v4/sms_system_import_icon.png SHA1-Digest: ZxK90q7NEeyiA975EInN3SVAWdw= Name: res/color/text_color_secondary_dark_theme.xml SHA1-Digest: /pIH3XKbeThCFtR3AA7odk9oTC8= Name: res/drawable-mdpi-v4/ic_backspace_disabled_dark.png SHA1-Digest: QaXYwpDpZhB56I9vu5guCCaGaGs= Name: res/drawable-xxhdpi-v4/ic_lock_white_18dp.png SHA1-Digest: mt+MLl4ovdCkwj5ODFADROHfYXo= Name: res/drawable-mdpi-v4/abc_text_select_handle_right_mtrl_dark.png SHA1-Digest: 3J5pByYkZRz7TetQA7yaxvDvbrk= Name: res/layout/conversation_list_item_view.xml SHA1-Digest: 1Tpe43FDO1n6OSssoTLv6Rujchc= Name: META-INF/fdroidserverid SHA1-Digest: eArdeofjDLFxhFSbY0KAExcnRyQ= Name: res/drawable-xhdpi-v4/ic_group_grey600_24dp.png SHA1-Digest: cQ3e+0WiSITUilDzqhqCx/SmoJs= Name: res/drawable-mdpi-v4/list_selected_holo_light.9.png SHA1-Digest: w5jMjyx0n/lk3stiPGrcn7tdZT8= Name: res/drawable-xhdpi-v4/ic_refresh_white_24dp.png SHA1-Digest: VEEQILLOaC8KvtWmsJXu6AZz7q8= Name: res/layout/recurrencepicker.xml SHA1-Digest: cfNI4ZOUVd/QfbE5btsMAce/tHQ= Name: res/layout/radial_time_header_label.xml SHA1-Digest: 2IhYl35qRfn0aNwyv+P1GQUzF7w= Name: res/drawable-xxhdpi-v4/ic_group_grey600_24dp.png SHA1-Digest: Gzl3NBzq/iWJZdiC/zradMbSGYg= Name: res/drawable-v11/notification_bg_low.xml SHA1-Digest: n50NqNrh6NbUKmlGUwKW8waz9vU= Name: res/drawable-mdpi-v4/ic_emoji_emoticons_activated_dark.png SHA1-Digest: NA97YXwuQ1VQZ1b/kEGPfZhJnNc= Name: res/drawable-mdpi-v4/icon.png SHA1-Digest: xu2YVmS2ywmCB69j7trlUUEPuZA= Name: res/drawable-xxhdpi-v4/ic_missing_thumbnail_picture.png SHA1-Digest: y3Qmv2nY0uJc7MmuC5wwRdz220M= Name: res/layout-v17/notification_action_tombstone.xml SHA1-Digest: cOFSV5YQLr/BPiQJMZ3saC3Izp4= Name: res/drawable-mdpi-v4/ic_done_white_18dp.png SHA1-Digest: 2//esNudzLsyh9QlV4QqRHT6pZ0= Name: res/drawable-xhdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png SHA1-Digest: zLtLDGOiJ207WrTCsWah2jkG/84= Name: res/anim/abc_grow_fade_in_from_bottom.xml SHA1-Digest: iPapUKcPYcYoPV86U6jl9kw3Fqs= Name: res/drawable-mdpi-v4/abc_ic_star_black_16dp.png SHA1-Digest: h+GglN330bwjpagOTZFJ9KD8WhY= Name: res/drawable-mdpi-v4/ic_dialpad_white_24dp.png SHA1-Digest: ABD2pMqLWCZLuHxZaVMj35V4Bso= Name: res/drawable-xhdpi-v4/ic_emoji_nature_activated_dark.png SHA1-Digest: rwWlw8HY4PvcbCCcoxgW6kK04jw= Name: res/drawable-mdpi-v4/notification_bg_low_pressed.9.png SHA1-Digest: 58BeVrWmam0XTYtOcBJSh3YmiJQ= Name: res/layout/recurrencepicker_end_text.xml SHA1-Digest: TfPK46sRHEpgf8yaeWam2P7+6h8= Name: res/drawable-xxxhdpi-v4/abc_ic_star_half_black_16dp.png SHA1-Digest: zI176QlarHgsgLRcKJcYZrGV9ps= Name: res/drawable-xxhdpi-v4/ic_block_grey600_18dp.png SHA1-Digest: cPrydB8hKnVN+ija1M9dgeR/VoY= Name: res/layout/abc_action_menu_layout.xml SHA1-Digest: 9YbU6gGH268YUOBguR6iFw8Xklo= Name: res/layout/media_overview_item.xml SHA1-Digest: +vnGfFeH2gFoDqICFunaz6Nuzx0= Name: res/layout-v13/recipient_preference_activity.xml SHA1-Digest: yRYJX9Fp1liMV4/6SBZ9JlXTNX0= Name: res/drawable-mdpi-v4/ic_recurrence_bubble_disabled.png SHA1-Digest: lp9Fl1+WLFGu3BQ3x6KZ3rUqbKw= Name: res/drawable-hdpi-v4/ic_movie_creation_dark.png SHA1-Digest: w57zBCafgVTMCLb/6J4mA1eBIHY= Name: res/anim/animation_toggle_out.xml SHA1-Digest: lBabkCAcL5u2zNS3a/RsxhDIuzE= Name: res/drawable-v21/abc_ratingbar_small_material.xml SHA1-Digest: BADt3Ef1toHfWLOP4cHWQg7zFsc= Name: res/drawable-hdpi-v4/abc_popup_background_mtrl_mult.9.png SHA1-Digest: z7zwna5/785Ly8ahNPOE2jNcEWg= Name: res/drawable-hdpi-v4/ic_emoji_places_activated_dark.png SHA1-Digest: 6lNSCADnZXco1ErOluea0LkWr2c= Name: res/drawable-xhdpi-v4/ic_backspace_grey600_24dp.png SHA1-Digest: zT1tz927tsPpiZ4x9tnekYh1pYc= Name: res/drawable-mdpi-v4/icon_cached.png SHA1-Digest: E5s+IkWDT8zUJdhvw49Vecl69Ds= Name: res/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png SHA1-Digest: byuQvpWXS6brcdPpZzFwfkUGtWE= Name: res/drawable-mdpi-v4/divet_lower_right_light.png SHA1-Digest: dVHWgbpUqmiTu74KqlXFHHK/HiY= Name: res/layout/notification_template_icon_group.xml SHA1-Digest: uwaozoCL3Hme6S9S4jOXDpzdq5w= Name: res/drawable-xxhdpi-v4/ic_unarchive_white_36dp.png SHA1-Digest: IGZU+/25RvCbEyw7fg0ljVrRAGo= Name: res/layout/create_passphrase_activity.xml SHA1-Digest: 1LcmpE+4bLpJVyZvjo8vmyegEtM= Name: res/layout/calendar_date_picker_selected_date.xml SHA1-Digest: BQsSxFqCxOJIg6yNbdfBIoEO9uI= Name: res/drawable/emoji_category_emoticons_dark.xml SHA1-Digest: Ix5KZgvXSTgzlXU43c2s3+pyEsY= Name: res/drawable-xxhdpi-v4/ic_search_white_24dp.png SHA1-Digest: FpdxvD/qOPm+8mVzPLdARTjpK6E= Name: res/drawable-xxxhdpi-v4/abc_text_select_handle_right_mtrl_light. png SHA1-Digest: svcMy3RUKynkEHwirQYPCICt1tI= Name: res/menu/conversation.xml SHA1-Digest: iLLQmZkpzV1KPOCdUGYwEGWOpnk= Name: res/drawable-hdpi-v4/ic_block_white_18dp.png SHA1-Digest: QuLZSRSztDZXckzz4UjAZ5rRV1s= Name: assets/emoji_flags.png SHA1-Digest: fICcDebwlX2ZuBVzl4Qb4kBjJtY= Name: res/drawable/circle_tintable.xml SHA1-Digest: uZXojKWj3Mr3IJ9rWYmGx8Uw6MU= Name: res/color/abc_btn_colored_text_material.xml SHA1-Digest: uyiMqesjnkKMHVSzHpeGdcPuQsY= Name: res/drawable-xhdpi-v4/ic_attach_white_24dp.png SHA1-Digest: JZt8fzELfe2eKXi40Pwgyd2jyw0= Name: res/drawable/abc_dialog_material_background.xml SHA1-Digest: l0M3oq0dSvqXzuiDjFty5ess9ic= Name: res/layout/custom_default_preference_dialog.xml SHA1-Digest: 3GcmVR89CH5c8qh05Ffh7NhKcfA= Name: res/drawable-mdpi-v4/ic_recurrence_bubble_outline.png SHA1-Digest: TQHo0I5fwPvu3SHVqUMuPIOoJaw= Name: res/layout-v21/conversation_item_received.xml SHA1-Digest: HIRetGvvSXKU5XPgxhskNSeSec0= Name: res/drawable-hdpi-v4/ic_emoji_symbols_normal_dark.png SHA1-Digest: G7kt/oO/hbP2pNf53MmgtuqdnbU= Name: res/drawable-hdpi-v4/ic_emoji_people_activated_light.png SHA1-Digest: t2dfo2ThkYARtjZNn9u2G8CXjB8= Name: res/layout/keyboard_with_header.xml SHA1-Digest: hxtmz6yPxJZHDp12OqBDNqtvOgQ= Name: res/drawable-xxxhdpi-v4/ic_block_white_18dp.png SHA1-Digest: 5EQ7aIb3XyY8Fjd1cuQkMyizC4I= Name: res/layout/change_passphrase_activity.xml SHA1-Digest: rCMfYdVQ9alBHpaScTUx40IwdJs= Name: res/drawable-xhdpi-v4/ic_emoji_objects_activated_light.png SHA1-Digest: 5+04RXB3XrAbO7021edsyE6yG7c= Name: res/layout/abc_action_bar_up_container.xml SHA1-Digest: faAH+9KDnZnEFR0fhQDS7VrWa0Y= Name: res/drawable-xxxhdpi-v4/ic_done_white_18dp.png SHA1-Digest: 8l3TFPsQKj2hmP2YeXQ3KR+gtPk= Name: res/drawable-xhdpi-v4/ic_photo_library_white_24dp.png SHA1-Digest: 5RldmdTo6f301+oQTcpShGs46B8= Name: res/color-v11/abc_background_cache_hint_selector_material_dark.x ml SHA1-Digest: RvuWyz0R/TOa0YMWKY4Z70Jd7r8= Name: res/drawable-mdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: O6eAL2M6qoFDRV9peChQYqmfUZk= Name: res/layout/calendar_year_label_text_view.xml SHA1-Digest: jVFlcGuyELrjMDOA4bV8tm2kNjY= Name: res/drawable-hdpi-v4/ic_menu_remove_holo_light.png SHA1-Digest: vvGlhbwx81tjJ68TE7kzkB1mhAc= Name: res/drawable-xhdpi-v4/ic_delete_black.png SHA1-Digest: 4F1zJN0EKPv1Ry5Rd/xH0rjrmQg= Name: res/drawable-hdpi-v4/dialog_full_holo_light.9.png SHA1-Digest: dqmozINUKSEHguCyttZwEp1fsl4= Name: res/drawable-xxhdpi-v4/ic_group_white_24dp.png SHA1-Digest: /a21dJDB9S9FyDHs6Aab6hecJaQ= Name: res/drawable/contact_photo_background.xml SHA1-Digest: y2aQJR62snrVPJNn7N/Ve0pGy2s= Name: res/menu/conversation_unmuted.xml SHA1-Digest: JdmeZPjIQqeKw6uBcbpoVq8/Gfw= Name: res/layout/design_navigation_item_header.xml SHA1-Digest: lilaB0pjsqwfoOBP7mnR3p5X6wk= Name: res/layout/thumbnail_view.xml SHA1-Digest: Ww5lVhhSx0dnmTL+YYp3soukino= Name: res/drawable-hdpi-v4/switch_thumb_disabled_holo_light.9.png SHA1-Digest: HySzs67maedHt7T5DQ9b62NVMUw= Name: res/drawable/clickable_card_light.xml SHA1-Digest: w0Jeb3917xAK0dUQlFRtbSEwH8Y= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_358 SHA1-Digest: BdiB3G40E33JhpAaQnPmGM6npwk= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_359 SHA1-Digest: OH/iiqVq50dBV79hJSr2rKoXM5E= Name: res/drawable-mdpi-v4/ic_contact_picture.png SHA1-Digest: f/CWwAx2/XBNKaH/xWNCSue+JbI= Name: res/drawable-mdpi-v4/lockscreen_watermark_light.png SHA1-Digest: hEboIczR1JMpRKVdEHPAqTIePyU= Name: res/drawable-xxxhdpi-v4/ic_forum_grey_32dp.png SHA1-Digest: kIm/5xpfgahyfo9uwCOAUTXstM0= Name: res/drawable-mdpi-v4/ic_emoji_objects_activated_dark.png SHA1-Digest: 6OFeB8jbu9XKU8jzS1obcv1CdKE= Name: res/drawable-xxxhdpi-v4/ic_launch_white_24dp.png SHA1-Digest: LZ8InwIvmCpu4chxeQEyVYr7rh0= Name: res/layout-v11/notification_action_tombstone.xml SHA1-Digest: zEJGcu9yp2WqTtWRwec+99ylsWA= Name: res/drawable-mdpi-v4/abc_ic_star_half_black_48dp.png SHA1-Digest: YWbbt9prsOJPwsIvkwmEAQ9AjM4= Name: res/layout/audio_view.xml SHA1-Digest: JIotTJ/k2tG+pTcbuQsDdKpNgWo= Name: assets/emoji_faces.png SHA1-Digest: VF2bbkibGKhCNeUQxTwNIcjghSs= Name: res/animator/upper_pause_to_play_animation.xml SHA1-Digest: 7f8HiUwoTj84cBIvXQhtx6kFMlc= Name: res/drawable-mdpi-v4/ic_delete_gray.png SHA1-Digest: 7f4km9Jklsy/fJDbTkcRwb7F4d8= Name: res/drawable-mdpi-v4/ic_clear_search_holo_light.png SHA1-Digest: 2Zf0PoV8doaC2WrhNE5Z05fH2dE= Name: res/drawable-mdpi-v4/ic_menu_lock_dark.png SHA1-Digest: yfTUaOBEVS1ZrLoUEkV8pHxnHV0= Name: res/layout-v11/color_fragment.xml SHA1-Digest: 52Fed5if7X84XGUAMP7+410Btbs= Name: res/drawable-xxhdpi-v4/ic_emoji_objects_activated_light.png SHA1-Digest: c+SW5rP380Tm+zvHq6ImkjaP7DI= Name: res/drawable-xxhdpi-v4/ic_mood_white_24dp.png SHA1-Digest: riHY4u0a8Z6GyIgR2DKz3gEEGfo= Name: res/drawable-hdpi-v4/ic_pause_circle_fill_white_48dp.png SHA1-Digest: YazZkqaPuAeqe1lYuSzOsj1wqi0= Name: res/drawable-v21/notification_action_background.xml SHA1-Digest: OefACFLLoxfCUiCCPvZ9BpijWCk= Name: res/drawable-xxhdpi-v4/ic_advanced_gray.png SHA1-Digest: aSMd74QblsBULsnEaEbZnl3sAl8= Name: res/drawable-mdpi-v4/ic_send_white_24dp.png SHA1-Digest: +aWOvxd03eljhMg9fBIdSfNDoco= Name: res/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.p ng SHA1-Digest: I9s6aQ5VyOLrNo4odqSij549Oyo= Name: res/drawable-xhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png SHA1-Digest: MtrqRaF9hHgDajQUiUZsdukbh0o= Name: res/drawable/background_pattern_repeat.xml SHA1-Digest: oB3Wz023ADDvA6nID9pWNGXhWiU= Name: res/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_000.png SHA1-Digest: cjcTLuyFor2apZdbjPAaXPzqPvQ= Name: assets/emoji_places.png SHA1-Digest: 0Rb7g/OTs83cL8rMbtjEYfViINc= Name: res/drawable-ldrtl-xhdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: gHqcnosKJ3hj1qyF5PECFPe1Z9A= Name: res/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005. png SHA1-Digest: dOjymfO7tQPa8kQCGNculrdtmzM= Name: res/layout-v16/color_fragment.xml SHA1-Digest: Mzfzd3MJQefL1CEIwFbv6UhXR2I= Name: res/drawable-xxhdpi-v4/ic_dialpad_white_24dp.png SHA1-Digest: Su8I4l5yVy88Y7uvDfk/3fdIj50= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_373 SHA1-Digest: cSjMHtHIeYx8NPtkRndSSBuoZ98= Name: res/drawable-mdpi-v4/quick_shutter_button.png SHA1-Digest: lashP3NtpUje/lLH9xjgiqgMbNE= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_372 SHA1-Digest: JZwfMXoGUZqHYvczzIvFBYzPVG8= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_375 SHA1-Digest: 4gnH58JyJO9ZBj8MNMws2LGhIEM= Name: res/drawable-mdpi-v11/icon_notification.png SHA1-Digest: C47OjRxwbDRPciOXxk0JS2qRlcU= Name: res/drawable-mdpi-v4/ic_emoji_people_activated_dark.png SHA1-Digest: ZXnNJxuCfsVTzdXbqCkIOp+H4EM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_YT SHA1-Digest: Kp+a7sS3r8FClzW/weiHhsk/rbY= Name: res/layout-v17/notification_template_media.xml SHA1-Digest: DHZjW3pohCy/wdP2CCVV5iQTx9Q= Name: res/drawable/abc_ic_menu_overflow_material.xml SHA1-Digest: T3yM+Kxh9T09mLZHmQW9RPND7fg= Name: res/drawable-xhdpi-v4/switch_thumb_holo_light_v2.9.png SHA1-Digest: aHisXBhA4tSuq4zWW5w1PYjuGys= Name: res/layout/badge_widget.xml SHA1-Digest: QuNfx9GPL7dqOMYLuPkvHj6u/Lk= Name: res/menu/conversation_mms_group_options.xml SHA1-Digest: t6sm6riQ4OVOUt6/bYJMIBxocvk= Name: res/drawable-mdpi-v4/spinner_pressed_holo_light.9.png SHA1-Digest: MBDjTotrSL6afNoJE5Mq5I6WF4M= Name: res/layout-v17/contact_selection_list_item.xml SHA1-Digest: XvjB3fgrhO0ZYtrxPxky8sE2F8I= Name: res/drawable-xhdpi-v4/quick_shutter_button.png SHA1-Digest: fyDhU/mxYKJuUKZsVjAw2vtA7IQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_380 SHA1-Digest: ooR6xh/a/iu1b6CXk+RjF7LeHoc= Name: res/drawable-hdpi-v4/transfer_controls_background.9.png SHA1-Digest: Cngz5DtX5FWcrNq0lMnsLWpu6cM= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_381 SHA1-Digest: 2JnA+oMJ+vJKy4hQpTtSxQVpZ5Q= Name: res/drawable-xxhdpi-v4/ic_mood_grey600_24dp.png SHA1-Digest: afcx3F9gYbFkiyEh3lVPqd7Gmrs= Name: res/drawable-xxhdpi-v4/ic_visibility_white_24dp.png SHA1-Digest: aLHPy4IJ/AzCROczGi3BglAXQic= Name: res/drawable-hdpi-v4/list_selected_holo_dark.9.png SHA1-Digest: 8+a6kSVhZ1n87KOe3NWXssOoSRY= Name: res/drawable-mdpi-v4/ic_menu_search_holo_dark.png SHA1-Digest: i7rLOq1hLoqJGhp5uh7S6NwzrcA= Name: res/drawable-xxhdpi-v4/splash_logo.png SHA1-Digest: w3a+ReajC17z1G4L3eNiX796UCg= Name: res/layout-v17/conversation_item_received.xml SHA1-Digest: 9F+nQohquqINGLdm+7zyO0wjbhE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ZA SHA1-Digest: l6ayJ7+8XlOK32bR8BqXKOIluHU= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_385 SHA1-Digest: yPAb2zGtOtW4C/VTuGdD9hVTPww= Name: res/menu/conversation_secure_identity.xml SHA1-Digest: hlasr0H6TiEytX4pgdc5MpJS+50= Name: res/drawable-xhdpi-v4/telephone.png SHA1-Digest: bHI0GUIaPppn5oJV2WmCkAr5QmU= Name: res/drawable-xxxhdpi-v4/ic_send_secure_white_24dp.png SHA1-Digest: 2XgtAH/po7U80GR0olF3IISZvAc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ZW SHA1-Digest: TF8pDJ2t0ffaNHdUQUS53/viWRA= Name: res/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png SHA1-Digest: ++0JraYcPG1W6gax2v1T4h5rv9E= Name: res/drawable-mdpi-v4/abc_text_select_handle_right_mtrl_light.png SHA1-Digest: VzgmMujgGVTkhZBrXgJyrBpI1fs= Name: res/drawable-xhdpi-v4/ic_action_warning_red.png SHA1-Digest: RNqOcepa5uLUhaWV3eBeiLPKRTU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ZM SHA1-Digest: QQGauyCOvvzlJtOuY+cXkzdP8Yw= Name: res/drawable-xhdpi-v4/spinner_pressed_holo_light.9.png SHA1-Digest: ojrB5ql2Tg5clwEbaxKtvWw90HQ= Name: res/drawable-v21/abc_ratingbar_indicator_material.xml SHA1-Digest: V8JrLj4745FQ4gUvuKziXuLT2Ac= Name: res/drawable/abc_cab_background_internal_bg.xml SHA1-Digest: 9JWJR0qt9ACSmUHvHpdMc/ljSx0= Name: res/layout/conversation_item_pending.xml SHA1-Digest: PhcNt6JpsU2WepdAvkj0BVW1xM0= Name: res/drawable-mdpi-v4/ic_missing_thumbnail_picture.png SHA1-Digest: XWUfuVWZb4/kZPFc6854m1kepb4= Name: res/drawable-ldrtl-xxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: LRWlMCeV4/Lq+wNklDndVFmtRHU= Name: res/drawable-xxhdpi-v4/ic_info_outline_white_24dp.png SHA1-Digest: b18yrsun4qvibDp1NgsvoMZd39g= Name: res/layout-v13/select_dialog_multichoice_material.xml SHA1-Digest: pOhCB746ty+lvSY4W2hVCv7xArg= Name: res/drawable-hdpi-v4/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: SaBB1uVR+6oONKiYA0HTOmVsmqE= Name: res/drawable-mdpi-v4/sms_selection_icon.png SHA1-Digest: tfYAWDbYwC0di+Oqim+RMId5cek= Name: res/drawable-xhdpi-v4/ic_recurrence_bubble_outline_disabled.png SHA1-Digest: y4fEeZuG+Rke2Gz6Xhv2jOTGczY= Name: com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsPro to_855 SHA1-Digest: COUdI62w67El5HnnJocGdX/mrQU= Name: res/drawable-mdpi-v4/ic_emoji_objects_normal_dark.png SHA1-Digest: koydshN7yOfVp/2xsZpFIkAiRrc= Name: res/drawable-hdpi-v4/abc_tab_indicator_mtrl_alpha.9.png SHA1-Digest: NJuMq0n7Coq8s/ff6QHhDQhI9uw= Name: res/drawable-xxhdpi-v4/ic_call_white_24dp.png SHA1-Digest: YOBn0pvyMtJk0qZhrPVWznPKOe0= Name: res/drawable/abc_ic_clear_material.xml SHA1-Digest: gdOnugi6ZPBQShxkIF+3BjscX54= Name: res/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.pn g SHA1-Digest: NW/i+ex7+hXHYfPT2kBfhzB79kE= Name: res/layout/conversation_item_received.xml SHA1-Digest: L3CzF+IC1jm/vbprpktsIiUA27w= Name: res/drawable/abc_list_selector_background_transition_holo_dark.x ml SHA1-Digest: LVSNyw7X6tB9DukmioIVl33ZyuQ= Name: res/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000. png SHA1-Digest: pf8Tt2oAabuOsAiSswddcfLUQAQ= Name: res/drawable/clickable_card_dark.xml SHA1-Digest: +k8fRG9M83+fC5mmjI9+enyV0vA= Name: res/drawable-xxhdpi-v4/ic_emoji_recents_normal_dark.png SHA1-Digest: tL+tUpAwomQZH4cE4PfZgIMuigo= Name: res/drawable-anydpi-v21/design_ic_visibility_off.xml SHA1-Digest: /d9K4kz+PEEXzPkb7nC/4aBqj+0= Name: res/drawable-xhdpi-v4/ic_backspace_normal_light.png SHA1-Digest: uzi80CgbHBu5pNzYbVF2Yy2NQiw= Name: res/drawable-xxxhdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: 99GkU44EvefOaxLCiFW5KAUEIJQ= Name: res/drawable-hdpi-v4/abc_scrubber_control_off_mtrl_alpha.png SHA1-Digest: cjG9sTPDRm4+Q3YgeyRUYPgo2LM= Name: res/drawable-hdpi-v4/ic_textsms_black_32dp.png SHA1-Digest: Azw/NnDiG1+fCiaocBZW4qc2hKw= Name: res/drawable/import_export_item_background_dark.xml SHA1-Digest: Cay1NfYIeYp7e4fwT/HL7+Ka+NU= Name: res/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png SHA1-Digest: uWfk23bm97GtczH2YvAwWP/eNOE= Name: res/drawable-xxxhdpi-v4/ic_send_white_24dp.png SHA1-Digest: EIqLEtxB45GlXiB7jImBE260cHI= Name: res/drawable-hdpi-v4/abc_text_select_handle_left_mtrl_light.png SHA1-Digest: xikdq0MUk/db6+MwsR0wYysb7nE= Name: res/drawable-mdpi-v4/ic_visibility_grey600_24dp.png SHA1-Digest: hCJedNfkCuKLGOyHO4Dmtsk235M= Name: res/drawable-xhdpi-v4/ic_movie_creation_dark.png SHA1-Digest: 0OuGMfK+YEHtaZWw+g+kojXzvZM= Name: res/drawable-sw600dp-xhdpi-v13/ic_backspace_normal_light.png SHA1-Digest: ljntDXrk8zdMFNNY6H71toto4Cg= Name: res/drawable-xxxhdpi-v4/abc_ic_star_black_36dp.png SHA1-Digest: BlslH4QYPV8tPkeyq5iFkcDXUkc= Name: res/drawable-hdpi-v4/ic_emoji_emoticons_activated_dark.png SHA1-Digest: S8Z29WUxXMQ/hrf4fBNB7XWvARY= Name: res/drawable-hdpi-v4/switch_thumb_activated_holo_light.9.png SHA1-Digest: Wh0P8RRSA74oEeBgIjQxEpqcoME= Name: res/drawable-xhdpi-v4/ic_content_copy_light.png SHA1-Digest: gyvhu9zNWykWn0gkokBr2GaJATM= Name: res/menu/conversation_muted.xml SHA1-Digest: cdhiUY6M1BWIDI4/XMRhrZeh2eM= Name: res/layout/country_list_item.xml SHA1-Digest: r1mS7yS/DEnkOyfbMBd3mCVpbQU= Name: res/drawable-hdpi-v4/quick_shutter_button.png SHA1-Digest: 4loawsvoafAyt18yxIOpJkDMH70= Name: res/layout/calendar_date_picker_view_animator.xml SHA1-Digest: JlyCO6wz82o9FYeSpqf9w4/LFZo= Name: res/color/done_text_color_dark.xml SHA1-Digest: khODeLf1rSyXidJV3VHbWGh5Oa8= Name: res/anim/fade_scale_in.xml SHA1-Digest: 7e1v5wyirlR6VHusnyFJ2Hy9Soc= Name: res/layout/three_keys_view_leftright.xml SHA1-Digest: RHH5G6B76hUH7H2XjfBVAiAQsTc= Name: res/drawable-hdpi-v4/notification_bg_low_pressed.9.png SHA1-Digest: NP77wvGcwseigxPz8Z8jideVqXk= Name: res/drawable-hdpi-v4/ic_menu_search_holo_light.png SHA1-Digest: GPxu6w91ETl7Kn08EcY0xbKASd8= Name: res/drawable-hdpi-v4/ic_recurrence_bubble_disabled.png SHA1-Digest: PvUD72ClUaAbmozquBpu1pFkyKY= Name: res/layout/design_bottom_sheet_dialog.xml SHA1-Digest: 71oSkVwEAnepDUSmUMPhds/udqo= Name: res/drawable-xxhdpi-v4/ic_emoji_people_normal_dark.png SHA1-Digest: ud+ge15QS8J3W/STrJS85uBs238= Name: res/drawable-xhdpi-v4/ic_photo_camera_light.png SHA1-Digest: 3+ywo30zk8+MdtiZWpzpq+/7BlY= Name: res/drawable-hdpi-v4/ic_photo_library_white_24dp.png SHA1-Digest: 2i75RHTCQxalHyQuCxhbTGvXLDw= Name: res/layout/abc_action_mode_close_item_material.xml SHA1-Digest: p7Z8mhfVBf1Nhg3/qKSX0VslAmM= Name: res/drawable-xhdpi-v4/ic_content_copy_dark.png SHA1-Digest: iK0hdpe6j6iVLceTUcEAKZ+VojQ= Name: res/drawable-xxhdpi-v4/ic_info_outline_dark.png SHA1-Digest: cV1OJ4EtckNtIGY2CVNr6ShaILE= Name: res/layout/design_layout_tab_icon.xml SHA1-Digest: 1oW2wUEHsS3deIrUBKUEwpNALgo= Name: res/drawable-hdpi-v4/spinner_pressed_holo_light.9.png SHA1-Digest: 2AU1b4tODlUJW7aRFT0bcz4flrA= Name: res/drawable/item_background_holo_light.xml SHA1-Digest: c+jqjsOOYhi5ab58opAJtJuW/2o= Name: res/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png SHA1-Digest: e//ti7f9UjoZyXMyT5IRTahD3PQ= Name: res/layout-v11/notification_template_big_media_narrow_custom.xml SHA1-Digest: 28bYnRdxyh92WbNXnWMZDlFrmx0= Name: res/drawable-xhdpi-v4/ic_backspace_disabled_dark.png SHA1-Digest: zKT/1vK3dByF8W/4TqDRB3P//8o= Name: res/drawable-v21/abc_btn_colored_material.xml SHA1-Digest: D6vZuC+PxnPYmIv2/fsVSWVSDeg= Name: res/drawable-v21/avd_hide_password_1.xml SHA1-Digest: f3wodn8CvdpkUqG9L8W7iM98UWo= Name: res/drawable-xxxhdpi-v4/ic_download_circle_fill_white_48dp.png SHA1-Digest: rdZLJPyOK70xd0ScLhFw8jUd25g= Name: res/drawable-v11/notification_bg.xml SHA1-Digest: sRRnQQd2J5pxUzHVH2hGZOMRE5A= Name: res/layout/notification_template_lines_media.xml SHA1-Digest: gRpGoh3JvVU0naZoFivIKT1wjAU= Name: res/drawable-ldrtl-xhdpi-v4/ic_send_white_24dp.png SHA1-Digest: N3tmZFpLNkuV5PXMXlfNnUZNkik= Name: res/drawable-anydpi-v21/design_ic_visibility.xml SHA1-Digest: LQ29SOIozRk3sm4Wm8ahc0DtkB4= Name: res/drawable-mdpi-v4/ic_refresh_white_24dp.png SHA1-Digest: rq3d2FDk0wb2yFvjHMPb08OL0HQ= Name: res/drawable-mdpi-v4/abc_textfield_default_mtrl_alpha.9.png SHA1-Digest: 6BStYFTiYO5hj6qjB+1tC6u+FNA= Name: res/menu/conversation_callable.xml SHA1-Digest: yODyzMLTh3FhGB8ZM9fxrUuGU9Y= Name: res/drawable/abc_btn_radio_material.xml SHA1-Digest: UTYOeeEsntRapgE5ZWUWf1IlU/I= Name: res/drawable-hdpi-v4/ic_advanced_black.png SHA1-Digest: j0WvmKWY/IQyHO+fKg/eax4naCQ= Name: res/drawable-v11/emoji_category_people_light.xml SHA1-Digest: 2IpjsMfArkEhNams3V6tq7qnmLU= Name: res/drawable-mdpi-v4/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: AfbQuyZF1JMvjiaXDfLvtNLgncI= Name: res/drawable-hdpi-v4/ic_emoji_people_normal_dark.png SHA1-Digest: L5cmEyWgTeqNNbrpoey2AHBT7gU= Name: res/drawable-xxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png SHA1-Digest: K3ucg8inS6QEpdWRjFnNMV6IIbo= Name: res/layout/keyboard_text_with_header.xml SHA1-Digest: IzS7yKtIO1r409DMFOLheoDoNwY= Name: res/layout/transfer_controls_stub.xml SHA1-Digest: Y7StVJ+2zbCAJ57fSpB7K1nvlzk= Name: res/drawable-xxxhdpi-v4/ic_keyboard_white_24dp.png SHA1-Digest: nJgko2VrulT3uc6mPIRZ1gcYKBA= Name: res/drawable-hdpi-v4/ic_emoji_nature_normal_light.png SHA1-Digest: SnOUa2cZaSzg4+9iObM4wTWeqRU= Name: res/drawable-hdpi-v4/ic_backspace_normal_light.png SHA1-Digest: Gw6S97FzS2pjaWtj1/7b8jgyiM0= Name: res/layout/calendar_date_picker_header_view.xml SHA1-Digest: ZJHpWJQx3nOrifwxdWwhnWt9Ij4= Name: res/drawable-mdpi-v4/design_ic_visibility.png SHA1-Digest: ry2f6USvgI8F8oiXlmsF+qG2Ofk= Name: res/drawable-xhdpi-v4/abc_ic_star_black_36dp.png SHA1-Digest: lP85nXzNzaRJULgljjBQBBKL824= Name: res/drawable-xxhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png SHA1-Digest: QqPpbBwEr9nywoEL/OHp+2+gZ1Q= Name: res/drawable-xhdpi-v4/ic_message_white.png SHA1-Digest: pmfbHY8jJwXAiyCXXeZENrtUfJ0= Name: res/drawable-mdpi-v4/abc_scrubber_control_off_mtrl_alpha.png SHA1-Digest: u6bTvtbDXJXOGa13pLv0kzefZXk= Name: res/drawable-xxhdpi-v4/ic_account_box_dark.png SHA1-Digest: Kde5Ka6vP/QX330y0tfeQ03NFt0= Name: res/drawable-sw600dp-hdpi-v13/ic_backspace_normal_light.png SHA1-Digest: VYqIHgFSG25nuyuYWkjuz086rAw= Name: res/drawable-hdpi-v4/divet_lower_right_dark.png SHA1-Digest: cZK8LP3p9zh+vJsrBfv9xEyglgw= Name: res/layout-v16/centered_app_title.xml SHA1-Digest: QU4uUM9N05Qv1r0QRRaNM3vjjWU= Name: res/menu/conversation_insecure_no_push.xml SHA1-Digest: 2v+W6/w1hci1AkfI3IWmRdpczU4= Name: res/drawable-mdpi-v4/ic_delivery_delivered_dark.png SHA1-Digest: iTc9UFAP+v74rV9lqo0ckhej3xo= Name: res/drawable-mdpi-v4/ic_scroll_down.png SHA1-Digest: z4wu0jUNEFIQtWx0fjaU2W/FdgM= Name: res/drawable/abc_item_background_holo_light.xml SHA1-Digest: fDShwzepkR49aya4UNh+v22s1Nw= Name: res/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png SHA1-Digest: hOoziuoJ3C2IMcfDzYzmL7E6Tm8= Name: res/color-v23/design_tint_password_toggle.xml SHA1-Digest: uKmyWahGcwpgv98l1DYuTUPcE0M= Name: res/drawable-xhdpi-v4/ic_keyboard_grey600_24dp.png SHA1-Digest: ExaemJusROzkcV16BfxxQ5RVADk= Name: res/animator/rotate_minus_90_animation.xml SHA1-Digest: AhVLtjcJdoeXGcim/ix1HCO/gQw= Name: res/drawable-hdpi-v4/ic_image_dark.png SHA1-Digest: 5CpgtH7z5pmAtDFcDQAdEoVRSyI= Name: res/layout/abc_popup_menu_header_item_layout.xml SHA1-Digest: hQmvMCh5RfHl7zd1OpMuh0PLPGw= Name: res/drawable-xhdpi-v4/textfield_disabled_focused_holo_light.9.pn g SHA1-Digest: OzQ1tHx9DB5q6GA0ZRNG3prDizY= Name: res/layout/database_migration_activity.xml SHA1-Digest: lRl5r5FgpGGR0IYNF63kp434o5E= Name: res/drawable-xxhdpi-v4/ic_pause_circle_fill_white_48dp.png SHA1-Digest: zwSDGmPznTm/cIpMuWFcFyy3AoQ= Name: res/drawable-xxhdpi-v4/ic_volume_up_light.png SHA1-Digest: csRV9qrs9LdlC+blM4qWJ/bZ084= Name: res/drawable-xxhdpi-v4/ic_circle_fill_white_48dp.png SHA1-Digest: RkP1QTEHdPEXQRxbqaja1mtzzfM= Name: res/layout-v17/conversation_item_sent.xml SHA1-Digest: vcK4YtVfMAI3ZnJzNASPYGpg+NU= Name: res/drawable/conversation_item_sent_indicator_text_shape.xml SHA1-Digest: 0anovoc7dnbKH7CwxXSarY9R77I= Name: res/drawable-xxhdpi-v11/icon_cached.png SHA1-Digest: 7gqMY0mppZ95zVJqs1O7QkspoKU= Name: res/drawable-xxhdpi-v4/ic_emoji_nature_normal_dark.png SHA1-Digest: oYt3fnDKVOOon6ufg4D6JLWXRVE= Name: res/layout/video_player.xml SHA1-Digest: ZDQfiwr4ntdWq3CAZLvCBrn9kJk= Name: res/drawable-mdpi-v4/ic_backspace_normal_light.png SHA1-Digest: f/vIuRIwVMzSZ0MELZ9If7z5iRo= Name: res/drawable-xhdpi-v4/icon_dialog.png SHA1-Digest: Yh+Y8O4R0FtgT/ZHK8Z9fXjGjt4= Name: res/drawable-hdpi-v4/ic_search_holo_light.png SHA1-Digest: CXK4K35HwsRQt7CQWNgpJgEtiVQ= Name: res/drawable-xxxhdpi-v4/icon_cached.png SHA1-Digest: gYE4PCg53nmPm3HpKbU9KPsaZ/c= Name: res/color/recurrence_spinner_text_color.xml SHA1-Digest: ARJUNp1b2gsqcrhQnVBfZl0+Ju4= Name: res/drawable-hdpi-v4/ic_brightness_6_gray.png SHA1-Digest: mZV2cXTOBFqBXlRculNmSCO/nEE= Name: res/anim/design_bottom_sheet_slide_out.xml SHA1-Digest: b7nLwVuguqkRn/0QJ5T+s+s304Y= Name: res/drawable-hdpi-v4/ic_advanced_gray.png SHA1-Digest: C9XzOo5OgF7UgKYvkW5+yfpLFFg= Name: res/drawable/abc_ratingbar_material.xml SHA1-Digest: eEVopjQX6W514WoHxn9rLKQ1T5Y= Name: res/layout-v21/abc_screen_toolbar.xml SHA1-Digest: RcV/ssluMcZyxZ3e3qgYkW/4t8g= Name: res/drawable-xxxhdpi-v4/ic_photo_camera_dark.png SHA1-Digest: GL3a0e1lkDupBd8bZCOrdky8mkI= Name: res/layout/date_picker_dialog.xml SHA1-Digest: kf9jozXy8TB5Ir5lhzUk0k3zc68= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_979 SHA1-Digest: E3E+5deRAaxq0tS5UKPX42zboOQ= Name: res/drawable/white_radius.xml SHA1-Digest: vJ/dDcwo+MQQr8+spnN4wPHrpBk= Name: res/drawable/abc_item_background_holo_dark.xml SHA1-Digest: EYfXWBiFkD5pE+x4VQkg8UKkBDw= Name: res/drawable-hdpi-v4/sms_system_import_icon.png SHA1-Digest: vQnKq6EGrPMsiJdaJNh1oIOVDbM= Name: res/drawable-hdpi-v4/ic_push_black.png SHA1-Digest: 3hCWsO5iMnvthvKOo/Zm96bBr6o= Name: res/drawable-hdpi-v4/ic_emoji_flags_normal_light.png SHA1-Digest: TDH6Q0QaGikzI8z9SSXhPTBi1Hs= Name: res/drawable-xxhdpi-v4/ic_done_white_18dp.png SHA1-Digest: j3GOdthjoRoNdPhM7w8dsgHjE6c= Name: res/drawable-xhdpi-v4/abc_list_longpressed_holo.9.png SHA1-Digest: C4a5xmVEzcIJxede0Urh0qZwCmg= Name: res/drawable-xhdpi-v4/ic_textsms_black_32dp.png SHA1-Digest: ismobvzTPdV6vsV7EGHyff/PrCo= Name: res/layout-v17/abc_select_dialog_material.xml SHA1-Digest: 5AKNRDRSJeVR3cn3G2cxceFTohA= Name: res/drawable-xxhdpi-v4/ic_send_white_24dp.png SHA1-Digest: /cN5XZc/UmW6olmT4asAzS7+HCU= Name: res/drawable-xhdpi-v4/ic_push_registration_reminder.png SHA1-Digest: 0v5auK5BRQPgV95hW+jycIiPx90= Name: res/layout/conversation_activity_emojidrawer_stub.xml SHA1-Digest: C7rRCyzp/GaaBT0HAenRiFKOMGw= Name: res/drawable-xhdpi-v4/ic_add_white_24dp.png SHA1-Digest: lceszf3MMMnKuCFVNxrT7fq1spQ= Name: res/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_015.png SHA1-Digest: 6wmuQsGop94sACxKfh+EBLCBjJk= Name: res/drawable-xhdpi-v4/ic_clear_white_24dp.png SHA1-Digest: wAjFdCV0d9G4jJxdA+JoxAcg0BU= Name: res/drawable-xxxhdpi-v4/ic_photo_library_white_24dp.png SHA1-Digest: b9kOM5Oe6AYJoOZLUwdzoqGLYGk= Name: res/drawable-xhdpi-v4/abc_ic_star_half_black_16dp.png SHA1-Digest: OBELUky/hMRu50hd+fRgMPXT3ZE= Name: res/drawable-xhdpi-v4/notification_bg_normal.9.png SHA1-Digest: URz3Lz/tIjMAtXfNHimWcDQLTtQ= Name: res/drawable-xhdpi-v4/ic_check_normal_light.png SHA1-Digest: /a8tMklC0x/6BC7aK302NKgRm4M= Name: res/drawable-mdpi-v4/ic_archive_white_24dp.png SHA1-Digest: FOgV73Y4E4G9tSQRswWo6d25m20= Name: res/layout/psts_tab.xml SHA1-Digest: ut5zIC2Qke40czbjy2bU3/eq8ck= Name: res/drawable-hdpi-v4/ic_audio_dark.png SHA1-Digest: f6Rzu7MWG7Vifj9C9GNnSY5Dwc4= Name: res/drawable-mdpi-v4/ic_emoji_flags_activated_light.png SHA1-Digest: Sj0prdaB7XusQnjD6qzLYyu2QJk= Name: res/layout-v11/conversation_fragment.xml SHA1-Digest: DETVRgIT8hjcWuLmGreCXRbxsaI= Name: res/drawable-hdpi-v4/ic_app_protection_black.png SHA1-Digest: FeElOKTrm6ulL0IKibHFpLwtmsI= Name: res/drawable-hdpi-v4/ic_select_all_white_24dp.png SHA1-Digest: d3NyUt7zbRSBabWVugl1zyezxss= Name: res/drawable-xxhdpi-v4/ic_photo_library_white_24dp.png SHA1-Digest: XeWgItT/2YbqFUIPlA1XN4QyW+I= Name: res/drawable-mdpi-v4/ic_recurrence_bubble_fill.png SHA1-Digest: w1sX/nC9GYX9TAF4H3snP6yRXj0= Name: res/layout/conversation_item_last_seen.xml SHA1-Digest: Ud6D9VpTZ59BZFWRquIaLsnz0D8= Name: res/drawable-xxhdpi-v4/ic_advanced_black.png SHA1-Digest: JkA/GcL3vD+TSlGZkxf/D9Sm0mY= Name: res/layout/contact_selection_recyclerview_header.xml SHA1-Digest: nA+tCTWyXEXLRp0lp0EY09gGbDc= Name: res/drawable-xxhdpi-v4/ic_recurrence_bubble_fill.png SHA1-Digest: oo/O+veI0wHux5c+1XJNoX0f8NQ= Name: res/drawable-xhdpi-v4/ic_emoji_symbols_activated_dark.png SHA1-Digest: N8kyiU9nC4ZzneSpOUFCNlkqQwY= Name: res/drawable-hdpi-v4/icon_lock.png SHA1-Digest: I8WB2hjjIronAb2gOV1ntPWGdaA= Name: res/menu/conversation_insecure.xml SHA1-Digest: PZm4tXSwpFBpAlY2H1eP9h7sqYI= Name: res/drawable-mdpi-v4/abc_list_longpressed_holo.9.png SHA1-Digest: GFCjouEOsx2zwJ4qrfooYQ63590= Name: res/layout/three_keys_view.xml SHA1-Digest: FoZ7Mjpza1xFL31pZL/tG3LwRfo= Name: res/layout/time_picker_view.xml SHA1-Digest: E4bx99VtN4hLn81lvzqhGD6cGTE= Name: res/drawable-xhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png SHA1-Digest: aGoDqShCvfRBOcYadujzbODhe1U= Name: res/drawable-xxhdpi-v4/abc_popup_background_mtrl_mult.9.png SHA1-Digest: qQpaYoGWL908h/WoyV81hrJSp9E= Name: res/drawable-xxxhdpi-v4/design_ic_visibility.png SHA1-Digest: swt1xCeUHWXTPK1wZL3z/KjE6j8= Name: res/drawable-hdpi-v4/ic_delivery_delivered_dark.png SHA1-Digest: z1qP/XuEMgqH6PCTku4wlQfck1o= Name: res/drawable-xxhdpi-v4/ic_call_split_white_24dp.png SHA1-Digest: EqpL7q/kUISc05zCS8PQE7XlTCo= Name: res/color/abc_secondary_text_material_light.xml SHA1-Digest: UK67RbNJcciw6ZIvqgR+d1ZzWSE= Name: res/drawable-hdpi-v4/ic_emoji_people_activated_dark.png SHA1-Digest: MN/3tZSXfYwUNJd1fpv81P9hsis= Name: classes.dex SHA1-Digest: O3iS5F8Y4yienw64NT3rCkhJlBE= Name: res/layout/abc_screen_content_include.xml SHA1-Digest: 5b3DomolwZfchrtJxjtLR+9TEkg= Name: res/drawable-hdpi-v4/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: HDJoTnQuLh9V9/4kv+/UeX7wGTY= Name: res/drawable-hdpi-v4/switch_bg_focused_holo_light.9.png SHA1-Digest: x7N6bd7BQ9gunVUj5pyMTy+B3f0= Name: res/drawable-xhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png SHA1-Digest: RnQxBqnfZP2w/UH+bBFTojv2UoA= Name: res/color/abc_hint_foreground_material_light.xml SHA1-Digest: 0zpZ3hXSy13vsrByQvEajGH48kg= Name: res/drawable/switch_thumb.xml SHA1-Digest: lH/mX04uaklEXuqyPbIGAmagtiY= Name: res/drawable-mdpi-v4/abc_list_focused_holo.9.png SHA1-Digest: jJIIxBXFlVwxMesuJlFFhjvLhPM= Name: res/drawable-mdpi-v4/ic_audio_dark.png SHA1-Digest: 80UU4YPrTC24AwJ3eKxpXejAlm0= Name: res/layout/conversation_item_pending_v11.xml SHA1-Digest: ZclvwAPtCg7EQ50Xmb/TCW2DbFg= Name: res/drawable-hdpi-v4/ic_unarchive_white_36dp.png SHA1-Digest: DpzTK5IV9VJGnBL1GQNQdw5E2wA= Name: res/drawable-xxhdpi-v4/ic_photo_camera_light.png SHA1-Digest: TzSNJVWVL3UER7oGqP6Nrb06ic0= Name: res/drawable/done_background_color_dark.xml SHA1-Digest: BQ2YGX7F12dg30GOBpoPMqnBg/w= Name: res/drawable/abc_ic_go_search_api_material.xml SHA1-Digest: 4TOQZYsZfAWYiCOnhZ922D5jaV0= Name: res/drawable-xhdpi-v4/abc_textfield_default_mtrl_alpha.9.png SHA1-Digest: L12XNgC05BSQghB6JCrs8Us9eEo= Name: res/drawable-xxxhdpi-v4/ic_badge_24dp.png SHA1-Digest: /UKTs8syiI+8teKE7JTtgCF7EOA= Name: res/color/switch_thumb_material_light.xml SHA1-Digest: 70Ris1bjtMLy8qA7qzUjHvcpAIM= Name: res/drawable-xxhdpi-v4/ic_push_black.png SHA1-Digest: ygKohbyfFVJgNYP5BVx3Xgx+JGE= Name: res/animator-v11/rotate_minus_90_animation.xml SHA1-Digest: dAr9tiloBMntrmMmfeQ1JW7RJVM= Name: res/drawable-ldrtl-hdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: 3f2Gmy7pGZPASiGf+ZPR/zDMdpY= Name: res/color/dialog_text_color_holo_light.xml SHA1-Digest: ieRybNvbHRyOkglFiMNjqxmgnYM= Name: res/drawable-xxhdpi-v4/icon_dialog.png SHA1-Digest: QhfVY7UBQilNAfrHJXWil0t74RI= Name: res/drawable-xhdpi-v4/ic_menu_lock_dark.png SHA1-Digest: M1g3b4KBhEjHrG1iEhJorzie18A= Name: res/drawable-hdpi-v4/ic_save_white_24dp.png SHA1-Digest: b0MOY6ocByL+BiDj8t/xAuWDXR8= Name: res/drawable-mdpi-v4/ic_check_white_24dp.png SHA1-Digest: 9BpaEBpmmi2X4RbVVZyZWtKre84= Name: res/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_015.png SHA1-Digest: Ub7EVU/MNH+VSjP7k8FYzKJQoQ4= Name: res/drawable-hdpi-v4/abc_text_select_handle_left_mtrl_dark.png SHA1-Digest: Vgi5sEfMVSyu0nd6WWsvBST1nxk= Name: res/drawable-xxhdpi-v4/switch_bg_disabled_holo_light.9.png SHA1-Digest: sPU97/CASp/g7EwfcegGeM9Y8xU= Name: res/drawable/pause_icon.xml SHA1-Digest: OW/HliDYn2yZlppVP1IZ8r4AXXU= Name: res/drawable-hdpi-v4/ic_keyboard_grey600_24dp.png SHA1-Digest: 3+L8uB4iXUHcTlCl0935iz7cQ4M= Name: res/drawable-hdpi-v4/textfield_focused_holo_light.9.png SHA1-Digest: NfEGOtZ0YkueMDHG9onUNJVuHAM= Name: res/drawable-xxhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png SHA1-Digest: 07+MMsIKk8a3BObx9eEkeKwYSSk= Name: res/drawable/recycler_view_fast_scroller_handle.xml SHA1-Digest: lId/oCzHC4v97KJfaSwHpjh8Vk0= Name: res/drawable-hdpi-v4/ic_movie_creation_light.png SHA1-Digest: P5qoF4VsoxJa2WoiilxTRUxdbog= Name: res/drawable-hdpi-v4/switch_bg_holo_light.9.png SHA1-Digest: CpRZZ1GTLscTpuMbiso8PfUMFTA= Name: res/drawable-v11/emoji_category_flags_light.xml SHA1-Digest: 1HXt+SFCsg1FOzvewAlnVfcPlH4= Name: res/drawable-hdpi-v4/ic_emoji_people_normal_light.png SHA1-Digest: +AYFjg+xkMjZNzI3+A94/vqhwIU= Name: res/drawable-xxhdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png SHA1-Digest: n8TfpaUDWC1ZG/DnCL+kvaeXf08= Name: res/drawable-xhdpi-v4/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: jUXes5sBIdjAuvOfVrnJvHW7r+w= Name: res/drawable-xxhdpi-v4/abc_text_select_handle_right_mtrl_dark.pn g SHA1-Digest: NlLE4WLe09sFAjGcYGx9OeUuyzA= Name: res/drawable-xhdpi-v4/ic_notifications_gray.png SHA1-Digest: yG4IA2zOn2IpgU4LIHOixHbx7uY= Name: res/drawable-hdpi-v4/telephone.png SHA1-Digest: 9nlQS7d+VbUPkr+prirBG+O+A+0= Name: res/layout/number_picker_dialog.xml SHA1-Digest: JoItrFpfK/Jc5Yu89HO7z7riXCc= Name: res/layout/country_selection_fragment.xml SHA1-Digest: 9FP5VBphB5dDjtyb6LGAejYRDDk= Name: res/drawable-mdpi-v4/ic_emoji_symbols_normal_light.png SHA1-Digest: qGIjjOJCf3co0MQfgPXcTido4p4= Name: res/drawable-hdpi-v4/ic_visibility_white_24dp.png SHA1-Digest: AHCpu+6ehOjBI4qi24Mr2j/RW1Y= Name: res/drawable-v21/avd_show_password.xml SHA1-Digest: gmgwezio0n1pD9PKq4pn6tN1Jc4= Name: res/drawable-xxhdpi-v4/spinner_disabled_holo_light.9.png SHA1-Digest: d0C8Ku1iXl9QUHg5si64yzLBZ8c= Name: res/drawable/abc_vector_test.xml SHA1-Digest: 4yJGw44hdFgotEL2tng9U1c82Mw= Name: lib/armeabi-v7a/libcurve25519.so SHA1-Digest: 63TQYdkvchMVuxrOy/mctpYth0A= Name: res/menu/conversation_add_to_contacts.xml SHA1-Digest: e3y0WihLiI7Skf9UpjQDJZj2lZ4= Name: res/drawable-sw600dp-hdpi-v13/ic_backspace_disabled_dark.png SHA1-Digest: RXmFGZr/Q0yvb7b872P8mGxd43Y= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LK SHA1-Digest: ied04vDsq12FV0JH3mOjzh309vk= Name: res/drawable-mdpi-v4/ic_visibility_white_24dp.png SHA1-Digest: RQFCLSBs6hvQvM1NMUC9GGfo9D0= Name: res/anim/design_snackbar_out.xml SHA1-Digest: tSHapqXFI6k7SCynouBmerWDWcs= Name: res/drawable-mdpi-v4/notification_bg_low_normal.9.png SHA1-Digest: sUXBSDmIwrVhXMAYtsmpMAdZsVM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ER SHA1-Digest: gHVjUaO/Hu0WmrCse/bbzvHA5ls= Name: res/drawable-xhdpi-v4/ic_search_holo_light.png SHA1-Digest: 5cIoGeIb35m+WD6Ibj+Q/8h7Wcg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ET SHA1-Digest: wy3NWeNxy5SjTEkOTlENuldOG5A= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ES SHA1-Digest: dcfBeFVvtf1Npmm17B+8Uvjkosw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LS SHA1-Digest: ElIWf9hGKw6kJuiTwqiTZ3kksQ0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR SHA1-Digest: q3eGR1wYR2wXCuY2G8YztxC4jn8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EE SHA1-Digest: EOshv+VduBq+yJISeM1Hk888RLQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LU SHA1-Digest: 2u7acAapHAVN0vRyrGF4xeNh09k= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EH SHA1-Digest: ZuoOUkuf9kckH6tgBjNF4A/j8fo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LT SHA1-Digest: qzz+sgWLOJ7dDgsBjovl+5j2riw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EG SHA1-Digest: gItwjACHBejWkN4G3O36fFVyl4M= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LV SHA1-Digest: eoVKgGuYjS2A1PhEji8Z9sOrgbU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LY SHA1-Digest: f3DxjbiutCyQ2NsG/LTLXF1yGdQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA SHA1-Digest: dPX2NQ3g/UvM8mPBxbNZcNCpLFw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EC SHA1-Digest: 48aNA4uEKv1hZhtpAC+tlbTQXl0= Name: res/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_015.png SHA1-Digest: IKtTqnzlIY7DpFmknZLDUcK+O3s= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MC SHA1-Digest: B9gwrf7Nj6F+sls86I8wqQvtUMc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD SHA1-Digest: XRSvQ5ItZQ5tjpcthn2rmzBWZH4= Name: res/layout/notification_template_part_time.xml SHA1-Digest: W/kytmaWkF2VPENQ086DWVdFzxY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ME SHA1-Digest: RUPlibrsFUwsw2sk0+RS7N/VRqU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MF SHA1-Digest: 14IzhxapYTuOFt4ytI/QREZoG7I= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MG SHA1-Digest: ctZKR12DERrux+rZo8vytXNh3HM= Name: res/drawable-mdpi-v4/ic_notifications_gray.png SHA1-Digest: vZPyvQob6QrDKcHbe4kBeLDkvwE= Name: res/drawable-xhdpi-v4/ic_emoji_flags_activated_dark.png SHA1-Digest: m1hXrT9B1hmf35sVuclo7StZqR8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MH SHA1-Digest: I553az/fsFiei61dNsx+OzqhGtc= Name: res/layout/recipient_filter_item.xml SHA1-Digest: QntBBcYW90Shhm0OV1e7vvuiEmM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DZ SHA1-Digest: C5e84TgfTYmCzLZYu6RnqZHKpJU= Name: res/drawable-v11/emoji_category_emoticons_dark.xml SHA1-Digest: Z+gMiNhbCpygIX9WwGge//a90Fk= Name: res/drawable-xxxhdpi-v4/abc_ic_menu_share_mtrl_alpha.png SHA1-Digest: uwiP3ApwLduQ11Jf4UyIGf8WaSw= Name: res/color-v23/abc_tint_seek_thumb.xml SHA1-Digest: AG/P59T5NZ2vW8gLE2LWkUNjTgU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FO SHA1-Digest: I0h6Bg+e8DraPzeqhgG/JXKaHnE= Name: res/layout-v21/notification_template_icon_group.xml SHA1-Digest: BYFxUZkg0OVmcdx0VaV8IdmvCRk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KI SHA1-Digest: W+GYGRWWNO9VfnCGjezr83rTWak= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KP SHA1-Digest: Dt3psUrjHh2RtKdt01bA6NayDkE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN SHA1-Digest: r9TBVsQVlApfJ5PURa5jTDp1mpI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FR SHA1-Digest: F8cEznyv5lL3oxB8ewrVNbte/mo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KM SHA1-Digest: /j3NYmNeTSXEqAeNHPcmktPmmUc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FI SHA1-Digest: cc3FiPRu599RuvLrUYuG4GlLx1Q= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR SHA1-Digest: eeH6SrlK9fz//fLCAbgMKSPbydk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FM SHA1-Digest: Omg8GHvOmLFlocbs/beeFmigteY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW SHA1-Digest: Wqeif/KPbufIR7wVERzqR8S/pEk= Name: res/drawable-hdpi-v4/ic_emoji_objects_activated_dark.png SHA1-Digest: sEuvrPrbfFpdd0oEeUk/F5l37Oo= Name: res/drawable-mdpi-v4/ic_emoji_emoticons_normal_light.png SHA1-Digest: lcN1FLklx34ce3XjX8MS1ub6nM4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FK SHA1-Digest: virx/gqHIJaAJfMya2FVCsroiUU= Name: res/drawable-mdpi-v4/abc_list_selector_disabled_holo_light.9.png SHA1-Digest: S/+WIalIT7QGoZ4J/VOqr0XEGEM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FJ SHA1-Digest: AsBJQ5cDvtaD8KhVrdd3Ra19G2E= Name: res/drawable/play_to_pause_animation.xml SHA1-Digest: 2QNVZNFxIwLbMV2bdMWWFx3Vg+w= Name: res/drawable-xhdpi-v4/ic_lock_dark.png SHA1-Digest: fsVgKEE74rC9VZ1aUVMiTifFjJk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY SHA1-Digest: LzTiSXlJqas0gcRry8BtI2/+MaY= Name: res/drawable-xxhdpi-v4/ic_emoji_places_activated_light.png SHA1-Digest: UsUkp5uLESbx5uRS/7pqYOE+G+M= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KZ SHA1-Digest: morjXaz7AQrfchuU2D9Ir0hso20= Name: res/anim/design_fab_out.xml SHA1-Digest: eqyMleghgi0F32G8QHJUnftDRAc= Name: res/drawable/button_background_dark.xml SHA1-Digest: vjYs0zd8wTeSSImwhd7SzCMvt3E= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA SHA1-Digest: +UJCznkxgPXlvPZ8PXSLUW4dEhA= Name: res/drawable/abc_ic_search_api_material.xml SHA1-Digest: q4PW+nQazlvYWeSQX654gGr9+Xs= Name: res/drawable-mdpi-v4/switch_thumb_disabled_holo_light.9.png SHA1-Digest: h+7dgWRgNzZ6qYbj0pMQoC2C4No= Name: res/drawable-xhdpi-v4/ic_emoji_recents_activated_light.png SHA1-Digest: x0Fibi8IbLeU9rHJ/EUy/JhYKNk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB SHA1-Digest: 7R1a00+ERbmvIrFMfqEuy0wz3wk= Name: res/drawable-hdpi-v4/ic_lock_dark.png SHA1-Digest: +7Z4j/1Tp8o3+UaRcS77epplfh8= Name: res/drawable-xhdpi-v4/ic_unarchive_white_36dp.png SHA1-Digest: eGo7lFHOkrFuGtuMSR3rtlw1Dmg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LC SHA1-Digest: h+ps4m+jPrjq7rFtDAeC1nt/uow= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LI SHA1-Digest: rRscPukcDPzU3U3WU20X9HVrfr4= Name: res/drawable-xhdpi-v4/list_selector_background_selected.9.png SHA1-Digest: YJ9zp2BVWbYoWuD1G3xXbV47jvM= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GT SHA1-Digest: Q7O6pvuWts4wzfz7X9BaqSmQEvk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM SHA1-Digest: hOwOLqaTBB9z6KLemQDjdI/AtoQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JO SHA1-Digest: hJgqHBzI49lT0ggVsTR444WAG8I= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GU SHA1-Digest: a91JKpt1O+8EofHePL/xFmjB7PY= Name: res/drawable-sw600dp-xhdpi-v13/ic_backspace_normal_dark.png SHA1-Digest: 5a/n2fjexn3yPINUH/kg3IzKacY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GP SHA1-Digest: bUPAJj8YbzQEbkKiMdGWK8DP2ss= Name: res/drawable-v11/emoji_category_emoticons_light.xml SHA1-Digest: /i7VOhZRV82iuUh5suuxPNSMFDk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GR SHA1-Digest: 1QYdEhnohIcjN2HvCq/hkhwp8xs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GL SHA1-Digest: J5wULHohOFx6LVORM7knQZPPflA= Name: res/drawable/emoji_category_nature_dark.xml SHA1-Digest: RzDuk6h6UEkqappk7hYx6pgKeCs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GN SHA1-Digest: eQYUfKvF7PhYDoQymxImO/ArAn0= Name: res/layout/three_keys_view_text.xml SHA1-Digest: OIg+cLCV8JJOTklX8tPoW4VQ4HY= Name: res/layout-v21/conversation_item_sent.xml SHA1-Digest: TgHquxe4uRpHmqvpMejOLH3IlV0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GM SHA1-Digest: UjuisQhgKNNJKc8JgAJaKu4mS/w= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GH SHA1-Digest: PMia4PQmF7C2hXDP2qRmalQI3zk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GG SHA1-Digest: IPL006rKrzjMGsxEybUZLG23+OE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP SHA1-Digest: BPoTPiUdBS8osUrAiRWdZZuoySg= Name: res/drawable-mdpi-v4/ic_warning_light.png SHA1-Digest: gS0bDiXBZr0DgAwFbGO9Meuo6Ac= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GI SHA1-Digest: BCI6mUSq/R5El/YBddOeOzeVfM0= Name: res/xml/recipient_preferences.xml SHA1-Digest: vS+sVmTs0ik5kh0QzdQ8EefqVrY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GD SHA1-Digest: k3WLWwCjTxwsIUUmW47RSNfWotY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GE SHA1-Digest: AzBcU9n0fiP2A5xmAb/kmX/5WzA= Name: res/drawable-xxhdpi-v4/ic_delete_white_24dp.png SHA1-Digest: 1RidNQvRsN6EducCc0vCJzxVfF4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GF SHA1-Digest: YTDZuGscoDkKLscSSteWHNnWqHI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GA SHA1-Digest: 8V+YFYPjobN0sTLs1ourRLCEGqQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GB SHA1-Digest: Zi8bBmLz0rAbi2uaIPYkG4kDdog= Name: res/layout/icon_list_item.xml SHA1-Digest: Xw5UkSRVTEth1VIEgzovEo5YDeE= Name: res/layout-v17/notification_template_big_media.xml SHA1-Digest: 2TZwnbqvpxhRXoY7QCi88ttXexQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE SHA1-Digest: +llMaXL1zpGanoMQz7UFeeeWMw8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG SHA1-Digest: +/TbCrw/xmVGXAb2o1+a5y+DJJM= Name: res/drawable-xxhdpi-v4/ic_keyboard_grey600_24dp.png SHA1-Digest: a+dw9a8QtUZy6yhhDT6KdPGUCjQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH SHA1-Digest: SO0HcKRfd3hRI6Yo8LxVqYbZLt8= Name: res/drawable-xhdpi-v4/ic_video_dark.png SHA1-Digest: zpwM996y3CVQukYGQ0HTHy5f7nE= Name: res/drawable-hdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png SHA1-Digest: cK/LCW7Y07tXQ8e5BdotU64US0I= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN SHA1-Digest: 6Tkee6+4mtYefwjp3ho+GZxPO5U= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IM SHA1-Digest: RDnd0hwdyfVc3N2uBvc6S1HEljs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HU SHA1-Digest: gBSEvsJoHwDyup3b6joCh5dTRD4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL SHA1-Digest: pw3ZQcOPQ8vekxW1votjWkpLonM= Name: res/drawable-xxxhdpi-v4/abc_ic_star_black_48dp.png SHA1-Digest: lZvYglov/F7rh1bqR+gIZerpDBA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HT SHA1-Digest: cuqCGTXyf9YWfeIE5CpdBM78H6s= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HR SHA1-Digest: 4SIa2SzqN4pvQ+MNKxxtFPnDRCM= Name: res/drawable-xhdpi-v4/ic_attach_grey600_24dp.png SHA1-Digest: IJb9OzPEjLFeZBPANRMAm0yZfFQ= Name: res/drawable-xxhdpi-v4/ic_archive_white_24dp.png SHA1-Digest: LnSuw5GveQloQ5Y2p7P9PE/o3co= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HN SHA1-Digest: 2zlD4M+S4ihEvAOOaCf+xjE7KwM= Name: res/drawable-xhdpi-v4/ic_emoji_flags_normal_dark.png SHA1-Digest: xqJQwPDxU7dGMfeBydeKOClG/wQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT SHA1-Digest: mJyiY2OQxiz0HO3knAD52CKKXhk= Name: res/drawable-mdpi-v4/list_selected_holo_dark.9.png SHA1-Digest: w5jMjyx0n/lk3stiPGrcn7tdZT8= Name: res/drawable-xxhdpi-v4/ic_group_photo.png SHA1-Digest: WmOAx7F3WqRDxpRW/IxtzYnNI1E= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS SHA1-Digest: M6vwcfKOPCPzXN2Q1LPSSN6xUXE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HK SHA1-Digest: iMRHAc5pHQG7l2MkKc9Uei8mOdM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR SHA1-Digest: kkS2BgwtVVNMbA8B52AUVR7Vnng= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IQ SHA1-Digest: 9kyvSnJwQPj+ofHG/9nIkccqhGM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IO SHA1-Digest: xS6m1Nd+dX6UHPssnjupk97ZTus= Name: res/layout-v16/notification_template_custom_big.xml SHA1-Digest: bL5ENkTdQZZo4/ewb7jV+FB52C4= Name: res/drawable-xxhdpi-v4/ic_emoji_flags_normal_light.png SHA1-Digest: Ude+n/pbQCHeuTUCYUnBND+DjF0= Name: res/drawable-mdpi-v4/ic_info_outline_white_24dp.png SHA1-Digest: kqlF5XPnBveug9qTLLjXSlZngWM= Name: res/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_000.png SHA1-Digest: x44uUsdD5wnS8x1uTf9WTb3Fux4= Name: res/drawable-mdpi-v4/ic_photo_camera_dark.png SHA1-Digest: oc0uQS6Z4xssS7SPSC7hWEzCvBs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JE SHA1-Digest: t5AW47nFrcJm9IyeUU/4m1DYf4M= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GY SHA1-Digest: a/xp9RWW4VBQ/NIBRZACsJpM0tU= Name: res/drawable-mdpi-v4/ic_emoji_nature_activated_light.png SHA1-Digest: DIn3M7/XVDB6Gwx/ZHF5eykuZe8= Name: res/drawable-xxhdpi-v4/received_bubble.9.png SHA1-Digest: W4de+5UEqZE2m7rCCt25/Z1CxWI= Name: res/color/abc_btn_colored_borderless_text_material.xml SHA1-Digest: qYYJCxgQ4AbdVk4+vJwfrFQSIRY= Name: res/layout-v11/custom_default_preference_dialog.xml SHA1-Digest: 39iUnvmNYHFHassDu5Sf3avA4oY= Name: res/drawable/last_seen_divider_text_background_dark.xml SHA1-Digest: S9qKuKzACOFXweC2S3e7be8G510= Name: res/drawable-xxhdpi-v4/ic_audio_light.png SHA1-Digest: gQuhd3cXwFTM7eONLXkGFPvxBo8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GW SHA1-Digest: NKZr6PrDrXC1lER+/oi/KN2iUAk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HN SHA1-Digest: VcOLvVS1v9QsxowwQQCxxpLIhqY= Name: res/drawable-xxhdpi-v4/ic_notifications_gray.png SHA1-Digest: +DbmF16Xqsi7KleR/q1ocQU0ZtA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AC SHA1-Digest: RDF732v0m4SrZxaPqGU0AJ1dN5U= Name: res/drawable-mdpi-v4/switch_bg_holo_light.9.png SHA1-Digest: vON82tQz84Bild5sO6RktMAlv6M= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AD SHA1-Digest: IgBzZJ0TkASrgg+U2+YVGyfHP+U= Name: res/animator-v21/design_appbar_state_list_animator.xml SHA1-Digest: ovKSSXvPra3gUPG3Ru+QvqC93jE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR SHA1-Digest: nX+4rIC77R7nsEX+7umr/Tl17F8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AE SHA1-Digest: 8a6VtG0nrivCY7Uj7mEBGCWkyLc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AF SHA1-Digest: 0aCjoUjKRbBLMzMy4iOWMtY/3UA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HT SHA1-Digest: aitUHT8nE8GT2l1vyYrnQ3zN9Vs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AG SHA1-Digest: JyNY1zM/wn6O7nt35NXNo2PiLWI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HU SHA1-Digest: oHUli9tcpI1CfmTWNsCcs79QI8M= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AI SHA1-Digest: 7k5INCLG8OxQ0aRVxy32wZmKGYA= Name: res/drawable-hdpi-v4/ic_forum_grey_32dp.png SHA1-Digest: 99b7emFuCdH3rCFmzZtJOXgOgfs= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AL SHA1-Digest: QPUQhoD1ELWsS8wobUKLSlxREk8= Name: res/drawable-hdpi-v4/ic_emoji_recents_normal_dark.png SHA1-Digest: w7FLJuXEQDUevStvf/lE43WZRtw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AM SHA1-Digest: OZ7TzQAruGmMNKwTbj26HSSJ6Vc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK SHA1-Digest: sK5ygddQOZG1bpMfIn+ufm9Ag1w= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AO SHA1-Digest: t1oxQVcHcuY07YStXuGwlPqCGYU= Name: res/anim/design_snackbar_in.xml SHA1-Digest: QPiYcwJRp7LvVEneHabhK9QbisA= Name: res/drawable-xxhdpi-v4/abc_ic_star_black_16dp.png SHA1-Digest: 1y+vuoD2qUEyG9rLg5RKbDNziXo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ID SHA1-Digest: Jd3efgPU/mTNXdAghUYZp4b8f5I= Name: res/drawable-xxxhdpi-v4/ic_volume_off_grey600_18dp.png SHA1-Digest: m7uBbnMbM7TLl/038beKjjdQEA0= Name: res/drawable-xhdpi-v4/list_selected_holo_dark.9.png SHA1-Digest: H2X9BKxBdFAOYEppP+vczoJ/LCU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IE SHA1-Digest: yaaNbeWiQB+4UJuwYBjQjPCyz8U= Name: res/drawable-mdpi-v4/ic_emoji_objects_normal_light.png SHA1-Digest: wLIAptflMGRuo+tA0kne5MPyyXE= Name: res/drawable-mdpi-v4/ic_delete_white_24dp.png SHA1-Digest: gmSSBMZdMw8pnX1afNOc1o+JtOU= Name: res/drawable/abc_list_selector_holo_dark.xml SHA1-Digest: Zlmbg+JWzYfCIIOn1SxRANlh8xo= Name: res/drawable-xxhdpi-v4/ic_emoji_flags_normal_dark.png SHA1-Digest: 2z1yxZchowADwapp1FtAcalT87Y= Name: res/layout/recipient_preference_activity.xml SHA1-Digest: SqZ38YCPlsAm7mHR1/wNghFPwAk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BD SHA1-Digest: 76430xBKwku/DDx/2v8uzd8bS7o= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GP SHA1-Digest: TjngB6KbYm1dWa1jCgFdircKI8E= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BE SHA1-Digest: 0jMFpYLJRvAFhGwV1m0ywwHV0lk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GM SHA1-Digest: +HMlLkrXHtTaQRYsvMNYwivXw00= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BB SHA1-Digest: D9VdzHgGD84sHE9KzoLlCpHhreI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GN SHA1-Digest: kamMv/kGuT+OF5yKyIcbuiawZhs= Name: res/drawable-hdpi-v4/ic_forum_black_32dp.png SHA1-Digest: e7lhz+eq+Z2xMLdWOzhY5aYbdIU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BH SHA1-Digest: hPCyeOJ0pNXVNokGVbueix33HT0= Name: res/drawable-xxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png SHA1-Digest: kKM7t2gcUV2hJsYu4H6GhDJ44Ww= Name: res/drawable-xxhdpi-v4/ic_volume_up_dark.png SHA1-Digest: jZa17/4Ozx3sEVLWjy+QHrSGkY4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GT SHA1-Digest: A+WBdBc1oxnAo/NSFCb0ckHD/RQ= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BI SHA1-Digest: xARDGdB+3gz2uu+L03V5+Z2OkE4= Name: res/drawable-xxhdpi-v4/ic_emoji_symbols_normal_dark.png SHA1-Digest: OXjkrp9N5O3fEmUz0sZ803HBON0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GQ SHA1-Digest: j0Gr8/C7dKo9jIeBiQdGJzrTQtE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BF SHA1-Digest: 9IL79Qc7LVIwe3TPcfm/dfPBuD0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GR SHA1-Digest: oOxq1iueXRhFaVq694uW+BIWVe0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BG SHA1-Digest: h93q28N4Mq9DJA5stCI4Q6kpV+g= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GG SHA1-Digest: JjEfFBdOiGvImFk5qCvUNoJHssg= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BL SHA1-Digest: Bkex4W8Sqdq2QdfPpjxUsyDRFNM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GH SHA1-Digest: tARXirdHO+J7jX1BSZGURMKh2OA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BM SHA1-Digest: 2bavZ8OP6WYO1PZ1yZSdwmBWr1Y= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GE SHA1-Digest: Eh+FuhDuQ/Yud4wARFz7ynlQXCo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BJ SHA1-Digest: wPLMmY7tZ7tohQpByJmXMBMvejg= Name: res/layout/share_activity.xml SHA1-Digest: dP8qtNVpgRnPPMBikAwkuMfaRgg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GF SHA1-Digest: cStw3rgI9jNczqdt9+S3QrtFgyI= Name: res/drawable-hdpi-v4/ic_emoji_objects_normal_dark.png SHA1-Digest: K8C77eJjxCDFDD/YP8ZOMO/LNXY= Name: res/drawable-mdpi-v4/ic_volume_up_light.png SHA1-Digest: Nfocgsk1S7B5O3+/qQ28m5g+03k= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GL SHA1-Digest: xZ3Nix5ojbYAdxY1ujOK4kEDn58= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BQ SHA1-Digest: TRZ8RoSzM7Q0Kgy9q3Hkgv0+K44= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GI SHA1-Digest: bYlQ/+Z+fxPyy+M8utdMVtVjzoY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BN SHA1-Digest: zLlsc3Sq+KhTy5q17fahCIHn9as= Name: res/anim/slide_to_right.xml SHA1-Digest: odD3qfm4+8xLhJn/hGAfXAz+aZ4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BO SHA1-Digest: X6dOCKzkWH7pG353qvPi0cJMXZA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AT SHA1-Digest: +VdTbd3yiS56Vvg6mVBbJ1FhevY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AS SHA1-Digest: muvAoKE378p/xfRJMH0gEfWAswY= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AR SHA1-Digest: kfEObuTyU520NYg+cgyCwq8UDRs= Name: res/drawable/conversation_item_header_background.xml SHA1-Digest: ltMtF0mlyQqMyjfRF3u1wqyKwE0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AX SHA1-Digest: GAupldrmLMOJNAPQA4t7C7VELi8= Name: res/drawable-xhdpi-v4/lockscreen_watermark_light.png SHA1-Digest: f3uR83//pKLF+IvoV5IDGhpgv7s= Name: res/layout-v11/conversation_list_fragment.xml SHA1-Digest: IZJNszeAm0+nOf+E3k7rnorK68U= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AW SHA1-Digest: 7GFkN+PCbEzeSH/ZPSdE8zL5duU= Name: res/drawable-xxhdpi-v4/ic_send_secure_white_24dp.png SHA1-Digest: u/jnxcjUv1jpnEqD1E2j2DGRbF8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AU SHA1-Digest: V21thVoVDWhqpziOSHcYeQEyk1c= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GW SHA1-Digest: CHWAyb6wfCRIPi1Awop4y7ydYvI= Name: res/color-v11/abc_background_cache_hint_selector_material_light. xml SHA1-Digest: 5ZLto+P8lE/ONeMwLGzH/8b7W/M= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AZ SHA1-Digest: ipWmzFvGqfH6XuNw5VZtKyqAwB4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GU SHA1-Digest: 5QtlxjAkALSyqlnJGY1lW+mI7LA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BA SHA1-Digest: YAwTUUxVNul0kJ3nxEj4W5kCNLY= Name: res/drawable/emoji_category_places_dark.xml SHA1-Digest: i5LwYGeXLGbsZlLUNAlCLX6WES4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GY SHA1-Digest: azgoBqgESOhFdA7ELp8TmWkbU7I= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CG SHA1-Digest: Fd16dLbvXqX1FR9LEkbqGIeaf9w= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CH SHA1-Digest: fMOaGeUlCWnq90pEYA/ZuZW2NVs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR SHA1-Digest: /7QnZpwng/J+7wbQ1ginTBiZcIA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CI SHA1-Digest: cYID8mCsmYzvvINPQg/MCBIwU90= Name: res/drawable-ldrtl-v17/actionbar_icon.xml SHA1-Digest: WB6RqmtbPrs8sxSmdHke+npJQ1o= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CC SHA1-Digest: my7RQj++d4c9gN3M75yW9FNrm+w= Name: res/drawable-hdpi-v4/ic_done_all_white_18dp.png SHA1-Digest: ABt/I1W7stE/LdoJLaF/ETJ8Z6w= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FM SHA1-Digest: 4oKk49pru3DTC0/xf0vXtdZ7G4Q= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CD SHA1-Digest: 8piew6BOYZ7ePRqaXFTnAKldIBM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO SHA1-Digest: TziXLyMXY8BSKyMMQAZRAIl430k= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CF SHA1-Digest: hTwR8te+utnnm0BHnn/drJVOzEo= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CO SHA1-Digest: SmaJI8a3UWgPKtXiHeEGKrkTjEE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FI SHA1-Digest: YpU9InIafwl6Kqrsi87ubqMhmeA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ SHA1-Digest: Ftcg8Hvs6vJdlW/rMvvt69iJHOA= Name: res/drawable-mdpi-v4/notification_bg_normal_pressed.9.png SHA1-Digest: qf8Bo3OrZFOkS8OQT2FTwy3VSA8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FK SHA1-Digest: kPwrJTcCgRX2wiiSa1eMea5NqfU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CR SHA1-Digest: E6naAFEOjj3CJ0mUPOORugQKdEE= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CK SHA1-Digest: kml4SOYEOAu5sGR/zUjd4506DRU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CL SHA1-Digest: PrfrQy19TdrSjMCdtHrMrnnqIkE= Name: res/drawable-xhdpi-v4/ic_scroll_down.png SHA1-Digest: A7EKRwW4d9qW2hy1StqMBeGfI1o= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CM SHA1-Digest: SYiWMVM/V/2IqYg4VHau55jSiKY= Name: res/drawable-mdpi-v4/abc_textfield_activated_mtrl_alpha.9.png SHA1-Digest: tB4B5H9j3pm0Xv62OAovdHEjuyk= Name: res/drawable-xhdpi-v4/sms_selection_icon.png SHA1-Digest: mflBGnUVt525AuRZMG09j3NFODU= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CN SHA1-Digest: dUqHuHf7Stpvt0QwpmZZHFfItbQ= Name: res/drawable-xhdpi-v4/abc_text_select_handle_middle_mtrl_light.p ng SHA1-Digest: NlZeJG8MEHDXkZ6eZeHaVGnlZgM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB SHA1-Digest: 01uILLexEy+Gaa/6Y7/TvemCQYk= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BW SHA1-Digest: qRQhEn6cDXt6ZKKeAE+PSQ0iycY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GA SHA1-Digest: pF1ZsVYuRJaVCRphgj5zuakMsmc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD SHA1-Digest: z1A8dkpowjnXpMPRo+nFYkSvI5o= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BY SHA1-Digest: tCUlGhnAdGtfCKcEek88l4ALykc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BS SHA1-Digest: alk0pqMXOSElqgzMBX6KozHs9ug= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BR SHA1-Digest: bXw6aWE+YUGZ0hRkJClTnAHc9zA= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BT SHA1-Digest: 5SiZZK5G4Udghm6H1TPDNpZuM3I= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CA SHA1-Digest: Mw2o53PEmgbpglkqA2jeQ1IJgD4= Name: res/layout/empty_time_zone_item.xml SHA1-Digest: vLxkGUyywCgJGUGr1vsb7WZ2Aok= Name: res/drawable-xxxhdpi-v4/abc_ic_star_half_black_48dp.png SHA1-Digest: fkHHafZ6woOU+hakgiXNdjO+G0o= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BZ SHA1-Digest: d4VPpUrss071FdbKN8VMevGXHlc= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DJ SHA1-Digest: HQaHW8xAy3Yz5KdkqPT3E8puENM= Name: res/layout/country_selection.xml SHA1-Digest: 6NViX+HrI12AtP7KbHukzq6VRpg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ER SHA1-Digest: VIWqyXMJmfGmvosi7uf7KXdwxzI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DK SHA1-Digest: Rk/OAXR56qkx3Oo99XESs+OZgEc= Name: res/layout/dots_text_view.xml SHA1-Digest: EeO1nY+bgs6bEIMj/kAY4xDXtDw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DE SHA1-Digest: j6+PtQ5zJKxMUthOQpoU+Sme8RM= Name: res/drawable-xhdpi-v4/ic_emoji_emoticons_normal_dark.png SHA1-Digest: p8X6C3UakOOV6tRV4BeH3I8fTJU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EG SHA1-Digest: 9wfl0cn7ADAM7/+q7qEKB4aKgQo= Name: res/drawable-hdpi-v11/icon_notification.png SHA1-Digest: SajadWsZ3+kF/B+gC7uyQs3CDCY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EH SHA1-Digest: NN/M4oAPzH1Eoi772T19aLeju1w= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE SHA1-Digest: HBnXt+iOw3G7kWFH7VsdWKmxJeA= Name: res/drawable-sw600dp-mdpi-v13/ic_backspace_normal_light.png SHA1-Digest: NuCSY57nwySQHF+2nuwidTcr6es= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DO SHA1-Digest: 6k22UAvU8Oifxa5XVpXuoHtfSpo= Name: res/drawable-hdpi-v4/design_ic_visibility_off.png SHA1-Digest: 2dNj0DH+9oQlB4Is6vasMfxrlX0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC SHA1-Digest: lU1nyNP5Uj4EF5Q2612APDHmyvI= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DM SHA1-Digest: YhNRdUggTfghgpC35N3JAdXZA74= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CZ SHA1-Digest: VzVyxxyxyajXeORu8EcbWxk0Is0= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CY SHA1-Digest: qLUXYlJr/JYteTiM+4ackZ7ZiJQ= Name: res/drawable-mdpi-v4/ic_image_light.png SHA1-Digest: Djq+m9hk4G8p+kkpCMVp5JgqZOM= Name: res/drawable-mdpi-v4/received_bubble.9.png SHA1-Digest: Cw0YMXapgMp4/S7dKrcGoiAWX0Y= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CX SHA1-Digest: xPBJVrVPnZQVYrXTN1rqgKgbbEg= Name: res/layout/contact_selection_list_fragment.xml SHA1-Digest: 8uVIsygAzY+W00tDeJWb0+wgDL8= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CW SHA1-Digest: FzxQ6xJevFno4kgE8JMBn7vm1Qw= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CV SHA1-Digest: NVw0RDzSeot3HPLCd21YtZzNUl4= Name: res/layout-v11/notification_template_big_media_narrow.xml SHA1-Digest: L9uWxQbKZI+Le8fiaRB0zf5WQk4= Name: com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CU SHA1-Digest: fljaoiFDM4IT97593aTBjM7mDrk= Name: assets/fonts/Roboto-Bold.ttf SHA1-Digest: 0xOrLEV1a/TpcmR/WyrWka0lCZA= Name: res/drawable/circle_touch_highlight_background.xml SHA1-Digest: +vrejfE86g5jlzpEsT1T1kPkZkw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ET SHA1-Digest: UkNUR8e+38ufqUhzALmePKnQEDo= Name: res/drawable-xhdpi-v4/abc_list_divider_mtrl_alpha.9.png SHA1-Digest: B+V5QEOwy10ghi7uX5XLTPFJGJs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES SHA1-Digest: 29SChkSFfizs4lfPUzwmkhfYdzY= Name: res/drawable-mdpi-v4/ic_mood_white_24dp.png SHA1-Digest: vLMgOnfhzvg7N4kjbk1q6mBhHgA= Name: res/drawable-xhdpi-v4/lockscreen_watermark_dark.png SHA1-Digest: hlEs6EtN2kUs2+CrmYa3eux6s+o= Name: res/drawable-mdpi-v4/lockscreen_watermark_dark.png SHA1-Digest: seLgq7oT0J1fGJEos/BvHUn9HxM= Name: res/drawable-hdpi-v4/abc_text_select_handle_middle_mtrl_dark.png SHA1-Digest: jF6QKRBg9OvlnbeWqmX8Uqm8bg8= Name: res/drawable-xhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png SHA1-Digest: BmwsKC3uNvwcF8agRRgehS1CAm0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DZ SHA1-Digest: RQ4S6uQab867FlpDbYYHHaVL8Hg= Name: res/drawable-hdpi-v4/ic_volume_off_white_18dp.png SHA1-Digest: WAcrLSLpafxsPS7hsU4ikDLzBjE= Name: res/layout/receive_key_dialog.xml SHA1-Digest: uwKqhimJhXsLyVM92wFetrBMLrY= Name: res/drawable-xhdpi-v4/ic_emoji_flags_normal_light.png SHA1-Digest: lzTZ5KC+L1NXjN1Lc0RUX4B+kwY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE SHA1-Digest: kiLeXJRUmuwK6YSEE0un/LBWX7A= Name: res/drawable-xhdpi-v4/check_dark.png SHA1-Digest: n7vjve9oV1IazDBlspyC8ygB7iM= Name: META-INF/services/com.fasterxml.jackson.core.JsonFactory SHA1-Digest: wj+dD6oGz5YGyIP+iorCZD19Vfo= Name: res/drawable-xxhdpi-v4/divet_lower_right_light.png SHA1-Digest: LQGnGyzsEsPzMVo5RVG7YT87vHw= Name: res/drawable-sw600dp-mdpi-v13/ic_backspace_disabled_light.png SHA1-Digest: bBJa6fMJoP87GQtakbAV7tKOdHw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM SHA1-Digest: mwxgTyd8lkaOHm+Sp8pledOgHOU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK SHA1-Digest: /uFoov4ZE72YEZLQro51JnA0qbA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DJ SHA1-Digest: ljFANfE5k4ywKWuG79RPOG5xZ1k= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO SHA1-Digest: U7K6ebEteyqcWp8rMHKpW+I0dPE= Name: res/drawable-hdpi-v4/lockscreen_watermark_dark.png SHA1-Digest: SNi3m+8aly9MoEzOODURLRT2dgc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CR SHA1-Digest: /NGBGdHGjZxtQu9seYZopanOPEA= Name: res/layout/abc_screen_simple_overlay_action_mode.xml SHA1-Digest: shGoP8DkqV4/9zkW62jOT5c6dTM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CU SHA1-Digest: TxifspcBKsFrXrc+wHicK4kkThg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CV SHA1-Digest: qCfYcVgc1m0ocymyHWZCLOEMzGQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CW SHA1-Digest: ZXABFAd5qBbiQwpaxIRm7bM8C3w= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CX SHA1-Digest: tPwjD6BrsXTydYgTEATcxqoFxUo= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CY SHA1-Digest: w2bFmG/+0dEQjd6NOg7ZLIBNFxM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ SHA1-Digest: s4yNVj4uxeIYy2HQ1PZst2Wyd98= Name: res/drawable-xxhdpi-v4/ic_arrow_forward_light.png SHA1-Digest: fxLwDF0XgRhh/Z+wIHNmXH2vD/0= Name: res/drawable-xhdpi-v4/ic_launch_white_24dp.png SHA1-Digest: PkKEB5cW/mCfSfqauFHcBYJzYYM= Name: res/layout-v17/select_dialog_multichoice_material.xml SHA1-Digest: kF3z9YIp7bF/zoaUwjPCniSOWSA= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA SHA1-Digest: zLYC+3BHOlbcYHli1mCAZ0LxLWA= Name: res/menu/text_secure_normal.xml SHA1-Digest: advohO24vwcGKxIYhZNY0WNEeZs= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CD SHA1-Digest: KKWkBf+gjho9c01K+7L91O1+t5A= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CC SHA1-Digest: /uTE5ZftKbNfc1KVOBY0BwZYiJE= Name: res/drawable-mdpi-v4/ic_push_black.png SHA1-Digest: Pm4g2wut9XC0rdU2C6SgiGBABg0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CF SHA1-Digest: Atbkx3E2oA0sNPjKVvINB+dI4Bg= Name: res/drawable-xhdpi-v4/ic_push_black.png SHA1-Digest: crIGub6enfp19Wgv9TGPYS5p5qY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CH SHA1-Digest: 6WvaeaOO/6Fz0lOhysacb1sovkw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CG SHA1-Digest: 5Xmxv1AP9rY/jQgxEiQOK0rq8FA= Name: res/drawable-mdpi-v4/abc_ic_star_black_36dp.png SHA1-Digest: 0pZEH/xvvGcZULZXlcabKxti6Jk= Name: res/drawable-xhdpi-v4/ic_circle_fill_white_48dp.png SHA1-Digest: QVa6X8BQerJNmVgAVUtU/q5+yn0= Name: res/drawable-hdpi-v4/abc_ic_menu_share_mtrl_alpha.png SHA1-Digest: UQXINsxHR6ofvfukurZilM7cjk4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI SHA1-Digest: AvLDYaPuWJ/OdFPGj4ifg0S62tc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL SHA1-Digest: PxCy8tkmCP+qUB3r64VC8XRuwmo= Name: res/layout/delivery_status_view.xml SHA1-Digest: 7cbIP14SfIIw/AtYMsJAE991Clc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CK SHA1-Digest: swr8X/ZjBpnUT6YeeUfyJxwM/cw= Name: res/layout/abc_list_menu_item_checkbox.xml SHA1-Digest: +jlKh058XvxdeJU7n5iJbTnWP38= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN SHA1-Digest: jkqCARargiYpwr+wnSeQYA/kJhc= Name: res/drawable-xxxhdpi-v11/icon_notification.png SHA1-Digest: 1WKv+qoQAxKms56xhFqO8n3qtFg= Name: res/drawable-xxhdpi-v4/ic_lock_black_18dp.png SHA1-Digest: Nl6iL64BmDwCojnllz8S8eq2jCk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM SHA1-Digest: HwDCRGSDT0iwMJ3s3dhMUDWsmbg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO SHA1-Digest: 4BH0lAASQMIyDN9Y4flioJbgT/Q= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW SHA1-Digest: Hh3GuKKtwYd3UAE020lxf1UPuVM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT SHA1-Digest: xcgyGPnRb9VHBUeqqRbmsWKUGZY= Name: res/drawable-xxhdpi-v4/ic_emoji_symbols_activated_dark.png SHA1-Digest: hbZuiQ+6Kocq9GPlllglTKfYAQQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR SHA1-Digest: x1ZQeXUed4nFpfeA5rAI8lnTIM0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS SHA1-Digest: TKVmimdFLDNg0z7cGRsPzXosqQk= Name: res/drawable-hdpi-v4/ic_unarchive_white_24dp.png SHA1-Digest: j3jd65D0sfk5JumlC9jjVSsyKRM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BQ SHA1-Digest: PbKm2fiCJXlM2zhXzqALZTQzGjg= Name: res/drawable-ldrtl-mdpi-v17/abc_ic_menu_cut_mtrl_alpha.png SHA1-Digest: pSQWRqoWzxoeprY+bJcbqPYnS9w= Name: res/drawable-xhdpi-v4/ic_clear_search_holo_light.png SHA1-Digest: BQPFl6R0RkVo6zdHy6+CXEMYtwE= Name: resources.arsc SHA1-Digest: pT9SkqoTAVvawSq1GIG8JMi0pkY= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ SHA1-Digest: cxxhlPF+Qbo7TkgA5ihmKbzb36E= Name: res/drawable-xxhdpi-v4/textfield_disabled_focused_holo_light.9.p ng SHA1-Digest: EVVtSa4tBxIM4sQfg3efMbAd73k= Name: res/drawable-hdpi-v4/ic_forward_white_24dp.png SHA1-Digest: kw1ov76kMdT3DfN8aOM1S1y2/ME= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BY SHA1-Digest: 2Zx1n42omGg0DHFYInqMnrIeeg0= Name: res/drawable-mdpi-v4/ic_lock_black_18dp.png SHA1-Digest: y1vas11JhCozCPoOdEJ4aufqvWk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BG SHA1-Digest: 9re8XGKo/xLo//bh/z0hR8Uc+EQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF SHA1-Digest: 0tY+clINA//YDU7K+kyxypU3OCE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE SHA1-Digest: HZZssjC7WANQ41IICioDPlejzwY= Name: res/drawable-mdpi-v4/check_dark.png SHA1-Digest: Zw41IEwzlRetwcNgeIOdfgNOSXY= Name: res/drawable-xhdpi-v4/list_selector_disabled_holo_light.9.png SHA1-Digest: bwjSzuahpvwVgJavscLUKen/ZqQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BD SHA1-Digest: tQ36Ki94Y5VjpX97EPgpzMcnCcg= Name: res/drawable-v12/recycler_view_fast_scroller_bubble.xml SHA1-Digest: fK9A5ABKj0zZace6jtRt8OOyBgI= Name: res/drawable-xxhdpi-v4/abc_ic_menu_share_mtrl_alpha.png SHA1-Digest: NhH/qNsjwbuGc/0xqPrgqFgo+9o= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB SHA1-Digest: 8J7iBIplhPymg/EEzZJsAMvxSs4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BA SHA1-Digest: L26Dxo+sreGbLNYDAUPk5+NPndg= Name: res/drawable-xhdpi-v4/ic_emoji_symbols_activated_light.png SHA1-Digest: hylX4cGP5tPnLt+gZNcabzY3SSc= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO SHA1-Digest: 37mZ/Ac9FX1C2SItQm2x6JSkS3I= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BN SHA1-Digest: 3R/iFskKZ64flZb/KwUk33Rn810= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM SHA1-Digest: apnXGC3aexiNrwCnA0Ep6puLzAk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BL SHA1-Digest: HZWSbZ3UZ8s4l/FhQoR0nBW7OZQ= Name: res/drawable-mdpi-v4/ic_mood_grey600_24dp.png SHA1-Digest: YS3kKD7HHsRIdfK2f2H5+xYFSYM= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ SHA1-Digest: mW17F/U+xGNDE2Zqf+JDK0jo+Uw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BI SHA1-Digest: gC/DRFRyGCmSbHNi+4vswLWpctI= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH SHA1-Digest: 1JLqksp2mVHCZp5f3XP0nnIDc8g= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS SHA1-Digest: rYQYJGXNQZoNMNGGqjRyrZ78VCg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT SHA1-Digest: Wyt1xF8GNJ6TagUIQUZvz/2YmZg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AU SHA1-Digest: F5nDGT6P8crg0XaezCJkjCycul8= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AO SHA1-Digest: P+IbplkkA6LtKiWPQ3g3AP6Hmh0= Name: res/drawable-xxhdpi-v4/ic_photo_camera_dark.png SHA1-Digest: NDhUEnY/9tmdHmX/b6M64HpS9yw= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR SHA1-Digest: h9cD1dyR0cLOqU13gHWoxESdWPo= Name: res/layout-v17/timezonepickerview.xml SHA1-Digest: K/JpIQe/v0bxlrvy7hhOZj11kFg= Name: res/drawable-hdpi-v4/ic_scroll_down.png SHA1-Digest: XytlHbsWw8c8kdsw8h6y7sjJKq4= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AW SHA1-Digest: CTrn031inOFtaLnJCGhlvWfPKGg= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AX SHA1-Digest: dMS2y3fU2kSnwSTeiJZ0Mpkt+3c= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AZ SHA1-Digest: +t1VkIworcQ38T1C0vEEJA7HKac= Name: res/layout-v16/conversation_item_pending.xml SHA1-Digest: Vq2adS4zm1jVXVo88/+N+RDkNA0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AD SHA1-Digest: bb+pNMaDG7pdq/Cq2Su/Q52u2r0= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AC SHA1-Digest: TJ35D8LXerx6x5iU2mdwSKzZxpk= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AF SHA1-Digest: WCNTNjVsBqg57SCzkaLKHkmDiLU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AE SHA1-Digest: fFAv4HaRBjsYiyiqOi2YvPpOMsE= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AL SHA1-Digest: XJrLVXd4bo6FfmZ06m7R8JDygcQ= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM SHA1-Digest: fZk1LKUL1HQqcqhvd0TOEYa/4DY= Name: res/drawable-mdpi-v4/ic_block_grey600_18dp.png SHA1-Digest: KUJOjPxGDJUuR310dKFutbu9OrU= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG SHA1-Digest: d2WD7VWMRhFbynO6CH861qiLo0s= Name: com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI SHA1-Digest: 6l9Z9Fbvz1yTIdltnNSGVoSnsd8= Name: res/drawable-hdpi-v4/ic_clear_white_24dp.png SHA1-Digest: KGvzH9tAy4Rp8fXE4ss/IlIj060= Name: res/drawable-xhdpi-v4/ic_account_box_dark.png SHA1-Digest: S01JIJuWASlAuq+cfTEotALXCFc= Name: res/drawable-xxhdpi-v4/ic_download_circle_fill_white_48dp.png SHA1-Digest: +G6fimlMFg2qKV2XZkNN6qxDw/8= Name: res/drawable-ldrtl-mdpi-v4/ic_send_white_24dp.png SHA1-Digest: VbFcDTzqSyDKzi2rqRZMy19N5Hs= Name: res/drawable-mdpi-v4/ic_lock_dark.png SHA1-Digest: TgRcFRX+X3s89plB3KsZ9DYCZtw= Name: res/drawable/abc_seekbar_track_material.xml SHA1-Digest: 17M1OyJgbSyvZxbg3tUg5REGwOg= Name: res/drawable-mdpi-v4/ic_call_split_white_24dp.png SHA1-Digest: f5THhmczC1U2x8JMNIv2h8Q1nJw= Name: res/drawable-mdpi-v4/ic_emoji_places_activated_light.png SHA1-Digest: 6K+yjAZ+f9Rv4akI86+ahnCL/GQ= Name: res/layout/abc_list_menu_item_radio.xml SHA1-Digest: agsopWn5fspPqFiahI2wYYvv2Ig= Name: res/drawable-mdpi-v4/ic_emoji_places_activated_dark.png SHA1-Digest: XpeaT819whOm5PfS0d9GWivG2j4= Name: res/drawable-xhdpi-v4/ic_call_split_white_24dp.png SHA1-Digest: 1uIDxVlM+3QUDQXoBZzGTRrNcZ4= Name: res/drawable-mdpi-v4/abc_ic_menu_share_mtrl_alpha.png SHA1-Digest: uftsHSNmkb7m90jrsRX95EC5rJ4= Name: res/drawable-xhdpi-v4/ic_emoji_people_normal_dark.png SHA1-Digest: DRrX67cohdfiuTn7OIr9CgL8kDQ= Name: res/layout-sw600dp-v13/three_keys_view.xml SHA1-Digest: 1iK1XU6Ybu1I6Z7cXWDONXCmx3k= Name: res/drawable/abc_list_selector_holo_light.xml SHA1-Digest: y4DqLE9ZMUXA7mpN9gzH7cgYblE= Name: res/drawable-xxhdpi-v4/lockscreen_watermark_light.png SHA1-Digest: AYNtsBVsxmSt1MgC8RP6Pd1pBao= Name: res/drawable-hdpi-v4/ic_account_box_dark.png SHA1-Digest: hzHnNF7Nc3hzYAfZjgmaAT4n2Ww= Name: res/drawable-mdpi-v4/ic_file_download_white_36dp.png SHA1-Digest: hbgdgZY1/fI/fqOaKxitnFIcI2g= Name: res/drawable-xxhdpi-v4/ic_push_registration_reminder.png SHA1-Digest: upW0gkPgqGNrSfE71EPR4GfdV+E= Name: res/drawable-mdpi-v4/ic_menu_add_field_holo_light.png SHA1-Digest: Rs64wpgQPbMuMj5rXn1+oBa5qak= Name: res/layout-v17/custom_default_preference_dialog.xml SHA1-Digest: HUQHHYyxai0hDOmCZJWChGinyio= Name: res/layout/contact_selection_list_item.xml SHA1-Digest: sdeMBniS9IJ6AYVkHqBh7NcRPeI= Name: res/drawable-xhdpi-v4/ic_send_secure_white_24dp.png SHA1-Digest: 9DyQOaZ+JzrS3IXK1M/Cy9q6Evc= Name: res/drawable-xhdpi-v4/abc_list_selector_disabled_holo_dark.9.png SHA1-Digest: e6ZxO30OB+oHpoct3gGLBY0gYXA= Name: res/layout/three_keys_view_right_drawable.xml SHA1-Digest: 6njEKgbsmM3f0ShnujnHeW1d8UM= Name: res/drawable-xxhdpi-v4/textfield_default_holo_light.9.png SHA1-Digest: HnMo01YraOS60C6Mfei/HvkA/0E= Name: res/drawable/abc_btn_borderless_material.xml SHA1-Digest: rPL1lJzRovUC1nEamnoL6zg2+0U= Name: res/menu/conversation_popup.xml SHA1-Digest: jik07pVp4j6AEoIlH7yAt8toeqw= Name: res/drawable-xxhdpi-v4/abc_textfield_search_default_mtrl_alpha.9 .png SHA1-Digest: bHADGZ86aGisr0oBfZBoU7RHX/g= Name: res/drawable/abc_text_cursor_material.xml SHA1-Digest: e08kbab0hCmZ+bodjZ7WbbBG5g4= Name: res/drawable-hdpi-v4/abc_ic_star_black_36dp.png SHA1-Digest: vgGy8pBTjoL/yJmNDQQ42DiT8vg= Name: res/drawable-mdpi-v4/abc_popup_background_mtrl_mult.9.png SHA1-Digest: JKV8P+rg3eY4lfp/aRgwOCFBeL0= Name: res/drawable-xxxhdpi-v4/ic_volume_off_white_18dp.png SHA1-Digest: rAVDor9ql64gPZTz5+KoAkLTTiI= Name: res/drawable-xxhdpi-v4/ic_check_white_24dp.png SHA1-Digest: bDxdJbCXinpkzSOdCIJZpcY6Gcw= Name: res/drawable-hdpi-v4/ic_message_gray.png SHA1-Digest: BgellHtjVGHZg5WpI2gtorVn58s= Name: res/drawable-xxhdpi-v4/ic_content_copy_white_24dp.png SHA1-Digest: LNLXvmySKOfF2Lp1gubWDFlQbbs= Name: res/drawable-xxhdpi-v4/ic_recurrence_bubble_outline.png SHA1-Digest: xKHPSlWlpwl+eiFK9hr4FePpdn4= Name: res/drawable-xxhdpi-v4/splash_padlock.png SHA1-Digest: wByXqz9iEvHVgT6+YuyhHFRRWKA= Name: res/drawable-mdpi-v4/ic_group_photo.png SHA1-Digest: LnMrIN2HmBbAm29e9YOIOUlNAas= Name: res/drawable/conversation_list_item_read_background_dark.xml SHA1-Digest: VUasHJ1+/2ThzfBvQafFpoof3b0= Name: res/drawable-xhdpi-v4/abc_list_focused_holo.9.png SHA1-Digest: Kw0Qo9eKlw06/oxLHYSWR6VftBw= Name: res/drawable/recycler_view_fast_scroller_bubble.xml SHA1-Digest: wRRdXv08lnaiKNy7Vz1zDb1gdTs= Name: res/drawable-hdpi-v4/ic_emoji_objects_activated_light.png SHA1-Digest: /oLV9rB2nqhghgvHi09BIJEmEIY= Name: res/drawable-xxxhdpi-v4/ic_menu_lock_dark.png SHA1-Digest: yRZ1+4GpqVyXrqr3eMDXxmWCMgM= Name: res/drawable-hdpi-v4/ic_emoji_symbols_activated_light.png SHA1-Digest: ZikdFDG3isXn+9er/CFwE2KVkn8= Name: res/drawable-mdpi-v4/abc_list_pressed_holo_dark.9.png SHA1-Digest: MoCLKmenbTlsz905dAkmwWiKKG0= Name: res/layout/design_layout_snackbar_include.xml SHA1-Digest: 09E6R0HuXwitMIFjvlCM+pXlOyw= Name: res/layout/contact_selection_list_header.xml SHA1-Digest: bl+2m53uDPHKWPgEkbbRgrufOc4= Name: res/layout/preference_list_fragment.xml SHA1-Digest: GXlLAti1Bhp0ihLEnJZS6HFFIjs= ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/org.smssecure.smssecure.yml0000644000175000017500000001121714620351225023260 0ustar00hanshansCategories: - Phone & SMS License: GPL-3.0-only WebSite: http://www.smssecure.org SourceCode: https://github.com/SMSSecure/SMSSecure IssueTracker: https://github.com/SMSSecure/SMSSecure/issues Translation: https://www.transifex.com/silence/silence AutoName: SMSSecure Summary: Send encrypted text messages (SMS) Description: |- SMSSecure is an SMS/MMS application that allows you to protect your privacy while communicating with friends. Using SMSSecure, you can send SMS messages and share media or attachments with complete privacy. * Easy. SMSSecure works like any other SMS application. There's nothing to sign up for and no new service your friends need to join. * Reliable. SMSSecure communicates using encrypted SMS messages. No servers or internet connection required. * Private. SMSSecure uses the TextSecure encryption protocol to provide privacy for every message, every time. * Safe. All messages are encrypted locally, so if your phone is lost or stolen, your messages are protected. * Open Source. SMSSecure is Free and Open Source, enabling anyone to verify its security by auditing the code. RepoType: git Repo: https://github.com/SMSSecure/SMSSecure Builds: - versionName: 0.3.3 versionCode: 5 disable: builds, merge changes into upstream commit: 66367479a4f57f347b5cbe8f6f8f632adaae7727 gradle: - yes srclibs: - GradleWitness@10f1269c0aafdc1d478efc005ed48f3a47d44278 - PreferenceFragment@717a45433b927d2f0dfc5328f79e77c9682c37bc - ShortcutBadger@3815ce2ec0c66acd7d7c0b4f2479df8fa70fed87 - AospMms@android-5.1.0_r3 forcevercode: true rm: - libs/* prebuild: - touch signing.properties - pushd $$GradleWitness$$ - gradle jar - popd - cp $$GradleWitness$$/build/libs/GradleWitness.jar libs/gradle-witness.jar - sed -i -e '20,22d' build.gradle - pushd $$PreferenceFragment$$ - gradle uploadArchives - popd - sed -i -e '/5470f5872514a6226fa1fc6f4e000991f38805691c534cf0bd2778911fc773ad/d' build.gradle - mkdir smil - pushd smil - wget -c http://www.w3.org/TR/smil-boston-dom/java-binding.zip - unzip java-binding.zip - popd - cp -fR smil/java/org src/ - rm -fR smil - sed -i -e '/org.w3c.smil/d' build.gradle - cp -fR $$AospMms$$/src/org src/ - versionName: 0.3.3 versionCode: 6 disable: builds, wait for upstream commit: 9675ce5eecb929dcaddb43b3d9486fdb88b9ae1a submodules: true gradle: - yes srclibs: - GradleWitness@10f1269c0aafdc1d478efc005ed48f3a47d44278 rm: - libs/*.jar prebuild: - touch signing.properties - pushd $$GradleWitness$$ - gradle jar - popd - cp $$GradleWitness$$/build/libs/GradleWitness.jar libs/gradle-witness.jar - versionName: 0.4.2 versionCode: 9 disable: builds locally, but not on BS commit: v0.4.2 submodules: true gradle: - yes rm: - libs/*.jar prebuild: - touch signing.properties - ./build-witness.sh - rm -rf libs/gradle-witness/build - echo "org.gradle.jvmargs=-Xms512m -Xmx512m -XX:MaxPermSize=512m" >> gradle.properties - versionName: 0.5.1 versionCode: 11 commit: v0.5.1 submodules: true gradle: - yes rm: - libs/*.jar prebuild: - touch signing.properties - ./build-witness.sh - rm -rf libs/gradle-witness/build - echo "org.gradle.jvmargs=-Xms512m -Xmx512m -XX:MaxPermSize=512m" >> gradle.properties - versionName: 0.5.2 versionCode: 12 disable: broken in upstream commit: v0.5.2 submodules: true gradle: - yes rm: - libs/*.jar prebuild: - touch signing.properties - ./scripts/build-witness.sh - rm -rf libs/gradle-witness/build - versionName: 0.5.3 versionCode: 100 commit: v0.5.3 submodules: true gradle: - yes rm: - libs/*.jar prebuild: - touch signing.properties - ./scripts/build-witness.sh - rm -rf libs/gradle-witness/build - versionName: 0.5.4 versionCode: 101 commit: v0.5.4 submodules: true gradle: - yes rm: - libs/*.jar prebuild: - touch signing.properties - ./scripts/build-witness.sh - rm -rf libs/gradle-witness/build - versionName: 0.6.0 versionCode: 102 commit: v0.6.0 submodules: true gradle: - yes rm: - libs/*.jar prebuild: - touch signing.properties - ./scripts/build-witness.sh - rm -rf libs/gradle-witness/build AutoUpdateMode: Version v%v UpdateCheckMode: Tags CurrentVersion: 0.6.0 CurrentVersionCode: 102 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/org.videolan.vlc.yml0000644000175000017500000005514214620351225021630 0ustar00hanshansCategories: - Multimedia License: GPL-3.0-only WebSite: http://www.videolan.org/vlc/download-android.html SourceCode: http://git.videolan.org/?p=vlc-ports/android.git;a=summary IssueTracker: "http://www.videolan.org/support/index.html#bugs" Donate: "http://www.videolan.org/contribute.html#money" AutoName: VLC Summary: Media player Description: | Video and audio player that supports a wide range of formats, for both local and remote playback. [http://git.videolan.org/?p=vlc-ports/android.git;a=blob_plain;f=NEWS NEWS] RepoType: git Repo: git://git.videolan.org/vlc-ports/android.git Builds: - versionName: 0.0.11-ARMv7 versionCode: 110 commit: 0.0.11 subdir: vlc-android forceversion: true forcevercode: true prebuild: sed -i '48d' ../Makefile androidupdate: - . - ../java-libs/SlidingMenu - ../java-libs/ActionBarSherlock build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release - versionName: 0.0.11-ARM versionCode: 111 commit: 0.0.11 subdir: vlc-android forceversion: true forcevercode: true prebuild: sed -i '48d' ../Makefile androidupdate: - . - ../java-libs/SlidingMenu - ../java-libs/ActionBarSherlock build: cd ../ && ANDROID_ABI=armeabi ./compile.sh release - versionName: 0.0.11-x86 versionCode: 112 disable: ffmpeg error 0.0.11 commit: unknown - see disabled subdir: vlc-android forceversion: true forcevercode: true prebuild: sed -i '48d' ../Makefile androidupdate: - . - ../java-libs/SlidingMenu - ../java-libs/ActionBarSherlock build: cd ../ && ANDROID_ABI=x86 ./compile.sh release - versionName: 0.0.11-mips versionCode: 113 commit: 0.0.11 subdir: vlc-android forceversion: true forcevercode: true prebuild: sed -i '48d' ../Makefile androidupdate: - . - ../java-libs/SlidingMenu - ../java-libs/ActionBarSherlock build: cd ../ && ANDROID_ABI=mips ./compile.sh release - versionName: 0.1.3-MIPS versionCode: 1301 disable: build failing (at 0.1.3) commit: 0.1.3 subdir: vlc-android patch: ndkr9.patch srclibs: VLC@7c52aacbe forceversion: true forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ANDROID_ABI=mips ./compile.sh release - versionName: 0.1.3-x86 versionCode: 1302 commit: 0.1.3 subdir: vlc-android patch: ndkr9.patch srclibs: VLC@7c52aacbe forceversion: true forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ANDROID_ABI=x86 ./compile.sh release - versionName: 0.1.3-ARM versionCode: 1303 commit: 0.1.3 subdir: vlc-android patch: ndkr9.patch srclibs: VLC@7c52aacbe forceversion: true forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi ./compile.sh release - versionName: 0.1.3-ARMv7 versionCode: 1304 commit: 0.1.3 subdir: vlc-android patch: ndkr9.patch srclibs: VLC@7c52aacbe forceversion: true forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release - versionName: 0.9.0 versionCode: 9002 commit: 0.9.0 subdir: vlc-android srclibs: VLC@31ffb20309264994 forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ANDROID_ABI=x86 ./compile.sh release - versionName: 0.9.0 versionCode: 9004 commit: 0.9.0 subdir: vlc-android srclibs: VLC@31ffb20309264994 forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release - versionName: 0.9.1 versionCode: 9102 commit: 0.9.1 subdir: vlc-android srclibs: VLC@37e886d113b8b567c15208579fb2f forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ANDROID_ABI=x86 ./compile.sh release - versionName: 0.9.1 versionCode: 9104 commit: 0.9.1 subdir: vlc-android srclibs: VLC@37e886d113b8b567c15208579fb2f forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release - versionName: 0.9.5 versionCode: 9502 disable: can't download gmp commit: 0.9.5 subdir: vlc-android srclibs: VLC@052600173f376ff58ff04d53746961a2 forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ANDROID_ABI=x86 ./compile.sh release - versionName: 0.9.5 versionCode: 9504 disable: can't download gmp commit: 0.9.5 subdir: vlc-android srclibs: VLC@052600173f376ff58ff04d53746961a2 forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release - versionName: 0.9.6 versionCode: 9602 commit: 0.9.6 subdir: vlc-android srclibs: VLC-2.2@27f4799 forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=x86 ./compile.sh release - versionName: 0.9.6 versionCode: 9604 commit: 0.9.6 subdir: vlc-android srclibs: VLC-2.2@27f4799 forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release - versionName: 0.9.7 versionCode: 9702 commit: 0.9.7 subdir: vlc-android srclibs: VLC-2.2@9e1c6ff forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=x86 ./compile.sh release - versionName: 0.9.7 versionCode: 9704 commit: 0.9.7 subdir: vlc-android srclibs: VLC-2.2@9e1c6ff forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release - versionName: 0.9.7.1 versionCode: 9711 disable: build fails commit: 0.9.7.1 subdir: vlc-android srclibs: VLC-2.2@57cd36b forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=mips ./compile.sh release - versionName: 0.9.7.1 versionCode: 9712 commit: 0.9.7.1 subdir: vlc-android srclibs: VLC-2.2@57cd36b forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=x86 ./compile.sh release - versionName: 0.9.7.1 versionCode: 9714 commit: 0.9.7.1 subdir: vlc-android srclibs: VLC-2.2@57cd36b forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release - versionName: 0.9.8 versionCode: 9802 commit: 0.9.8 subdir: vlc-android srclibs: VLC-2.2@f2db364 forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=x86 ./compile.sh release - versionName: 0.9.8 versionCode: 9803 commit: 0.9.8 subdir: vlc-android srclibs: VLC-2.2@f2db364 forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi ./compile.sh release - versionName: 0.9.8 versionCode: 9804 commit: 0.9.8 subdir: vlc-android srclibs: VLC-2.2@f2db364 forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release - versionName: 0.9.9 versionCode: 9902 commit: 0.9.9 subdir: vlc-android srclibs: VLC-2.2@e731dc23a4f8ef6782c7cc2236bbbf41c034dad1 forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=x86 ./compile.sh release - versionName: 0.9.9 versionCode: 9903 commit: 0.9.9 subdir: vlc-android srclibs: VLC-2.2@e731dc23a4f8ef6782c7cc2236bbbf41c034dad1 forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi ./compile.sh release - versionName: 0.9.9 versionCode: 9904 commit: 0.9.9 subdir: vlc-android srclibs: VLC-2.2@e731dc23a4f8ef6782c7cc2236bbbf41c034dad1 forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release - versionName: 0.9.10 versionCode: 10002 commit: 0.9.10 subdir: vlc-android srclibs: VLC-2.2@e33e5de forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=x86 ./compile.sh release - versionName: 0.9.10 versionCode: 10003 commit: 0.9.10 subdir: vlc-android srclibs: VLC-2.2@e33e5de forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi ./compile.sh release - versionName: 0.9.10 versionCode: 10004 commit: 0.9.10 subdir: vlc-android srclibs: VLC-2.2@e33e5de forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release #0.9.10 vercodes were off - versionName: 1.0.0 versionCode: 10006 disable: doesn't build commit: 1.0.0 subdir: vlc-android srclibs: VLC-2.2@036010e forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=x86 ./compile.sh release #0.9.10 vercodes were off - versionName: 1.0.0 versionCode: 10007 disable: doesn't build commit: 1.0.0 subdir: vlc-android srclibs: VLC-2.2@036010e forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi ./compile.sh release #0.9.10 vercodes were off - versionName: 1.0.0 versionCode: 10008 disable: doesn't build commit: 1.0.0 subdir: vlc-android srclibs: VLC-2.2@036010e forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release - versionName: 1.0.1 versionCode: 10102 commit: 1.0.1 subdir: vlc-android srclibs: VLC-2.2@59409d5 forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=x86 ./compile.sh release - versionName: 1.0.1 versionCode: 10103 commit: 1.0.1 subdir: vlc-android srclibs: VLC-2.2@59409d5 forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi ./compile.sh release - versionName: 1.0.1 versionCode: 10104 commit: 1.0.1 subdir: vlc-android srclibs: VLC-2.2@59409d5 forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release - versionName: 1.1.3 versionCode: 1010303 commit: 1.1.3 subdir: vlc-android gradle: VanillaARMv6fpu srclibs: VLC@a9b19e4 prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi" --release ndk: r10d - versionName: 1.1.3 versionCode: 1010304 commit: 1.1.3 subdir: vlc-android gradle: VanillaARMv7 srclibs: VLC@a9b19e4 prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi-v7a" --release ndk: r10d - versionName: 1.1.3 versionCode: 1010305 commit: 1.1.3 subdir: vlc-android gradle: VanillaX86 srclibs: VLC@a9b19e4 prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "x86" --release ndk: r10d - versionName: 1.1.5 versionCode: 1010503 commit: 1.1.5 subdir: vlc-android gradle: VanillaARMv6fpu srclibs: VLC@e6b4585 prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi" --release ndk: r10d - versionName: 1.1.5 versionCode: 1010504 commit: 1.1.5 subdir: vlc-android gradle: VanillaARMv7 srclibs: VLC@e6b4585 prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi-v7a" --release ndk: r10d - versionName: 1.1.5 versionCode: 1010505 commit: 1.1.5 subdir: vlc-android gradle: VanillaX86 srclibs: VLC@e6b4585 prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "x86" --release ndk: r10d - versionName: 1.1.6 versionCode: 1010603 commit: 1.1.6 subdir: vlc-android gradle: VanillaARMv6fpu srclibs: VLC@551b670 prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi" --release ndk: r10d - versionName: 1.1.6 versionCode: 1010604 commit: 1.1.6 subdir: vlc-android gradle: VanillaARMv7 srclibs: VLC@551b670 prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi-v7a" --release ndk: r10d - versionName: 1.1.6 versionCode: 1010605 commit: 1.1.6 subdir: vlc-android gradle: VanillaX86 srclibs: VLC@551b670 prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "x86" --release ndk: r10d - versionName: 1.2.0 versionCode: 1020003 commit: 1.2.0 subdir: vlc-android gradle: VanillaARMv6fpu srclibs: VLC@23c8d86 prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi" --release ndk: r10d - versionName: 1.2.0 versionCode: 1020004 commit: 1.2.0 subdir: vlc-android gradle: VanillaARMv7 srclibs: VLC@23c8d86 prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi-v7a" --release ndk: r10d - versionName: 1.2.0 versionCode: 1020005 commit: 1.2.0 subdir: vlc-android gradle: VanillaX86 srclibs: VLC@23c8d86 prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "x86" --release ndk: r10d - versionName: 1.2.1 versionCode: 1020103 commit: 1.2.1 subdir: vlc-android gradle: VanillaARMv6fpu srclibs: VLC@23c8d86 prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi" --release ndk: r10d - versionName: 1.2.1 versionCode: 1020104 commit: 1.2.1 subdir: vlc-android gradle: VanillaARMv7 srclibs: VLC@23c8d86 prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi-v7a" --release ndk: r10d - versionName: 1.2.1 versionCode: 1020105 commit: 1.2.1 subdir: vlc-android gradle: VanillaX86 srclibs: VLC@23c8d86 prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "x86" --release ndk: r10d - versionName: 1.2.2 versionCode: 1020203 commit: 1.2.2 subdir: vlc-android gradle: VanillaARMv6fpu srclibs: VLC@7491a5f prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi" --release ndk: r10d - versionName: 1.2.2 versionCode: 1020204 commit: 1.2.2 subdir: vlc-android gradle: VanillaARMv7 srclibs: VLC@7491a5f prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi-v7a" --release ndk: r10d - versionName: 1.2.2 versionCode: 1020205 commit: 1.2.2 subdir: vlc-android gradle: VanillaX86 srclibs: VLC@7491a5f prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "x86" --release ndk: r10d - versionName: 1.2.3 versionCode: 1020303 commit: 1.2.3 subdir: vlc-android gradle: VanillaARMv6fpu srclibs: VLC@7491a5f prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi" --release ndk: r10d - versionName: 1.2.3 versionCode: 1020304 commit: 1.2.3 subdir: vlc-android gradle: VanillaARMv7 srclibs: VLC@7491a5f prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi-v7a" --release ndk: r10d - versionName: 1.2.3 versionCode: 1020305 commit: 1.2.3 subdir: vlc-android gradle: VanillaX86 srclibs: VLC@7491a5f prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "x86" --release ndk: r10d - versionName: 1.2.4 versionCode: 1020403 commit: 1.2.4 subdir: vlc-android gradle: VanillaARMv6fpu srclibs: VLC@7491a5f prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi" --release ndk: r10d - versionName: 1.2.4 versionCode: 1020404 commit: 1.2.4 subdir: vlc-android gradle: VanillaARMv7 srclibs: VLC@7491a5f prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi-v7a" --release ndk: r10d - versionName: 1.2.4 versionCode: 1020405 commit: 1.2.4 subdir: vlc-android gradle: VanillaX86 srclibs: VLC@7491a5f prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "x86" --release ndk: r10d - versionName: 1.2.5 versionCode: 1020503 commit: 1.2.5 subdir: vlc-android gradle: VanillaARMv6fpu srclibs: VLC@50accb8 prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi" --release ndk: r10d - versionName: 1.2.5 versionCode: 1020504 commit: 1.2.5 subdir: vlc-android gradle: VanillaARMv7 srclibs: VLC@50accb8 prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi-v7a" --release ndk: r10d - versionName: 1.2.5 versionCode: 1020505 commit: 1.2.5 subdir: vlc-android gradle: VanillaX86 srclibs: VLC@50accb8 prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "x86" --release ndk: r10d - versionName: 1.2.6 versionCode: 1030003 commit: 1.2.6 subdir: vlc-android gradle: VanillaARMv6fpu srclibs: VLC@d59b81a prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi" --release ndk: r10d - versionName: 1.2.6 versionCode: 1030004 commit: 1.2.6 subdir: vlc-android gradle: VanillaARMv7 srclibs: VLC@d59b81a prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi-v7a" --release ndk: r10d - versionName: 1.2.6 versionCode: 1030005 commit: 1.2.6 subdir: vlc-android gradle: VanillaX86 srclibs: VLC@d59b81a prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "x86" --release ndk: r10d MaintainerNotes: | Instructions and dependencies here: http://wiki.videolan.org/AndroidCompile see http://buildbot.videolan.org/builders/ for version code scheme The VLC srclib commit can be found out from TESTED_HASH value in compile.sh On new releases remove the updatecheck and force the CV to the last working build. This will make sure users don't get notified about the update until the final build from the BS has been reviewed and tested. Once done, undo those changes. # NEW BUILDS # +0: vanilla # +1: armv5 # +2: armv6nofpu # +3: armv6fpu # +4: armv7 # +5: x86 # +6: mips # +7: armv8 # +8: x86_64 # +9: mips64 # OLD BUILD SYSTEM # +0: - (upstream) # +1: mips # +2: x86 # +3: arm # +4: armv7 (CV) ArchivePolicy: 9 versions AutoUpdateMode: None UpdateCheckMode: Tags # Only use higher vercode ops, if we do build those arches VercodeOperation: - "%c + 5" CurrentVersion: 1.2.6 CurrentVersionCode: 1030005 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/raw.template.yml0000644000175000017500000000014614620351225021053 0ustar00hanshansLicense: Unknown Summary: Template Description: Template AutoUpdateMode: None UpdateCheckMode: None ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata/souch.smsbypass.yml0000644000175000017500000000323214620351225021613 0ustar00hanshansCategories: - Phone & SMS License: GPL-3.0-only WebSite: https://gitlab.com/souch/SMSbypass SourceCode: https://gitlab.com/souch/SMSbypass/tree/HEAD IssueTracker: https://gitlab.com/souch/SMSbypass/issues Donate: http://rodolphe.souchaud.free.fr/donate FlattrID: cad90e036b975ed129a3ce80a0750466 AutoName: Battery level Summary: Filter SMS and show them in a fake app Description: |- In order to keep away curious eyes, SMS-bypass filters incoming SMS messages before they reach your inbox. Based on bughunter2.smsfilter. Features: * Discrete fake app "Battery level": Long tap on Battery percentage will show SMS. * Filter incoming SMS specified address: redirect the SMS to SMS-bypass messages list; remove SMS arrival sound or vibration; show a discreet notification icon (battery level); vibrate if checked in settings * Add contact from contact list * Export messages to a text file RepoType: git Repo: https://gitlab.com/souch/SMSbypass.git Builds: - versionName: '0.8' versionCode: 5 commit: v0.8 subdir: app gradle: - yes prebuild: sed -i -e '/minSdkVersion/amaxSdkVersion 19\n' build.gradle - versionName: 0.8b versionCode: 6 disable: don't build, just use as template for AUM, correct VC is 8 commit: 2bd6164ff6391906af2af2b484de69a4ff926a01 subdir: app gradle: - yes - versionName: 0.8.1 versionCode: 8 disable: mistagged commit: v0.8.1 subdir: app gradle: - yes - versionName: '0.9' versionCode: 9 commit: v0.9 subdir: app gradle: - yes AutoUpdateMode: Version v%v UpdateCheckMode: Tags CurrentVersion: '0.9' CurrentVersionCode: 9 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9243832 fdroidserver-2.3a1/tests/metadata-rewrite-yml/0000755000175000017500000000000014620351546020210 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata-rewrite-yml/app.with.special.build.params.yml0000644000175000017500000000524214620351225026461 0ustar00hanshansAntiFeatures: - UpstreamNonFree Categories: - System License: GPL-3.0-only SourceCode: https://github.com/loadrunner/Facebook-Contact-Sync IssueTracker: https://github.com/loadrunner/Facebook-Contact-Sync/issues AutoName: UberSync for Facebook Summary: Sync your Facebook Contacts Description: |- To configure, go to "Settings => Accounts & Sync => Add Account". Depending on how many friends you have, the first import might take a while, so be patient. * Facebook does not allow to export phone numbers or emails: only names, pictures and statuses are synced. * Facebook users have the option to block one or all apps: if they opt for that, they will be EXCLUDED from your friends list. Appbrain SDK was removed before building. RepoType: git Repo: https://github.com/loadrunner/Facebook-Contact-Sync.git Builds: - versionName: 1.0.0 versionCode: 32 commit: b3879c973e7cac3a3319 - versionName: 1.0.1 versionCode: 33 commit: 252c8dd4c9 - versionName: 1.2.0 versionCode: 39 commit: v1.2.0 patch: - appbrain.patch srclibs: - FacebookSDK@sdk-version-3.0.1 rm: - libs/appbrain-sdk-android.jar prebuild: - sed -i 's@\(reference.1=\).*@\1$$FacebookSDK$$@' project.properties - sed -i 's/Class\[\]/Class\\[\]/g' $$FacebookSDK$$/src/com/facebook/model/GraphObject.java - versionName: 1.2.2 versionCode: 42 commit: v1.2.2 patch: - appbrain.patch srclibs: - FacebookSDK@sdk-version-3.0.2 rm: - libs/appbrain-sdk-android.jar extlibs: - android/android-support-v4.jar prebuild: - mv libs/android-support-v4.jar $$FacebookSDK$$/libs/ - sed -i 's@\(reference.1=\).*@\1$$FacebookSDK$$@' project.properties - sed -i 's/Class\[\]/Class\\[\]/g' $$FacebookSDK$$/src/com/facebook/model/GraphObject.java - versionName: 2.1.1 versionCode: 48 commit: 2.1.1 patch: - manifest-ads.patch - mobilecore.patch maven: yes srclibs: - FacebookSDK@sdk-version-3.0.2 - versionName: 2.1.1-b versionCode: 49 commit: 2.1.1 patch: - manifest-ads.patch - mobilecore.patch maven: yes@.. srclibs: - FacebookSDK@sdk-version-3.0.2 antifeatures: Tracking: en-US: Uses the Facebook SDK. - versionName: 2.1.1-c versionCode: 50 commit: 2.1.1 patch: - manifest-ads.patch - mobilecore.patch maven: '2' srclibs: - FacebookSDK@sdk-version-3.0.2 - versionName: 2.1.2 versionCode: 51 disable: Labelled as pre-release, so skipped ArchivePolicy: 0 AutoUpdateMode: None UpdateCheckMode: None CurrentVersion: 2.1.2 CurrentVersionCode: 49 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata-rewrite-yml/fake.ota.update.yml0000644000175000017500000000302014620351225023671 0ustar00hanshansCategories: - System License: Apache-2.0 WebSite: https://f-droid.org SourceCode: https://gitlab.com/fdroid/privileged-extension IssueTracker: https://gitlab.com/fdroid/privileged-extension/issues Donate: https://f-droid.org/about AutoName: Fake OTA Update Summary: Tests whether OTA ZIP files are being include Description: |- F-Droid can make use of system privileges or permissions to install, update and remove applications on its own. The only way to obtain those privileges is to become a system app. This is where the Privileged Extension comes in - being a separate app and much smaller, it can be installed as a system app and communicate with the main app via AIDL IPC. This has several advantages: * Reduced disk usage in the system partition * System updates don't remove F-Droid * The process of installing into system via root is safer This is packaged as an OTA (Over-The-Air) update ZIP file. It must be installed using TWRP or other Android recovery that can flash updates to the system from the /data/data/org.fdroid.fdroid folder on the /data partition. The standalone APK is called F-Droid Privileged Extension. RepoType: git Repo: https://gitlab.com/fdroid/privileged-extension.git Builds: - versionName: 0.2.1 versionCode: 2000 commit: 0.2.1 output: app/build/distributions/FDroidPrivilegedExtensionFromBinaries-$$VERSION$$.zip build: gradle assembleUpdateZipFromBinariesDebug AutoUpdateMode: Version %v UpdateCheckMode: Tags CurrentVersion: 0.2.1 CurrentVersionCode: 2000 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata-rewrite-yml/org.fdroid.fdroid.yml0000644000175000017500000004404214620351225024234 0ustar00hanshansCategories: - System License: GPL-3.0-or-later WebSite: https://f-droid.org SourceCode: https://gitlab.com/fdroid/fdroidclient IssueTracker: https://gitlab.com/fdroid/fdroidclient/issues Translation: https://hosted.weblate.org/projects/f-droid/f-droid Changelog: https://gitlab.com/fdroid/fdroidclient/raw/HEAD/CHANGELOG.md Donate: https://f-droid.org/about FlattrID: '343053' Bitcoin: 15u8aAPK4jJ5N8wpWJ5gutAyyeHtKX5i18 AutoName: F-Droid Summary: Application manager Description: |- Connects to F-Droid compatible repositories. The default repo is hosted at f-droid.org, which contains only bona fide FOSS. Android is open in the sense that you are free to install apks from anywhere you wish, but there are many good reasons for using a client/repository setup: * Be notified when updates are available * Keep track of older and beta versions * Filter apps that aren't compatible with the device * Find apps via categories and searchable descriptions * Access associated urls for donations, source code etc. * Stay safe by checking repo index signatures and apk hashes RepoType: srclib Repo: fdroidclient Builds: - versionName: '0.17' versionCode: 8 commit: c626ce5f6d3e10ae15942f01ff028be310cc695a init: rm -f build.xml - versionName: '0.18' versionCode: 9 commit: a6c9ed8d06b19315df9ba9041324f78139f7d238 init: rm -f build.xml - versionName: '0.19' versionCode: 10 commit: 540b7d0522f4d67a4896697f7342e4c75b4cbf59 init: rm -f build.xml - versionName: '0.20' versionCode: 11 commit: ddacfb856ad66c1c367e20c9cbecbfb15fe00813 init: rm -f build.xml - versionName: '0.21' versionCode: 12 commit: 49fa56aa6626a190f2d711120b69e435e9e615b1 init: rm -f build.xml - versionName: '0.22' versionCode: 13 commit: a6a33c942495cc4c74a7cb6e968efe0e00815e68 init: rm -f build.xml - versionName: '0.23' versionCode: 14 commit: aa58a8aad1a1c3832eafb9f1bdd6db8292d2c172 init: rm -f build.xml - versionName: '0.24' versionCode: 15 commit: 9b5fe2976443255b95027abd412f1c1e7f3d27b2 init: rm -f build.xml - versionName: '0.25' versionCode: 16 commit: 43977cc493e47a4dc841c4192ae8a40fb14b639b init: rm -f build.xml - versionName: '0.28' versionCode: 19 commit: f881aabe5bd0ac94771b03f1318a6e0972ab4128 target: android-15 - versionName: '0.29' versionCode: 20 commit: 87b229b95d0909bfd05c65c5670794e743626f6c target: android-15 - versionName: '0.30' versionCode: 21 commit: 497cb19840f79b31ae9590f5abd9e4df832b34ee target: android-15 - versionName: '0.31' versionCode: 22 commit: f99f8a544c7cb4d4a48ad09da00ad281af05f2ac target: android-15 - versionName: '0.32' versionCode: 23 commit: cc3970cc243e345416bfc62781ece6eeefd11495 target: android-15 - versionName: '0.33' versionCode: 24 commit: 58eb580159aa4d54767f0af1736cad233fec2475 target: android-15 - versionName: 0.34-test versionCode: 25 commit: 335d27b725b0f92e9e8804ae09518cd47bc7b021 target: android-15 - versionName: 0.35-test versionCode: 26 commit: a06d18b029392669e98359f86c07e442a04e6a13 target: android-15 - versionName: 0.36-test versionCode: 27 commit: 647e230c9e888c04bb0554078c5aa81da63548a0 target: android-15 - versionName: 0.37-test versionCode: 28 commit: 3c02e3ccc147a34af42cedf7d85f18dc75c8efa8 target: android-15 - versionName: '0.38' versionCode: 38 commit: 99b52c988d203811f434d6ac40675a63d5ae41ab target: android-15 - versionName: 0.39-test versionCode: 39 commit: 9a7d0b9f10710105d51d8206a7faa4408c60c20d target: android-15 - versionName: '0.40' versionCode: 40 commit: 51a67efdf1ee2819bee99d9263b2980dafaf761d target: android-15 - versionName: '0.42' versionCode: 42 commit: 36b815095ef51ca4f21887d973dbc0a50575cd65 target: android-15 - versionName: '0.43' versionCode: 43 disable: sdk doesn't like tzm (at f2109e4e0bf1597c625221d8d2d10050f146ba5a) commit: f2109e4e0bf1597c625221d8d2d10050f146ba5a target: android-15 - versionName: '0.44' versionCode: 44 disable: nasty upgrade bug commit: '0.44' target: android-15 - versionName: '0.45' versionCode: 45 commit: '0.45' target: android-15 - versionName: '0.46' versionCode: 46 commit: '0.46' target: android-15 - versionName: 0.47-test versionCode: 47 commit: 0.47-test target: android-17 - versionName: 0.48-test versionCode: 48 commit: 0.48-test target: android-17 - versionName: '0.50' versionCode: 50 commit: '0.50' - versionName: 0.51-test versionCode: 51 commit: 0.51-test - versionName: 0.52-test versionCode: 52 commit: 0.52-test submodules: true prebuild: rm -rf extern/Universal-Image-Loader/downloads androidupdate: - . - extern/Universal-Image-Loader/library - versionName: 0.53-test versionCode: 53 commit: 0.53-test submodules: true scandelete: - yes - versionName: '0.54' versionCode: 540 commit: '0.54' submodules: true scandelete: - yes - versionName: '0.55' versionCode: 550 commit: '0.55' submodules: true - versionName: 0.56-test versionCode: 560 commit: 0.56-test submodules: true - versionName: 0.57-test versionCode: 570 commit: 0.57-test submodules: true - versionName: '0.58' versionCode: 580 commit: '0.58' submodules: true - versionName: 0.59-test versionCode: 590 commit: 0.59-test submodules: true - versionName: 0.61-test versionCode: 610 commit: 0.61-test submodules: true - versionName: '0.62' versionCode: 620 commit: '0.62' submodules: true - versionName: '0.63' versionCode: 630 commit: '0.63' submodules: true - versionName: 0.64-test versionCode: 640 commit: 0.64-test submodules: true - versionName: '0.65' versionCode: 650 commit: '0.65' submodules: true - versionName: '0.66' versionCode: 660 commit: '0.66' submodules: true - versionName: 0.67-test versionCode: 670 commit: 0.67-test submodules: true - versionName: 0.68-test versionCode: 680 commit: 0.68-test submodules: true - versionName: 0.69-test versionCode: 690 commit: 0.69-test submodules: true - versionName: 0.70-test versionCode: 700 commit: 0.70-test submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: '0.71' versionCode: 710 disable: Broken MTM/AndroidPinning commit: '0.71' submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: '0.72' versionCode: 720 disable: proguard issues commit: '0.72' submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: '0.73' versionCode: 730 disable: local repos broken commit: '0.73' submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: '0.74' versionCode: 740 disable: still some proguard issues commit: '0.74' submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: '0.75' versionCode: 750 disable: repo update progress crasher commit: '0.75' submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: '0.76' versionCode: 760 commit: '0.76' submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: 0.77-test versionCode: 770 commit: 0.77-test subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: '0.78' versionCode: 780 commit: '0.78' subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: 0.79-test versionCode: 790 commit: 0.79-test subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: 0.80-test versionCode: 800 commit: 0.80-test subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: 0.81-test versionCode: 810 commit: 0.81-test subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: '0.82' versionCode: 820 commit: '0.82' subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: '0.83' versionCode: 830 commit: '0.83' subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: 0.84-test versionCode: 840 commit: 0.84-test subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: 0.85-test versionCode: 850 commit: 0.85-test subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: 0.86-test versionCode: 860 commit: 0.86-test subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: 0.87-test versionCode: 870 commit: 0.87-test subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: '0.88' versionCode: 880 commit: '0.88' subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: 0.89-test versionCode: 890 commit: 0.89-test subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: 0.90-test versionCode: 900 commit: 0.90-test subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: '0.91' versionCode: 910 commit: '0.91' subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: '0.92' versionCode: 920 commit: '0.92' subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: 0.93-test versionCode: 930 commit: 0.93-test subdir: F-Droid submodules: true prebuild: ./ant-prepare.sh androidupdate: - . - versionName: 0.94-test versionCode: 940 commit: 0.94-test subdir: F-Droid submodules: true gradle: - yes - versionName: 0.95-alpha1 versionCode: 95001 commit: 0.95-alpha1 subdir: F-Droid submodules: true gradle: - yes - versionName: 0.95-alpha2 versionCode: 95002 commit: v0.95-alpha2 subdir: F-Droid submodules: true gradle: - yes - versionName: '0.95' versionCode: 95050 commit: v0.95 subdir: F-Droid submodules: true gradle: - yes - versionName: 0.95.1 versionCode: 95150 commit: v0.95.1 subdir: F-Droid submodules: true gradle: - yes - versionName: 0.96-alpha1 versionCode: 96001 commit: v0.96-alpha1 subdir: F-Droid gradle: - yes - versionName: 0.96-alpha2 versionCode: 96002 commit: v0.96-alpha2 subdir: F-Droid gradle: - yes - versionName: 0.96-alpha3 versionCode: 96003 commit: v0.96-alpha3 subdir: F-Droid gradle: - yes - versionName: 0.96-alpha4 versionCode: 96004 commit: v0.96-alpha4 subdir: F-Droid gradle: - yes - versionName: 0.96-alpha5 versionCode: 96005 commit: v0.96-alpha5 subdir: F-Droid gradle: - yes - versionName: 0.96-alpha6 versionCode: 96006 commit: v0.96-alpha6 subdir: F-Droid gradle: - yes - versionName: '0.96' versionCode: 96050 commit: v0.96 subdir: F-Droid gradle: - yes scanignore: - extern/AndroidPinning/res/raw/cacerts - versionName: 0.96.1 versionCode: 96150 commit: v0.96.1 subdir: F-Droid gradle: - yes scanignore: - extern/AndroidPinning/res/raw/cacerts - versionName: 0.97-alpha1 versionCode: 97001 commit: v0.97-alpha1 subdir: F-Droid gradle: - yes scanignore: - extern/AndroidPinning/res/raw/cacerts - versionName: 0.97-alpha2 versionCode: 97002 commit: v0.97-alpha2 subdir: F-Droid gradle: - yes - versionName: 0.97-alpha3 versionCode: 97003 commit: v0.97-alpha3 subdir: F-Droid gradle: - yes - versionName: 0.97-alpha4 versionCode: 97004 commit: v0.97-alpha4 subdir: F-Droid gradle: - yes - versionName: 0.97-alpha5 versionCode: 97005 commit: v0.97-alpha5 subdir: F-Droid gradle: - yes - versionName: 0.97-alpha6 versionCode: 97006 commit: v0.97-alpha6 subdir: F-Droid gradle: - yes - versionName: 0.97-alpha7 versionCode: 97007 commit: v0.97-alpha7 subdir: F-Droid gradle: - yes - versionName: 0.97-alpha8 versionCode: 97008 commit: v0.97-alpha8 subdir: F-Droid gradle: - yes - versionName: '0.97' versionCode: 97050 commit: v0.97 subdir: F-Droid gradle: - yes - versionName: 0.98-alpha1 versionCode: 98001 commit: v0.98-alpha1 subdir: F-Droid gradle: - yes - versionName: 0.98-alpha2 versionCode: 98002 commit: v0.98-alpha2 subdir: F-Droid gradle: - yes - versionName: 0.98-alpha3 versionCode: 98003 commit: v0.98-alpha3 subdir: F-Droid gradle: - yes - versionName: 0.98-alpha4 versionCode: 98004 commit: v0.98-alpha4 subdir: F-Droid gradle: - yes - versionName: 0.98-alpha5 versionCode: 98005 commit: v0.98-alpha5 subdir: F-Droid gradle: - yes - versionName: 0.98-alpha6 versionCode: 98006 commit: v0.98-alpha6 subdir: F-Droid gradle: - yes - versionName: 0.98-alpha7 versionCode: 98007 commit: v0.98-alpha7 subdir: F-Droid gradle: - yes - versionName: '0.98' versionCode: 98050 commit: v0.98 subdir: F-Droid gradle: - yes - versionName: 0.98.1 versionCode: 98150 commit: v0.98.1 subdir: F-Droid gradle: - yes - versionName: 0.99-alpha1 versionCode: 99001 commit: v0.99-alpha1 subdir: F-Droid gradle: - yes - versionName: 0.99-alpha2 versionCode: 99002 commit: v0.99-alpha2 subdir: F-Droid gradle: - yes - versionName: '0.99' versionCode: 99050 commit: v0.99 subdir: F-Droid gradle: - yes - versionName: 0.99.1 versionCode: 99150 commit: v0.99.1 subdir: F-Droid gradle: - yes - versionName: 0.99.2 versionCode: 99250 commit: v0.99.2 subdir: F-Droid gradle: - yes - versionName: 0.100-alpha1 versionCode: 100001 commit: v0.100-alpha1 subdir: F-Droid gradle: - yes - versionName: 0.100-alpha2 versionCode: 100002 commit: v0.100-alpha2 subdir: F-Droid gradle: - yes - versionName: 0.100-alpha3 versionCode: 100003 commit: v0.100-alpha3 subdir: app gradle: - yes - versionName: 0.100-alpha4 versionCode: 100004 commit: v0.100-alpha4 subdir: app gradle: - yes - versionName: 0.100-alpha5 versionCode: 100005 commit: v0.100-alpha5 subdir: app gradle: - yes - versionName: 0.100-alpha6 versionCode: 100006 commit: v0.100-alpha6 subdir: app gradle: - yes - versionName: 0.100-alpha7 versionCode: 100007 commit: v0.100-alpha7 subdir: app gradle: - yes - versionName: 0.100-alpha8 versionCode: 100008 commit: v0.100-alpha8 subdir: app gradle: - yes - versionName: '0.100' versionCode: 100050 commit: v0.100 subdir: app gradle: - yes - versionName: 0.100.1 versionCode: 100150 commit: v0.100.1 subdir: app gradle: - yes - versionName: 0.101-alpha1 versionCode: 101001 commit: v0.101-alpha1 subdir: app gradle: - yes - versionName: 0.101-alpha2 versionCode: 101002 commit: v0.101-alpha2 subdir: app gradle: - yes - versionName: 0.101-alpha3 versionCode: 101003 commit: v0.101-alpha3 subdir: app gradle: - yes - versionName: 0.101-alpha4 versionCode: 101004 commit: v0.101-alpha4 subdir: app gradle: - yes - versionName: 0.101-alpha5 versionCode: 101005 commit: v0.101-alpha5 subdir: app gradle: - yes - versionName: 0.101-alpha6 versionCode: 101006 commit: v0.101-alpha6 subdir: app gradle: - yes - versionName: '0.101' versionCode: 101050 commit: v0.101 subdir: app gradle: - yes - versionName: 0.102-alpha1 versionCode: 102001 commit: v0.102-alpha1 subdir: app gradle: - yes - versionName: 0.102-alpha2 versionCode: 102002 commit: v0.102-alpha2 subdir: app gradle: - yes - versionName: 0.102-alpha3 versionCode: 102003 commit: v0.102-alpha3 subdir: app gradle: - yes - versionName: '0.102' versionCode: 102050 commit: v0.102 subdir: app gradle: - yes - versionName: 0.102.1 versionCode: 102150 commit: v0.102.1 subdir: app gradle: - yes - versionName: 0.102.2 versionCode: 102250 commit: v0.102.2 subdir: app gradle: - yes - versionName: 0.102.3 versionCode: 102350 commit: v0.102.3 subdir: app gradle: - yes - versionName: 0.103-alpha1 versionCode: 103001 commit: v0.103-alpha1 subdir: app gradle: - yes - versionName: 0.103-alpha2 versionCode: 103002 commit: v0.103-alpha2 subdir: app gradle: - yes - versionName: 0.103-alpha3 versionCode: 103003 commit: v0.103-alpha3 subdir: app gradle: - yes ArchivePolicy: 12 AutoUpdateMode: None UpdateCheckMode: Static CurrentVersion: 0.102.3 CurrentVersionCode: 102350 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/metadata.TestCase0000755000175000017500000027223714620351225017401 0ustar00hanshans#!/usr/bin/env python3 import copy import io import logging import os import random import ruamel.yaml import shutil import sys import unittest import tempfile import textwrap from collections import OrderedDict from pathlib import Path from unittest import mock localmodule = Path(__file__).resolve().parent.parent print('localmodule: ' + str(localmodule)) if localmodule not in sys.path: sys.path.insert(0, str(localmodule)) import fdroidserver from fdroidserver import metadata from fdroidserver.exception import MetaDataException from fdroidserver.common import DEFAULT_LOCALE from testcommon import TmpCwd, mkdtemp, parse_args_for_test def _get_mock_mf(s): mf = io.StringIO(s) mf.name = 'mock_filename.yaml' return mf class MetadataTest(unittest.TestCase): '''fdroidserver/metadata.py''' def setUp(self): logging.basicConfig(level=logging.DEBUG) self.basedir = localmodule / 'tests' os.chdir(self.basedir) self._td = mkdtemp() self.testdir = self._td.name fdroidserver.metadata.warnings_action = 'error' def tearDown(self): # auto-generated dirs by functions, not tests, so they are not always cleaned up self._td.cleanup() try: os.rmdir("srclibs") except OSError: pass try: os.rmdir("tmp") except OSError: pass def test_fieldtypes_key_exist(self): for k in fdroidserver.metadata.fieldtypes.keys(): self.assertTrue(k in fdroidserver.metadata.yaml_app_fields) def test_build_flagtypes_key_exist(self): for k in fdroidserver.metadata.flagtypes.keys(): self.assertTrue(k in fdroidserver.metadata.build_flags) def test_FieldValidator_BitcoinAddress(self): validator = None for vali in fdroidserver.metadata.valuetypes: if vali.name == 'Bitcoin address': validator = vali break self.assertIsNotNone(validator, "could not find 'Bitcoin address' validator") # some valid addresses (P2PKH, P2SH, Bech32) self.assertIsNone( validator.check('1BrrrrErsrWetrTrnrrrrm4GFg7xJaNVN2', 'fake.app.id') ) self.assertIsNone( validator.check('3JrrrrWrEZr3rNrrvrecrnyirrnqRhWNLy', 'fake.app.id') ) self.assertIsNone( validator.check('bc1qar0srrr7xrkvr5lr43lrdnwrre5rgtrzrf5rrq', 'fake.app.id') ) # some invalid addresses self.assertRaises( fdroidserver.exception.MetaDataException, validator.check, '21BvMrSYsrWrtrrlL5A10mlGFr7rrarrN2', 'fake.app.id', ) self.assertRaises( fdroidserver.exception.MetaDataException, validator.check, '5Hrgr3ur5rGLrfKrrrrrrHSrqJrroGrrzrQrrrrrrLNrsrDrrrA', 'fake.app.id', ) self.assertRaises( fdroidserver.exception.MetaDataException, validator.check, '92rr46rUrgTrrromrVrirW6r1rrrdrerrdbJrrrhrCsYrrrrrrc', 'fake.app.id', ) self.assertRaises( fdroidserver.exception.MetaDataException, validator.check, 'K1BvMrSYsrWrtrrrn5Au4m4GFr7rrarrN2', 'fake.app.id', ) self.assertRaises( fdroidserver.exception.MetaDataException, validator.check, 'L1BvMrSYsrWrtrrrn5Au4m4GFr7rrarrN2', 'fake.app.id', ) self.assertRaises( fdroidserver.exception.MetaDataException, validator.check, 'tb1qw5r8drrejxrrg4y5rrrrrraryrrrrwrkxrjrsx', 'fake.app.id', ) def test_FieldValidator_LitecoinAddress(self): validator = None for vali in fdroidserver.metadata.valuetypes: if vali.name == 'Litecoin address': validator = vali break self.assertIsNotNone(validator, "could not find 'Litecoin address' validator") # some valid addresses (L, M, 3, segwit) self.assertIsNone( validator.check('LgeGrrrrJAxyXprrPrrBrrX5Qrrrrrrrrd', 'fake.app.id') ) self.assertIsNone( validator.check('MrrrrrrrJAxyXpanPtrrRAX5QHxvUJo8id', 'fake.app.id') ) self.assertIsNone(validator.check('3rereVr9rAryrranrrrrrAXrrHx', 'fake.app.id')) self.assertIsNone( validator.check( 'ltc1q7euacwhn6ef99vcfa57mute92q572aqsc4c2j5', 'fake.app.id' ) ) # some invalid addresses (various special use/testnet addresses, invalid chars) self.assertRaises( fdroidserver.exception.MetaDataException, validator.check, '21BvMrSYsrWrtrrrn5Au4l4GFr7rrarrN2', 'fake.app.id', ) self.assertRaises( fdroidserver.exception.MetaDataException, validator.check, '5Hrgr3ur5rGLrfKrrrrrr1SrqJrroGrrzrQrrrrrrLNrsrDrrrA', 'fake.app.id', ) self.assertRaises( fdroidserver.exception.MetaDataException, validator.check, '92rr46rUrgTrrromrVrirW6r1rrrdrerrdbJrrrhrCsYrrrrrrc', 'fake.app.id', ) self.assertRaises( fdroidserver.exception.MetaDataException, validator.check, 'K1BvMrSYsrWrtrrrn5Au4m4GFr7rrarrN2', 'fake.app.id', ) self.assertRaises( fdroidserver.exception.MetaDataException, validator.check, 'L0000rSYsrWrtrrrn5Au4m4GFr7rrarrN2', 'fake.app.id', ) self.assertRaises( fdroidserver.exception.MetaDataException, validator.check, 'tb1qw5r8drrejxrrg4y5rrrrrraryrrrrwrkxrjrsx', 'fake.app.id', ) def test_valid_funding_yml_regex(self): """Check the regex can find all the cases""" with (self.basedir / 'funding-usernames.yaml').open() as fp: yaml = ruamel.yaml.YAML(typ='safe') data = yaml.load(fp) for k, entries in data.items(): for entry in entries: m = fdroidserver.metadata.VALID_USERNAME_REGEX.match(entry) if k == 'custom': pass elif k == 'bad': self.assertIsNone( m, 'this is an invalid %s username: {%s}' % (k, entry) ) else: self.assertIsNotNone( m, 'this is a valid %s username: {%s}' % (k, entry) ) @mock.patch('git.Repo') @mock.patch('logging.error') def test_read_metadata(self, logging_error, git_repo): """Read specified metadata files included in tests/, compare to stored output""" self.maxDiff = None config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.metadata.warnings_action = None yaml = ruamel.yaml.YAML(typ='safe') apps = fdroidserver.metadata.read_metadata() for appid in ( 'app.with.special.build.params', 'org.smssecure.smssecure', 'org.adaway', 'org.videolan.vlc', 'com.politedroid', ): savepath = Path('metadata/dump') / (appid + '.yaml') frommeta = dict(apps[appid]) self.assertTrue(appid in apps) with savepath.open('r') as f: from_yaml = yaml.load(f) self.assertEqual(frommeta, from_yaml) # comment above assert and uncomment below to update test # files when new metadata fields are added # with savepath.open('w') as fp: # yaml.default_flow_style = False # yaml.register_class(metadata.Build) # yaml.dump(frommeta, fp) # errors are printed when .yml overrides localized logging_error.assert_called() self.assertEqual(3, len(logging_error.call_args_list)) @mock.patch('git.Repo') def test_metadata_overrides_dot_fdroid_yml(self, git_Repo): """Fields in metadata files should override anything in .fdroid.yml.""" app = metadata.parse_metadata('metadata/info.guardianproject.urzip.yml') self.assertEqual(app['Summary'], '一个实用工具,获取已安装在您的设备上的应用的有关信息') def test_dot_fdroid_yml_works_without_git(self): """Parsing should work if .fdroid.yml is present and it is not a git repo.""" os.chdir(self.testdir) yml = Path('metadata/test.yml') yml.parent.mkdir() with yml.open('w') as fp: fp.write('Repo: https://example.com/not/git/or/anything') fdroid_yml = Path('build/test/.fdroid.yml') fdroid_yml.parent.mkdir(parents=True) with fdroid_yml.open('w') as fp: fp.write('OpenCollective: test') metadata.parse_metadata(yml) # should not throw an exception @mock.patch('git.Repo') @mock.patch('logging.error') def test_rewrite_yaml_fakeotaupdate(self, logging_error, git_Repo): with tempfile.TemporaryDirectory() as testdir: testdir = Path(testdir) fdroidserver.common.config = {'accepted_formats': ['yml']} fdroidserver.metadata.warnings_action = None # rewrite metadata allapps = fdroidserver.metadata.read_metadata() for appid, app in allapps.items(): if appid == 'fake.ota.update': fdroidserver.metadata.write_metadata( testdir / (appid + '.yml'), app ) # assert rewrite result self.maxDiff = None file_name = 'fake.ota.update.yml' self.assertEqual( (testdir / file_name).read_text(encoding='utf-8'), (Path('metadata-rewrite-yml') / file_name).read_text(encoding='utf-8'), ) # errors are printed when .yml overrides localized logging_error.assert_called() self.assertEqual(3, len(logging_error.call_args_list)) @mock.patch('git.Repo') def test_rewrite_yaml_fdroidclient(self, git_Repo): with tempfile.TemporaryDirectory() as testdir: testdir = Path(testdir) fdroidserver.common.config = {'accepted_formats': ['yml']} # rewrite metadata allapps = fdroidserver.metadata.read_metadata() for appid, app in allapps.items(): if appid == 'org.fdroid.fdroid': fdroidserver.metadata.write_metadata( testdir / (appid + '.yml'), app ) # assert rewrite result self.maxDiff = None file_name = 'org.fdroid.fdroid.yml' self.assertEqual( (testdir / file_name).read_text(encoding='utf-8'), (Path('metadata-rewrite-yml') / file_name).read_text(encoding='utf-8'), ) @mock.patch('git.Repo') def test_rewrite_yaml_special_build_params(self, git_Repo): """Test rewriting a plain YAML metadata file without localized files.""" os.chdir(self.testdir) os.mkdir('metadata') appid = 'app.with.special.build.params' file_name = Path('metadata/%s.yml' % appid) shutil.copy(self.basedir / file_name, file_name) # rewrite metadata allapps = fdroidserver.metadata.read_metadata({appid: -1}) for appid, app in allapps.items(): metadata.write_metadata(file_name, app) # assert rewrite result self.maxDiff = None self.assertEqual( file_name.read_text(), (self.basedir / 'metadata-rewrite-yml' / file_name.name).read_text(), ) def test_normalize_type_string(self): """TYPE_STRING currently has some quirky behavior.""" self.assertEqual('123456', metadata._normalize_type_string(123456)) self.assertEqual('1.0', metadata._normalize_type_string(1.0)) self.assertEqual('0', metadata._normalize_type_string(0)) self.assertEqual('0.0', metadata._normalize_type_string(0.0)) self.assertEqual('0.1', metadata._normalize_type_string(0.1)) self.assertEqual('[]', metadata._normalize_type_string(list())) self.assertEqual('{}', metadata._normalize_type_string(dict())) self.assertEqual('false', metadata._normalize_type_string(False)) self.assertEqual('true', metadata._normalize_type_string(True)) def test_normalize_type_string_sha256(self): """SHA-256 values are TYPE_STRING, which YAML can parse as decimal ints.""" yaml = ruamel.yaml.YAML(typ='safe') for v in range(1, 1000): s = '%064d' % (v * (10**51)) self.assertEqual(s, metadata._normalize_type_string(yaml.load(s))) def test_normalize_type_stringmap_none(self): self.assertEqual(dict(), metadata._normalize_type_stringmap('key', None)) def test_normalize_type_stringmap_empty_list(self): self.assertEqual(dict(), metadata._normalize_type_stringmap('AntiFeatures', [])) def test_normalize_type_stringmap_simple_list_format(self): self.assertEqual( {'Ads': {}, 'Tracking': {}}, metadata._normalize_type_stringmap('AntiFeatures', ['Ads', 'Tracking']), ) def test_normalize_type_int(self): """TYPE_INT should be an int whenever possible.""" self.assertEqual(0, metadata._normalize_type_int('key', 0)) self.assertEqual(1, metadata._normalize_type_int('key', 1)) self.assertEqual(-5, metadata._normalize_type_int('key', -5)) self.assertEqual(0, metadata._normalize_type_int('key', '0')) self.assertEqual(1, metadata._normalize_type_int('key', '1')) self.assertEqual(-5, metadata._normalize_type_int('key', '-5')) self.assertEqual( 12345678901234567890, metadata._normalize_type_int('key', 12345678901234567890), ) def test_normalize_type_int_fails(self): with self.assertRaises(MetaDataException): metadata._normalize_type_int('key', '1a') with self.assertRaises(MetaDataException): metadata._normalize_type_int('key', 1.1) with self.assertRaises(MetaDataException): metadata._normalize_type_int('key', True) def test_normalize_type_list(self): """TYPE_LIST is always a list of strings, no matter what YAML thinks.""" k = 'placeholder' yaml = ruamel.yaml.YAML(typ='safe') self.assertEqual(['1.0'], metadata._normalize_type_list(k, 1.0)) self.assertEqual(['1234567890'], metadata._normalize_type_list(k, 1234567890)) self.assertEqual(['false'], metadata._normalize_type_list(k, False)) self.assertEqual(['true'], metadata._normalize_type_list(k, True)) self.assertEqual(['foo'], metadata._normalize_type_list(k, 'foo')) self.assertEqual([], metadata._normalize_type_list(k, list())) self.assertEqual([], metadata._normalize_type_list(k, tuple())) self.assertEqual([], metadata._normalize_type_list(k, set())) self.assertEqual(['0', '1', '2'], metadata._normalize_type_list(k, {0, 1, 2})) self.assertEqual( ['a', 'b', 'c', '0', '0.0'], metadata._normalize_type_list(k, yaml.load('[a, b, c, 0, 0.0]')), ) self.assertEqual( ['1', '1.0', 's', 'true', '{}'], metadata._normalize_type_list(k, yaml.load('[1, 1.0, s, true, {}]')), ) self.assertEqual( ['1', '1.0', 's', 'true', '{}'], metadata._normalize_type_list(k, (1, 1.0, 's', True, dict())), ) def test_normalize_type_list_fails(self): with self.assertRaises(MetaDataException): metadata._normalize_type_list('placeholder', dict()) def test_post_parse_yaml_metadata(self): yamldata = dict() metadata.post_parse_yaml_metadata(yamldata) yamldata[ 'AllowedAPKSigningKeys' ] = 'c03dac71394d6c26766f1b04d3e31cfcac5d03b55d8aa40cc9b9fa6b74354c66' metadata.post_parse_yaml_metadata(yamldata) def test_post_parse_yaml_metadata_ArchivePolicy_int(self): for i in range(20): yamldata = {'ArchivePolicy': i} metadata.post_parse_yaml_metadata(yamldata) self.assertEqual(i, yamldata['ArchivePolicy']) def test_post_parse_yaml_metadata_ArchivePolicy_string(self): for i in range(20): yamldata = {'ArchivePolicy': '%d' % i} metadata.post_parse_yaml_metadata(yamldata) self.assertEqual(i, yamldata['ArchivePolicy']) def test_post_parse_yaml_metadata_ArchivePolicy_versions(self): """Test that the old format still works.""" for i in range(20): yamldata = {'ArchivePolicy': '%d versions' % i} metadata.post_parse_yaml_metadata(yamldata) self.assertEqual(i, yamldata['ArchivePolicy']) def test_post_parse_yaml_metadata_fails(self): yamldata = {'AllowedAPKSigningKeys': {'bad': 'dict-placement'}} with self.assertRaises(MetaDataException): metadata.post_parse_yaml_metadata(yamldata) def test_post_parse_yaml_metadata_0padding_sha256(self): """SHA-256 values are strings, but YAML 1.2 will read some as decimal ints.""" v = '0027293472934293872934729834729834729834729834792837487293847926' yaml = ruamel.yaml.YAML(typ='safe') yamldata = yaml.load('AllowedAPKSigningKeys: ' + v) metadata.post_parse_yaml_metadata(yamldata) self.assertEqual(yamldata['AllowedAPKSigningKeys'], [v]) def test_post_parse_yaml_metadata_builds(self): yamldata = OrderedDict() builds = [] yamldata['Builds'] = builds build = OrderedDict() builds.append(build) build['versionCode'] = 1.1 self.assertRaises( fdroidserver.exception.MetaDataException, fdroidserver.metadata.post_parse_yaml_metadata, yamldata, ) build['versionCode'] = '1a' self.assertRaises( fdroidserver.exception.MetaDataException, fdroidserver.metadata.post_parse_yaml_metadata, yamldata, ) build['versionCode'] = 1 build['versionName'] = 1 fdroidserver.metadata.post_parse_yaml_metadata(yamldata) self.assertNotEqual(1, yamldata['Builds'][0]['versionName']) self.assertEqual('1', yamldata['Builds'][0]['versionName']) self.assertEqual(1, yamldata['Builds'][0]['versionCode']) build['versionName'] = 1.0 fdroidserver.metadata.post_parse_yaml_metadata(yamldata) self.assertNotEqual(1.0, yamldata['Builds'][0]['versionName']) self.assertEqual('1.0', yamldata['Builds'][0]['versionName']) build['commit'] = 1.0 fdroidserver.metadata.post_parse_yaml_metadata(yamldata) self.assertNotEqual(1.0, yamldata['Builds'][0]['commit']) self.assertEqual('1.0', yamldata['Builds'][0]['commit']) teststr = '98234fab134b' build['commit'] = teststr fdroidserver.metadata.post_parse_yaml_metadata(yamldata) self.assertEqual(teststr, yamldata['Builds'][0]['commit']) testcommitid = 1234567890 build['commit'] = testcommitid fdroidserver.metadata.post_parse_yaml_metadata(yamldata) self.assertNotEqual(testcommitid, yamldata['Builds'][0]['commit']) self.assertEqual('1234567890', yamldata['Builds'][0]['commit']) def test_read_metadata_sort_by_time(self): with tempfile.TemporaryDirectory() as testdir, TmpCwd(testdir): testdir = Path(testdir) metadatadir = testdir / 'metadata' metadatadir.mkdir() randomlist = [] randomapps = list((self.basedir / 'metadata').glob('*.yml')) random.shuffle(randomapps) i = 1 for f in randomapps: shutil.copy(f, metadatadir) new = metadatadir / f.name stat = new.stat() os.utime(new, (stat.st_ctime, stat.st_mtime + i)) # prepend new item so newest is always first randomlist = [f.stem] + randomlist i += 1 allapps = fdroidserver.metadata.read_metadata(sort_by_time=True) allappids = [] for appid, app in allapps.items(): allappids.append(appid) self.assertEqual(randomlist, allappids) def test_parse_yaml_metadata_0size_file(self): self.assertEqual(dict(), metadata.parse_yaml_metadata(_get_mock_mf(''))) def test_parse_yaml_metadata_empty_dict_file(self): self.assertEqual(dict(), metadata.parse_yaml_metadata(_get_mock_mf('{}'))) def test_parse_yaml_metadata_empty_string_file(self): self.assertEqual(dict(), metadata.parse_yaml_metadata(_get_mock_mf('""'))) def test_parse_yaml_metadata_fail_on_root_list(self): with self.assertRaises(MetaDataException): metadata.parse_yaml_metadata(_get_mock_mf('-')) with self.assertRaises(MetaDataException): metadata.parse_yaml_metadata(_get_mock_mf('[]')) with self.assertRaises(MetaDataException): metadata.parse_yaml_metadata(_get_mock_mf('- AutoName: fake')) def test_parse_yaml_metadata_type_list_str(self): v = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' mf = _get_mock_mf('AllowedAPKSigningKeys: "%s"' % v) self.assertEqual( v, metadata.parse_yaml_metadata(mf)['AllowedAPKSigningKeys'][0], ) def test_parse_yaml_metadata_type_list_build_str(self): mf = _get_mock_mf('Builds: [{versionCode: 1, rm: s}]') self.assertEqual( metadata.parse_yaml_metadata(mf), {'Builds': [{'rm': ['s'], 'versionCode': 1}]}, ) def test_parse_yaml_metadata_app_type_list_fails(self): mf = _get_mock_mf('AllowedAPKSigningKeys: {t: f}') with self.assertRaises(MetaDataException): metadata.parse_yaml_metadata(mf) def test_parse_yaml_metadata_build_type_list_fails(self): mf = _get_mock_mf('Builds: [{versionCode: 1, rm: {bad: dict-placement}}]') with self.assertRaises(MetaDataException): metadata.parse_yaml_metadata(mf) def test_parse_yaml_metadata_unknown_app_field(self): mf = io.StringIO( textwrap.dedent( """\ AutoName: F-Droid RepoType: git Builds: [] bad: value""" ) ) mf.name = 'mock_filename.yaml' with self.assertRaises(MetaDataException): fdroidserver.metadata.parse_yaml_metadata(mf) def test_parse_yaml_metadata_unknown_build_flag(self): mf = io.StringIO( textwrap.dedent( """\ AutoName: F-Droid RepoType: git Builds: - bad: value""" ) ) mf.name = 'mock_filename.yaml' with self.assertRaises(MetaDataException): fdroidserver.metadata.parse_yaml_metadata(mf) @mock.patch('logging.warning') @mock.patch('logging.error') def test_parse_yaml_metadata_continue_on_warning(self, _error, _warning): """When errors are disabled, parsing should provide something that can work. When errors are disabled, then it should try to give data that lets something happen. A zero-length file is valid for operation, it just declares a Application ID as "known" and nothing else. This example gives a list as the base in the .yml file, which is unparsable, so it gives a warning message and carries on with a blank dict. """ fdroidserver.metadata.warnings_action = None mf = _get_mock_mf('[AntiFeatures: Tracking]') self.assertEqual(fdroidserver.metadata.parse_yaml_metadata(mf), dict()) _warning.assert_called_once() _error.assert_called_once() def test_parse_localized_antifeatures(self): """Unit test based on reading files included in the test repo.""" app = dict() app['id'] = 'app.with.special.build.params' metadata.parse_localized_antifeatures(app) self.maxDiff = None self.assertEqual( app, { 'AntiFeatures': { 'Ads': {'en-US': 'please no'}, 'NoSourceSince': {'en-US': 'no activity\n'}, }, 'Builds': [ { 'versionCode': 50, 'antifeatures': { 'Ads': { 'en-US': 'includes ad lib\n', 'zh-CN': '包括广告图书馆\n', }, 'Tracking': {'en-US': 'standard suspects\n'}, }, }, { 'versionCode': 49, 'antifeatures': { 'Tracking': {'zh-CN': 'Text from zh-CN/49_Tracking.txt'}, }, }, ], 'id': app['id'], }, ) def test_parse_localized_antifeatures_passthrough(self): """Test app values are cleanly passed through if no localized files.""" before = { 'id': 'placeholder', 'AntiFeatures': {'NonFreeDep': {}}, 'Builds': [{'versionCode': 999, 'antifeatures': {'zero': {}, 'one': {}}}], } after = copy.deepcopy(before) with tempfile.TemporaryDirectory() as testdir: os.chdir(testdir) os.mkdir('metadata') os.mkdir(os.path.join('metadata', after['id'])) metadata.parse_localized_antifeatures(after) self.assertEqual(before, after) def test_parse_metadata_antifeatures_NoSourceSince(self): """Test that NoSourceSince gets added as an Anti-Feature.""" os.chdir(self.testdir) yml = Path('metadata/test.yml') yml.parent.mkdir() with yml.open('w') as fp: fp.write('AntiFeatures: Ads\nNoSourceSince: gone\n') app = metadata.parse_metadata(yml) self.assertEqual( app['AntiFeatures'], {'Ads': {}, 'NoSourceSince': {DEFAULT_LOCALE: 'gone'}} ) @mock.patch('logging.error') def test_yml_overrides_localized_antifeatures(self, logging_error): """Definitions in .yml files should override the localized versions.""" app = metadata.parse_metadata('metadata/app.with.special.build.params.yml') self.assertEqual(app['AntiFeatures'], {'UpstreamNonFree': {}}) self.assertEqual(49, app['Builds'][-3]['versionCode']) self.assertEqual( app['Builds'][-3]['antifeatures'], {'Tracking': {DEFAULT_LOCALE: 'Uses the Facebook SDK.'}}, ) self.assertEqual(50, app['Builds'][-2]['versionCode']) self.assertEqual( app['Builds'][-2]['antifeatures'], { 'Ads': { 'en-US': 'includes ad lib\n', 'zh-CN': '包括广告图书馆\n', }, 'Tracking': {'en-US': 'standard suspects\n'}, }, ) # errors are printed when .yml overrides localized logging_error.assert_called() self.assertEqual(3, len(logging_error.call_args_list)) def test_parse_yaml_srclib_corrupt_file(self): with tempfile.TemporaryDirectory() as testdir: testdir = Path(testdir) srclibfile = testdir / 'srclib/mock.yml' srclibfile.parent.mkdir() with srclibfile.open('w') as fp: fp.write( textwrap.dedent( """ - RepoType: git - Repo: https://github.com/realm/realm-js.git """ ) ) with self.assertRaises(MetaDataException): fdroidserver.metadata.parse_yaml_srclib(srclibfile) def test_write_yaml_with_placeholder_values(self): mf = io.StringIO() app = fdroidserver.metadata.App() app.Categories = ['None'] app.SourceCode = "https://gitlab.com/fdroid/fdroidclient.git" app.IssueTracker = "https://gitlab.com/fdroid/fdroidclient/issues" app.RepoType = 'git' app.Repo = 'https://gitlab.com/fdroid/fdroidclient.git' app.AutoUpdateMode = 'None' app.UpdateCheckMode = 'Tags' build = fdroidserver.metadata.Build() build.versionName = 'Unknown' # taken from fdroidserver/import.py build.versionCode = 0 # taken from fdroidserver/import.py build.disable = 'Generated by import.py ...' build.commit = 'Unknown' build.gradle = ['yes'] app['Builds'] = [build] fdroidserver.metadata.write_yaml(mf, app) mf.seek(0) self.assertEqual( mf.read(), textwrap.dedent( """\ Categories: - None License: Unknown SourceCode: https://gitlab.com/fdroid/fdroidclient.git IssueTracker: https://gitlab.com/fdroid/fdroidclient/issues RepoType: git Repo: https://gitlab.com/fdroid/fdroidclient.git Builds: - versionName: Unknown versionCode: 0 disable: Generated by import.py ... commit: Unknown gradle: - yes AutoUpdateMode: None UpdateCheckMode: Tags """ ), ) def test_parse_yaml_metadata_prebuild_list(self): mf = io.StringIO( textwrap.dedent( """\ AutoName: F-Droid RepoType: git Builds: - versionCode: 1 versionName: v0.1.0 sudo: - apt-get update - apt-get install -y whatever - sed -i -e 's/> /a/file build: - ./gradlew someSpecialTask - sed -i 'd/that wrong config/' gradle.properties - ./gradlew compile """ ) ) mf.name = 'mock_filename.yaml' mf.seek(0) result = fdroidserver.metadata.parse_yaml_metadata(mf) self.maxDiff = None self.assertDictEqual( result, { 'AutoName': 'F-Droid', 'RepoType': 'git', 'Builds': [ { 'versionCode': 1, 'versionName': 'v0.1.0', 'sudo': [ "apt-get update", "apt-get install -y whatever", "sed -i -e 's/> /a/file", ], 'build': [ "./gradlew someSpecialTask", "sed -i 'd/that wrong config/' gradle.properties", "./gradlew compile", ], } ], }, ) def test_parse_yaml_metadata_prebuild_strings(self): mf = io.StringIO( textwrap.dedent( """\ AutoName: F-Droid RepoType: git Builds: - versionCode: 1 versionName: v0.1.0 sudo: |- apt-get update && apt-get install -y whatever && sed -i -e 's/> /a/file build: |- ./gradlew someSpecialTask && sed -i 'd/that wrong config/' gradle.properties && ./gradlew compile """ ) ) mf.name = 'mock_filename.yaml' mf.seek(0) result = fdroidserver.metadata.parse_yaml_metadata(mf) self.maxDiff = None self.assertDictEqual( result, { 'AutoName': 'F-Droid', 'RepoType': 'git', 'Builds': [ { 'versionCode': 1, 'versionName': 'v0.1.0', 'sudo': [ "apt-get update && " "apt-get install -y whatever && " "sed -i -e 's/> /a/file" ], 'build': [ "./gradlew someSpecialTask && " "sed -i 'd/that wrong config/' gradle.properties && " "./gradlew compile" ], } ], }, ) def test_parse_yaml_metadata_prebuild_string(self): mf = io.StringIO( textwrap.dedent( """\ AutoName: F-Droid RepoType: git Builds: - versionCode: 1 versionName: v0.1.0 prebuild: |- a && b && sed -i 's,a,b,' """ ) ) mf.name = 'mock_filename.yaml' mf.seek(0) result = fdroidserver.metadata.parse_yaml_metadata(mf) self.assertDictEqual( result, { 'AutoName': 'F-Droid', 'RepoType': 'git', 'Builds': [ { 'versionCode': 1, 'versionName': 'v0.1.0', 'prebuild': ["a && b && " "sed -i 's,a,b,'"], } ], }, ) def test_parse_yaml_provides_should_be_ignored(self): mf = io.StringIO( textwrap.dedent( """\ Provides: this.is.deprecated AutoName: F-Droid RepoType: git Builds: - versionCode: 1 versionName: v0.1.0 prebuild: |- a && b && sed -i 's,a,b,' """ ) ) mf.name = 'mock_filename.yaml' mf.seek(0) result = fdroidserver.metadata.parse_yaml_metadata(mf) self.assertNotIn('Provides', result) self.assertNotIn('provides', result) def test_parse_yaml_app_antifeatures_dict(self): nonfreenet = 'free it!' tracking = 'so many' mf = io.StringIO( textwrap.dedent( f""" AntiFeatures: Tracking: {tracking} NonFreeNet: {nonfreenet} """ ) ) self.assertEqual( metadata.parse_yaml_metadata(mf), { 'AntiFeatures': { 'NonFreeNet': {DEFAULT_LOCALE: nonfreenet}, 'Tracking': {DEFAULT_LOCALE: tracking}, } }, ) def test_parse_yaml_metadata_build_antifeatures_old_style(self): mf = _get_mock_mf( textwrap.dedent( """ AntiFeatures: - Ads Builds: - versionCode: 123 antifeatures: - KnownVuln - UpstreamNonFree - NonFreeAssets """ ) ) self.assertEqual( metadata.parse_yaml_metadata(mf), { 'AntiFeatures': {'Ads': {}}, 'Builds': [ { 'antifeatures': { 'KnownVuln': {}, 'NonFreeAssets': {}, 'UpstreamNonFree': {}, }, 'versionCode': 123, } ], }, ) def test_parse_yaml_metadata_antifeatures_sort(self): """All data should end up sorted, to minimize diffs in the index files.""" self.assertEqual( metadata.parse_yaml_metadata( _get_mock_mf( textwrap.dedent( """ Builds: - versionCode: 123 antifeatures: KnownVuln: es: 2nd az: zero en-US: first UpstreamNonFree: NonFreeAssets: AntiFeatures: NonFreeDep: Ads: sw: 2nd zh-CN: 3rd de: 1st """ ) ) ), { 'AntiFeatures': { 'Ads': {'de': '1st', 'sw': '2nd', 'zh-CN': '3rd'}, 'NonFreeDep': {}, }, 'Builds': [ { 'antifeatures': { 'KnownVuln': {'az': 'zero', 'en-US': 'first', 'es': '2nd'}, 'NonFreeAssets': {}, 'UpstreamNonFree': {}, }, 'versionCode': 123, } ], }, ) def test_parse_yaml_app_antifeatures_str(self): self.assertEqual( metadata.parse_yaml_metadata(io.StringIO('AntiFeatures: Tracking')), {'AntiFeatures': {'Tracking': {}}}, ) def test_parse_yaml_app_antifeatures_bool(self): self.assertEqual( metadata.parse_yaml_metadata(io.StringIO('AntiFeatures: true')), {'AntiFeatures': {'true': {}}}, ) def test_parse_yaml_app_antifeatures_float_nan(self): self.assertEqual( metadata.parse_yaml_metadata(io.StringIO('AntiFeatures: .nan')), {'AntiFeatures': {'.nan': {}}}, ) def test_parse_yaml_app_antifeatures_float_inf(self): self.assertEqual( metadata.parse_yaml_metadata(io.StringIO('AntiFeatures: .inf')), {'AntiFeatures': {'.inf': {}}}, ) def test_parse_yaml_app_antifeatures_float_negative_inf(self): self.assertEqual( metadata.parse_yaml_metadata(io.StringIO('AntiFeatures: -.inf')), {'AntiFeatures': {'-.inf': {}}}, ) def test_parse_yaml_app_antifeatures_int(self): self.assertEqual( metadata.parse_yaml_metadata(io.StringIO('AntiFeatures: 1')), {'AntiFeatures': {'1': {}}}, ) def test_parse_yaml_app_antifeatures_float(self): self.assertEqual( metadata.parse_yaml_metadata(io.StringIO('AntiFeatures: 1.0')), {'AntiFeatures': {'1.0': {}}}, ) def test_parse_yaml_app_antifeatures_list_float(self): self.assertEqual( metadata.parse_yaml_metadata(io.StringIO('AntiFeatures:\n - 1.0\n')), {'AntiFeatures': {'1.0': {}}}, ) def test_parse_yaml_app_antifeatures_dict_float(self): mf = io.StringIO('AntiFeatures:\n 0.0: too early\n') self.assertEqual( metadata.parse_yaml_metadata(mf), {'AntiFeatures': {'0.0': {'en-US': 'too early'}}}, ) def test_parse_yaml_app_antifeatures_dict_float_fail_value(self): mf = io.StringIO('AntiFeatures:\n NoSourceSince: 1.0\n') self.assertEqual( metadata.parse_yaml_metadata(mf), {'AntiFeatures': {'NoSourceSince': {'en-US': '1.0'}}}, ) def test_parse_yaml_metadata_type_stringmap_old_list(self): mf = _get_mock_mf( textwrap.dedent( """ AntiFeatures: - Ads - Tracking """ ) ) self.assertEqual( {'AntiFeatures': {'Ads': {}, 'Tracking': {}}}, metadata.parse_yaml_metadata(mf), ) def test_parse_yaml_app_antifeatures_dict_no_value(self): mf = io.StringIO( textwrap.dedent( """\ AntiFeatures: Tracking: NonFreeNet: """ ) ) self.assertEqual( metadata.parse_yaml_metadata(mf), {'AntiFeatures': {'NonFreeNet': {}, 'Tracking': {}}}, ) def test_parse_yaml_metadata_type_stringmap_transitional(self): """Support a transitional format, where users just append a text""" ads = 'Has ad lib in it.' tracking = 'opt-out reports with ACRA' mf = _get_mock_mf( textwrap.dedent( f""" AntiFeatures: - Ads: {ads} - Tracking: {tracking} """ ) ) self.assertEqual( metadata.parse_yaml_metadata(mf), { 'AntiFeatures': { 'Ads': {DEFAULT_LOCALE: ads}, 'Tracking': {DEFAULT_LOCALE: tracking}, } }, ) def test_parse_yaml_app_antifeatures_dict_mixed_values(self): ads = 'true' tracking = 'many' nonfreenet = '1' mf = io.StringIO( textwrap.dedent( f""" AntiFeatures: Ads: {ads} Tracking: {tracking} NonFreeNet: {nonfreenet} """ ) ) self.assertEqual( metadata.parse_yaml_metadata(mf), { 'AntiFeatures': { 'Ads': {DEFAULT_LOCALE: ads}, 'NonFreeNet': {DEFAULT_LOCALE: nonfreenet}, 'Tracking': {DEFAULT_LOCALE: tracking}, } }, ) def test_parse_yaml_app_antifeatures_stringmap_full(self): ads = 'watching' tracking = 'many' nonfreenet = 'pipes' nonfreenet_zh = '非免费网络' self.maxDiff = None mf = io.StringIO( textwrap.dedent( f""" AntiFeatures: Ads: {DEFAULT_LOCALE}: {ads} Tracking: {DEFAULT_LOCALE}: {tracking} NonFreeNet: {DEFAULT_LOCALE}: {nonfreenet} zh-CN: {nonfreenet_zh} """ ) ) self.assertEqual( metadata.parse_yaml_metadata(mf), { 'AntiFeatures': { 'Ads': {DEFAULT_LOCALE: ads}, 'NonFreeNet': {DEFAULT_LOCALE: nonfreenet, 'zh-CN': nonfreenet_zh}, 'Tracking': {DEFAULT_LOCALE: tracking}, } }, ) def test_parse_yaml_build_type_int_fail(self): mf = io.StringIO('Builds: [{versionCode: 1a}]') with self.assertRaises(MetaDataException): fdroidserver.metadata.parse_yaml_metadata(mf) def test_parse_yaml_int_strict_typing_fails(self): """Things that cannot be preserved when parsing as YAML.""" mf = io.StringIO('Builds: [{versionCode: 1, rm: 0xf}]') self.assertEqual( {'Builds': [{'rm': ['15'], 'versionCode': 1}]}, # 15 != 0xf fdroidserver.metadata.parse_yaml_metadata(mf), ) mf = io.StringIO('Builds: [{versionCode: 1, rm: 0x010}]') self.assertEqual( {'Builds': [{'rm': ['16'], 'versionCode': 1}]}, # 16 != 0x010 fdroidserver.metadata.parse_yaml_metadata(mf), ) mf = io.StringIO('Builds: [{versionCode: 1, rm: 0o015}]') self.assertEqual( {'Builds': [{'rm': ['13'], 'versionCode': 1}]}, # 13 != 0o015 fdroidserver.metadata.parse_yaml_metadata(mf), ) mf = io.StringIO('Builds: [{versionCode: 1, rm: 10_000}]') self.assertEqual( {'Builds': [{'rm': ['10000'], 'versionCode': 1}]}, # 10000 != 10_000 fdroidserver.metadata.parse_yaml_metadata(mf), ) def test_write_yaml_1_line_scripts_as_string(self): mf = io.StringIO() app = fdroidserver.metadata.App() app.Categories = ['None'] app['Builds'] = [] build = fdroidserver.metadata.Build() build.versionCode = 102030 build.versionName = 'v1.2.3' build.sudo = ["chmod +rwx /opt"] build.init = ["sed -i -e 'g/what/ever/' /some/file"] build.prebuild = ["sed -i 'd/that wrong config/' gradle.properties"] build.build = ["./gradlew compile"] app['Builds'].append(build) fdroidserver.metadata.write_yaml(mf, app) mf.seek(0) self.assertEqual( mf.read(), textwrap.dedent( """\ Categories: - None License: Unknown Builds: - versionName: v1.2.3 versionCode: 102030 sudo: chmod +rwx /opt init: sed -i -e 'g/what/ever/' /some/file prebuild: sed -i 'd/that wrong config/' gradle.properties build: ./gradlew compile AutoUpdateMode: None UpdateCheckMode: None """ ), ) def test_write_yaml_1_line_scripts_as_list(self): mf = io.StringIO() app = fdroidserver.metadata.App() app.Categories = ['None'] app['Builds'] = [] build = fdroidserver.metadata.Build() build.versionCode = 102030 build.versionName = 'v1.2.3' build.sudo = ["chmod +rwx /opt"] build.init = ["sed -i -e 'g/what/ever/' /some/file"] build.prebuild = ["sed -i 'd/that wrong config/' gradle.properties"] build.build = ["./gradlew compile"] app['Builds'].append(build) fdroidserver.metadata.write_yaml(mf, app) mf.seek(0) self.assertEqual( mf.read(), textwrap.dedent( """\ Categories: - None License: Unknown Builds: - versionName: v1.2.3 versionCode: 102030 sudo: chmod +rwx /opt init: sed -i -e 'g/what/ever/' /some/file prebuild: sed -i 'd/that wrong config/' gradle.properties build: ./gradlew compile AutoUpdateMode: None UpdateCheckMode: None """ ), ) def test_write_yaml_multiline_scripts_from_list(self): mf = io.StringIO() app = fdroidserver.metadata.App() app.Categories = ['None'] app['Builds'] = [] build = fdroidserver.metadata.Build() build.versionCode = 102030 build.versionName = 'v1.2.3' build.sudo = [ "apt-get update", "apt-get install -y whatever", "sed -i -e 's/> /a/file"] build.build = [ "./gradlew someSpecialTask", "sed -i 'd/that wrong config/' gradle.properties", "./gradlew compile", ] app['Builds'].append(build) fdroidserver.metadata.write_yaml(mf, app) mf.seek(0) self.assertEqual( mf.read(), textwrap.dedent( """\ Categories: - None License: Unknown Builds: - versionName: v1.2.3 versionCode: 102030 sudo: - apt-get update - apt-get install -y whatever - sed -i -e 's/> /a/file build: - ./gradlew someSpecialTask - sed -i 'd/that wrong config/' gradle.properties - ./gradlew compile AutoUpdateMode: None UpdateCheckMode: None """ ), ) def test_write_yaml_multiline_scripts_from_string(self): mf = io.StringIO() app = fdroidserver.metadata.App() app.Categories = ['None'] app['Builds'] = [] build = fdroidserver.metadata.Build() build.versionCode = 102030 build.versionName = 'v1.2.3' build.sudo = [ "apt-get update", "apt-get install -y whatever", "sed -i -e 's/> /a/file"] build.build = [ "./gradlew someSpecialTask", "sed -i 'd/that wrong config/' gradle.properties", "./gradlew compile", ] app['Builds'].append(build) fdroidserver.metadata.write_yaml(mf, app) mf.seek(0) self.assertEqual( mf.read(), textwrap.dedent( """\ Categories: - None License: Unknown Builds: - versionName: v1.2.3 versionCode: 102030 sudo: - apt-get update - apt-get install -y whatever - sed -i -e 's/> /a/file build: - ./gradlew someSpecialTask - sed -i 'd/that wrong config/' gradle.properties - ./gradlew compile AutoUpdateMode: None UpdateCheckMode: None """ ), ) def test_write_yaml_build_antifeatures(self): mf = io.StringIO() app = metadata.App( { 'License': 'Apache-2.0', 'Builds': [ metadata.Build( { 'versionCode': 102030, 'versionName': 'v1.2.3', 'gradle': ['yes'], 'antifeatures': { 'a': {}, 'b': {'de': 'Probe', 'en-US': 'test'}, }, } ), ], 'id': 'placeholder', } ) metadata.write_yaml(mf, app) mf.seek(0) self.assertEqual( mf.read(), textwrap.dedent( """\ License: Apache-2.0 Builds: - versionName: v1.2.3 versionCode: 102030 gradle: - yes antifeatures: a: {} b: de: Probe en-US: test """ ), ) def test_write_yaml_build_antifeatures_old_style(self): mf = io.StringIO() app = metadata.App( { 'License': 'Apache-2.0', 'Builds': [ metadata.Build( { 'versionCode': 102030, 'versionName': 'v1.2.3', 'gradle': ['yes'], 'antifeatures': {'b': {}, 'a': {}}, } ), ], 'id': 'placeholder', } ) metadata.write_yaml(mf, app) mf.seek(0) self.assertEqual( mf.read(), textwrap.dedent( """\ License: Apache-2.0 Builds: - versionName: v1.2.3 versionCode: 102030 gradle: - yes antifeatures: - a - b """ ), ) def test_write_yaml_make_sure_provides_does_not_get_written(self): mf = io.StringIO() app = fdroidserver.metadata.App() app.Categories = ['None'] app.Provides = 'this.is.deprecated' app['Builds'] = [] build = fdroidserver.metadata.Build() build.versionCode = 102030 build.versionName = 'v1.2.3' build.gradle = ['yes'] app['Builds'].append(build) fdroidserver.metadata.write_yaml(mf, app) mf.seek(0) self.assertEqual( mf.read(), textwrap.dedent( """\ Categories: - None License: Unknown Builds: - versionName: v1.2.3 versionCode: 102030 gradle: - yes AutoUpdateMode: None UpdateCheckMode: None """ ), ) def test_parse_yaml_srclib_unknown_key(self): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with Path('test.yml').open('w', encoding='utf-8') as f: f.write( textwrap.dedent( '''\ RepoType: git Repo: https://example.com/test.git Evil: I should not be here. ''' ) ) with self.assertRaisesRegex( MetaDataException, "Invalid srclib metadata: " "unknown key 'Evil' in " "'test.yml'", ): fdroidserver.metadata.parse_yaml_srclib(Path('test.yml')) def test_parse_yaml_srclib_does_not_exists(self): with self.assertRaisesRegex( MetaDataException, "Invalid scrlib metadata: " r"'non(/|\\)existent-test-srclib.yml' " "does not exist", ): fdroidserver.metadata.parse_yaml_srclib( Path('non/existent-test-srclib.yml') ) def test_parse_yaml_srclib_simple(self): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with Path('simple.yml').open('w', encoding='utf-8') as f: f.write( textwrap.dedent( '''\ # this should be simple RepoType: git Repo: https://git.host/repo.git ''' ) ) srclib = fdroidserver.metadata.parse_yaml_srclib(Path('simple.yml')) self.assertDictEqual( { 'Repo': 'https://git.host/repo.git', 'RepoType': 'git', 'Subdir': None, 'Prepare': None, }, srclib, ) def test_parse_yaml_srclib_simple_with_blanks(self): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with Path('simple.yml').open('w', encoding='utf-8') as f: f.write( textwrap.dedent( '''\ # this should be simple RepoType: git Repo: https://git.host/repo.git Subdir: Prepare: ''' ) ) srclib = fdroidserver.metadata.parse_yaml_srclib(Path('simple.yml')) self.assertDictEqual( { 'Repo': 'https://git.host/repo.git', 'RepoType': 'git', 'Subdir': [''], 'Prepare': [], }, srclib, ) def test_parse_yaml_srclib_Changelog_cketti(self): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with Path('Changelog-cketti.yml').open('w', encoding='utf-8') as f: f.write( textwrap.dedent( '''\ RepoType: git Repo: https://github.com/cketti/ckChangeLog Subdir: library,ckChangeLog/src/main Prepare: "[ -f project.properties ] || echo 'source.dir=java' > ant.properties && echo -e 'android.library=true\\\\ntarget=android-19' > project.properties" ''' ) ) srclib = fdroidserver.metadata.parse_yaml_srclib( Path('Changelog-cketti.yml') ) self.assertDictEqual( srclib, { 'Repo': 'https://github.com/cketti/ckChangeLog', 'RepoType': 'git', 'Subdir': ['library', 'ckChangeLog/src/main'], 'Prepare': [ "[ -f project.properties ] || echo 'source.dir=java' > " "ant.properties && echo -e " "'android.library=true\\ntarget=android-19' > project.properties" ], }, ) def test_read_srclibs_yml_subdir_list(self): fdroidserver.metadata.srclibs = None with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): Path('srclibs').mkdir() with Path('srclibs/with-list.yml').open('w', encoding='utf-8') as f: f.write( textwrap.dedent( '''\ # this should be simple RepoType: git Repo: https://git.host/repo.git Subdir: - This is your last chance. - After this, there is no turning back. - You take the blue pill—the story ends, - you wake up in your bed - and believe whatever you want to believe. - You take the red pill—you stay in Wonderland - and I show you how deep the rabbit-hole goes. Prepare: There is a difference between knowing the path and walking the path. ''' ) ) fdroidserver.metadata.read_srclibs() self.maxDiff = None self.assertDictEqual( fdroidserver.metadata.srclibs, { 'with-list': { 'RepoType': 'git', 'Repo': 'https://git.host/repo.git', 'Subdir': [ 'This is your last chance.', 'After this, there is no turning back.', 'You take the blue pill—the story ends,', 'you wake up in your bed', 'and believe whatever you want to believe.', 'You take the red pill—you stay in Wonderland', 'and I show you how deep the rabbit-hole goes.', ], 'Prepare': [ 'There is a difference between knowing the path ' 'and walking the path.' ], } }, ) def test_read_srclibs_yml_prepare_list(self): fdroidserver.metadata.srclibs = None with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): Path('srclibs').mkdir() with Path('srclibs/with-list.yml').open('w', encoding='utf-8') as f: f.write( textwrap.dedent( '''\ # this should be simple RepoType: git Repo: https://git.host/repo.git Subdir: Prepare: - Many - invalid - commands - here. ''' ) ) fdroidserver.metadata.read_srclibs() self.maxDiff = None self.assertDictEqual( fdroidserver.metadata.srclibs, { 'with-list': { 'RepoType': 'git', 'Repo': 'https://git.host/repo.git', 'Subdir': [''], 'Prepare': [ 'Many', 'invalid', 'commands', 'here.', ], } }, ) def test_read_srclibs(self): fdroidserver.metadata.srclibs = None with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): Path('srclibs').mkdir() with Path('srclibs/simple.yml').open('w', encoding='utf-8') as f: f.write( textwrap.dedent( '''\ RepoType: git Repo: https://git.host/repo.git ''' ) ) with Path('srclibs/simple-wb.yml').open('w', encoding='utf-8') as f: f.write( textwrap.dedent( '''\ # this should be simple RepoType: git Repo: https://git.host/repo.git Subdir: Prepare: ''' ) ) fdroidserver.metadata.read_srclibs() self.assertDictEqual( fdroidserver.metadata.srclibs, { 'simple-wb': { 'RepoType': 'git', 'Repo': 'https://git.host/repo.git', 'Subdir': [''], 'Prepare': [], }, 'simple': { 'RepoType': 'git', 'Repo': 'https://git.host/repo.git', 'Subdir': None, 'Prepare': None, }, }, ) def test_build_ndk_path(self): """""" with tempfile.TemporaryDirectory(prefix='android-sdk-') as sdk_path: config = {'ndk_paths': {}, 'sdk_path': sdk_path} fdroidserver.common.config = config build = fdroidserver.metadata.Build() build.ndk = 'r10e' self.assertEqual('', build.ndk_path()) correct = '/fake/path/ndk/r21b' config['ndk_paths'] = {'r21b': correct} self.assertEqual('', build.ndk_path()) config['ndk_paths'] = {'r10e': correct} self.assertEqual(correct, build.ndk_path()) r10e = '/fake/path/ndk/r10e' r22b = '/fake/path/ndk/r22e' config['ndk_paths'] = {'r10e': r10e, 'r22b': r22b} self.assertEqual(r10e, build.ndk_path()) build.ndk = ['r10e', 'r22b'] self.assertEqual(r10e, build.ndk_path()) build.ndk = ['r22b', 'r10e'] self.assertEqual(r22b, build.ndk_path()) def test_build_ndk_path_only_accepts_str(self): """Paths in the config must be strings, never pathlib.Path instances""" config = {'ndk_paths': {'r24': Path('r24')}} fdroidserver.common.config = config build = fdroidserver.metadata.Build() build.ndk = 'r24' with self.assertRaises(TypeError): build.ndk_path() def test_del_duplicated_NoSourceSince(self): app = { 'AntiFeatures': {'Ads': {}, 'NoSourceSince': {DEFAULT_LOCALE: '1.0'}}, 'NoSourceSince': '1.0', } metadata._del_duplicated_NoSourceSince(app) self.assertEqual(app, {'AntiFeatures': {'Ads': {}}, 'NoSourceSince': '1.0'}) def test_check_manually_extended_NoSourceSince(self): app = { 'AntiFeatures': {'NoSourceSince': {DEFAULT_LOCALE: '1.0', 'de': '1,0'}}, 'NoSourceSince': '1.0', } metadata._del_duplicated_NoSourceSince(app) self.assertEqual( app, { 'AntiFeatures': {'NoSourceSince': {DEFAULT_LOCALE: '1.0', 'de': '1,0'}}, 'NoSourceSince': '1.0', }, ) def test_make_sure_nosourcesince_does_not_get_written(self): appid = 'com.politedroid' app = metadata.read_metadata({appid: -1})[appid] builds = app['Builds'] app['Builds'] = [copy.deepcopy(builds[0])] mf = io.StringIO() metadata.write_yaml(mf, app) mf.seek(0) self.maxDiff = None self.assertEqual( mf.read(), textwrap.dedent( """\ AntiFeatures: - NonFreeNet Categories: - Multimedia - Security - Time License: GPL-3.0-only SourceCode: https://github.com/miguelvps/PoliteDroid IssueTracker: https://github.com/miguelvps/PoliteDroid/issues AutoName: Polite Droid Summary: Calendar tool Description: Activates silent mode during calendar events. RepoType: git Repo: https://github.com/miguelvps/PoliteDroid.git Builds: - versionName: '1.2' versionCode: 3 commit: 6a548e4b19 target: android-10 antifeatures: - KnownVuln - NonFreeAssets - UpstreamNonFree ArchivePolicy: 4 AutoUpdateMode: Version v%v UpdateCheckMode: Tags CurrentVersion: '1.5' CurrentVersionCode: 6 NoSourceSince: '1.5' """ ), ) def test_app_to_yaml_smokecheck(self): self.assertTrue( isinstance(metadata._app_to_yaml(dict()), ruamel.yaml.comments.CommentedMap) ) def test_app_to_yaml_build_list_empty(self): app = metadata.App({'Builds': [metadata.Build({'rm': []})]}) self.assertEqual(dict(), metadata._app_to_yaml(app)['Builds'][0]) def test_app_to_yaml_build_list_one(self): app = metadata.App({'Builds': [metadata.Build({'rm': ['one']})]}) self.assertEqual({'rm': ['one']}, metadata._app_to_yaml(app)['Builds'][0]) def test_app_to_yaml_build_list_two(self): app = metadata.App({'Builds': [metadata.Build({'rm': ['1', '2']})]}) self.assertEqual({'rm': ['1', '2']}, metadata._app_to_yaml(app)['Builds'][0]) def test_app_to_yaml_build_list(self): app = metadata.App({'Builds': [metadata.Build({'rm': ['b2', 'NO1']})]}) self.assertEqual({'rm': ['b2', 'NO1']}, metadata._app_to_yaml(app)['Builds'][0]) def test_app_to_yaml_AllowedAPKSigningKeys_two(self): cm = metadata._app_to_yaml(metadata.App({'AllowedAPKSigningKeys': ['b', 'A']})) self.assertEqual(['b', 'a'], cm['AllowedAPKSigningKeys']) def test_app_to_yaml_AllowedAPKSigningKeys_one(self): cm = metadata._app_to_yaml(metadata.App({'AllowedAPKSigningKeys': ['One']})) self.assertEqual('one', cm['AllowedAPKSigningKeys']) def test_app_to_yaml_int_hex(self): cm = metadata._app_to_yaml(metadata.App({'CurrentVersionCode': 0xFF})) self.assertEqual(255, cm['CurrentVersionCode']) def test_app_to_yaml_int_underscore(self): cm = metadata._app_to_yaml(metadata.App({'CurrentVersionCode': 1_2_3})) self.assertEqual(123, cm['CurrentVersionCode']) def test_app_to_yaml_int_0(self): """Document that 0 values fail to make it through.""" # TODO it should be possible to use `CurrentVersionCode: 0` cm = metadata._app_to_yaml(metadata.App({'CurrentVersionCode': 0})) self.assertFalse('CurrentVersionCode' in cm) def test_format_multiline(self): self.assertEqual(metadata._format_multiline('description'), 'description') def test_format_multiline_empty(self): self.assertEqual(metadata._format_multiline(''), '') def test_format_multiline_newline_char(self): self.assertEqual(metadata._format_multiline('one\\ntwo'), 'one\\ntwo') def test_format_multiline_newlines(self): self.assertEqual( metadata._format_multiline( textwrap.dedent( """ one two three """ ) ), '\none\ntwo\nthree\n', ) def test_format_list_empty(self): self.assertEqual(metadata._format_list(['', None]), list()) def test_format_list_one_empty(self): self.assertEqual(metadata._format_list(['foo', None]), ['foo']) def test_format_list_two(self): self.assertEqual(metadata._format_list(['2', '1']), ['2', '1']) def test_format_list_newline(self): self.assertEqual(metadata._format_list(['one\ntwo']), ['one\ntwo']) def test_format_list_newline_char(self): self.assertEqual(metadata._format_list(['one\\ntwo']), ['one\\ntwo']) def test_format_script_empty(self): self.assertEqual(metadata._format_script(['', None]), list()) def test_format_script_newline(self): self.assertEqual(metadata._format_script(['one\ntwo']), 'one\ntwo') def test_format_script_newline_char(self): self.assertEqual(metadata._format_script(['one\\ntwo']), 'one\\ntwo') def test_format_stringmap_empty(self): self.assertEqual( metadata._format_stringmap('🔥', 'test', dict()), list(), ) def test_format_stringmap_one_list(self): self.assertEqual( metadata._format_stringmap('🔥', 'test', {'Tracking': {}, 'Ads': {}}), ['Ads', 'Tracking'], ) def test_format_stringmap_one_list_empty_desc(self): self.assertEqual( metadata._format_stringmap('🔥', 'test', {'NonFree': {}, 'Ads': {'en': ''}}), ['Ads', 'NonFree'], ) def test_format_stringmap_three_list(self): self.assertEqual( metadata._format_stringmap('🔥', 'test', {'B': {}, 'A': {}, 'C': {}}), ['A', 'B', 'C'], ) def test_format_stringmap_two_dict(self): self.assertEqual( metadata._format_stringmap('🔥', 'test', {'1': {'uz': 'a'}, '2': {}}), {'1': {'uz': 'a'}, '2': {}}, ) def test_format_stringmap_three_locales(self): self.assertEqual( metadata._format_stringmap( '🔥', 'test', {'AF': {'uz': 'a', 'ko': 'b', 'zh': 'c'}} ), {'AF': {'ko': 'b', 'uz': 'a', 'zh': 'c'}}, ) def test_format_stringmap_move_build_antifeatures_to_filesystem(self): os.chdir(self.testdir) appid = 'a' yml = Path('metadata/a.yml') yml.parent.mkdir() self.assertEqual( metadata._format_stringmap( appid, 'antifeatures', {'AF': {'uz': 'a', 'ko': 'b', 'zh': 'c'}} ), {'AF': {'ko': 'b', 'uz': 'a', 'zh': 'c'}}, ) def test_format_stringmap_app_antifeatures_conflict(self): """Raise an error if a YAML Anti-Feature conflicts with a localized file.""" os.chdir(self.testdir) appid = 'a' field = 'AntiFeatures' locale = 'ko' yml = Path('metadata/a.yml') antifeatures_ko = yml.parent / appid / locale / field.lower() antifeatures_ko.mkdir(parents=True) afname = 'Anti-🔥' (antifeatures_ko / (afname + '.txt')).write_text('SOMETHING ELSE') with self.assertRaises(MetaDataException): metadata._format_stringmap( appid, field, {afname: {'uz': 'a', locale: 'b', 'zh': 'c'}} ) def test_format_stringmap_app_antifeatures_conflict_same_contents(self): """Raise an error if a YAML Anti-Feature conflicts with a localized file.""" os.chdir(self.testdir) appid = 'a' field = 'AntiFeatures' locale = 'ko' yml = Path('metadata/a.yml') antifeatures_ko = yml.parent / appid / locale / field.lower() antifeatures_ko.mkdir(parents=True) afname = 'Anti-🔥' (antifeatures_ko / (afname + '.txt')).write_text('b') metadata._format_stringmap( appid, field, {afname: {'uz': 'a', locale: 'b', 'zh': 'c'}} ) def test_format_stringmap_build_antifeatures_conflict(self): """Raise an error if a YAML Anti-Feature conflicts with a localized file.""" os.chdir(self.testdir) appid = 'a' field = 'antifeatures' locale = 'ko' versionCode = 123 yml = Path('metadata/a.yml') antifeatures_ko = yml.parent / appid / locale / field.lower() antifeatures_ko.mkdir(parents=True) afname = 'Anti-🔥' with (antifeatures_ko / ('%d_%s.txt' % (versionCode, afname))).open('w') as fp: fp.write('SOMETHING ELSE') with self.assertRaises(MetaDataException): metadata._format_stringmap( appid, field, {afname: {'uz': 'a', locale: 'b', 'zh': 'c'}}, versionCode ) def test_app_to_yaml_one_category(self): """Categories does not get simplified to string when outputting YAML.""" self.assertEqual( metadata._app_to_yaml({'Categories': ['one']}), {'Categories': ['one']}, ) def test_app_to_yaml_categories(self): """Sort case-insensitive before outputting YAML.""" self.assertEqual( metadata._app_to_yaml({'Categories': ['c', 'a', 'B']}), {'Categories': ['a', 'B', 'c']}, ) def test_builds_to_yaml_gradle_yes(self): app = {'Builds': [{'versionCode': 0, 'gradle': ['yes']}]} self.assertEqual( metadata._builds_to_yaml(app), [{'versionCode': 0, 'gradle': ['yes']}] ) def test_builds_to_yaml_gradle_off(self): app = {'Builds': [{'versionCode': 0, 'gradle': ['off']}]} self.assertEqual( metadata._builds_to_yaml(app), [{'versionCode': 0, 'gradle': ['off']}] ) def test_builds_to_yaml_gradle_true(self): app = {'Builds': [{'versionCode': 0, 'gradle': ['true']}]} self.assertEqual( metadata._builds_to_yaml(app), [{'versionCode': 0, 'gradle': ['true']}] ) def test_builds_to_yaml_gradle_false(self): app = {'Builds': [{'versionCode': 0, 'gradle': ['false']}]} self.assertEqual( metadata._builds_to_yaml(app), [{'versionCode': 0, 'gradle': ['false']}] ) def test_builds_to_yaml_stripped(self): self.assertEqual( metadata._builds_to_yaml( { 'Builds': [ metadata.Build({'versionCode': 0, 'rm': [None], 'init': ['']}) ] } ), [{'versionCode': 0}], ) def test_builds_to_yaml(self): """Include one of each flag type with a valid value.""" app = { 'Builds': [ metadata.Build( { 'versionCode': 0, 'gradle': ['free'], 'rm': ['0', '2'], 'submodules': True, 'timeout': 0, 'init': ['false', 'two'], } ) ] } # check that metadata.Build() inited flag values self.assertEqual(app['Builds'][0]['scanignore'], list()) # then unchanged values should be removed by _builds_to_yaml self.assertEqual( metadata._builds_to_yaml(app), [ { 'versionCode': 0, 'gradle': ['free'], 'rm': ['0', '2'], 'submodules': True, 'timeout': 0, 'init': ['false', 'two'], } ], ) class PostMetadataParseTest(unittest.TestCase): """Test the functions that post process the YAML input. The following series of "post_metadata_parse" tests map out the current state of automatic type conversion in the YAML post processing. They are not necessary a statement of how things should be, but more to surface the details of it functions. """ def setUp(self): fdroidserver.metadata.warnings_action = 'error' def _post_metadata_parse_app_int(self, from_yaml, expected): app = {'ArchivePolicy': from_yaml} metadata.post_parse_yaml_metadata(app) return {'ArchivePolicy': expected}, app def _post_metadata_parse_app_list(self, from_yaml, expected): app = {'AllowedAPKSigningKeys': from_yaml} metadata.post_parse_yaml_metadata(app) return {'AllowedAPKSigningKeys': expected}, app def _post_metadata_parse_app_string(self, from_yaml, expected): app = {'Repo': from_yaml} metadata.post_parse_yaml_metadata(app) return {'Repo': expected}, app def _post_metadata_parse_build_bool(self, from_yaml, expected): tested_key = 'submodules' app = {'Builds': [{'versionCode': 1, tested_key: from_yaml}]} post = copy.deepcopy(app) metadata.post_parse_yaml_metadata(post) del app['Builds'][0]['versionCode'] del post['Builds'][0]['versionCode'] for build in post['Builds']: for k in list(build): if k != tested_key: del build[k] app['Builds'][0][tested_key] = expected return app, post def _post_metadata_parse_build_int(self, from_yaml, expected): tested_key = 'versionCode' app = {'Builds': [{'versionCode': from_yaml}]} post = copy.deepcopy(app) metadata.post_parse_yaml_metadata(post) for build in post['Builds']: for k in list(build): if k != tested_key: del build[k] app['Builds'][0][tested_key] = expected return app, post def _post_metadata_parse_build_list(self, from_yaml, expected): tested_key = 'rm' app = {'Builds': [{'versionCode': 1, tested_key: from_yaml}]} post = copy.deepcopy(app) metadata.post_parse_yaml_metadata(post) del app['Builds'][0]['versionCode'] del post['Builds'][0]['versionCode'] for build in post['Builds']: for k in list(build): if k != tested_key: del build[k] app['Builds'][0][tested_key] = expected return app, post def _post_metadata_parse_build_script(self, from_yaml, expected): tested_key = 'build' app = {'Builds': [{'versionCode': 1, tested_key: from_yaml}]} post = copy.deepcopy(app) metadata.post_parse_yaml_metadata(post) del app['Builds'][0]['versionCode'] del post['Builds'][0]['versionCode'] for build in post['Builds']: for k in list(build): if k != tested_key: del build[k] app['Builds'][0][tested_key] = expected return app, post def _post_metadata_parse_build_string(self, from_yaml, expected): tested_key = 'commit' app = {'Builds': [{'versionCode': 1, tested_key: from_yaml}]} post = copy.deepcopy(app) metadata.post_parse_yaml_metadata(post) del app['Builds'][0]['versionCode'] del post['Builds'][0]['versionCode'] for build in post['Builds']: for k in list(build): if k != tested_key: del build[k] app['Builds'][0][tested_key] = expected return app, post def test_post_metadata_parse_none(self): """Run None aka YAML null or blank through the various field and flag types.""" self.assertEqual(*self._post_metadata_parse_app_int(None, None)) self.assertEqual(*self._post_metadata_parse_app_list(None, None)) self.assertEqual(*self._post_metadata_parse_app_string(None, None)) self.assertEqual(*self._post_metadata_parse_build_bool(None, None)) self.assertEqual(*self._post_metadata_parse_build_int(None, None)) self.assertEqual(*self._post_metadata_parse_build_list(None, None)) self.assertEqual(*self._post_metadata_parse_build_script(None, None)) self.assertEqual(*self._post_metadata_parse_build_string(None, None)) def test_post_metadata_parse_int(self): """Run the int 123456 through the various field and flag types.""" self.assertEqual(*self._post_metadata_parse_app_int(123456, 123456)) self.assertEqual(*self._post_metadata_parse_app_list(123456, ['123456'])) self.assertEqual(*self._post_metadata_parse_app_string(123456, '123456')) self.assertEqual(*self._post_metadata_parse_build_bool(123456, True)) self.assertEqual(*self._post_metadata_parse_build_int(123456, 123456)) self.assertEqual(*self._post_metadata_parse_build_list(123456, ['123456'])) self.assertEqual(*self._post_metadata_parse_build_script(123456, ['123456'])) self.assertEqual(*self._post_metadata_parse_build_string(123456, '123456')) def test_post_metadata_parse_sha256(self): """Run a SHA-256 that YAML calls an int through the various types. The current f-droid.org signer set has SHA-256 values with a maximum of two leading zeros, but this will handle more. """ yaml = ruamel.yaml.YAML(typ='safe', pure=True) str_sha256 = '0000000000000498456908409534729834729834729834792837487293847926' sha256 = yaml.load('a: ' + str_sha256)['a'] self.assertEqual(*self._post_metadata_parse_app_int(sha256, int(str_sha256))) self.assertEqual(*self._post_metadata_parse_app_list(sha256, [str_sha256])) self.assertEqual(*self._post_metadata_parse_app_string(sha256, str_sha256)) self.assertEqual(*self._post_metadata_parse_build_bool(sha256, True)) self.assertEqual(*self._post_metadata_parse_build_int(sha256, sha256)) self.assertEqual(*self._post_metadata_parse_build_list(sha256, [str_sha256])) self.assertEqual(*self._post_metadata_parse_build_script(sha256, [str_sha256])) self.assertEqual(*self._post_metadata_parse_build_string(sha256, str_sha256)) def test_post_metadata_parse_int_0(self): """Run the int 0 through the various field and flag types.""" self.assertEqual(*self._post_metadata_parse_app_int(0, 0)) self.assertEqual(*self._post_metadata_parse_app_list(0, ['0'])) self.assertEqual(*self._post_metadata_parse_app_string(0, '0')) self.assertEqual(*self._post_metadata_parse_build_bool(0, False)) self.assertEqual(*self._post_metadata_parse_build_int(0, 0)) self.assertEqual(*self._post_metadata_parse_build_list(0, ['0'])) self.assertEqual(*self._post_metadata_parse_build_script(0, ['0'])) self.assertEqual(*self._post_metadata_parse_build_string(0, '0')) def test_post_metadata_parse_float_0_0(self): """Run the float 0.0 through the various field and flag types.""" with self.assertRaises(MetaDataException): self._post_metadata_parse_app_int(0.0, MetaDataException) self.assertEqual(*self._post_metadata_parse_app_list(0.0, ['0.0'])) self.assertEqual(*self._post_metadata_parse_app_string(0.0, '0.0')) self.assertEqual(*self._post_metadata_parse_build_bool(0.0, False)) with self.assertRaises(MetaDataException): self._post_metadata_parse_build_int(0.0, MetaDataException) self.assertEqual(*self._post_metadata_parse_build_list(0.0, ['0.0'])) self.assertEqual(*self._post_metadata_parse_build_script(0.0, ['0.0'])) self.assertEqual(*self._post_metadata_parse_build_string(0.0, '0.0')) def test_post_metadata_parse_float_0_1(self): """Run the float 0.1 through the various field and flag types.""" with self.assertRaises(MetaDataException): self._post_metadata_parse_app_int(0.1, MetaDataException) self.assertEqual(*self._post_metadata_parse_app_list(0.1, ['0.1'])) self.assertEqual(*self._post_metadata_parse_app_string(0.1, '0.1')) self.assertEqual(*self._post_metadata_parse_build_bool(0.1, True)) with self.assertRaises(MetaDataException): self._post_metadata_parse_build_int(0.1, MetaDataException) self.assertEqual(*self._post_metadata_parse_build_list(0.1, ['0.1'])) self.assertEqual(*self._post_metadata_parse_build_script(0.1, ['0.1'])) self.assertEqual(*self._post_metadata_parse_build_string(0.1, '0.1')) def test_post_metadata_parse_float_1_0(self): """Run the float 1.0 through the various field and flag types.""" with self.assertRaises(MetaDataException): self._post_metadata_parse_app_int(1.0, MetaDataException) self.assertEqual(*self._post_metadata_parse_app_list(1.0, ['1.0'])) self.assertEqual(*self._post_metadata_parse_app_string(1.0, '1.0')) self.assertEqual(*self._post_metadata_parse_build_bool(1.0, True)) with self.assertRaises(MetaDataException): self._post_metadata_parse_build_int(1.0, MetaDataException) self.assertEqual(*self._post_metadata_parse_build_list(1.0, ['1.0'])) self.assertEqual(*self._post_metadata_parse_build_script(1.0, ['1.0'])) self.assertEqual(*self._post_metadata_parse_build_string(1.0, '1.0')) def test_post_metadata_parse_empty_list(self): with self.assertRaises(MetaDataException): self._post_metadata_parse_app_int(list(), MetaDataException) self.assertEqual(*self._post_metadata_parse_app_list(list(), list())) self.assertEqual(*self._post_metadata_parse_app_string(list(), list())) self.assertEqual(*self._post_metadata_parse_build_bool(list(), False)) with self.assertRaises(MetaDataException): self._post_metadata_parse_build_int(list(), MetaDataException) self.assertEqual(*self._post_metadata_parse_build_list(list(), list())) self.assertEqual(*self._post_metadata_parse_build_script(list(), list())) self.assertEqual(*self._post_metadata_parse_build_string(list(), list())) def test_post_metadata_parse_set_of_1(self): with self.assertRaises(MetaDataException): self._post_metadata_parse_app_int({1}, MetaDataException) self.assertEqual(*self._post_metadata_parse_app_list({1}, ['1'])) self.assertEqual(*self._post_metadata_parse_app_string({1}, '{1}')) self.assertEqual(*self._post_metadata_parse_build_bool({1}, True)) with self.assertRaises(MetaDataException): self._post_metadata_parse_build_int({1}, MetaDataException) self.assertEqual(*self._post_metadata_parse_build_list({1}, ['1'])) self.assertEqual(*self._post_metadata_parse_build_script({1}, ['1'])) self.assertEqual(*self._post_metadata_parse_build_string({1}, '{1}')) def test_post_metadata_parse_empty_dict(self): with self.assertRaises(MetaDataException): self._post_metadata_parse_app_int(dict(), MetaDataException) self.assertEqual(*self._post_metadata_parse_app_list(dict(), dict())) self.assertEqual(*self._post_metadata_parse_app_string(dict(), dict())) self.assertEqual(*self._post_metadata_parse_build_bool(dict(), False)) with self.assertRaises(MetaDataException): self._post_metadata_parse_build_int(dict(), MetaDataException) self.assertEqual(*self._post_metadata_parse_build_list(dict(), dict())) self.assertEqual(*self._post_metadata_parse_build_script(dict(), dict())) self.assertEqual(*self._post_metadata_parse_build_string(dict(), dict())) def test_post_metadata_parse_list_int_string(self): with self.assertRaises(MetaDataException): self._post_metadata_parse_app_int([1, 'a'], MetaDataException) self.assertEqual(*self._post_metadata_parse_app_list([1, 'a'], ['1', 'a'])) self.assertEqual(*self._post_metadata_parse_app_string([1, 'a'], "[1, 'a']")) self.assertEqual(*self._post_metadata_parse_build_bool([1, 'a'], True)) with self.assertRaises(MetaDataException): self._post_metadata_parse_build_int([1, 'a'], MetaDataException) self.assertEqual(*self._post_metadata_parse_build_list([1, 'a'], ['1', 'a'])) self.assertEqual(*self._post_metadata_parse_build_script([1, 'a'], ['1', 'a'])) self.assertEqual(*self._post_metadata_parse_build_string([1, 'a'], "[1, 'a']")) def test_post_metadata_parse_dict_int_string(self): with self.assertRaises(MetaDataException): self._post_metadata_parse_app_int({'k': 1}, MetaDataException) with self.assertRaises(MetaDataException): self._post_metadata_parse_app_list({'k': 1}, MetaDataException) self.assertEqual(*self._post_metadata_parse_app_string({'k': 1}, "{'k': 1}")) self.assertEqual(*self._post_metadata_parse_build_bool({'k': 1}, True)) with self.assertRaises(MetaDataException): self._post_metadata_parse_build_int({'k': 1}, MetaDataException) with self.assertRaises(MetaDataException): self._post_metadata_parse_build_list({'k': 1}, MetaDataException) with self.assertRaises(MetaDataException): self._post_metadata_parse_build_script({'k': 1}, MetaDataException) self.assertEqual(*self._post_metadata_parse_build_string({'k': 1}, "{'k': 1}")) def test_post_metadata_parse_false(self): with self.assertRaises(MetaDataException): self._post_metadata_parse_app_int(False, MetaDataException) self.assertEqual(*self._post_metadata_parse_app_list(False, ['false'])) self.assertEqual(*self._post_metadata_parse_app_string(False, 'false')) self.assertEqual(*self._post_metadata_parse_build_bool(False, False)) with self.assertRaises(MetaDataException): self._post_metadata_parse_build_int(False, MetaDataException) self.assertEqual(*self._post_metadata_parse_build_list(False, ['false'])) self.assertEqual(*self._post_metadata_parse_build_script(False, ['false'])) self.assertEqual(*self._post_metadata_parse_build_string(False, 'false')) def test_post_metadata_parse_true(self): with self.assertRaises(MetaDataException): self._post_metadata_parse_app_int(True, MetaDataException) self.assertEqual(*self._post_metadata_parse_app_list(True, ['true'])) self.assertEqual(*self._post_metadata_parse_app_string(True, 'true')) self.assertEqual(*self._post_metadata_parse_build_bool(True, True)) with self.assertRaises(MetaDataException): self._post_metadata_parse_build_int(True, MetaDataException) self.assertEqual(*self._post_metadata_parse_build_list(True, ['true'])) self.assertEqual(*self._post_metadata_parse_build_script(True, ['true'])) self.assertEqual(*self._post_metadata_parse_build_string(True, 'true')) if __name__ == "__main__": import argparse parser = argparse.ArgumentParser() parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(MetadataTest)) unittest.main(failfast=False) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/minimal_targetsdk_30_unsigned.apk0000644000175000017500000000436614620351225022546 0ustar00hanshansPK>ytAndroidManifest.xml1oAl| V D!]D$*DDNciCAoDRk)Ro'{w7fF%~֤Ga)^{ AInhuWZS&Dc}MI-1xa|D3LG9q/%%Œ-zzb]H Qho܄ڑق/u.'V[<#t2tza-;R~cl vV'Sn^sdSO91@o^JOlb?Lp+sfc*25z!Gkל{` ҆s;/]Vk%ޯ6cfۭR>E慟JQ3pRfX]->bo1FV-^я'U-c')Õzh 깨}[OnPK SWMETA-INF/MANIFEST.MFMLK-. K-*ϳR03r*)uRpOK-J,IMMut r.JAy)E) E)9 &zz\\PKiS< classes.dexKo@gHAZ<j h%Tmmֱ8"?!zင8q+@o 8ސU癝ݝfGgu+/w_ (z}9%|9K#{C B!A)QQ9@3H F% y|B" *2\Gf)"% #/E/.7/|~d9 bCQ p _{'NM v*yAIH:urix.)IqBߔak00](sJ.R.YYWB ezڶ֌AkL6t HN͚eWiհxL1bڤ,U1VZ Cyw߸Ib|nuim ])mq͈eps~;=I з_pGz.mfg@C/487MZt+-1~\PT5*daF-w3NJfʆ8ydLTeLYNL[gڦUr5j:lL)V erbLSqEu\M$  w pR ‚H"IKv!Bt "G;ҡVڑ(NB$WC]Q?D4?qے͞"H/2zZ}D=5b !Ǹ9ݻ(G;)< }I7q{PK v,,resources.arsc5 ,( ci org.fdroid.ci P0 string, app_nameThX@PK>ytAndroidManifest.xmlPK SWMETA-INF/MANIFEST.MFPKiS< sclasses.dexPK v,,resources.arscPK././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/nightly.TestCase0000755000175000017500000004576614620351225017304 0ustar00hanshans#!/usr/bin/env python3 import inspect import logging import os import requests import shutil import subprocess import sys import tempfile import time import unittest import yaml from pathlib import Path from unittest.mock import patch localmodule = os.path.realpath( os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') ) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) from fdroidserver import common, exception, index, nightly DEBUG_KEYSTORE = '/u3+7QAAAAIAAAABAAAAAQAPYW5kcm9pZGRlYnVna2V5AAABNYhAuskAAAK8MIICuDAOBgorBgEEASoCEQEBBQAEggKkqRnFlhidQmVff83bsAeewXPIsF0jiymzJnvrnUAQtCK0MV9uZonu37Mrj/qKLn56mf6QcvEoKvpCstZxzftgYYpAHWMVLM+hy2Z707QZEHlY7Ukppt8DItj+dXkeqGt7f8KzOb2AQwDbt9lm1fJb+MefLowTaubtvrLMcKIne43CbCu2D8HyN7RPWpEkVetA2Qgr5W4sa3tIUT80afqo9jzwJjKCspuxY9A1M8EIM3/kvyLo2B9r0cuWwRjYZXJ6gmTYI2ARNz0KQnCZUok14NDg+mZTb1B7AzRfb0lfjbA6grbzuAL+WaEpO8/LgGfuOh7QBZBT498TElOaFfQ9toQWA79wAmrQCm4OoFukpPIy2m/l6VjJSmlK5Q+CMOl/Au7OG1sUUCTvPaIr0XKnsiwDJ7a71n9garnPWHkvuWapSRCzCNgaUoGQjB+fTMJFFrwT8P1aLfM6onc3KNrDStoQZuYe5ngCLlNS56bENkVGvJBfdkboxtHZjqDXXON9jWGSOI527J3o2D5sjSVyx3T9XPrsL4TA/nBtdU+c/+M6aoASZR2VymzAKdMrGfj9kE5GXp8vv2vkJj9+OJ4Jm5yeczocc/Idtojjb1yg+sq1yY8kAQxgezpY1rpgi2jF3tSN01c23DNvAaSJLJX2ZuH8sD40ACc80Y1Qp1nUTdpwBZUeaeNruBwx4PHU8GnC71FwtiUpwNs0OoSl0pgDUJ3ODC5bs8B5QmW1wu1eg7I4mMSmCsNGW6VN3sFcu+WEqnmTxPoZombdFZKxsr2oq359Nn4bJ6Uc9PBz/sXsns7Zx1vND/oK/Jv5Y269UVAMeKX/eGpfnxzagW3tqGbOu12C2p9Azo5VxiU2fG/tmk2PjaG5hV/ywReco7I6C1p8OWM2fwAAAAEABVguNTA5AAAB6TCCAeUwggFOoAMCAQICBE89gTUwDQYJKoZIhvcNAQEFBQAwNzELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0FuZHJvaWQxFjAUBgNVBAMTDUFuZHJvaWQgRGVidWcwHhcNMTIwMjE2MjIyMDM3WhcNNDIwMjA4MjIyMDM3WjA3MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHQW5kcm9pZDEWMBQGA1UEAxMNQW5kcm9pZCBEZWJ1ZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3AKU7S7JXhUjEwxWP1/LPHXieh61SaA/+xbpqsPA+yjGz1sAcGAyuG6bjNAVm56pq7nkjJzicX7Wi83nUBo58DEC/quxOLdy0C4PEOSAeTnTT1RJIwMDvOgiL1GFCErvQ7gCH6zuAID/JRFbN6nIkhDjs2DYnSBl7aJJf8wCLc0CAwEAATANBgkqhkiG9w0BAQUFAAOBgQAoq/TJffA0l+ZGf89xndmHdxrO6qi+TzSlByvLZ4eFfCovTh1iO+Edrd5V1yXGLxyyvdsadMAFZT8SaxMrP5xxhJ0nra0APWYLpA96M//auMhQBWPgqPntwgvEZuEH7f0kdItjBJ39yijbG8xfgwid6XqNUo0TDDkp/wNWKpJ9tJe+2PrGw1NAvrgSydoH2j8DI1Eq' DEBUG_KEYSTORE_KEY_FILE_NAME = ( 'debug_keystore_QW+xRCJDGHXyyFtgCW8QRajj+6uYmsLwGWpCfYqYQ5M_id_rsa' ) AOSP_TESTKEY_DEBUG_KEYSTORE = '/u3+7QAAAAIAAAABAAAAAQAPYW5kcm9pZGRlYnVna2V5AAABejjuIU0AAAUBMIIE/TAOBgorBgEEASoCEQEBBQAEggTpvqhdBtq9D3jRUZGnhKLbFH1LMtCKqwGg25ETAEhvK1GVRNuWAHAUUedCnarjgeUy/zx9OsHuZq18KjUI115kWq/jxkf00fIg7wrOmXoyJf5Dbc7NGKjU64rRmppQEkJ417Lq4Uola9EBJ/WweEu6UTjTn5HcNl4mVloWKMBKNPkVfhZhAkXUyjiZ9rCVHMjLOVKG5vyTWZLwXpYR00Xz6VyzSunTyDza5oUOT/Fh7Gw74V7iNHANydkBHmH+UJ100p0vNPRFvt/3ABfMjkNbRXKNERnyN7NeBmCAOceuXjme/n0XLUidP9/NYk1yAmRJgUnauKD6UPSZYaUPuNSSdf4dD5fCQ7OVDq95e7vmqRDfrKUoWmtpndN7hbVl+OHVZXk2ngvXbvoS+F7ShsEfbq7+c37dnOcVrIlrY+wlOWX2jN42T+AkGt3AfA8zdIPdNgLGk64Op+aP4vGyLQqbuUEzOTNG9uExjGlamogPKFf93GAF83xv7AChYLR/9H+B1E955FL58bRuYOXVWJfLRsO/jyjXsilhBggo3VD1omRuOp98AkKP+P9JXCTswK7IZgvbMK3GB6QIzD20vlT0eK6JGLeWE7cXVn6oT26zvnqAjJ94PjS+YckMOExhqwCivPp1VaX6JzpQ1wr52OsGDUvconcjYrBEHBiY+UnMUk0Wj4mhZlJd1lpybZcWZ3vhTIlM0uMt4udl7t+zsgZ6BW97/pkGaa+QoxeTvgNlHGYyDYp8hveM3bCLXTHULw8mXUHxOJawq/J3E6vZ5/h2nzfmQmWtZtBOGWCkq+gKusTFUsHghjvHsPcQ2+EVfMcePBb/FKvtzSgH59C3iNOHE29l3ceSqccgxlxfStzbf+QkP7gxGVGZ8rLnCn3s8WzkGHZE4LtS0Zm3Y+hV5igrClk940YZP1hmilt2y7adPE4gCyQjb44JXgc3/NxlkZJcmeZTfAGxMXT8HG6Use/Kti114phsF7GDrqk1kPbB51Hr3xF1NAJUWP3csg3jgTS3E6jgD5XjPPG9BEDE2MwnBlUUMe3TC8TIWkK+AlwjlsDr5B9nqy2Fevv62+k5Adplw+fsQ8VzZREZF+MllWO3vtkD6srdx9h4vPD3dp5urFCFXNRaoD3SMDk27z3EVCQZ4bPL5PsVpB/ZBotLGkUZ0yi+5oC+u7ByP1ihMXMsRgvXbQpyOonEqDy84EZiIPWbyzGd0tEAXLz3mMh1x/IqZ1wxyDT/vkxhNCFqlBNlRW6GbMN2cng4A9Cigj9eNu9ptL1tdgFTxwndjoNRQMJ0NAc6WnsQ1UeIu8nMsa8/kLDtnVFLVmPQv2ZBUM4mxLrwC1mxOiQrWBW2XJ1OIheimSkLHfQOef1mIH3Z0cBuLBKGkRYGaXiZ6RX7po+ch0WFGjBef3e3uczl1mT5WGKdIG4x1+aRAtJHL+9K7Z6wzG0ygoamdiX2Fd0xBrWjTU72DzYbceqc+uHrbcLKDa5w0ENhyYK0+XEzG5fXHjFgmawY1D7xZQOJZO3jxStcv+xzoiTnNSrIxbxog/0Fez/WhMM9H6gV4eeDjMWEg79cJLugCBNwqmp3Yoe5EDU2TxQlLT53tye3Aji3FbocuDWjLI3Jc5VDxd7lrbzeIbFzSNpoFG8DSgjSiq41WJVeuzXxmdl7HM4zQpGRAAAAAQAFWC41MDkAAASsMIIEqDCCA5CgAwIBAgIJAJNurL4H8gHfMA0GCSqGSIb3DQEBBQUAMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAeFw0wODAyMjkwMTMzNDZaFw0zNTA3MTcwMTMzNDZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBANaTGQTexgskse3HYuDZ2CU+Ps1s6x3i/waMqOi8qM1r03hupwqnbOYOuw+ZNVn/2T53qUPn6D1LZLjk/qLT5lbx4meoG7+yMLV4wgRDvkxyGLhG9SEVhvA4oU6Jwr44f46+z4/Kw9oe4zDJ6pPQp8PcSvNQIg1QCAcy4ICXF+5qBTNZ5qaU7Cyz8oSgpGbIepTYOzEJOmc3Li9kEsBubULxWBjf/gOBzAzURNps3cO4JFgZSAGzJWQTT7/emMkod0jb9WdqVA2BVMi7yge54kdVMxHEa5r3b97szI5p58ii0I54JiCUP5lyfTwE/nKZHZnfm644oLIXf6MdW2r+6R8CAQOjgfwwgfkwHQYDVR0OBBYEFEhZAFY9JyxGrhGGBaR0GawJyowRMIHJBgNVHSMEgcEwgb6AFEhZAFY9JyxGrhGGBaR0GawJyowRoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJAJNurL4H8gHfMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHqvlozrUMRBBVEY0NqrrwFbinZaJ6cVosK0TyIUFf/azgMJWr+kLfcHCHJsIGnlw27drgQAvilFLAhLwn62oX6snb4YLCBOsVMR9FXYJLZW2+TcIkCRLXWG/oiVHQGo/rWuWkJgU134NDEFJCJGjDbiLCpe+ZTWHdcwauTJ9pUbo8EvHRkU3cYfGmLaLfgn9gP+pWA7LFQNvXwBnDa6sppCccEX31I828XzgXpJ4O+mDL1/dBd+ek8ZPUP0IgdyZm5MTYPhvVqGCHzzTy3sIeJFymwrsBbmg2OAUNLEMO6nwmocSdN2ClirfxqCzJOLSDE4QyS9BAH6EhY6UFcOaE21IJawTAEXnf52TqT7diFUlWRSnQ==' AOSP_TESTKEY_DEBUG_KEYSTORE_KEY_FILE_NAME = ( 'debug_keystore_k47SVrA85+oMZAexHc62PkgvIgO8TJBYN00U82xSlxc_id_rsa' ) class Options: allow_disabled_algorithms = False clean = False delete_unknown = False nosign = False pretty = True rename_apks = False verbose = False class NightlyTest(unittest.TestCase): basedir = Path(__file__).resolve().parent path = os.environ['PATH'] def setUp(self): common.config = None nightly.config = None logging.basicConfig(level=logging.WARNING) self.basedir = Path(localmodule) / 'tests' self.testroot = Path(localmodule) / '.testfiles' self.testroot.mkdir(exist_ok=True) os.chdir(self.basedir) self.tempdir = tempfile.TemporaryDirectory( str(time.time()), self._testMethodName + '_', self.testroot ) self.testdir = Path(self.tempdir.name) self.home = self.testdir / 'home' self.home.mkdir() self.dot_android = self.home / '.android' nightly.KEYSTORE_FILE = str(self.dot_android / 'debug.keystore') def tearDown(self): self.tempdir.cleanup() try: os.rmdir(self.testroot) except OSError: # other test modules might have left stuff around pass def _copy_test_debug_keystore(self): self.dot_android.mkdir() shutil.copy( self.basedir / 'aosp_testkey_debug.keystore', self.dot_android / 'debug.keystore', ) def _copy_debug_apk(self): outputdir = Path('app/build/output/apk/debug') outputdir.mkdir(parents=True) shutil.copy(self.basedir / 'urzip.apk', outputdir / 'urzip-debug.apk') def test_get_repo_base_url(self): for clone_url, repo_git_base, result in [ ( 'https://github.com/onionshare/onionshare-android-nightly', 'onionshare/onionshare-android-nightly', 'https://raw.githubusercontent.com/onionshare/onionshare-android-nightly/master/fdroid', ), ( 'https://gitlab.com/fdroid/fdroidclient-nightly', 'fdroid/fdroidclient-nightly', 'https://gitlab.com/fdroid/fdroidclient-nightly/-/raw/master/fdroid', ), ]: url = nightly.get_repo_base_url(clone_url, repo_git_base) self.assertEqual(result, url) r = requests.head(os.path.join(url, 'repo/index-v1.jar'), timeout=300) # gitlab.com often returns 403 Forbidden from their cloudflare restrictions self.assertTrue(r.status_code in (200, 403), 'should not be a redirect') def test_get_keystore_secret_var(self): self.assertEqual( AOSP_TESTKEY_DEBUG_KEYSTORE, nightly._get_keystore_secret_var( self.basedir / 'aosp_testkey_debug.keystore' ), ) @patch.dict(os.environ, clear=True) def test_ssh_key_from_debug_keystore(self): os.environ['HOME'] = str(self.home) os.environ['PATH'] = self.path ssh_private_key_file = nightly._ssh_key_from_debug_keystore( self.basedir / 'aosp_testkey_debug.keystore' ) with open(ssh_private_key_file) as fp: assert '-----BEGIN RSA PRIVATE KEY-----' in fp.read() with open(ssh_private_key_file + '.pub') as fp: assert fp.read(8) == 'ssh-rsa ' shutil.rmtree(os.path.dirname(ssh_private_key_file)) @patch.dict(os.environ, clear=True) @patch('sys.argv', ['fdroid nightly', '--verbose']) def test_main_empty_dot_android(self): """Test that it exits with an error when ~/.android is empty""" os.environ['HOME'] = str(self.home) os.environ['PATH'] = self.path with self.assertRaises(SystemExit) as cm: nightly.main() self.assertEqual(cm.exception.code, 1) @patch.dict(os.environ, clear=True) @patch('sys.argv', ['fdroid nightly', '--verbose']) def test_main_empty_dot_ssh(self): """Test that it does not create ~/.ssh if it does not exist Careful! If the test env is wrong, it can mess up the local SSH setup. """ dot_ssh = self.home / '.ssh' self._copy_test_debug_keystore() os.environ['HOME'] = str(self.home) os.environ['PATH'] = self.path assert not dot_ssh.exists() nightly.main() assert not dot_ssh.exists() @patch.dict(os.environ, clear=True) @patch('sys.argv', ['fdroid nightly', '--verbose']) def test_main_on_user_machine(self): """Test that `fdroid nightly` runs on the user's machine Careful! If the test env is wrong, it can mess up the local SSH setup. """ dot_ssh = self.home / '.ssh' dot_ssh.mkdir() self._copy_test_debug_keystore() os.environ['HOME'] = str(self.home) os.environ['PATH'] = self.path nightly.main() assert (dot_ssh / AOSP_TESTKEY_DEBUG_KEYSTORE_KEY_FILE_NAME).exists() assert (dot_ssh / (AOSP_TESTKEY_DEBUG_KEYSTORE_KEY_FILE_NAME + '.pub')).exists() @patch('fdroidserver.common.vcs_git.git', lambda args, e: common.PopenResult(1)) @patch('sys.argv', ['fdroid nightly', '--verbose']) def test_private_or_non_existent_git_mirror(self): """Test that this exits with an error when the git mirror repo won't work Careful! If the test environment is setup wrong, it can mess up local files in ~/.ssh or ~/.android. """ os.chdir(self.testdir) with patch.dict( os.environ, { 'CI': 'true', 'CI_PROJECT_PATH': 'thisshouldneverexist/orthistoo', 'CI_PROJECT_URL': 'https://gitlab.com/thisshouldneverexist/orthistoo', 'DEBUG_KEYSTORE': DEBUG_KEYSTORE, 'GITLAB_USER_NAME': 'username', 'GITLAB_USER_EMAIL': 'username@example.com', 'HOME': str(self.testdir), 'PATH': os.getenv('PATH'), }, clear=True, ): with self.assertRaises(exception.VCSException): nightly.main() def _put_fdroid_in_args(self, args): """Find fdroid command that belongs to this source code tree""" fdroid = os.path.join(localmodule, 'fdroid') if not os.path.exists(fdroid): fdroid = os.getenv('fdroid') return [fdroid] + args[1:] @patch('sys.argv', ['fdroid nightly', '--verbose']) @patch('platform.node', lambda: 'example.com') def test_github_actions(self): """Careful! If the test env is bad, it'll mess up the local SSH setup https://docs.github.com/en/actions/learn-github-actions/environment-variables """ called = [] orig_check_call = subprocess.check_call os.chdir(self.testdir) os.makedirs('fdroid/git-mirror/fdroid/repo') # fake this to avoid cloning self._copy_test_debug_keystore() self._copy_debug_apk() def _subprocess_check_call(args, cwd=None, env=None): if os.path.basename(args[0]) in ('keytool', 'openssl'): orig_check_call(args, cwd=cwd, env=env) elif args[:2] == ['fdroid', 'update']: orig_check_call(self._put_fdroid_in_args(args), cwd=cwd, env=env) else: called.append(args[:2]) return with patch.dict( os.environ, { 'CI': 'true', 'DEBUG_KEYSTORE': DEBUG_KEYSTORE, 'GITHUB_ACTIONS': 'true', 'GITHUB_ACTOR': 'username', 'GITHUB_REPOSITORY': 'f-droid/test', 'GITHUB_SERVER_URL': 'https://github.com', 'HOME': str(self.testdir), 'PATH': os.getenv('PATH'), 'fdroid': os.getenv('fdroid', ''), }, clear=True, ): self.assertTrue(self.testroot == Path.home().parent) with patch('subprocess.check_call', _subprocess_check_call): try: nightly.main() except exception.BuildException as e: if "apksigner not found" in e.value: self.skipTest("skipping, apksigner not found due to fake $HOME") else: raise self.assertEqual(called, [['ssh', '-Tvi'], ['fdroid', 'deploy']]) self.assertFalse(os.path.exists('config.py')) git_url = 'git@github.com:f-droid/test-nightly' mirror_url = index.get_mirror_service_urls({"url": git_url})[0] expected = { 'archive_description': 'Old nightly builds that have been archived.', 'archive_name': 'f-droid/test-nightly archive', 'archive_older': 20, 'archive_url': mirror_url + '/archive', 'keydname': 'CN=Android Debug,O=Android,C=US', 'keypass': 'android', 'keystore': nightly.KEYSTORE_FILE, 'keystorepass': 'android', 'make_current_version_link': False, 'repo_description': 'Nightly builds from username@example.com', 'repo_keyalias': 'androiddebugkey', 'repo_name': 'f-droid/test-nightly', 'repo_url': mirror_url + '/repo', 'servergitmirrors': [{"url": git_url}], 'update_stats': True, } with open('config.yml') as fp: config = yaml.safe_load(fp) # .ssh is random tmpdir set in nightly.py, so test basename only self.assertEqual( os.path.basename(config['identity_file']), DEBUG_KEYSTORE_KEY_FILE_NAME, ) del config['identity_file'] self.assertEqual(expected, config) @patch('sys.argv', ['fdroid nightly', '--verbose']) def test_gitlab_ci(self): """Careful! If the test env is bad, it can mess up the local SSH setup""" called = [] orig_check_call = subprocess.check_call os.chdir(self.testdir) os.makedirs('fdroid/git-mirror/fdroid/repo') # fake this to avoid cloning self._copy_test_debug_keystore() self._copy_debug_apk() def _subprocess_check_call(args, cwd=None, env=None): if os.path.basename(args[0]) in ('keytool', 'openssl'): orig_check_call(args, cwd=cwd, env=env) elif args[:2] == ['fdroid', 'update']: orig_check_call(self._put_fdroid_in_args(args), cwd=cwd, env=env) else: called.append(args[:2]) return with patch.dict( os.environ, { 'CI': 'true', 'CI_PROJECT_PATH': 'fdroid/test', 'CI_PROJECT_URL': 'https://gitlab.com/fdroid/test', 'DEBUG_KEYSTORE': DEBUG_KEYSTORE, 'GITLAB_USER_NAME': 'username', 'GITLAB_USER_EMAIL': 'username@example.com', 'HOME': str(self.testdir), 'PATH': os.getenv('PATH'), 'fdroid': os.getenv('fdroid', ''), }, clear=True, ): self.assertTrue(self.testroot == Path.home().parent) with patch('subprocess.check_call', _subprocess_check_call): try: nightly.main() except exception.BuildException as e: if "apksigner not found" in e.value: self.skipTest("skipping, apksigner not found due to fake $HOME") else: raise self.assertEqual(called, [['ssh', '-Tvi'], ['fdroid', 'deploy']]) self.assertFalse(os.path.exists('config.py')) expected = { 'archive_description': 'Old nightly builds that have been archived.', 'archive_name': 'fdroid/test-nightly archive', 'archive_older': 20, 'archive_url': 'https://gitlab.com/fdroid/test-nightly/-/raw/master/fdroid/archive', 'keydname': 'CN=Android Debug,O=Android,C=US', 'keypass': 'android', 'keystore': nightly.KEYSTORE_FILE, 'keystorepass': 'android', 'make_current_version_link': False, 'repo_description': 'Nightly builds from username@example.com', 'repo_keyalias': 'androiddebugkey', 'repo_name': 'fdroid/test-nightly', 'repo_url': 'https://gitlab.com/fdroid/test-nightly/-/raw/master/fdroid/repo', 'servergitmirrors': [{"url": 'git@gitlab.com:fdroid/test-nightly'}], 'update_stats': True, } with open('config.yml') as fp: config = yaml.safe_load(fp) # .ssh is random tmpdir set in nightly.py, so test basename only self.assertEqual( os.path.basename(config['identity_file']), DEBUG_KEYSTORE_KEY_FILE_NAME, ) del config['identity_file'] self.assertEqual(expected, config) if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) import argparse parser = argparse.ArgumentParser() parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) common.options = common.parse_args(parser) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(NightlyTest)) unittest.main(failfast=False) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/no_targetsdk_minsdk1_unsigned.apk0000644000175000017500000000433214620351225022651 0ustar00hanshansPK 04AndroidManifest.xmlR;N@q$Q#HD(A`b%v"B8sP:H{ovb&v@ah!^}"4@</N|'{x%>ưpKF6Z~e%x> +&KwKcXuejL9ћ%{3<3lr?WAH=)P!1gǹLS1 iGX5X1MP)ט}/V8y_ bO˕?7C+u m匩;L \QxP2ypğWLz_ѕ9x)ܫ|Bϥwj[5[k[[l2ˁKw'c;KcMv;x*u-rw"ԤVEw7r+sϹ] n+}nzRռsy_~~X5uv;PK SWMETA-INF/MANIFEST.MFMLK-. K-*ϳR03r*)uRpOK-J,IMMut r.JAy)E) E)9 &zz\\PK-*8 classes.dexOAGaAnj*51d]v"x_'5`L8z7ݩy̛͛׷ÑG3#|[ROMgFtLJr%@RGYCe@BF2 Ed y#OBpn#cMd) RF /WȞB?ϷE3]|>ARlH?jznkwV ߷iq&eTTɋogadB9qpHs ^L%kڛ{Cıx|M۬݀B!KO-VrO/,LKO;Yo:9^$J^VTm;5Z3[ښ带]J[uSpᔘmUt(Cl_բvI_0ڿZKA$TK^uL]L-N8]>'dz?lk475{ۢ%:ibӲRۋ ƽ U2k: I>V4\1ceG7IOPFuƴuCtʮ2F-UʦSO*u\v5'S :A8+!A$$!r|W:YaŮt(Q;p0xQ"A :Z5w 8ZVP?1@n[O" ZEVAǐ>#FH< \gPz{(<> PK v,, resources.arsc5 ,( ci org.fdroid.ci P0 string, app_nameThX@PKyBtAndroidManifest.xmlPK SWMETA-INF/MANIFEST.MFPK-*8 classes.dexPK v,,resources.arscPK././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/openssl-version-check-test.py0000755000175000017500000000162714620351225021725 0ustar00hanshans#!/usr/bin/env python3 # # implementing a version check of known bad OpenSSL versions, for example: # https://support.google.com/faqs/answer/6376725?hl=en # # This is used in update.has_known_vulnerability() import re import requests # this list was generated using: # for f in `curl | grep -Eo '[0-9]\.[0-9]\.[0-9][a-z]?' | sort -u`; do echo "'$f',"; done versions = [ ] r = requests.get('https://www.openssl.org/news/changelog.html', timeout=300) safe = set() bad = set() for m in re.findall(b'[0-9]\.[0-9]\.[0-9][a-z]?', r.content): version = str(m, encoding='utf-8') if (version.startswith('1.0.1') and len(version) > 5 and version[5] >= 'r') \ or (version.startswith('1.0.2') and len(version) > 5 and version[5] >= 'f') \ or re.match(r'[1-9]\.[1-9]\.[0-9].*', version): safe.add(version) else: bad.add(version) print('safe:', sorted(safe)) print('bad:', sorted(bad)) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/org.bitbucket.tickytacky.mirrormirror_1.apk0000644000175000017500000001600514620351225024547 0ustar00hanshansPKTID"META-INF/MANIFEST.MFmKo@; ߁cDM}mӤ: n*9 5V]@AX~ \8ݓ/d.${]ӵdkHR 9c2Ow]e'B{M.]bu ^} Ks2P`rZSQ"O+>G{QC K839ERH+p:L8+ќ <)poPK"PKTID sb!META-INF/E16A6514.SFmKo@ཉet(j|[u ̈#O 6MԸ;Qx DZ`4 !ڬo6㒇2;h& JN!c0e]_m#L6x}k6 ڔ/]^F„vE_+_Z| OrޗmXNWzZ|50%AJz(4 /z(*؜8cMY8f!3V!ok)N\O_N%X@4B ClYǴ9W Z7D Ʈ&|{^-RwzV]G^U(H*)A.tvFoEs Cog8 cPK sb!PKTID˼h 44META-INF/E16A6514.RSA3hb5`jhδUѠUѐπ"`PǸ9٠9ޠ}3#KO xjZ 8٘CY؄B y @af w6񸄹R3S \@0f8E8K41*!{(pyاSǞ9_a #O-9_{Jy_1o\*H)O+Y^wٗ#[wqao޳Wf{t7WVߒwlѥ~,n~KClիQj̊ =3\j]\>RfcKCV`ES&=of}<3#bEyY`򱈱Hfnh̉- .+M3(fEl SUoK kNpf\1uG;kn5+/P')vfyuZU^fc/`I-,|U{J#^{KOC[o 3YbYv Uuz2űJ4̫dO o-l{fӟW!7_hz?qJXӤ~ͳzc_5|lrY׉R%JIQ!j Ԕ4;޵;|swf߃OyS=*S6=5#SX>ַCVҬX|# 1=ݢG2s9ۨlRvtV-W~1{3jC4nTr&dzmx<֕G·kzoe-] =>w3hTUk*.$l>tn5,{#?=zӳw:EQ~,]v?s^<y{ kocdl~86 վGrYuJ }YdGmG,wh=RAn ϱ΅͸iV3>`צ^ܤ_:ggM+|'םo8Vh[} S Vh(hx_5tnxe&l&Z*#3$Y JTirdVY|<>Èo"nDmC.{c;Ltп7~?+~%ҟ\5Pֲ7\D1x56 pb[~EEr\ d _N"Ǔrl={2p5 i][5:tds,xKQ~~Lğ9Do9-Gze-Jy*y]wVhsw1quoOJ|q_PK,lX{$ PK n=Du\\resources.arsc \p(5res/layout/main.xmlres/drawable-mdpi/mirror.png Mirror Mirrororg.bitbucket.tickytacky.mirrormirrorlP,attrdrawablelayoutstringD( mirrormainapp_name8L<$8L<$8L<$PK n=Dm[[res/drawable-mdpi/mirror.pngPNG  IHDR00ri["IDATHc<@`b0aTèQ F5jQ+,`IENDB`PKm=Dad# | classes.dexklW<}Q{8N@u"Iv5Nli&xwbǑjTm$RDTB HBBj UH@A !R! c0oι;wܙ5[ӹy+u}o?~tx}7>SKT&-E U !#4uB 1?C _???OǠh;87/A(Jl_A=8APEP>gsp\W}x~~ nJ%zݠ QP' gy&A4I ցS`<2ATV`} T6 "ĄErXKX2ԁz@bAHfVUJOUUPώaOTIVթ Ovz/ꬕ:N9R^OT*RU*}KEX uv^.) ߝMF#;tZ8өGqv]5H̢WW:c|5~X :^D/F#O ̩RMܾm1RleĨs!&M<]eҟeo-}GqkI<ؒrӒB⽨uʱrB_RKi\x1J;lwg.zJ {bIs$}{=F^RIɑrSpKv!kyߞ.J/%Ƿ?_pڳ]n{[#h:Z]ԾPet gLSk (ZLo^.[k~ڪ%.[piPD3u&+yzbb]Լl>O4B \,ا|ӷKNKLM:nCW?`M zgɐ-Do6oY.2fCئ}e͹;)vԜo┝]s*h}60mg16gv1 ~5Ϙl;Mќ+MO o.JUG@\Kh?~~͑>CQ#mr5y XO:HyY(\=)иI&,8-.@kK.KZE,OJo rVkfУ<")8i>)66&("K)qYMU ҧ N $)|LZoQܹ@wϘv.W)YjYb73EgRr]H/-jʋcK?⚎Wd7-/b.[2 $K!*ZgQgX~M'o *A/o}R b{m6|SܻcZX٠bY0 >(ʹ{>xos(LGmR~oSKJ!(<9vݟ= ̘ig?W^(#Np(ٱ1Z[;B+_ ii; ;>W_B@HY۪`|m=AP6hC->tL _{Y=FPbQ:&z#̀w*Nqv2ةmŎM7PSF=YQ(*Sj_7457|Yg{k+1R*j3JV(ո\6-{`ПO1=n5kwk4%GEVðD_ _TǰG ۃT˰}Hߌf')ɠB0#;F1}/ #˾!qۆ}HPKad# |PKTID"META-INF/MANIFEST.MFPKTID sb!dMETA-INF/E16A6514.SFPKTID˼h 44META-INF/E16A6514.RSAPKm=DU res/layout/main.xmlPKm=D,lX{$ AndroidManifest.xmlPK n=Du\\g resources.arscPK n=Dm[[res/drawable-mdpi/mirror.pngPKm=Dad# | classes.dexPK ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/org.bitbucket.tickytacky.mirrormirror_2.apk0000644000175000017500000001565414620351225024561 0ustar00hanshansPKVIDJk!META-INF/MANIFEST.MFmKo@; ߁cC &oR@ʥUhO_4i5Nf~_@6TjHQ0wfR)k֌wR*}P\eIюT)TT\+T^N]CG=.ӧ6Y4ڑ._ rF?a8cFŸcvuZufн'LErG䫝? -ra‰CI>MIR ZF2 =wY- p[}e&)U3r`z9j|{f|ɭhNq3gFY4'PKJk!PKVIDb!META-INF/E16A6514.SFmn@ཉ D!U+j70AO_ۦI5|䦂X%d-m6aв3b{ Aj͔og]Tuhn~j6B`X}~~t:C%TT>ޯe7s?Ii'KvH]f0S).S_qCTt$暈َiYs2);΂l|yo#wqao޳Wf{t7WVߒwlѥ~,n~KClիQj̊ =3\j]\>RfcKCV`ES&=of}<3#bEyY`򱈱Hfnh̉- .+M3(fEl SUoK kNpf\1uG;kn5+/P')vfyuZU^fc/`I-,|U{J#^{KOC[o 3YbYv Uuz2űJ4̫dO o-l{fӟW!7_hz?qJXӤ~ͳzc_5|UYo,|Q_Ymv:g$>1i5=|ڳgs+g>+kqWۦ{vmxm4[}<!;kl _uM8~ӂsMvJ.XbQU?ler\Oz~_jRl.9O%VsrY܌YS?_YĠ-(?̽4eIvKy?PK/-54PK=DU res/layout/main.xml]J1tBRDą@f/]\f.&&C&*|k=)z~7䯠 }1mPeA5|C7x::Z郞_Oﶍf\& Uvm*7F6_Ʋ ҫbW։|.[b3|G/4FTa~1.sfΙ, Yq`g)|3PKU PK=DV( AndroidManifest.xmlnE8NH"HdqHVPP"Xg.6i%68( ,+ <,XXsSc.]USjz봔hY+5 Xs|~v">]3+.|~_^>߀o`H!EUUVJ"BPD%"> QJ*!VJT򿏵7~s=>{)Z];w̾X}>I[?r$&l& {;,D 5ȗ!ÐvPC0N3E0 ΃-pD(yS[pP(zpx aA4x>' Ff&ݠ 8N`\W5:x ,_G)P#`x`\_QhxgwKUe", ZX3FB8EP &$ֹ `hA<2Brl zCr<}z?D-Rg?'^Ym۰GjtRO;j5rM`3Rg}1|X<~H1ln.㴟R<*=cvHGIzyE9UyqVw/:c@dws.U:esa.4eFLq|8\F+|kp;؏~r]+|n]RU9o!Rƥ*ۉwQ*m;8=3v[vٓ۟2gMR(waRI %Oj~Mb֬T =k 9J eǷ?_tʔ]Lߵsn{,X#h:Z9X2e9ӵB 8 Ӆ[fi?G+q%qֶGw9!&umR; |,糦}ӷNS(=ۙ-u'?fMO ٪gK3=4_*Rj̃OY!l3]ʲhgNf'lbp]8dm-⚭IzFLYͳj}{/9۔̅fQ6bs&%m(}:hEe1S,,/E{:m 8Q:{R, !sqMZ>qYiԄ:UVPTʮoOKf< MYOMb5;Ә9#e׵Lߢtٹs5]> kP^Vbw;\yRPE +C +eqM+VVL1m7YRصJY䙳Vq|)X>%̒uDScӂrUA׆ok{wkU\-iQa6v3ZJRV"jXdl-RFT%P5hZSM]Q>unw .@pzIoO=Acd͹*8 :عr O/lq䛍qb+@}QIj;]=`L2+iG?wC NWQYUST!a&(ۍk䩜n43|}:# q0]yp?u#Z;W/jgDd:ghe^ 7t[vk9i>PKb`!PKλD)HQZ44META-INF/E16A6514.RSA3hb5`jhδUѠUѐπ"`PǸ9٠9ޠ}3#KO xjZ 8٘CY؄B y @af w6񸄹R3S \@0f8E8K41*!{(pyاSǞ9_a #O-9_{Jy_1o\*H)O+Y^wٗ#[wqao޳Wf{t7WVߒwlѥ~,n~KClիQj̊ =3\j]\>RfcKCV`ES&=of}<3#bEyY`򱈱Hfnh̉- .+M3(fEl SUoK kNpf\1uG;kn5+/P')vfyuZU^fc/`I-,|U{J#^{KOC[o 3YbYv Uuz2űJ4̫dO o-l{fӟW!7_hz?qJXӤ~ͳzc_5|O)XvcJ|!gob.+qJ"IL|'~Z}xx=Ju!ՙ&+ >^:t7R茇n{$Zpc{lkֱ|E%T-]K2=J}7BWhW6/ w>l@}$?]FGj}7%+/ Q$uBr Z\]3/ V'[ve5{2N~[ xmM3֥Q5vU(Q/8N]p0'LC;J5~ n_-p|  >CJ@'ȁpNW>x\W;x|Dπu`+(`Lo6 >U#ʂ` @Elk-&bB)oa: N, Rw;X:@dR "?V,X>/ƓE.Ѓb<},z@?-K?' &BmO B~3bl> &_Ly|e,rRx [h qc)vO1i-#d+q*ve80v\<(bKL/rA.Ctr#!󣅏Gv1omNdNge^=\hKFx~Bf\*d,u7' $mػn?#MWͨO`4t?G%6߂qJMߋٙY = a.%ۚkTbىVbS&4FMk])&C5BWN*t2~ڎcu$mОZ0la#He4/AǓZE1"ގ˽ZfeY-Cd>KEfb("5kg:tyRyLæ])އy)fIET{mm9=ݪ5Hm.ȝyخc]oez[דI~,R'RU'DF}B玳-\+]ZՆ1d8k=8_GkL!ǤNS,>{vt39 NRkE se8fߘ2x:h8P5σGl,ަfߜ PK@?t$ PKλD0#META-INF/MANIFEST.MFPKλDb`!eMETA-INF/E16A6514.SFPKλD)HQZ44META-INF/E16A6514.RSAPKDU ~res/layout/main.xmlPKDBJAndroidManifest.xmlPK Du\\5 resources.arscPK Dm[[res/drawable-mdpi/mirror.pngPKD@?t$  Wclasses.dexPK ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/org.bitbucket.tickytacky.mirrormirror_4.apk0000644000175000017500000001467414620351225024564 0ustar00hanshansPKX^D``META-INF/MANIFEST.MF]MO@; e%`֏V(\̖]F`]_/FdɬH_lv40UFZFWpak'w@iFiʚTܚt]U&p-8ZtO0lg{}®qgJ~`R g z6whGM3w6O?D^)nnvL&n꽶[  m88,q8›̎wNhOPK``PKY^D v?META-INF/E16A6514.SFmn@ཉRI@Q)؈G }ژ&jsCr$+ jD@Ђ[JGӛplwW!Uq@Ja)υJ=(ݦ`$/͆I550$'S@Y,%N6` ')=̓IOfg#bs 1f h){<,h]Exۻ+WQT!`PL- WD#!&]6`\:Vػ1 m ✨ (@Z;p$f_+ q*e/?PK v?PKY^D74META-INF/E16A6514.RSA3hb5`jhδUѠUѐπ"`PǸ9٠9ޠ}3#KO xjZ 8٘CY؄B y @af w6񸄹R3S \@0f8E8K41*!{(pyاSǞ9_a #O-9_{Jy_1o\*H)O+Y^wٗ#[wqao޳Wf{t7WVߒwlѥ~,n~KClիQj̊ =3\j]\>RfcKCV`ES&=of}<3#bEyY`򱈱Hfnh̉- .+M3(fEl SUoK kNpf\1uG;kn5+/P')vfyuZU^fc/`I-,|U{J#^{KOC[o 3YbYv Uuz2űJ4̫dO o-l{fӟW!7_hz?qJXӤ~ͳzc_5|؆'=wyg=Q.ɮJ[+mBmύLix^|D,'zkjҔ}N_wbgg-/ ~ZcOO^7NoR?_ ͍Gjz2MXիYqGkK6mQ}I>{}PK74PKK^Dټ{( AndroidManifest.xmlTMOSA=壔Rʗ@)F5lˇ„4FkK[R00.\ +`ҕ?Kky3ssܙyQppl'pOCxE%S'7DL|%N&_SXw7'w\FXDy ә>G+ -xFƦ@o3ƪ}R滏yړh3nʱJ VpݐhW[xF]h " ^pÖ]*=28TXW\pUURĜ;dtZWʋUUsyV[:͠8 .~?%Ax WO] P5:P5me',-aKEm'iPO/ dR "?Y|J'\ /$?{}AWqدMG#~-DŽ^Z35Ekr|~Fѿq?Z>C|_k>+(_v.$_S:ʔT 0.~YŮqC||{\FQ"\J.ee .4e <ϑ'2Nޅi=7 ȴ (2#}3 u{JƸKaXjl2XFEIA$*KʸQE)M?]^eTQSJbc4eɥ<~Rp´'<, XФ'k' i/dSG.]ix&esڰJ<\&6|,RBpƅ"*R\1mVbOTʮ7[bU§NXQR1KᚔrikaAt F Aչרn˭S V~r)֪f7H+( 2L{pǐ(ySbWT A?) ބ:mLROZEoOP^qIK_h!;(nEenۯzUEkՈܿ|W"o_u%/~u%/I/S:E|EJ%`"4%ԥ(jGpkQx: x6VgKxfY2ݍUeCU9"$cҴ)$T~]gZ4=w&p#W%5 KrbҿcV\nk.IuT^U fZPf%m5UYžo)=%@sT{BwEðw)+܀v/lב["Y Bsbe؟w6$7PKOp <PKX^D``META-INF/MANIFEST.MFPKY^D v?>META-INF/E16A6514.SFPKY^D74META-INF/E16A6514.RSAPKK^Dټ{( 9AndroidManifest.xmlPK L^D- resources.arscPK K^Dm[[ res/drawable-mdpi/mirror.pngPKK^DOp < classes.dexPK././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/org.dyndns.fules.ck_20.apk0000644000175000017500000040254514620351225020752 0ustar00hanshansPKZuI@ META-INF/MANIFEST.MFW˒HWDC-g°x HG|  &CǮE-=#{Ϲ2.a}}^/OS IBR{9<}y2AI'D jTہv.RC 7vi&SGm's.~b a͈A"XV^PF9 ~)dOf8VÜ2UK?>HY | $q-sq]f뾔oۛ;'ݣtѶ'y=wy+7 0h_2_sH_Aa q=al41Xh4uY@ ~ QX ûPZ@ż ³]||p܇H[{HLx.ވToGJF^M;!k'Aϝ0Kgkhbƿ u$l*K0bg^LJ}9k5. D\ٳphNmטw5A x>$newB0K_.Z]N1Ggպ5J{s>}ZMɵ%%Ӎ}p:t1-{+m/#Ș G6F{FW 76?e2v&\,8N{-l#mQfRKnbO!d|w }-AuIU׵;q9'v3^XJ M%bWJaPK@ PKZuI[Xu5META-INF/AD1279E6.SFWێX}gb,@y䢀xx*_?Vw&Ş7B{h0epqz%~QrP:#*aB#(tO65hH3>~0%tJS򗁁!yAyzo/PZĞMk| $e $Âha|oOo/uջp*/uU/mCt|ޡ4hX3=FE=b< Y0FɮAWcgTxr!<м]*[:`(FP "Upi^&$kŷ*(jX9Yp3jMw 05A\E0}P vExP%Q@ǹ闃Sϫ"Y=X\xw~zgjt`F.nb%nbwP4OkX+KXJ1fUI|P#/&;q*ؖ^TR0?q38x]Bqz4_󀢄y{8#RZ*1qRyN*;;=["8 goAvN˩EK@"\\kݡљ1>Kh'ґF'ڙB#kEGyo{w냢ARi!",/v;W>l~ ʞ؃jc;ǥ#P|^7r> n|CqD"${wg{ow:Ҳʊ4#] WWb{cK1И5<Zkoi 2s`gn5Zْ3ųR`Xp ,xvG/uz:"c&%~[iGP2>L/CmQtKݍAǠ:fqwGs2ҙ~͵e~轀@X<0љ$YHT¬;_hVN?аwY61!Ukm';i?kuVSKlEE:|,$LW8JV,fG PK[Xu5PKZuI-U#  META-INF/AD1279E6.RSA3hbegjhδA&FFCnN6Vm>f&)Vn"MM6ML* X/0adjI&mcp3x %̕R_n4(- 0 y , M,L,yM \:Q ی M @q.&FF>^h'vO/ ^:ghū'T0&^-><_^M ޜOV=}:x-=i17t˦^ ׹[ҫkUi?OQX~[i0/Q!L)-T\׉{EzみJ3d}++oݶBIC-FH}sC+f&6yDg\rz%[$ dgL孹?>//X[Pv-a0&ܳW-wjVR7e7}^K_`P6k{v;Z;]ˮl_+\\e \Vp CƼ+ U-nY;1 n6m+|~u>ߢ]7q<]Ϫ8q-Kuw)܃}DĿI0dq! 7͕mO'ξ-tS59Qk}+{DK7yql ݭOInO]&~`*f4 'ThEШAU7҉z; {kp݃0K׵Yn_졲VNjLFoN~P>`n}M͟g::q,<{wOܬjWd5p.`Q9yC˼GX]~f}xd((rv3n,)nDBBZǬ*g^^_Mc9&g/tcaw]҄wzE5mئh->GHIlsSW=PK-U#  PKfAtIqa()META-INF/buildserveridI0 &"x0]u֦ARPKqa()PKfAtIqa()META-INF/fdroidserveridI0 &"x0]u֦ARPKqa()PKeAtI$ AndroidManifest.xmlo[Eq7M$4&iEĭ-J[5iC%0X+ym N{F=r8rCgǻz>G߷;ٗR=-IE*"KÛ/#/c ^\N$CW{ k`삟o` JdԒC9Ⱦل_# 8cf'HY,e>b3өdt-[jLgy1\ylKUba0ogvV첚`\];XI-i&xu'dWRg\bU6x]W<¿s6wy.;M!yPM+i/32}jv\Ԋrkڶ''\;FKtޏ$sLs1'ȨSa/g%ϙb˩$ܻ](v"BթVk#Y0TJžEfR hv;ۿhm^U.e욭f{T&٘lh[z*N<(rq>EptA^(90 VAY UރiǛ_4*Ѭ|-\tA f>wFw-3vW.ZnB%=)m4iG#Q\bnZ&)ƈی9 zVo ^)_~ \M=5-xq;;vZeO-ۼmrŠFjiUZLz6 ł^j9 zVo ?ǟR%gr_MGd? /!6|VݩnҌ.n%w]7mƨz}g8U(szKaEw +AM_woZ?PK$ PK !rsff&res/drawable-hdpi-v4/icon_launcher.pngPNG  IHDRHHUG-IDATx[KU΍|Vʅ[ݖc$F<-+V=l?,,FBhv$K4-X0 c3)pU>ƣvZꞩ+]Yqww=q<8>|wiooo͛bfuΝ۟NW@y⋃_~(~G>8_xʲ 7mӇ jv&B`:=~4M,] zoS"Li:ǃ H;>twh!H߃ 1VVV@Df?[=Qs}p$I)0*8EĎ, ,~ʙ':p먚 RsF{$>M @$H4?!"tg9ZWVn8>GeȲ eQ.<J)$I2([YY_3"2bs!kώg@4{tcc㗃qc<K41ϑ)4E MfYb{?ĉ )R G k=.Z(3/27Q--;PJMEshμeqԼ]DHkMEQˢ\)*ዙ+[4ݻƥK:(TŰyyhanR~Y- nP8Oԏ@ي4MEPA`*$k)RX]]E"e,OܡPmHWXUHêē򁉩ـ 2ښb0 Mv~%[p`fE* H-bj(&Jy4EC pQEQXVCbOکG|Kyy4Ͷ)$ѸXp p8l6_>h9I{祺ECCj $"͂(0]#,!4UҜ*I}8Zڮ[ׯ_.Y%kceY9woH'U z-apࠦu 5q/^ĝ۷O?g#8@V_iuL&|+$\ϩ=wFX[.&'{`Oc{{~-"4k C/omCQ8y&!YIhb4բ$#iF;Z (>%e?/ "((dyҭ[pܹs Tmzؾwϊ^g)uvRMW/R({{ "lmmassW\im\8O Ȯy>@⃀qwa^:ޢ(#sܼy6"fpC:Fwu7S /5ʝi.@)>Lpgp5Ϙf|2CtP=79~q%UهnG JDȲ `flmm( lo#/ aeYboo[KUܵ,ëwyIWk,̘iIj><Ύ-q;hpr"LD9!(™3g1VVWE!>(`0H+(pUozD Qceel+c CF#L@VcN&9d3PF#BDHR߯2}"([#s$I0 p}lnn?g}5wFH"_TsDX#=2o钼ZJYB|h"("΋<ǍO?.\̌sagg/^~'760ŪFwrJSp5 [s;T$7hR0;2Ÿ'~Ϟ=t/?pb2ଏ;{AjJ/rE9XxCףȂm\v :޹$I>#s={+++/w(j n9,GukFpl ?}ŽAD| ֌sb}}_}$H,HHV|2sep{2zn$E| ^yڲ[/$3gpy|׈:[R`-tQE.jő'Bu ΂B^z ,Ա]Z<g/ƍu NUjtK*5N@O\MZ)@kqrj-PdnYL&Ȳ(ڞ#̙3H25eջ=Bч |G*K[md\C DQ-ɨ01[<']=NR;P㥤`qL"XzHsIX O}K(TJ D$b"TaԽ}[7Nu Tӕ&{BGq`4MoiJ$- nɃ0bZGϔeكy+`{m}TM-LfREEͼAW#2?=B3x INiq,EQmy.  8&^ l>x$HTBߌՄyI40:e38I01ŷ qJ6R X*9MR{l@$IИgsT<uD$ & zUUKp7XO?@W^}a:b4}C6,z4GHEIPDRrABT0_zb\neY~y{;4ëBtrA0!GU\kҘ @Z%%;uND~ۏ>{aZ_szk_/pxq<: ,IENDB`PK !By y 0res/drawable-hdpi-v4/icon_list_active_broken.pngPNG  IHDR00W @IDATh޽ku米HK Ⱡ,J%d C@#@ĊRvUb$Y*ʖcDʑ2,cE0`@@]˾wzޛ=Ybrnu힙y9Gpl ;7>-ʬ܇@MhC< zÆ W\Rj:ZyOq3Zk,_~hii&s p oԮ]OR3RZNgRWiD"o?VJ灎EtEX|ym3f)ץ@z.qnH$2+3RU` 5===u] ?S,D!b B(RJeV⺅h̡4_m?]tw3~8f53~n{mM,o;^y~ ,v?|K?*NB :ib*L6S b @q~a`vR!3nzIvȤIxMMix2 _J<ėWJHu6mwiumpsdOqg g?X4y5FwSNVss`ʕd$!$R!hs-$kd}MzUZ^02)Q+WL&yt^9efؑ%<4x .[W{1~jRkT5RB۸5c׮_]kx; ſqc}zf~-ڛoٳs\NH$Zr*Bkeܸu60vz>u?E?ٵ϶lomňЦF2hF+Y gg֖~z˦=rkduᰭ4o3T{éS>oq% 0p,ف? P*t!9ОbK1s6&Ν˥֞o=8xkTɃa\nIe_߅߾LwKfN~R'%1 7Cc#?̴sYM}ֳ|?Np71gy.VYn/J㶗\L$jk;$Ҝ|{j'UUCGհ5ιql0-snoP?D!nKN8sw(QU>zBU_9m^5UV$RXV0R8ݞv !јD(*  xY1IENDB`PK !< .res/drawable-hdpi-v4/icon_list_active_file.pngPNG  IHDR00 1 wIDATXWKkQ$iR fT* *"]ܸsaqc.U\\+_RѮPAI)Ң1Mfru1{#3.'$̤;s_?⬸7뮀'~^~9o?r nH][3[N<C wRrN 6n?{'|SAsʵ*"fJ (T䯂Ğև{t<GtPAZ91oy5҅,e 0nS@? 5(*vb(0R>:{#onY0jُo8, BD;é#(fE`0p04.1h`5~ ,{*ʲJ\"su2yޜ4{bha_BixճN)*}>KT #-p!$/1sʈ*7鐜w?)KFU3ީp}(|GLġl7aQ)}Â5KRTԵ9Gq|Yo $s<]B!5~ݬ/^1v@d `,MB%s; Pʰ"ICe|IT9 \Aۦ0@h^$9d%9} NsFXG6!6T"t"Q>fE5tæI FfXYz/.aPb{ ZYzE|{5H0=xE-}x Û 'o{Yan*Ӑ;ۍGS>IENDB`PK !p*0res/drawable-hdpi-v4/icon_list_active_folder.pngPNG  IHDR00WIDAThY=\W];󰟜8 APH)Q AR"eH!$TR8RD Z')0m(ι9ͿD%Bܛ8?׾;f3_4lf/n^/B/tw.}?|t|'w.-0,<%'a9ןo~D0 $D 3@p2cG__}7-ɰS9_2 @"Ϟp_ߟ @0 }Eo8hr~gAsCrX$ y1sԕ?/$_8w(7Z^R`@ٞ@h>X`y|mratlzW|=vx>i`# `.j44Ħr3?+N̗{~]~4l6KpDO ڲTnX1?}enZC8a! ?>i B$܀HAEaxeM:¸J5 e&c>6YX $3v)IENDB`PK !@*QQ1res/drawable-hdpi-v4/icon_list_passive_broken.pngPNG  IHDR00 1 IDATXÝKl{gHeF%ǒHD-M70ڤAȪiM^uUE6  Ѭ} d}n(#5Տزșt!9/P/%,"Grhv|<<< v#H".j-٠MM <#p%;Ý7p.# ,!Pɣ}/\/hDgf#%MNY/7%eK`.NڼREm.]= \ RJ]}{'E:RRE[8EaU_~rؑp(qKMvhPA;.1xYFv}Fqh&'u\\vۘݳp)%h|zԶp$DL&MkiFC5el_m,O%n ;1H±=$ @?Wv;$6&X_T5ċHfSm*x:/>ҧ"iI :Z7?q#eǾ`ggid8sz딹&-ja`\_[Y|sq|,YWMR i|p2p4iSd8~˭K%i prp 4_ b } ?ِB'{6߆(s. r88h\,rʏ_y * RDK|lqXe_8atWeevY(uVQL2,p=NtѢ'``<,1*=Me|&D676a;|XEq$d= n1\:ݠ *(.a 2$ul1JxrR [ϭ%GjI.52G`0>ﲈKƧ>o;g4%sj6"i| 6i qmɊfF'.y1CNkҚWO:8&50 .Lr jG˲Ky?'s` SQ)Ff=jͪssy: C0|2ۋ%v*SO{rȡ!TZ|eyw6?l~i[rwm]l-p`oIKIENDB`PK ! oLL/res/drawable-hdpi-v4/icon_list_passive_file.pngPNG  IHDR00` PLTEIII CCC%%%$$$######"""$$$CCCmmmEEEVVV"""yyy555```333BBB222 @@@aaa111000111***vvvpppaaa aaa999BBBJJJPPPOOOUUU"""'''666bbblllggggggfffeeedddcccdddaaa111 999LLLFFFFFF@@@yyyqqq}}}wwwvvv|||uuutttsss{{{zzzpppoooxxxnnnmmmlllkkkjjjiiitRNS"'((# 8PUVVVJ&  9 Rv zr8h t ,ІX&Z`)[=`baV$IDATH͕SUƋZ**LEEFe*Aق2DāP 5M&IsIB%@gq "9y~dd@P!Ƒ?0L2ק8o8vDx<bղaK@0S9<H"LX߮of4oc<<;̚ JAhy>apfa<ƃ8#Ȝt8O؍j'67`QюX,Z7PjOOSKn#^ްjr >˼ ֘tĴ~ikl ~BWbXW\NuZr@oL3l릋ڔy1(4wp>/ޠ/ Q>ǣByD6oٺm{QjQX#\t ^ ܵ=ē+' (}@XzR/~iI},apR3~x xJ"G(#~9t$֯~SEGgΞ{ΞpOWKfIENDB`PK !s1res/drawable-hdpi-v4/icon_list_passive_folder.pngPNG  IHDR00` ^PLTEpppnnnooonnnsssmmmzzz|||jjjjjjyyy|||jjjiii|||{{{||||||}}}~~~kkkkkkmmmnnnooommmpppiiimmmppp~~~}}}}}}|||{{{zzzzzzyyywwwwwwxxxsssssswwwuuupppppprrrmmmmmmnnnmmmjjjjjjiiijjjggggggggggggfffdddfffdddcccfffdddaaa```eeebbb___]]]dddaaa\\\ZZZccc___[[[XXXaaa]]]ZZZVVVXXXTTT___[[[WWWRRR^^^XXXUUUPPP[[[WWWUUUNNNLLLMMMPPPFFFJJJLLLRRRSSSTTTUUUWWWXXXYYY[[[\\\^^^___aaabbbccc```ZZZXXXZZZPPPFFF^^^___```ZZZ]]][[[\\\aaaXXXYYYbbbccc~~~}}}|||zzzvvvwwwssstttpppqqqmmmnnnjjjkkklllhhhgggiiifffeeedddWWWUUUTTTRRRSSS!PtRNSo_(M J04-p 2a_E"zQ+G#Q5uy3f, #-'0qۨ-0u;{?2k (IĊΝ/Pp,В(,[cqN_HݱplJVN$e@F֬EaTy*$~7lMpڀ)tp*g#uIf(EMvZ6ٽ  Mib#cY@!m4?kkh$0CpX&"#W'D! xs5YÇP8}"aAv.= ٌQ UgK(\faͯ0T#Wp S0'*ܸ­w޻#.xǀyRv>{e͟?OrGcLIENDB`PK !4˖&res/drawable-ldpi-v4/icon_launcher.pngPNG  IHDR$$]IDATXXnG{wvfwˏ15ȁ+xHH+5rDBnUUUuǷ>={f=~ѣ֖uv/^ϓj^kDmbܠiARKKkkk<}4 ~{4ϲx<!PKzs2eQJnmm-jsVIGc;亮DaHeY)(:^@ ̓Y%Zkʲm ـ@ >+|!peC."ZѡRj$IY`؜H! <OeAD)4 ͺh`! Ã^12 3D($IJi"s0sG#Α 3Xj@J)i"y> eY5K@2j PJ!2c& E]) RtXW*-$:DDEAD80sM@& cxAKEDTraR ~RWRJՀU]Haai+7!t]Tۛ!cLMO0C?bwwyE00nygfnܸʰVR4|un#"I(y 3CkR|b1 *t+0\EFuu&"hB\dUMV"Ğ+w8[@)ut:R\XzȄe$"Rׯ#|ֺSy}ج@Ƿ,mnJ#[0׽ks#ABjhZxhCb xA_Q@^QHj`1-h+3e;L2;3 e6PǓW|x2~RJ)vuu}<44tdp &sFp5#@J)(0 nYٹnhhG"^122|ccca,MMMxC*߿dP@J(<|H&\ (@WT{8̋Yd KWMۍW]꙳Tu[7o=L&m)e/w;Ve&BWLвqfm[x'm݉SOe^d*/oAD"z E 聖sٞOƶ֕ܺ5ztT_ݷOH^׿߽3kGO*ַ~ݮO>~WGZN0IENDB`PK !UVV.res/drawable-ldpi-v4/icon_list_active_file.pngPNG  IHDRשPLTE FFFeeedddcccbbbaaa```___VVVΕЙƳٲֱݯЭתɨǧĤž6tRNS$(((((((("b򆤦R =WԎFIDAT(ϝVPE{])4"((6Dr ǽ:3k5LMm9u M-mo?ba.ϬNs%#IG3,1@#18fA AVt)N*r%Hߍ: ඨӱ۸.F`ŨbIf(caKXbX^8ZG1\Z<>MBq{^cٴ >N"1cgQVֹy܇!f$p>ç^87Yו5Ք4Y͐4ʌ3W‰43×U3{2”U{4t3~Gn2s3v4y4{5~7ɀ7΂7Ђ8Ѓ8ʀ8~6|5y5v3p6ՙ4՚4Ύ*΍)Ў+Ϗ+ώ(ȅ(ʇ,ʈ,Ȇ+gfjjiigjgSTFHH?>>???@7788889988ٕ5֔5ו5ؗ6٘6ڙ7ڛ7ۛ7ۜ7ښ7̍3ʎ3͐4Α4Д5Җ5Ә6Ә7Ԙ7ӗ6ӗ5ѕ5Г6ϒ434É4ƌ5Ȏ5ʐ5̒6͓7Δ7ϔ7̑6ˑ5Ɏ6ƌ4~2344‡5Ɖ6ȋ6ˌ6̍7ˌ7Ɍ6Ɗ6Ç55u2x3{4~66Ń7ȅ7̆7·9Έ8͇9̇7Ʌ8ƃ676a9AtRNSrtttttty)...---+** IDAT(c``ȄE͝&^ -  H1qDxDD$D!)OH%&%g@zzfDB1;'7/JJ!*eUU5u Mj ֶή޾  &O:m3gΚ=gDaCEUIENDB`PK !eB$kk1res/drawable-ldpi-v4/icon_list_passive_broken.pngPNG  IHDRJ~s2IDAT8uMHTQә/ #(҈i6-Mƍj}HEPT&* 2ٗ3h>5=w޽9m#&A.[»sI4[L 689\2tN c~fЂslP C,$$3(7dZ\t9LX,4s$3db 9U%{bKIY_'8 U{b mS[O>@mXNg57o >czh>Vo+~ Xoxm*6X_A益4p_ߌVwlh:N=I&s0gPy VʨIIENDB`PK !nZ/TT1res/drawable-ldpi-v4/icon_list_passive_folder.pngPNG  IHDRשPLTEqqqjjjmmmjjjxxxyyyzzz{{{jjjZZZooo}}}}}}}}}vvvvvv{{{ppppppmmmjjjiiigggddddddhhhaaa___iii\\\ZZZiiiYYYUUUXXXRRRUUUQQQUUUWWWZZZ\\\^^^```bbbcccaaaWWWRRRddd]]]^^^ZZZ\\\[[[|||}}}vvvqqqpppjjjiiieeefffggg```___aaabbbcccWWWXXXSSSUUU8tRNSrtty)...---+*."{IDAT(c``hLX$--,YXـ&e 60`絳wpv@ގ"!(!"h@T "! $$!Rnn(@Z"!aar o__?7-| ʶV>@I*DB- $ VP@/_++[M-@G+7XaIENDB`PK !HH&res/drawable-mdpi-v4/icon_launcher.pngPNG  IHDR00WIDAThYKoιU]eLH&L6H2#VdaDe*#!$@2z{NvٸDJ$_vu{ \rw+o>g{9aMTU0U] OAh?<~ϟ5oqZ{ƦT<BB\<(I{l|>crA-C.i귢610 i6Yj/F?8i<#IUU 穈PepꢟQg :F**TEv2X:`Xιh$HU-KD^Q9JNC *@Dt:0L|b7 "ΡtuEmc]pa\7u"uZEP8H6v1W$ir.چiUy9Fw>)?+[mdbѐAh[i-Bq~AHBA]wH  ÒEPUνZdY(:jCAHD6D0 UEX.o,YWTڰ rY]̌ eYݒ۷Q:|-ʁ6sPS)ku[59>~0 Zk-@I3a O<a# CF#q(paMA0 M&ATD@JaAPf9`"x4M1S<{ {{{P6DsMcXW& `)'-4F[GBH/_͛71 "N"JF#TCX\7qK!IK[g^zo~MS SFDԼ[uNw+aufQRb[0!1,޽N}iŸ Z.V3Ȳ>a:"IN N!Vgur녪<(OG)>uİla@ *jNNB&̀ c*° $@lnn"9I~Sh5Z/u%u !.ֻ֘yud,Sd6_u`*ODMrS՗FSsJYc@ctĐi&m[[[HӴQ`Lisْy/= c 1YC{U_TỺ>r6ǯmȘ efh%Axyu*cbS+ ,:UQPUbfQE=$MHD f> Ra37!5kRTWBE\EdCU2êrS\.,Rf= .T<2y/Jb6FEijXk?弇:yEA_BR3$# pu zu h6Z 9c0tbf\zU WsjdR:-1cӧOӅ ww1F1 }_XE4}Ź_~0ƨ*RRfRQ̩5uO^ UIDd9z!r]ջ K" 5 IENDB`PK !0res/drawable-mdpi-v4/icon_list_active_broken.pngPNG  IHDR szzIDATXí]lw>k;j(qd;T qDJ&UDSniR!UTRѨ"PC)JR!h@j }0Uq vNڻ3;;ֲ+r{gvΙ{Gqy@m7IGyT*-3ƤDD͵P7{{{hgmbbOMMME$Z "Xkg+jrrev&i&pa.+ V{5`Rl6Kkk@'(>C`˖-u RXkZZ%Zkiii#Imێ[kWcdI% jRccc={q(j*uږRMﻩTJR)}|<L]k#ĽP,bE`5ًck6=ggHjޮNEEd7{=<סW0׮Gq&.b4ǘ8Fet.GQ 荗ߩQ֎?|9ѥKxhkQAddٻ6$1261:FUVsҶvm9}^8.SsKcXϐ(_zxx#ގmaXke흋^|!\;4eQ(QP۾} }ccg`3THXF !iNIcG%dRT `,V,b,V]]'d}il2t):(û iq1A)D蘒ք:$&|d~Dy"A_O1ۙӟ:IO:\TseҝruPҚ@kff,$]]\)lLF~?sW0!i9yA:%29ȱ/BjOj~iFN >3u2lIDAT8˽_QBU,llFf!` hb\Ҩ?Ƚ_ysoKSk@lop]G7l܄ٵymw5{G@nwGO8x( 3,IAӻl>rTQ_A"|BxT1p,EQ)xv )4*@J8B Rd5H;~% RϿ@#>GO tӍ6t02E"d!aS%S}>G{,Δ.Rm4'zEs<}Ӵb׃/ھ-T`za1n+ Z5%?UM&3$pN su\$pF|,ؼQHy˙+WZŸ9W?q&pYOCFfXC;}G eᇏFF?yll칭/_xX=?{;}IENDB`PK !e hBB0res/drawable-mdpi-v4/icon_list_active_folder.pngPNG  IHDR szz IDATXVg}ov!; $(R$RT4TQ4(( :$:)(S"A(P%.po^Y߮}ֳ͛7-ߍ t7ʕc-.ŭm&rr!m=6<,g^vߝ8{{UZ d!@4"ۿr #o(QdCi –,7>y6L79(J3?Λ$[_ڱg1G6vKF;*̣+N0gKxv% Bbb]@Nŗ7>?כVb r}4S>LÁQj>@$>4'=XVk~ͅYS }tnnN ^441?sJ˨ d;`,a|b: 5حZdL*aN>Ӏ%" Ac 0z[ r_%p@} +@ ^ &818>"k3Js1 'A  # ̴"|a Fu;i5L *1J!@ARu4Ro Y{?Us0%a0{` 743^ #˂sp=XHizxlE"z @VZyħkݝ_^+%((@L[ 5*{6z^-ނIqH`4JZIENDB`PK !⑐)1res/drawable-mdpi-v4/icon_list_passive_broken.pngPNG  IHDR DPLTEzzzxxxxxxwwwwwwgggppp"""555FFFppp}}}zzzyyyxxxvvvhhh [[[)))yyy)))ttt!!!EEEJJJBBBYYYyyy (((zzzeeecccaaa```___^^^]]]rrrkkkvvvcccfffrrr555===]]]ffffffaaa|||gggccc{{{aaayyy```vvvuuu___^^^rrrYYYnnn~~~zzzqqqtttwwwxxxsssooopppllljjjmmmfffiiidddbbbZZZ\\\[[[WWW]]]}}}XXXUUUTTTVVVNNNSSSRRRPPPOOOJJJMMMLLLKKKHHHFFFGGGhhhIII===` ttRNSI.F P +Q,+R+a$+I(-$+#5J{t;U#G`cM IDAT8mwXqm{{kvdpJZp$ 0ȴLQi)-m1?:WAZiԸMf[7۴m[- !)P= бA'w܅p`ry<>AkzK  A"DQ?$?` OTa,O%ØA^aP(a `8P0lF&XF#k :=6`U07'K Psuj=نhj#F\- xt4hXm I-ƌ#p0R=?DBdJ-nr0%eR)S ahR-[J$NSEpsP^XT)Q:fϚ 0é`eZZ\<\g|c4S+d(5i΢,Bz`|MHu:52@ju:Ǣ [T6Ciֽ0K-H+(j ^brف9\Ui5깮ՕnEzmeeޛyq5k!:|<%I凫 ƛ J;C!rKb/HPCTTTĢf/vm m٪G 33>PMEIKJK>9eB@;vJܘϥnrvJxnڳw~ :|W ?ǡ;AΩYU+pi5Y;%uk>P ~=_ITV(IENDB`PK !<ُ/res/drawable-mdpi-v4/icon_list_passive_file.pngPNG  IHDR DPLTE%%%$$$%%%&&&'''((()))333777μ666ͻ&&&̬ˬ///Ϯ222ҵ®뫫忿ϻɷȶŴóͱXVtRNS1<;;;;;; >BjOj~iFN >3u2lIDAT8˽_QBU,llFf!` hb\Ҩ?Ƚ_ysoKSk@lop]G7l܄ٵymw5{G@nwGO8x( 3,IAӻl>rTQ_A"|BxT1p,EQ)xv )4*@J8B Rd5H;~% RϿ@#>GO tӍ6t02E"d!aS%S}>G{,Δ.Rm4'zEs<}Ӵb׃/ھ-T`za1n+ Z5%?UM&3$pN su\$pF|,ؼQHy˙+WZŸ9W?q&pYOCFfXC;}G eᇏFF?yll칭/_xX=?{;}IENDB`PK !%OWW1res/drawable-mdpi-v4/icon_list_passive_folder.pngPNG  IHDR DtPLTEjjjhhhkkktttiiiqqq^^^hhhyyyrrr\\\sss|||iii|||}}}}}}yyyyyytttsssyyypppooonnnllljjjggggggfffdddbbbggg___^^^ggg\\\[[[hhhXXXXXXgggVVVVVVdddRRRTTTSSSQQQTTTVVVXXXZZZ\\\^^^___aaabbbcccddd```[[[YYYRRROOORRRTTTVVVXXX[[[\\\^^^```aaa___ZZZUUUaaa```aaa\\\]]]^^^[[[jjjggghhhppp}}}yyytttsssoookkkfffbbbcccdddeee___XXXYYYWWWUUUZZZb/_tRNShf\neYYYY\9%F*FEEEEDCB@??ߨ$-----------/b3IDAT8R@K]{Rv)Qlbyywx xL8s̜A FQq UZ7(d2_PTBE´ h▨C{]bѲ{iݯ9BCw.e ~Kp1':q鯘%4ca|;q5 C Y`i+*2%LV X]K!L” P0ނ`{7(lOtJM.{GǞzF}^}ۻ@0 GC8xz.QIENDB`PKeAtI;&:res/layout/filepicker.xml]N@E&$v"DAA!* D@MҢ@JH""%5EC @3zΎgez,IN{Z:8ɭCt>'*i.qfUKyjU)n9n9j$VLyC}fwj@%ЁtC_;ZLg_!3QTȏpgx-\cbLn׵[̗#S_&~>1>ハ>|j1D~9=.8ǵ VQji!$-}ZK@ t=p x d`~T2ʀp < |g#kp:E`"bw@fh \nlZ0p^nuaW/?8 dQFqDqAuw4C4>֑Bڧ1b1ӈM3x\b<Ѻ<݇LșhәE4.ZB׺0ZekhqC%}`W#탺~=WIp+壸*7GbAQ`Nh?VUsf+UQtE^Қt}4">zĤĤF1CzJ9V܆Qm>ƫ}zjǎzKxo9Ý?lhձnӱBիRlTGHnw|rRQگ5Ok.߅;{y~IO5\ncU%5jhM }|juD=jrk|`Jb:ϭ{gMg@h*[~o{my<v_&c|P~*<Ϛ{9,|uի0ro_u볇·rJkV2'`TVz~f>W%IT&y5z\|YgF62Z,pZyrC&@S q؅(QH╒'O+^{ZmM\}:܎WBd]Qv%+"WG \_KylXŹm9C3sg芭#STΜ,ZY˴yK-mFs5 \М~^=4׬QsXhd͕9>=479ӡ9WhbUԜ%4oܴFyBzּޡ9?IoHQKxeO QK5RQᐵD-0V-JsPh }5ơW*a'&_~cV~ۙoȼ ΄;E|τzXmXzpδnVi@#k:pluȵՑ+q,[̑pN5 f5 ;' oɱe8$EZ>3;ZE/ʱni߅4e8L\bg2{8GpعLK*c{8㿡4o8s4e8F?;ḼJs]pعL|L|Bͻj>cW"~Qq߇XKZt Z*CCKCKi{x[;X>}i=»/{ѵUzk9 Uz(k9=cCw"w&wߥ佻ǻӡQx}bmauSǙs{h0-M>ZN-B'Ze.в]h4,_V<`sPK@ PKeAtIb ''res/xml/default_cyrillic.xmlŝU. ,EX`&H/KHi"* BkԨ1vbC7%cb"1D C,sΛas߻|9Ξw3}\Pk~EA5/YU:  l9`W(VWv}V 5X`6 lBV v>Zأ`ς6v׍)r VXC:6l$8`ǂ[l؅`[v+]`{i> W`߀_. 5+6 l4x)`Vv`W] v`wm 8س`/ػ`} `߁ Vk]X#`m:u6lX)`-[v*Y`] l`wm$`VX `= 6l* ցm{-wv}^V&X#`z6 lK ,`om l/XP`u+6 l4x)`3恝l5`]v)U`׃l`[ k` l7BOb`ZulHq`f;l ؙ`]v7&`> l^X`  v,`] im`_W V XG`#ƂB`^ XPj-X)`v4]CeY )͆}mP҂A`}҂ \9@UЫ0X E\2Ϩ 2 f/D/˂aW 's=q":kk>bGB9R*_>$Q\m;OjtpC}Vw voO=η}m_33v.]W]W~\pX0ַ]|շ=}˷M|[÷5}[Ƿu}[Ϸ}ķM}{ovT6Sz}1/շG(Nmo sپumoo|;ӷ};Ʒ2LYyAu3߷}˷wq߫b[n:C|ݷ=|Ƿ}}Ϸ|;ط)U-oooo'ߖ=·|{omUV}ǷvKVu*w}|u s߽?K{߾n9pTu]ag97L U|C#`;KT7:wY~,}}vv?"< hZv'#tK?Ϛv8FrP8VgHvoG"^hk߶m;/}{o^3w{F>qێ}o7QmWW#`+yH~oGE?Uj<#b.u̶mj:9 ak4u] ϫ74wJW`̻ss?&)S}>8UשH.*>˼`N9;{7w/^{x7<]ּyڗK}\1I;OlaۣSEE$]%gԼ]ykUxWܷubꊨ߾@x.X3找ݑww Gp41WgF=.}<ӕ *2]EW8Zt㕄Nkͥs)4RhEɥWjT9xRGh)Jܗ}Qj<]xظ.y^WyO W'uqxxLG(N-6d}8ؐ_5`yH]^C54jx׈.1xu &kxRyM_7^WY3u-{r81Zb, 1bX#Ő81`6,F[Q!F;ю8c'F{ў1ʧAFߘm*Z9?6 {z2^y vDvGuB^xkauA^Ɠ8x- xRy=D^4<ek <, B]/"4!^o6x}ׇ./&뇼~^[?3 @ހx70 84>>5;+уb>Ժv0  Ɠ8oxxC7^ɹORK^rlEɥ֍a-X3@ވx#p7y#Oh5$=]Z*zeF<Ʀֺؒq4c4c4I]I7yc ^;.oEJBxr-ezkHHcxԍgyHMɱ%ukƓ8țo&x țxRwZ>5> q2АK zLNa<;yG'ě<7W s%P.Vr rL/\?$kwh]bDz\r}rucnXp1MC޴xӑ7=jadE\f`.3"xBvGѵ߇\Fr}rucmX8֙'uƓhZk.0Y\r}r%@#蚜s32ΐK둆:cxRGh<2ske!'WZO'2?oqk:lc>\.o$;yxGx .o%;y'xS [xRyK-E4<yslp`yo8C~'D-C޲xˑf yb<[ V"o7[U'uqx'!滑x: 3DEedԝ::gi*u76'n]ߥ|E"bXsc\hC!"Ř3QɊq q)P0e,ND 71 Ɠ:YɜDޕ,c19_1J#) gwG)iڨ͍j]#~kO[.[bHVc+r}D(ugهӴQǑZ]#@?f. ].2"\iZ9WaX\2-"F]lзŐ81nDލln9P1lѷ>"KreOn\nasp+GK,>fܐCsiﶈw!?혹}Ei1d~֚v,܁; ]iO4mԱ}wF4?>([俊9Zq_Bg\#bkϣU&18wwwa<ۀ ޽Ȼ.o#6l PuJmX~FC~>mB&&~xR0n6Dރ'uqx!4<[z>V%??oFf>Yn'ma1A#1^z}(?M+{syݐ쓍w _b*l~{<8XDl$D_Xcc2| =BF<7=>9D|b QNNŸ9߳TOMb}hWr~{0[Q!u4Os{{ACEHr}% 뫝6s"^dk^bIZ zӺ6g=V%RZJ>Z>bXKuGy}>f>46ɹ|?.O0?)/_<%=Lp=edr8" ^A+޳ޫ{'אױ^Fİx#  ٪ԋdyH]ߑx!;AZ'WZk^sStc}:Ɠc;7 Zه@9؁s#i.3d}2Q3}:Ɠc;mCsi94 .;u`yHMɱiZk.b.ryא+- Y ^9':ƓcӴ\va. |hEɕYߏ +?g>6P/40he\iIZ4l\LZ~XRGcxrlCA+JK5#.}&k9s6A/ u`J]޿x%dR c|bcOE|}Ԑ5yރ=,}c'ú:Zsi]eZWEk+==EݷsO~XnEi1Z~#x֜"o/`?C#OŐ81en?bl /%M R53=(C155p1tlrqs}5$b45?614o^QYo9̯Oh4ɠ}r%!ka-7\,,`k)u46'v0y+-ʮ1?T^5.kR zFJ]%Z#/+4{&J]^UHWy_IũԆP EzɆKj"uqxZdEHHT3ԋ)Ľj&͖֭{$+NȫbTA_bTE^UbQdQ yXbHVE+b1jFB1j"&Q } :]yXI,YqbhuZ}i1(ΰN뢯.!YqbhuZ}i}OE=Ӭ'2'o}Nr,ЃG[dv{kh5[!I]^#UJ#}qWM2\#48B-d< Oԑoȹ_׶ B]/"4!^o6x}e.oV$+#uR/ }`Þ,R:0kpkO('sIRK!k9,lpC.O.n# k݋D('sIRKCra-u$FeF<Ʀֺؒq6Cix%!<96هcB|a͵g:06RGcxrlIk8ơ#CBYC#ڒx@O4<7 : &EǦ-@ނx=6xGxݑם.z$뉼ixs{NJ]vlx='xx7Y o@BGcC 84C~=4GunPl \4%I-g /8,üh3:ƓcKZ108'uƓ$%s8xx.$䝔o5Vz9P/k67uXR7y Aސs2d\ivȚcXst8ꆳ<.oF$;yGܟk{'WZ\{_9,1 "ol}r%BBÚkK^d 8țo&E_l{'WZ_\{M2ÜNAME s/JK+BJÚk)0ǡ8MC޴xӑ7=*>Ғ5_kXs31LdyHMɱiZk.0Y\5"JKBzƹt7t<Ʀ45\C. >ҒF俉k_[yysEzVzh8<{n3@'u76usyxO#bXs c\GC; :ᝆ{J]vOlx[5玫3Ջߵ6"F6-ېCsi3#ViL4?o{ u]FC.OZL#kCA4\Tܫ2\Ѱ?Bv-F^xuWl#_H]^IWyp^%G 5@]5B^xM{k'uqx8!^S5M#c!x n/~°@] 5ד81Zb,{h1Z1F!Ɠm0F-#YqbX scg1,?r}Z9~*PywaNw/3d8n5`{XRy {w/I]FmL#!П3R/)dc}:S'`hwOWZ~fXKwM?7vOoi<9 }r%Cra-!ҰƦ45O1O |eEɕ Y߯  sݿ[hlOMZsم2ǐ+-'֑0?_;ֽs^jW{^A콆,uqx}i xnN~0C 4|nZ:hhDL#!O}C{}gAi͆W㹹0Նʹ6G~VyѵX~~t.O.np1὏}_ k]'V0Th-5\˃h>Ғ0d-+R&lXK힧RGcxrlC[Š}r%Uf?_uָ UvW=]Pbr:hZk.o`.ox5 /%I5<|E5/&k%ņDNmm:!'kHZsysya I˴a!"ݐ˹!oQ-`|XnEi1Z~#x֜"o/`G~b1$+N 9[c ~I Cj&hl؇diex} k(cIŐiZk~Zmc~i#Ӑhf ^osxel!ZYW;0\Zr}r%ː,1Y >jKCr-wb; 6"JK6!υچ<:\!f}CsukoA.O]lxo 2𴿃8 )"*p4$k)aH]V/z ˰^.OlxZHˈ ~za?-Ľ0oΕW%YqbTF^e $*CՐWŨ,dʼnQ"j$&jW+M \sdX+f9KVZF_bhuZ}u 1fXuWŐ81:z >꧉A#B)z.ʵ}m`Na0p7phlR}Eoo'uqxW) C2zH]a3\C?5d=Xlh&l81") } 13h,F `1$+Nkb$M O Ygd׊,Yqbh} 1ffm׆Ő81mibVr8/.WaPKb ''PKeAtIA̾res/xml/default_greek.xmlŝ TEdzi.QTDD>DUShPQPo@DEQTta‹@ufg]םugݙ̊UEW?^fdWMk1uՍSؙ[3dZv5,`V8sQ~XcN V X v` 6 l<4`-l F`[^{ -`;؏`B`u5k X|~`C] 6 l:l`-[l#fm`;^vc//`2Xu`uZ v 4`[`/}=د`5*3X>X?a`#ƂM+ l r5`.`P rk X`cƃM+[ lj`Om l/~`G9X-`  b` -[l;>`V hk lP`= Q+XƜ V)X+``-[lg`G X|U4Sh3Aɜhz4̀?wfkgYّJr*3}9j)vmfAty)W&ۦ;l=SAd+4h_較{~h]6SF{5}u2Z m3]Z ~ZS)tzE&x#52m [: N@x;^#UW|^ n"Z6Y|=kڹgY{{knsj}sw;vTqq;:w|(תn7;%w|_s=W*w\Zw\aw|i:z<rim:gu?A|-rZjc`|[bಾ^9N1j|3HUR-8d{̛G%|!|קñ61٭ q5wl޶cHwa[3=/jEn-IjO7TM*vE#ZwiE:;gWhWx,|<q&ڗgɎX\&zѾC}{ ʔk¬^ÛVj`ewt?|T=7 n/ RckqǔޒF)zbGԜz̵쎏08\&Ÿ>P,X[Wy%m+rc\ Y^Sͼw r"VfJG۫?㘿8ozɬ%o'wB BoMrzQӨ9 : 85*x܆F#Uhh=sPY!MPq.jTJAY/oS̩)3eĮ//C\y\ey ^ x<.y-kV ^kx<.ymkixohJ<42e枡"v˃Dž#}xA;G눼Dž򐗗%^'uR(xy;/K.뒆GsMy@߿4c~iޜ盒kOs#]{Z(έ+zȻ KnT#q!%^OTZ)x^oᑿ)]Ɣ kO[E~b܅^<.,.BE ^;b]x\]%^_U+x"RBx/K럆GFMߟkL=H)NXަc;+byy`] H#yt}2TQwLbwS drq{ o1yCg)49E+ry{9Ü!sVq15zdIJԸӸ 5jeа}C#Pcq9DH/Qs ڜ P ==+;O{ у4y?)6|;}3h$ͯ"?>l~c7 J=Bfа|yO4l~c76Fȟo9sgDob|LVa*oC}^nEkAt6Ysh,%l%Ksd#v"bOYn>Kc\͍X҃ >kȾ˕Dž oMx <' z `-֫6zfЈobM}x)["E߯øu^<.o=gپ_,x6TRlڐ4G%q\ҿܪȅ)X{)eBx1KpcK=ZxNSA ٛ\y\Q=%c{L[mFfh}x|}yy剔F,i<OzOi47l iQ(i{˃DžA3Y=g{c1xq*8+\WL溒ޛާy mAڊ^nE릤Ata.ۼCs { ̞ {!Kw4>BG >48+Dy4b|o|?Cg^n!\z}_x!20Ǒ{=ķ<^R|k~AMyǾm;}E,o46/"֯=e%+L麔=eO})]R~K߇&y+Bx~xIx~xQx\Oړ( OړǑcSH64I?\?\SOڣDž=z=zx?cuA=o_2TG_צdm:,='ŹI_Z^7uSR+y\Oڻ2 OڻǑkVP~a<.,âxGIKF_cΑQSE^)ާA+z)q!DÝ/p;;o)+)˕Dž$zmhb'i͏=#֒^1z+^cDž=E޳x(ڐbֆ7?_Q1U.R۔g=׋uq!G[H$E~ h'~6grD]My5U1n J5-i$oZ̺k(?I'j~4gڈ{fŊ{3i왊{Y3<.Wߔ$<鳦Q<<.'}'}?;bm^͍Y/<.'KT/Qc I' #z!=]O+S^ٜ+;44nThh7!핝DCW6gAD.qes)fJ{esVv$RJ{eGiN9+DCSi$ڽ9" z6[{{eߪMqhljxKXG`SVv]` 5 ;`.^{lX`~09LA`<^% or8%z39X_/)8w悯XlɠxXt`&NTee*ZV‟yx |D CEMظ%6 9GKBr"3lܱ<Ϣ_Tf(jw7~]YzA+]۵eX0g^SAdדz],& _5/=h[ZDK~~jcj__'va]gڵȮ:ϮAukwkk?`.)~:jߴ']7z|ngs;o)}=`u6c{>~ˮֲۭkv훩|sG"Flךv}ծ}2y욲kYֱkm2suw.HeZۮخ1v$s}TPaϬ%Ykyv-gjvFVص]߳vl#ޮZծz|{\ۯ9ha63TˠCf'v}ZU;N"~/skb7"ӹz a[BV}=_9yc9-Q9__D"GY =菫bU*;Ϟ0\`ص.z[Lױ뤀xQ[<_O}NLb9Odvi=(_wzfu]:ٮ3E$N\z]eپ̜guڑ97'u]u]o1w6)v5"a63tZu<ܮ+Ćzg=X9d]Gu N2°Z-eQKYA `|$W):\* n j&a+pW}83Tu8?, TUUP|G8|US૎|>Wj06bpl<*)D\MG᫅||+j#_mA: W8|G!Q!|♗yqϏt>;By>꣯^q89`N#QMhh9998WGcM0G"GuE(\qr4͝-0GG:ÜDM-}sO]G/?[!w+G+k|k|m|u|mqq!_#_{Q >g.H;|uH#u #aSzǂ枡B1;qq:!_:#_g__q\c؄"_W_C_7q\=!#hDWh8fI|6Q`yLش KB !-kZz'Y n zvbB_?stp^`[*<&WlڃJǐ ˵ @-|C:gM=B rtp^㵗Z-Q`v -<&Wlڃ^ǐ ˵ E-C; #:C=00Qo8;:8j/KXeB1 -<&WlڃIǐ ˵B-|C9K=wBčqtp^㵗Z-ǣZ*\ic,cBK7CZ$,rj9!!q7.y{<wp=& njZ&*Rh1b,$$ -<}yvw@~ }S7qq!ߴB_1b,tt - ,`y N2Vǐ ˵,G-[|+BB znBJĭttp^㵗Z-P*Iwq7MjF-Z&*"aQ A5!|3>9S0)nBZĭutp^㵗Z-S|S|oq7MjZNShcHZ֣ |z z<nBmptp^㵗Z-g3|E ȷ8|g"ߙ mBM|1Er-gی|C?;~N=gc\swj9;s8.w~B|[oK|Ey i\傄.D Cȿ ~a=5 H"]8k/aZ.F-+,Vh1Er-K.3{[!-k \/ y^DrwboW G$>7 r%jReB !-V<\B"V(cHZF-WGe+Z/P'Akuqr\kڄC|(G>wݐߍwo&8|7# ݂|`<~ I9MV8|!m ݎ|++@;>w'ݙ]wtߟۊ|[#@>>Zs(c({s=S1b,X{Z6)|aV z&Fh9[PN q//-{crŦ=X^+c%y<3Y:7FC9%,\ ,7B Ky.珿VhDPN A`_.Z R{c%<W_b\c(|(/-{crŦ=X^+\crŦ=X>G?^D)͊۵)aD`S`yLشk(QZxLشW_CC Aעݤ1X_.Z f{c%<_;bܮc(8|[1ޣ|ao }Af-+)a=9E>|cT`yL( zRE1CO!)G{+Z(<&GX/,3X=kW3{qqEg# =|V> ,7I Ky&gRz3zq9:8.|B|ېo[\i -)|a| zv鋈{qq^B{^+ĽD՞M{|>^QhyI Kyv_ gfhٮc(؎9G`_U`y C}x5!אBD)-B uz_.Z vch  |oF𙽽o#p4 { (rh87ߐkBňZ`wUhމ|;@n9Wbwx/Q9"GD~qi}GRD1LJ!|י1tb><'a7ߏQD\/`-c}\qrh\rcc7vG0u1OFGF'$"Ga 3nj3 -@9 q~cHD-_:5/`|DlO 3OZx JF3_靖LO:fFNE\꓎oB^>C$lԱ`}o#rd ygߣہ,sW=G?~T} ~r8./qq~E_C-0~stp\ߑw >0|3q\|?*!_1 _Aϊyv/>~~.g+KsQ J99JtDUA1Or}}eW&7E;#l~ޑ/Բ8Kr:hJw;4RA5-iy^ީ)ᫀ|" Fw(ƚ^'(29&yri5>WJߜeXei+j_kUѩ=Q%>^{R+aJ(rTF{xJ/J9/'9O++]*(j徧 ֯E )}aqO{r.꥔#^r~eEE/?3I{c6s~Wf5&v!\CyOTjeu9>98._5䫖_u䫮ૡુ|5>sG"ߑ}3T3m)Vs-Q+D3dsAyjfyWvq\:W'!WWW[wq͐ė I9 1GafP] IuՏ+ĺF KzW/B A*0cc%#O+[[rB Q*8쭉bo<&_X75Wh1S~8: _kgB7/,[zJ_oHVԴ)ִSSI||oVjiQ5G$>7 B9ho/WkZ:8j%ZIXVU×VF$>7  B9記}bQM{.m.mSZ:)|a.^a/-*\i]*ZKW/,yz]KKz()ay?c?ڧK#_:쭧bo<&_XQh1S~t~tH%:FU K~WWz5=Ʃ)||#L*jcrŦ=X..)?y`bw,;qq"_ׄ!_>ˡ^\i;{Gِ }Q_G||||oqq# ߐ>żHpBP7qqC|"̹d\c%d[Oq14 ñf3i.} E?F o$LoRTFs:$>1G 3 ]drc'`!9_9R VyjԙG M@ 9YQ%l*ڹ\뙫yYݾyDMtjϹ)堏0VI$7)Bɱ@c2ѵMqrp89sf>b 52i!9ȿ32z+fk$yN9rp}VOK=\<\\31LkkZ.r\>y5Fb U W8|Ex*,+Gi^rǷ&y8|Ҽ' ǑϼTt6~h9s1:9o^B9#|'-PXȱ:9osɱ;9oIB9"R'2- A{),Dh\qrHs}! Pؐ圮DJ'犓CU[PiNOBI!9Gotlb~|^{c>x٬~4AG?k||g+N[iAB})8|tB|kpnP'>{>°Z-nTσ&>>/3 >Zgۛ1"SV@ 3chU?x+ZVξ9._kk_kCw=]q\nDC}-+Y8|SB|ﭢ*@;>w'ݙ]wW=y`p*D\OG9M⣏'>M{~b #>o_=qGx؇X+6ݏ?{E{_=7qGx$V`2XQ/,c{05I||oVejB Oz=<čqtpM{Z-ǣZQh1b,øC)z. }7qT+JjLD-Z)\iQǣ!|=`p/)METGᛆ|" =|> ,x]"k{UяY8|ov_ʇ}M1’uOP߃|wtpM{`w(<&_Xۊ^v0)zqKG{ؿ+<&_XNE/q+q7MjB-ZUh1’ Rt-::8&IXSQ˩ -ZxLwCEM7 n-@ |gD=`>^}G=s[1{,|wqtp\eȷ,!s>=^\i+!|g>Ú~ )]Gx$VŨb -Ẃ> _(]+Gx%V˕J/Zx i\卄D7C_o}|~j_ >;ޮ]h8|"ߵ ]|)W/q\!!1?x9?*9sg~Rq::8.wnW|>'zϼo8)aD`W`y C}}N #yRTӘZ+]+C9%,}\lchcc@B|o`{z^BsSZ)aDžGchc(chB|!q!|/AKgVKchd A5!|o虃F9+X=8|"߳|>Kh>$,zNGC3Ms =Bs{qqGۆ|"l4W!-k9 fGh yF^D܋r֊1Er- . #lUU;Ex 唰|o1\l{>$,e"BB uz_.Z >$,ո#BN R{ `i* }w7E]b]:Z9._;k_{k nr8.wsB| -!|9TK R8o}p\c؄"_W_ow3mE ݍ|w𑿏g^*EzP?yM{.Po/ -<&_Xrs)\i?2X K!^URznq -<&Wlڃz( Sh1’#3RM{#QHQ -<&_XrsqWh1b,X;VeB 'xz9NK96ZxLش{9 NRhc%DO/')z)=wfB `y/ -SZxL4E/LWh1b,;GeB 3=,RRz,+6^.D Zf+|a?˹^JacrŦ=XQ -ZxL_BE/,R$ĝ8ڛ&aZV -ZxL_RE,St9:8&IXPi -'*|aɿJ%YFmttp\3̄6!ߦ>SU|a=#r!{?`?~pr\DŽ(|P.Gb>ކd|*Ejs|Gs꣯\kG犓hh9R h999cb(r9vr4N'GS sO(GssA[=ۄktp u5ߣCީޥ8.|?99. _|Y^P#Jϗ%W̹(|W:":E;#C|HGye~YuZ:i|TPwG88|ՐZB|Ց)_qY̡w(\snXI,؍pﰔ|Lהg5?`j;8|uNB|unVf\qrTF8rLHr8?߶,Vs\7 !70ƋpמrTU+NO1ɓ#3/+OwW}1nW`yLIl==^OVT2|~|a;hyKPN _Ckgbo<&_X߿+[[B Q*8mbo<&_Xw^OC9%,؏S5A&|fo)c%<ݥ:ZxLش{{6/,?#E/EZxLش{{.eB xzGKuVh1b,e{NEkT K<ܫ:(\i#c*Z -<&_X嗊^J`Mqjqq:!_:#_>S1’kOϿQ\zm䷊5=֩)|]|"LSԞ K==As?*jké)|=# =|V>O ,?{k#Ͳ+Z)<&_XH~w\ozϤy.^=%|#|"b>7Cߒ-Hr$~fWGDl$7հ0|~їV~wS{7'7&D(jch6$l!Vxfb6Gc5{=D1/Gy8|opB|CoH˱ޒ:s:sTTrpqSs aZjZZ _%hqK$>~.|csx.q߻<c1X' sH9TzTEQPQN9fH3$aZ QKaW58ė C;CGxfZ-B{`|y7ѩ=碹r𹒰Z}{IoR>"d䛜7S719&?Gc ?y_c5uLGtΜI9> ' G:9^w|5wqOZ--PK B/,y[__@QXNM9&IX6BKC/,yX_1ZR+6^v^vIEkic%SO/)ze_OcrŦ=Xh--ZxLoe+E/ﲌ -<&Wlڃ썽읊F K^ShicrŦ=X~~h-i/,;wK=ށ=h,}wE?BG?/H|煿!g_9(4мv:r89:99'=_rHw)C~%lԬ=~"r䪯Gse}I9> ۍ!93/"nb<+a~`=_q9rGSӏsɱ:5p_D1>@!93Ws%aEx WF͕W*"Gd9W_k'"}ROjI A{A{!{x:}P=q}8._CK%'oOz-W+,+Gsӈ, ndqqyɅOߨ,I 4/Gўy=98slw6s7s1:9o^B9#|'-Pȱ:9osɱ;9oIB9"R'2- Ai!Ȥ4vtlPKPK !P+P+P+resources.arsc P+Wx6h8Lx.V8b* N b v 6 \ ( T  < z ( < p ,X(6l~4DZh~"*06LZres/layout/filepicker.xmlres/xml/ck_settings.xmlres/xml/default_cyrillic.xmlres/xml/default_greek.xmlres/xml/default_latin.xmlres/xml/method.xml&res/drawable-ldpi-v4/icon_launcher.png0res/drawable-ldpi-v4/icon_list_active_broken.png.res/drawable-ldpi-v4/icon_list_active_file.png0res/drawable-ldpi-v4/icon_list_active_folder.png1res/drawable-ldpi-v4/icon_list_passive_broken.png/res/drawable-ldpi-v4/icon_list_passive_file.png1res/drawable-ldpi-v4/icon_list_passive_folder.png&res/drawable-mdpi-v4/icon_launcher.png0res/drawable-mdpi-v4/icon_list_active_broken.png.res/drawable-mdpi-v4/icon_list_active_file.png0res/drawable-mdpi-v4/icon_list_active_folder.png1res/drawable-mdpi-v4/icon_list_passive_broken.png/res/drawable-mdpi-v4/icon_list_passive_file.png1res/drawable-mdpi-v4/icon_list_passive_folder.png&res/drawable-hdpi-v4/icon_launcher.png0res/drawable-hdpi-v4/icon_list_active_broken.png.res/drawable-hdpi-v4/icon_list_active_file.png0res/drawable-hdpi-v4/icon_list_active_folder.png1res/drawable-hdpi-v4/icon_list_passive_broken.png/res/drawable-hdpi-v4/icon_list_passive_file.png1res/drawable-hdpi-v4/icon_list_passive_folder.pngCompass KeyboardSettingsFeedback&Visual and vibrating feedback settingsKey press feedback"Vibrate/tick when a key is enteredModifier feedback(Vibrate/tick when a modifier is selectedCancel feedback)Vibrate/tick when a modifier is cancelledNormal text feedbackVisual feedback for normal textPassword feedbackVisual feedback for passwordsPortrait SizesLandscape SizesKeyboard layout sizes in mm-sLeftLeft margin in mm-sRightRight margin in mm-sBottomBottom margin in mm-sKey sizeMaximal key size in mm-sLayoutsLayouts for various alphabetsCurrent layoutChoose the active layoutOKCancelPortrait layout only.Use the portrait layout even in landscape modeDisable layout keys!Disable the layout switching keysAboutMiscellaneous informationVersionv1.6pre2 CopyrightD2011-2014 Gabor Simon. All rights reserved, New BSD License applies.Source $HeadURL$Latin 8@8;;8F0@latin @cyrillic@greekNoneTick Vibrate once Vibrate twice-2-101 HighlightToast2 lorg.dyndns.fules.ck F8 0:JXattrdrawablelayoutxmlstringarrayid F40F^~Hz*Dh <h"Pv2Nz :Z6`BRr( workingDir showHidden showFiles showOthersshowUnreadableregexpreferenceName preferenceKey icon_launchericon_list_active_brokenicon_list_active_fileicon_list_active_foldericon_list_passive_brokenicon_list_passive_fileicon_list_passive_folder filepicker ck_settingsdefault_cyrillic default_greek default_latinmethodime_namesettings pg_feedbackpg_feedback_summary feedback_keyfeedback_key_summary feedback_modfeedback_mod_summaryfeedback_cancelfeedback_cancel_summary feedback_textfeedback_text_summaryfeedback_passwordfeedback_password_summaryp_sizesl_sizes sizes_summary margin_leftmargin_left_summary margin_rightmargin_right_summary margin_bottommargin_bottom_summary max_keysizemax_keysize_summarylayoutlayout_summarycurrent_layoutcurrent_layout_summarycustom_layout_positivecustom_layout_negative portrait_onlyportrait_only_summarydisable_layout_keysdisable_layout_keys_summarypg_aboutpg_about_summaryversionversion_summary copyrightcopyright_summarysourcesource_summary layout_names layout_valueskey_feedback_nameskey_feedback_valuestext_feedback_namestext_feedback_values0LLl88Tp,Lh8x 0@P`         Lh8 0@P`      Lh8 0@P`     L`P8$L`8 0@+L+8 0@P`p 0@P`p 0@P`p !"#$% &!'"(#)$*%+&,'-(.)/*0+1,2-3.4/5061728394:5;6<7=8>9?:@;A<B=C>D?E(Ld84h@FGHAIJKBLMNOCPQRSDLTUERSVL`P8PKeAtI+a classes.dex |?~gLdHX"A&0! $$#L2PUԶVm]RkԺ+Z[W\Z\k-{gɂwν眻,7 &Eye/?GDiH f*\pH b`-ppp0Gq)Y%01 m+UhZ68l.n^ތ0x?8`!ۀT`x8v kWK;z`#p#,.I LV`7p  > s\`p >|fMsK1l:+Iw!zAG~ uj`   << _ҁQ fŀX4mz`9p:w}_bl~ ~ ^Lah`R`Pm@l.wC߀?9S),`Pxf lWW{׀ӣX (. jAIY>/@7@ T59j ;7?F?]x-p`y\L )˞@-@g(`<0j`%l^>>C@>0886W7_'Lr3E@X끋 ~7c=   h.j`p/8p8Lfe@5\< |Nr" hw^>LvÀl x@Xl~  8<<>N,=08d*`:`;p=ps!1ck@{$)h d@9X K_< | |$<;i`0L@0(ʀE@ 8ӣɪf..vWޕW{?$l [;6"l[ –-!l?[ –m l[OwMp n3M&חRIp"07=6%,22A03K0F0GsC0)s@Ƅ)G.aOkMH////W(:7Mm]>!O81 )9/KWH| |?@LV @$d`0 ,@2LhKWgCWf˱+ BTjW^[ToU2 g  ߛy̑cݤF9uq H$?Q9TVa.u)nfFncW:IDfgIt)jt‘>[œ*w:CL#Uن|Ux30hPi pJАvKT6JJ霯C""TB l9*lΊN!<3Ux6E*\p /CT ;{ ~aCQCEC!!|P$Y*p ˎOA8X> fN!!,}v{Pg i4m9Ȝ8_eyX3tȵ`*By.bTasv,i3^» |n%*O9sst&9)q,}1=> ΢kLk/5׊*;F4dbZF6AG8AxAtA4F%"*?ә= : ; zZyTnk1C?3=\N_hK h4 4Cu MوO@ ߠIzٺJ :t. )t>3EQԩ-ҝzLult=3LMcQ wJ+(tSʣr,7 «1O j(ﳐΣw-#IQ&g*Q9跩&ei<ԘN5:Ӆ"Jy&7I7R4:)de<^.T\˨DS }3]1|E.ƌ?9l%1ͦsL|>HhL/A z=(7AʹZgJLR,ABAsY%ԣ}|Ee՘?֘6#FQΡJZ)))9\?d!*Jq|h&;}PЍb{^wt> HcF?Lx ){RB=eA/הuAϧ z1>&~ɊVtI):LsATt=MVr E[Aê;쀧CēT 7JP~;1KJt=Y>H_)C25W5?,h**5נ_M:]$(s8(Qr]\ OKFh.2xED Go|$RK]t/Sr|taHzrtBީo DWQ>Jt56}ADE]NR4?Sd;WE7(QMvV͊nQtZ6Z1ͦgS3})\9cEOED>u"^F؏'&{7!?3=KT߂7G$} qy=LOϐqJ1]NUrʟ,qDIo!l]彗&X~\ޅE|gkb!RO4SJo!lG+yp+@C~gB^@qě^oJa{~w*}>(P C8ϟ_$ȿV.U>#5c[2pM!? cwsF_w\ޛ7@?g}\ȏg} <.!@4w]} ̃n^ȗB$Θ5OƷ*>W-*k~TUJ6]g{ %kTFmDfaR}K|%>N| a>> ە#L%)߭>:e~Ibq_+ rx N M;CՌy7L=%FvJWtgr?^щ=M*dH$"4kL3e䨺L&(f"7z|<',ǮS"tʸs>4ӔC\iG~M3?o5|Sm{u5?|rH|oC{O3y}v'gs_ΚO!G'{){۞?}ɡ&~cϳP?=q>';t14Ns?8O<ǝ1#. ?B?Ecf6d#]7%hҁrJX 6j޷C7io?үTcD=Ǘ?/"0^1ܦv;%˽@[MbQypv;i&J3bp$Ndgg%=6#u6@4ҵqZHnʄt7)I:yM<.zLC)v/k)GCVӁ8^cI5Sa_a.lgyΞKّB@ &DŽd K2[ǣFۨ[Vá7Y?d%7ꚽ6ҪV\'^<嚮Atd-m9E5-M`^W55 xLڟڜ Y9\dʼn63Tr~"=N<\F2F5Bn>)(2fG(xFJDcrCʑߑrIV4j{I#+6g{F]*^ ̱&?f!uBDM@7ao2/}f? =A7V:]e!V.bfd4qˑ~9It-p&ivJKB>iOmET)zyzzhUgD/8tǧl'×+%rp<2+Ȯ'iD)Ln`z w; zЫ):j& ӵ}K^ 4=2w{u8]Wq}\<}z9o5ITύ=so>ApMz J33wLn0pGF4PHtd$ 9R%퓹kjIǦ|߬w34j]xF]bf͡BCJJ&Ƅ,^ҭ(& OʫL^rgYH~e-۳Kupb,u"j+x=KӁJ@sซQF`g5,\>_~~)` *)xl<M݅?@I$>L{ܠ73=cz=m+0a^ғ?d!Pj!~&=at F\fH7\YԨ零i}z%RvVե)Fړ K  G؇qC!\ر(='EfNl3;>rgţ,7tEӝҙW5ZdQrgzs&Y`i/;vf-'.~) Qo}Y#5mn{J +UI׮E;*I d[}c ubOu~wf!ghKӼ 6Y9v 6'*vݼ/r?w@I𒉢m2XDxcM2"i/;4G}Efė طS9ZIZ=/—/[>q`͵)ni5:&TlwjgFXW{ְtݵh#aDt$Z#ϗ~|eSiDž5<%;  A#y:v]r䨴5 bD,g3&">˰=qߝGsRx(R GNvv+ \ԩb:>M{/;U7m qKж뉀Y=K﫛[n .tԐsom]}.O)ZL荗"gBb&[կK|e쒝3*i̼x*Tk;!s*E܋T/:|_?ȧf*kaYh;4ppR%oR|gq٣u'r2 l;fiZTaK >s-f,"h%"9x-9v-)Riڜo\}xY dQT6 ;ymUvҗyt䷀s\C=6^NŌMH G1Mp̡=drϖ}cYEqj+\%[np˭BZ*KurTZ:o{b#q"?jA7x Wz}q-:C+7r>|DaJm Md_~sŌbY,gDsYCޙ4v30Oe`fTs.D.C5kB`-sh3AR SrlB.^]d~t.D٠j9,m{0*fU?:B?"%/am2$"QV)WԳ Q|I?Hب-u0!+5\sr4\]<"^gD=գ=*\+=hG#]4v%4A+ K8V"cf?m Ocrx[X#]9]J/1U`k?bű$])8o[Dh,2swNbg7'#iqiV*pX9ۜnjn@M5ݭTsa; u ZF<@ *rɏuvmG9ޖ{ dA xΦKv'?i2D|~i.NT1M{KSϘ~d遞c]<֝$U汊 ê^9!:O - 6t4rۂk[^c+z۩Ԟx׵QzԦ='Yk({E ڜxFWo y 6&Y̨`ͳdj5BTݑSx.$'zxf|b0 9a.܄8MK%׻%, n)02–gay.O%#m4| { +=Ly/32u5IΑ x&=ǠĜ' U=q7cAJJpJX#47|An@){yԨe^dz/C]d7 w|GDi rS?9-_ak!~9>Y-2CQr$Sk0f!]\샴dE|ۗ^|G#}8-*vM8W4>"SOj)+OFq <q<~3@\P<ǭ'FS/j5 P7r4;K)Og,G>H]_9ʴiX:eML[. 푘uKT[%6+T[2BcT ʷM ǧSmLrٔSI91x mހ]%Owq8\%䖉3Cw@yw䉼cɹ0>%*g|bn-ݖ!c/OxƬDKUTsU{*olߵђ/Đct-Rre"7{$K[W.c5Tb ؿwt7sE3|Vr%w3Gz(VD02C ݽJHNCӦ]{b7䶣wVgT%FT4>AJ_A+E\be11b1UWce 8ɤMo>؋7bÄ-䓩qr!W_ {jإ__Zc/Z<_q5qo%/bY^g5ZC;|Zdի{nJ+ڹZ5>,CI 8gR\<*4xُw_oo^a]^0AbnȺ{UW_̃s`_*<>xM9c02W&rǖh{=";_%8Sh=i*Srjs{ǭCwE}cx ԋH߭{'_ys|3.NXیY枞: W=-@fFHʫ}3s3z'6ubMƘ"]|U6}5,O]4y~O|a+{'yw[yػ=vN+k~چzD]:8tu{%:gj&s* g@a2Spxb"ٔEv]Ba) y `7R4NQlEѥ@Mf*B5v믒V)ڭd3'zz>r=KEwbguu/r6sX#.-hEɥ\Z(Bϛn~VqWzٳY k?CV rqozOhf[S׈=b雿Ͳ&{_ȽajkviMZ]ՇջZ؛0];F1ƺyʮ}Ox/6n^ѯtሟ~#F5ӓ:cVvG*͙hksӌ&iۢR찴&#E;@<,qa"嚭ceZQ}{{Y#á9mz*ڬ Ǿw8fl92ka1yyE{6'|{:.g*ϖGn !۝a=B:j%m71#Z+$U+_K2Qr%̀ES+)uPQ(vMS(sVjױw8EuX+, s<ʯD|#5gu&Jt)Xo7}+a#Q#pqˆ1vpU5WkhrJײHja.wG">־%;~Dځj-팣[PҨo:[:*[\չMO皨~?Ȼcľk#}k I= ǗO0X~ˁo!tG~WJGwA~;K B}tD3Jf;iy<1_al.ir :u":#073;0SmTq vqɑ3F<y ] @}9c"ʫ)̢Lt`:]34^l]2 l>tG\]h-dZe?*ȝ95Yos̿77u]E%>XtTbPETې' Od6y=rGDXQO+sАNuyL⊆W l'}|}|.E/:>9h -!y=-/>IM]3ME]6ߓLPÜf:xfNgVZLի *~w!ŢE\e?/֬UIT71>:M"GG,b<(q!Ϊ5F{SiKhVwA.X zh*GRZvr/jx,(!\bmzG7TੂFLV~d3MfwU ْ3դMs+Y#|7cS;]o {R8]0 "¥{ Y꽯)q&r|.gBq1KKWy'53r)SD{4Nd\w{ߋI"/O [<",^T1|x!}Oox/Ϗw^S'ərnRp:x4a?E晆I~X36^|ݝ'ov/1[ľr0j-usxG.tANfm= &z)yϦgX;Mu)FJxBJ|dԛ|=SJoe%;dE}nbN -w`I2皥_i+[@閉"/~'F}gEK[h,H2cu[ku7TUai+yŢՀVπiśӏkbo ѓJ+="JqOFw"'kk2NBMv!z&~c7&?c_wX6گƮl_?ҠDPʹ)܇\p;D[a̾ s-v!_!@, ˅|?Nf٪-d߽S6JύSG^ϻђ nr}2r$U#iQҠAM 7XVNr۝668l~xy&2YJg τ#w-&-,}? }~_K8]_{?`~o0㾞rj@8Meǘh=<)VbՃi7oCOEL9!{2Lۓ\6u#:s0Yof!v?????OHSPh u!PS5ޖNk.ҦuCqS >Oq6C9dA0|ͧQ0e OItZ?IU7kGŁfocgݹ~Jin_8 TXѩ\\UB޶f}x5ް"9׳BwGU*ㄵΧq'V>{k (q SF ک灁2I+e5XiqThhu4lkiu?z8UQ@T֒OӾ-ӼoK`:0"QxFԐhy0hiFR]+plʹ8 JF߮]qoV؁+7Oz 6XrAqC:"Md{DWΐ ΁b `g}@Uʧgmʂm5QzzTD}6irۑOoQ['F#wbb41;K+]o"2M9D1:|EԬ5oI1t7SVҢf_j9,E'd CUyZ_42i.mT;ZIeGhh?Qd´6x[WW@}K0մ{0:eŐ@^kS >Ujx;0=͡Z$M.gw?8I~Xc\a>ܶ ,/ Zua;;9Uَ'\^]<}2gc5 \ ?JIE<]m9.ewhTaMx4'=c0[>> EM.J'`D7("M^8Ԋt v7܌E02:<^1gѹV;pzAS>`Ge!6<^뛥+v<1T^y#|lʃ& "jh5vbQ'nկVG<έxHϑC>}"gF4.﫬@5a>IV%\;qtRE{6q$I>M HFAV 6V&Yߩd:@$(QQ>|Tutܦ?V,ŁlN6 ~uknBkLV ]->Y)'QYz@I3fqdݐM[gK˴5YD0rZ=[KkCkEgb̋S_t6/ :}씇)0)]D%narB&L'ҪH*bq4]rR}6UZh#a6 s&R2x Ճ;DcyEo8TՉST@M|J2{j*K(?Ws/^Xl"R\xrŬ(\F "$N)9zF%= :[.gSK 5zPu`u 6 XNQ`+ERҗdY*mUʥ :edZZVF|hO)gN(n9'1-<|r//[r)Jˑh9ig C6/$ H0Ck9ƇAV v\ױ=W;v731Tz4I2\m J: a8+ [#\&oKYBcSeS+ 6_--KC܀l/39F# G0LZϤ: rg/8|EZ=%{[ZW?pq{nZ( U>GwDcga̼(O) X/,"*D'.XDׯ͘~}`Vk7F:y/L4g}aԑ,Q0 R%~vy`y`~kںBJW;[[!tX=6i(wP}gOEN7IER1WWa4dTGC{ǣF_k|}mB .Й bGA_#%^ȋhT=6GSz{H?̃5R&<023Z8[0hBePLqx?]K٘bdߛ|! 3L_;Q Du" >, HF'orP_w-d+ hpRMa}6K Дj l0 Ir"яi+~_ (fS:֠+EKփ*;,§&,'b)"f$ 5{Z)AX$#nїIa=)&1n:uWprr\ 9д61"Y VfG&5crVxױc4CyngǺ,NamqMgOyhm[e](_!'f~cOixLѐ)T^lXWJ菾E~>)^WY q=ނ .RFg)Y+P?\Wba28ae!?/U0*a]~BtZCyɴXQ֦a TQAVALj^ J⭑Kk8YMVRrW(eU^T‚$E\&QV$IY//k:X5aBZxwoZۃ6T"m(;NdbWאX - Vjqfؘ!,qoDM11W2,gۍ(;BAp=h8_Z58w]Iwmye!XnECJ^֕d4CW.qm' $d& ebMāq:SuLtj@%}ܻڐtIjwy}sjK 0p:p(R*S%2{z,ALWqnN,IR I~"bJ 4UTސc(\ب ՖA=EWm5L1,Ј v"dl`pP`mNvGyOz=t6O;+< åahm#{O%XQj$)5a}v[8T?@~KZf*&8Y//:,9.-\W^gz'@E>pc0,nؒt/?,O2)3z]H@7oǪ=57bSNCׇoZGx,fR TUP7Vm8w3Fz@p^KpRx S7WN Bm|s'((!DSG`F(yHA?HP> tdhdEU/_YKA/;rOBKg "C,fCI"T*(+TR^%%,npгKn"/+^aHaHVØNB|(1!xoԕ3 &@ROfdl떌RQ&%d q:ݴ4Ax"'G6>Јp f9W;p uۢ nF,6aұǡkڣvBXW/_'[Č]oeī Ev07Z99$q7febfar>_7и& )(,Bב/;g i]ȥu3] 4 !_lȺ#c:l ,E8 ȏL!z]RbvJBeq_'09y3`el'){ED6yW`/ e ;bnq'sl̝t)Oۉaj/fL?&%deAirev.Gj\Ac;Na6|[{PJ@鼐F&UI6'y-+{ɥp 6gr6GԾM2ɥ's%6jMwH#68&4pXmdv99#\utpm!0{!tRXE X-b=fq6)$'8';8O@`5GTMQ. iZ"%YI/0y>Yd==o/2o]0%L%݋W`9 }?z8reQ@NPԍ+q ܵ&Hޔ<ݻf.vP,&۳ل&\Yāwn̏7]ȍ̿j`H` u٣,ƭvrld],C/ )H=Fjιgeixanyť21z $pp{bnn" n|nGRkq=owT`?[I⒱jٕuCLaq%-N$`<$yɍr6"m@]rӰ.i~hԵ?sO2 r!@>V0Y lekU|m"{4g}һ5FdD} g<}dHD] c0& AiAJ8`ݨ;0fCjRYvU-kZ=$*v1p8J FӲ6 ]lAw!!<ܹ݈Yeqk1TߣʭL{ ?Uγ N*x+jzJ>Բqk~ +Oim0Ş d\T;qEѾ&M[neѿ]rE^Eމ+&/ȟN%_EËGX@Fкcx]m]u]P! kur~Gm^HYdid , )` KSY"f}$!8XywXwY{Ik>k>̚" IIF-I  _\OO'7ؓIu$4{=?nd0d 1mToDnI~A,@p2D` 0T"BPAB03BPA-"B G0|A"W!C0`LBBkXDl}/^,v5>48Zz^=^H._^^ߎp75Mm/]R^Rs>/xlX^yJ]tjp֒|m%%to -/wЏ_/'J'K#%PK+aPKXAtI"݀D:T5lib/armeabi/libsymlink.so[|TՕo~$0!$Xeu"D4ԲNd ӆ$fZa RJ4j?VAk?~>~Zw;Ƅ֡?Vs2 sr{=s;ZD$쬔r1&,]˦ іY2LVJcL6I^oXI&dv6oÄlLfi J H]??< +*_dBjHp5ֹ-/;>;=? ݽ+tyz9LfniA⹎1h .i?L_y!6lyO7yX@.,h6tlF=d :aSc=$/@6;:/r{ h~tDAWL tTD jtjA9 25۶1yiX}tmv?> o[Y } sVw7g,x+聙^#4cZhR}BߜF+ѫG@,tO-Н |> R8}ɒ1{A.sX\,ԇM^FN ZB_ ewW-f-5e6)\er"Prֱߴ5_%יƎ 茞``MȿPkޡ|2"7ɿ6jWnCSF@M|<*\Yz]f54ur}߼"ug?돴OWVj5ҟ0[\ؾ:- F/L( l GBminh 6ğLa}p:XHsGۣ]ܶ%HUT*W#!uD[穂D:AkBƖ`uCll"͢n3ظ!hiAK= 6}u/OhT`[0a//FZᅭdt[7Abo&0XimG")bLZ tDu_hm: Xۉ^l Ǎ2\lka04ARS$45|nj>d i+ c82*Jaogftˣn`wʦ -t&ೀRyMhkNa);?Mbf^1u6eYZE9CD cR[&Trb$^$ZRg~ۃ"ib58QwG*' C<;M< K&B2 x(}0`04ac0{0'c' >Gy01ؓ1W''5[;4o_3Ref);;VNXÖrR~ROZʃ+(;~'cLV]lk^-nvzv*~3؞/R"y>Q\VUUU9ɗsWWڽ75?J1-zY>U% I3 fiH&/-/Z69߯N3o7P c8v:yOg"*/alp*z9E/+J/l.^lj1?B6$>Cu[|[ EcE|ۯ.ժqTl jqWg}ݱ7|jϮ}(&Ae*Ix kOb~2}|bEWpsyǓ0N%ړN=[).u^%l@6kլ $`ENtS6)^6B_?cM Y*r” 3,6~٤Ù6!;):y# .GEn>yaU} '[䧵(o##lņS>Ee̘sY:._ @AnZA:-|2,wB.s= "yS !lR4~1oU$lϤ}u^ s#Kq OG"] geT!C.6ܐ)%/!KJE.1إ%*|S{ ?[#z~a_='{태KQ|yC} 0^9(4M"~Aurε)O|eV{Q>绗j׉r0_M{ל*5Of=-?: 9R|oQu2BQBk$?A,/aojߢ ?d|CV6EClSGu<8 mv-[p3+>_gdqx9ӺuqZq (,+[c>ZA٬.XqXB\d!m.kr%#:'я򡆭/oՑ>D;*?H0-@ĸqyM|0d?]m=S63P܉7Jj(& leYϹ8oQu'kPw4"mhۃ|Aw(MMS<[uC<ۙLM%:x٬3OFv㱭0{|4t";Dc#)}9DOuǧί۫uWvֶ@u8v8Mŕq` ַTsAT y~Q/ ]f 1H#(pB-o4ڋ{A<s4,;P8p9+w Q$k4a|?ЫQ,pc +OB9G{&~HJ XI}g(5)ʱ,h2=$ 6)qƖ(T6vgb*G;G″1>ypptYppTu,D-X7_'#FbF ӕxn x4O{!e/Z2h8y r(-B<.K(tq,&<ف\S<Hr"WCCƻ8n>tv#|0T_/Ln?4碎xn@ x4<#9x!9D9c]Ǯngnנ2. ]YvѸ-綅tvu[*ĐRܧ9y0嶶]gڠ0s䠌X seFO]0T[oP|r,)۴FN|_'cuazr>lw4;$ W-N]NK &^ 0!i#ނx<~󍍃'w04!q3v p tRGo}uxCo}z7.^|\n-,)*˥`K0ם%Oo׵4eܣSלLIe8\Rm(JӥB + 7#Vj;YYk[$XuCٚ 9&Vִ5q#9nf0=$:@nl[",P"--[j $U(*cP#FoC_blM8֯F,>\D"5"_cga PP]!9^I|Gbc ,R8=EG{#'>1>OL{GŅK2:f)Q a=.k8IbLj@-|\|ؘ}|v-;m{ΑI)3ǣ{L|˺sb cS6$;8_?ySb\wR)ʩf+M#3GE1*}_sk񿵑,3 PK"݀D:T5PKXAtIOײOlib/x86/libsymlink.soXQlE.r(HO*B%(9PLX*n-wzWﶵ%PrmD% P#4碏a${FG:ȤwYuX&-+vvf ̈́mm0;a$S;D:ÞO$\~a̚قѝ fan$ .B+)e*52Ux׆e&V(PyjeM>L.]*) 泀@=x*2?(g(XXC"H~(r)݋xQY4G ǟ(Yx_.OJ>\9-?wQ8N7""@+99Gi)]vPF9Oql #S&& }>K_@O Cj7&x]оh!`)G"FovȞ_5LchxxlEnGcF4wexwx]Z?), fz2ZaU3aG#D=*oI=e {[_=`MIwt}Ѥ7NiW394}7ޓf I&o=z'Oz I ŝCΧGu?di PKOײOPKXAtIz+" 0lib/arm64-v8a/libsymlink.soXolE[J[(R@ P@ς((*A?u{w'+P 1 ȟ~hbH0QI*JHK1IJh9w7v&/.soߛ{lqK_<-C>Wu a8Bi; %/(l, !_{TS Bg"{9΢r* g_y#χr-YNW OUԞS^_ L`oM?Q]<|_؍!;A~,|a-&1Fb]!츇0Ha(CAͨ!e#s):!dy$Vdj!h u~n}? OC`[&C)2ЮA3m hău8,76zmJl"1}p0RE6h f0V#] ?b7Uh¨gaӟx0[*cwV5aF*c1b4nuLj\YWS͢ڞBz]Y3zDyuo4Yk9ҫY>5;mۦϷ{lzɦj?8҄RTŬuΔo<&&B&N|p hL b,4y>X5Xu9Mՠce׈ ʧ42ϴjjS5COj}[}ۈ@.>W= !j=ڸa'`]VɃ4-lMVq66/D}AJߣM}{ch?oa7>쇈S|b_1~#[yf(M0(pt;EN:60`OnҋzK JZ0@{_/E "g@1$va"^/ƶ Zgff1/.mCy{ *)ggPwbs<(flL_Bm?MI?PIcMۯ86bJot`2<'qdR|[l]YuS%<d,-;92ܗ?Ż?¾aEoeoﵫ5X\NTO:2ы}*?PY( mp99rCDQw+?PRj4/:OwY$$_y?]FI󹢘dVO"ɐ}tN"i>F'1eg G9\=L$b˝}_R#$'e3dVTuF}Eylt儯r3yd/1淅󛾟^?{!}$/{/d;ƧO~3MhK~ӡ}m>u:^YtIDrN\3~5;=I3h/PKz+" 0PKXAtItlib/mips/libsymlink.so[lUih:-6jw Cˣ% -|M&pl@BLRъJ(* |tFRяe?H,HB]`Ι{'E^s3xP$@X-Ћ~  8\N B|=\h ?9cZG.7%օ6(_CpZh:n ,kxҶFwqr{glX قkLsx)|PO_:y0*0xOW%f򁪡l2r@;u9@pɼAT7]e*L&=6Ese]i]F|///d,Ai`/Un"`LƑy8$cU/5(D'?M3wQ:KCl߬|*=3(i{!?#xdD۾hG?*qɆ i\2^SN=SO7~PՓAd7D_7dT]=4R/ZX'Fy\s*rYoٹ :6ZEF|G|8|NKͨ7]=l9&'D|cGp-C<-ʽ:oҥFS?5t@h =Uڲ<)3O e[oJוCLlMu⧟}7Ѓ]3&Q.)RcrqCV. %}L,Gzk|]iWڕka@ǭOyw9wIw6ϩF ~soV3dv#ZtA3b,N \ȇ'=%zJdJT\F&WZuPhI?9ŇQI|Yֲb<`JXP-ByjtkmN귥o#}mR9WsLOvVhW6BZ(׭5-&>Jha$bTc`cW!0{>rF f97F`^Dshgd10J^gre)V V̠a\ob Ƭ=Ʋ&Sp<.`bcTc;8->xX)˽= Mx9lm^(l+¦rx#Q$>ڧ/V;~#qA~$stSw=  #giL@gk vM@| G5|ˑ<M8!g|ZKaQoWZ 7c%v?'쾉}е|wChȺ5-& 74z_k˛G:rsEes\_ė$_ʻ,ͷo%O_$baԋ|j PKtPKXAtIyL9 \5lib/armeabi-v7a/libsymlink.so[}tǑi/5Α# B"灭 ej%-h_iqD/Le ǡclA<3y>g_8˂±<^4ڈ8ɻ?^kxo_%'+`Ij9 Z?^$lK}I \'`098؟7X&B(jN4ډZ?P/A> U#Z&x8Ɛ_1Q 9~=,Hοm[[4ܸ&Ҵ!p՞mλ'/k|O\w_Jn)E)t1g2ll>07 k8}8_S6::Y >b F>gcmtmA Mmw@ч@f_]1o~&y2ײ;6#п'8=9ܱ-NEq<5 N&N3!CUӰFNӗ戥A~ş?t>_oٯ j=h?h;{@觝2y^#6 e@E)M)7A{1'> ~N?/L)&} ?86: !i)HS!0[{R-lk&ܶQg(nDWBͭ[uۚڂ6ۂw5 >cd(6}+Tmi ʟ##Ҷ6ECQHo7" l }4(Tgʣk+U4qR4oij ݴWmppc"Xvͮ?2&X`9hb{֭\*e(Vjҟ6nmƒքAH[pK4ܔpE[#xַ6꼥͍- aG,LmV޾q}%)9$>jA5TZi 6CM[[x[t[K8ܻphrdm=pm4\7nڊVkq_÷&^?h0x-]˟.Ko!2qL \i֐MSz2jڛ׆ +HmY(>ܰ:6Nچp{jsik C5eh]E<-6r\@/xP1]l!eÑɖ2ũVe+J̪ؕnacuM .;Bt@N| P2`>:_Vg mlkO>UWLj ,[[.9r9_X||gKGmö5]أ_'#ІcAL,3QC*x!=#o'K$?T:7 dWKO,ݿfa}(zOHk܁'{/,/ בfz)Plٿ0{h{%lQzCߺwf0ߖ}c߼ZkEa&>) ]T"jC=^*|%PK.OxӅL̀9U)>CrtGQW)19]?.TqWPJ4Gg-U C'ꎝj[`9GXa4hwm#4 $K^R*U=rD@Aci\{^-~.$C=,'YT.֣e?d/֫ &17>+c}d[6F?`+ ԫ1;19NJn0,y&#ߑ/ɇo?/o#x=NvtF"gHJcDp/uLRuH2|y~;F<ma#"Hd>Kc囫:TzYuÖ%O9֓M݆_0udW9#?E}ȣ###H#Y= 9?H'Ęo>Y;M |o98G\~MXo"?F%:0C =Sk bna%-4|7%*15ة i AmjU^-ڞ 3 zv\[Z'c8|?}=:xp8*hOʣqOB>#8ws- h*5:cimNi1c̀-]et:s4fo"bb5>mr*bMpxgKoSJ*90I3i("F7Ogz9)/eOԃnOÎ{ٮꇧ ^םͽ8T/v i}2Ajߥwlx?bU: oK݁IG|{%=@gGPys\I_L5DZS^{ԣ'TE1I滗Wh|o MgnY-f߁I>ɿ7m!TPBk;٤?rAƬo:!G<;zkrguBy1H~.'ުA g941 ;b(+ds.soY<:}Ƈ>/>Ӷi #> =) -;ݽ2<񔀜0wMʚ?b4Pk`4^6k0WS;bdO}#ٴLQ :)hn{ N.2|S$c!zn:7:cm6y< ;|c=֙}COյ q_-ΡR-_s,>F~8`J8BrZb`&cMuISz#ljR5k~d'?q6;F/Y8cuǞF$}k\-`]}kB6k9;!xITNzKg\TΘgء3g/3)CtB cߡGu3Y˯Crҿ?H1tgz[`}极/Po_)n쎘WWtA),ꌑ,ıWKzX_/e%ڻʴ4uI{r]Sq 2#>HZנ<;Em5}2iA=r|&wD}Q7P0s+zEr&qJ `bU6v.銹/,{ynmE3I~uF˔Klg.cQa"/kL& vYS\JTv2k,Qi l6dYؓffMGӴV[u1_TJkߏՅj5lؓyߢ0j4a,eeP,݉Q'nM%a^;#F;s{b+_TSB:18xͺ6? xUcP݆3KElU"wqbUMF:nhK┳ zcBX?~_5=jfΐip7v>{']~ķ$w@3aQ#- ]1Sd߆O<;p|1zg$S^xf?Hl#<0s(Yt7'>[L᷉ϵWc~bE`,>NKۥG-z/O?y\iH{M[ Gos(/%ӂ>_!|ԥ_U3#arz?s\?ן)ݟպcbcI {A2F}]> o_]n_=_;t?=|֔ yRreRAKk5o4םOwط47IEEtݣ.[9@w%IҼ%!uMq SBcsc ۢP +4Eí-9.Ҵfknqmkjhh++3pkݴ$`4ziihb!^hz.n4E6*MCB1R k^]+ikc͍ᦨMw2ʑP4 XX=a-EIs>oL⣽Bs.#thn¹9-؝%n= x98BwfC =E OYJ|;xhop9&pI6(O&O`m6>qo;&vY|-loR|)Ǭ۔B=Uc2磜]8ؘ5[±C|t~ϼ/7~%>?ٸ'߫=M|)|?cH>7V\{֚%^.[wJS罺<PKyL9 \5PKXAtIsO8lib/x86_64/libsymlink.soXklU(vZhyմdtEL}R7jQ XKB1M?MycL DqWŀ9g;sJ9|{>ɻc^؝lBc uʂeS@;d,xD;WXe Ns#:{kmwxHq{aW/WMb_X*,|+'?h,弎+ /*ؿ`gxߨOTu/c䆾Hvcv`*~kK&sllF:I%նw/?8'1T% <דpCyBOzNr6d H-9oBl 1ӹju ŧ >P#}62Wi.8}+/JE:m4 Cn;Gm %Aݹr{aw{a?Oe仙Af) 4yhB Џqwu-uri?:RTm|{`( i^Y5>%t6>pϓTz#u[Dum5jOy"zL펙?h槫56n4V^4'N,gש;{4%L T? |;9^>||~e sRߩ4~4k 7@mݾkB W`E_@:n ;,z;W\R*}{q?3DZV$Ѻ0t>iA5rCaP-ݬkX5tuJ̭&3$"HYT?N絙Ø?Grs<q=P?EԋoIнU3~C/yH[|ٲBa52%%zPx8$R =/;[}qPE#(/#29}rHdH2e,J, ؘ˰Ȁ`D&JVA蜍TExFLL0ڕ뙌E 4& 7\lXohp09["P_ү2F"s€4qaA|Z5Y \ʧyGHg2{NN j+=O0t~mUaI䷣NS Zvz 6tc4`nm:6wN\KsOpȧ/Ko39`oT߽ _e~A|~9@AQ0Z$;ǙI HvyP?_PKsO8PKXAtIi+[+Plib/mips64/libsymlink.soXoh[I,4{:s6Jꔋӂ/{+tܝZvSA`(8 4DTQBPVޗ *vF|;O#μyoo{k'k0E $ 9-} ǑQ C@.U> atio /5JS ¹-qsv[ŽXf.ѾoK.QxKاh-9pCMaEl.rx\R~b^;\ \5̓r5a5WgEb:Fe 5WB5|~V?JxaS.#M[ױmE]!# Isydv)MyP \37 CZZ CW0QC䔦SN^_&Ig4^8[y=wnV&z*듕kkG}|kSE.s\EL~Y?<[99o~s#0 (>E+"OPX[x|^m obscmgD?E^<ƴIw60;@-~Q>.Aӟ7ݯPƿ2n< 4^]jo3fc~MwϷP;"N8N+3"|Y nTǂ7Rh1 q}p߲ۧHԉ_6x2{bXRG|9_ :XskB`܌}SBBqφF{85W{?,t]@ r<&u 3)sHߑ?0_z>煮'w:]S Ε̏+ ]grs8qpj?9 mq>f`j/ASJgWAV{E20r>e`Ǻ9^-zS>;{ť.]Ne)E+zMwM鿪n; e;U >@Y=PKi+[+PPKZuI@ META-INF/MANIFEST.MFPKZuI[Xu5RMETA-INF/AD1279E6.SFPKZuI-U#   META-INF/AD1279E6.RSAPKfAtIqa()XMETA-INF/buildserveridPKfAtIqa()META-INF/fdroidserveridPKeAtI$ 1AndroidManifest.xmlPK !rsff&res/drawable-hdpi-v4/icon_launcher.pngPK !By y 02$res/drawable-hdpi-v4/icon_list_active_broken.pngPK !< .0res/drawable-hdpi-v4/icon_list_active_file.pngPK !p*04res/drawable-hdpi-v4/icon_list_active_folder.pngPK !@*QQ12;res/drawable-hdpi-v4/icon_list_passive_broken.pngPK ! oLL/Ares/drawable-hdpi-v4/icon_list_passive_file.pngPK !s1pIres/drawable-hdpi-v4/icon_list_passive_folder.pngPK !4˖&XOres/drawable-ldpi-v4/icon_launcher.pngPK !RYY02Ures/drawable-ldpi-v4/icon_list_active_broken.pngPK !UVV.Yres/drawable-ldpi-v4/icon_list_active_file.pngPK !F0~]res/drawable-ldpi-v4/icon_list_active_folder.pngPK !eB$kk1vares/drawable-ldpi-v4/icon_list_passive_broken.pngPK !ygu/3dres/drawable-ldpi-v4/icon_list_passive_file.pngPK !nZ/TT1ngres/drawable-ldpi-v4/icon_list_passive_folder.pngPK !HH&jres/drawable-mdpi-v4/icon_launcher.pngPK !0rres/drawable-mdpi-v4/icon_list_active_broken.pngPK !<ُ.yres/drawable-mdpi-v4/icon_list_active_file.pngPK !e hBB0~res/drawable-mdpi-v4/icon_list_active_folder.pngPK !⑐)1"res/drawable-mdpi-v4/icon_list_passive_broken.pngPK !<ُ/Vres/drawable-mdpi-v4/icon_list_passive_file.pngPK !%OWW13res/drawable-mdpi-v4/icon_list_passive_folder.pngPKeAtI;&:ۑres/layout/filepicker.xmlPKeAtI@ \res/xml/ck_settings.xmlPKeAtIb ''res/xml/default_cyrillic.xmlPKeAtIA̾1res/xml/default_greek.xmlPKeAtIT~I7hres/xml/default_latin.xmlPKeAtIres/xml/method.xmlPK !P+P+P+(resources.arscPKeAtI+a @classes.dexPKXAtI"݀D:T5jlib/armeabi/libsymlink.soPKXAtIOײOlib/x86/libsymlink.soPKXAtIz+" 0}lib/arm64-v8a/libsymlink.soPKXAtItlib/mips/libsymlink.soPKXAtIyL9 \5lib/armeabi-v7a/libsymlink.soPKXAtIsO8lib/x86_64/libsymlink.soPKXAtIi+[+Plib/mips64/libsymlink.soPK**1 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/org.sajeg.fallingblocks_3.apk0000644000175000017500000014106314620351225021560 0ustar00hanshansPKkVAndroidManifest.xmlWMlTU>ӟ0@)"0mi"@?Nۡ̔:oZBd,\4DW… c1ĸp cq~sݹ|=߹sϝ(N!򨍞4mN`^&uGq&1#ukǀ3@=%=xl%>~~V w?.7.+E |ՖG3,/Hl9_zy {8zȥ%V'ؿ̀w$OI8ɧ@~zVio5axa֗³@ޣt4)}0{A◩8IEF-a G#$S ,4]W3KZd>ʢ·h$)zG|ԋ0Vr>dbf/*@Aa~v&eD% VT M XR':;9YuX/`9 ^c FfAHMK= d?;+1gx{eزHEɉE|x%=P0gmsie2D";hϒF{9$zZ2!%%&ўJTϔݎgݱ.gT0sU-QŀT,+WЧQN߀{jVɔ [}T|Ί"z~D gxM&Ƭ;ۿګP(5wmk>{jV1V_aE|Ff{=ʯGq\F3gQϣo.fTlp{c gryߧqIpo^nK< XhM@0w/'1u7@]&pZ_wZ<}νO?)Lb[c3,nr%CVyǖۇ,Ep2+ሮZCeJ~Ljd^VHo%?W|nUnÙ>zZ֛ZVb]Ezh6r)䚄[a5,SnrT¸vGĤۚ 1ݧku2g瀫e|Ǡ Z>|Zǡ*|Uc|ZG IKZ>|ZH>|-uZ>\- /[3AQZ(oy.{紞rC%j[ƈk#Sy~]"v:^+vη>8oX|04|:`ji-Z3Yqgu>gsFoDF3[7PKz^dPKkVres/mipmap/icon.pngYu\]]Z^Xe)A$%\[a J@Bn^;S$n;Ν3<>PmM,o"YwƆtd%L ԋ(qyYs}ϢpH]U#*J6?M N|@qAiEw/se1D*Č$>TVhȫ,}=u7Hh;m{g{Kj$sisK[6EXݻL[ 2RGЊZ,c˼|S_6R4 &C۟F*h]uʓ`Ih~:"D;yyŨg`껎z\C6~=xogS//n<2qDԽ-<Yʎ*7u5S$e2n=wSz '1,\d_r\G~'clyFt.J ~-^dT(o$(92l*"dN.=f#H=kk,uZ < ~haƂv MT=$ҹ]~:aI}]0;O+cfa^61dZ@噝;zi+ yI+AԿOp_I5GNu d‰[\z,9XBbo$IO01I[׭x575͸OؙEKP$΁4'ゴEhWn!2_뱳}=_ ~ٯawofUI0-pJ\Ϫ{~!?Ὦ~+u?rpz#IpˆN!<(kPF ^|(-n} ̻҂Kwrp1/h(CtRG|eUk=r>Hг@r:-c2iR&egl#9a,]6?+/`J`H\> חrcP^8z-+SDSϡPlY&Qsǒ+Kic.UPgµ+j@ɊS.­*/П{{gk+v Q/!~%V6X DMO5 HJ7E?kIuIg@ǝN' 7Yy͛dz#~o%TЁ^ì:n1L\DŽ0f XW5J%CֹwYV`ZKN-qV ?Q"ں"6/+^Mj=f PXz ~qio:kkO#z:T&YCZ)g?%=;M8w]"X~`OpsJ^VNwPhtʍB`iߑ kH a_p+㰽kҵA]g(DP% i3~/լ5Be9j 5r`G_ 6a-k+ F_]sVlw_n0wo`{Lq٭wT=p옾 Qi$0@ڲ߃얟Kj4a>{.op=EptJVa n.RhNf;5J&0Q(pfZ9ܵ$64kN(ÎB*ˌ_wϟk㬔VEH.,G9T}HUZY` O&*l5] !/akd$Լ[8!4ar.\ j'(;.~F w}Ov})CPoI$%9l3p>(g|c:ۓӀ0HBdg{eKG̺H,WZ<3hmEm$Obz_v>"hTh ZZ8$ٱDc2^{OeITIcQ1 /}@uTĔ/^(I_T!dkNNסּfӯu $,E?+-V]2ƒ.(!_]{8(;)@eEE\A jlKe8%زpneT`?r"* ]X<H\ܓS$lbhW0U<(j`?y<8rEr{g˯TϚ!.`Am%$@w RdnSU;|{^UL_A/7^\BcK׹a7R`{x NRuN2{+A7ٙq}%Wƾv'NKwOf8}2& xu0- ze7_l*:[q~_ €GMà'G3 z!͟GJ"hɴٟk߆:j\X:%laz÷th< y8ŀ3$~9q(BmU"jW]-#5:G%ᇇ6͊asBai"':P| d5=ݾ;{ϦD4iTc5~%O-Y (7.f4;Su84_m)20T&1"̓ͪř筃 mZ:*Q0Y #Ukʧ%14XySQqYC3c,FvM-г?E0)u|-Z&z):|yoRIf"_Z{UG`h9uja؈WӄSAaү-!aF.JRGuE:Rμf}kC ׆kob`.Q> U1HcE9,B:aOhjtNd;7i+A6aOS#$, &)猽 f47mPCBzU#!$iJ$Ŗ[^B55_0Ϳ|$1/̴PW, &C̽rtAJA=抺Ror 0Cmwa Ŧ1~nKuxR1{_o/*;MdL4^sƤEeTTHg% ɦIyL7aIQs"N\3JgJ.>)9 bǤޢn'_oo{ LrbpJ\qmc;,0w@ /G-aq7R'3G%}V)6Cp>(/ eXz򽕩9%{Y3={]ox}k+hOӚy9 Q{O{G,po;\e4oF،34Vk}Se3,e %69(++Ro@*_6T|@qpһ'W;^"N_Ì /2/ͩz`›MZǹdvɌFi`s-żef$<KeחPcb -*DK-L_t9&oW>AbDX<aڧWdcKj )^n{*!)gH1ݯ{mRL3?bF v_(mȊ͗bm\ڂ <gL1։H30^6GK{"ӀodPy~1Mj$x(7X7mi\é2d(WƀٚF?鬧g荃.hC|&?8c᝹~wBZ*O\CƈNĊ;.χ[zWa"@4vU^]"EjRK>`jz:&ڌ9ڿ,RaˮK"J!Zǿo*(t2MefFʑ<,n)&H֋r &c #Tb|=l(@u);gD_>4M @A6x[Of?s}Qjev3 2KTpIEPC._W>^(rj|6T,ڒu#¢>Ε^T1|v8`)@isnnd YH9};Hh?W"6w4x z}/vuO@ ]ֈm0Kv]p;Ƙ`}_rCc2&\Q2Sn#C%k}p %6][pHD@U GL Aw&{_$c]?b2ӘA"NB>޹3}OwOQ=}<(t WbӍw d"_uq>L(D`&ZraTLQ@V\ZOK̜p ;޽[BX/0:+)jG xH$<OfYzWq/C=+@o"ql,lQOU}rM-uZТNaҦvoL}lL( ϫTA<j=&Nk\\G :V P)R3ʞ YuFh&S'3K'mrзÜ G,Bw .mnSb@w8z7)tFr(~دbn:^#H +n^F˘rTd+gI~ɀG&IIak38E7 D. u((^AXN:3ss_pZ\cFjd!+L!Ri5?f Wg62*$v&L5!L[y>pA37?{tsz/vW 8T&Ȋ䏾=Iˡ7\E<9wmTO7X|HԲ@mU5~'o'<;;;:;"wS=.б{튡%@nލ|l(DwL$(>qZdP)x̋/N 1ZT=%U.gˋR&CM\-F:0N|r a؟!Wlf&dH?~6fVs9r@`-0hϕd3ͪ%^e :3`¤Z:Xq*tv!1u-cʛi~񁔋boޞ-XLEbF~}*,}l[s91TӐ^Pq.+dH{PT1ه #g[\QfWh誼~%]ُ&=yH.1`̹`љ-Ϫ͝F}>vM]/I3/rjl=nϐ h{tZ*+s6{j_.M7gl/TK"Kyk }6 ­qA<~$ChBn_0git(D <U4Hޛ] wՙbԂ^D4_ӄ?E鳦[qauWQ jMA>8PŒN$j'%ӛN1뀙ҵn*ke"hۯ}?"_Lk-'q55u[dfg:C$|\J4d.޸.ӗ%d"`#gnj} 0G4{1y]] Q6(!;S-3ol@J(L jf+|c/;!ѼFt9әk魑^<\J-w!'wZJŎMz;F\M Z,r~ٴk#OP&WwN`U>XlʱC:w2ɭkI\ £OBk.A(h?hYƳ>}f/;0Di{px57ts,Ie>+yzI ׊y#mm#lӟ$_piIpyn BwT* ?-lk9ͼ nq@Em~6T4KdMPK1PKkVres/mipmap/icon_background.png sb``p 9 $wXH1f Utq ɸ!#whW\^ PaQ[xoeSBPKiZjPKkVres/mipmap/icon_foreground.pngT{w4\ID/eDAND{]Gm QG F/[o019g}x&OL XQAF } MS V(S,ES- nFβSR)ڕV|&g6݀ŴNZپ*^m<=U ѡ2b_+Qӗw-,+N%' Xvfq?eRD㓳uǽbPKḰۡ۬a,r^i\ځE)cNlhGkrJ/3Z*m_7kV#UpG8(CR cί{vtч~Uis13 ~7j~:WLulϱ)yک@ gRmK ~r_d@_,PQ&7e[> EX '@ wC%/ E=G SüVރ;9 Jռ/SnG͏p#z3hm~Mi''N*ˬ 4xr#UV9sSvWEZ^ JüPs!{DE Sesy~^Tl6QtJ`m%3G) MK") iC ,x)}c oWiD԰𽾵L_Eu`.l7(4xɁNk=-C ;^tF[(@^Jhy!T?f|/CET9AK-wSʽb(ž9/.2to([LK]jz3G>e 1<̼dىpǞfW1M >|g؎!' C숫bj 4 gn+Gctc5Cr43,w:+zȌu(5dhfzna&/mF>ѽ'.`/ihPZx~KДASpVfZ`Ű:'GA~7>s'D_kWӌQF0f==Cs|2EK|M2Ԯmwoay26?^tO慺ӥt}8\;8;qK?DXՊ3; e8~' Ufo4YH~"rz^-]9o3L++GD/M4O QO/e<+ɋTDCVfPV/'6ܽCii^*_VcrfT|25(Fd,U?FO4}?_~\$վz9/ޕ4i-XkF,&F"4 #N+:K :؄Z;{qU-emP,a.zxЦWPD0`d==8ʪz҃3lM`E C4@DFeoWH[#ŧZa<9PC~"Qtz.'\F!6ljfO z)KG_ղta}W #o008Rmix}kzokhPWjO̞t<[{`}h,,tmCA .[ەQ:\KKyHd$m!(9R+9S;J6 PJmnR35Ixim;Ç*-Z~5_kMfseP2?KK jP0M;Lm㛷LZu"ޕU2: +C4ͩ82 c,t5Z28IiiG͐5Z^[Ce#+GiW[+4ʮ?e2,+|.*de[Z2A,1^:@^_V%-UHJQtGʻ;-xY-~-gg.6ÞI%jF]]6 Gv6pgŻĜƪD8͹Vx Ʉ].C'OfbRR2a7EFmQ6! {޶om -x^xc}% J'RA>qtu;yeo1k #ҵ4Z vkF7Ȭ} %we,PTG̷>n _5g@T&),fz&DU:D+׬Awc5b{F]XDp],xPbd+^|D7#y|0^E-a2Q4?J,h}$= D.4,NoHXS;qŏ 23a츲!.IKrYgiMtK_q1V #g>=3??~=]e->2&`X)a4]^ɚ%R|lO隃^/ԥ^ _!'s* * ٖNB r٥~xS|17u>󇇕[<>ّ6$6ei1`^9bKaVem6aLb].iqf~gcvPĕD ??nA`v-] x9KڌBOHZn1oUE-9i/~JۯTZ6ɶ<`,\T-ЬV+M`ޥe-[O!9/.GU]:!a N 2HgVXz$@'闣53;kȝ 7ʞQXD+Xj_uCq"덽n8Lihd?KOOn|5No+V D(mAI6.؟fuQV6X oWt[Բqj2Pp (*[bE4LBɩ]QOFlZ EӻGyˋ\zxb# \]6Q3aCI ne33TP~X<Ē2{}됵!:RYTJ.WDϔg1:B>둜2p=c;ǨAM;6jݍudy!!b!g=a/T0uz.Oy汎TQv Q5l##gQkkuX9m F@ r{7R#NNcƹ| +|*,>@Qj,}u@//'lW]\(^Mۑ;AyDtڧ)?`JY!oZ'.\%n8μluY9v(~5,5-{HQLvt7[~ [t#(.:Av'W,\N46)Q~d(4rweT1!?$Ecq?&uK3BX}NLF}5si6+dj =BsCw >rTlAH:ZIi]V;TվTs?/V2 &gk; $LyFPuO5 MG(&: R(H&N$aczȪ1#?˚fpWv?oTz>U,Zl ĉOiϝbe(,1_N0{RL7CW ܯqt:>EU8 V%&7SE_u^07f:4tuܤ~H|B+L]$ $>ܪRtm5A/ƢYזl@0aÊ~ysA SzۚűnqfaqL0#1A۹ժ#IC,&zk7#-#@\ JAn޺Eku9|Ö!a~R9\DRΙwUep@r5E+OfUNpbfg5цCLK##)M6/3^.ilK"U֞^d-,l#7I^;6a.]/98 8z)JM*ߙ0x$W]ԒCbaE§pTj=a6Ga+07 y\8gwfO¾`tƦ4fr45`tam#ߓC7ro =GZb}pԻ-)TڒuLR8-Sq~{YRqkXG!<ԤЄw dgC+SwwVkF1N>$Q[$Omisfn[{ CiF\vr$š.%K3:;Pc|'~4dR<;Ax?~"qdr)C/CdePay⮸G.S?Ijˎݕ('b_`4ze^($=eRA-!c VdW4|b;z;,UL?1XGP j~wPULt銚Qu< Ğ|ĖK.4dd;3:AK!^+J`i"~ut%(Ҩ(k//qbm}N:4Zx3,BX:^p]\vM[{5 o_!8Dt>Hࣕ,w.@SWD>RvC> K2=O8s0flsڋTfBHyHtpJCjUd_YNonC`Q5,H"%Kjk_鑶;IV[ T,J_dAM_ymL,8`lBWC,4;PO5sMׁQ8z޳Y;. ?"׿sJ) 5Ar1qF6BҵcvFl -4moY`ͼP9Ñ67ηg%ڏN;++'ӹ1cJL"Th})ħW$vDѺƾpcST<9V1 N-a`㦫!b#0,w#`aIF(C Jw'"U#TtX +]=Sj{RdoD5^:#R$Iv~aJp3#%hX~Ŀ<2v@{2G2Gz[(D Vڤ{"KE-WoO[3_$ XA \c^3`F "4louHoxnn¸+^_Or]Ln4ȴbo3Ɓ곐[(gݬYY|r4,'h#ckOhͻEʗ P5\)[}̛5mBC_Rf.2 {OVZFd&z4齿G^ :Ss×'-Kt`tc:4^՝m 9P<;2e!wR(uP}m)u;tz_2nUKG}PDm63Y<@_p`G&NviJS<*TU1LW4J^kگu'^8\g(asxj~UQߍxyH~L`N>|.2|( MZdBz2%Gx 3,lB)he9~qF saYdtTPfo] y{JoYGK҃'j`^ fn@d䎮^*(wdϞdv5~9ZrmGϩgkAflk*T~t4Dx6܇ t@ӂJP׍ 'n0A7e(-F|_\FOr<~֟a6%ѧEn9tA# vxB%{#bnka$LQްI$B8tgGd Cʼ #7/elqDTcDF ZGti/ r5Z֙sIU5̑5S;)r^~u?{dls5+2Xlq T!^\ XQ&y** xΜm('Y(&c8"WIG/(}-Y%%^Jm I{DɆr:2]BG@WU4&P?8Ȳ퐒dٗF߫qNI#Aܢ6"~`m %!)buAۆyXI Iy;_,R&fϊu}+:1>Q 2uy_Ep?6ߤɉ7,hŗ1d㇗ }~6 'C-7SS'ݢi|w䍳QnFnsdEOl]qg1*1 @NZ}Fë,yh%WC#p΄R:fg#)Y[BsL!#Cқ.m!]·B@င Y$ti{]4+3}px 7*[ԐV>G @ᐁZ%P}c'p|EuBa]}$zoZ:;hhܨ=W啥|]mPջjYg*8W\]n| Lfp ˩eܤmij9/LjFWx?<Z:h99)7+74(XSFaSgys޶~ZF\vy-X҂ jrGSX6zT͊r Z#A+Ƹc>םKܬJz=dn{6&[᯻d:͵׹Ou}Z)ՆZ^ur:hƼfMuYwfwQ)Ǩ RTOWD~y'ɨJvdb8 9O@tQ:-M6ĀO0oj1*Q/s|W_WQŽCRB.* ҷ]=w +DkEz WUP0~bv͍o])YJߘSKn3 6oڶ[A*'VH 6]l,6PRkycN`isqĭrlu+IvmpJ2u'Y16n1byXx3T0WV.bX$;+b<èɞ7Q<u]a~ijnDD!Es|;R '6F+nM! qƉiPƺy^ƣb|ڦ~m\O {xblOj9ҧ8j*$8jgv5amjlTpAM":Kt76l淈Bmls'i,(خ&O;t_<4yr +{:^uؒ ߕA> D!Z!J|G `vhn&ʦ\ w$U7]|w4>LR:64%?R,];Rnk0ic1F;9 /m(7 h]˼:i5by1~ѝMH0L:,&D(]MRK*i$k~ve*dLiVSCgp!-HQ^P-!w6Q㟿KmHKmv$MDoMVeEMoKgGƗ"aCl)3Ƥ 4fFQ^Xh=-JeWMWlq\t,.iu5<ݞ,))u.J {0ѝ?)2^afyjczBWnYKɔG~4Bpk`U蚷lp_ zĂViqQ sܹ iyLQ,!'H [fʡŦGy?!b|<1D0x]p #xIZ*nmv5AAgtDf_L:Kѫ._gi*H|yb{Yz8= x9u;dtZ[cI]\6 D3tZ5e+`V7gïX\y p9}&?ZVl;.qpZt^\%btz!XsdJ"7;-z s9w:`&@H@Z'Eq|n{>{cd2${#(5D4Y cܱcw*;nP_\ E JO.F򝇅~4 0IIׯq׸e\\Wa1&A\drbیT΍ve8D?2h_KX9 ͮ:^9ŵ_ؙ5;m ͬZ6yE=xCa<;cdn&]3ACZ٤z_cP;"C ˨خR3uF:Øq$?VαyS/?;w+g GK[Ȱ7qFMGEW\Ay YNٓCV Ru?t%'SH0 Ŷ\nn$o% +!c,ūab@ eGojqě|%+L~I}`DP_7x\_m~f < {5#j逫Gq36R2|]pD00%.7I]k0dpvo_wB,8:zNs&лNV;w[^LIDEȏEW\,z}VwiMtq4nLNwUӇ\M!^!wmw/RA_D.2YolwfN?}y$ztv4!ZqP iᶊ~;g^6P˿LǤ|:|qLnH8gi|Z cJؑl"9,[QbO+J칟QboDs`34WuqPD~;k1pIZ`{`O9F=izAK>dF.-a[J8L;`[1\֛@3Hi?7ORYŋUy`.Xx w=#[.%Jrd]Kf7R0Y=o:**Fgjfش) )qxcqZ؁?'uXɨu<|FOǍ.:H[ԍ{ekk_L?X W()iՄi(ޘr&6HgtoZq 聅O#[Ѓ"u\<:|YmE*QzK1`4`lkS$\Ǟ`nHDvm`D8@{5h/JOere*bӳ^d25(Tyk&ȡQbN/fbcGS>6Ἳߚ`?U744+P!Lf MHXms{m7źߛϤ-ȥQN3G ?} -hW3_$ 6ȸ##E/?r? 51Pcልrۙ'I+}n_V ʼWFx_szZqtNӑoӡ=%ܹ!R٥cnFt&?X"b|I=hGx( `_\m=;IGŸ$׫._lkMjPȌk;,5!`"Wm>qOLo67l L!B4ܦ-V>ikuК'ڷ9'%jL85@[ŧڊ[&V1YBC6\M87;h(gVפ_[ K.+.lQdwsڊ6|QrW(2n/sYO¯, /<1.֔jlS"Z_fz'n,IƘtLώ7<$XYQ" >$>⣮!7vwD!ނfoT$>I7 aH֤ۘv#xn?:^>J.bk{O:i;3;1D([,*EOpr, A6/(M>rwOBY!O<-}(R]zij]7 /m󬔆;mKD=oAv$r bO9#ݽ-(4X*d.Fpb.7 U]P b& \`<X>}dv9h ~̷JKX.{7jlZ5Ս f.;H"]̂i%ARQ*CS<ƾ`ἛŤJsƾ[aPp+F#: GNm7>^NPf3{0wj4T+ }buEor;I~nA%aي )|M@wSiEIt?sn?b~y|TDV]^G[E{*h+ Yo;H*hy5r8ٛhDJg;Q!J~Ϸהe2߹{zҒ 4psDs&-G:>hzo.He,&,y)oKS7<7lԕZ)kvYV]wc-AS@o53~ 9\R̶K9_ [-(p膷߷3I퇩]m+$E||xՂrYw cވBtOlT|,؎?z3PbI}GIUu2v>b|0r1/I *&Zny,уSXeW7SX˥::&kYmYRӵ 5^!X;GcDز:Zaakޝcd J._ֺ]q5b'Ms se6h$-#ۜ@u_]$GFV@En 7__O}33u-*8\ӗs9ߓge,r?wܮM!oӏ54T/48 X2񭝫z2?u.QU a@KS泇zԸV;nǾƲnB]ڎbіGʿ: +1[uzXO+E͙՘ F\ >gWA(c!A?Hc$;LDhòQAe[J9(Wǝ1 nj[JZ<1%bLVWWGsD~)mKskF(qtahQkSIIMݎth\}x؁xX94ig鶠jXEH3+1Ɨ5wvvyQ ߟE3gè^g˃!e)R48 9"l5]PK.үHHlqa01Dάߋgy,A0t>vlA^6Y!~@_aY.¢-?a_Yk\jYiqV.DQW_$O$v½qR-HW`OY9գkB9J4/(pO}2oQհA&9CZL9ޣ2 m  rWIZT@kU Z<އ8XKN,A"B!fX+WtLyo%\jU WmOvRT$V{jثv͠UĬM՞TkUQTE kǹ^lzOԞo̙JѮf4+9.?f07~ ;v>yp%wbs. MЭn_p*dpA` cSކ{ll1DOY1fbiǷnLˆs~w'4:,a=9pb k5&kfvMg\1B/I%#{"\yaC! JdG 3m2ŅF!ll%t;Ca~?o}Sv$a3Rpbdx`QisoTmp%xDVV IA@zq`A"m4>!>66ʪ:E \kMjoɨ] D:E3Q5ӈ1˜[9ױYEe%ʪ3u!˄~_Q!:y;/D-Z)BV 5Zd PMI'~Ӂ-ym3w qPf5t̜]`K BΤ򉻿һ ӉzH0SSg5)7F?x)ծ[1\͘& 3X߈&@ P~SE䓟%CԱ=3{(f.ï2f\_?w6&ע>vקMdyc=ʉ1ګ.~Ah-g IQj"x8W}6OrK^B/t#}:e-4+)EJy2}ChQs`srR"W&>gڄi.DBvݍ#QV&8~0tJh`56jY3LQ0{8ӗh+v[` 8mz~=9U}HƤ0ǡ {xtP-Jl\_&6ά"%Q=HUCDa2/.`|ThM=dc)h;x|U;)yc㏘QpDIv!ަWż:f5_ ʡ fE 4ls,|7(d#/pd+(:qR.t=|Bđ&y_>x oI!U9kv!cy<8VL  L#*#jrKH/:n|b]~f {lN`,g?eu[5:}!G9)4F9e 7] >NϭJET'w[DuՉ`Nkd@Qf1ź1@QqZ&-b0'pmsUN&A٢g! # pXy!C/vz)(ٗWc NjmqG%:k46GΎYqeƒ3v_Z\ul $7J GմޜeO58P#?sn˞,șǬcP=c(BƬ^p2\bG5.N*I1s(ŤzIg]եmcb<q> VR]sO~ tԑR5ѺCX:z2'WXILoeޑu>b?3EVVe:r="ߔwht@"k~WzCB^\mg~6,@;1=Y9B$gm"Z- 3WĨP7l|'>{ݨ^mշ$~詾n^]O`0 v^'yTn>Ia9I7|`V8Hpb@EP83׊&6/Lf c;.-?Sz^ w;Fp3>+'CB*@BL&=ݼ_Ҵ|R;!]߲f(H*xnZ t\y4ZZ򸜹fiQ?f2Jug_Xi.S.WW5-[vhA$N"!2Zޠ!VPB8 U~mnq ;KWY$1=, Lj:KnX>mɯhuv,ށ*-[ ?XwɾK-T?;V+1{SsWY$'C$pX',V |]&quༀR <6<xqcGN}+B3(d"]T 7uԷ&"k$vP5H~4ͳbjѫͽ}WU@e? QO9ЛǠ%b|u4-DWi xS,{@TN =8eT-hˆ0߰Pz=>@;30qi}jPFRf[&ɏK&Wh$.8 q jp{v,fyy裤\QJ(K|<}c~1wm>_^݉$RmEj|'ϐG3OtQ+P2,=^E;ή+-X?ttqѕ`k(C&L+=ۨ?H?a3ˣzQzA"QVbmgtMJR|@9Q,, .k.@_`M畄 F__b!9kjo ~Sdzvˮ9wȓpZƭBoUx \Ҋg1J_5xj&̪z.w#fȿ%yQ%yam"rJBVUMG))m&#WaѺ,uRU j >T/gܭ5q]˟z7ߘUǸl]ܠ=0WM姯cF!PK1BOZ[PKkVresources.arsc} TuhE,-QB ݀[lda ]z]6UjhQ4ز'DǓ(D1`c!Grp L$9ǞWڋj)|]uS+'#FGKCT`. [ODOcP -߁K&f ~ (Vipm&Z 1Dqe,fmV#z1h?G& ll#:4$NE}g @d=9u 0 ,3v瀶iDa=ӉhA$:0{&v `EѧKi&m [Yn !M%` B4 p8 LC XAp ЭD>`%LC,6A;|o <\·O |06..Ii:s}! $c`hMs(I> I}dq2(J'ep=P:4uBC>(ߢ(PQG {> BNAڬi&,U T>CeEJWcPJiĤݪ7Iek_)fXrEm%;:)| ﶵ,Eݒ,sʾnsHeqуS"55C}**܀?W]m"%-(إzdlmza%|Trc [Wv˻d9ӑeӶlN,*9^D̑E$voUn))V`݄YdJlU222svqGʹm<bIǞzi%&ϝR 95XXpFݥ-%#IW3ţjr$)|'(Sf{&Ƨ֖ml򩕘Wn'Zhr֕3VƊSm rzCY=|j]yآmCJݪ2ZYY7TbsDFbEz,[׈E~*'շ~Y]9aՓ~Vr"jZFdߚ%ې-W%/i_iisB_SO[*uuZd$UC+,]室˝aLQ3rJثWޏITiQEwqYo"xb{sZ)l]:j& K{ LoknPD~SikFLU1WJի_vYZfIY`Ze8~bWiK Hub_mgyPiPtTk}wWHb}+EZWhZtK޺݅|9KiY"N]2t7uaL90wRr(t eh;7oKEiyK"/SrS͖DaRGΖkYFGY7'dV#_x13J%#HZxUr Ge۟˫QB>TQeuvUָT$_ȷY*FY6*^6ƕJu_21:YzLB<2]YY3ߺR<ꜙG^>tYe#]Nme-f]% wc^X8lLfa+%9,Tja['唚˪^)] kZ;}t>}ռl=/܍Hˑs1h}}(թs:oPe\N|{y,w+yi3G;e_yg=k~^} DV)G^ʳE2X|录NmYz-hho]B%kj=dlh^6Yt[1}~/Prlo>Pry_SYf/VR+_pYݣ|Nqye"o^X\]T}ߥ$/|Xץ-[/Ҏh,Jpʊve"񳷅r#=^Nsۯan=+r@b:ʓэgr+#wGӕcLJtG}䳧]\8Ojǩ'^pG9zG_νtή%/\9v<%Ff'2[~SΝj9.IeϜ7w1%Z<2ҜZ5}4'^??xKٖSZ:AO{Ům=~㔯zsߜgzpGN>??zfK_WEGD%?knyB}g-,e}gWf+o|ґ7_с?Fݹ{n?'k*&bȜsj9.pݵS[#"woΐ`vkORz Ef> 3iWagG[zXv5ggtz\~}LaW^\u8 gٺq<[d8a=ZK^89#ř'~ӳy#FO5VFUhA5z/wxxg„4ɮ7&)r3[K#WYgsH+_$ڋ]PW+W'4~_$i>|'h'~<ó&mfAjUu{[H ?@GdM@/ SwwiaxL_ poMFV`0<_`R{gLwa[Ƶ>yꯀo`$6`8N-qV lb~Y$mS. ߁֩h 5/aG̨3?n+a.(J'%X㛙I!˛gZV47ET.d56ŢMPLJYDk̄ӽiL+0YfM51VΓ4Mi[)=b$BE'iN XbYAs7|ј TqPX832oA{P<6Fj[& ĐBof [z@,7,oʲXz4iZ~bNyHUr.frg \S޺S6[M7IIe%ba|&f"G ~vY?o^ ewxcQ=f|qM!t\(PغlGOZF҅x4-<l+ȏ!cHV,c H$0 Eܼܒ#;΂#0ORѠSq07R^<9#:x|}\ڔ8r|uxZq0!1h)~LS XH3gʌ'd ԩzTpkj9]$ˌaΤGkf>k2Ct!8j4jnNB^r>':7%0va5#UPs;wCQDK(T b"h% Sb+XۋX YS=?aoU;nU4qN0] `ges)2d=jo!YpC"^~M˷OٳnaҺ7RIS\ގoUr]/NMf"cw=RM,(ɫ l;O6ikcvO#&:MTގ煮 HPOXq3v XIg#v10ZVnat$sI,y g2gP<^ױ[XglD1a{d)X4RiլY` wC~ G# Y"Jbl&Jئ&V!@&@w.Űt-)O $z`qPkΜt^b ,.󥋩oX!LL Gك!34)&t;}Ɓsf)P=".so'4TA(= I2ws ikg ٧9Nb^453 w(jt(ot3wn"qs(:i?Ţ1e1hV-|]DP۞8N-(;ML~{32(cvKXb}pSzFV*Č G{x%حwXLZ9QK/T\5Jp,(!NFD̈OfH{g(CGb|] /:BVB~op `+cг#;%G^ΑW/yc +y <.9FSwzOFwK_r 4@ބ<:M&k5?:Z%X|+ѱxzC97jLl?uFnAG}CIQJAX,Vuvlk47|[l>C+?6pJ{~Q79g%~}N~oڟʳ-16'uN͞yo|OM۴:ĎRUOd4RUXgtx+Z!WW:PWr/oupp#| .e~sg+R^)/rV4++9X.vJr~Un̽JʞE?']KK9Z&\ʩ穘/-ɾw~c-Mof";[kZCofߝ}wi--hcr8>p=Do[8}`%[q`p8N;|}Q+M IpxOX lvq`p8N; K3;88' ex}m#ɚNZq^*}_ߠ5>?Cߤh|Ʒh|#T4[??qwhxjx5>?k=ok߫}?'4;RQ5)ZOi3W4{Z㿯@45EÝk's6εq'?n|t^Q`:~M؆??dRnџu.pYԵK沮X:a.pY9o^|SuOycj5k5[yO!zͼgk&lOގvs8.27G !+y+ϡEg%S9{>}{H>\>cMG5}[>PI쫧 \lGDxA}~^3Q>޹ч<{^|]U`iHw%/ɟ'r=z 1 ur_ rYɼEG ᣅ$\ r/^>V7O["M J'˽#:%\p·wkr{U4,\UYr {Mpgr+'pE}O GokB^K9r(}ZA A5>A0c{2Ƕ\pǶ\pǶ\pǶÝ-/ܱ-Oܱ-?ܱ-?ܱ-Sܱqk*X>cK}BTvTv96ǯC9VfH]-hK LmwJe?Sm{F9e~"6[5hs~6j|㻷2GjoVb5JRTBזw/\rԠvAOVj.k噇w^;Qrl԰b=Y#ew5b])2}`k|㿿BTvTNjA^XgKA}2}A-V `_佶vReC{g٬摴;?A5fs54y']^mXe6q>;)}vRGqUg'}g'I줼>;鼧<;)N;줼_>;)ϸN.줼>;)N+|>;)7N>ApcsT*}}*jG5@y{];QrHTfH]~wNW>8\j_ー }Pm۝R^=A^ǫX\ `a=3Q첮]`;%{Wl$kbzkb;P#ew5Ʒ\(| y|/C5yסͦU6WQ#ew5Ʒ\-A}p4Եc?.9ﵩ m)ro5c={:`e6woZ2}U{>x1^ն9*]Cן;C#5h_S{6~lF׬lK\6?5_{=摲{Qyk~>*]^Vol6m摴;_.j_Ľ  dA'""kC֖ʍoIlリ*Z<2nif6%p⼗粼ͮV')ps"uߙt^onmnDž\~sǺq빛0*fdmtcj/!v']!ߒ;8=Ҿ.#Ş7ۓ;b_|_"3s_s\2CF_NHMMfy"os?ߵSvTNu)xG^()Lb]66}rl< armN/ Je wSkQxac,0!E3 -k g)d `z{ ^}Lo|{6۝;k|ɻw|2z'ϦmyfzNbU ayoJ,{fGN H26VNW[gߧ'mϲ~ݸ%n˛ >~lvZpRdRGϦM*&mebò Խ[~Y:L>_ۚ/hk v,H5\i߬tή|StqҥPKkV]9OMETA-INF/MANIFEST.MF}Mo0ỉ"0&;(X]*VD3˒eq@JvXdusA^dZ19-*뵧>FjZwj]rFBMȗTFݺ}ZE{`ک〷])F,3 twzdͱPb0QHN(=4>7KI;GtELj_hkhZ{%X;G{Y7"iE̋Q:؃ˎq".YK5`nsĖ攳c-HN/q{6d>}a9!μܷ/p+&d XK q~@,( $$b%Dh}nE U00ؠ k0  *H  0%10U F-Droid10Umonolith0  230320110027Z20500805110027Z0%10U F-Droid10Umonolith0"0  *H 0 + ?5zQpl1Xc`x)LŐuϰ3q*{_KHvpn|JP.?6`ϛ@'(Q*ץ\޳a$M ّY1. ٿv vSJ CEҀ4o$R{.b,G-h_ _k/+.C 9̸djq7S5`ӊ!92s f6;+"X9 Js8!00U#yA/G0  *H  ivJInE:Mqۉop~p,ο: AE,@.Ц s.G4 ui,@יs&_HgMt͸@&+' jcݞх_&̝E'_xXnnbg{o2甸yDr8!TQbV-*Ձ%NJn9)gVmfP<ˢZReWC}?qU!   s8{ h-\(Vo֞`R;l_+CV}a8+,ů6Qі&$(`$?/HGx'SKF'hoBm~B{yh֦Wu%0[b5 j$Zo(RжXuN&0"0  *H 0 + ?5zQpl1Xc`x)LŐuϰ3q*{_KHvpn|JP.?6`ϛ@'(Q*ץ\޳a$M ّY1. ٿv vSJ CEҀ4o$R{.b,G-h_ _k/+.C 9̸djq7S5`ӊ!92s f6;+"X9 Js8hS~8,( $$b%Dh}nE U00ؠ k0  *H  0%10U F-Droid10Umonolith0  230320110027Z20500805110027Z0%10U F-Droid10Umonolith0"0  *H 0 + ?5zQpl1Xc`x)LŐuϰ3q*{_KHvpn|JP.?6`ϛ@'(Q*ץ\޳a$M ّY1. ٿv vSJ CEҀ4o$R{.b,G-h_ _k/+.C 9̸djq7S5`ӊ!92s f6;+"X9 Js8!00U#yA/G0  *H  ivJInE:Mqۉop~p,ο: AE,@.Ц s.G4 ui,@יs&_HgMt͸@&+' jcݞх_&̝E'_xXnnbg{o2甸yDr8!TQbV-*Ձ%NJn9)gVmfP<ˢZReWC}?qU! ڎ$k,lZuۍI* w0H{I@x#\1]rX'$l`tI(9Q)ce@huTP(&0"0  *H 0 + ?5zQpl1Xc`x)LŐuϰ3q*{_KHvpn|JP.?6`ϛ@'(Q*ץ\޳a$M ّY1. ٿv vSJ CEҀ4o$R{.b,G-h_ _k/+.C 9̸djq7S5`ӊ!92s f6;+"X9 Js8werBAPK Sig Block 42PKkVz^dAndroidManifest.xmlPKkV1res/mipmap/icon.pngPKkViZj!res/mipmap/icon_background.pngPKkV1BOZ["res/mipmap/icon_foreground.pngPKkVis|{!}resources.arscPKkV6όpԞMETA-INF/FCAA5F85.SFPKkVb#META-INF/FCAA5F85.RSAPKkV]9OMETA-INF/MANIFEST.MFPK././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/publish.TestCase0000755000175000017500000004135514620351225017262 0ustar00hanshans#!/usr/bin/env python3 # # command which created the keystore used in this test case: # # $ for ALIAS in repokey a163ec9b d2d51ff2 dc3b169e 78688a0f; \ # do keytool -genkey -keystore dummy-keystore.jks \ # -alias $ALIAS -keyalg 'RSA' -keysize '2048' \ # -validity '10000' -storepass 123456 -storetype jks \ # -keypass 123456 -dname 'CN=test, OU=F-Droid'; done # import inspect import json import logging import os import shutil import sys import unittest import tempfile import textwrap from unittest import mock localmodule = os.path.realpath( os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') ) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) from fdroidserver import publish from fdroidserver import common from fdroidserver import metadata from fdroidserver import signatures from fdroidserver.exception import FDroidException from testcommon import mkdtemp, parse_args_for_test class PublishTest(unittest.TestCase): '''fdroidserver/publish.py''' def setUp(self): logging.basicConfig(level=logging.DEBUG) self.basedir = os.path.join(localmodule, 'tests') os.chdir(self.basedir) self._td = mkdtemp() self.testdir = self._td.name def tearDown(self): self._td.cleanup() os.chdir(self.basedir) def test_key_alias(self): publish.config = {} self.assertEqual('a163ec9b', publish.key_alias('com.example.app')) self.assertEqual('d2d51ff2', publish.key_alias('com.example.anotherapp')) self.assertEqual('dc3b169e', publish.key_alias('org.test.testy')) self.assertEqual('78688a0f', publish.key_alias('org.org.org')) self.assertEqual('ee8807d2', publish.key_alias("org.schabi.newpipe")) self.assertEqual('b53c7e11', publish.key_alias("de.grobox.liberario")) publish.config = { 'keyaliases': {'yep.app': '@org.org.org', 'com.example.app': '1a2b3c4d'} } self.assertEqual('78688a0f', publish.key_alias('yep.app')) self.assertEqual('1a2b3c4d', publish.key_alias('com.example.app')) def test_read_fingerprints_from_keystore(self): common.config = {} common.fill_config_defaults(common.config) publish.config = common.config publish.config['keystorepass'] = '123456' publish.config['keypass'] = '123456' publish.config['keystore'] = 'dummy-keystore.jks' expected = { '78688a0f': '277655a6235bc6b0ef2d824396c51ba947f5ebc738c293d887e7083ff338af82', 'd2d51ff2': 'fa3f6a017541ee7fe797be084b1bcfbf92418a7589ef1f7fdeb46741b6d2e9c3', 'dc3b169e': '6ae5355157a47ddcc3834a71f57f6fb5a8c2621c8e0dc739e9ddf59f865e497c', 'a163ec9b': 'd34f678afbaa8f2fa6cc0edd6f0c2d1d2e2e9eb08bea521b24c740806016bff4', 'repokey': 'c58460800c7b250a619c30c13b07b7359a43e5af71a4352d86c58ae18c9f6d41', } result = publish.read_fingerprints_from_keystore() self.maxDiff = None self.assertEqual(expected, result) def test_store_and_load_fdroid_signing_key_fingerprints(self): common.config = {} common.fill_config_defaults(common.config) publish.config = common.config publish.config['keystorepass'] = '123456' publish.config['keypass'] = '123456' publish.config['keystore'] = os.path.join(self.basedir, 'dummy-keystore.jks') publish.config['repo_keyalias'] = 'repokey' appids = [ 'com.example.app', 'net.unavailable', 'org.test.testy', 'com.example.anotherapp', 'org.org.org', ] os.chdir(self.testdir) with open('config.py', 'w') as f: pass publish.store_stats_fdroid_signing_key_fingerprints(appids, indent=2) self.maxDiff = None expected = { "com.example.anotherapp": { "signer": "fa3f6a017541ee7fe797be084b1bcfbf92418a7589ef1f7fdeb46741b6d2e9c3" }, "com.example.app": { "signer": "d34f678afbaa8f2fa6cc0edd6f0c2d1d2e2e9eb08bea521b24c740806016bff4" }, "org.org.org": { "signer": "277655a6235bc6b0ef2d824396c51ba947f5ebc738c293d887e7083ff338af82" }, "org.test.testy": { "signer": "6ae5355157a47ddcc3834a71f57f6fb5a8c2621c8e0dc739e9ddf59f865e497c" }, } self.assertEqual(expected, common.load_stats_fdroid_signing_key_fingerprints()) with open('config.py', 'r') as f: self.assertEqual( textwrap.dedent( '''\ repo_key_sha256 = "c58460800c7b250a619c30c13b07b7359a43e5af71a4352d86c58ae18c9f6d41" ''' ), f.read(), ) def test_store_and_load_fdroid_signing_key_fingerprints_with_missmatch(self): common.config = {} common.fill_config_defaults(common.config) publish.config = common.config publish.config['keystorepass'] = '123456' publish.config['keypass'] = '123456' publish.config['keystore'] = os.path.join(self.basedir, 'dummy-keystore.jks') publish.config['repo_keyalias'] = 'repokey' publish.config['repo_key_sha256'] = 'bad bad bad bad bad bad bad bad bad bad bad bad' os.chdir(self.testdir) publish.store_stats_fdroid_signing_key_fingerprints({}, indent=2) with self.assertRaises(FDroidException): common.load_stats_fdroid_signing_key_fingerprints() def test_reproducible_binaries_process(self): common.config = {} common.fill_config_defaults(common.config) publish.config = common.config publish.config['keystore'] = 'keystore.jks' publish.config['repo_keyalias'] = 'sova' publish.config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' publish.config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' shutil.copy('keystore.jks', self.testdir) os.mkdir(os.path.join(self.testdir, 'repo')) metadata_dir = os.path.join(self.testdir, 'metadata') os.mkdir(metadata_dir) shutil.copy(os.path.join('metadata', 'com.politedroid.yml'), metadata_dir) with open(os.path.join(metadata_dir, 'com.politedroid.yml'), 'a') as fp: fp.write('\nBinaries: https://placeholder/foo%v.apk\n') os.mkdir(os.path.join(self.testdir, 'unsigned')) shutil.copy('repo/com.politedroid_6.apk', os.path.join(self.testdir, 'unsigned')) os.mkdir(os.path.join(self.testdir, 'unsigned', 'binaries')) shutil.copy('repo/com.politedroid_6.apk', os.path.join(self.testdir, 'unsigned', 'binaries', 'com.politedroid_6.binary.apk')) os.chdir(self.testdir) with mock.patch.object(sys, 'argv', ['fdroid fakesubcommand']): publish.main() def test_check_for_key_collisions(self): from fdroidserver.metadata import App common.config = {} common.fill_config_defaults(common.config) publish.config = common.config randomappids = [ "org.fdroid.fdroid", "a.b.c", "u.v.w.x.y.z", "lpzpkgqwyevnmzvrlaazhgardbyiyoybyicpmifkyrxkobljoz", "vuslsm.jlrevavz.qnbsenmizhur.lprwbjiujtu.ekiho", "w.g.g.w.p.v.f.v.gvhyz", "nlozuqer.ufiinmrbjqboogsjgmpfks.dywtpcpnyssjmqz", ] allapps = {} for appid in randomappids: allapps[appid] = App() allaliases = publish.check_for_key_collisions(allapps) self.assertEqual(len(randomappids), len(allaliases)) allapps = {'tof.cv.mpp': App(), 'j6mX276h': App()} self.assertEqual(publish.key_alias('tof.cv.mpp'), publish.key_alias('j6mX276h')) self.assertRaises(SystemExit, publish.check_for_key_collisions, allapps) def test_create_key_if_not_existing(self): try: import jks import jks.util except ImportError: self.skipTest("pyjks not installed") common.config = {} common.fill_config_defaults(common.config) publish.config = common.config publish.config['keystorepass'] = '123456' publish.config['keypass'] = '654321' publish.config['keystore'] = "keystore.jks" publish.config['keydname'] = 'CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=California, C=US' os.chdir(self.testdir) keystore = jks.KeyStore.new("jks", []) keystore.save(publish.config['keystore'], publish.config['keystorepass']) self.assertTrue(publish.create_key_if_not_existing("newalias")) # The second time we try that, a new key should not be created self.assertFalse(publish.create_key_if_not_existing("newalias")) self.assertTrue(publish.create_key_if_not_existing("anotheralias")) keystore = jks.KeyStore.load(publish.config['keystore'], publish.config['keystorepass']) self.assertCountEqual(keystore.private_keys, ["newalias", "anotheralias"]) for alias, pk in keystore.private_keys.items(): self.assertFalse(pk.is_decrypted()) pk.decrypt(publish.config['keypass']) self.assertTrue(pk.is_decrypted()) self.assertEqual(jks.util.RSA_ENCRYPTION_OID, pk.algorithm_oid) def test_status_update_json(self): common.config = {} publish.config = {} with tempfile.TemporaryDirectory() as tmpdir: os.chdir(tmpdir) with mock.patch('sys.argv', ['fdroid publish', '']): publish.status_update_json([], []) with open('repo/status/publish.json') as fp: data = json.load(fp) self.assertTrue('apksigner' in data) publish.config = { 'apksigner': 'apksigner', } publish.status_update_json([], []) with open('repo/status/publish.json') as fp: data = json.load(fp) self.assertEqual(shutil.which(publish.config['apksigner']), data['apksigner']) publish.config = {} common.fill_config_defaults(publish.config) publish.status_update_json([], []) with open('repo/status/publish.json') as fp: data = json.load(fp) self.assertEqual(publish.config.get('apksigner'), data['apksigner']) self.assertEqual(publish.config['jarsigner'], data['jarsigner']) self.assertEqual(publish.config['keytool'], data['keytool']) def test_sign_then_implant_signature(self): class Options: verbose = False os.chdir(self.testdir) common.options = Options config = common.read_config() if 'apksigner' not in config: self.skipTest('SKIPPING test_sign_then_implant_signature, apksigner not installed!') config['repo_keyalias'] = 'sova' config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' shutil.copy(os.path.join(self.basedir, 'keystore.jks'), self.testdir) config['keystore'] = 'keystore.jks' config['keydname'] = 'CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=California, C=US' publish.config = config common.config = config app = metadata.App() app.id = 'org.fdroid.ci' versionCode = 1 build = metadata.Build( { 'versionCode': versionCode, 'versionName': '1.0', } ) app.Builds = [build] os.mkdir('metadata') metadata.write_metadata(os.path.join('metadata', '%s.yml' % app.id), app) os.mkdir('unsigned') testapk = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk') unsigned = os.path.join('unsigned', common.get_release_filename(app, build)) signed = os.path.join('repo', common.get_release_filename(app, build)) shutil.copy(testapk, unsigned) # sign the unsigned APK self.assertTrue(os.path.exists(unsigned)) self.assertFalse(os.path.exists(signed)) with mock.patch('sys.argv', ['fdroid publish', '%s:%d' % (app.id, versionCode)]): publish.main() self.assertFalse(os.path.exists(unsigned)) self.assertTrue(os.path.exists(signed)) with mock.patch('sys.argv', ['fdroid signatures', signed]): signatures.main() self.assertTrue( os.path.exists( os.path.join('metadata', 'org.fdroid.ci', 'signatures', '1', 'MANIFEST.MF') ) ) os.remove(signed) # implant the signature into the unsigned APK shutil.copy(testapk, unsigned) self.assertTrue(os.path.exists(unsigned)) self.assertFalse(os.path.exists(signed)) with mock.patch('sys.argv', ['fdroid publish', '%s:%d' % (app.id, versionCode)]): publish.main() self.assertFalse(os.path.exists(unsigned)) self.assertTrue(os.path.exists(signed)) def test_exit_on_error(self): """Exits properly on errors, with and without --error-on-failed. `fdroid publish` runs on the signing server and does large batches. In that case, it shouldn't exit after a single failure since it should try to complete the whole batch. For CI and other use cases, there is --error-on-failed to force it to exit after a failure. """ class Options: error_on_failed = True verbose = False os.chdir(self.testdir) common.options = Options config = common.read_config() if 'apksigner' not in config: self.skipTest('SKIPPING test_error_on_failed, apksigner not installed!') config['repo_keyalias'] = 'sova' config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' shutil.copy(os.path.join(self.basedir, 'keystore.jks'), self.testdir) config['keystore'] = 'keystore.jks' config[ 'keydname' ] = 'CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=California, C=US' publish.config = config common.config = config app = metadata.App() app.id = 'org.fdroid.ci' versionCode = 1 build = metadata.Build( { 'versionCode': versionCode, 'versionName': '1.0', } ) app.Builds = [build] os.mkdir('metadata') metadata.write_metadata(os.path.join('metadata', '%s.yml' % app.id), app) os.mkdir('unsigned') testapk = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk') unsigned = os.path.join('unsigned', common.get_release_filename(app, build)) signed = os.path.join('repo', common.get_release_filename(app, build)) shutil.copy(testapk, unsigned) # sign the unsigned APK self.assertTrue(os.path.exists(unsigned)) self.assertFalse(os.path.exists(signed)) with mock.patch( 'sys.argv', ['fdroid publish', '%s:%d' % (app.id, versionCode)] ): publish.main() self.assertFalse(os.path.exists(unsigned)) self.assertTrue(os.path.exists(signed)) with mock.patch('sys.argv', ['fdroid signatures', signed]): signatures.main() mf = os.path.join('metadata', 'org.fdroid.ci', 'signatures', '1', 'MANIFEST.MF') self.assertTrue(os.path.exists(mf)) os.remove(signed) with open(mf, 'a') as fp: fp.write('appended to break signature') # implant the signature into the unsigned APK shutil.copy(testapk, unsigned) self.assertTrue(os.path.exists(unsigned)) self.assertFalse(os.path.exists(signed)) apk_id = '%s:%d' % (app.id, versionCode) # by default, it should complete without exiting with mock.patch('sys.argv', ['fdroid publish', apk_id]): publish.main() # --error-on-failed should make it exit with mock.patch('sys.argv', ['fdroid publish', '--error-on-failed', apk_id]): with self.assertRaises(SystemExit) as e: publish.main() self.assertEqual(e.exception.code, 1) if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) import argparse parser = argparse.ArgumentParser() parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(PublishTest)) unittest.main(failfast=False) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9243832 fdroidserver-2.3a1/tests/repo/0000755000175000017500000000000014620351546015117 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/com.example.test.helloworld_1.apk0000644000175000017500000003363414620351225023377 0ustar00hanshansPK-N_j._2META-INF/MANIFEST.MF]o@M^ARI/D袶H10Xpml&d2s>rB4 wnrNǝ"y[snM)8&,("ԑzbOhڭ ѸCQ((!K1>]$hvDf8xwwt_Vw+뢽c{%*WUN;xhnRHͭU|lҽ[vS B7 *YאI1y}&7sS1Y(,(WAig[ut43g+<Z`:X&^w7<PʭY\Y71?(Є]lM|:[b>SrwP 84|ej՚ h U)IA!zf*; SٱqCٷ,{Puǥ~Páuou-6<2W^_!!^'nM^sZoUʈO |5Hv{^7 G.C ( gs­Fs!PK_j._2PK-N[ _k`META-INF/0C9DC4B4.SF͎0#;4E? 2'NxSU,YW;zAeq\Єu+jbr %Fޥ(Z:ЏpLxp(^_4Bl()Juk>=h|Q@Y͐}&V+XR5dnln/ חq±Pp|QJkP!=O2) w+jA)t;P'xRp2J]>)Z\` :4(bquO'[.䚮|?ݮWT8cnd`A&wҗq^I:?oE דKlSPK[ _k`PK-N[-wMETA-INF/0C9DC4B4.RSA3hb)fjhδ%Š%ѐۀUIqAK&Mg03121<r6ajQ60ccefwu)L1*0 eeȉZXZDCĨl9#+s#?PaFg߅wK~׋H[&mUSy$Wwf}f'Uąe˓'::W٩G:-QbjI3gٱ.)|l|nyjuWlyͣP)=ҿX|/i('_D]v.QleE6 ZgumWg2z &J}ߓrZ'h=-sWoLfx<{1invĽ  d'""r#6 _>w\'Qh1 ;_57nN2[[)=_]&ޣ}>\=;ɝl_k;u*2DZ#vbRg=}".wSnW ?=f^]JZ,91hZLe̹\͚^lΥ?+H[~9LB%Ǟ4͖g5-'y46&.-r>OZYP647elaWۓ4Nq9ppWq|p#O(ݵJfWObj{G꫆Ӕձ7AFWяYl'8$\Ӄ\Oվ5M<곛X>7X{qgp)!38P3iVlwW T-Mڱ@I]|~nܤw᥄/+kɓp8_}1ޭ>=|側f?r/3\&r?]'qJK PK[-wPK!Eeճ| AndroidManifest.xmlUTgTn@='Ĵ ym`T( PakMhH*!`t |_’`g%1ֱg{ΝqMPhV|?GWĐxO|$߈K X#6cO_D%#NDVMbL| T9^*y9qp=)!r"fm{◝y0U b?G\.#r 7ߥ!| s.DuV\çʐzW^ di\ S)\ܘ:mӜe!v[u{&k_ `!@P :3XopbUK[5jk0_\ 1*A"MD'yCޑOR7UF6z k^1}P6Z3z&Pg*LѨARP0%eiHB3 +*z &C* /'AL*^j{~2Lo gЙ^Yl3Gr6ˢrQ1 y$ R䘫$LHPΊб7;cgqnts)1wwh& ~Ac[_3?Dz5sXa BO`9$CwPKDޝPK!# @2 res/drawable-anydpi-v21/ic_launcher_background.xmlUTgj[W},ɖdKqDv8W#[G44iZ\\$ #DB:%A-L2hRh }@ ^K wN}:(L\139Ӊj])dYD[&D! ?#"# ϑK5<\En!|AC~@f 4nk+ L&jvf4g<_vRio&4F0۾t kLM}v`_170Ƣ4ni,Dcٍe+nXucƚk4XtڎnFju2a%XLE[TvvDn֏>oKv[oKѶ۲ݖr-bm+mF*okv[s[Mni[[&°sPm;YZl)4: fNs3ħ/iqy-d(y1$$ad1ބsH׸=ogZy]Ҙμ}Ά/.ٳ88ݸɖqY(,-JaVXd'[攖Yr d˂Ҳ@EveIi9Fc d˲r,ɖUYN(,-EYN),-Ue, dye,S dJK,)Ev=%M";rMi%˨";2F1EvҒ!KFalHiɒ%N|e\alRZ&2NIL*,-wiL+,-= Y*,-+-3dQXd'[+-rHalBi%ˬ";2G9Ev[Y(,-+-dWXd'[~RZ";PiY$ˢ";HiY"˒";Xi9I sw%PK# @PK !uϮP 16f)3ƌ1FDDDDD4ƌ1uADDDDD4ƌ1cL1cL]1chDDDDDcOnrFDU]?hmWIENDB`PK ! -/ res/drawable-ldpi-v4/ic_launcher_background.pngUTgPNG  IHDRQQQPLTE;0 ~VwZl5sIDATX1 @rȥ6r%eq*-猔T#RS!n"#٩\n-$䣧d]c>pɺ@Ge #D쁈?$q!K<Yo5IENDB`PK !ݣ/ res/drawable-mdpi-v4/ic_launcher_background.pngUTgPNG  IHDRllPLTEy&FTw,5~IDATh; @Ti,8[=l\xOO> kÓ`[5HH R&5`WOHU`D`0 4``0 A`0:^aa~`NP:4XIENDB`PK!NFQ/ res/drawable-v24/$ic_launcher_foreground__0.xmlUTg1K@ߥIh8 U\ Ep.Bh6h[Gį!.=# ] 9f1j F4eTAl _i9L2.j՟i8|&ݞ z^6Ϻ;#"RyiGuEg=bllhbnqwB \+|>s!c&KzZYsf,5~ϵB35mWh<=N5=vǹfk򺊼ksƼf{)''PKNFQPK!G+ res/drawable-v24/ic_launcher_foreground.xmlUTgTn@WK"`QVcfف*"j 6QbZjŊπbp8!1霹s3] v8o]0{Q s=  jɻq Ť^zvo'i6G٨\N QLNG0/,q~8 xDg8!Iy)epW2$,%iH$"U) i.9I%.$Nn38B |g2"!6DPEW^M0 gh4D BSB 5˸ox7|^.2) bIN 5ViDXnƤ.L̐:(BUĈELDb"E٦R?媂՘S 5d$Qq8Z9Q&cb/"!Մ$E$MW<!fTrM Ma-7jx7FflS-%-׭\;U1c*Ү VFb69qYqq6ZAgg}=:Mgjbob:ߟS=?asl*+[5>܍oƫ/PKGPK !}q0 res/drawable-xhdpi-v4/ic_launcher_background.pngUTgPNG  IHDR*PLTEdBl=0 ~z\3%w@XIDATxݽ QJuӥM»<0 _m6 wؾ'y`ֳ81}cQyLqj2rY?),qi2Kӝ#<By0j_}iIx;^"DU!BT!BQ"DL!B "DA@-eWaNU "D*D!!B "D1A"ۯoFV)IENDB`PK !p2 res/drawable-xxxhdpi-v4/ic_launcher_background.pngUTgPNG  IHDRBPLTE``=d:l}8z\38 }wd:y=D7IDATxM0Q0Q_uqL2yE7}=tytMM˲L]0`:`:`tt38`:` 0@ RuutYt;~yˢˢLU0߰¾a0k000`:`:`tt38`:` 0@3`:`:`tt ٝ:cWQWmۡ;ZQWZ 0` 0` 0` 0` 0` 0` 0`;ؑooaM}_+-;!^4ͳCg;a'|lz` 0` 0` 0` 0` 0` 0` qvgs7̝[0` 0` 0` 0` 0` 0` 0`, 捳;8 ;at 0` 0` 0` 0` 0` 0` 0`i0opE` sÖh 0` 0` 0` 0` 0` 0` 0`KyN+>No;Dk=0` 0` 0` 0` 0` 0` 0` Xgw:\p0w:|%Z 0` 0` 0` 0` 0` 0` 0``Gqڶ*ꎝߡW>cWQwl !luŃ鲹ӡ;v+lfpt00`LL 000`:`:`tt38`:` 08"P`ttLL fpt00`L Lwb=W7IȑIENDB`PK!Z|pT res/layout/activity_main.xmlUTgP1K@}׋&;t R,NhsBru+wm//|#0`p:&.Wfc=aFx#ۙx+3[Ĥt\Jxφne鳩.X-(.`BKwJbZ%\9Ԙ:y*hȟBbe47xez`0fu'!qeWۓmyޣ2 }ӵVQh^΋ëy-swCӟ7no`{nnuFPKZ|pTPK !k0  resources.arscUTg < H Bt 8k HelloWorld22res/drawable-anydpi-v21/ic_launcher_background.xml//res/drawable-hdpi-v4/ic_launcher_background.png//res/drawable-ldpi-v4/ic_launcher_background.png//res/drawable-mdpi-v4/ic_launcher_background.png//res/drawable-v24/$ic_launcher_foreground__0.xml++res/drawable-v24/ic_launcher_foreground.xml00res/drawable-xhdpi-v4/ic_launcher_background.png11res/drawable-xxhdpi-v4/ic_launcher_background.png22res/drawable-xxxhdpi-v4/ic_launcher_background.pngres/layout/activity_main.xml com.example.test.helloworld p,"2colordrawablelayoutstring<0Mf colorAccent colorPrimarycolorPrimaryDark$ic_launcher_foreground__0ic_launcher_backgroundic_launcher_foreground activity_mainapp_nameT`@ `wKWT`@Tp`@xTp`@Tp`@Tp`@@Tp`@Tp`@ Tp`@ThX@ ThX@PK-N_j._2META-INF/MANIFEST.MFPK-N[ _k`tMETA-INF/0C9DC4B4.SFPK-N[-w!META-INF/0C9DC4B4.RSAPK!Eeճ| y AndroidManifest.xmlUTgPK!Dޝ v classes.dexUTgPK!# @2 Zres/drawable-anydpi-v21/ic_launcher_background.xmlUTgPK !}mCkǙd8QE14eI1,p5_}tLr(hD!2$߶[&x q,ƸSŒ*LXnPX4:-H,swqSGQU٦?Id1CXȧe$|t{JL7Un.WT1f,) [{>^ #{#5y0|%.\ъ o;3:XXw{d֜_9A. Wz<(5 9 P ټBg>p p3tNޖ/ .]tj2Gbұ7PKSJ4ʸMETA-INF/RELEASE.SF}A0ỉn6 QA)BJ-0L[{ͷ)M CV㊌9i {K)NaK@0wכm`=f 2ٽ·;Ew=m9}Q8ft&PO8y`40'K6K}[33*F+s~[9kXeAI ~0V5{ҹXt|q@˻NV3 ^]9mfjJQҵUM  bPz t)4#3hve:yKQkM5( a?K'm8u>+xC:-آg嚫ZvY#`u|C%'- #mxm?".@]oi (H4g4*PKSJʻvMETA-INF/RELEASE.RSAU;ƌaG.I&AQ$ɥ5ј[ QKLAn<9߉C$ .8!}g]Zzֳֻ@ JB/Y.a MpJx 1 X<YfP>(_ 5%_nb(,N<( c'4ZHhL8 *$r6~82L@o! V-<$iVy*Nd"p 5B*KC264 G~ns,@Â#a K,+ڋrǼM}235Pl '9e_M20oB6`TRFg82=ĺbjRóDϫ H2mnmvQӛxc]Gζ&] )΅kjsU;Ko IOJ arK'w}^qSEM U GBv 7[l 2ՅMOQQE`J:#ꧣs{Kf`HU {L>(ZkqV4Hgd(~s° A$<2UUvnw3Ej~;yXqfM:gq:!^M/W;O>ڃ>x]v,8?Z[|akCɘ.ZD~5<)y{m o`J??1^yXq~I剫B$;%2Q7Ň>Y2SBw s4|@a}I]FLIL"n[9tQ&?\-_jSWPH_ʨ w<VxkIy ֔w d>|[5ê?6՛ vr+f8 0Kk'P} k8)j}`ҸOˋ ΈvJhƹKڵ$ bGXg`EmR{qj'˻mNE `#)''}6ؐv1Qq:Cq߽* SrUgf J9b nB+A绹LyBCWЈ7}|^XV({b>t啿vxXtyŅ`3BXA0.0ǎQ2`Z%hbe_ ~EX nhr >[[sٻUxh2ŗzyxW**h/B:b囤]VyJY[JjnC7*<&f BB!kjakJtM]=6OIMw c7c2t~ff *䔏 ߜ%>8eI2/'޼]]ޗU ֹFEm-<:E%Olf5k4V4DxΈ"Q?5AlO\ҜZ>y .?o>cDHnEk%'ip[GH7I)|,1vj6Oʉ PKwA{:`res/xml/preferences.xmlS=oA}| "dFTABhپ$&|TA/B 蠠@ެz#`罝y3of6@OU@:n&kd=W.w{H*W{"38%Cb3PC`u O)yҖ2NIx̒‶< 3@wxDNv/CTW>a_zDWV@Lu}?⿜ j>a o ADoL[ڗ'4Й|]rrO9Zɔџk1y2]g1:,]kc<_ͻTy:9JmTw3=I"F%B:ncufN=Χ( R3N|R?#"}7W{(gڷ-,kM>ũN`8K?)X9 1B Lm5'~ ,unrշtkZV.e+dG*xb+Fө{sZ5M}MO}5kGwmݖGnxՅ-e,7o}Q_PKwAsAndroidManifest.xmlTnRA=[ʵRG11^qaDhIm.UD`cWuʸ| 'pa|wz30LA{9;g|gfC7'\_q(ω{I&&$A L#DL|%k>p(8B t@ M-Tp(=3|6 E7d+l%d~ >Cwwqw{>dd!*خu!WWY M%G.5CF8ڐ[-2?kysTB (ףM*Ȯr"+A+x%JǶT]{?$v,?JbV.Q*MO]} {'jȹSPtȊ uKfUPZ}jgjS15 8w`5yy"IAXf?59MūkY~TD)kΓUTO G"nZ˚ gg}_3z 9摲<A/Җg~rIB6;1f=6Z?}_"Zkh?3V叛gf-~yފ[<ç v|2Y|nzU˫?Wy>;/:{K>Ûo_PK wA]a( ( resources.arsc ( p2j 28>Zl4tres/xml/preferences.xmlres/drawable-ldpi/icon.pngres/drawable-mdpi/icon.pngres/drawable-hdpi/icon.pngres/drawable-xhdpi/icon.pngMuteVibrate01 Polite DroidEnabled+Activate silent mode during calendar eventsSettings CalendarsSelect calendarsAll day eventsActivate during all day eventsBusy events onlyOnly activate for busy events Phone vibrate$Allow phone to vibrate when silencedlcom.politedroidx0 *8attrdrawablexmlarraystring` &<\<r Fhicon preferences calendarssound_profilessound_profiles_valuesapp_nameoptions_enabledoptions_enabled_summaryoptions_settingsoptions_calendarsoptions_calendars_summaryoptions_events_all_dayoptions_events_all_day_summaryoptions_events_busyoptions_events_busy_summaryoptions_vibrateoptions_vibrate_summary8L<$x8L<$8L<$8L<$@8L<$8D$8@ 8( h$ 0@P`p          PK wA %Cres/drawable-hdpi/icon.pngPNG  IHDRHHb3CuPLTEᶶ9tttwpppfff8RtRNS Y [Y".!:9&B+H*,KLۋYIfe7Ow%XdlprsAGJ EIDATXkW0ZVD`j.v,12&l /jlwd<"ǹ(/1agAbG9ґDBjk3D F6L"Jm)Awvi=(W @ޟ)j:@EDUKA)M#6ӈBoCBGY ِp|#  EZX8hCqoHu/t:3his+] !W?.@6B˅&mR_,qHB3@˭BeŞ4 b;b+fpHq?x-'!8y= HFKk䊌Ps1s'"nr'Xbmgή=mfrO,+Uk4VMϊC)XoD±lՀ-q A}y+J@SCMp{]<g%;5q~Jv(5DG:qs pDq.o9l.c\"u/dm$kۛ-Ha||:@Cu<_%&}Ie7vav Z7wIENDB`PK wA22res/drawable-xhdpi/icon.pngPNG  IHDR``F PLTE---mmmCCCFFFFFFᏤ9݃ל!!!PPPNNN'''vvv;sޅ[[[CCC:::AˠCtRNS &+, PL"+$4*=/DCI7M%9O8&:Q'R~\Sji]p`}0@s{?#cglmiIDAThS@iM V`-ĔRM-}+xpC+*K95%HlRhL4yM}2dH,/p09E-=[ O#mV‚cLzt;4,.*tD]62Ke%'6.' S^Q t/BF0a.Su ѩ*L& V0 ZILmmtLTv);.tv%]r@OWp.I^>u@oGppW33<'η7sבvoD7hE8B`)0n@08<?@wp </d5T=0m hc"A`ڽ~1]=}Fʯd -1SXkKaI=;n YIENDB`PK wANph/ classes.dexZ x\Wu>oE4I^ƖؖK#)^FxwȶɊc4O҄if$'dm]H  R .P(R&$6l)|M!PHBY?7qs9{{xPśgַ+_%n [x͗&DDt|xc߷ۉ6~D7U2 ʉ#z ' XOTlp2rH><|x 8)3'_|,o ^2{&``7o46]w_^^j 3ۀkZ^`Nge x=ނ}ʁ(6 \ 77wGǀO~n%jځ6`;F)`xp/n4(4E'π_%;PĀN`p0dہ)' t\l 9[#cggo?~ b>(nN^ Pކ@FI <<< Y\ `[KF*%B5X;u@p1l  2\\ lv;]|=^`p\;J*`a0\ `i # %g_w-=K>+$Y+E>$mq, )t@>W=%Lul[!m%486UҦQ?jOj9Uoׇ&3EkXe >_WۤjJgY"}r?qٶ^M\0亱o=s DZQ),h}U6QOE{OZ'E0?V"\=*h;}8_Tmn"h-}8'n!c+l˥|ܟt/%h}@ ZKt}VЋqAwҷ9F亮 9I t8߉xTدBqqh; w ZCٟ:9NNSxgAs"1>O|z4u 2nK!߭Vups휋fى+͸ԉf|_}8ϯw B?ξ`VT@|:CWҋ5J$ـ|fs MzzAZqwinjoYRg!qNI8fu::0&V}wӾ ̗:F\7b ꣏E"Kc kc9/Fȹ7}l/hA뤞k^ HANd Rxyo:~o'^C%ڰyhkm\3OC4.;aD70@ 8W 6<..w b.O5lhp9F3ؑK.ۑ-ƒQX~Ӓ>/5z#5"CŔcX㰱ZĔ#΄1$ M˧ڿاJQ9Q,Ld36GEV1Cَ*g-Rswg5o-2i'Vc]iΎvve_3CZVL evOy% hnց!R+z CTſ9~ "ҳΚQ4PDz~_Hֿ""+,ٳX :GU! v=Ts v䙼eLy39]x&1-UD'Mym\6QId8޷ʅ/?\͈o”ws ѨnRbkZ^)yBQ7궘z+Swkq~JF:&FB-eYpx݋"Waq$vAJeҾ`o +{hJYR>25xgbʪ~*Y7$*Bw Y4"Ŋ/4wS( **Im2u*)y{\6gM;7mf-{Vi%uAU*);71+aҲ);N٩%uh鮃:z>%OXfreS-F#%k|*cf*m%m6M.<7\x#X+}L?>R.'r~R~!C( rGOz?Pͤqsz:#mf9ae{awtfyl*dMө1UTXє=g1j*(2Bߙ͘13Rswv9*+I s`Ms^橏ÃE*gnavgԮLjڅ?Ү-hC+_H38[|Ҭ\d*@/PkҴ'{Q/Jys+k6c/sbsy)+2;fL!]V>)FPBUUD\|笝L[)L s7{:huKmwΥ'zh ]s~el,[|*ߑgSykseәt*o9FjX>4Ģ,ҘK"Ͻnx8gkjzэ53Z9\W`fŅO ق$x'e) I,O qJ&mrzEўcִ[.9#\#efOԟMF<$ (42nn6?WaL^N7)h `>#,}$)Z?k_kfEicti e*0ǾKO#u-'j|Ukꔻ}~PS {ɓ{+ڼœFE xQQΊ3k*OJ }(~x\S}bJL:?ס mzS)yK =QXU&f%f-[Օ=ߡ:fpS=u?îo%wJϡNvۋ~DPK{A@FXyMETA-INF/MANIFEST.MFPKSJ4ʸMETA-INF/RELEASE.SFPKSJʻvMETA-INF/RELEASE.RSAPKwA{:`< res/xml/preferences.xmlPKwAs AndroidManifest.xmlPK wA]a( ( resources.arscPK wA %C6res/drawable-hdpi/icon.pngPK wAbee res/drawable-ldpi/icon.pngPK wA7T//"res/drawable-mdpi/icon.pngPK wA22%res/drawable-xhdpi/icon.pngPK wANph/ k+classes.dexPK A././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/com.politedroid_4.apk0000644000175000017500000004407114620351225021132 0ustar00hanshansPK{Ae[LwMETA-INF/MANIFEST.MF}Mo@&AJJ<(QWPp}AM83ϼ#8 gdl(x9->7:%*gaff9n6€J;V v;5h- GeRuoSׅh!yUwB@|`ahXMsJ3f[[@Mt>3bYBZzkWG4^J%N!p`Bb2Smp=lR.ݻZ|m6pk\VsNe ȃll7!u{U.~1vP{w퇾e~h_ƪ]#gѼ;w:1`PKSJ:META-INF/RELEASE.SF}M0߁n&&@¨eS@ e@?8jFo}/']@^R$ne8'#Aih8b\|JHU p3lښʞT㯍YZe^(~ϲu8 ugB(gڒ)EO0iSȯߛfc34(bRRAQ(">b|0ޣ^\.Xn}G(Ouq,4/i,9vZJזۦ R$qP` 9i$$UQ,sTdwFh#/{¥A KȏSq*mG\S{lgդٱ`ׅQͅn8p3ۯ\^ow e@}{Sx`@?O!cW @EjӢ1 fbPKSJxMETA-INF/RELEASE.RSAU?ԋXc(ˡ5:-d_&df4֐:5}DKTFa.%ƒr1B[{98?>}^K0J  @XȅQ8D_-@*<(0 CAi)Q#p 0 7AI"V<Ơ Cɞ~DIK2Z } 0bFJbFȝK !JڄxȠq^2Sª*᰸yX,k?,(<7@2qdVMS'NPdu  ՙ|ӏՓ_5hj^ <ň:?3Z {:]!u])һ20dU)9CԊ㼓$VqvܾdU./+Ɗ%$ .J vX78.]F3;W :u;U<8UX~Zq.W4W10& ϳ.Ʒ% aeFJMgSxϊ I].u%RQ42zreD8'{{c8h3{/8̈e3VtG Ne OoQ'0i3Yi_žO+n֦F?)hӬЍ\v -*k4<sYT*"[ýi uKņMI&u?JHwu|9HvWc(s"O3YYHқ×-9g89Vˊ1hzwy.mwl3xLmD`mɻYS*r\t| OxwOкA;;L[{ i\]Ԫlr'Yw{ M?2@l*'ue{AE!5rŒ॔VCwn9(u [x7V~WZ5ȩmJckN4)-?Vi9,cywh 'w̪Əy{ɦR{ucw$y WK2O$6k1V݅GSV`V #>/>{b{ Bmߎ3,18_n(=Yeu rL1tv`T @v(&Ч8[}^7R5PЈ3y]v5KӚ#Ξm˳U@{@[:#>OVh veU:=e7V L!۰Pʶ_a@W#`l_s}?(^] WPKՖԑV +,)=Vtg|QwE}gS S&K893]'DR#NR?9%|}/yW7k- +|!1ۜVLx&F󝂹~kZqyB_t7MNl [5URײ[\Y$ Wy\B#-Q[=oW37}7_ung,]/͞d6ná[2q.s\˚9/,)E9K٪ik:ꫤ_ y^2y-_~ղW {PKwALEAndroidManifest.xmlTn1=IۡM4} ! ,*VU(,RPUYB,o X >߱I Ɍ==G!q"z}C[=A$~  b߈ \&EN|&߉_5Oڨ: MfgIO '<Ƴ( '[_5:[ \:|ҝՀ-q A}y+J@SCMp{]<g%;5q~Jv(5DG:qs pDq.o9l.c\"u/dm$kۛ-Ha||:@Cu<_%&}Ie7vav Z7wIENDB`PK wA22res/drawable-xhdpi/icon.pngPNG  IHDR``F PLTE---mmmCCCFFFFFFᏤ9݃ל!!!PPPNNN'''vvv;sޅ[[[CCC:::AˠCtRNS &+, PL"+$4*=/DCI7M%9O8&:Q'R~\Sji]p`}0@s{?#cglmiIDAThS@iM V`-ĔRM-}+xpC+*K95%HlRhL4yM}2dH,/p09E-=[ O#mV‚cLzt;4,.*tD]62Ke%'6.' S^Q t/BF0a.Su ѩ*L& V0 ZILmmtLTv);.tv%]r@OWp.I^>u@oGppW33<'η7sבvoD7hE8B`)0n@08<?@wp </d5T=0m hc"A`ڽ~1]=}Fʯd -1SXkKaI=;n YIENDB`PKwAA2 classes.dex[{`\e?ߝ;L&d҄fh;7I[2H4}"hdnɝtAE+.*>'*q},*,ʲ-e?\|Ws9|;߹&i6l/e員'u{w.y'"cC>>^$[~ЦmuAOMV [!zAt? 0 X1`+p)p+[` |x @kT@ ǀ~ ^^*W `-pp1ہ{<|x t[@nn> << ='ׁ>& v0 XuqVN=g?~ D j"`>|x m3@ c@ x>aQq)Uh)u9La&l6 .@Um@?vK8>pp.WWU7G0@(^{Ө'),bL8~GJ N: W3_x )*%oUKZ1/ΧSmQK~JF7;~c-رԭhQi&(dfo)~퀃ϐC~O:aca~;=}ζ(1Pm^xqCg_rڪur-;WzzqLKVotczR%BWc.I7O%]O >^%;>nл$?zK!zԇSVPAt#ƭt=(i%qNNjUwK>(N>'i/z8gD青Cd琏JOIj 2=ϫ1OSOo')utR: zJ3}P>/UjF>E/;%VcF oIYb;鿈sFNTV;y?H~i  V{wD'8qA??".#nz\RnVhF_#Klu ޫy^QUGQM/;znVwp}*@{E]u(RmO">*+XDXHv92Skݯ|n? .- :j\*~a#FH(f/ z^Oͺݿ.mHѮKXVj7;yyQ.>y32?z˶J,>QKz+e_HЍ&fϨ9/w L!^?qZ!ynºxn,a衞#l)^E%=Ar5W"ϧ_%C_w gNy7Q&Ը<'-HqT܇s(GOzYhnS§W*NQIwz>F'n6rˇҊUCՐƲ7&si;]jHSKτevp rugdnj,Y`/ݳ7ڙ^9m;!: 蒇 A?z|{Ko?jq4vS_x;mgvUB(ΏyLk\5 2*iǿx$<)32Y,㸴*jk6m/8oMYToAZ0o W0D^ &jĻxqߺ<]e[hȭc519H., |ڞ}rQd 4\ɻpzT~|r"Z }5νy\{& L\ԍ2%鰦KrMo/UXM9j=㭒 xje<5a\u͍%^T)`~Lj^8ꂻ_t(p\|wC+d΄i<`X|;AGPy7z7=>]b3R2nI6O]Z j fPۜ]Yc9h1ɕ+]pb>ƺ}= [^׺Y91\)5m+Uscn8\ jgW( }%/+\s5?vUa=@W*Ow9}5|Tb&Bzjf6##c3>7ԫ̍O+*h ϱsjy◺ZY_uFi{fKfߪ[T㼢?l?WkVgSȧ2|CC_g/޳#VKV >iwakd];VvnPu:I]'uqRw%ݖq]:'5ݐM{H$ m#t%Uطwhޡ#_q3=3ϗgSm96Gn%Ri3ŠkS(kaa״i(^kd=MXDִFg.5gdl_UkSqqr C`d@Ѓ{l3 ?,:DV6JFSSt";9fl~g*Όn/I6im25N&x=t,~l A)nfD.9jg_4a\&-M/f-97K} 3蝧3̎%F}`!OȤFXR9X.<9{h<@0$cM 3׺+g0sg͕HXfy=3" YiPf2OGw9uY>OaYbLB2)ZkGy꡺(n/Xɴ\TiUQvAy=Fr|{hBe~T~VݰЕg;85MCUȧRyEaA^GR\N'YDqdTͩ4tj$^pcXO T>v${֍$! ;VMKY3G&9hrX~@r8W#|s÷.qjC̜®q`QVq \1ow''RJHΎ]_>8w$)Xz{# LHYx_N\ Z!B{i8' ?$'wǏO7ڊ6w/PNi⛭Ј84#Y-.Jܫܤ5"NOn7CAOnmS]7yE7\!ʟaX?%'EŇ=A; SW՞Ֆ<5~H΃)wT{7*݇0!wo41PK{Ae[LwMETA-INF/MANIFEST.MFPKSJ:META-INF/RELEASE.SFPKSJxMETA-INF/RELEASE.RSAPKwAP= res/xml/preferences.xmlPKwALEAndroidManifest.xmlPK wAg)HH+resources.arscPK wA %Cres/drawable-hdpi/icon.pngPK wAbeee#res/drawable-ldpi/icon.pngPK wA7T//%res/drawable-mdpi/icon.pngPK wA22i'res/drawable-xhdpi/icon.pngPKwAA2 -classes.dexPK >E././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/com.politedroid_5.apk0000644000175000017500000004460114620351225021132 0ustar00hanshansPKYBIj{META-INF/MANIFEST.MF}Mo@&A@MzC+ԏ-Z4+,}ikZ3<̛q%Yc')(k(~C.(+s*8c)x.K|V%k8h;?ڗV8![lmC.7S J ֮ƥ9n}^9&pJHJ㖪]!q~Fm+FDEݦ jᅨ@VHMYΗ] _OPKTJ8ܷMETA-INF/RELEASE.SF}A0ỉn "x@`A˦B ؂ ~L6[{ͷF UM!!4K*~0?zUQ+ȦPb@/hRnX`)7Ae_BOibGM,2cP*G6K}[R3- ե{﹠SB&E.ƐBB6ܯ)Qe` ]%rtQ_8a7yr ^V Hy릈sȷiT"KxVyV䉕2=\n-qg_i.qN׃Mg=ݖx|;1Fw}VTM.2B ĪQ;zHM?( o 2HاhZ62G9`DteVlܵS)lτ?PKTJeuMETA-INF/RELEASE.RSAU?ԋ(K"kc6 t&l=>(Rp8!ɞm,E{rr{~y0ԡƱ_x@!0!R#a "x!ґ ^%ؗG|K g- Zq$nZFzyBbŃ0 tݠJYҨdH;apܶ^ _HldQ$^ V.H('l[}aX{iTޏ%eR (%osI-^֫v,eCwIQ-»d%0eˋ4%,M'۫^֧Eaܤ ʯV\L,Ƨ<v1E3FuF*\@_yݻiv8Lt/љx(~|}W-d[ET$7|6L+c-y'9 jRU@f=#ǥʽ6 {vMaW7LE[QxAaKV?8ꍎ\oky]葺i$^zS8S(ڶAU?\$DM9p%jhG6s Ij!O2O{HF s{PKYBPres/xml/preferences.xmlUnA=PhH}J&~l[޵E j J*D?t B4pxVNxv;3"xXz_"׈bL<#^?_Ěn{sq=%o7C8dVZCbkSWPKՖԑV +,)=Vtg|QwE}gS S&K893]'DR#NR?9%|}/yW7k- +|!1ۜVLx&F󝂹~kZqyB_t7MNl [5URײ[\Y$ Wy\B#-Q[=oW37}7_ung,]/͞d6ná[2q.s\˚9/,)E9K٪ik:ꫤ_ y^2y-_~ղW {PKYB?}5WAndroidManifest.xmlUNSQ].2 FMƄ<Tj-Rii/#ġЁo0~_Й=m ܛs:{}>HO00\G|O &qD|"߈bSDs7(l3I">pxG|$Έ^F+8>Lr(H?"&+ U%vתOD5 ǶıXwJp}*W9Vd .}|kޥN5@"i*mkoօDhdiY,ܠj>ଋd MZ>qtAe<BƿU^5js-Y V2^q5Xeo[WX"pVu[g-bYW·$kcv}p#)U5G2z|aoVcGUJ^bup!~IU^PGlfek2zVY+:YFk1dЪBź?fU9v*yDQ!|x^ӘiR ݦO~ __FJ(ǫ55s*+T++;\kQ-T4Ռ!ېzKU/E=z~X⎞KJ8b'6nFfԷa6{sM4?sS-ؚ;6j6N͢~Vo';Mޔ`$˧"u~C?*}Z _V=5gLF"9X~4-?PK YBg)HHresources.arsc H2j6LXlvZn,jres/xml/preferences.xmlres/drawable-ldpi/icon.pngres/drawable-mdpi/icon.pngres/drawable-hdpi/icon.pngres/drawable-xhdpi/icon.pngfifteen minutes half hourhourhalf dayday900000180000036000004320000086400000 Polite DroidEnabled+Activate silent mode during calendar eventsSettings CalendarsSelect calendarsAll day eventsActivate during all day eventsBusy events onlyOnly activate for busy events Phone vibrate$Allow phone to vibrate when silencedUpdate interval&Interval between checks for new eventsd com.politedroidx0 *8attrdrawablexmlarraystring|h &<`BxLnicon preferences calendarsupdate_intervalsupdate_interval_valuesapp_nameoptions_enabledoptions_enabled_summaryoptions_settingsoptions_calendarsoptions_calendars_summaryoptions_events_all_dayoptions_events_all_day_summaryoptions_events_busyoptions_events_busy_summaryoptions_vibrateoptions_vibrate_summaryoptions_update_intervaloptions_update_interval_summary8L<$x8L<$8L<$8L<$@8L<$8D$\     H8Pp$ 0@P`p     PK YB %Cres/drawable-hdpi/icon.pngPNG  IHDRHHb3CuPLTEᶶ9tttwpppfff8RtRNS Y [Y".!:9&B+H*,KLۋYIfe7Ow%XdlprsAGJ EIDATXkW0ZVD`j.v,12&l /jlwd<"ǹ(/1agAbG9ґDBjk3D F6L"Jm)Awvi=(W @ޟ)j:@EDUKA)M#6ӈBoCBGY ِp|#  EZX8hCqoHu/t:3his+] !W?.@6B˅&mR_,qHB3@˭BeŞ4 b;b+fpHq?x-'!8y= HFKk䊌Ps1s'"nr'Xbmgή=mfrO,+Uk4VMϊC)XoD±lՀ-q A}y+J@SCMp{]<g%;5q~Jv(5DG:qs pDq.o9l.c\"u/dm$kۛ-Ha||:@Cu<_%&}Ie7vav Z7wIENDB`PK YB22res/drawable-xhdpi/icon.pngPNG  IHDR``F PLTE---mmmCCCFFFFFFᏤ9݃ל!!!PPPNNN'''vvv;sޅ[[[CCC:::AˠCtRNS &+, PL"+$4*=/DCI7M%9O8&:Q'R~\Sji]p`}0@s{?#cglmiIDAThS@iM V`-ĔRM-}+xpC+*K95%HlRhL4yM}2dH,/p09E-=[ O#mV‚cLzt;4,.*tD]62Ke%'6.' S^Q t/BF0a.Su ѩ*L& V0 ZILmmtLTv);.tv%]r@OWp.I^>u@oGppW33<'η7sבvoD7hE8B`)0n@08<?@wp </d5T=0m hc"A`ڽ~1]=}Fʯd -1SXkKaI=;n YIENDB`PKYBXW5 classes.dex[ |\e?ΝG&t2ivh;INi !ii2iCh˶m20LB -DJ, "Z]e}ʂADPw;sꦿιuI'eWMvT,;ms׎>{Z":Է&D5Do%42hb"zo=;/O^^ DDu@'p-p?SsL3 Wׁ7e@% `N Ffcmq^+@Q.!iU%6SS @ s;')ppEq4:Xk@x;p;p/U)E@Y_f`w| M{?~ xPWyz\ Kˀf @x%ˁ5@.W&p5p A'OO?^cD@X$4w<}h@p Ɓcm=#//o0X ځMnL&VNsǁ͘ [; x xm@n> >NgXB[Jp9IR CL)jhp.m@;/N 6[ۀ .`p! v}%`/ `?pH=Uہk#d'%?GCK~X>TsurXr I{%cIHt%$.mS%m%Q)RU'VʗHA)g\/5r(pIJJ{}Kߖmc>2R&"y[>&?>9fO;x{>ͲmO;!ɯqk><ױZ8_XquH?*yN$s|u])h};hp=~z}>3qذKC~:sm?WKc5?%u z.p׋}KnCΡa[]!~HҏH?J5߉o A$W,#i}P}NTGJ z.}WзѯB['w!~c yk藂< zetOː~N|ĹO / ZG_!K¾Y^A,q.tLJz8UG>-Ft=, I_'We\E!+w= hDƸ:ՆU<$*z8mĹl6O9Auz8[4O7,F|oI U/0H_"nu^蘠ςΥSZ~e_먜#z^Ŀ_{9QOwV4u0}Ay@¾=[a2-ETvc j{k1k'7A\+ΡO $~,E|sOJq= j٭ -:D|oQ1b+q9~FZOT׈k*o]"5~7CbѨ7c%]*e󿋸,"/V Z4 X ꡯ ~K\. E{}95ֳKʹ^)WK}oLjYuQvHoR!$7H:I7/A/ٓ}wc4N(2͓yloк wb81 ZRMk:ڪjde"Ϣj꣸=-?j{*}IUU~+ɹE2<2qaMUT!|L>yᓮ:<P[ԢvPk h\zq~UVM8W!Ǽwz1_ZU_|+ժ"v E~gTa0JW*VVc//ShQ<Q#U!?p)4/K0{^c/^uAZsgn 1aY\vDw>6XiE]𫂝h;RĤRaHZ*or1'L'LCXOF xꭘ 3JqQ[ܶ]/ӗb۶i.m}hm 쐋+XsX`£(hXd9Bk0qz8fZ}fk% >((*V~(N+-ʏ'iSB/Zk㱽5kgc~3\Z)TΪ~ozᢊ)肿y-݈[Mޡc [Ыo*߆ +h]TqaRy} 0VPnĮd`[ }D鼺%׮r>nTe9 [5͝/VLcQQ;)V G-/cIa) #Esnw@\\Z-#maw֛`]iVu8"/77rO~UO5&Z-\3b/O;ziѢ{w+)3Iٻ78_ڭ%uXl"K=zB^z=be t?#f~q,pe UݏRò<~whaiX -wcY:l;=pT9C{4k&>U=PZl{U؅J yoU9N˵UVކcq1V93A:'9:cT=`Yx6!88gMmVH gE:9WP QC7 Hw! [-!sޣmoP_|`= ˧&zDgn{^WiLX;-Q7qGqh}!MDQS}FdFni=17CZzUl(4 ]pϸt?~ZֺOYnvèLWd ZWm>=D-B` QWs9`ŵ-v~}~_PD~-V![J nV~DXYBr46(7`[$n.gM6V⮴]ԣ z3G$5c5;xMQxF\1M̥zv\Uz1̈wKyD3L"QQT*~?*> Pz_aPTNU[%3b=*־}#fVܱA Z)|cz!ZA11 "LfRU%f$")oq%ⓑ}} +~V>Igx\ߕ5aB+(v@a^ o{x9givR{v 1\^W9]A<; _?|9}9k_V7:XGEs,rac1dq=Op q>K>}ςG̭YT^g_o.ň}lu߄ֿ)>S図kY?ܰrՑEc]? ՆlP+|#Bׄ&Y N]+2Z'd ]2pka]$tmIA[դ>м>0mlDG_ksk(ٶ_9.K4.g;wdﳾMcV46@ؾZB8vQycYn٘"TzU1N $9c^s@̭ڨMحvv{֓fJY$3B^!`uɌa锞wr!mJtR]?fӬX怑]9dkȤtay-JtlJt^J;n޻.j4 y~ޝKG:h81 ٤L3F<ҦhҶs??ƒ-Y`.g֭E\̏$s9pBhK3/m6J]]b&&O)HEJT% T$n =R$HKoOBhyI [.NŒ##L27ܝ4F"tF9d73)67dd$H +e6j(*B۔&S|a1`'ouZtfɂLy&aSTxq=); "rMjFs؋_:Ek1AH+FqK*]bgaÜ,JFiS=6bCa_Aɛd!ُyLs}ŰJ'cctjMBjl>iLe G Jl% :pӅm _vr10ҙXGI`2Dv{ ;f~3Ӫ[9wz6}.9\(.3yogl|Km[j1:FXJH‰rZ}XQqPz`g CzaaC !x2va+VL2gD[ #V8]1*j NN!G9&DIw0!S1Qf dNT}M"g2=5 YQБGjJuj 4T>>~Jte{5|j3FlibЎ u/ $˱̭찝ɝky-͓jH.;Fy0x{+Ōh<(8=\c,ڕ$1s!Nm\rf9L#Y*w)ĢJ:f`hE4b1ĖR]\E?y yL.b;Uf亳)fq\X*ŊHA~)uǽRc˔'eCvv&O:ߍ+2GGְ oq #q7+j&f2Ŏ=|v2ʬi\;9Sl"!Ղqr5,TVLh܋#iތY *w";kT=ILslȴ|Ofn9{a$A >A8X#cHBnda» ܟSyNaHxFU;LΦ3d}?۲פQM&L[?ۋ/SPKYBIj{META-INF/MANIFEST.MFPKTJ8ܷMETA-INF/RELEASE.SFPKTJeuMETA-INF/RELEASE.RSAPKYBP< res/xml/preferences.xmlPKYB?}5WAndroidManifest.xmlPK YBg)HH]resources.arscPK YB %Cres/drawable-hdpi/icon.pngPK YBbee#res/drawable-ldpi/icon.pngPK YB7T//4%res/drawable-mdpi/icon.pngPK YB22'res/drawable-xhdpi/icon.pngPKYBXW5 .classes.dexPK F././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/com.politedroid_6.apk0000644000175000017500000004030214620351225021125 0ustar00hanshansPKոJMETA-INF/MANIFEST.MF]o0{g1E+م9dNP7vTZlQ+%;3ǝ˾_>4!DHZfAs \ ,ofd " 3$!l1]ˌ4vnnFʷ9V/ḵ((?Ses&hj3<{!{цꇮAシK^ ˺VVw}b'Ȗ]AwUA^XheϢJfR2;.UM'ëbGB0FpAzx?E Iy0QٲmPn7^m@ ym(Bqt4ت:v8;Nz8x0sPKCzPKոJMETA-INF/RELEASE.SFˎ0=e+rEEHtbSq &sZUAt8Ȍ#u ,)FSׂm.HH u秼#sk 9(")QF Ki|/p7ukm89ٮ%~$/KH%1|PyxFVrp۹5רKUS*pdpiYeCj#T%rF3󲶽_| darwԭ"/*pNNm7  +$կh]<+Q/&ṖЋe"t ~:mB^m&%'6d7IkY‚H&Kz4eK<~V?NH퐇 Sr=wtx%`AИu 0B^:-Kv&z$̕NdAXWNgjfɽeNfMP3w1dSvrfZ-jwzt8?+ϫ(sZߜ&ȫcܶ:NGL^uW3]pQPH*;8o_Ϧ@ ə_۵sފ@Uϧw?ɣlꂤzyↈK#K4M؆>,n 6͐Rvйo;ظפrbW&[([ŒB) )s/WmFFÒv:B4dn[l #IE`炍t}k()JĻצq|w}s=F-\#έ?>:mz5*OuF}2N S2Fs?k*`>{mCQʼnwLGY[lӃJF]WmSn~)2V0M;#` W/Ňzq[z*O`{/Nt ā/sk4č(aQtJBg>{&89n|R;QI~ ٨`!DSAIkNwx|DFu$StlZZ< SX7JUq9aEdh}).ofXg;y?i XQO:Ěw<1>+kt~iu+ PKJ/vPK4DcFAndroidManifest.xmlUKOSAn[ "T)R^&G(T( Дqqa\Wҕ W\4n3J7_g7|̙G# Hj30$DkPuSJEzU >(6V%Ğ*ޙ* e%ܵf=jZGbzӸ.KAgZ,sdMՁ9"}4G_3Y3z13'gr;Y5L) /8J$D+Q$l#lb0'g~ilxoVmXtr[A:~q+ƶµw+wLbT4R0n#qhS.p's=i=#pbo[YT mBbQ\ymՀ-q A}y+J@SCMp{]<g%;5q~Jv(5DG:qs pDq.o9l.c\"u/dm$kۛ-Ha||:@Cu<_%&}Ie7vav Z7wIENDB`PK /DcF22res/drawable-xhdpi-v4/icon.pngPNG  IHDR``F PLTE---mmmCCCFFFFFFᏤ9݃ל!!!PPPNNN'''vvv;sޅ[[[CCC:::AˠCtRNS &+, PL"+$4*=/DCI7M%9O8&:Q'R~\Sji]p`}0@s{?#cglmiIDAThS@iM V`-ĔRM-}+xpC+*K95%HlRhL4yM}2dH,/p09E-=[ O#mV‚cLzt;4,.*tD]62Ke%'6.' S^Q t/BF0a.Su ѩ*L& V0 ZILmmtLTv);.tv%]r@OWp.I^>u@oGppW33<'η7sבvoD7hE8B`)0n@08<?@wp </d5T=0m hc"A`ڽ~1]=}Fʯd -1SXkKaI=;n YIENDB`PK4DcFres/xml/preferences.xmlS104mkBÉᆖ]$"ڨiRNǀ/@$n`ab}5Qn8KO}}v<1zHyLQ{S8g+\|h r]XP.%6h+"!g<^clℯc]Ɠ0KJŒ˞.W~&dߐ1|e&ND&M3! \L/wZJEi""XC,EohR(%3I{4ЭX$!zGT;c'XLP36zfnS܉8|CN0Yˍi4({ \o_1+_:?أ\--b44ym33Oךui<-^ )Mw߼do{7O;/"[{陏߶Mw{~ev4]"9Fsrہ\DWU64 zzDuaz@8 <<|.2c ?灏2cp%~ \F>`>O'Dǁ?>.#Zl_5 -#/vp;Mh 8n^Z6 p8 nnn< .A@`?p@8 |xxxx=wm) T `9zarMǁg׀w_-@8 L7w^5? hA <<<8k%Z4Q)vA19U1P{Dp={\2W JЅpm יV+Uj`-p9(t=f` &A/;Ĉ3 0{}00&0 $ ) KNs>@>f;RsYc&~#9JIЩ#g>ѩ,JajY,Z%ש: $_/ |]IBwJycz%ܣ |WJ.<ۧZl~G3%<}7Ⱦ $w{$k8$y^aɧJsH.G%!Kl_,_+?._}Dm!\]9&`s߉\ڹYe֒3*2MJgwcoBJGlqJ K.:%Vط9Sv$魂vWJA?h:j^ "]VYRNjzA H7苂Wuу6ÂF%I"koW0wzcmǗzqlsNI6}5Iw$}8O}(D_'S:=F~ꣳ:IyĹyn$-LP_]ߎhWyY =:~B鏄_O*iΣ ?t*_ v+hX;p!wk௬|878qvK7OQ? ^A/7mez쌠K$mlpRAIEq3n!t9= F.J:'s^|9.rs} *۵YW6~DsmĹkJ柒+duV/YUaVS}<`?Uؐ?n:%ݩU mҝe=Q:`kK?N ha7ϙBm*Vo]u5`iJկnV=qvy69V> ּ ŠA;Us݊q -JE^6D/= #hW2ĽJ~Pe@l}/~N<_^|Լj6 κ*GjԳNdtŭ"GŪ} >"Tj`8YQWI^>T+E˟_DGDDk.Q][StmEShMCyk7aoHs9YCKߋeW!t?bC̹]#+auLKW1&BmD ktoJO3,#nɌwS kNGDzK7gʓ=5dXƄiwS6'djbio.JLt:Dʚ=Nۘ2l7-|I#ae3*{q kbʊc)!)#32}fLI() nc,]EQA}f&c,OeȔZfF),gNcVނ}̈KXCd67J>`"͙w7Q[gŜI6{miV,OdSSf& k,.wybJ^#v>QEF72f/ggx|MWpXИ2 #=O.2ef#8Wnꦚ(x,BnjRQxI_Ze٦D-u2EdbqO>`eszEwck6̔٬eaSXj*N!^3RӼ?7xf|f {!7l&X6gy{ldk쒭љkms: ?6rRL&x*;g'M=c$x-ĥØҖp)IsHgabfډ51S2dd')T"3~)ƸgYo1mu@i#>X<ӅN{F7l>1ӆm *H(Py"K"kGwoz׮1n"dA280 H#u 9| 9|K:]áyOE Mm6n oya$C*⣭`WEue,3욲l ;'ϔcf?๤l;dxRWL/LQ~D >wgh4UV˝i+<ǜ [zv^<~\3xv@kJylR}=;+E9vF;JR^:*^3:XRk_ó)D)0qw-#] {F~C5*F%R՝,tPPK U>`|)PKոJCzMETA-INF/MANIFEST.MFPKոJMETA-INF/RELEASE.SFPKոJJ/vMETA-INF/RELEASE.RSAPK4DcF{v p AndroidManifest.xmlPK .DcF %Cres/drawable-hdpi-v4/icon.pngPK /DcFbeedres/drawable-ldpi-v4/icon.pngPK /DcF7T//res/drawable-mdpi-v4/icon.pngPK /DcF22nres/drawable-xhdpi-v4/icon.pngPK4DcFX5res/xml/preferences.xmlPK /DcFiV resources.arscPK4DcF U>`|) r)classes.dexPK =././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/duplicate.permisssions_9999999.apk0000644000175000017500000006546614620351225023314 0ustar00hanshansPK (k% classes.dex p\uwjwZza[~H+6zŲزd2b{%]{u,C 1 7jGNu;It24ЁyR2${W^T99]e@I0?|P9yOϫ?j% Qy]^G"4*Qېuu=>UDo( b`H: NsOw_߀?O^0> iG_!),x7G;` , }]K $ȁ ho x 1x~Aԁ I`"<W9 x 7>MD փ`; }Hc 8.?_WOO{@iFAh[`|  J>(2x \/@U 1f`̃$|63]k 'x^A- L $@;zl` :J> \7`n)n`7`$8 ]^wDBGX+a/enfK\^x3^rlJCg;~+%O~Bg;_>Lxu|LBgx`1!:,^ZYY~KilRVKB^X 9&佐ӀcvOӐQr = N%H}ȑEڇ9) ^ iY5KJ F;2'l È*n?'FtL)-1-LH:Y6:*e߇ b1+J!lu(vGv2ӧ!ORVӳ޼żx=Z0# q2]ҭh)k7 ۼx~܏vBvxwNj2]E ;_$+ޓ<ѓݞ "׻XB| ײѽž<Ꮼs 罗/ .;潺\:_3_ zi ۫je. 7j0y޻?(q[< y@>P?R?^:NJ!ByΣ}^i~m~͐F:8r .؎wNPi%vH݊lF)YTERKfVI0ւ"ǵSb'gV= Bb@W1OTS)>B'~Mcsdzuqԋ^:DjRԨG:v@*۾yojO#h{sx& Y [v?|rNyu9 rZMh'tuwnFb1BKXG+N$P*k;PKe5W3uem(O {GN:()|_7}×ODku݊l>Bn8Mz5ʺ6TL||ʾ-n'YFn\}<. v=;:q؃')99;1'%p1V{+]lԧ1^yAr0 !"߽hVS=*j5N.܃ىNfr"7Amj;w7t};!% ?@A?gyGKʉH1u>`u}j⾊.2^?B_mJ瘑 9F߄MF`AK͊o&cXnA,2>| *U(*5+V=`z+~9gqw ou>6^þmװ︆=/>eخUWWX~{U^j?[o' vO[=i.4a{9ů NY%CXـ%)8_~ p_:":/-QfI$ISU&gZfq]JQx`bb|lh`ra }b"%39sXz)MCi+aD1E#58aZnR<#c; fHE'y8M L8Hb1fԱqp'8+0mf|>9j53U4brLխx,<)Zb Ɂ)+3.Ҝ%+3R]1f.9nϧc<-Ǔi i䈕LP.](#Yx3g XYVXrгG'$n79;9_J;Y3m)&K]f>/mZWgt/zؚ6yږ䯔QiN_.iܜ1+_**"y"WQR];018NE>rÊõԻ\ښOvH_C+V=0!E U4k R\QµUk8+}ʧYT2JQkQd,P B׶>q\z@iL(]xYN٬CU؎gA>h%,Ki7M'TIMDl&=k̖6`0xP8kYy>LUL R>gf^Ŷh ,0ȏcY9)Sc, kG 5٨FqeeUj`㐖ˉ+ OA2'e!څta#9c,=svrxTcffr钕Y&o3k>nۊՃndsĄvv. HÚw]SeJ Yϥ{$wQUv iEd^Q@]!E*(GY*BzE<+%$DR:R'nel#?H0%DVɩ"xRħU咈޵WBݫ %LOWtu(ϋP EEaVSrlc]1U|Z]RϋJ[g?zN_=Vb!~TiUQt MULSUq]U]o!ӽ/^E),==V<^o&ĆZPc>-ķ:[o_<*]UD+khSp};565JݲT3JͬhVV n9icӆM]qX4k<8HӏǏ|%7lVq؀NQ35raMPV[kqhęګ Bym?+>WjQ@9*1UJ3j{".%U:|7h[2_[ WZ@\DCBJ;+z CAC?A-U =^B-1%a(}=~~귢+W(QM>TCi ݦeZ1DsK״"S܄=oi,(-KZZp@ _gE#+PO5/` ǹER%V"GGŵo%{h]+rK-*eQr@JIs2>IKߐ*;о ,VK5H}W(Vо f%8(d~3Aeu]MF.]yWDITo >s8*+4 y.)d/"^AnZt A`")e*A~|.:bOidjq~)_p?59@o˳4lum:bFtUDz)iCtđ|d{zsu$1_E.lJuk +y]\@GY%߮o[uKZk^y<+.{ d]Ȟ~|Zݞw{KAE-sKY3hu:%TڵP̩e]OuoMkQ{M82,h&12x724:b.~<nW_p晸wߤTaZ(' 8 ed7Dù0"C~)COӣ|YX' 래--̖;˶4=Z=LϽ4 7M0Id7I~dEVx^-"yq~=~x^l:N_|ދ7P`v\oU_kqug ?nw/\١7ɜ[|mob]*윥*fb6jV^Ѫ_11˹doQ1<-FDft17g^i ց[vkZ ΁Gh: ~M+7d#+)[2+ȹ)$~ck qCj`|@ܨiKf?hѮb+[e)Xjm1C5vQZaS>kkh[qmmU/xGGH_ww>+[:X/sG6G-sK:~Kw[x=ףLm![C|*_[U^k%x Khwܡ3xRn8x'V`~8CN\Ni1-dBǼa^ia Lx:UOkm|C'Cy=_PKG"vres/layout/activity_main.xmluJ@O$=A桇g HoK`kjZ=c8>!,vv30#Ż;V{crI=ɲyպ]^/l [J9$._UeѨpnyu=+p0U mzek\s;7|`]UR y"r&"+9OZ\Qg|O,?ie%!+'ƋDP/qoA:~PK=~ res/drawable/ic_launcher.png5PNG  IHDRשPLTE)!.H`D=768;er~D?:E8*  2GZ'  ڮ,%!)68.# JKKA@?#  2' 3DT ...  .; !&1 ///*6CC5'  ]1121F;2)667omk ~c omj  H;.  MNO544 ,,-111 &'&&111*!''&223&(&&%000!"&%$ !!# [|u\# RST776#G9,  -:"%*   1@IDA=DJCCCUUV{xu~754,,-{yw}{yZ[\srq[]^zwujiha``79:542\`cKMO988]_a϶^_a׶?>>hkn@ABvut788#"!$tRNSL  SZV6("Vj.ڨTr5T"\r9EhqnnJpDACAD?J?J?QG4V,vRN.=wIDAT(c`@F&f $ّ98/\XXDt8!!9SJZF.!'?k"pEbɥ@Ĥ+WQ$%%38$q-3+dyNn^~MĭBs6LViԃ`P^"qY.P:T =nlb@`hnyYkD{GgWwCo_k$ SBӦ30"pU(IENDB`PK#J;;res/drawable/banner.png5PNG  IHDR=2 IDATxymYgܭZ-P$;`YI` hqx!,/p !lDK ~c0hp](Qrȼy(YDߥWh>1_A̷0S4t-?gzW&j=$Hʕ‡}܈@k粙}i mY zχbyf3ǙŎy 1SQ轧<<اeµkі|핃"bǼоDBcsŏ/_aY;k)'{oZP*?N(NXN/JX^{;XXIJE9}`ʈ-U( /}Xvqv0_%rMoR#}EE(tЬuJzXJ1#} % (Ғ^~JuZ|Uše$kHxS|M>3@~^W3Z.בߞHH c&HqHEؘY˰Eǵzz֙@ G<%WZoA Kss,]f\#3~V\c+s^&TfL:~=~˿Ԋ E>7p+ F1~'DžԵ *Hasmܟhٺtm] =ز ! nl^)y $/Q~8O.}P=z•U~]\[&ī*{|NhFZ۪f~h z- -663`D, X*/s 碔Vzd?:Xt Q|$]|ዟ|r{|0{w_jk6vi|sG}tJƁ`Auh*alW^W^CeW*EN}&ADDta,̼f3C"#fr])o=7^{cc~ E׺i$ifQ]-(P/|9wׄ:M$8Q35L57Q..*XKvfxk滳y4N~v%GW?[GIwVH%#Pq5|yqfhm*7W*QM]~ }-xظ3ݶr=/_~"*ضz67u4`5lPz sV@깯etAF!;܀ `$Bq>-ov\LDLI'c"itZ|Prm0=LxNXp>?8a/U;lHr]TP,ƚ-,I"lFy+a"MHdfst~"e)'n'm>I"sVy0hsF TJ4Uw~?ru5YPvrbku݁ٱ>o+ˆlFy^$Rc=~&s~fwC{oIq}w]|QvI'oЬ9/\>M\V4Er7nmv}SF9k]LD!R1Z[QgyYjs2[|!3 u$܄A›Ǥh<%|x7. (H@Q (Crbi ,[ܾ**w]4yđyz6zh2ɶ6nWnj>(ԨYVGzD$]!lIT67.^biPHl ]AX`{YQܦ-4@O|ȹV4\GF^#X>wZqw֫gؠ&Fo/yTJ%jIhBfȴ|#o9'!Eۼ7`avWrM%8@wH+ v'w^ߍr]*4@KKIoE9q @٤VRa$EJ}KW+mt09ܳƿKFpLdXDm B1zCܰF4]ɫ=g}%n+X(aq ۗmutk0p؎77,T"B۾xZ!9Њ"nBض)б_en:Lw:o_4Q&%ٗrJ܄@oPuji;Ny1X7\yQW;Vv)߾h: Pn8]vĜu3 0Y-!0  ;&0LHY5e b1DgiΗs RV犳 94-Z{C݀y5?cmɫ;<'fc:&DD`-\ /c>7H2q :N Qq-#G kt3/8$®۽7`z@R"g' iR1eFIt AG( L^#S0p}}m(α ƘymXo;o cOnssn(Rez[g@ % ^֌Z5I,YY#޶F t@0dz Ix؄! & l}rL3{a F 1[Sa4 F3̢_EW, 54h7`8FI4+ L5gd*F75Pʼ E!x Gt: 4Wm$hl+&}@=5c`kI!S`[ x:Vk0w03砥z`6pU_b68C ж D=|XiVZ$Ѫ9 sz׃ ;=0' %}\(~\(g!D6  ᫨tŝ擸ChA@F0⃏2%jEura꾏ġDTx7+Pޕ>"82GQ¥+f/v]A9ʱǢ+D1ys_Ƒ982wJCof)kǰ|HEDQ pQ|@$2n~q(lx;Ċ3%_(e* r$"/C3e8H-1XȽP`~e\D)gq,@YL" L 8?_ Ĺ{օx;ty 7:-X5O c9xX̽c,IB뱜0{ީx #ƥ_!ș@H\=RN6(} ^ NZVx<3o_M<r<`XåoA05ʺ6m$ 62佛n1 9ԆZA}3Ti,fܷ]均0{o@G7"fL6Ȩs6?*dƞQXȾM3x)4ك&]6Sed}}Bsoyrz^rPy뉌7+ O,0uޛc_K?'1CŒzr |5Mt-PpƘ#aG-(מ@ @AInSf5Sqw,GUtX1{-[>wԬ0,b| y5~^ -v$ 4D$@q[d3wJU0N؎$L0աCz$Ns 6jS뷳L,j3bRYutdܪ:H"1!Z<ӕD͊-/|1_uT@ HC9 ; & =M8 ><-jc㍶`M.ŽD>3AՋ@0d%F2m}RRh+Zƛ:,/+e c!48yOi 6G7>|r {ULBH򶆠czo<-7g%a:՞hkqѴ #D,~>[0hAӔ;>,󡙒a,~A1ZU^R]7gZI4îj5d|cKKt*J;y&\RozGxW' 3׵3B!Kq4ե'GtGΰ6A'EYu_޸?w /pTw5 Hn,7u6ue2.!",/K23ڈ<E166p4?:>gDϣ}#>t@| LV'ǁ^mzf3 ES܁@l-•V+t Q|YٲcLYT`y0Vgp-`b᪳N 31 Br" 6mkcҚƭ[6њOH)ҕ+™[PڲK2Fl|0{D Dv@1`@D2H@(d  :BFƆs=ꂈ=P+$*C^-e!=e_=I15Q7QuQ90t"ļd?N::$DN9o..>qM?'CBK$h@u}2|G֨$ ǜ;9e{uIT_K7D;U?KSb_t-_{_B}-!5Ӱ򑐪ÿ2*A9J@O[4@`-txcM;Vm@0FUV"d0ԓ4yxfePZҌno)/HXNb$ j`Z 倄dZXkz=Rf51m!98s ǙOJ1F>?FdcydL꒕d6 ɂ<BdhWPfj #ذ {QuzDLvyBi6w&Unw~,%B>d/Hwx+BHu͎YC8i[-p8q> ^"KPbzo>j8~^`첅nԑx8)A~** 2{j,ǁ Ѝ:L ԄL6 ,S9SMh{Zj*x~YB4q9Ln6w&L05DR s#^_9B*jR#-I`t/Tyu]FQr:I ( @H*r \ɀ\/`.@R4nx}˩ S40ooL9" %mf(m4aϽnh9o9lXr_fNV3?j=pR<*;)n4HJ,T8p<;M'HVWF]dW ^+е*I6I58>`>@Xt,™im#^ZIXZAx6ljn" n4>D0O q j™_Ax@7YPյe { D+wzG2%/'IRy:0OG`]Bn5aD=ffssWW~}bOXq'm}ACOg`RPت:p-#؄n6Hݎ7U~;Gv:K!|ĩ6k ?/@ zm@@>~}ئ@WЍ㗙lOo6-zclL}[rfv&!tes?!7=d65 ?)T݄f!`A"PtL cDz"Wa^nG9S>e;И!!f \@@k-5l]viNF7yn]!2H?sز[b T}$D)@YD|v[>,T {}NI =P) Zuq\n T T}FlC}*­\e]R( AMyמs98.,!ZCQmǀ3p;b z1PBH40OX(#n 3=KFJYNgLI[,ܥsPR ޿vƞ %!DvKiprY[Ɂ8IRi9FNSo @FcuϧTpLJpӄ vu s`1T 'V˱fa=P; 2Y|itsTUq*'&PR9M8S,I`rȍBD ;&{`dA3<[# PCPt j> Cp\\w54;z  =,M}"IJ@$'!$|"fRg6I`uyS){Y J[W:fLY{[8"I)Ł4?v4P!2qg>&;$JZj?jX(Rm]\J[<|0\8 pffGBRl>Bɥ;hyI,}} IZ 98KˠLlHFd2pD06t߹{VrHƿ'q2C|z[ ;FCX繁RH*=Uy3 ~4GGgnaLQdc}Q|>=rJCVXo$$yN n!܄|?󐍖Ԋ(2Z-5-pe2U3P33[M+ۃΞ5;wTu$[ִ2۬UA57?]X栛MfE[.c<N U**Qf$ Zu`ijf&MyZ O2'|Xߛ$"F&dBJНtWBBi\"'^C~?8O({eO{S }{.-#4V%"[GnRBpY 8a&Ҭ^k`=Ҵ_~亩=|00kCs.- L'|}لljq ʝF@VVkR- <2Jr2x_xfPy/ ΁}0GrptogN)>R6T+srXș=9e.~>xȻZu[cQ3PT휱G❔J]Z ] whpc:LqdsRHKU,]Z>U) )wؘTHjW6`D6{V$ph}W[=w 7? yDNZlc}OO99W6qq] Tf\ =#4/}ޅ Z!Xk0d)=ѡݫcԙ*HW=w4G@{߇{4j& aV@T+P3iRr=;[Ԙu'=8=ׂP2ܥS'xh~y|q6!╕^@m2'ҟ<@&^ֺW7`Z큑&&E 53 w~:iSa"' ݔ9HGtoՠk5@9iN^}o4^vm[S8r/z4-uǒ,R9keD.ZM ֎)ƶ@5vpϏ$_*lQgH<XI53 g[MfPֶ $}[dsPO)W|4!@YJ{Z ˃gR7nہ ÁO#7! }"f4[xW&F PओptY'f~rO߼Eg -8N}WnS) D}+Qs[>b[) $ @H* t7Ntx6J2^OK-|?z7mi;DZ nE R9L҇V_d_pGp".Գ6hL J:j5RYVex71ubc=IqdBPTO+OMGM!ʗD hA1ԀMN֕͛OSIqmQaC:Npc)tQHw* g?9b ѳvE>`7nGusT #k"-߶h4ѓI6 =SH*rl슸v nѰʔ!Ԯ4@t{Cvې to'sik[lY0M@# L PKp#vj/B܁pBl$b#<=h{}6-ҝ2kO.uքih(}$p;IdJD1h[x ʔVWd1#KJB#Cqt*3&Ӳ+6?^hmcLs=t!f 4 -٫NHJV~ԤK@IV; _; W,o%6W{-XZ <*{e59 ]kW3ZjG t]*!T ',@ㇹVlvpV8r[ϋ8.y x@~÷[xcbvd8^i 摓)PKLMETA-INF/CERT.SFuM0;߁n (/T⢗I]Dk&3̸{k4X I[8d$:rK$T2}W[(JKsSRTMqx%- a$<ccC{%0G Ë_-bV(Ʒ=%%,H||:" *iŽǦxhǩfcXNf?4C28GX$3VO Ԟyݝ.oY }sxuՅI/G厀=k]|7[wk,AO_MmcqR_FwK!X9#!,&9aLrb9Ia^8ėvq,ԃ: ד.yyD~5N^sX߅7^M ^`it@OQ?7VxkPKnWiMETA-INF/CERT.RSA3hbajhδAO&FFC~^6΄6Tf&FVnBM/ f&F&&[ a@-l̡,lL| 0c^JQ~fHY*Tn 'khd`adadhdf`%kB8ٍ@o1724v2562ljf-Q?nf:}`ʃV'?VK5yʮAlMI2<;lLsids>|WoNB.]EXGj1sfG_dbfd`Dv0]}eKOdU֯'"nUޓf#f~Is(* ޫy_l^\[|ؿ)' Yҫ2"00NP=7h0  *H 071 0 UUS10U Android10U Android Debug0 120828212600Z 420821212600Z071 0 UUS10U Android10U Android Debug00  *H 0U>MZiQ@:ɧK&e7.]p]Xd-Fs_ȩ˹k#K_܇Ԏ L؍~b4G'8]&\[0  *H m!y5Df3:{.ȃX%M#fP<+7eL|ȡ),'J L#ORqq8F#"8[2bk ʳM@ _MZiQ@:ɧK&e7.]p]Xd-Fs_ȩ˹k#K_܇Ԏ L؍~b4G'8]&\[APK Sig Block 42PK AndroidManifest.xmlPKnWibMETA-INF/CERT.RSAPKL`META-INF/CERT.SFPK}^META-INF/MANIFEST.MFPK (k% classes.dexPK#J;; !#res/drawable/banner.pngPK=~ res/drawable/ic_launcher.pngPKG"v res/layout/activity_main.xmlPK9TT Nresources.arscPK Nh././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/entry.json0000644000175000017500000000035614620351225017151 0ustar00hanshans{ "timestamp": 1676634233000, "version": 20002, "index": { "name": "/index-v2.json", "sha256": "4a36d8cdb5b7a9e59d8c2e9e2a81b968db975901ff7dac12ca15449acf07cf35", "size": 53527, "numPackages": 10 }, "diffs": {} }././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/fake.ota.update_1234.zip0000644000175000017500000000035114620351225021256 0ustar00hanshansPK McI'fake.ota.update.placeholderUT XXux Don Nov 3 09:45:02 CET 2016 PK McI'fake.ota.update.placeholderUTXux PKar././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/index-v1.json0000644000175000017500000006146714620351225017455 0ustar00hanshans{ "repo": { "timestamp": 1676634233000, "version": 20002, "name": "My First F-Droid Repo Demo", "icon": "icon.png", "address": "https://MyFirstFDroidRepo.org/fdroid/repo", "description": "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid.", "mirrors": [ "http://foobarfoobarfoobar.onion/fdroid/repo", "https://foo.bar/fdroid/repo" ] }, "requests": { "install": [ "org.adaway" ], "uninstall": [ "com.android.vending", "com.facebook.orca" ] }, "apps": [ { "categories": [ "Phone & SMS" ], "suggestedVersionName": "0.9", "suggestedVersionCode": "9", "description": "In order to keep away curious eyes, SMS-bypass filters incoming SMS messages\nbefore they reach your inbox. Based on bughunter2.smsfilter.\n\nFeatures:\n\n* Discrete fake app \"Battery level\": Long tap on Battery percentage will show SMS.\n* Filter incoming SMS specified address: redirect the SMS to SMS-bypass messages list; remove SMS arrival sound or vibration; show a discreet notification icon (battery level); vibrate if checked in settings\n* Add contact from contact list\n* Export messages to a text file", "donate": "http://rodolphe.souchaud.free.fr/donate", "flattrID": "cad90e036b975ed129a3ce80a0750466", "issueTracker": "https://gitlab.com/souch/SMSbypass/issues", "license": "GPL-3.0-only", "sourceCode": "https://gitlab.com/souch/SMSbypass/tree/HEAD", "summary": "Filter SMS and show them in a fake app", "webSite": "https://gitlab.com/souch/SMSbypass", "added": 1524700800000, "icon": "souch.smsbypass.9.png", "packageName": "souch.smsbypass", "lastUpdated": 1524700800000, "localized": { "en-US": { "name": "Battery level" } } }, { "categories": [ "Development" ], "suggestedVersionCode": "4", "license": "Unknown", "name": "Caffeine Tile", "summary": "Test app for extracting icons when an XML one is default", "added": 1539129600000, "packageName": "info.zwanenburg.caffeinetile", "lastUpdated": 1539129600000 }, { "categories": [ "tests" ], "suggestedVersionCode": "9999999", "license": "Unknown", "name": "Duplicate Permisssions", "summary": "Test app for all possible ", "added": 1513900800000, "icon": "duplicate.permisssions.9999999.png", "packageName": "duplicate.permisssions", "lastUpdated": 1513900800000 }, { "categories": [ "System" ], "suggestedVersionName": "0.2.1", "suggestedVersionCode": "2000", "description": "F-Droid can make use of system privileges or permissions to\ninstall, update and remove applications on its own. The only way to obtain those\nprivileges is to become a system app.\n\nThis is where the Privileged Extension comes in - being a separate app and much\nsmaller, it can be installed as a system app and communicate with the main app\nvia AIDL IPC.\n\nThis has several advantages:\n\n* Reduced disk usage in the system partition\n* System updates don't remove F-Droid\n* The process of installing into system via root is safer\n\nThis is packaged as an OTA (Over-The-Air) update ZIP file. It must be installed\nusing TWRP or other Android recovery that can flash updates to the system from\nthe /data/data/org.fdroid.fdroid folder on the /data partition. The standalone\nAPK is called F-Droid Privileged Extension.", "donate": "https://f-droid.org/about", "issueTracker": "https://gitlab.com/fdroid/privileged-extension/issues", "license": "Apache-2.0", "sourceCode": "https://gitlab.com/fdroid/privileged-extension", "summary": "Tests whether OTA ZIP files are being include", "webSite": "https://f-droid.org", "added": 1457568000000, "packageName": "fake.ota.update", "lastUpdated": 1457568000000, "localized": { "en-US": { "name": "fake.ota.update_1234" } } }, { "categories": [ "Development" ], "suggestedVersionCode": "987", "license": "Unknown", "name": "No minSdkVersion or targetSdkVersion", "summary": "An APK without any block in AndroidManifest.xml", "added": 1539129600000, "icon": "no.min.target.sdk.987.png", "packageName": "no.min.target.sdk", "lastUpdated": 1539129600000 }, { "bitcoin": "1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk", "categories": [ "Development" ], "suggestedVersionCode": "99999999", "liberapay": "12334", "license": "GPL-3.0-only", "sourceCode": "https://github.com/eighthave/urzip", "added": 1388448000000, "icon": "obb.main.oldversion.1444412523.png", "packageName": "obb.main.oldversion", "lastUpdated": 1388448000000, "localized": { "en-US": { "name": "OBB Main Old Version" } } }, { "bitcoin": "1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk", "categories": [ "Development" ], "suggestedVersionCode": "99999999", "license": "GPL-3.0-only", "sourceCode": "https://github.com/eighthave/urzip", "added": 1444608000000, "icon": "obb.main.twoversions.1101617.png", "packageName": "obb.main.twoversions", "lastUpdated": 1466380800000, "localized": { "en-US": { "name": "OBB Main Two Versions" } } }, { "bitcoin": "1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk", "categories": [ "Development" ], "suggestedVersionCode": "99999999", "license": "GPL-3.0-only", "sourceCode": "https://github.com/eighthave/urzip", "added": 1461369600000, "icon": "obb.mainpatch.current.1619.png", "packageName": "obb.mainpatch.current", "lastUpdated": 1496275200000, "localized": { "en-US": { "featureGraphic": "featureGraphic_ffhLaojxbGAfu9ROe1MJgK5ux8d0OVc6b65nmvOBaTk=.png", "icon": "icon_WI0pkO3LsklrsTAnRr-OQSxkkoMY41lYe2-fAvXLiLg=.png", "name": "OBB Main/Patch Current", "phoneScreenshots": [ "screenshot-main.png" ], "sevenInchScreenshots": [ "screenshot-tablet-main.png" ] } } }, { "antiFeatures": [ "NoSourceSince", "NonFreeNet" ], "categories": [ "Multimedia", "Security", "Time" ], "suggestedVersionName": "1.5", "suggestedVersionCode": "6", "description": "Activates silent mode during calendar events.", "issueTracker": "https://github.com/miguelvps/PoliteDroid/issues", "license": "GPL-3.0-only", "sourceCode": "https://github.com/miguelvps/PoliteDroid", "summary": "Calendar tool", "added": 1498176000000, "icon": "com.politedroid.6.png", "packageName": "com.politedroid", "lastUpdated": 1498176000000, "localized": { "en-US": { "name": "Polite Droid" } } }, { "authorWebSite": "https://guardianproject.info", "bitcoin": "1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk", "categories": [ "Development", "GuardianProject", "1", "2.0" ], "suggestedVersionCode": "2147483647", "description": "It\u2019s Urzip \u662f\u4e00\u4e2a\u83b7\u5f97\u5df2\u5b89\u88c5 APK \u76f8\u5173\u4fe1\u606f\u7684\u5b9e\u7528\u5de5\u5177\u3002\u5b83\u4ece\u60a8\u7684\u8bbe\u5907\u4e0a\u5df2\u5b89\u88c5\u7684\u6240\u6709\u5e94\u7528\u5f00\u59cb\uff0c\u4e00\u952e\u89e6\u6478\u5373\u53ef\u663e\u793a APK \u7684\u6307\u7eb9\uff0c\u5e76\u4e14\u63d0\u4f9b\u5230\u8fbe virustotal.com \u548c androidobservatory.org \u7684\u5feb\u6377\u94fe\u63a5\uff0c\u8ba9\u60a8\u65b9\u4fbf\u5730\u4e86\u89e3\u7279\u5b9a APK \u7684\u6863\u6848\u3002\u5b83\u8fd8\u53ef\u4ee5\u8ba9\u60a8\u5bfc\u51fa\u7b7e\u540d\u8bc1\u4e66\u548c\u751f\u6210 ApkSignaturePin Pin \u6587\u4ef6\u4f9b TrustedIntents \u5e93\u4f7f\u7528\u3002\n\n\u2605 Urzip \u652f\u6301\u4e0b\u5217\u8bed\u8a00\uff1a Deutsch, English, espa\u00f1ol, suomi, \u65e5\u672c\u8a9e, \ud55c\uad6d\uc5b4, Norsk, portugu\u00eas (Portugal), \u0420\u0443\u0441\u0441\u043a\u0438\u0439, Sloven\u0161\u010dina, T\u00fcrk\u00e7e\n\u6ca1\u770b\u5230\u60a8\u7684\u8bed\u8a00\uff1f\u5e2e\u5fd9\u7ffb\u8bd1\u672c\u5e94\u7528\u5427\uff1a\nhttps://www.transifex.com/projects/p/urzip\n\n\u2605 \u81f4\u7528\u6237\uff1a\u6211\u4eec\u8fd8\u7f3a\u5c11\u4f60\u559c\u6b22\u7684\u529f\u80fd\uff1f\u53d1\u73b0\u4e86\u4e00\u4e2a bug\uff1f\u8bf7\u544a\u8bc9\u6211\u4eec\uff01\u6211\u4eec\u4e50\u4e8e\u542c\u53d6\u60a8\u7684\u610f\u89c1\u3002\u8bf7\u53d1\u9001\u7535\u5b50\u90ae\u4ef6\u81f3: support@guardianproject.info \u6216\u8005\u52a0\u5165\u6211\u4eec\u7684\u804a\u5929\u5ba4 https://guardianproject.info/contact\n", "issueTracker": "https://dev.guardianproject.info/projects/urzip/issues", "license": "GPL-3.0-only", "openCollective": "f-droid-just-testing", "sourceCode": "https://github.com/guardianproject/urzip", "summary": "\u4e00\u4e2a\u5b9e\u7528\u5de5\u5177\uff0c\u83b7\u53d6\u5df2\u5b89\u88c5\u5728\u60a8\u7684\u8bbe\u5907\u4e0a\u7684\u5e94\u7528\u7684\u6709\u5173\u4fe1\u606f", "webSite": "https://dev.guardianproject.info/projects/urzip", "added": 1466640000000, "icon": "info.guardianproject.urzip.100.png", "packageName": "info.guardianproject.urzip", "lastUpdated": 1466640000000, "localized": { "en-US": { "description": "full description\n", "featureGraphic": "featureGraphic_GFRT5BovZsENGpJq1HqPODGWBRPWQsx25B95Ol5w_wU=.png", "icon": "icon_NJXNzMcyf-v9i5a1ElJi0j9X1LvllibCa48xXYPlOqQ=.png", "name": "title", "summary": "short description", "video": "video", "whatsNew": "default" } } } ], "packages": { "com.politedroid": [ { "added": 1498176000000, "antiFeatures": [ "KnownVuln", "NonFreeAssets", "UpstreamNonFree" ], "apkName": "com.politedroid_6.apk", "hash": "70c2f776a2bac38a58a7d521f96ee0414c6f0fb1de973c3ca8b10862a009247d", "hashType": "sha256", "minSdkVersion": 14, "packageName": "com.politedroid", "sig": "b4964fd759edaa54e65bb476d0276880", "signer": "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6", "size": 16578, "targetSdkVersion": 21, "uses-permission": [ [ "android.permission.READ_CALENDAR", null ], [ "android.permission.RECEIVE_BOOT_COMPLETED", null ] ], "versionCode": 6, "versionName": "1.5" }, { "added": 1498176000000, "apkName": "com.politedroid_5.apk", "hash": "5bdbfa071cca4b8d05ced41d6b28763595d6e8096cca5bbf0f9253c9a2622e5d", "hashType": "sha256", "minSdkVersion": 3, "packageName": "com.politedroid", "sig": "b4964fd759edaa54e65bb476d0276880", "signer": "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6", "size": 18817, "targetSdkVersion": 10, "uses-permission": [ [ "android.permission.READ_CALENDAR", null ], [ "android.permission.RECEIVE_BOOT_COMPLETED", null ] ], "versionCode": 5, "versionName": "1.4" }, { "added": 1498176000000, "apkName": "com.politedroid_4.apk", "hash": "c809bdff83715fbf919f3840ee09869b038e209378b906e135ee40d3f0e1f075", "hashType": "sha256", "minSdkVersion": 3, "packageName": "com.politedroid", "sig": "b4964fd759edaa54e65bb476d0276880", "signer": "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6", "size": 18489, "uses-permission": [ [ "android.permission.READ_CALENDAR", null ], [ "android.permission.RECEIVE_BOOT_COMPLETED", null ], [ "android.permission.WRITE_EXTERNAL_STORAGE", null ], [ "android.permission.READ_PHONE_STATE", null ], [ "android.permission.READ_EXTERNAL_STORAGE", null ] ], "versionCode": 4, "versionName": "1.3" }, { "added": 1498176000000, "antiFeatures": [ "KnownVuln", "NonFreeAssets", "UpstreamNonFree" ], "apkName": "com.politedroid_3.apk", "hash": "665d03d61ebc642289fda697f71a59305b0202b16cafc5ffdae91cbe91f0b25d", "hashType": "sha256", "minSdkVersion": 3, "packageName": "com.politedroid", "sig": "b4964fd759edaa54e65bb476d0276880", "signer": "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6", "size": 17552, "uses-permission": [ [ "android.permission.READ_CALENDAR", null ], [ "android.permission.RECEIVE_BOOT_COMPLETED", null ], [ "android.permission.WRITE_EXTERNAL_STORAGE", null ], [ "android.permission.READ_PHONE_STATE", null ], [ "android.permission.READ_EXTERNAL_STORAGE", null ] ], "versionCode": 3, "versionName": "1.2" } ], "duplicate.permisssions": [ { "added": 1513900800000, "apkName": "duplicate.permisssions_9999999.apk", "hash": "8367857fe75f85321ce2c344b34804d0bc193707f6ba03710d025d9030803434", "hashType": "sha256", "minSdkVersion": 18, "packageName": "duplicate.permisssions", "sig": "056c9f1554c40ba59a2103009c82b420", "signer": "659e1fd284549f70d13fb02c620100e27eeea3420558cce62b0f5d4cf2b77d84", "size": 27446, "targetSdkVersion": 27, "uses-permission": [ [ "android.permission.INTERNET", null ], [ "android.permission.ACCESS_NETWORK_STATE", null ], [ "android.permission.ACCESS_WIFI_STATE", null ], [ "android.permission.CHANGE_WIFI_MULTICAST_STATE", null ], [ "android.permission.INTERNET", null ], [ "android.permission.WRITE_EXTERNAL_STORAGE", 18 ], [ "android.permission.READ_EXTERNAL_STORAGE", 18 ] ], "uses-permission-sdk-23": [ [ "android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS", 27 ], [ "android.permission.REQUEST_INSTALL_PACKAGES", null ] ], "versionCode": 9999999 } ], "fake.ota.update": [ { "added": 1457568000000, "apkName": "fake.ota.update_1234.zip", "hash": "897a92a4ccff4f415f6ba275b2af16d4ecaee60a983b215bddcb9f8964e7a24c", "hashType": "sha256", "packageName": "fake.ota.update", "size": 233, "versionCode": 1234, "versionName": "897a92a" } ], "info.guardianproject.urzip": [ { "added": 1466640000000, "apkName": "urzip-; \u0420\u0430\u0445\u043c\u0430\u0301, [r\u0250x\u02c8man\u02b2\u026an\u0259f] \u0633\u064a\u0631\u062c\u064a_\u0631\u062e\u0645\u0627\u0646\u064a\u0646\u0648\u0641 \u8c22\u00b7.apk", "hash": "15c0ec72c74a3791f42cdb43c57df0fb11a4dbb656851bbb8cf05b26a8372789", "hashType": "sha256", "minSdkVersion": 4, "packageName": "info.guardianproject.urzip", "sig": "b4964fd759edaa54e65bb476d0276880", "signer": "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6", "size": 11471, "targetSdkVersion": 18, "versionCode": 100, "versionName": "0.1" } ], "info.zwanenburg.caffeinetile": [ { "added": 1539129600000, "apkName": "info.zwanenburg.caffeinetile_4.apk", "hash": "dbbdd7deadb038862f426b71efe4a64df8c3edf25d669e935f349510e16f65db", "hashType": "sha256", "minSdkVersion": 24, "packageName": "info.zwanenburg.caffeinetile", "sig": "03f9b2f848d22fd1d8d1331e8b1b486d", "signer": "51cfa5c8a743833ad89acf81cb755936876a5c8b8eca54d1ffdcec0cdca25d0e", "size": 11740, "targetSdkVersion": 25, "uses-permission": [ [ "android.permission.WAKE_LOCK", null ] ], "versionCode": 4, "versionName": "1.3" } ], "no.min.target.sdk": [ { "added": 1539129600000, "apkName": "no.min.target.sdk_987.apk", "hash": "e2e1dc1d550df2b5bc383860139207258645b5540abeccd305ed8b2cb6459d2c", "hashType": "sha256", "minSdkVersion": 3, "packageName": "no.min.target.sdk", "sig": "b4964fd759edaa54e65bb476d0276880", "signer": "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6", "size": 14102, "uses-permission": [ [ "android.permission.WRITE_EXTERNAL_STORAGE", null ], [ "android.permission.READ_PHONE_STATE", null ], [ "android.permission.READ_EXTERNAL_STORAGE", null ] ], "versionCode": 987, "versionName": "1.2-fake" } ], "obb.main.oldversion": [ { "added": 1388448000000, "apkName": "obb.main.oldversion_1444412523.apk", "hash": "c5f149e526f89c05c62923bdb7bb1e2be5673c46ec85143f41e514340631449c", "hashType": "sha256", "minSdkVersion": 4, "obbMainFile": "main.1434483388.obb.main.oldversion.obb", "obbMainFileSha256": "d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7", "packageName": "obb.main.oldversion", "sig": "eb41d4d6082bb3e81c3d58dbf7fc7332", "signer": "818e469465f96b704e27be2fee4c63ab9f83ddf30e7a34c7371a4728d83b0bc1", "size": 14323, "targetSdkVersion": 18, "uses-permission": [ [ "android.permission.INTERNET", null ], [ "android.permission.ACCESS_NETWORK_STATE", 22 ], [ "android.permission.ACCESS_WIFI_STATE", null ], [ "android.permission.CHANGE_WIFI_MULTICAST_STATE", null ], [ "android.permission.CHANGE_NETWORK_STATE", null ], [ "android.permission.CHANGE_WIFI_STATE", null ], [ "android.permission.BLUETOOTH", null ], [ "android.permission.BLUETOOTH_ADMIN", 18 ], [ "android.permission.RECEIVE_BOOT_COMPLETED", null ], [ "android.permission.NFC", null ] ], "uses-permission-sdk-23": [ [ "android.permission.WRITE_EXTERNAL_STORAGE", null ], [ "android.permission.WRITE_SETTINGS", 25 ] ], "versionCode": 1444412523, "versionName": "0.1" } ], "obb.main.twoversions": [ { "added": 1466380800000, "apkName": "obb.main.twoversions_1101617.apk", "hash": "9bc74566f089ef030ac33e7fbd99d92f1a38f363fb499fed138d9e7b774e821c", "hashType": "sha256", "minSdkVersion": 4, "obbMainFile": "main.1101615.obb.main.twoversions.obb", "obbMainFileSha256": "d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7", "packageName": "obb.main.twoversions", "sig": "b4964fd759edaa54e65bb476d0276880", "signer": "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6", "size": 11481, "srcname": "obb.main.twoversions_1101617_src.tar.gz", "targetSdkVersion": 18, "versionCode": 1101617, "versionName": "0.1" }, { "added": 1451606400000, "apkName": "obb.main.twoversions_1101615.apk", "hash": "7b0b7b9ba248e15751a16e3a0e01e1e24cbb673686c38422030cb75d5c33f0bb", "hashType": "sha256", "minSdkVersion": 4, "obbMainFile": "main.1101615.obb.main.twoversions.obb", "obbMainFileSha256": "d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7", "packageName": "obb.main.twoversions", "sig": "b4964fd759edaa54e65bb476d0276880", "signer": "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6", "size": 11480, "targetSdkVersion": 18, "versionCode": 1101615, "versionName": "0.1" }, { "added": 1444608000000, "apkName": "obb.main.twoversions_1101613.apk", "hash": "cce97a52ff18d843185be7f22ecb1a557c36b7a9f8ba07a8be94e328e00b35dc", "hashType": "sha256", "minSdkVersion": 4, "obbMainFile": "main.1101613.obb.main.twoversions.obb", "obbMainFileSha256": "d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7", "packageName": "obb.main.twoversions", "sig": "b4964fd759edaa54e65bb476d0276880", "signer": "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6", "size": 11477, "targetSdkVersion": 18, "versionCode": 1101613, "versionName": "0.1" } ], "obb.mainpatch.current": [ { "added": 1461369600000, "apkName": "obb.mainpatch.current_1619.apk", "hash": "eda5fc3ecfdac3252717e36bdbc9820865baeef162264af9ba5db7364f0e7a0c", "hashType": "sha256", "minSdkVersion": 4, "obbMainFile": "main.1619.obb.mainpatch.current.obb", "obbMainFileSha256": "d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7", "obbPatchFile": "patch.1619.obb.mainpatch.current.obb", "obbPatchFileSha256": "d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7", "packageName": "obb.mainpatch.current", "sig": "b4964fd759edaa54e65bb476d0276880", "signer": "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6", "size": 11479, "targetSdkVersion": 18, "versionCode": 1619, "versionName": "0.1" }, { "added": 1496275200000, "apkName": "obb.mainpatch.current_1619_another-release-key.apk", "hash": "42e7d6d2f8254aaf9fe95ba6ecc233ee8c3cd543a3e4f3f9ebe1b638221122fa", "hashType": "sha256", "minSdkVersion": 4, "obbMainFile": "main.1619.obb.mainpatch.current.obb", "obbMainFileSha256": "d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7", "obbPatchFile": "patch.1619.obb.mainpatch.current.obb", "obbPatchFileSha256": "d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7", "packageName": "obb.mainpatch.current", "sig": "4cbb9827107da5ab4f34228fa997fbf8", "signer": "ce9e200667f02d96d49891a2e08a3c178870e91853d61bdd33ef5f0b54701aa5", "size": 10541, "targetSdkVersion": 18, "versionCode": 1619, "versionName": "0.1" } ], "souch.smsbypass": [ { "added": 1524700800000, "apkName": "souch.smsbypass_9.apk", "hash": "80b0ae68a1189baa3ee6717092e3dbf1a4210165f7f7e5f2f9616bd63a2ec01d", "hashType": "sha256", "minSdkVersion": 8, "packageName": "souch.smsbypass", "sig": "e50c99753cd45e2736d52cb49be07581", "signer": "d3aec784b1fd71549fc22c999789122e3639895db6bd585da5835fbe3db6985c", "size": 81295, "targetSdkVersion": 18, "uses-permission": [ [ "android.permission.RECEIVE_SMS", null ], [ "android.permission.SEND_SMS", null ], [ "android.permission.READ_CONTACTS", null ], [ "android.permission.WRITE_EXTERNAL_STORAGE", null ], [ "android.permission.VIBRATE", null ], [ "android.permission.READ_EXTERNAL_STORAGE", null ] ], "versionCode": 9, "versionName": "0.9" } ] } }././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/index-v2.json0000644000175000017500000015042714620351225017451 0ustar00hanshans{ "repo": { "name": { "en-US": "My First F-Droid Repo Demo" }, "description": { "en-US": "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." }, "icon": { "en-US": { "name": "/icons/icon.png", "sha256": "b1f27fa87f8cabca50cdcd462a0f500d79d883b965a498d0e49eea560b39be1f", "size": 715 } }, "address": "https://MyFirstFDroidRepo.org/fdroid/repo", "mirrors": [ { "isPrimary": true, "url": "https://MyFirstFDroidRepo.org/fdroid/repo" }, { "url": "http://foobarfoobarfoobar.onion/fdroid/repo" }, { "url": "https://foo.bar/fdroid/repo" } ], "timestamp": 1676634233000, "antiFeatures": { "Ads": { "description": { "de": "Diese App enthält Werbung", "en-US": "This app contains advertising", "fa": "این کاره دارای تبلیغات است", "ro": "Aplicația conține reclamă", "zh-rCN": "此应用包含广告" }, "icon": { "de": { "name": "/icons/ic_antifeature_ads.xml", "sha256": "b333528573134c5de73484862a1b567a0bdfd6878d183f8500287abadc0ba60e", "size": 1564 }, "en-US": { "name": "/icons/ic_antifeature_ads.xml", "sha256": "b333528573134c5de73484862a1b567a0bdfd6878d183f8500287abadc0ba60e", "size": 1564 }, "fa": { "name": "/icons/ic_antifeature_ads.xml", "sha256": "b333528573134c5de73484862a1b567a0bdfd6878d183f8500287abadc0ba60e", "size": 1564 }, "ro": { "name": "/icons/ic_antifeature_ads.xml", "sha256": "b333528573134c5de73484862a1b567a0bdfd6878d183f8500287abadc0ba60e", "size": 1564 }, "zh-rCN": { "name": "/icons/ic_antifeature_ads.xml", "sha256": "b333528573134c5de73484862a1b567a0bdfd6878d183f8500287abadc0ba60e", "size": 1564 } }, "name": { "de": "Werbung", "en-US": "Ads", "fa": "تبلیغات", "ro": "Reclame", "zh-rCN": "广告" } }, "DisabledAlgorithm": { "description": { "de": "Diese App hat eine schwache Sicherheitssignatur", "en-US": "This app has a weak security signature", "fa": "این کاره، امضای امنیتی ضعیفی دارد", "ro": "Aplicația are o semnătură slab securizată", "zh-rCN": "此应用的安全签名较弱" }, "icon": { "de": { "name": "/icons/ic_antifeature_disabledalgorithm.xml", "sha256": "94dea590c7c0aa37d351ab62a69fc7eefbc2cdbb84b79df3934c2e9332e1dcfb", "size": 2313 }, "en-US": { "name": "/icons/ic_antifeature_disabledalgorithm.xml", "sha256": "94dea590c7c0aa37d351ab62a69fc7eefbc2cdbb84b79df3934c2e9332e1dcfb", "size": 2313 }, "fa": { "name": "/icons/ic_antifeature_disabledalgorithm.xml", "sha256": "94dea590c7c0aa37d351ab62a69fc7eefbc2cdbb84b79df3934c2e9332e1dcfb", "size": 2313 }, "ro": { "name": "/icons/ic_antifeature_disabledalgorithm.xml", "sha256": "94dea590c7c0aa37d351ab62a69fc7eefbc2cdbb84b79df3934c2e9332e1dcfb", "size": 2313 }, "zh-rCN": { "name": "/icons/ic_antifeature_disabledalgorithm.xml", "sha256": "94dea590c7c0aa37d351ab62a69fc7eefbc2cdbb84b79df3934c2e9332e1dcfb", "size": 2313 } }, "name": { "de": "Mit einem unsicheren Algorithmus signiert", "en-US": "Signed Using An Unsafe Algorithm", "fa": "امضا شده با الگوریتمی ناامن", "ro": "Algoritm nesigur semnătură", "zh-rCN": "使用不安全算法签名" } }, "KnownVuln": { "description": { "de": "Diese App enthält eine bekannte Sicherheitslücke", "en-US": "This app contains a known security vulnerability", "fa": "این کاره، آسیب‌پذیری امنیتی شناخته‌شده‌ای دارد", "ro": "Aplicația conține o vulnerabilitate de securitate cunoscută", "zh-rCN": "此应用包含已知的安全漏洞" }, "icon": { "de": { "name": "/icons/ic_antifeature_knownvuln.xml", "sha256": "743ddcad0120896b03bf62bca9b3b9902878ac9366959a0b77b2c50beeb37f9d", "size": 1415 }, "en-US": { "name": "/icons/ic_antifeature_knownvuln.xml", "sha256": "743ddcad0120896b03bf62bca9b3b9902878ac9366959a0b77b2c50beeb37f9d", "size": 1415 }, "fa": { "name": "/icons/ic_antifeature_knownvuln.xml", "sha256": "743ddcad0120896b03bf62bca9b3b9902878ac9366959a0b77b2c50beeb37f9d", "size": 1415 }, "ro": { "name": "/icons/ic_antifeature_knownvuln.xml", "sha256": "743ddcad0120896b03bf62bca9b3b9902878ac9366959a0b77b2c50beeb37f9d", "size": 1415 }, "zh-rCN": { "name": "/icons/ic_antifeature_knownvuln.xml", "sha256": "743ddcad0120896b03bf62bca9b3b9902878ac9366959a0b77b2c50beeb37f9d", "size": 1415 } }, "name": { "de": "Bekannte Sicherheitslücke", "en-US": "Known Vulnerability", "fa": "آسیب‌پذیری شناخته", "ro": "Vulnerabilitate cunoscută", "zh-rCN": "含有已知漏洞" } }, "NSFW": { "description": { "de": "Diese App enthält Inhalte, die nicht überall veröffentlicht oder sichtbar sein sollten", "en-US": "This app contains content that should not be publicized or visible everywhere", "fa": "این کاره محتوایی دارد که نباید عمومی شده یا همه‌حا نمایان باشد", "ro": "Această aplicație conține conținut care nu ar trebui să fie făcut public sau vizibil peste tot", "zh-rCN": "此应用包含不应宣扬或随处可见的内容" }, "icon": { "de": { "name": "/icons/ic_antifeature_nsfw.xml", "sha256": "acab2a7a846700529cd7f2b7a7980f7d04a291f22db8434f3e966f7350ed1465", "size": 871 }, "en-US": { "name": "/icons/ic_antifeature_nsfw.xml", "sha256": "acab2a7a846700529cd7f2b7a7980f7d04a291f22db8434f3e966f7350ed1465", "size": 871 }, "fa": { "name": "/icons/ic_antifeature_nsfw.xml", "sha256": "acab2a7a846700529cd7f2b7a7980f7d04a291f22db8434f3e966f7350ed1465", "size": 871 }, "ro": { "name": "/icons/ic_antifeature_nsfw.xml", "sha256": "acab2a7a846700529cd7f2b7a7980f7d04a291f22db8434f3e966f7350ed1465", "size": 871 }, "zh-rCN": { "name": "/icons/ic_antifeature_nsfw.xml", "sha256": "acab2a7a846700529cd7f2b7a7980f7d04a291f22db8434f3e966f7350ed1465", "size": 871 } }, "name": { "de": "NSFW", "en-US": "NSFW", "fa": "NSFW", "ro": "NSFW", "zh-rCN": "NSFW" } }, "NoSourceSince": { "description": { "en-US": "The source code is no longer available, no updates possible." }, "icon": { "de": { "name": "/icons/ic_antifeature_nosourcesince.xml", "sha256": "69c880b075967fe9598c777e18d600e1c1612bf061111911421fe8f6b9d88d4f", "size": 1102 }, "en-US": { "name": "/icons/ic_antifeature_nosourcesince.xml", "sha256": "69c880b075967fe9598c777e18d600e1c1612bf061111911421fe8f6b9d88d4f", "size": 1102 }, "fa": { "name": "/icons/ic_antifeature_nosourcesince.xml", "sha256": "69c880b075967fe9598c777e18d600e1c1612bf061111911421fe8f6b9d88d4f", "size": 1102 }, "ro": { "name": "/icons/ic_antifeature_nosourcesince.xml", "sha256": "69c880b075967fe9598c777e18d600e1c1612bf061111911421fe8f6b9d88d4f", "size": 1102 }, "zh-rCN": { "name": "/icons/ic_antifeature_nosourcesince.xml", "sha256": "69c880b075967fe9598c777e18d600e1c1612bf061111911421fe8f6b9d88d4f", "size": 1102 } }, "name": { "de": "Der Quellcode ist nicht mehr erhältlich, keine Aktualisierungen möglich.", "en-US": "Newer Source Not Available", "fa": "کد مبدأ دیگر در دسترس نیست. به‌روز رسانی ناممکن است.", "ro": "Codul sursă nu mai este disponibil, nu mai există posibilitatea de a actualiza.", "zh-rCN": "源代码不再可用,无法更新。" } }, "NonFreeAdd": { "description": { "de": "Diese App bewirbt nicht-quelloffene Erweiterungen", "en-US": "This app promotes non-free add-ons", "fa": "این کاره، افزونه‌های ناآزاد را تبلیغ می‌کند", "ro": "Aplicația promovează anexe ce nu sunt software liber", "zh-rCN": "此应用推广非自由的附加组件" }, "icon": { "de": { "name": "/icons/ic_antifeature_nonfreeadd.xml", "sha256": "a1d1f2070bdaabf80ca5a55bccef98c82031ea2f31cc040be5ec009f44ddeef2", "size": 1846 }, "en-US": { "name": "/icons/ic_antifeature_nonfreeadd.xml", "sha256": "a1d1f2070bdaabf80ca5a55bccef98c82031ea2f31cc040be5ec009f44ddeef2", "size": 1846 }, "fa": { "name": "/icons/ic_antifeature_nonfreeadd.xml", "sha256": "a1d1f2070bdaabf80ca5a55bccef98c82031ea2f31cc040be5ec009f44ddeef2", "size": 1846 }, "ro": { "name": "/icons/ic_antifeature_nonfreeadd.xml", "sha256": "a1d1f2070bdaabf80ca5a55bccef98c82031ea2f31cc040be5ec009f44ddeef2", "size": 1846 }, "zh-rCN": { "name": "/icons/ic_antifeature_nonfreeadd.xml", "sha256": "a1d1f2070bdaabf80ca5a55bccef98c82031ea2f31cc040be5ec009f44ddeef2", "size": 1846 } }, "name": { "de": "Nicht-quelloffene Erweiterungen", "en-US": "Non-Free Addons", "fa": "افزونه‌های ناآزاد", "ro": "Anexe ne-libere", "zh-rCN": "非自由附加组件" } }, "NonFreeAssets": { "description": { "de": "Diese App enthält nicht-quelloffene Bestandteile", "en-US": "This app contains non-free assets", "fa": "این کاره دارای بخش‌های ناآزاد است", "ro": "Aceasta aplicație conține resurse ce nu sunt la disponibile la liber", "zh-rCN": "此应用包含非自由资源" }, "icon": { "de": { "name": "/icons/ic_antifeature_nonfreeassets.xml", "sha256": "b39fe384386fc67fb30fa2f91402594110e2e42c961d76adc93141b8bd774008", "size": 1784 }, "en-US": { "name": "/icons/ic_antifeature_nonfreeassets.xml", "sha256": "b39fe384386fc67fb30fa2f91402594110e2e42c961d76adc93141b8bd774008", "size": 1784 }, "fa": { "name": "/icons/ic_antifeature_nonfreeassets.xml", "sha256": "b39fe384386fc67fb30fa2f91402594110e2e42c961d76adc93141b8bd774008", "size": 1784 }, "ro": { "name": "/icons/ic_antifeature_nonfreeassets.xml", "sha256": "b39fe384386fc67fb30fa2f91402594110e2e42c961d76adc93141b8bd774008", "size": 1784 }, "zh-rCN": { "name": "/icons/ic_antifeature_nonfreeassets.xml", "sha256": "b39fe384386fc67fb30fa2f91402594110e2e42c961d76adc93141b8bd774008", "size": 1784 } }, "name": { "de": "Nicht-quelloffene Bestandteile", "en-US": "Non-Free Assets", "fa": "بخش‌های ناآزاد", "ro": "Resurse ne-libere", "zh-rCN": "非自由资产" } }, "NonFreeDep": { "description": { "de": "Diese App ist abhängig von anderen nicht-quelloffenen Apps", "en-US": "This app depends on other non-free apps", "fa": "این کاره به دیگر کاره‌های ناآزاد وابسته است", "ro": "Aplicația depinde de alte aplicații ce nu sunt software liber", "zh-rCN": "此应用依赖于其它非自由应用" }, "icon": { "de": { "name": "/icons/ic_antifeature_nonfreedep.xml", "sha256": "c1b4052a8f58125b2120d9ca07adb725d47bfa7cfcea80c4d6bbbc432b5cb83a", "size": 1396 }, "en-US": { "name": "/icons/ic_antifeature_nonfreedep.xml", "sha256": "c1b4052a8f58125b2120d9ca07adb725d47bfa7cfcea80c4d6bbbc432b5cb83a", "size": 1396 }, "fa": { "name": "/icons/ic_antifeature_nonfreedep.xml", "sha256": "c1b4052a8f58125b2120d9ca07adb725d47bfa7cfcea80c4d6bbbc432b5cb83a", "size": 1396 }, "ro": { "name": "/icons/ic_antifeature_nonfreedep.xml", "sha256": "c1b4052a8f58125b2120d9ca07adb725d47bfa7cfcea80c4d6bbbc432b5cb83a", "size": 1396 }, "zh-rCN": { "name": "/icons/ic_antifeature_nonfreedep.xml", "sha256": "c1b4052a8f58125b2120d9ca07adb725d47bfa7cfcea80c4d6bbbc432b5cb83a", "size": 1396 } }, "name": { "de": "Nicht-quelloffene Abhängigkeiten", "en-US": "Non-Free Dependencies", "fa": "وابستگی‌های ناآزاد", "ro": "Dependențe ne-libere", "zh-rCN": "非自由依赖项" } }, "NonFreeNet": { "description": { "de": "Diese App bewirbt nicht-quelloffene Netzwerkdienste", "en-US": "This app promotes or depends entirely on a non-changeable or non-free network service", "fa": "این کاره، خدمات شبکه‌های ناآزاد را ترویج می‌کند", "ro": "Aplicația promovează servicii de rețea ce nu sunt accesibile la liber", "zh-rCN": "此应用推广非自由的网络服务" }, "icon": { "de": { "name": "/icons/ic_antifeature_nonfreenet.xml", "sha256": "7fff45c847ed2ecc94e85ba2341685c8f113fa5fdf7267a25637dc38ee0275f6", "size": 3038 }, "en-US": { "name": "/icons/ic_antifeature_nonfreenet.xml", "sha256": "7fff45c847ed2ecc94e85ba2341685c8f113fa5fdf7267a25637dc38ee0275f6", "size": 3038 }, "fa": { "name": "/icons/ic_antifeature_nonfreenet.xml", "sha256": "7fff45c847ed2ecc94e85ba2341685c8f113fa5fdf7267a25637dc38ee0275f6", "size": 3038 }, "ro": { "name": "/icons/ic_antifeature_nonfreenet.xml", "sha256": "7fff45c847ed2ecc94e85ba2341685c8f113fa5fdf7267a25637dc38ee0275f6", "size": 3038 }, "zh-rCN": { "name": "/icons/ic_antifeature_nonfreenet.xml", "sha256": "7fff45c847ed2ecc94e85ba2341685c8f113fa5fdf7267a25637dc38ee0275f6", "size": 3038 } }, "name": { "de": "Nicht-quelloffene Netzwerkdienste", "en-US": "Non-Free Network Services", "fa": "خدمات شبکه‌ای ناآزاد", "ro": "Servicii de rețea ne-libere", "zh-rCN": "非自由网络服务" } }, "Tracking": { "description": { "de": "Diese App verfolgt und versendet Ihre Aktivitäten", "en-US": "This app tracks and reports your activity", "fa": "این کاره، فعّالیتتان را ردیابی و گزارش می‌کند", "ro": "Aplicația îți înregistrează și raportează activitatea undeva", "zh-rCN": "此应用会记录并报告你的活动" }, "icon": { "de": { "name": "/icons/ic_antifeature_tracking.xml", "sha256": "4779337b5b0a12c4b4a8a83d0d8a994a2477460db702784df4c8d3e3730be961", "size": 2493 }, "en-US": { "name": "/icons/ic_antifeature_tracking.xml", "sha256": "4779337b5b0a12c4b4a8a83d0d8a994a2477460db702784df4c8d3e3730be961", "size": 2493 }, "fa": { "name": "/icons/ic_antifeature_tracking.xml", "sha256": "4779337b5b0a12c4b4a8a83d0d8a994a2477460db702784df4c8d3e3730be961", "size": 2493 }, "ro": { "name": "/icons/ic_antifeature_tracking.xml", "sha256": "4779337b5b0a12c4b4a8a83d0d8a994a2477460db702784df4c8d3e3730be961", "size": 2493 }, "zh-rCN": { "name": "/icons/ic_antifeature_tracking.xml", "sha256": "4779337b5b0a12c4b4a8a83d0d8a994a2477460db702784df4c8d3e3730be961", "size": 2493 } }, "name": { "de": "Tracking", "en-US": "Tracking", "fa": "ردیابی", "ro": "Urmărire", "zh-rCN": "跟踪用户" } }, "UpstreamNonFree": { "description": { "de": "Der Originalcode ist nicht völlig quelloffen", "en-US": "The upstream source code is not entirely Free", "fa": "کد مبدأ بالادستی کاملاً آزاد نیست", "ro": "Codul sursa originar nu este în totalitatea lui software liber", "zh-rCN": "上游源代码不是完全自由的" }, "icon": { "de": { "name": "/icons/ic_antifeature_upstreamnonfree.xml", "sha256": "06a9af843ff56ecd7a270f98c0b19b3154edf3ffa854e6d50a84ef00d0ce1a86", "size": 1442 }, "en-US": { "name": "/icons/ic_antifeature_upstreamnonfree.xml", "sha256": "06a9af843ff56ecd7a270f98c0b19b3154edf3ffa854e6d50a84ef00d0ce1a86", "size": 1442 }, "fa": { "name": "/icons/ic_antifeature_upstreamnonfree.xml", "sha256": "06a9af843ff56ecd7a270f98c0b19b3154edf3ffa854e6d50a84ef00d0ce1a86", "size": 1442 }, "ro": { "name": "/icons/ic_antifeature_upstreamnonfree.xml", "sha256": "06a9af843ff56ecd7a270f98c0b19b3154edf3ffa854e6d50a84ef00d0ce1a86", "size": 1442 }, "zh-rCN": { "name": "/icons/ic_antifeature_upstreamnonfree.xml", "sha256": "06a9af843ff56ecd7a270f98c0b19b3154edf3ffa854e6d50a84ef00d0ce1a86", "size": 1442 } }, "name": { "de": "Originalcode nicht-quelloffen", "en-US": "Upstream Non-Free", "fa": "بالادست ناآزاد", "ro": "Surse ne-libere", "zh-rCN": "上游代码非自由" } } }, "categories": { "Time": { "name": { "en-US": "Time" } }, "Development": { "name": { "en-US": "Development" } }, "GuardianProject": { "name": { "en-US": "Guardian Project" } }, "Multimedia": { "name": { "en-US": "Multimedia" } }, "Phone & SMS": { "name": { "en-US": "Phone & SMS" } }, "Security": { "name": { "en-US": "Security" } }, "System": { "name": { "en-US": "System" } }, "1": { "name": { "en-US": "1" } }, "2.0": { "name": { "en-US": "2.0" } }, "tests": { "name": { "en-US": "tests" } } }, "requests": { "install": [ "org.adaway" ], "uninstall": [ "com.android.vending", "com.facebook.orca" ] } }, "packages": { "com.politedroid": { "metadata": { "added": 1498176000000, "categories": [ "Multimedia", "Security", "Time" ], "issueTracker": "https://github.com/miguelvps/PoliteDroid/issues", "lastUpdated": 1498176000000, "license": "GPL-3.0-only", "sourceCode": "https://github.com/miguelvps/PoliteDroid", "name": { "en-US": "Polite Droid" }, "summary": { "en-US": "Calendar tool" }, "description": { "en-US": "Activates silent mode during calendar events." }, "icon": { "en-US": { "name": "/icons/com.politedroid.6.png", "sha256": "edf8d30b97a06821337e267168b131a6a16d81df9e7007e017778f9781f5c8f3", "size": 559 } }, "preferredSigner": "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" }, "versions": { "70c2f776a2bac38a58a7d521f96ee0414c6f0fb1de973c3ca8b10862a009247d": { "added": 1498176000000, "file": { "name": "/com.politedroid_6.apk", "sha256": "70c2f776a2bac38a58a7d521f96ee0414c6f0fb1de973c3ca8b10862a009247d", "size": 16578, "ipfsCIDv1": "bafybeidvgxrq77qr7yqkcnykdfvszsxjqc5kzt6ya5k7r666wriadrylt4" }, "manifest": { "versionName": "1.5", "versionCode": 6, "usesSdk": { "minSdkVersion": 14, "targetSdkVersion": 21 }, "signer": { "sha256": [ "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" ] }, "usesPermission": [ { "name": "android.permission.READ_CALENDAR" }, { "name": "android.permission.RECEIVE_BOOT_COMPLETED" } ] }, "antiFeatures": { "KnownVuln": {}, "NoSourceSince": { "en-US": "1.5" }, "NonFreeAssets": {}, "NonFreeNet": {}, "UpstreamNonFree": {} } }, "5bdbfa071cca4b8d05ced41d6b28763595d6e8096cca5bbf0f9253c9a2622e5d": { "added": 1498176000000, "file": { "name": "/com.politedroid_5.apk", "sha256": "5bdbfa071cca4b8d05ced41d6b28763595d6e8096cca5bbf0f9253c9a2622e5d", "size": 18817, "ipfsCIDv1": "bafybeifbrio5rumqvgfd5sihs7yihux2yktfvd5i7jimlgrwchzcvi6ldu" }, "manifest": { "versionName": "1.4", "versionCode": 5, "usesSdk": { "minSdkVersion": 3, "targetSdkVersion": 10 }, "signer": { "sha256": [ "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" ] }, "usesPermission": [ { "name": "android.permission.READ_CALENDAR" }, { "name": "android.permission.RECEIVE_BOOT_COMPLETED" } ] }, "antiFeatures": { "NoSourceSince": { "en-US": "1.5" }, "NonFreeNet": {} } }, "c809bdff83715fbf919f3840ee09869b038e209378b906e135ee40d3f0e1f075": { "added": 1498176000000, "file": { "name": "/com.politedroid_4.apk", "sha256": "c809bdff83715fbf919f3840ee09869b038e209378b906e135ee40d3f0e1f075", "size": 18489, "ipfsCIDv1": "bafybeicridbev22c2rt3lwbfsrkafcf3yepak7kpvk6zgbayrxls2mmwim" }, "manifest": { "versionName": "1.3", "versionCode": 4, "usesSdk": { "minSdkVersion": 3, "targetSdkVersion": 3 }, "signer": { "sha256": [ "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" ] }, "usesPermission": [ { "name": "android.permission.READ_CALENDAR" }, { "name": "android.permission.RECEIVE_BOOT_COMPLETED" }, { "name": "android.permission.WRITE_EXTERNAL_STORAGE" }, { "name": "android.permission.READ_PHONE_STATE" }, { "name": "android.permission.READ_EXTERNAL_STORAGE" } ] }, "antiFeatures": { "NoSourceSince": { "en-US": "1.5" }, "NonFreeNet": {} } }, "665d03d61ebc642289fda697f71a59305b0202b16cafc5ffdae91cbe91f0b25d": { "added": 1498176000000, "file": { "name": "/com.politedroid_3.apk", "sha256": "665d03d61ebc642289fda697f71a59305b0202b16cafc5ffdae91cbe91f0b25d", "size": 17552, "ipfsCIDv1": "bafybeib7arokhivttalcnq5ieu5fx5pzn7vo5qpmdiozqodzhb4ba53nd4" }, "manifest": { "versionName": "1.2", "versionCode": 3, "usesSdk": { "minSdkVersion": 3, "targetSdkVersion": 3 }, "signer": { "sha256": [ "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" ] }, "usesPermission": [ { "name": "android.permission.READ_CALENDAR" }, { "name": "android.permission.RECEIVE_BOOT_COMPLETED" }, { "name": "android.permission.WRITE_EXTERNAL_STORAGE" }, { "name": "android.permission.READ_PHONE_STATE" }, { "name": "android.permission.READ_EXTERNAL_STORAGE" } ] }, "antiFeatures": { "KnownVuln": {}, "NoSourceSince": { "en-US": "1.5" }, "NonFreeAssets": {}, "NonFreeNet": {}, "UpstreamNonFree": {} } } } }, "duplicate.permisssions": { "metadata": { "added": 1513900800000, "categories": [ "tests" ], "lastUpdated": 1513900800000, "name": { "en-US": "Duplicate Permisssions" }, "summary": { "en-US": "Test app for all possible " }, "icon": { "en-US": { "name": "/icons/duplicate.permisssions.9999999.png", "sha256": "fb0f3bb45312b53e349a762b67af4f48d010a38a245f75c3a0b152097d7b067f", "size": 1301 } }, "preferredSigner": "659e1fd284549f70d13fb02c620100e27eeea3420558cce62b0f5d4cf2b77d84" }, "versions": { "8367857fe75f85321ce2c344b34804d0bc193707f6ba03710d025d9030803434": { "added": 1513900800000, "file": { "name": "/duplicate.permisssions_9999999.apk", "sha256": "8367857fe75f85321ce2c344b34804d0bc193707f6ba03710d025d9030803434", "size": 27446, "ipfsCIDv1": "bafybeicucr4lk7fynyde4fpxubudpl6m6wqnuq2j6vjroutjyryw24en3u" }, "manifest": { "versionName": "", "versionCode": 9999999, "usesSdk": { "minSdkVersion": 18, "targetSdkVersion": 27 }, "signer": { "sha256": [ "659e1fd284549f70d13fb02c620100e27eeea3420558cce62b0f5d4cf2b77d84" ] }, "usesPermission": [ { "name": "android.permission.INTERNET" }, { "name": "android.permission.ACCESS_NETWORK_STATE" }, { "name": "android.permission.ACCESS_WIFI_STATE" }, { "name": "android.permission.CHANGE_WIFI_MULTICAST_STATE" }, { "name": "android.permission.INTERNET" }, { "name": "android.permission.WRITE_EXTERNAL_STORAGE", "maxSdkVersion": 18 }, { "name": "android.permission.READ_EXTERNAL_STORAGE", "maxSdkVersion": 18 } ], "usesPermissionSdk23": [ { "name": "android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS", "maxSdkVersion": 27 }, { "name": "android.permission.REQUEST_INSTALL_PACKAGES" } ] } } } }, "fake.ota.update": { "metadata": { "added": 1457568000000, "categories": [ "System" ], "issueTracker": "https://gitlab.com/fdroid/privileged-extension/issues", "lastUpdated": 1457568000000, "license": "Apache-2.0", "sourceCode": "https://gitlab.com/fdroid/privileged-extension", "webSite": "https://f-droid.org", "name": { "en-US": "fake.ota.update_1234" }, "summary": { "en-US": "Tests whether OTA ZIP files are being include" }, "description": { "en-US": "F-Droid can make use of system privileges or permissions to\ninstall, update and remove applications on its own. The only way to obtain those\nprivileges is to become a system app.\n\nThis is where the Privileged Extension comes in - being a separate app and much\nsmaller, it can be installed as a system app and communicate with the main app\nvia AIDL IPC.\n\nThis has several advantages:\n\n* Reduced disk usage in the system partition\n* System updates don't remove F-Droid\n* The process of installing into system via root is safer\n\nThis is packaged as an OTA (Over-The-Air) update ZIP file. It must be installed\nusing TWRP or other Android recovery that can flash updates to the system from\nthe /data/data/org.fdroid.fdroid folder on the /data partition. The standalone\nAPK is called F-Droid Privileged Extension." }, "donate": [ "https://f-droid.org/about" ] }, "versions": { "897a92a4ccff4f415f6ba275b2af16d4ecaee60a983b215bddcb9f8964e7a24c": { "added": 1457568000000, "file": { "name": "/fake.ota.update_1234.zip", "sha256": "897a92a4ccff4f415f6ba275b2af16d4ecaee60a983b215bddcb9f8964e7a24c", "size": 233 }, "manifest": { "versionName": "897a92a", "versionCode": 1234 } } } }, "info.guardianproject.urzip": { "metadata": { "added": 1466640000000, "categories": [ "Development", "GuardianProject", "1", "2.0" ], "issueTracker": "https://dev.guardianproject.info/projects/urzip/issues", "lastUpdated": 1466640000000, "license": "GPL-3.0-only", "sourceCode": "https://github.com/guardianproject/urzip", "webSite": "https://dev.guardianproject.info/projects/urzip", "featureGraphic": { "en-US": { "name": "/info.guardianproject.urzip/en-US/featureGraphic_GFRT5BovZsENGpJq1HqPODGWBRPWQsx25B95Ol5w_wU=.png", "sha256": "185453e41a2f66c10d1a926ad47a8f3831960513d642cc76e41f793a5e70ff05", "size": 36027 } }, "authorWebSite": "https://guardianproject.info", "bitcoin": "1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk", "openCollective": "f-droid-just-testing", "name": { "en-US": "title" }, "summary": { "en-US": "一个实用工具,获取已安装在您的设备上的应用的有关信息" }, "description": { "en-US": "It’s Urzip 是一个获得已安装 APK 相关信息的实用工具。它从您的设备上已安装的所有应用开始,一键触摸即可显示 APK 的指纹,并且提供到达 virustotal.com 和 androidobservatory.org 的快捷链接,让您方便地了解特定 APK 的档案。它还可以让您导出签名证书和生成 ApkSignaturePin Pin 文件供 TrustedIntents 库使用。\n\n★ Urzip 支持下列语言: Deutsch, English, español, suomi, 日本語, 한국어, Norsk, português (Portugal), Русский, Slovenščina, Türkçe\n没看到您的语言?帮忙翻译本应用吧:\nhttps://www.transifex.com/projects/p/urzip\n\n★ 致用户:我们还缺少你喜欢的功能?发现了一个 bug?请告诉我们!我们乐于听取您的意见。请发送电子邮件至: support@guardianproject.info 或者加入我们的聊天室 https://guardianproject.info/contact\n" }, "video": { "en-US": "video" }, "icon": { "en-US": { "name": "/info.guardianproject.urzip/en-US/icon_NJXNzMcyf-v9i5a1ElJi0j9X1LvllibCa48xXYPlOqQ=.png", "sha256": "3495cdccc7327febfd8b96b5125262d23f57d4bbe59626c26b8f315d83e53aa4", "size": 1413 } }, "preferredSigner": "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" }, "versions": { "15c0ec72c74a3791f42cdb43c57df0fb11a4dbb656851bbb8cf05b26a8372789": { "added": 1466640000000, "file": { "name": "/urzip-; Рахма́, [rɐxˈmanʲɪnəf] سيرجي_رخمانينوف 谢·.apk", "sha256": "15c0ec72c74a3791f42cdb43c57df0fb11a4dbb656851bbb8cf05b26a8372789", "size": 11471, "ipfsCIDv1": "bafybeig77jwqx243si3gh55iqx4gkcxhltkt6pjimzgigfsk3kshsi6qem" }, "manifest": { "versionName": "0.1", "versionCode": 100, "usesSdk": { "minSdkVersion": 4, "targetSdkVersion": 18 }, "signer": { "sha256": [ "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" ] } } } } }, "info.zwanenburg.caffeinetile": { "metadata": { "added": 1539129600000, "categories": [ "Development" ], "lastUpdated": 1539129600000, "name": { "en-US": "Caffeine Tile" }, "summary": { "en-US": "Test app for extracting icons when an XML one is default" }, "preferredSigner": "51cfa5c8a743833ad89acf81cb755936876a5c8b8eca54d1ffdcec0cdca25d0e" }, "versions": { "dbbdd7deadb038862f426b71efe4a64df8c3edf25d669e935f349510e16f65db": { "added": 1539129600000, "file": { "name": "/info.zwanenburg.caffeinetile_4.apk", "sha256": "dbbdd7deadb038862f426b71efe4a64df8c3edf25d669e935f349510e16f65db", "size": 11740, "ipfsCIDv1": "bafybeigormhkorw3mk6pkkfk63kkmxpvwylthgj67geulvskc5acr65sym" }, "manifest": { "versionName": "1.3", "versionCode": 4, "usesSdk": { "minSdkVersion": 24, "targetSdkVersion": 25 }, "signer": { "sha256": [ "51cfa5c8a743833ad89acf81cb755936876a5c8b8eca54d1ffdcec0cdca25d0e" ] }, "usesPermission": [ { "name": "android.permission.WAKE_LOCK" } ] } } } }, "no.min.target.sdk": { "metadata": { "added": 1539129600000, "categories": [ "Development" ], "lastUpdated": 1539129600000, "name": { "en-US": "No minSdkVersion or targetSdkVersion" }, "summary": { "en-US": "An APK without any block in AndroidManifest.xml" }, "icon": { "en-US": { "name": "/icons/no.min.target.sdk.987.png", "sha256": "fb0f3bb45312b53e349a762b67af4f48d010a38a245f75c3a0b152097d7b067f", "size": 1301 } }, "preferredSigner": "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" }, "versions": { "e2e1dc1d550df2b5bc383860139207258645b5540abeccd305ed8b2cb6459d2c": { "added": 1539129600000, "file": { "name": "/no.min.target.sdk_987.apk", "sha256": "e2e1dc1d550df2b5bc383860139207258645b5540abeccd305ed8b2cb6459d2c", "size": 14102, "ipfsCIDv1": "bafybeidwxseoagnew3gtlasttqovl7ciuwxaud5a5p4a5pzpbrfcfj2gaa" }, "manifest": { "versionName": "1.2-fake", "versionCode": 987, "usesSdk": { "minSdkVersion": 3, "targetSdkVersion": 3 }, "signer": { "sha256": [ "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" ] }, "usesPermission": [ { "name": "android.permission.WRITE_EXTERNAL_STORAGE" }, { "name": "android.permission.READ_PHONE_STATE" }, { "name": "android.permission.READ_EXTERNAL_STORAGE" } ] } } } }, "obb.main.oldversion": { "metadata": { "added": 1388448000000, "categories": [ "Development" ], "lastUpdated": 1388448000000, "license": "GPL-3.0-only", "sourceCode": "https://github.com/eighthave/urzip", "bitcoin": "1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk", "liberapay": "12334", "name": { "en-US": "OBB Main Old Version" }, "icon": { "en-US": { "name": "/icons/obb.main.oldversion.1444412523.png", "sha256": "fb0f3bb45312b53e349a762b67af4f48d010a38a245f75c3a0b152097d7b067f", "size": 1301 } }, "preferredSigner": "818e469465f96b704e27be2fee4c63ab9f83ddf30e7a34c7371a4728d83b0bc1" }, "versions": { "c5f149e526f89c05c62923bdb7bb1e2be5673c46ec85143f41e514340631449c": { "added": 1388448000000, "file": { "name": "/obb.main.oldversion_1444412523.apk", "sha256": "c5f149e526f89c05c62923bdb7bb1e2be5673c46ec85143f41e514340631449c", "size": 14323, "ipfsCIDv1": "bafybeicnwnpiyfke3tbk3nve62meig65vved34i6kesjkksdciff6242ui" }, "obbMainFile": { "name": "/main.1434483388.obb.main.oldversion.obb", "sha256": "d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7", "size": 6 }, "manifest": { "versionName": "0.1", "versionCode": 1444412523, "usesSdk": { "minSdkVersion": 4, "targetSdkVersion": 18 }, "signer": { "sha256": [ "818e469465f96b704e27be2fee4c63ab9f83ddf30e7a34c7371a4728d83b0bc1" ] }, "usesPermission": [ { "name": "android.permission.INTERNET" }, { "name": "android.permission.ACCESS_NETWORK_STATE", "maxSdkVersion": 22 }, { "name": "android.permission.ACCESS_WIFI_STATE" }, { "name": "android.permission.CHANGE_WIFI_MULTICAST_STATE" }, { "name": "android.permission.CHANGE_NETWORK_STATE" }, { "name": "android.permission.CHANGE_WIFI_STATE" }, { "name": "android.permission.BLUETOOTH" }, { "name": "android.permission.BLUETOOTH_ADMIN", "maxSdkVersion": 18 }, { "name": "android.permission.RECEIVE_BOOT_COMPLETED" }, { "name": "android.permission.NFC" } ], "usesPermissionSdk23": [ { "name": "android.permission.WRITE_EXTERNAL_STORAGE" }, { "name": "android.permission.WRITE_SETTINGS", "maxSdkVersion": 25 } ] }, "releaseChannels": [ "Beta" ] } } }, "obb.main.twoversions": { "metadata": { "added": 1444608000000, "categories": [ "Development" ], "lastUpdated": 1466380800000, "license": "GPL-3.0-only", "sourceCode": "https://github.com/eighthave/urzip", "bitcoin": "1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk", "name": { "en-US": "OBB Main Two Versions" }, "icon": { "en-US": { "name": "/icons/obb.main.twoversions.1101617.png", "sha256": "d27c9866adeda6dd466628e43c62ccac95a0e9480c4bb095ac7e0b1c2b58a77d", "size": 1413 } }, "preferredSigner": "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" }, "versions": { "9bc74566f089ef030ac33e7fbd99d92f1a38f363fb499fed138d9e7b774e821c": { "added": 1466380800000, "file": { "name": "/obb.main.twoversions_1101617.apk", "sha256": "9bc74566f089ef030ac33e7fbd99d92f1a38f363fb499fed138d9e7b774e821c", "size": 11481, "ipfsCIDv1": "bafybeiblpfmwololxgsrum337rbbbsqg2gk6hytvt6szf4njubosju3bme" }, "src": { "name": "/obb.main.twoversions_1101617_src.tar.gz", "sha256": "3115241ed53aa047191f64db2c14e609a7dc0a803211f56a9b17e2d027763f9d", "size": 150 }, "obbMainFile": { "name": "/main.1101615.obb.main.twoversions.obb", "sha256": "d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7", "size": 6 }, "manifest": { "versionName": "0.1", "versionCode": 1101617, "usesSdk": { "minSdkVersion": 4, "targetSdkVersion": 18 }, "signer": { "sha256": [ "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" ] } } }, "7b0b7b9ba248e15751a16e3a0e01e1e24cbb673686c38422030cb75d5c33f0bb": { "added": 1451606400000, "file": { "name": "/obb.main.twoversions_1101615.apk", "sha256": "7b0b7b9ba248e15751a16e3a0e01e1e24cbb673686c38422030cb75d5c33f0bb", "size": 11480, "ipfsCIDv1": "bafybeigglr3iefb3es4lp2sgfacppk3w2qqtuykjgf4actebpalyizef3q" }, "obbMainFile": { "name": "/main.1101615.obb.main.twoversions.obb", "sha256": "d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7", "size": 6 }, "manifest": { "versionName": "0.1", "versionCode": 1101615, "usesSdk": { "minSdkVersion": 4, "targetSdkVersion": 18 }, "signer": { "sha256": [ "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" ] } } }, "cce97a52ff18d843185be7f22ecb1a557c36b7a9f8ba07a8be94e328e00b35dc": { "added": 1444608000000, "file": { "name": "/obb.main.twoversions_1101613.apk", "sha256": "cce97a52ff18d843185be7f22ecb1a557c36b7a9f8ba07a8be94e328e00b35dc", "size": 11477, "ipfsCIDv1": "bafybeicocjo4khzp2rkui2ltvrhbksrm373lr3pb43ut7hqgbllfjpv6ti" }, "obbMainFile": { "name": "/main.1101613.obb.main.twoversions.obb", "sha256": "d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7", "size": 6 }, "manifest": { "versionName": "0.1", "versionCode": 1101613, "usesSdk": { "minSdkVersion": 4, "targetSdkVersion": 18 }, "signer": { "sha256": [ "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" ] } } } } }, "obb.mainpatch.current": { "metadata": { "added": 1461369600000, "categories": [ "Development" ], "lastUpdated": 1496275200000, "license": "GPL-3.0-only", "sourceCode": "https://github.com/eighthave/urzip", "featureGraphic": { "en-US": { "name": "/obb.mainpatch.current/en-US/featureGraphic_ffhLaojxbGAfu9ROe1MJgK5ux8d0OVc6b65nmvOBaTk=.png", "sha256": "7df84b6a88f16c601fbbd44e7b530980ae6ec7c77439573a6fae679af3816939", "size": 24336 } }, "screenshots": { "phone": { "en-US": [ { "name": "/obb.mainpatch.current/en-US/phoneScreenshots/screenshot-main.png", "sha256": "719f95f0811e6e6e03e6dbd47553eafe9d8d96b14107e26f2dee3ccdabbdc6bf", "size": 44990 } ] }, "sevenInch": { "en-US": [ { "name": "/obb.mainpatch.current/en-US/sevenInchScreenshots/screenshot-tablet-main.png", "sha256": "460c6ce2e5e3987ae6688f398c9093a07802991e7cdee559a578f201189c6630", "size": 56049 } ] } }, "bitcoin": "1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk", "name": { "en-US": "OBB Main/Patch Current" }, "icon": { "en-US": { "name": "/obb.mainpatch.current/en-US/icon_WI0pkO3LsklrsTAnRr-OQSxkkoMY41lYe2-fAvXLiLg=.png", "sha256": "588d2990edcbb2496bb1302746bf8e412c64928318e359587b6f9f02f5cb88b8", "size": 260113 } }, "preferredSigner": "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" }, "versions": { "eda5fc3ecfdac3252717e36bdbc9820865baeef162264af9ba5db7364f0e7a0c": { "added": 1461369600000, "file": { "name": "/obb.mainpatch.current_1619.apk", "sha256": "eda5fc3ecfdac3252717e36bdbc9820865baeef162264af9ba5db7364f0e7a0c", "size": 11479, "ipfsCIDv1": "bafybeievo4e234mllujityvtjgeltauyfbriszoqddzygmimcm4mo3zyqu" }, "obbMainFile": { "name": "/main.1619.obb.mainpatch.current.obb", "sha256": "d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7", "size": 6 }, "obbPatchFile": { "name": "/patch.1619.obb.mainpatch.current.obb", "sha256": "d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7", "size": 6 }, "manifest": { "versionName": "0.1", "versionCode": 1619, "usesSdk": { "minSdkVersion": 4, "targetSdkVersion": 18 }, "signer": { "sha256": [ "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" ] } } }, "42e7d6d2f8254aaf9fe95ba6ecc233ee8c3cd543a3e4f3f9ebe1b638221122fa": { "added": 1496275200000, "file": { "name": "/obb.mainpatch.current_1619_another-release-key.apk", "sha256": "42e7d6d2f8254aaf9fe95ba6ecc233ee8c3cd543a3e4f3f9ebe1b638221122fa", "size": 10541, "ipfsCIDv1": "bafybeiatdbzlxairqzvdowevwuy7nk24rknc55jpip2wb2sq4c3f7mtngm" }, "obbMainFile": { "name": "/main.1619.obb.mainpatch.current.obb", "sha256": "d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7", "size": 6 }, "obbPatchFile": { "name": "/patch.1619.obb.mainpatch.current.obb", "sha256": "d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7", "size": 6 }, "manifest": { "versionName": "0.1", "versionCode": 1619, "usesSdk": { "minSdkVersion": 4, "targetSdkVersion": 18 }, "signer": { "sha256": [ "ce9e200667f02d96d49891a2e08a3c178870e91853d61bdd33ef5f0b54701aa5" ] } } } } }, "souch.smsbypass": { "metadata": { "added": 1524700800000, "categories": [ "Phone & SMS" ], "issueTracker": "https://gitlab.com/souch/SMSbypass/issues", "lastUpdated": 1524700800000, "license": "GPL-3.0-only", "sourceCode": "https://gitlab.com/souch/SMSbypass/tree/HEAD", "webSite": "https://gitlab.com/souch/SMSbypass", "flattrID": "cad90e036b975ed129a3ce80a0750466", "name": { "en-US": "Battery level" }, "summary": { "en-US": "Filter SMS and show them in a fake app" }, "description": { "en-US": "In order to keep away curious eyes, SMS-bypass filters incoming SMS messages\nbefore they reach your inbox. Based on bughunter2.smsfilter.\n\nFeatures:\n\n* Discrete fake app \"Battery level\": Long tap on Battery percentage will show SMS.\n* Filter incoming SMS specified address: redirect the SMS to SMS-bypass messages list; remove SMS arrival sound or vibration; show a discreet notification icon (battery level); vibrate if checked in settings\n* Add contact from contact list\n* Export messages to a text file" }, "donate": [ "http://rodolphe.souchaud.free.fr/donate" ], "icon": { "en-US": { "name": "/icons/souch.smsbypass.9.png", "sha256": "8fee034537477fcd40fd33887868786b70258fcf7b9acffaff7436bca8748c8a", "size": 1558 } }, "preferredSigner": "d3aec784b1fd71549fc22c999789122e3639895db6bd585da5835fbe3db6985c" }, "versions": { "80b0ae68a1189baa3ee6717092e3dbf1a4210165f7f7e5f2f9616bd63a2ec01d": { "added": 1524700800000, "file": { "name": "/souch.smsbypass_9.apk", "sha256": "80b0ae68a1189baa3ee6717092e3dbf1a4210165f7f7e5f2f9616bd63a2ec01d", "size": 81295, "ipfsCIDv1": "bafybeihaccfnt32q2iwfulh2m7jvdivuunlw6t72wa7jfi7igxvqxjqszy" }, "manifest": { "versionName": "0.9", "versionCode": 9, "usesSdk": { "minSdkVersion": 8, "targetSdkVersion": 18 }, "signer": { "sha256": [ "d3aec784b1fd71549fc22c999789122e3639895db6bd585da5835fbe3db6985c" ] }, "usesPermission": [ { "name": "android.permission.RECEIVE_SMS" }, { "name": "android.permission.SEND_SMS" }, { "name": "android.permission.READ_CONTACTS" }, { "name": "android.permission.WRITE_EXTERNAL_STORAGE" }, { "name": "android.permission.VIBRATE" }, { "name": "android.permission.READ_EXTERNAL_STORAGE" } ] } } } } } }././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/index.xml0000644000175000017500000005004714620351225016750 0ustar00hanshans This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid. http://foobarfoobarfoobar.onion/fdroid/repo https://foo.bar/fdroid/repo souch.smsbypass 2018-04-26 2018-04-26 Battery level Filter SMS and show them in a fake app souch.smsbypass.9.png In order to keep away curious eyes, SMS-bypass filters incoming SMS messages before they reach your inbox. Based on bughunter2.smsfilter. Features: * Discrete fake app "Battery level": Long tap on Battery percentage will show SMS. * Filter incoming SMS specified address: redirect the SMS to SMS-bypass messages list; remove SMS arrival sound or vibration; show a discreet notification icon (battery level); vibrate if checked in settings * Add contact from contact list * Export messages to a text file GPL-3.0-only Phone & SMS Phone & SMS https://gitlab.com/souch/SMSbypass https://gitlab.com/souch/SMSbypass/tree/HEAD https://gitlab.com/souch/SMSbypass/issues http://rodolphe.souchaud.free.fr/donate cad90e036b975ed129a3ce80a0750466 0.9 9 0.9 9 souch.smsbypass_9.apk 80b0ae68a1189baa3ee6717092e3dbf1a4210165f7f7e5f2f9616bd63a2ec01d 81295 8 18 2018-04-26 e50c99753cd45e2736d52cb49be07581 READ_CONTACTS,READ_EXTERNAL_STORAGE,RECEIVE_SMS,SEND_SMS,VIBRATE,WRITE_EXTERNAL_STORAGE info.zwanenburg.caffeinetile 2018-10-10 2018-10-10 Caffeine Tile Test app for extracting icons when an XML one is default No description available Unknown Development Development 4 1.3 4 info.zwanenburg.caffeinetile_4.apk dbbdd7deadb038862f426b71efe4a64df8c3edf25d669e935f349510e16f65db 11740 24 25 2018-10-10 03f9b2f848d22fd1d8d1331e8b1b486d WAKE_LOCK duplicate.permisssions 2017-12-22 2017-12-22 Duplicate Permisssions Test app for all possible <uses-permissions> duplicate.permisssions.9999999.png No description available Unknown tests tests 9999999 9999999 duplicate.permisssions_9999999.apk 8367857fe75f85321ce2c344b34804d0bc193707f6ba03710d025d9030803434 27446 18 27 2017-12-22 056c9f1554c40ba59a2103009c82b420 ACCESS_NETWORK_STATE,ACCESS_WIFI_STATE,CHANGE_WIFI_MULTICAST_STATE,INTERNET,READ_EXTERNAL_STORAGE,WRITE_EXTERNAL_STORAGE fake.ota.update 2016-03-10 2016-03-10 fake.ota.update_1234 Tests whether OTA ZIP files are being include F-Droid can make use of system privileges or permissions to install, update and remove applications on its own. The only way to obtain those privileges is to become a system app. This is where the Privileged Extension comes in - being a separate app and much smaller, it can be installed as a system app and communicate with the main app via AIDL IPC. This has several advantages: * Reduced disk usage in the system partition * System updates don't remove F-Droid * The process of installing into system via root is safer This is packaged as an OTA (Over-The-Air) update ZIP file. It must be installed using TWRP or other Android recovery that can flash updates to the system from the /data/data/org.fdroid.fdroid folder on the /data partition. The standalone APK is called F-Droid Privileged Extension. Apache-2.0 System System https://f-droid.org https://gitlab.com/fdroid/privileged-extension https://gitlab.com/fdroid/privileged-extension/issues https://f-droid.org/about 0.2.1 2000 897a92a 1234 fake.ota.update_1234.zip 897a92a4ccff4f415f6ba275b2af16d4ecaee60a983b215bddcb9f8964e7a24c 233 2016-03-10 no.min.target.sdk 2018-10-10 2018-10-10 No minSdkVersion or targetSdkVersion An APK without any <uses-sdk> block in AndroidManifest.xml no.min.target.sdk.987.png No description available Unknown Development Development 987 1.2-fake 987 no.min.target.sdk_987.apk e2e1dc1d550df2b5bc383860139207258645b5540abeccd305ed8b2cb6459d2c 14102 3 2018-10-10 b4964fd759edaa54e65bb476d0276880 READ_EXTERNAL_STORAGE,READ_PHONE_STATE,WRITE_EXTERNAL_STORAGE obb.main.oldversion 2013-12-31 2013-12-31 OBB Main Old Version obb.main.oldversion.1444412523.png No description available GPL-3.0-only Development Development https://github.com/eighthave/urzip 1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk 99999999 0.1 1444412523 obb.main.oldversion_1444412523.apk c5f149e526f89c05c62923bdb7bb1e2be5673c46ec85143f41e514340631449c 14323 4 18 main.1434483388.obb.main.oldversion.obb d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7 2013-12-31 eb41d4d6082bb3e81c3d58dbf7fc7332 ACCESS_NETWORK_STATE,ACCESS_WIFI_STATE,BLUETOOTH,BLUETOOTH_ADMIN,CHANGE_NETWORK_STATE,CHANGE_WIFI_MULTICAST_STATE,CHANGE_WIFI_STATE,INTERNET,NFC,RECEIVE_BOOT_COMPLETED obb.main.twoversions 2015-10-12 2016-06-20 OBB Main Two Versions obb.main.twoversions.1101617.png No description available GPL-3.0-only Development Development https://github.com/eighthave/urzip 1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk 99999999 0.1 1101617 obb.main.twoversions_1101617.apk obb.main.twoversions_1101617_src.tar.gz 9bc74566f089ef030ac33e7fbd99d92f1a38f363fb499fed138d9e7b774e821c 11481 4 18 main.1101615.obb.main.twoversions.obb d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7 2016-06-20 b4964fd759edaa54e65bb476d0276880 0.1 1101615 obb.main.twoversions_1101615.apk 7b0b7b9ba248e15751a16e3a0e01e1e24cbb673686c38422030cb75d5c33f0bb 11480 4 18 main.1101615.obb.main.twoversions.obb d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7 2016-01-01 b4964fd759edaa54e65bb476d0276880 0.1 1101613 obb.main.twoversions_1101613.apk cce97a52ff18d843185be7f22ecb1a557c36b7a9f8ba07a8be94e328e00b35dc 11477 4 18 main.1101613.obb.main.twoversions.obb d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7 2015-10-12 b4964fd759edaa54e65bb476d0276880 obb.mainpatch.current 2016-04-23 2017-06-01 OBB Main/Patch Current obb.mainpatch.current.1619.png No description available GPL-3.0-only Development Development https://github.com/eighthave/urzip 1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk 99999999 0.1 1619 obb.mainpatch.current_1619.apk eda5fc3ecfdac3252717e36bdbc9820865baeef162264af9ba5db7364f0e7a0c 11479 4 18 main.1619.obb.mainpatch.current.obb d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7 patch.1619.obb.mainpatch.current.obb d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7 2016-04-23 b4964fd759edaa54e65bb476d0276880 com.politedroid 2017-06-23 2017-06-23 Polite Droid Calendar tool com.politedroid.6.png Activates silent mode during calendar events. GPL-3.0-only Multimedia,Security,Time Multimedia https://github.com/miguelvps/PoliteDroid https://github.com/miguelvps/PoliteDroid/issues 1.5 6 KnownVuln,NoSourceSince,NonFreeAssets,NonFreeNet,UpstreamNonFree 1.5 6 com.politedroid_6.apk 70c2f776a2bac38a58a7d521f96ee0414c6f0fb1de973c3ca8b10862a009247d 16578 14 21 2017-06-23 b4964fd759edaa54e65bb476d0276880 READ_CALENDAR,RECEIVE_BOOT_COMPLETED 1.4 5 com.politedroid_5.apk 5bdbfa071cca4b8d05ced41d6b28763595d6e8096cca5bbf0f9253c9a2622e5d 18817 3 10 2017-06-23 b4964fd759edaa54e65bb476d0276880 READ_CALENDAR,RECEIVE_BOOT_COMPLETED 1.3 4 com.politedroid_4.apk c809bdff83715fbf919f3840ee09869b038e209378b906e135ee40d3f0e1f075 18489 3 2017-06-23 b4964fd759edaa54e65bb476d0276880 READ_CALENDAR,READ_EXTERNAL_STORAGE,READ_PHONE_STATE,RECEIVE_BOOT_COMPLETED,WRITE_EXTERNAL_STORAGE 1.2 3 com.politedroid_3.apk 665d03d61ebc642289fda697f71a59305b0202b16cafc5ffdae91cbe91f0b25d 17552 3 2017-06-23 b4964fd759edaa54e65bb476d0276880 READ_CALENDAR,READ_EXTERNAL_STORAGE,READ_PHONE_STATE,RECEIVE_BOOT_COMPLETED,WRITE_EXTERNAL_STORAGE info.guardianproject.urzip 2016-06-23 2016-06-23 title 一个实用工具,获取已安装在您的设备上的应用的有关信息 info.guardianproject.urzip.100.png It’s Urzip 是一个获得已安装 APK 相关信息的实用工具。它从您的设备上已安装的所有应用开始,一键触摸即可显示 APK 的指纹,并且提供到达 virustotal.com 和 androidobservatory.org 的快捷链接,让您方便地了解特定 APK 的档案。它还可以让您导出签名证书和生成 ApkSignaturePin Pin 文件供 TrustedIntents 库使用。 ★ Urzip 支持下列语言: Deutsch, English, español, suomi, 日本語, 한국어, Norsk, português (Portugal), Русский, Slovenščina, Türkçe 没看到您的语言?帮忙翻译本应用吧: https://www.transifex.com/projects/p/urzip ★ 致用户:我们还缺少你喜欢的功能?发现了一个 bug?请告诉我们!我们乐于听取您的意见。请发送电子邮件至: support@guardianproject.info 或者加入我们的聊天室 https://guardianproject.info/contact GPL-3.0-only Development,GuardianProject,1,2.0 Development https://dev.guardianproject.info/projects/urzip https://github.com/guardianproject/urzip https://dev.guardianproject.info/projects/urzip/issues 1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk f-droid-just-testing 2147483647 0.1 100 urzip-; Рахма́, [rɐxˈmanʲɪnəf] سيرجي_رخمانينوف 谢·.apk 15c0ec72c74a3791f42cdb43c57df0fb11a4dbb656851bbb8cf05b26a8372789 11471 4 18 2016-06-23 b4964fd759edaa54e65bb476d0276880 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/info.zwanenburg.caffeinetile_4.apk0000644000175000017500000002673414620351225023576 0ustar00hanshansPK|6JJ>uMETA-INF/MANIFEST.MFMo0;{G.F`HCڤ!mz onmBȿ/mWUJ{d̛b(܀TL1] j46ALu-qH1T`ktM?VWWvC]gW˸a@umQd?:/*j(aR'g lV<R@ ؀Dw,WaT&ףݢB7Ħ*-HFάleDB\xd}G,@YX⌸AN1' =|Sا*BVtgxǰ^$C,ҟ_Oݽ['Y; ݮ0jNs7PKJ>uPK|6J\w META-INF/F981D5B7.SFˎ@}'˙Em/,AZ1Z }O?NO&l9䈗;k |"H^0$p$,9fma㩋:dJg48;7:, ߖ S į7?7 ǕcPg-tfsBܹ' ex"(y c&K!m%2M5b%uvf5+@~ =DXyDΝQbD& |@R7Ci/8{%DuXRےKiqٴkl0g+3^Ű$i0TH|G187>p4nRQgRsP S6NmB /ލ_1n򫴨maX|]tm(;еT^6*?UɰCW7OPK\w PK|6J'[&4.META-INF/F981D5B7.RSA3hbbjhδUڠUѐۀUIqAsAsAf&F&&{|p5@- `CY؄B y @af w6񸄹R3S \@0f8q8!K41*!{(drKTmL*3[3g^^k{1}a;zfPYU^{2gO_fq"Ï_#5LW:G'r$7MV{IOEg盽k^t6uƧ[W|￯RYQou;D%2Ne{j[?MA%ik4 DtDS"'Bs';frt/E'ٹsO9?cO>ߣ4؉r9:&~`BE ڧeh&F 9uU}7?)(L1~Xm.{]m-aʹ9͒r*>qlj ~or>}?{L{2"_(<6YsD-)??j|TȡfuonZ_6rGIٛ-xqvJ_\ɀڻ RbZgѬme/յpDSk'k:a_ٙt-ɶz'8(sȊuRڻzPK'[&4.PK}5JBW1))META-INF/buildserveridA i 8 ?w(pjr%ҏZ$9>PKBW1))PK}5JBW1))META-INF/fdroidserveridA i 8 ?w(pjr%ҏZ$9>PKBW1))PK!ƈ{v  AndroidManifest.xmlUTvUnA}-&1K I ;qa %bK@lƞ]@B9pȁc3pU&n'RbFUU84>rv}u]1xA,I4{@/HĀbEL>@ zA-L@1H!$hIQA Y#Ӹr J"1ZFO2$xkl wiZTݑEwcVTԦ2TX__WӪ;+V*YHGSy1kM|L2]I]j}^Ѯ3˴s_he_ڱd$kSsc}Oi?O~JraSvF֥>wMz+.;kI=~v ( !Xp5T7.8 cʌ+ie_F<0Ij*M} u] 8cK`?9f9'au&t>JV* 1|gTށZ4訯P9h+OJ+rco~X50r~q Byʌ~)TS|=8ű;y9(qxs11΁cH7Fl76y&fIel4(1ڵzVVmลe;qm5tt#0.p?n CUsb$_u9ڵ9|wD1LYY٥;1Kָ2f{@&GǶbFĄŔ{̮$>k1@ѱtWЃ.f*=xN;3s"ΙjhiN%{!kw U%o[.cqܞÉ7?/ PKƈ{v PK!W0! classes.dexUTvZkl\u>s7yIM]R(qWm))ɢdqEdܽ$ڽ]RRnjJB`*B.FR4F N[Huwffw/sfΙ3g93sbSεءtf'o?{2r7"ѵHYD_#nD>#j Z=$PGt&ډ%k@Q Y`$E`yp+߀0q`(~DNo?h&: | @M>`(o?0\ 3@NIׁWׁ_|3-m{ ؏}(0fX@ =O!`p< p^@ x =o>>jS@W?n?>~ dAH%!eO5!\%LAPAeI(W@F=(8յ|x 8DGOQ1u$0%SG4 FPn3|soWmW:ZUaj&i:&)uڴx~c&Gڕ.'e<>5ߢzA&?{ge+*~Zyi=5g4ox]U;yx{isyiO?ۏk~;>?F3PB˒6м] ~zIO釱KK02p,tDQX`*StT>'i^ h{U~cZdv{FÿgewJv5 q-Ge HSd{i}3|9Iyyy T%m#G_մuMH?4FoH?">3?C.%GX09۪^Zu4K?Ă/g\V$m9"fZT5Y{dNաjʟad$T뺽J|uA^/J9 &nZ'/:hlSp;H|^u W${4Y{wp$];<$ V|H˅GGZֲGD#Znz oT{X=B>#!1-ߣwly=ǠI-籿P>ђ:Aw{7*5 0 s79r,،09!4Zceݰ隿O|C$ ysUi Jbvnj,x>"}bܪ5V!ק[mµ%!aazY]s7gu?> ys{F I;0_e !_N*诼f_j1gرNF_(|k|LõDkƸbiQy\?el⠟ >67(O a_ώ-0vMT`~Y`5 YoCbFB+}o鰧ksg盦Mcaq?wSB]i >ƺFYb+nzb?;S]¬ϝ^֣wNjj-1W^[ylDWUuQ}G;dvL>SP9rOWQ5!b: ')qYX#|,A'Rj;l:Ƴ/h i)PIn3[ 5FϺ͹lr='+us%UZƶCƽvOrY)8ұTK_e, lG}AJh!)Ͱ/l4hٚ5ǜTs|׋#Կ` h;ŧrmϬ\'*5egt^R; {{T61D))WI̯kͲrcd>>Lk>wrVA>xrrnAs%O T6Ӡ?ygx߈UӖZlgT~GݢzG}TX߉ݮM;[~wK[<M5Q{ { n -3_]e#?hTG\{=d9kr{jZ5xzQiW&=_o4TX?VYcgQGDb$Rd&K(xTQ5MKKNuR:P۩t^޲j=n䟎OOo:''#>>Ll)n]T!NE|>z2YJK')Y-Mgl^v Q(nц;ATfz:LPҝ̹% Nrv*iK^g۔r|wJ y6Ѵ$4)3Lg]G/v.%I9nZe'.bħLNQ(8E[+H\+d1*WQ,Nt:hɴ7w ".y{/:]'K^bEk+#JMtu-RtJ%b4浌}JAUװ2/;egWJ6g>zMfrE"!:3Ni%ۮ4b*h#3NvQ+pw2^vZݥ\ Wmŵr|Hy=eSv$UNcW-Y}Y3\aTXe#5|F5nG3Q6OWpl-ޜONyyi6dɗix&c/NbSr:9rEXiyza|v^: E29aN:$l6]dKti2H@#);y͗SY]3EKT씴tR'}wP='scdeJێfjp˝(?[A`+4553]RO%LfNȖ[^dG]d5O TSpL>c#z58ޣ]EN@Pn9"{YyCMkön5ރYs_]Fד]c77}ݑol׌dlW\6{Hl6AGCot0iߴ;[w@MP#76C%_vnX-nXo6[=A!n }>!Fo¿/|`MozVՏ}ƭݰs}>pL@3({,!>`O4ܴЌ|7so; /5 Y%q+~h776fi񼫔i7^]?ϗ[ o };Y}tawݰԼugmMPKW0!PK!D| res/drawable/ic_coffee_off.xmlUTvT=s1\珀ͤHjr|5P0d!xbf<TԔ >|;IVVҍhK P8ĢCL%3"#btFBQ.hLz&hLn@_h$6\ ޘ̚ד#QTΤ?L*!(eo >J bcɥ|u EXW"L4vὬZ'Z<,1}H/֣չD֙'Hh'l"+3U?U,k~! VWy3Оw*mx~koV4qT)wCeoϴXyۥ>S{.\D;^\'>sFMB)U1^m0qs'|r5k7Fiڼ4A*,u6k9|Ock֜Q5t[rcwVFݴuPݲF85BF5Fשjx38yPKD|PK!t}"h  res/drawable/ic_coffee_on.xmlUTvUnA=ky9"E$\#z6"Q:@HPpD)o7P ~3wf̜sΎ=ETЯ0(Ȟ5vhi/hϴo_ߴ{?>VF8[c,W32s5ׯ9ɖgyj.}x}/>8;1sK9fNcY8[=NRBqw#4&SrR9}GUOrȈQ_z̨"`m3-ɧO$.ʧ6E}1 L@t*^IG:J1}DVPTL6Y^6^ǃ\o1zK FUܾhuMETA-INF/MANIFEST.MFPK|6J\w META-INF/F981D5B7.SFPK|6J'[&4.META-INF/F981D5B7.RSAPK}5JBW1))6META-INF/buildserveridPK}5JBW1))META-INF/fdroidserveridPK!ƈ{v   AndroidManifest.xmlUTvPK!W0! 5 classes.dexUTvPK!D| [res/drawable/ic_coffee_off.xmlUTvPK!t}"h  <res/drawable/ic_coffee_on.xmlUTvPK!)< "res/xml/prefs.xmlUTvPK !0$ $resources.arscUTvPK *././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/main.1101613.obb.main.twoversions.obb0000644000175000017500000000000614620351225023415 0ustar00hanshansdummy ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/main.1101615.obb.main.twoversions.obb0000644000175000017500000000000614620351225023417 0ustar00hanshansdummy ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/main.1434483388.obb.main.oldversion.obb0000644000175000017500000000000614620351225023460 0ustar00hanshansdummy ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/main.1619.obb.mainpatch.current.obb0000644000175000017500000000000614620351225023301 0ustar00hanshansdummy ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/no.min.target.sdk_987.apk0000644000175000017500000003342614620351225021470 0ustar00hanshansPKOAndroidManifest.xmlKoSGR 1y58qw-E%BRA U*&1`1,X#>+VuE]tWC@RsœIFl=wΜ3g^0^"hZw0tZnA& z ~2Qj@@ow{#4"*C 5; -Cϡ?x}6چ~CB_ERyz u6UA[TMڠs]eU行ThMqBkwDƧ_/ψSgիOכ5y:b\y9@ e4kWo5YkLVEj'cmXfD.wstj\C- .e}j\ Q+hAJv\}UP$u﮲Oaܑ%HY]v\nn"n#{ =Χ YyT>#GwǬ`[O3s8$L`ҟM2/F4DO}S(DAa( 'e]=['aէ}F[Z5a߆sq?O~+#|3(<'ySʣ_kyDZy`Q'|l -ԲUjÏ]:(N=|i3[>_w4VmXɌ x^Bq=n!X19mDr쳬߁7*Qo 8Kj oȡcxf\p5g4! u3ϷMjs$ V`&7%Lis&-giM;޴5ބ7~}y Snu(f CA2B(i8DW-fA<d0 %{-]ێ3o(Um͛J>md1Šݠq^IVS!ϖvww*&lv+d oNz1d %h!zwu(c̉믏O42m5 2 _Zmze2cEX5|fcY[ВkX+tLYi /?V]`o_}XWyѦIƀ%f߻] *%eJy){Gポ-gGvu\`P(E;se!1MqΗʛcwq!m=mggb8\W#uJ3?oCꗾ0>bA!:vak$Բލ4r5LXahKX*14bOv}!EnUlIל-pQ X;ܧߵWfErkRw3ΐ&ꬴ?֪"S-={e5FYb0a#[*lvr+t~.xpsa\|'o ?1XҤcځxVK}h+wQJ;Nut6&uF6'w֤--HxO6#=ŵf\'Q|Ǣ_w:R2afLp&fϜTJ"ͫtHn8q4>WSZn񤭜%,wvXϙn'<6;AŝG"_}#$sVHq2!I0 ƪ[D!eN,a$88oO_M@$_T˛g~~E^LtF|·=4Ng]V֑V 5XeW?Q6,P7g(8 ਑qq\T|ʑ(ma4 {(Y~ߜmO%y۝R)b)?aVPnmH7j^%}eZ1Ŕ< iE5K:@' ݟ rIA!B&uXA"ܳLk@HC.0x"|';PKVlQrCL7 !X""vta3KRP@^͗ДVws$l&_3O?4Mo_EK붧:|9l>xN=nGQzh _S1n/˽ QߌqeNWRb:^?1!nZz\ /Ms ]λ|K} B򎁥/!>&8*ۗmpf^z_2&OPKGMETA-INF/CERT.SFmn@= ] "j- iU7f3:3|cj;9NCǔ^RZ$bG5"Sibl骍ą`*A= t9͡([ӕ>C@HU7]yۯ$K.8"So~ZyLLe~㍪9*W.4[mvfBPj{DLc&\2~6Gf "^'b1 uar`)L?LW B}9Kq8K{ Z@v)0ܦ #pXD'@-Wn3]AO G-oPKo-META-INF/MANIFEST.MFmn@{ށDU^(-ZƬ0eWwO_kH3W3{R_сf-UH}X4(p$!w8ԡ g8<Z۸J2NFUy::hm.h׶WN^nju}p&A5˥b ,m0t3VPd'Oj3 E 6P:ctjҪEr>O4E q#{j"$xy] qxL8*ю-A9M`%,gV-ơ.}s PK0N classes.dex{p}{H"%A-[2eodXcH3;PN8Nq8ǕU=I'N3yi7mMRON=cOkih3w2!sCX~'=嵮߼WG>}lk-7he(ɿ@tD! |@#jx*srDDo '-^p8f"}x<  4 zςoK]рz)o@# a_/`]#V0 > h 2`"8>O/? E*P#j n`10N{'I xx | ~ ~& `7 6pi1)|h3 n0 f"XE]CSwkpq;h`p,CIZA vr@f6lktu`\n;& p >C`8IpiԃzS>0U72xdKp q\==$=&d^OH}Bmy1wHXdU_>!ǾxGӣOx z'[!C/@eUIY-V ~鋇?))? +uΓ)t+w+WyrLx܈R] SfJ`")o>$vᜲ"hi.V]E/J>¬b+W?ES]}s7 O9ReVuծ6^+H_%Jdϊ#I0*>1v1Ah?3؊lA| BzGF[8|,ce5|#-;BVd(e7v-v р'o>ՋŞ-iYeh0؊܌pПT'B}|C"x5' wkTwx ,ڶy۾%2-;/ 'cZ65`:p-&\_"Tf5Z/rV>aÏ'wֵ|œ'}=0] hG{,ka?m令29*S!UhVQxuOr'E\'װai߃+2[Y6i=Oex*Y*V1=&DWb,>}X1م@5;=e{}lhX*tƞLV-i8aXl+=b: >jJ12vҌL` Ɇ$9h[zeDO.8 dݒ19;=_ҝ[yǾǘ-K)3ޯn]IYf>o8;({%;OMviƘ"j~MZ>zz3|"bExUZ2ݭp'b|`8ng5y|1#V9ye2Ɲ̧5EPڳQRЋEԼ .vD9]*$9k&飠wP7T'n%M9UWՕ=MŦ(85r ߚƇGVCw !e ;թPf9MʑAj8rX}v(:vRl[G Foe_.cH͖瞪0G-} ?4R@wfe||H)͑ActeɗՋ:G~7HaB=f 곋MʳI̠v4 q$+l&+fX ?k?M(\hy8ʚ66Z]xCx6a~ڈE:(&^o;HXBdj\>zvr8M5g5L^ MZ׏Z6kQLig']4yYZۻJKnZ l[vϒiu)d)3Ŝ;YؕlK\RYȵCuh]('(UpuG_BP1Q(-`(uk8XukFҥyxVc@ՅҌe2襪J+BeT'=+"AcFJe<7K,oZrLbˤ-B̜v1@F! (ŎBxo`["*{%U<ك,ڻO3Lݧ2_7n-[xST*]<²)fn"SdE6,6q#x-~VSOgYóXSqhFcʃ3zFo]cݪ/Q< Ӫ|b.g4ES5f_S~M6l0=- 6=.vrklm a\:G`PR|*rpͧe1QIlCLZnbMjW Df亻W+ړn>_MMM,6bc}5F|H9͟iO,O33K VC:FjT[|>v.Ӿzr)e3{%Ʉ⻘SU SQگl\2.$NRe?IOZ3.o菵p=<b ׉Cs C{E~Ӹ,x~ UiP&AEۨj,.A;:or忥2ޗrZʭ嗼j7pPK=~ res/drawable/ic_launcher.png5PNG  IHDRשPLTE)!.H`D=768;er~D?:E8*  2GZ'  ڮ,%!)68.# JKKA@?#  2' 3DT ...  .; !&1 ///*6CC5'  ]1121F;2)667omk ~c omj  H;.  MNO544 ,,-111 &'&&111*!''&223&(&&%000!"&%$ !!# [|u\# RST776#G9,  -:"%*   1@IDA=DJCCCUUV{xu~754,,-{yw}{yZ[\srq[]^zwujiha``79:542\`cKMO988]_a϶^_a׶?>>hkn@ABvut788#"!$tRNSL  SZV6("Vj.ڨTr5T"\r9EhqnnJpDACAD?J?J?QG4V,vRN.=wIDAT(c`@F&f $ّ98/\XXDt8!!9SJZF.!'?k"pEbɥ@Ĥ+WQ$%%38$q-3+dyNn^~MĭBs6LViԃ`P^"qY.P:T =nlb@`hnyYkD{GgWwCo_k$ SBӦ30"pU(IENDB`PKS Lres/layout/activity_main.xmluN@=[$BHA"5%$ 'Ql*x$ G;es;wofw} ƘMCt- G«& 99w%fmF)B[nTχUПg!F$~"u.m*~RUx:R}o{EO١R3~`)6d?Tޟ#]{ȣ>64u6Z?p̑?gqդ~,ᛙPKresources.arsc5 $0<xres/drawable/ic_launcher.pngres/layout/activity_main.xmlSettings$No minSdkVersion or targetSdkVersion Hello world! no.min.target.sdk l, 0attrdrawablelayoutstring08Zn ic_launcher activity_mainaction_settingsapp_name hello_worldL`P8L`P8LX8 _ ?  q7 3 LH@4/=.Ic`ّwLnxn{5mǪGzҊ d4yq<{ڊ`900}).Ҟ0  *H  0{1 0 UUS1 0 UNY10UBrooklyn10U Guardian Project10U Unknown10UHans-Christoph Steiner0 140623163212Z 411108163212Z0{1 0 UUS1 0 UNY10UBrooklyn10U Guardian Project10U Unknown10UHans-Christoph Steiner0"0  *H 0 Nۢ>yvA-zmO2=6ߚL:Xx: l9 2t.yi~7Mɍ 'Ţb$62^_pK23[@Y~%t7 oI9:e6@JxAle}PPo%$оQ.q1PDP^HZ G]]*!"~ b'8LkE2l@eSRh1QHj3& sa& aMJ_o}& B3ʦ㞦4x dھR+aS70Ɠ jwK܁YBj\/㥆a/XA5U͎L.<ja.DW&zI(1bM`{>;1H]yJ$p:aYeș糨,K B$ ^XAhY WVN}%!kS;mRF!00U?{쥡"SNd{+0  *H  T # My9L~P1 0r+ˣVτ@UR̜}1ӂC>;>\jUCR+bЬ)-j )+oT)CcQt:өwH}7iLj` K8_WG*@fw1-xfQC3IIN?_ڳH3I'P5f>DMI܇u؉LlФ5E[B׽ (:bQ0>l5\q%Hh@܊Xcgw@~h,иGFsnsDM_xD_@qM W (xs^v̜uQ?yLO݊2Ur`>URCh`ȡ㬴| ]r?LT;RT|kƕf}Wdu0`V݂4@4>"i}kg WD7# ]xە>طif(޼oL] ,( Ƨ*q X8{d-<5XF'3ɭOq^2ٕd7hbe_˧TM'SzZY'&:O&gLRzDŊx@OsE5Tb.(j@]2vStځKo&0"0  *H 0 Nۢ>yvA-zmO2=6ߚL:Xx: l9 2t.yi~7Mɍ 'Ţb$62^_pK23[@Y~%t7 oI9:e6@JxAle}PPo%$оQ.q1PDP^HZ G]]*!"~ b'8LkE2l@eSRh1QHj3& sa& aMJ_o}& B3ʦ㞦4x dھR+aS70Ɠ jwK܁YBj\/㥆a/XA5U͎L.<ja.DW&zI(1bM`{>;1H]yJ$p:aYeș糨,K B$ ^XAhY WVN}%!kS;mRF_ APK Sig Block 42PKO AndroidManifest.xmlPK,puMETA-INF/CERT.RSAPKGf META-INF/CERT.SFPKo- META-INF/MANIFEST.MFPK0N :classes.dexPK=~ res/drawable/ic_launcher.pngPKS L $res/layout/activity_main.xmlPK M%resources.arscPK 4././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/obb.main.oldversion_1444412523.apk0000644000175000017500000003376314620351225022627 0ustar00hanshansPK!AndroidManifest.xmlKLW0CBEAy 0T /i 0‶iREӅ鲫.jLirU˦kϜ+;t.ԙ;ι~a*!j Q=XA6m}FC[ǵ * } } ;2?tB3who@s%T! =J ޅEDOb)cK[TFEhz ? z U"t ZBϡ_2 z 5adh2*DLS .#2h~[+*J:x:GZZ ,UstG2$qwF(hA).,Ӫ- g15s!ښE`ަ8TbiΑ;Ms [UԵ\mL|Iǜ1>%ḇ_|K-%=Lb"5 %xV1i5/exdT"1f@ Ct樀+Aehmݐe܃*frz7xt̽]^ew&sxW1D<|h]e U6lbKj*"f%UJUP{]9]&1s4qltƱFwAiwp>8ZvEơ(5B 42])&"|o翉Xe0+>^f ?3kÓs 3YL[@t+3`mwn';:, Ѝk=왱5sQ': ,bGgg/~i@8APu Uּk^^C8Gs7j~ChS)fW-1!Gfb${UvyeHS*: T*fr.戨xm@Lmu+aRQlb>O=9rz8"9Q#GGѐ'GeU9%Gcr 1s+~Tr$1s}<&5I̮N.|УfѬxjJkV>aُզ? {@볼*~"N*Vom}k),Ã7(As} oH\uziV3]wQ\ Kgy'byNa +볼S,oЃ^B\ yF7xN{F7xxƄ7xzƅ7xy&7x{. >˻ޤ>}*>=*W'T!'nPKr PK! classes.dex{pT}޽z] t%$ i,[  ɑFpW+eB$`ǎ v=L2qұ76ӘN<̔LqNqɴEN~}~Ǧ劾;^oұ߼}}7^~mo%I{A'Zd%("K t~0' Yx   ? hp= V0  =%`Q`\/>*F <NY&/h'8>2`|<.u:x9KCSjjz}`78x 9p^[} D&X z &#8 ΃%p||sp Dj@$8 ΂ I%x ? Bh]`788cH` HFœ v:tM`3A#Im;}``| c`?wxTx-&A}T{Ы4tL i*]+ߞqi|^^+VLڹ~]YcJ?r.u옚Oҗc+EJW?Я~#P=?CJǔߊuڬhC =K|d)yx,m&]"H!1 % YGOu5X*ʊ0rR#[ J~MOR /7-tEuU1zQFM YA'*MJZZQ YEL +yI?$ #B jZeŮ&bEcv#d0gȗo9_M煬?1,-!kD\SNJz"?G|'3B'DPS JnTy$R}{s);w:PwX%Lߙ?89i^CU3|*xywѹG ƏnlW=g "z)!-"G¢ek39'$u*z;P"mLrQ)Ԓ8o-ˡ;G=99?&8qw Ej)yJIO} T^TUs%(μӏNӤbDTسN.ױ*>sTZ;sQ{SjRP(bgg%B|I)̑O6}`%PTrrhFDҤ_ Nް={z>Bs(::92regGe7Q5_]\hy'w ƕU}mX~W#T.!jLYx1a,ع~M;prIgl7T*i.`f 7CaW^>F\ͦsTNS~2b!oGWX[x43&ÝWjpKpW:G~ikS۸CEJR T\~:8\J>RY{]Am) g\!X^y.o{*2(x8^BqP'Y1McΌZHa ">P 2)u-d Xn!.٬ RE\9zRPEz%J˷)ߩukV2%7ҹ56+[+z|庉%v.iU.@EE+gWYKacÆΆL(3c ]j|%. MdVKVMDCBO%'FyL5T5TG>O=أ^BA:NDFRe=X]{ک/cr+,6#uslأ~ƞa=-u:֍zҵVTa04Ƹ7ln/il>z"m'&\؆kHWK \5cbݮwf+.bN~k#vezfm4Y4BQ)gg}Uxryv(kj(H3̳śbY')x+($EcQ-cUMԤXF]_'Ϙ8E?b2*hZ=ƼmHG_HmeQ#D g}^g "l^ͩe2 ;㙛௠EFɹeA6%FwѲ3VnQmG-:"+u`f>(iߛ<HTa 5nĐ~h8Eo3V>J{^7,c؃^CBiZּ%+͔5GV2{h:*)G#TV!E#|.1~.iI;cR9f65]#Si}e ++YUAq껮ѫܔ٤4\G򻎦˭,zֈV/AƼ_D{k4Mךti~z A?cFn8'bk;5ܸ[B4CFY#?%AxXS;يX+V׼{!s7CF;2)667omk ~c omj  H;.  MNO544 ,,-111 &'&&111*!''&223&(&&%000!"&%$ !!# [|u\# RST776#G9,  -:"%*   1@IDA=DJCCCUUV{xu~754,,-{yw}{yZ[\srq[]^zwujiha``79:542\`cKMO988]_a϶^_a׶?>>hkn@ABvut788#"!$tRNSL  SZV6("Vj.ڨTr5T"\r9EhqnnJpDACAD?J?J?QG4V,vRN.=wIDAT(c`@F&f $ّ98/\XXDt8!!9SJZF.!'?k"pEbɥ@Ĥ+WQ$%%38$q-3+dyNn^~MĭBs6LViԃ`P^"qY.P:T =nlb@`hnyYkD{GgWwCo_k$ SBӦ30"pU(IENDB`PK!res/layout/activity_main.xmluN@gmCR"EJIRSYBBх(6<£@KtV 4޽j+O$S_&n7>8 w:TZ^&zԕ.h;6W:WBO>nwǻ4Yy)uߒYjQh#+rK]ٮQ]oq$tv^0jm2Gf&jj~*ywM$,x󎳈sC~]jV%e/i!_[ ?PK-jLPK !resources.arsc 0<xres/drawable/ic_launcher.pngres/layout/activity_main.xmlOBB Main Old VersionSettings Hello world! obb.main.oldversion l, 0attrdrawablelayoutstring08Ln ic_launcher activity_mainapp_nameaction_settings hello_world@L`P8@L`P8@@@LX8 PK!TQMETA-INF/SOVA.SFmQOP{65Z) Y$zO9z= үZr}۷yd#Q2P#`ZS DujKij-VDA?g]R8 %BPNR^C̥߭]?ɺ.ڻ,/IG5K1eIQSF4YJ ٸcul_^cq0E8]#C|:mcx1g tW9Ni|s:ݶm'pl8 EuQ aADԫ 7ձ]1ie4`;Ey#b_a;{"x* D)>wPK!g*qMETA-INF/SOVA.RSAWPI@HhbhҤ)RI/#""ń*"J'*E6JX@ E"R&_srC!<*))qE!x yyUA@In.4oFD ]A "r! 0Lb2 A) Qp؍H Zb0x 554}T'"\G:pM5'/MXWeDdm<7tUPW#(mELbVq3sJ]]p@Ca'ŵ#LwQy +$h*BdvfW]Xŏꕙ~ +xkRHʺ8BOۿSB6Wf R끕`@"77}bXwSRQB&/CS7N+nFO0Vd \XVDKO?ˡeЈ `1bfeYmb4_ρ:R;YFn7w \8odx6kB#c3qͫs6a.^ek4}u[)r`3-vp J کtӚ4FاBnyۆ ]e*u%S}r?u.~HFޘr(ylQRڪP<3. 8`As摝8?p~u#$0cM;EDt⌗]7t4y:=DBNy.! Ù*&ŚƀY:Ҫup>MP9KZ?5jRvfκf.Q{8VxVcV:)׊ "܌W">c6h;UӚ7F*^3KB\*W ŒYCp݀Jw!2<ϒj]uC4k\X!2$U秹f$Sh{JEi U5#NnBmb6*}tLkoli<Ϋ8C^> ?9l/D W-A83^7<%{ U=y+{woJ^ lEp h]Q_}r(=.Ϭpσ K=(k/$Cפ^ sxke;L`v2>, $wa Zfe$vfB"Dc'$pGEct~@$( 5Ki!0kҊ'Q3w}vt??ۉk2 Aʿ[ц- ~6ğ<'$5X@@5-PI$f^)0m#oBpr#{ tj FP"YhNS]eTsÎuTaUs܈-bƯ0HgYM|  q  ALH@si 'tщ6iVbhY?~\eSMNs9l"П 00ɠH4P0  *H  0!10U F-Droid1 0 Usova0 160823133116Z 440109133116Z0!10U F-Droid1 0 Usova0"0  *H 0  "IN>ҕ HCn\]EB_y?֣C0$6؏S:xvEݰ l*EqMdZ3>as5jxM3'd\aD\?Ѡ 9/ }3%tnӐ{nEdX &8$TX-:Ff;-J!XM.A(V[B k!㌙֐JK`VAjR!j(Guߋr_s~D%0(9C7&n 3V2;T[ɫG*~+hsLO$;ʣXn)4 Y 3Hi: 5#@*g*:$Gt]a#k`/EixSO:xQm_Vsv^eA$1p<ۣq^lfbO=^=.mJƓ!,|ַMO!00U+7PF.MO0  *H  t?|VXӐB_>Д%fp){NiCFW;7\OsPZ~‘6.d6)6CyƠp[cJ^n_8C-=yVUipϺ)r:8Vة黻5t[)oWK4u xXL[ 2"r$Zwqi-DT%%cTi"yZ,xYY'c@r,+ѩѕN LWVd;JehD-Ӭj+Wbr(#773̬QwƼs}֌~]c߂F V-@'e ݰK蔀wI#&A`* x4D+'^^MkQ@cS.h.oC5G-űB F:yjY3V|'tQ>}ZMsoQ#e$FtkGzmk)+{ =qȜSnۑ_NkW)ԿJG= e:dQqY_>Y O PU,ҕ HCn\]EB_y?֣C0$6؏S:xvEݰ l*EqMdZ3>as5jxM3'd\aD\?Ѡ 9/ }3%tnӐ{nEdX &8$TX-:Ff;-J!XM.A(V[B k!㌙֐JK`VAjR!j(Guߋr_s~D%0(9C7&n 3V2;T[ɫG*~+hsLO$;ʣXn)4 Y 3Hi: 5#@*g*:$Gt]a#k`/EixSO:xQm_Vsv^eA$1p<ۣq^lfbO=^=.mJƓ!,|ַMO APK Sig Block 42PK!r AndroidManifest.xmlPK!{ _classes.dexPK !=~Rres/drawable/ic_launcher.pngPK!-jLres/layout/activity_main.xmlPK !resources.arscPK!TQ"META-INF/SOVA.SFPK!g*q#META-INF/SOVA.RSAPK!/k *META-INF/MANIFEST.MFPK 5././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/obb.main.twoversions_1101613.apk0000644000175000017500000002632514620351225022600 0ustar00hanshansPKHUnAndroidManifest.xmlo[EnbF1n_nb?^l) TҨIKH(u&!!9gs!qп!77^%yv3('r(IDj]ysww18ڃ?P&DTA]{t>;= 7(rCh ڄ~~*=z{P5jO{t۰Y*=Q3k1k"Q ŧۧg-R3l9xTijf *ߠ/Ƕ!=akm²Ʀʇ=؀o #Q^Qk4{wUOWEc \Rեڪ,*lN`6ڙ1mjّ guak7LE̖p:XULtZqR3z]{!ߟBM)QZeա:S۰quGs}:?Z +;=ygϏSNn7z>@dͻ+Ova..x7}ZQO峎U66bSgݸ 6Б5+ M7|4f *;=dB#nԹ-cGn#v-KʧYyS[̙3E9ӌ aFN:$L0IL2hzr' ]"q04 '6'/k\Գ aVWA~y41es?(<(ybabqqH$[Iq}Yؗq>f&78>d6MJ.ښ#F7F-D޴5^K}Jx)ggq\_p͈7b֘4X}ʲ7i%oп%C7^Fx7ke:; oNq>o ϶s^ /k$yYx94^+兗x +\ o>-b޼5^+Wx% W^I-o«-oAU,Eۯŷk9{PKUnPK H=-res/drawable/ic_launcher.pngPNG  IHDRw=LIDATHǥyPuƟ{².˲ 8ႈ 628yr OCM5V^ʡbY"0,,{DPXϟ>ߋ4zљp a22x@-q &6'xnب4Ռs-<!a^zD\W6=YMQ2ɗw|՟-f̶vJA؜s1Ym®n>/]ҹr8୔@(r1.}j:Oi> DowJ'CRRVJ eMPy|{|7sRNQy(KNnቹM{p՝Ғ6Q:h++-LxȄsՆIT~M≹\{V{TTX@vL (Ćyq]zAnBFZmHocs  Çd6ihh CCfQ!j2OPSեlUY G?15t"GUˢy*(M6\$""DJiujdo5GcF^G"@ Vx\|T$SgOt ::erOK\]Ϟb¶hӫnZ>5^7 S~6B3Щb#RجJ[ =64%1N ('5+٥bvTD%W< `y*VnJK6͵[h8l3PA$M;QZ1[,U3|.nlIuG2 3 eb2V'0`ę&Uڂg ,.!蒎Q1 F|UJvuӆaL06 cLzN׎zXYٹLGBr8#0LmMOS7onDVv͞} DLژ.C{e 󳵴&cY,ZKSiZ=I`҇6%]Nm},ŅU5SN܈mݷ<65}E޷'0CקԄf.̙3;EnK=_d*/r.Ѵ#>)?/Ԟ H\o7aU%(|${hjǜIL~ cS/LҘPPX"1sgsLuP!!"@&849^1|'3}ȕs_-]$IVM1,,D-aEDA̤rIENDB`PKHS Lres/layout/activity_main.xmluN@=[$BHA"5%$ 'Ql*x$ G;es;wofw} ƘMCt- G«& 99w%fmF)B[nTχUПg!F$~"u.m*~RUx:R}o{EO١R3~`)6d?Tޟ#]{ȣ>64u6Z?p̑?gqդ~,ᛙPKS LPK Hchresources.arsc 0<xres/drawable/ic_launcher.pngres/layout/activity_main.xmlOBB Main Two VersionsSettings Hello world! obb.main.twoversions l, 0attrdrawablelayoutstring08Ln ic_launcher activity_mainapp_nameaction_settings hello_worldH\L4H\L4HT4 PKH<>Z$ classes.dex l[u}(Rz"-K$ee[(qDcK]t%['Yz6HʒMӤ k,[:4E--@[-Z,, eAYs{{T^E}8~Ч?߫|-VXoQݘ oYA҉6@y &dʬ!66QT9p\EuS6xv& `'W?wA 3 !U&p<^~ ms"x | ^FQ8ix ;*76xxw &0 )`*> ~\O?_/W 6x0:ZZ 6!p+w"8 .3yo B]p-Ȁ ` >nA ,w+u`)f}`+10 %.Og)E&ՠbMa8.FJה|BOQ 'l7~Znz\tȨCkŮ !cJ(d>.dF,}^߆&;%KB&J>cK7[HveoǮ#žP&m!>KgNQo鯴jy![3"e~7FrTv%99Bř"{,o#\'|ܤf%cDcv'0{3 1W0 @n[m6vO o BF3"ds}=*5A'/":ߌOey:ITW ҼcL')wNf;?r7tH#7KO!ǺpKa27imTJ sB|pm|TZi ˱)ic[D|l%1-(ZM1$9*gpZ' n8 %7`^QmXnљOw79 ~g h3iy&:B-XKb9h#{@͛Q3JzL{d[q-#rJ7E?NK̟˳CaZΚ8c0`ce]}0?ޱd>LFgʹ\s:c5 *{X'Y+bV!3-"Ct\Q[??BźkVexL˳k ;TJuOջ H 54b;,rOi/Knh65:1]hnCxLq}y1'ױuo^u﮲o*T[¶UªWU{WwX7.שmJnWWɭJzad"lS{SL}0&Rb,9QDN,:=&s攊c{ʙFFԼC-=j_t,{jwÖxt+zԝve1LߨP?7&4y>?u[U"#WgO֪F$L_]7194kӮ2{^0_JRK;m! 0ulwܪ`_zDD S}6[շf̀w:ED[[}Kv619SEĚy]+_G[@._=硕 ;q f;j:ER3^ժ@Ey:)2Lɳ2|ԾdئVx=e)vc8O?V*?I;>JZvҷchZ~dU{bW[{R`S)b΢M!~gjM6Ċ*ZUڊv݈x:bUI@EofSj1"8}ǮeZCJB!~wP·&4Ѹp#svu?@+ہzz݊D`SH[D(*ġ|x5a[ÞodVe.U2i4Fn-xMmlm^n8(I?DgZvɼs-]b(Ý]zP흆Mk+*[RwWC;mhȚ]6vX2.~A/2 ]/0^}IC\5A,bdC/vO^`:}gSwZ42Lt-kLKg2Kn c?ncnCc+^h_Yǭ>/ =:Aڔb?/DY~O ~qY{N+7ZC-\nz8+̔$N-+sUy.3?[(jVD[PK<>Z$PKHMETA-INF/MANIFEST.MFmAo0; #t:!Ŕb7B[@3dM'9bp66zk@aԝ6`frrb\Mn }PKPKHE4META-INF/CERT.SFmKo@= ef,ICQDCJЍr__cDIw'_>9!JT-& CSoʔV$} 3.aIÖJ)hVlM (l`mW˔@[j#hU-*m1P̵wLM)$*A6%:blڋWs0Ĉkd 氯BIKx/ )Љ"ߑ/;sxV E)24"jcDkZު0hw!cW ݨ}JMg%~/>[PKE4PKH(tMETA-INF/CERT.RSAU?ԋ6"9J5 Yې,#%d(!,:r,YY"f77{98?>}^uѽu>(',Q0(8 p_ͤ#S:2 C20( 8 #%6A %3CSGPɠ( r@q /nxB"\AGӆEȠ$ qdE}"Ǘr(%x TaA5e qSAa a ?xn0ߵ!1uXž7s71jiӅvx4 ;YrR`T:#ߔ*V >||U>TW=kE`otP}8)bGB妀96B;0BE#sJJH>Im))- ,Fu\JkO7̛{(- rO02dM{ݍ! SqVyzHJdmhɑkDRYCD79Δ=zVoܞz6Rfǩܤ&^3SZT]PM7UJLm:^G)-4G]3.Skca)ZЬ컠Qx`e1oh+ Tw?A4ߥ7-#Q-Ӵbw9ꈽT.n{YPx6'ǃ=a^ҩD-aTl 08}~"I#B:ܬғ837DEn_.~; |?`?5 ;yfb|H~WZD4L PMH9BZk$}&ޗ"'?(IR9'(C}ס}'Q/hF=ȜM{Ӧ. <&wm/UùO-8a,\Tol[!0lYӖfRH3SrO?CAqJTF|\š:b䬟cKZq҉/Oω-TłւOѥg_Y H#FmWnfʠTwu+[ q$ZYH~:o%)(YB{эۙF7Ż5d~ZK)+2/Fl[O#趣IO2zt}4Gw\ˤ% .gx6O7 k+6J5(`:h"'&U0L~bN gR]w 5S^ ?bj%Xaں#u5fowޜXeLg&vCO;=/||WuJgPwd;ˑ~ pr)eۡ׬/Szjۯu(:>p ӇN PK(tPKHUnAndroidManifest.xmlPK H=-res/drawable/ic_launcher.pngPKHS L res/layout/activity_main.xmlPK Hch) resources.arscPKH<>Z$ @classes.dexPKH5 META-INF/MANIFEST.MFPKHE4!META-INF/CERT.SFPKH(t"META-INF/CERT.RSAPK *././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/obb.main.twoversions_1101615.apk0000644000175000017500000002633014620351225022576 0ustar00hanshansPKH@AndroidManifest.xmlo[EnbF1n_nb?) TҨIKH(u&!!9gs!qп!77^%yv3('r(IDj]ysww18ڃ?P&DTA]{t>;= 7(rCh ڄ~~*=z{P5jO{t۰Y*=Q3k1k"Q ŧۧg-R3l9xTijf *ߠ/Ƕ!=akm²Ʀʇ=؀o #Q^QkT_ZŽk*'"1|v.RmUh]x6@ZF'jm]kLնqF5HW᳉?W񎺰?}fq:XULtZqR3z]{!ߟBM)QZeա:S۰quGs}:?Z +;=ygϏSNn7z>@dͻ+Ova..x7}ZQO峎U66bSgݸ 6Б5+ M7|4f *;=dB#nԹ-cGn#v-KʧYyS[̙3E9ӌ aFN:$L0IL2hzr' ]"q04 '6'/k\Գ aVWA~y41es?(<(ybabqqH$[Iq}Yؗq>f&78>d6MJ.ښ#F7F-D޴5^K}Jx)ggq\_p͈7b֘4X}ʲ7i%oп%C7^Fx7ke:; oNq>o ϶s^ /k$yYx94^+兗x +\  xE W^Q,Jo+ o^-o«-oAU,Eۯŷk9{PK@PK H=-res/drawable/ic_launcher.pngPNG  IHDRw=LIDATHǥyPuƟ{².˲ 8ႈ 628yr OCM5V^ʡbY"0,,{DPXϟ>ߋ4zљp a22x@-q &6'xnب4Ռs-<!a^zD\W6=YMQ2ɗw|՟-f̶vJA؜s1Ym®n>/]ҹr8୔@(r1.}j:Oi> DowJ'CRRVJ eMPy|{|7sRNQy(KNnቹM{p՝Ғ6Q:h++-LxȄsՆIT~M≹\{V{TTX@vL (Ćyq]zAnBFZmHocs  Çd6ihh CCfQ!j2OPSեlUY G?15t"GUˢy*(M6\$""DJiujdo5GcF^G"@ Vx\|T$SgOt ::erOK\]Ϟb¶hӫnZ>5^7 S~6B3Щb#RجJ[ =64%1N ('5+٥bvTD%W< `y*VnJK6͵[h8l3PA$M;QZ1[,U3|.nlIuG2 3 eb2V'0`ę&Uڂg ,.!蒎Q1 F|UJvuӆaL06 cLzN׎zXYٹLGBr8#0LmMOS7onDVv͞} DLژ.C{e 󳵴&cY,ZKSiZ=I`҇6%]Nm},ŅU5SN܈mݷ<65}E޷'0CקԄf.̙3;EnK=_d*/r.Ѵ#>)?/Ԟ H\o7aU%(|${hjǜIL~ cS/LҘPPX"1sgsLuP!!"@&849^1|'3}ȕs_-]$IVM1,,D-aEDA̤rIENDB`PKHS Lres/layout/activity_main.xmluN@=[$BHA"5%$ 'Ql*x$ G;es;wofw} ƘMCt- G«& 99w%fmF)B[nTχUПg!F$~"u.m*~RUx:R}o{EO١R3~`)6d?Tޟ#]{ȣ>64u6Z?p̑?gqդ~,ᛙPKS LPK Hchresources.arsc 0<xres/drawable/ic_launcher.pngres/layout/activity_main.xmlOBB Main Two VersionsSettings Hello world! obb.main.twoversions l, 0attrdrawablelayoutstring08Ln ic_launcher activity_mainapp_nameaction_settings hello_worldH\L4H\L4HT4 PKH<>Z$ classes.dex l[u}(Rz"-K$ee[(qDcK]t%['Yz6HʒMӤ k,[:4E--@[-Z,, eAYs{{T^E}8~Ч?߫|-VXoQݘ oYA҉6@y &dʬ!66QT9p\EuS6xv& `'W?wA 3 !U&p<^~ ms"x | ^FQ8ix ;*76xxw &0 )`*> ~\O?_/W 6x0:ZZ 6!p+w"8 .3yo B]p-Ȁ ` >nA ,w+u`)f}`+10 %.Og)E&ՠbMa8.FJה|BOQ 'l7~Znz\tȨCkŮ !cJ(d>.dF,}^߆&;%KB&J>cK7[HveoǮ#žP&m!>KgNQo鯴jy![3"e~7FrTv%99Bř"{,o#\'|ܤf%cDcv'0{3 1W0 @n[m6vO o BF3"ds}=*5A'/":ߌOey:ITW ҼcL')wNf;?r7tH#7KO!ǺpKa27imTJ sB|pm|TZi ˱)ic[D|l%1-(ZM1$9*gpZ' n8 %7`^QmXnљOw79 ~g h3iy&:B-XKb9h#{@͛Q3JzL{d[q-#rJ7E?NK̟˳CaZΚ8c0`ce]}0?ޱd>LFgʹ\s:c5 *{X'Y+bV!3-"Ct\Q[??BźkVexL˳k ;TJuOջ H 54b;,rOi/Knh65:1]hnCxLq}y1'ױuo^u﮲o*T[¶UªWU{WwX7.שmJnWWɭJzad"lS{SL}0&Rb,9QDN,:=&s攊c{ʙFFԼC-=j_t,{jwÖxt+zԝve1LߨP?7&4y>?u[U"#WgO֪F$L_]7194kӮ2{^0_JRK;m! 0ulwܪ`_zDD S}6[շf̀w:ED[[}Kv619SEĚy]+_G[@._=硕 ;q f;j:ER3^ժ@Ey:)2Lɳ2|ԾdئVx=e)vc8O?V*?I;>JZvҷchZ~dU{bW[{R`S)b΢M!~gjM6Ċ*ZUڊv݈x:bUI@EofSj1"8}ǮeZCJB!~wP·&4Ѹp#svu?@+ہzz݊D`SH[D(*ġ|x5a[ÞodVe.U2i4Fn-xMmlm^n8(I?DgZvɼs-]b(Ý]zP흆Mk+*[RwWC;mhȚ]6vX2.~A/2 ]/0^}IC\5A,bdC/vO^`:}gSwZ42Lt-kLKg2Kn c?ncnCc+^h_Yǭ>/ =:Aڔb?/DY~O ~qY{N+7ZC-\nz8+̔$N-+sUy.3?[(jVD[PK<>Z$PKHt|META-INF/MANIFEST.MFmMk0{ߡ /Mء˜NVJEbkFIO?a[Ϗgc)p6zk@a}ӷ`=x NУixl璚F2z݀0:qy(~a8%^8[ X+Z[աѠN<^`[ 7P#Qz[y3~dj fj]B*.W K [ćP/MA_@:O/R @KA#W|IװPKt|PKH7META-INF/CERT.SFmKo@= e"$]hUV18̀\~}i%ݝ|( wPaˌ % y ܓCe\ -y`t:Q(k/GmLb!B~D#N悚]S5h1|V[NFYCkک8MI/quG::Oz\W)Ph#ϭ!Cy \SzȥbrMyx,RUÎcq\ ^lkC}*JJG[#j[)Yc0NQj_\vgnR="1gc0ۨlWȒ Z.?;prJtf;oAUk7WJY9y%7^C۩w)4ۊN#e;,N[Uq4|Wt\Qm42g"p2[׺切-+}-Z~Zwʹ]!]™Y^oɧ Gf.|VE$t%"\\XyO!i+lƾ@ pE:#;׉^hML_FY=s 󭨩kfV!ݬ2#Q[nV߶pEqPi7 =FZ zKL.MH쩉aUlka=ԅ}Ouz"R`>h^M=h柎uϩ+7͎twZ[XOQP}sX5퀝qllxj~6VwTӈ 3g71Sa\dևT3T.uiASbh;kdOVy4f3=Σgxf_q=h$D3N6u֋{bi|'5-ۃ^q@Y#?qÇl nuI57h2ዑ~qp !/?Ÿ AyeVKMfj(Q^z"sڍn?gWM}nP ]!n7p3{{[`i4-^|TbA\ :"T=00+0uTXH\D&J\w(G Š9Kś##ؠD@!|V/Sź`q(&Q/8*!K\b -r=M^· =~o}A7|@pKۿKNtu^cYy5/MS[h,]_y$Z9琗巽1ef}˳vnP]ѽ*_Sz"U烉-Fݒ΋$EO`'i>J|rcW^aL禉cdC|(i!FfZ$ @classes.dexPKHt|5 META-INF/MANIFEST.MFPKH7!META-INF/CERT.SFPKH du#META-INF/CERT.RSAPK *././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/obb.main.twoversions_1101617.apk0000644000175000017500000002633114620351225022601 0ustar00hanshansPKHm{AndroidManifest.xmlo[EnbF1n_nb?^l) TҨIKH(u&!!9gs!qп!77^%yv3('r(IDj]ysww18ڃ?P&DTA]{t>;= 7(rCh ڄ~~*=z{P5jO{t۰Y*=Q3k1k"Q ŧۧg-R3l9xTijf *ߠ/Ƕ!=akm²Ʀʇ=؀o #Q^Qk4{wUOWEc \Rեڪ,*lN`6ڙ1mjّ guak7LE̖p:XULtZqR3z]{!ߟBM)QZeա:S۰quGs}:?Z +;=ygϏSNn7z>@dͻ+Ova..x7}ZQO峎U66bSgݸ 6Б5+ M7|4f *;=dB#nԹ-cGn#v-KʧYyS[̙3E9ӌ aFN:$L0IL2hzr' ]"q04 '6'/k\Գ aVWA~y41es?(<(ybabqqH$[Iq}Yؗq>f&78>d6MJ.ښ#F7F-D޴5^K}Jx)ggq\_p͈7b֘4X}ʲ7i%oп%C7^Fx7ke:; oNq>o ϶s^ /k$yYx94^+兗x +\ o>-b޼5^+Wx% W^I-o«-oAU,Eۯŷk9{PKm{PK H=-res/drawable/ic_launcher.pngPNG  IHDRw=LIDATHǥyPuƟ{².˲ 8ႈ 628yr OCM5V^ʡbY"0,,{DPXϟ>ߋ4zљp a22x@-q &6'xnب4Ռs-<!a^zD\W6=YMQ2ɗw|՟-f̶vJA؜s1Ym®n>/]ҹr8୔@(r1.}j:Oi> DowJ'CRRVJ eMPy|{|7sRNQy(KNnቹM{p՝Ғ6Q:h++-LxȄsՆIT~M≹\{V{TTX@vL (Ćyq]zAnBFZmHocs  Çd6ihh CCfQ!j2OPSեlUY G?15t"GUˢy*(M6\$""DJiujdo5GcF^G"@ Vx\|T$SgOt ::erOK\]Ϟb¶hӫnZ>5^7 S~6B3Щb#RجJ[ =64%1N ('5+٥bvTD%W< `y*VnJK6͵[h8l3PA$M;QZ1[,U3|.nlIuG2 3 eb2V'0`ę&Uڂg ,.!蒎Q1 F|UJvuӆaL06 cLzN׎zXYٹLGBr8#0LmMOS7onDVv͞} DLژ.C{e 󳵴&cY,ZKSiZ=I`҇6%]Nm},ŅU5SN܈mݷ<65}E޷'0CקԄf.̙3;EnK=_d*/r.Ѵ#>)?/Ԟ H\o7aU%(|${hjǜIL~ cS/LҘPPX"1sgsLuP!!"@&849^1|'3}ȕs_-]$IVM1,,D-aEDA̤rIENDB`PKHS Lres/layout/activity_main.xmluN@=[$BHA"5%$ 'Ql*x$ G;es;wofw} ƘMCt- G«& 99w%fmF)B[nTχUПg!F$~"u.m*~RUx:R}o{EO١R3~`)6d?Tޟ#]{ȣ>64u6Z?p̑?gqդ~,ᛙPKS LPK Hchresources.arsc 0<xres/drawable/ic_launcher.pngres/layout/activity_main.xmlOBB Main Two VersionsSettings Hello world! obb.main.twoversions l, 0attrdrawablelayoutstring08Ln ic_launcher activity_mainapp_nameaction_settings hello_worldH\L4H\L4HT4 PKH<>Z$ classes.dex l[u}(Rz"-K$ee[(qDcK]t%['Yz6HʒMӤ k,[:4E--@[-Z,, eAYs{{T^E}8~Ч?߫|-VXoQݘ oYA҉6@y &dʬ!66QT9p\EuS6xv& `'W?wA 3 !U&p<^~ ms"x | ^FQ8ix ;*76xxw &0 )`*> ~\O?_/W 6x0:ZZ 6!p+w"8 .3yo B]p-Ȁ ` >nA ,w+u`)f}`+10 %.Og)E&ՠbMa8.FJה|BOQ 'l7~Znz\tȨCkŮ !cJ(d>.dF,}^߆&;%KB&J>cK7[HveoǮ#žP&m!>KgNQo鯴jy![3"e~7FrTv%99Bř"{,o#\'|ܤf%cDcv'0{3 1W0 @n[m6vO o BF3"ds}=*5A'/":ߌOey:ITW ҼcL')wNf;?r7tH#7KO!ǺpKa27imTJ sB|pm|TZi ˱)ic[D|l%1-(ZM1$9*gpZ' n8 %7`^QmXnљOw79 ~g h3iy&:B-XKb9h#{@͛Q3JzL{d[q-#rJ7E?NK̟˳CaZΚ8c0`ce]}0?ޱd>LFgʹ\s:c5 *{X'Y+bV!3-"Ct\Q[??BźkVexL˳k ;TJuOջ H 54b;,rOi/Knh65:1]hnCxLq}y1'ױuo^u﮲o*T[¶UªWU{WwX7.שmJnWWɭJzad"lS{SL}0&Rb,9QDN,:=&s攊c{ʙFFԼC-=j_t,{jwÖxt+zԝve1LߨP?7&4y>?u[U"#WgO֪F$L_]7194kӮ2{^0_JRK;m! 0ulwܪ`_zDD S}6[շf̀w:ED[[}Kv619SEĚy]+_G[@._=硕 ;q f;j:ER3^ժ@Ey:)2Lɳ2|ԾdئVx=e)vc8O?V*?I;>JZvҷchZ~dU{bW[{R`S)b΢M!~gjM6Ċ*ZUڊv݈x:bUI@EofSj1"8}ǮeZCJB!~wP·&4Ѹp#svu?@+ہzz݊D`SH[D(*ġ|x5a[ÞodVe.U2i4Fn-xMmlm^n8(I?DgZvɼs-]b(Ý]zP흆Mk+*[RwWC;mhȚ]6vX2.~A/2 ]/0^}IC\5A,bdC/vO^`:}gSwZ42Lt-kLKg2Kn c?ncnCc+^h_Yǭ>/ =:Aڔb?/DY~O ~qY{N+7ZC-\nz8+̔$N-+sUy.3?[(jVD[PK<>Z$PKH1META-INF/MANIFEST.MFmj@} eD ]ؘh*Fƍ̌q$35^}چn_8g 65QJsZo["`nT_ $e[3glk9귚]C]S\|[!C<^uCQD{X RF\*نAY*D JAVnoh}09D;nrOPK1PKHݕ"6META-INF/CERT.SFmKo@= e% VܘFC__G/7'D(o ¶+(L ~B( er0:\-VVgpw9/9_/;EA@ mW)MY܁ kr/,?AMv==kd7TM *J89B8끞fCsgg*H:#K?iD-՜4+NH@h#kl]s8tUZZa2:H @Ha_6%qQgu;fPKݕ"6PKH5k-RvMETA-INF/CERT.RSAU?ԉ0J 341 ׺1jn6E)W02*a60|~w<$ ^~dBP>X! >0(D%a80/ B8 ( OE}Mw8WF/@JL@1@dI uCC>% !z955m!!/0(2A}Pe=а`oeOg #%UPCb쥄@4ls$? I0W^FA!^b\Mi43 oޔ,f3"io,VPE9#D)OL=>kiS3o{B''WŚ}@VfUi@y`oU$<%7]ܢ/@Z uKZqZM8_EFJ!c|t@䋮/UP jUs2O Eb+#||S.*QW4o\nT{EwdwGy[`'3JbuRGA]ue}]gױ1ur:-_/$OnOh[r\DU>BNT:$GsY9\^H"1`E3vn:܂B;ʸO&1cwɏvWڥr"q6B{䊤zVbo/b>,"OGїKש9cuń6TҴ Ah<+%Кء٢7t Iz=mm=z8|-ebnI\C\zbnR8k;LiJzhtYzӫKW#V v&?G9`ڂgGj>KYg ѸC,w)Dqx\}t9:  36n;pУHwwF <͢u'c~٢]fMf@=%mݽ|#)B{H8XT`Vo"J^rMo!_~MD3+_PK5k-RvPKHm{AndroidManifest.xmlPK H=-res/drawable/ic_launcher.pngPKHS L res/layout/activity_main.xmlPK Hch) resources.arscPKH<>Z$ @classes.dexPKH15 META-INF/MANIFEST.MFPKHݕ"6!META-INF/CERT.SFPKH5k-Rv#META-INF/CERT.RSAPK *././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/obb.main.twoversions_1101617_src.tar.gz0000644000175000017500000000022614620351225024075 0ustar00hanshansX1 1ԞbN M2m PDa\Fy /X⦣YI_!$C-S_D't.,>Ԫdӏ"AtF4mqn2(././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/repo/obb.mainpatch.current/0000755000175000017500000000000014620351546021305 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9243832 fdroidserver-2.3a1/tests/repo/obb.mainpatch.current/en-US/0000755000175000017500000000000014620351546022234 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/obb.mainpatch.current/en-US/featureGraphic.png0000644000175000017500000005742014620351225025675 0ustar00hanshansPNG  IHDR&_+sBIT|d IDATxisWOd&@LO۴]7Y}4Y͵[*J$ʼnL D.f!$qcp [O :&ove>4JXYsIϹ7-AE7BI \k&/(@MMoʍ"@M{A!KCW!wECo!$.Cc@{E$ h#F@@@G N#$Ht?=$@WD]$:hiTt !@+@71Bא.C$:'43t &ڏ@pFx*$ZjɣU HMf$@+hǛrUsh#-B`^H 0o$څ@ XA,Iv tH4X&@CQ`hh6 D`UH4 !j$@l=yDH4 NQ@Cl=yCwP$`'9H?# $j@S?5@ b& z>OƅM>/Fa)^V?ٕ]X&ӿ\#iTvZrty&@DfHM.oK@,K$iH -uBuUO?_;WFzb^ VUPo H?,_~/  ۅI#bxb꣹.K # Z$Vo|eI2# : \%=eg]=BBdT0~[  #GِX KFףM5 X>f,?U~cp5^ %b&XGP `H, ?H<HI! ,XC %- f7K< `H,?W$IŢ`xoFLVzM aEGA XT,چ~~Jڄ*!ڂ~[HhA`4A?l$Ich*Jv~W;tDVGcV `H ?!D&" 0? ?&y_H$P0;VU* pGZ#p$ݑǛr~̊D:# p7 5C. NX*f?:!(TfG`P7zChZfA`x7]l 0N [b**'`@`U=HX57G mXgO2קguG `4V*!p@[L&$>.7A` >mg>X87C5Xhh;,IÛ]qK~ ?!  \+l=A`!(EXO]" mV}?Kp-F~XZ.G Uk?̆ǻhѪ@QwG[ym(p<]:p;UIj7KE+6X,^ ._x7Ǫ?n/`MG5r@g]n @Mt96LpJ.u-`*oxg@:]s .iԀh ҵ_X M9 <{Uhk{k_tUժ??WXg.ҐNP`%oB+@7^(T5Ot(\S.l @/ !\&3.Ď?7Q7E\$ųZ Gtʌj![zhՇ`(̂$6he`fk/$m&z>`?t@1ZX?M捹@ u VH$nj[/,?=e tS۪Z`2MԢ@V$=mhM;>!I[Kvl=ޔZb?.m3Ix߆ՊhOvLURWI0 Vv#4IK O?IH*F'XڋD$vkr/58 #4Iݚ\@SO8ڀ$^MEzhՇ`{@{TIۀij@#M<߳Jh̤gڦ1iCh3@;5q.]M;FQ Ǜ>sD@4 Q @[$UjL`f2+":$.MhL=ttIЈ@;0Ah hDxIK H4?Gh&T>?l\$|u'X# 4_ݫj`h.n$lu'XّUM4?wGhRM[5Θx?$\ue' ?@35]`ɣU["`qHT*%v\# 4Oc%4?C]*@?,IYP@N e>:hŸIl=\!gOYy`NUIxVV9K5Il=ެIp9$uE@3!j`?$ uXy>!H_C@m}´$4@?Po@,w6VP'Ò*VV  _~ύME+Po-=+4IYIh@}*&h)H?ڊ*'(瓧V- # 3,?AR[O-p nzYvR?*>Z;>(heUKK? Gk[o@袥$(ꁾ0*Q.z .=P˨X|*TךC?@7,4x`" ޢ[@?R٪4 ?Z͟`%X h%(VӨo`U+Xd*(VpTӸC?VgQU`X JdFXX*0o$v{`5@k!h*`3RX>V2T˶56VP,2(pSsK̻4(@\ J 4-@QV*Dzh UUb,o#m=P$ 3ڌ{nX 2͸snW@?0wd@p̟KMN bd@p `Ȅ.p%u9sE_%,)el-}^$FAkн\M~5U'_n.EI1J.W/ζ?1iԿ~A!2 7O+2@?JͯM |nU2sI7 m+7^$a4!~fI L(Wʄ'[Vo;׾ަ>yy:hb_fod2?E6!hSO}E|u!0,&mꯘ~ornߏ.yL X=I*`L^#*xchz*7,g擲~IXwە_\Ŀ㽤 A0(h*nSߜ7Jɀ"J1H b8Ž0_`.ک KVO)+ 7=oV{E,]~]>\x4eA*EWL1b8 zb>I 8u, `xdLʀ?̕I~Я_=7s wggRMKj (T(% }'C?|%UiI,gJljO˕Z2{pTM\[*0?@|) >XZp?+ >o;9*? UK}iM m;X(-~6%.)  &+ݫWv)tg 9 &y#!y9L0a Ve;I$aUi6]_5^f>Sf27cs6Is7Q!깩*wT-P0@`yLl=yZ79̤I`?xܞo<ҿs6?om!H>*v<ʝ@Sp'peM`>Xmzj?3R" x\0:Aܔy "292` z h6P_jf~ >.Ct/߻/A嶊e{@?d'v(ܕ$PW+A X0VI HLZ`Ұ)|ԧ>\{jwM]LtS6ad`[@?0Rgfv~Ͱ蟙Oq~T]Z:ҜS0WRLyFP=@=pUs[!pwY i-փk#HkI_o^w^7i#H2z& 2S/T3ų;f Z2I!LK=ߚvH A \Cz<a@]p, @+Rp RLYp+(Werl K?L`[5࿋Vs ̵YX5@ Epwϟ< ; X.Ԫ* T(.+;V~M!zr7&1 dG`}[l,rU+nk{ ^'>A`L=i?lamX.`aQ2пtp 3'lyprP,Rb4V5g~pY%ެA$C 8]#Ǜw@?Xժ/Hec'$-`L^H%!6n.nfF,V/R`tϟmۏi,U{*n. b 0GSm Rߤ̵, jˆcV>v2OkiZ )1Qm,U\|0#ޠJAꙥR$c/h2V|t/v? l҃?ǿT Yj(Ү*\<V QW5_aeM]eI;JIwǽ0OcIL܉Y !MVWL=I%VNѳ+jwE0~fw$0;Spej@ep@e̤+xo`L7L=|mp M7r0FV!<{J)0&҃ʦ'#=~'I4r<@ 1Ta}VHe`0[4V}3ZpT0Ix)`6 @`*_Vd!e'h9zUL,L> MS?K$! BۼLdR0׹L$K `F732ޣSUTV]/zsQ̈PmeJ4i]y\MA̎`!BYF(=1Wɝ2$3gOx +FS2 s0G5 L`ܤ`7nrLdi?cVL2\P.H" KzA+nd}F&ei{@!~̤,HkT3K+74Y땕4Ap;T@??X?)=Lndrzhb0Ew?p;$33K7_}3++~<ҸzfRp`v$3~H+2*T 6Ml`))=`]S2\*#iMwY2hzy^OGSSA@_O% J7fր$7B:pRRVV:ͥW'Q[:׋B/ON҅*^]ꇞz!Fi`ROiMn(ۘ\p uA=)P&)J:- U*yu^(]TI"WFd#DܛY //(rm,#x/I?BHO7`z%қSN H.kuR6zғ,m덠LܔIˍVH.eJYHLkjFݸ.m~Ao+wk#='Ѓ+9̶H&P~B4Q'GM:;vN]gE[ ΙBNrà,H9)/FͬlT$`<>`^Y`22%Mo _r\?:}uKV"JL6M&gkA\r;i;t#CdEfR/LAT i,ۃ绅+asW߳MG*tg݃~(}nZIvʝ\]x?Lix?UDOIv V4{?g:<~<.m+ϴ˴޳t,~0\V {9r$LT*z1IK'#듨 }&g;ҪR"i0 ^ГuS{}HՇ+$H@) i` Bzy\D9qKmpwқ( jk'T `щJcDfJQ99t (3AA Lnt}thb)߷s9+=UUB f\ _m (ZĔdF. t +LraпǣwRwNrIZ['HPtWAALz73HԉI0Etw.`h "}Ks"C^t;\NGJ]#i绹Lg Z0J/\Ѥܶh;wJAg<uPngQt>MKo^r87Q}e6LAjV̕I RE:l_f>^!adl\3AL G%@=T5ff*,m en!R^Y_3_xL)8қ }S蛃B?DTuXe)IԷI}SFP8s\RWT}\!jۿdJ[N>sOQwr}á+.p=kTH0mU|7ZOZL^(LI%rD\=OUŪ T5VAuO]_\w 4N+Y wN?s}_h4LL+Ӫ?n> PL mgV{ʂ5i XSZ?+Ө }[Nj\{_c;q~{ F=3\\(yp<Aqot)UKO#X%tXns}kdpCD\ L3F!?Dkd R5$+H !M7Y埤a7#}_,yt+T{AL<f0SÌ+G4̔JՖQiӨo +~7&7-P(JO]Q~/p`z+X3@+ 2oPmy˘,=_Fmmt;QCW{>v7Qg瑷*yoճr'>@(=cX5eS+~X-)F4~:vBNF4*W'Q[ۅ]ǣ\*b#gJs@zUI (e>`BH[MnXclΣkXHN;(bзϧ@]QH=~A2WFLʂ'W@$]{!:BzS_/Qâ[T3\Ĩ^~s?gғ~Yȣp,Bt h1+$K:Sov >:W˚(4˽BkAk7x\`RRf>@6+WYfX\nmKC׋B+tz>)eks$@^"j$ŬU[M,M ;/\G#㨯 }[q( a!|~ezfzзq+IsCHNZ ljd [j{<ۃB;g;FO?뻃B[۹+~vtɔFY9V$Qz}\{맣Ex}Z6DaEB{d@7v HzaN>D`Lfµ{8nv m3N9B?E흧s akCVFy1zD )mxe/DU+COGOpu<,KtA,  B0ez80e>/JB]z.w̿빴{z[F[`ҹ5M5h5Rժ o w {~O)(+NGo K/>\3 BO*RB@tګ-sn:I/>(A˓ák*:^D}{~N%/Y!mEMuo+`]Q_7?(t2tcCn FaO4Ȥ@lA )FcZLKDf?tVHoN]/vs}H}AwrKx]g霚Yr\ A *:K%-gO^+4z I }Wh4jD4^yvN*B箳A(/ӋgrI̳@e>` rOoUjK@$Q:~> èQ+v}u4bGQ8,}802^L `&s* hh,)X.:l'绅^D G\+( s듨绅 LӃ~6> fRpS0O uH@ˤ&I :GQ:fʱC绹zAzn/>J CH@ 6'_jJ}Q!m~8,~GQ'yy≤W(jWLo6~Hi) M^;Dڦũ*Osi,\+g߭ȥ'QEZ&=^ק*},j<; h!+Nb}OFx}cDOS5ŗ{A=zf=,Nj''-DHoFbεtLQkge;-ha 2i94iYi*ْRD(]WQLCu\ۉV} "-bnbnL pޜrU]x Ι뇣4 prfަY&ܫϝY?8w(èݳQ#Q!휥6Xu>\i`( h]};wwaԷ+{*$.P&d]yL\9Hf@h!鼸sQ?s̚[w`0FޙkIwKJ h+fS=Gw h=KC綧qn9ޜFrsu1,H殢j}qbb6n@V}^#.p:4L ֍áhM[sYDh!*E|WyNJ2j͕Z7Fi7QUո_T@ېbnrΊTR>T4K(害U<fLQ!->HܽߖKi@^ UTWZ]4oXH;b̨>%Bڄ)c"9JEvE`VI? h@dD<\iplEΦ7̪UH@xKfMf5t"0dN-"ǟc6 rN8yy(ܘ]*)֠Z yq"Yf)`Q4ߕ ",_>ܾ̤@,d¸J h"M^~и>`zA0ɤ^H>z-",MhʤP6U`5RG 633eH@D %L` ()M/Lv0*څ:/xh mؾk69 &3i2c! LR5).O[sIe Z_pn#N mUIC `LTN>5P隭ROٹUy]Ub$EX WHJ{}Z6)'GIrx.̪$څHڶ+e}v} c% L kvrU?MoXu MaU %oT̬ چ hdYĭ:fكؙT!T@qe}qsdLki\fV^kb&mKv;D-DZSh \)\ILM&&KO6>Zr$m͍U0ֳ+HL=?}F L:ʕk tޟ_E\MR;UUP3ӯ6aǎaJ^{Aag3pBE <Zca^W ۻ綮$<ڼ/eWMo3?<*.$YÒ7[X Zz7[MGg&ZR.{['mY$RfƤF |o+>Z{/eD?+w+iv{V78WR[ӣovJfޮն! ,3*`KY$%%>Mz:J:\/&-D\g{I5Ă1f7'%VI6{O=o`4sa%i[/4tisP?")!_w^$tsh~% vbk`|s==r.b˻њ>m[=k5r߄3ql:$Z+Ceo Xb_nR.b1Θ^n}oFkp;ieяM\,eЅh0I6>o՝F$6}㜦b H zI2rvְ6&xяϋeѯI\z-7пkNa6ŀRจH p@Rr5nwMs`3hR\"梎+&ӝu9hnz$\.]%XBWZ|]H?`dj,Z>NVKF_Ʈeո{o+雃F;hvF[ }ӤK)UAV V\ٌSKpELzZaQ)a5 ƴJ7L5A6?.wՉk /utInѯcW$NVq~)EI_7F&=H4Dz~V$7rteZIbD%/nt#ZoMk4e39h?&\ sՖc|}b3P*n Xn%K}o" 8R*;Cӗwm]"=uF%%Ov^z8IM\oU? K+ nBԙɓdDffjMjp+F/;Fk;Eјwgj/}}M΀g࿘:&+R')4RsORѴH i1u˨hRD;ke{kI5ZV։U]T_W4V X!xӟK](>t+8hIYz6vI鯇E/'uE נXwo3铝ꛃV6ttIX$PG+cj!+]JxT噤A%4fD/\] Iiio^p6h;ighj F=6]HV `η߳ ="%5`٣XKLu#i{`rqei~>*z>&YVMA#m MI5V$1W,%_^?3>8`p `7RJ,OƋ2lvm%V㝤KяfE?nNp+F%}諻mG$?3V]R)(b5%V 3XHrIԁ+ٲGSV}p&8;_2lX~5=Jn{LZR+^ZL:)*#+,˧Uw-A_ 0lVjc}cZC_^􇟳?-eɂdm^wm& #TN}WO.1sP+Y1,ɼkپu5oMi4lbo'Q]Z0l[%)ۃn?hVn'وa7ҧ{'?. lq@s&:}= ?bnh dҠiuoϲyяϳ觗_U'nKO|_>nv;>MzF;DTG0œ$k1:@`Ux nXE]]1%U[c. (ȵ}HwדvIm>iO)믇E/&2/{oK6]`,lL75͝F_Gͤ&Iu,++l%YPYLsW*A_@l%u@PhFlMwM$eG_FEF_''|]wZxK igh_K:X7=Lh'飝834%ťRb.\nXy$(q1SX,bZ#=L&}/EֿZ?(zE,"QsZxԿs֣x{[I7́iTNc1|+IUV WF *?5jS %mF;ҳQѣEl(fO/~9ֻu뉯ru;_(hjɾImT5V{[Im'} GII͉N,^pXL; @&Ik4A^k&eu)%E<ʮ׳?Ʈ_F_Eώ\Ʈg_1,b"m/;ˉk]ɝ/}dmoivL&c0iʹfYv& E\X8wĥIv\H|^Ap bUy:Ű\M=b!y5ɤi5=ت'5QѓâvzzT#&fIHt,$ 4Ha0ݡiotgt7'mL&Iz,}X>ђ=Hvr(#W\ G-Uf1/]3]Kz iR (A2oj@W)S _r]kgg8~Ir8zխ?lߘ]AWO?LJs$3)*Z)!b${:qb&+>=!(z1 x *ƁU\I N,x^]#("j^m2Gp*wl|~-D <"MܣV#xRVdӁqn+mx$oTS2WJq7%IHxo-Cdp1#?NNk_s:& Hb 6To  646e5ގ-XZs:울)=oFp&fe}@&3J-M?(;lwH$נ$s*韭}˸&EjBP\\$6nKNTc'{&y6nOJ\%s `R%ԝn?)a:oR<ˣ>n@ՙHi`6IL-jb&Ű?E+R' eU[TTUT5L.sS\ qxVkRT?\Ep~e\\K@6ʦQ&P4s.4iq%}??pu(.o0nDӋkT\4EA/@\7~[<&0K:쏒`1(.(͵n@ +K2YF$sɸERvפ?[%j+E*:騋9r8eag:f?)P\ W8˫:%w'Vb"X OiRQ(ƱcKGxQv'l:ʮq'7w4\s_9WWׂU.p=\RWKdvLgyQfۤ_R.΄q\;ejObg7&%,dQꦉ'٥Σ$w5 ^EQ=ʮzʅl_4.9U' W qW_튠-Udq+HJf;+q*wIf*+oREn z帒AP\?Wh}6.1mq&E*VɡWy2ΊLU]O N99P:EpnVTJEji\CLFM&:?N# Е%Ap8.؞ROkje@qc{LLIqc-`x J:qXb* @p;S'utQqMj HB̈qve3u6BAܰ](6W#rhV%]ׯtFw7M꼈0(o<տܻsݏ*wW1DdRb@L)?!RNl_?ɿ:?ŀ?2:mN=ˣ }|~'-E5ho9ěbyf ƍ x]>ԚIR*AY?gzs$ŧf?&w} iő=x$k@ ϭ6)3S#~xXwo!Zf~%e$z1jC k)sI"O?n WUk]) ,[,;+WM[-dFяjRդ&">&+e'QlswEʊk?~o{;A pMhKY*5O-6mHV &)pSJz |{lUGƗLRYDGoRɚ+qOXNׇpM(m|UNW=鯽Z Mq%դ47E@<_`sgecfѱc'~Ձ~R^OUO4BO` >/9\D’I 0;ik٬=R=g`mjϵ`jy\>{D}8 #/Te>-}`5:_?yrIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/obb.mainpatch.current/en-US/icon.png0000644000175000017500000077402114620351225023677 0ustar00hanshansPNG  IHDRgAMA asRGB cHRMz&u0`:pQ<bKGDC pHYsHHFk>IDATxwTEv9sA ("Ą"((( P* 9 spstNtzq&9yYVws;w]{"( Bo!Ah+PPCO(PPMGnYP( ;P( O_ChP R]y?Z~P( ſP( 2U DeX.C8y=ZB+QFS77ϻοӅʀ_$"=/fu'zG<|޽w BPF% B v@߇?8y>m9oYȀ^B2P]hPP o@>NȀU' *ԋ.~O8f4. z~r^&Xd!GP( RP(D+ڨ,TQG{ +\q'Y)We-<  ӄf 㟋||S\޿BO='4+~|[Bz&zFh?Q( ⯢ Bw"KePXa. ģ@8/h,~b@7ZOhi!B]B^++d/=,A w;^>^Y/rEt2~B/ Mnq|7*!ߏBea}Be"_*P( P(vW6mA?ꭿXޞ/X( ZSh;ꈱ,ŗOX@T^qp黼\BeB&d+]nߩw;.x+҄P8$QL\%xE?81Lϕ|D?,QAcy(⽋?:U +[ B/FU( ş:V A[oztd}=x3zNmŸPY BUһ?Hq9%% ߄dWBi]qkYrBe@o $;A 'Aקl 7BX~d$3AS( şUP(n_^*qw[Ie !W y;vif7FhSre^l@dW˕֯E//B+U$.ʖ{po@1 ˮ \磊)AVA+[z!:OvXP(TBPt]^'J?IzY:/WJ3<_P1OPJ37s@I*2 +""ʒr Bt^d/ dWZt ;A+A$O<,YqOxyuS2`+>h,ϟ\ϯ580rb,+T\Vύh^|*q1`3?@dw{ ^P(T@P(=n ?ڎ,xe'B :Is;hZ ˱y\ Y-eB^ͤ,<A#Rixܢ x#!5雔wh^ zE7 K3"j#aigfgo5ֆNQ c~2g|H;Dgdڦ}_zVK;Ek\;-C3hnlFYڂ4X,`:Di;i|MGB`6hDoyC=LIڅzDͤ)1OcE4GV:EЙR(NG='Bi>-}dshO#1z6z:5 hd$# I%:,!c%c&~>s0[1ޞ5<5y>*ޒW5<7|4`$vh{+= T7>GC{}#25~^3w0Nbʼ pD&>7x Y hDv~3u#^0 f;!|9,5c9H!.xyOgRiްxABྂQO]?} =PfvF4z\y'#Ӻ\}?u ix=G$4?j|+-BeŊL4Ę|q -"t@i;"aĥYL0*[hdbM& |AGK{o BP(/`T_D@)\A N$Md>N9!+bޥ D ۝뢔ZNaDbp?x/v+ݳ S~e>~:i|>6"ll5m0$Zomh[lѷa/4lJ|4Lƴ&M͖m-a*Elգ6a& S(ЏUEGl+D] ƒJS ڎVXi-5/i F[K؄.Ԉz>CCt\z%r5ZT^ 4iLǫԉ"j(44ԇh7*#Ip,17 QpBF80`ބoAv$w܉9x]ޑOm3C|}c'/D1vX!6LC[?G`|4cl4SpKyC/񯹓!|Wc#~柙p<=mi/򚼽Ƨm36Mj2͍&3f'f{a1e0U7{ѨtqB67{.=~cO{WX9=?9x?RV$BeH4ՔD'deL@Cb,+M*+edL+eM]BP((B"W_yPoY^V EO>er2+YNe /'2_%'F'j ]M)KXϿ}wtdsj>Ǚ7}Fw-_okg<$%+m?Y-ϴ{|߆Z>k!޵Aҝv"Q@ЪBeސ+wގq/. ylA~pLVyeJ( ſP(r,qR}B/WKie@LK˓rpPY RYq t{Gb_G_q,e?^gY1 KeŀYfjwZ$*HvCTM[\h˺;2z*>%ؖh;jԹoֺ6eg_֮,=d@)>viY/XkZSVR5,1VLcJp ,8=cxu-ZXEP/gBGxӶ (iFmMq2u+݋+[  gyk7W)TJsY$"( +UA=C?hif )lJ,lDoAgeP qp4ċդԟ:믢Fa65Q(%!76  I &;; ^hDomnTZp !|+7x syGhlv;=76-f| LC{aPK9aRP]0KYiy!DYw~w'®F sW[0K5_sɳ(%*-oj)F^nϷ8s#4&4xş?7zwox:yJ(w{?Y|_ExуE Ԃ5ޞ5ړp9^9j^'ۛN/x2zN81]`^'^'&3Ȥ$a =!L`ȕQ_0 *Fǀ B?P(q&KՖR˕ +2 vi'{} m9=%w9+qr(%5b$VQfulIOjI86,q}b(ͰKβ&V-l=ڲ$Nm~IoZf7{zRKN7ɫoQT5qdjYzBB ѽJ%-iKKŤ촞.R-;KQ4piTBeD%\}r+$8%! MQ9hIWB;04:̋h0D$eZ$"20@UCUm74BPK(JЦ#ApaP;Xj~Xx{B?3\Sů/$ߌߍ28/an'NMp r 0͕&JoF&Ldi~~ش_ (K! ;q,BqH$k|'a78]8kN[?a:x$4vzt>=? @ 8?9;8ځA4?ZoDQ~ )_2825TB42" E{Ai4Q>ŨKbx 4ƒ8{u_ :H@'!ɷ}^ BGW,/';|S|3v@؊߼7._̗o|հco>ܗ)D]^aomVy 9½46L>it5盋;!Fqy&z:.:![[-mfQpg^ۓ^7u9S?ϻ /bn'/dIBe{!j!B o#nu!1-J2@\zl*[ D]d@/yW=)MJeT]  P(VXjwQ=h,o/䊙^}_=:4AA-,R,-)Y 8y=ڗVtSz.*cС{*gQQ3#z%dkWr:~r qV[k<*o-m}3K4. 4WIE?H}zgѬ{]M]Mu!G;8ק;k:CB޵stwtwܴ^:WZ;?{!] tJhagKt>l/P Ob|Ft. ӷ!z @e<$tO@Ģ5 aE)݉,DZ"BaRmNQ 4*`CAU &}&@ OaOa F` Ӡ +,:O LP 6:t XaAUthTPKW {AF͡ B :+tQcq?`%x )D`NpsBc?Lp| xV| =Pm08 !pG‡Ïqnq?Ä ?Ä~>& _^xx`?A`0y0@a0S/F, A< 3g#(6!7p;^ _ k_T\ӱoe*|oR<)sxQ1 'bL^#y*I|40Ɯf-_&xu.>N.l*Sm=ޕw.·]o{1T-GxIxQ˱Kv 4M n;l)PY9*4/ RBG% ş[ȇU^ܣ$T& S~X&p1^.TʕZ&k)C}܋J QE=)rln q΄cc_cXoyfRߧkzS}EK_zu gMX}cZ"Y`4IXE[[>vU=;aɬ2{ʻRWc']})}^ c@H@/C;Q+D;TE(Uሣ1ȅ idP @0W!J>SLQ&L޺7E [OQkьOy cw“_F~/9؜1f%|yü`*6f]y ˼ΣyESu_lf%1SKF??ڟ7wSrşF'ϝv^o|tog|YSHr+wfr}-+dJ`<^^r] (8$P@]47hv)P(:B#zYj_V V]]kr>%Mٕo(8~Y QoEŽ0.aCQmc::"˜ۭvk+[#vL*9N0sc6Şc_cF >|x{/ oϦ){>U3}wȱ2qCwzp8Y|Ib6x_{5Є7ϡ* o򎼵ۋ84!rAN?i؏/8y~)d#b_W ,! p} 88{Vǰc[a;u>!~o| /2C3oh*Hurf|2֘9yƼj'}Z4OuOJnXyii=YUˢ<'=!ť}Xz*|oȄ@zH/QP1;o şP(jv{J~M5B[L*%'k|( ]n=ai"hr҈!QOE=ῄόICuHhd~6^ dGт?|4ԬR/:NXYU箰ִ(3==| ;#2m4![)u'h@xkjO}CާO]>zcLHDQzYT}@YԲ& ן@`0lXXaFOBуР+u!pEBYWP!p"v*lt60XiMSJc eee~ ѿjF\`EG^7 xx5x;A ux|!\  Qja4W8 srP/Dr? _L\~$~qF*ɗ~wK[|PA2m_EOJsb>]64;dW3̍F} ;ڨ꿚7[s*rEݗ+{XAW.:'8Zcrffl/} ݹ,ZXUaK^WUN n=gv^9'2{^v+;-k(]& /7$XZxh\fJn*P99av2 MZ_?P(gT@P;2R}*'FxY :>BVOr%I/Sbjq?m 1e[}7kjEGYaWjLR}vx}]CKm/-sC^,=;m_?//[9kϡڻu-=m˪kMCh2O?e{6b%R45#[tRZxT::o:fc)-h$ م ;†hﰀ{laG K(90hJVA=fI{@op~yXr)ˊ[#Y!,J *L@R2g>T" /Ë+8886¯O1޷;oE,O?>x!o .!J_)MW(ܭCv]&Y`A  @Zx @G0_9!]JWzPR*2Q,e/2 BSn/ BOGM ſ*]k]"*KYXɧA*#(S寈`+%ŏ}Ρ]czbYq[UI?DŽ z4blkYOowxF{XRyEL7(jP|N[N۴hW4V'<90<阀ԙ::bPQ:5P SP UQv?5D4AsjAM,/9Z^KY4BS4lB)TBU1zHh. y~Z7;<w 1RK*_+%Ppy Din3fAM$t1f%&wT.xK>Wn0y!DWk5\%I|Nv|w{'ca6{NINf{`)'Gk|,S8C1?Pʿ`r^S|E.~>'6sFf%qK{<[ݱEٕkhuEZVCgg㷌*C{__^zG_\rm^P2r@X;xyp4r{P(4IPENG.z7ySuMTQAɵ`aGҕhV`h2E$:paCF-> #""KEаٴ.NX1>25eBaW{3%,սt5q/#WF9gM 8xuu. >^vƣ-s,m-_|V9cYsxAr9; #<1]O,>_T> cog?xӌlY ̹ ?-tG"yyѢ`! :  8wXkο:蹈/|n"bXqJ *8֏V oB 1Gw~J p pBcC[=T=N(E)Q8bPC Jz칇={? a[߶ݎJ(9օ%#IS[#h tV /4L* ȥ/Thp!\ B4"-oWC4½4ra(Bgig{$e1I-=5%2'X7-yGi3+ͤB2̊<,x)"gk7-p^p5 T[_xٙ{.9wf2ߋxzb2 ڇXVij!T^9I\.]9Beˁ" BBGBe^M e%ݗK[ҥ]++1b?fN\aW+Fh CCZ#t5i1ui$ vi=H4cOթ3}s- UQ,H@YI> z {~q~v*W(C_9@8ixlxK<8F X@E. dEQ!pJ:rHK:]A"`(Kc-li{*aàq=9Y 3?`q6KǼ/9| 3wY* XNi0ss٩G;Z,M~zUG=6?Œ%1 YktgUߧ] JHS_ے=f%2𗿷r_'zS Q- n]u_w_NdB@OHDtgPkg[Q 4D/P{7dOr,s$cm Ε,:f[,l-;zQ[J-ݣp_|Dܒ3<䴳t[+V3Q;튝5dqlHyTbceеZO6#C<ԊwQ@OD"}HXn .DhyC<"qzC! (!MB"Ǝ n ;]6X ,j0K%w;TBg_@zܾcYA + dxy(D1B3G2#H7zH7BQ\dVQb#5 688y|^qTiq_^^E1=xO#o,2/ObV&0!W- \W D,^ҔPz+A7fW(%BFmBe pKFcwe?ON`dő4L*{{lxzziHKJv\5ՉҊ&^Kz@_! =ֵ tU =$ϴUYZΣvcY~kwd}3R;>=ʲ ,1,̰4ޤ!#c0FREjDM!E(BbzA*z/ %j]GP;eȈضPV0Ԡ*@ p#!HM^.||_xfOx+Tsy8o݈rSq'wd>S<51ms1"su\e#-m4_6zGxz;NT*Y[4FὙm=pcoNq)5Ǖ2^cY 'g= \&獬!JA~(BB ҬO0^ƒ4"4Y9/THȕw ~솿&F%?\dTϨף??\̌a-o;k[޲菵qZۈmdԕmBe(*b5 9hg]i,0hK#4WAK ۗ(hD$<"Gw <g=WBO=F8n}ob `QVA - aB4T@#4u` i-:XyŏKKi }L|6_NB>Sp Y%^>mp,oo>ikUig--[mݲsYYl?C'SvU~x#@.2.ecB.P؋ Y RxyroB񟄪P($ =rN-Yo-U Xz+:Yށ(6+zϷ޴)G2˗pjWѾssXH6o-?[)m_?_ԗ'.blt^e{teF4Ё:& mP 5PQ($2x}!⑌-1HB[#A C@(54-1ń[BP mDofGwVݶ;xH=L=rp]HGO:Rqݸ+HyY^{3_g4[,-__N9e/w毘Sͩ7F]??~#3==捜7sY3>}g98-tㅮ (ҌP& Do?/r_nE\-zJYP(Q ş+^C4zSh;/Ÿ>r@ȁ~vM_j5oSO~e7i{E; s9wu?ɱPf׷;j8w~lm;>bja]ߊiµ4w\6@ۯpc/Il6[$ajoW ?DtaN-yϖ ֣~!`G@`xBLc34|.&KA` $ y  2f vH$!mD8j*&?@SK#y=h?.iNoTz!^hEC%4D-O4w삣6~ݶQTT)-蜭5+fc٣Kgfޮ3r>|G9{o{vdR9E +?Cs.X\ܛh.[7 g(# Q<AB'υ5.z. şUP}w_.KeN ܎/_%}X$L1JZv[@aM_xPUfaGX;p[-w_Y>.w,0SR `; hLF}HvFQQiMfۓ,Tbb`]A2M>tfzh{, ePb&b(Y`^PBcm>چτ$3"ԷBPUL FO:tX@|OÎ8qU܋k d`/(%>uxO~oG(8eL4/kOa s>"#h1d1'sּ8,[ %L,}7ݖQQó)ל8~ݑVb>BP]1#TX&dk0'Dz˥w]L?@!We@/4t\zA痮+&T@.z?&H|OkL?cbbݜ!Fv\>Uٲ#Ң׹n69B>HÔKO'!Z㩰it/ޤ.~t{;E4 P;\L a4q}腎6**QH@fJH/Mao+ڂv7R( &KF k CzOD˕!:b PEkR0 yޤi9c}1χi&ފԉOɛݧ5cI9i'rrY3 ƬnM^J1(k{ج:eOS5vS믔HXnm)x+*wϑr]QOol-8.w8sr?OJ(T@ ~_r~@HhIĠ S?ĭV0b_(@4g=so 2ʌlgQVS˿ֳl̍(6GGփ7%O>/_6GD[%>i3isxJ5*mcٺ'Lv1%R]%Aՠ !jJP ?=R-Abk.W+q>y4%$Wp+IK${ԿF}7N9qkf"DEjh0wxͶȐ*a\S4kO%ڰٜ,uea M5%Rۄt4}b$ F dOA\B&2QJ&->J{` V `%4u]U/1l$z+ s*{L( ⿋@ʖ8Lp\ÀuSV>!] x=Ґfc ؍_}XܽoNʋxs=߿62ۛU2N7~0e_-Nrydo/U(XnL*?oa~+fAӼay٥2d56eDF87ט{Ήf\?ɥiBE]?$r`@=lf{ B \.wAP ߈J(y{t #He_]sFB6}P0]|ǼVvuGQp0xn^`=?[+mo_W( ;% PS@:ACS@`@AE64KN$U؋]5XE 63'C0-ok<;yqFϛқG:Qfk7 ?_o~~ /}QT0ǼydL{J{\ Դ+NQC‹ sqPa.X/|d4%#Bf RyL(#@C+Weo~PQn%r_B^d.W LR-U~rTۓ9 m\!ccnE|qi'dŽĎ4F݃}9M؇i&~ Ϣ:- {;qfU,|EJ9N 4Ky~>љH`L{KJJR:r+ şwvo ɳ ,ʡ2ښp7-Fs ?fE>FoQF`|0 U4csiIZM;' `?a)1ʥ  í.SlK^Ex Cn%7 8G2J:;!FTt)}IM)PEf'#-.>Ezfbzs<> /ieӎ}(ٱB-kk邃|B*-:\:$ed⋙[m@o$ Hx$dkVP%bA@z?2QPZ ̀e%L(@!?oBk =g?8c|D2_\yOTv(ZC06!jaLr.kQo iMŏO {(筬,3?v[GQb {YU.dkeL[s1-3--ϴR>Sm5[Z!֕^\rGa8C>hfC TC2( aNvXIС ѫ[Li,Hw B/'r]^`€+~>2p[^8CP/" אj) ؃Co-rk|&O9<,}f\ؼl2\`g^O^]p7Ʀx3{P+7I8\7z+rKGvRO_ɗ\q״x\7{G2;0sQ/*+'CeKLlr|`.O!nY01)hL*7`C<`i&}& &_@p,'tBP(0,QvR  'BD|PF~K x~g=ZHiq밊`էZ0%3eFlf\]=L[ej-Ʋٝ+ٮOz #4AU#\N ^y# vުd%UrWGdۖ٢mh[K)e16+ue+TǞ= S=M"b&a^JMh3:/GP Qr?Hc(vnx@"i"є>HPI @N Bmp)C[[EB tS Lw B"Rh!qA6vY4ٙʿ%|U\kub{|/ن0;dK2Utyڕٖ֓:a]§P7_4~y0뀫gԚOHBnˊG?C; I\kɳ.ڋŮ%sHDD U ?5iV(~P-H$/K{E> t@-Y9@ez6ש]UyB#!++) n=upaia;Tuio>oKoJZz泎Q2:dOӌ):6&s z4=q?9CTA-݊D  :46V`90X` hpXA@H[ږOP(Ȋ[Ʋ7)0a`w; p ,c9s|_xIyUӗſo1~4F]:_-x.^iW\ZFE_|QC޼zE9Ͳ+e^qwzF nOwGyjxaF.A瑐_v'XLK/z#g/15CK$ڰGR&'k)$?Eř>}MQq@3)aHaTz2FX)@>Eݍwf+ O^CpN.@ @6rq1~ꯅM؅EK)1|dO6ӇխrF1(N 5N̟Ϟ /*lXxg5}VԲ~o˥ >9ʼ)2SBvr+B ?$QP ܎P"_r +rTVϿ mGˀBn :^tgv*ZHl9=EĢ?#axʖzb%:=1=#ukY&mvTb}Zb"4դ&ZMG|t#M1/~4=Xi\K}VSV$|.샬/͕l8_wcYތZjյ6dΐl6 %bAޡJמQTm,՟'tZ@h Z<#ļ"@ʀ_οdUR.ĀVPPT Bq yf=LlW*0#Y/KEOG-]9сrp&S#:@ _*Q(MJSXKuӈ񍼁YKPvCvVۧc?-5$Tβ6.-UK==KbLc#RF14]JJ~ Nqx7=)<µ#aA4Z+8m `1haj=REdV B[^)  / ?y)xA?B""@5ӼLG[t?C؜91GSS44(ubMm?w\xuANUx˧/Ϟ{Ϟx=@{F;>yE_^KK|mƕg|dڔY?VةKVTx3x#.q؅ P Ke"AnWUA @LD?J(+NaAZAh´d"@ k [y{#"sNMߺ~l4Yf?M%}[-z[7-bz}=]Oq>b [G1---'*kV!%gYGl v&OR_ULYތ7gn} \mל gj1ȟj_{{j%Ws/M\|nv߉zǺyww9e3+P/ ?]@2lм @D(aܦ/Mn'[d/=l浀p yyuo2}!R9ޮFajFͶ~f=l͊M׹>r @[B1 dS;&$4c:JZNCzaF*ccŢh.SA(`C1B0c|0`p@6}ĵ_ҍ BPr СBVX8 N"4OEi sEoЛ1莞k[e`>GwKiW*{URbOo&Eޜ?#' =lґNFVqVG.\ɗ":X胷= )PY VmY>NLTY n|ֺֺ'uuXhKU`p3H-E7:L>b\V48ac-gQ 0Egя@/tvU( Bm%2!`$  <d@Ѽ@HC%js)}G+ :@sKi4Ϲ=#9)b,Ludk)iW+'m =b/IM__p03.ےu#P](Ȓ%y?TxBϊ bڈ] BDl%4+Sɹ ~gwQ_G\o%oqG&J%TV tvYJqL$uM]cC-fCKEnW>׎IXZ}rBWGH̾sGHhC6tJkl|z e/$fAQMh IhTr4C7tǠvшD<NP谐%R+ BW#4/70nmC1𚧐,dCq pҨ5XW4P<0=6>LünX%uٞs idzg,zko(z䴃i}C ?d-Ʋ+7ݸ2Øz_ZRjY,/QZljGV1o*+~ ^Kd"AVwQ5QQ =DLJIN/^& =ٛF+.z굁mkjڙ9k_ 9=q9jXzNjewQ/l-qkQ֑ɿYYv[U2ֱSl ;_S>1 XI?E/D4Do56Iż y3N) BO`C'@@@>C.;?`Jro>b0k<1'?5_||!Es|S7{wy^h.rw.ύ-l[P=9+-âiycrZ\My+|5Qf[qfգ˓Xi!tP j2a ? 'TT _>Pz (ş_B#JW/We)4 P?1 Tl?E?&T2-= .ޖtM6&{kKCچ͏n32?Pk}WӬ^RsVgu6'S }a'h8^qBC<)(TSC94E(D>t0`"o\P( ?2 Y 4Va(N8nP<,*+}h\bzBZi&`"^1 *3M۪,.0uGhboa)i;٥[n M/Za@`9^hCY(@5G;}Q )sph`S/g{ bxڇ5ﭝg~ch@b;(/ Jă oy8"T&3@S&.*]ҕP/zK.G'G/G* :J\IC%I))SJ+*2.MVF4rmQ4L (RxΡ?ƔU]/#Jm/,?M.z) }E룪܃.!eP&lKbYV"aH Qayp" V"nY$Hp110KS BP(l؍80$rV(䍑<ߑQ)ue})igYxTk5k"ʂ)ݓ/h"ֱ(i3'q$\yX} BP%vPBUD P vÇ+|:')~ۦnMviQՈ3\\n4_c|N[Wޛ~㊻Aq7{mMp eһ{VG?fՕi};R{e-ob [Z.Ji1ZX-m6q.ˈq4 :cM{>z{ C@4nň<8'+%mLw3 2P(  ^:t:48XFBX\@ 0l^4x~\6NړxHfQMjA;4V [ք|ܶ60=޸XI_ќɯRׂZe0ŽD@N)1(ƛe/䶃|\K. tJ(Q ş*}aWmp/1.J/Bei$kj1Qw>x9!jmx«*Ctm!m2Ok<c瘞t1+Q"P>|.F?ƄE4E5y8,7B:n~`~Y\BP(~oȴ S`?P7HCⅈ\@_<1zJoN'irۗSN{h=ӌGi#gSZ_V!7`Lͥ}[GD79ϏQF׼Gvb#6H]VBFhs?G6>cqf3#8/;Rr~']maŕq՛߭Zb+n޹[߰yk7Ӫ I}y ?`~|'xc0 bţ%dP3-*oBVȀ_G%TJw~,rPi'+/A\>2Yze0zæ;kOja˔eڔak,s~Q/zLtbJIDATTh2֕֕6_״!= ilNZHkXD z5I~_Eb q=lKB E! mCkxPsQ@ EFc˟[ BP(0  1(`%4 ې3- 7|[^E,??in7 flZ9?~>_g%Oº}lVLg ŋ7+}.~ޱ;swMIk#Z:XFvr܇b܍aRiӹ' 9%* ÅYQ T`@E9``0" H0ө]gyw7k׵:=y D53 `0U4o<@ UbSЗC;B\y&|-%SZf}*Xs޷]V3mXW;M]kйsC;K3ȬΚ1N=,劂Ca/$j?q^'뱎,mwݥ}j01ÿ D[Ͻ6}zzZ:K~N5JX:\wܞ?%-Ω%87xS8޾󆧡ls޹mFً ;̵ʭs[-A2F/In隿B䇌(q,W?%#U-Kma#[`3PJi~oN `0s~JST=@`4Rj2j \QDK,$O嬐C2^k}fm<-βlmgGvx{wNۇzCރ.|qJ;(z%/\vE Zj۽=j#GOe -:GZWwAzn{RqGuD9iZv~n5Z{huܐs!>9c‘ٻso[i`=j{ɳ虒9`آ 7g/hWJ/',m~6EҊ}{m칵ͽ2]~)[6ϒ{+7ɂbH&09"6-)ݟ Tbĉq) (]7ת `0q (2PC^'JWe9JFiu]uޏN99ć񉉹kDEFf kS֮>lGmUԌQ-u^$dk}76_׮e vyώwUY4}&ҏ'뿨;Ci%@z Zjto?SGehu=.TסMmtN[ =6vbpVꩃ zLӪ'򯭘6SSwf>uWorg*|swoD[㭱%F~y#򠼓y7p6SO3nh~R.==E:@\@5U@Gא3 F5>ƃ-6$L*B*\ȦU7<)Sz\}0Y"dX"bu?`s,?ڗ8WFXii;33#[pO^Mi3ڧu)k;;{#LJXZ>.} n՚ṳȥz3=^u֝ZݟJZqHkuC$Tw۵׏km5C?N?"ⶽ . \ܒ:cNnΔ9),*xF={(X~"ksrkq)"Rp̕in& &vp 1ȗMٔ+`!81@LkB%twYS`0 ÿ;?~!ĉ%RT/N:+|/sh/Wȵ2K=JkkQ4iz$LU=<"t{*zss!-mc*-Ecgmg+v\kT֍O#z#ԏzFN=嗿1vp# U̙@C+W8CmF M\]dwדVeEiJv1݇{?ps ϝy[䬧O^69WVUa(JK9:'!D?;MdqZN'}⽗"ha Tx$(x%Y=7Y,'A pɿj `0g :%~ȭ%'<!갉Hg7ؐg?e)^-&{Ք9jJŝmۗNcm5" w7~[s6xm^zg K^Ңnw>cN/r?9Dqn;@7EuV=>`Rn@7t~R=~u)*&K֚ ׆!VWk=Sϻnd$3g}guFΛRY=$\vD|{y磺vmp|Q9y uBNMN(}UiO{W俳=^yE,om#S%$}|yX bsS;ӏѾh! >fDrqb*_HGtCs1 `0'p$HxRXpR9wBu~耼C _IkyYA'+򂾧|{|z轫zTq%M2d̖S19/0bgeѤJ@B5QȾ/@+4 =H,>Kl<@TTgxٕ8jK#!1״P*';G9N5$'~OĎzتVSwca?ΧN[{/"R57iuV9)UCxVwIc0b-n,[ZQ*T埛< ̑+{sYeIn /=Z%R!qyLRhNf|J?ydO>!ӟ!N2ߔp1 `: *ypbZĖTk^RU@Q('EIrfXYZ)h,1""{=ړy3!2OSV _ʭ?9"ͺ?uc7ps'fDQźnztWEzF!n-03RNuξv}\(=?J*_$-yhi= ;ow([RJi%/g [T÷׮$;e:Mj~s<.As'ȇҋ73irܐ8hGzߑI>?%NA$T uӎ`0 f~rI>@o t(QQUm9NN{^EeWYsdltR)vj}ɖ^d+0ޠO"ERۤi]IѪVěY:pdʧ}g2.bݝ } 7uq7psZ5)*y7QdZO,s剼킈D ^r=S]]{hcqY˙&z̾!+Y87)W;^mY=*[f~*ܛm,\µ/Lw:xK!p_h%q*(,2f `0#8(NlNBƧbb˛jJ2hI)[e%Ox[QIP }%V]aw` c1u 2e*Q{gjzfG?QrMyVdv9#kܸi#cwp^4v|7HmdUbֺhG]ϻzl|NOo-~@Wj?N.}sy EќطΏIm5z+6Ym[ UVgnr zۭ ƚ ~]@t?ߍ~; dYk4M'c|?"\33{d<@IWd`t{.z>:#=w)YXvE%sω.J~v~C9kvxN,bΰo8&-zɒJw+ۙ滌R*s(E̾T2^2P(射81nSnzeL`0 ?}EG[+`Q Cv=]І|"1L $rn "U:''xR+o?VkZҷƲ^Io&vկH6彆Mjk^7uv/CtnL qjnq~MzwC-EP:[5Kvbh¨u_ڗ-,tƬsYzujUK ~ (ƻE7{}}TV:j[6SꭶV\"^S3?;  oś\TU>`0 @Ӂ$wqr!RHQBЛ!JĊ+.kMwl:VvrjǵjC^AZz =K1P~3 Lθf!J]uRzwshzz. Vu=e͌v=[ԡ~Gv-y2|(ж5Y;}?{)l}`͗Y.cO,ySȬL&sm ,ic&D6qBKÃ1^_Z0C`0 g~Nh/$DR$*PA;$ChIgL@:2O^g=8c8عzؚf=TzM}d7wxM)S Ck* .+wTz?;*ꋽ:|tUs¶K7_xgh=njwV/h6v)ZS$Oq`nss Ez<@k=NګTJ9KpFձ¼YwzT} FlȬ|%uo}̷ww-u5lTr}urLpBn۴fzyIc<:?o }Fj`0 0$9i1>1TV'r-vR ϗEYf-ux_=i[_B,s|Hкȑe'?׹0 'Gqq ow8+SW#psqմzcOWwԺNVnbw򟫵Vד8H@n~"ZOJ]YiY~КDnmqW`mڧf *-s|oh]iz-g[XZ%O[XG[/Tɸ{q)C4@a6U]L)JH:<&`0 ?}M5PI:52@|@\m/g3c՗2K3NZHY9INgšKE@әi!i.:Si~BO8Mm6޽X8. UӪPuWA{@WuV@nP3ݣյܝW @{V?T3ݎ IYArL'hj'V@+ZWX8cPZQUm<+Le ?.}^[z)ɀN*% aF.+q(!pT:&`0 ρK|&*Ƌa)6UP']3QLK$dť֕Ӿ5.Rv}{oC[ vEO;tu<4S♢%75lr9eɫhHugpssӎqrrp }q7Fp^w ~7 u 4 `vg\C=wC9Bc4+f #=wIBy;=}dwҳAaJ2YdI(sZCgc}O?opųҳ5g*W[6<Ϲ\ƙM_z}%YvbJ$:q'D7 `0}܃"/>x1! TEtֳ T:oYgãUUwqHLGgu_6\ӯykUwٖcjYۚwybvyvغqh㭸9}:D_EzxL?ok\Jn:n0a"s"-n{ؽ$m_Z;:ź϶rr͟dJ()rVx]w@vO7[Wu~R%'˄9SV3<bC?bJH T4l<8o}o0 `"z(( 2K\L}Ĉ<ΐSc|yU捷N߳k}ݡrTJ`(j李]'.=Eh~['uklcrQM},iwqX݈*O6F (G husju I7<==\ǯkXYcU*R|'fgdz)<\rpU`sgm}-:նwTkwi""2SCAtтrɲI']^,Nh819s `0 j186=G%UK,m89J.`_Bdm֛VP>~3vɾtF6G{RVgߖu樌?|~#<޺'(٥u3ߕe^>sowMX.pn0b"31v=|9ZO':ԟ0s6[`$ xW:t!~it4rVv,\a~otw-bI|U ;3{J=k=gx_oug?ln,.V [).YNyVMiLd{Zю\{>d!,8OhC *8e `0QH4Wnl@ dSA@F2?B亴C9*d$+0ʹ)弪6(qfЏխSK_={_|vc,ltlٵ;b5C^uSdWzIj`rr鴣Z^~bmzY}nm3m^,M153p }cC]*Mz|uw>7ӯ]6w|iT, |?0\ajYe˽3eJ꽩'l~3^yRZ~!XNf0\Bw0ו H'1Ш1`0 F@ ֪kވ]ݼƜ8uV^{SEʷZ9K'&.Z"ꏴC6UeU_zoǸWn]^}Ά ~]Ee߮fY{?v7:߹J/.K򨤨{r=syS|=v# ӺFkznAEp tҪs zsB)~k]tI;v/uC!}˚X~.z;gy_(_-]##qUCs9Aj!sF~Ù\8O?O< ȳ.& T__}'&`0 <rU%y_Mz!e)s)$NaTb5ϰ՞}[}ǔ) x, m_m-oHvz36WE>S '{tװw @q֭Zwj5S?wӪC9Bnq=5MŋKۖ__{A[yO:.}{yE1q VyVz{G o>o(j"֐B.y'_zj  mV퀦b]v@ϻ\?uV7 o41?6(75G]_ˤC^ZmFv@AIlZ)7VkI)WuO{*DV)|Vޔ%mr\%ī|(Ʌ2I 3\@1e3 I*i‹ Xbaꉿ4U0 `04ߗ&ՏG,l%I-j#`rL>RqKU>k2Wvz^=ߗG}{J?cCVo)2G=7.,m)~ƓGE::- .e=4kWH&}fnmZ]GA_6~qj-NӡM9j!=M'n?}aRqz/;wݞ3{g=zoJh^)]S}U˞=wy({>jm-yr垼^"cn)N`7^ :YK<PꩡBdѿo\`0 5ݷƈ'z]#];rɥ\%l %ce&Sٴ2)r5=ɊmnHLH>J^r{WWZ^fh/ ;gžu^zWRtCSqFncnȿ6؛r]V[nW7/)V{qr UrQ2U {y(#" KWĉ)_HMƐ`0c_Ǔm]F" C0^m}mUG FEQ@-1Fxg6oj0 v$T" H4!Lr)jzG$9QP 9[k-_;N{Ss^g?zgj`uhYֺVql]zMzQk?!?q~\-o>$ô)݋goxEϻ'xSF@cal홛c wOI?'E9Z]G.-p}qtr-'ڙVᄢɵ`0 Hk9Jlxb Or:1p ~%Hz*/[حjZTćxN_XQ}h~3jzvO?>.ljl ,բN|c-oܓ~7->B0N?5=o%j 4]qqp?vV*:󵞦+MʂWXMeɪ;TvyzjiCRO+:ooW}:ϡu MVe 6% '+ʍ2KLhN H%,Dh0%A{ʿ`0mܓfpŤ@|@pYDzP}e`1A,TQ V o~O-1`01% Tl"L?pH#\yteϫ|jòx5.Q9=ꖔԔ>^_0b]Njf~5ᙢ%^7EZA\W0ئ]bPApyEDV?R?Zjw[KZ 8?{ҲBl'7xx^Qjk{mV]~+ܫe<(sC8˘O6]pP*T*I΍ۃ[=`0 =+*@_;|d#@*g0 j ɢ;a->5 Ar`CW&Oej#Oo9#rZO텵ރ D[@HP@8]N\?:n yk,msK;wndSI [|CcRgӍ R6zkIzu"=w"n2៍q1pCdrC[o3um][70^3k}.d5=۶ZVzff,ʰ2 2_.=x߭c{~{=۾`kgŊw~t99&d:Y.ӡ  CM]q Cz}fևU^䂼,wS r7Hu X^]h8:~5OF{GX"; 9w_yz˺BZB6WGY7˻=5@ޡ cx~)\j[ mri ßɓ~O!NPG`ȖL9S9W8_"R*Y+ƿrU%WʑnKᾡux,sNjk{oƞ暍r_l3W]kV5Sk"GeREoV_룻VߡzoCi|*_oئ?}Fϴe߷m lIK?-}9?{x{_.)7ڝEV5:<]F$9P^d~ЗDU=T;DT $'oqҔnF`0rHnq:݆/FR=!gCݙB4*t62 lʫ>1 6MHlqt}(I5Bj*8c@C)ZHv`0|_,p,o@U-v"F ws0C-e|u5úI+:]>jw<}$h&%/Fhra`ӺN~ٷKֱV0q)S]ֶZ]]⎵6 vkvkɘ[{F{s(=>C;GXb93CtNkyA<۹?/f=mH[2Xΐ+ ^~y9r-|D>81VdS:`_߾`hN6A$_Bb䩉z[WQ`$ TH]*HU׳:=yQEvMkxٹv j:K+5bp5P̅. :}L@g8wbt@,v8(i%>klյLO`hw}s ԩbs]:'i'}C2*Fn XXO:9^gggim#w)/\|E;:v_~uFr֤%诽MsVX'^[sl8_rI']ǎԺA_[ Mז wkn6睊qsp=\n[!^2=NnY=ݶCiZ\K[lu-:Kܙy?Ϝ2uZe9ɞ<gXGXsR-dD4yDR9+L.d41Xx)#ڃۜc  Oz2w^VH2RR@:JxY&MVIl;OAyj;_ 97¶9lZ2rzb `omO!REr$֪8|dLz|fijg7u8'Ls)x6ȶϙzb=?1j]Gk k4W?VfkaIzrv~r_U{&=m 5·>eܜ(6i3FWfnhqs.OvZT.Xg+[bhn N1NEr_,xpVuvý/пYO\;F=vP9U?];4g>6-ɿ{_V7 ѡdk1p /}r?L: bA >HyGMH ~ 8twwoV{<qGSkaOZ 둆 N?Ht [uֵw85qglm4pyr~ӝ:a#u}/켾*T7: PsY4~SPT4oՕjZ(OF2uE-LW`h[# VS-xi`;? X;YnkmI$s$>jڛ=խUKSٕDsܣs 6vܯ/۝̵_.=n.*MF&F檛,Qխүg!zڸ3v뻫﬋9aO9[c 5lAkyKo Uaw$]H^ ֊ԧj z=L/`@ BQ1+КRzgr:'rV,e6! `u\"M묈Ue}WG<9yۋRHuW/cFJZXuu=kh(~!⯽~K?/R3_ˍE];Fn[յ\5(0`VF[ -&h1>nkk]Uz|Vppf㋤(7e`Zv׷.kkest=ߤ}vyFg/W{B8P8(f7xn*xWry}e&Z,7ӧpSJ{070%g+> €R gi9 oIh?+k}IK= & $5Y'_Jx@EMgj[ΝxH@ GŰݩ봆 _Ù 5'&:mWtvqHJb<85{9"q?dgl*P=Sm qʅ`=/n=rV'r?|`)sRrɢ+:Ta|"$# &zuI0 $NqeTkK1[) eC\M a^U:J*NX/,o//\=P瑬99cCeA;|&zc)~mcAID2g:Z$I,ҫ쯵㪎x߿Z3uV!kȸ[ nhyyݦuiR]z|VavQF^뽼+ n yC|+qhm^KowL yNJv}b*CYyCH%I]8QȤ"k Ql,֧Q"$&s ßa_Φb_v$[AN.ԗyj$SKx;4\?@ n|V][[d-ksS>|닝 > Ԗ>Q$>T| >&YII&] Q3*TotȷYjL𭷏g FxnVxVpnmmZkboa3ܭ{sUj[u .] O_=%KіZnK-mynJ#͓viwٌ=a+"r%@N(rz|Zr]< $"@Eh৆Diԧ1J9ͮ`0L4mHJX,b$9^VkT U-,Bieqr9/oQaHzvP?Os>k7:¶S:>yçjk|yj!^,RL˯ ,|IN$7WPM=j?8C @uY$W_팂'|=!K$BH7Zz8'FB2b[} V̒nQ;U x@JTXdAAըR,a0 %seLJF*!Bb!XN d%_ʒ5ͪ;rur_I?⪯Ӿ1_?ܟR4KҖT kuVO>8ώ)}~zZZʟw Uz zպm\ ߠ(w, -sѪ=WD̐V! nMWO+祮O;5-O ܕ7,),)~HНX8-|̈}C0k]a(YVNkR$odTUio;B*RLMSFi0\wAnA|ilp Dq.N-~: uٰi 5q5lʪy6yjtÖ @Uƫа0GxKVQ$6_N҅[ΰt 6L]H%8;~h%хP^%u?l[VPasR9g&`j1bK>3N@X/|A5I*>pYw@ 6{o%g;Y 1āTIT< R㾶d91>&Gd ;agyᲒkJM\{"l+޺kpRKi_PQוKꩣ^MEkH=CMWĵ\;+tuGq?6$L͈"PU{jt|=>0S-%YO*y>.k|/CCSvݝ؏.\X.Gʙ dl'Df3iIq%TJZj ~RNfe0 pӷ60/qNGH|tjh8!^ޙCmV]g+)0yCºn՗$F̺T/wx ]hA+ubVw>C9*iE;9yjN"'ΰ97GU8ֿ] q=l\g9!Z"_Uugm{[ܧoIxtꅩߊ[OA@kvRj%in_C~=qsNZ3h-Z[P(=v#-һdL,ߵVynu ;]4bwŵY|Pf^c'x^V/` &ΗղS0<9qGUCFH5=@pH `0 NPV m2uz99x7F Qr)|JueVԋ̆Ca5Z>6|RK̀_ٹ m| k·TÒdO@6 _{?dJL8Jshx 6-uFPTi%i [waW!G{WZ%8:˝v<Ήj4kN h搊jr_X{_ $N\ŁUK-PQTSF Jl|/k>Hm#(MkuuM^gk?k%7lY0gk`M6천M[bP;Znة.ouf۫\1.cEYVFw hjߧ5AnM4Nr&׎r*a]i q?Hn; `Jkn?)Z'n1$pa%yŖ-TTrڼ>RPUpL?bzk=3Eސu7ryʴ0lWIW‡lG jT!NL@׮WBxӛ.WO#u jS e"ė, jT1tnO [ϭkpvN1^psT ܦHU£%UThұFb~ 'OkS~؅νuςb!)v΃% i}/$6gVpj%c hjY )/z1G=s[h7Fj8{lnWѩ`0QMmic@&\ɖB:D&zOm(M'r{FuRnf^Wy={'\u4Җ;Rzcߔ'VŌӺ%r^IZ$cynw|V75lA2`4a_d̟Qo[Y ß׀&(K[;4GBb#yrPmM4Bqvo`뼺U·ᕚ+`+;ˆ=PzMUi/Աx {@Pd1#K&r6䛛v[]}@SI T\MSU\B#KU7 2%xM;>,䫫aus?. 1J0"$ ~sB68 `^"d|F9:j%׭u@uU5f0<}5A҉2 Ҏ^ޥNc2YVd$!Viϳeތ=N^lUq5gEݢ3@ p '":_ՏߤǓx~>mr罿MZwhu-h 'YZ[ju[%)ru?%Fxcj*kC9e֯ *? I)L9G? ,7/3>EBf[sVyBN\:S蝣⥚$.79b ~`!U%$dۿ@[JsQq[ >fmtSά{OqNջ\aݑ{w'֌j;):Y} yd >P߱@;t7RK!eh@ӵ~5-R۫Tl{,]k`[L b!ĎOLV㡺}dT{/L wVNXꯜ`{cN tMp V<|خ>ue8Hx߼}15 i5Ĩ*vK Oz N%}ivzO*. \Vst(P9 Pdo|mjMi59uЎ,@1Y0<@[9I%f?&ԟpؔ^;ݙ˪;'†a[MiPC]IPU5:<,TRHugH[tK"XL _+PUԱB4SL}2gr-1 KYVߒ5vKPey("P)mXZ:ruZfPb~'~Rk]`=n[z:"SQ]uVmw5a.k\͵ 0,u:Pk2rL[L9]jч''zEb|/z ^\QDH2 hl f r%ԃAt3YP7*6P2R#:gŽ_:]`u3,vpݕN:lSt݇4>Lj-4d|^+Z6P l(j&'[1UMeB-qQgR* $qnEh!>Wh*h\LN!N'>'Y7ɂwׇ.kuC9n|_--\ZBts @]cp24 SOOe o&;@^ $BZRl_&'YrvLYduAdk l]=[]}ξ.4=\&mYWvϿŵoN1w! [5{W(ߏD=>NpvkvkaЪ?XM+kL"6@S; ̲_3*J[vز݅NTNhl< G3A-v(aK_1*@IOMg~o=`1uPD1%TpN)W^N)ddd329j~*rOOk*02!㹢J)nqZ)>6߹moɞ${^[S-V;]54e 14ü0nhiq:f?#~>}$N8߹G=SO'Դ2GdwS /m;g 묗sFȏYe,?1+#x9ryo'le!JGUF n?eBX{#MZA*\D!X:dJ 1F}2?.ޕk@ pxmljYn^obگĥ~c#"а6zCrr$j!ujZbi\:G`7}Ek$nAGb| ԏl//BE >{ToDꝗamuŎ Ϫ^>wzb:,yMIp6=$"mr*%`,&Pk$w{\; bĀ2,i=M\mjY,wT!fg==~~ޞ=W64G3O|%&-=QBx krʻ2,qiU_RDkuMvk ǭ=TVrkj&\re N#˱rN+7n>k}d<9XUi֩'HB~!<. ~`='0aqZCzS#Nw'`0x34, ݪyK-*Ts<+ć;D^KPkUgl~6tŶ k>N\[]< ni5soJX&Ab188TF]{}Sw?}  ,XHLV6AwHDbQ ;olX &r/OBvgطI9%=AsCPb%Eb O|a#d}L_,Ӽ3BDžfo <8p/@~lֽkg9ns+XB ~Bt}OrWK6 T( S'2L ` K\AR j\˝pw: jFǪs`紆N.lZwSZ95}V}I]{|@:=U+ 6HEci*Q0W^z;ͮ🅧Yod/ 8Q:dJ^ẑ`oJ iWHw!XI!C%΅>͞x\ r5g9LPYFr1A=WFtE|; ? >`!6^r 'D/)"bƩ 0,Y( ԭUmUٳa2> yR;936NO3RҟH;-6vFSZGx(X5]^[u֭ZwjҺ1?{W[u'narM4+' J_ ˕o W9lpV BCx{FEUaSly 6Wf&^ml]NCu͌P +1E3(UP?\.w[!WH^an@P ˹ i+5NթmP([lqյ}jKmE'UFQsx:Uw {zIskD C'iG:mWa"$k-m dxu\'7猱ߔIվ%W@FI)R(ɪm?iudG=Oۓe]dvk]yځ: Zݐ[m 9nQ vZF=cRs/z*|h?|#xt譔|gfOYR8кʚi?Sg}m)8M.+R%T=ljf/\}'`0w]Ε!žU'qs/,n&_npNj_rMLr-S:8ÎN i<ř 5NW@x  b娯Ձ%˙q7ڼl.U 8(qpNQ+g: "w'&Pwjt~,v&·wR`K#aӘ)=ge;D6T)}x顺\Vl c'߼9a~|N ςk4 vkT' Mjlȕ)\&ʵ2iyl/ J'g{>|],ٯ҃归fC}z$`Qoɯz5ǮaNs8Fkv_ƿW^k hm.Zjn4z|Zj& \اvˊKz/n3.Mxe{sZP?_aqO'Lkuuf& Qd' jPmP1P=3j8$,ÉPgTA} lXLaκK-u8 a'Sfd=4 ;8ǪqQpW"j8L^ٔ(] 5,~(x[+ =r c=W@ I u S]kmðN6l }| [Nw;P}j;5Zת!~SP{U*݀]|aYCI(Z`0SqunqrtHcWd(&r%=H5Ey/ގWhZ v] /nS [ϭXp mh=9Om\#5Am`Ή IDAT YrVе,Φ>_=tP$_xhCV؝޸[ԉ =3 lmp~8W{))6VCdgOt' &WR!ǐt'_M~nϑ2ߩσ6'P.ieJ.(blV[w=):K(6SmMyzltiZ58u^ ׬ ht_W0'LrmM׹$b3QLN}2U'1kz|%]JsYGSDOVm'Gs^({@~uUerÅ_#C9 O҆VRN>4z$iM USȢ_PWl)#X U&H?~5Y7yՇ#f|^lMn3zkCE&::w0DKU@uj_Ӛ~ UQX9j5 yP6RkxX`DR3U?H~f@ji)2k6 M* aߩpP*/1XFwY`/7e86lbMPG07ꒉR澞664A&($G'M{Zٝe's'1.\'eXXkn?f([@pPwp jǴ++ǧ\|TIeue'WT[#בJ h6Pj]dٱY"{fVXkHY+X¥r-Ӈ>/#ab "ULudcM 2v@э PN H]{jRo@z[e+JjG%rCPQ š+<kέ_T=MQ.$Odp~uRm K|2]RDuOS|os }vSY8[pOp$JRS1r;bS7 k5욙ko· ~=>@lP }*.nU^~+ꀶy#d왝WfYk9Uw/YRryf>MogpWrSvgk5:9>jߎ;]T#E[%~ԟjBT/3% `7MhqFי4DOlYȒn16'ZEM;ikX냾N8=@P>p9OJﱿ?hUX] egY2Ps|siGZR$I4$ǟ@& &m42yՋ'n#XD׌SRzZ뢍VX96w$_if?q7P'q ]j"S-`^78]lwׁfss6Y"-7ySKs?pɆ2/P==; NY;d?Kn=mv<=kGgic%Hi-E[ӖV/9[Γ ")/X-XVqŽ~$W*X|>LGBןF?nq5:>H'eݺcbSCE3-QԜ켑O~.ӶcG7}۾Qҝw>kMniRw ^rle'Cg1UG.Vm)XuFXӬ F)`Q(Y)$_FWq+l?&6|O715Pd{J'爵k ̃ݙj<4]j*gBulc׻By&7 /nu T6DwvCM^ps#Y+@!r7ܥ%( %s-id8O8d.W'Kzu4+X֐J n (]!l{sWC$׷C`O{O# _v^n:6_#Pil=<<<_15R*L'_ >rщ@jyDfvƥ&[l_Wfn[Xr}ᯎN:K7Qsa٬_Oks]&G&7~g_[> 5:e*_\. .!&DmM/A]&vXyCm{+:^|_ة ufnT0*&e;xwy#'{|ƏOp!$p74Tne ӹs mC6R'!hz^=U}cwAESlXwN3˰!6rmxZN (cn[' /ofq*o'Ϸ#qPUA LөNuӰX{+/kFj!ԹQ~VCղ@i@ّkKh*ަF"; {kFRJ &B}IXS(PQv9}HdI4u,.8`j|vK}:9Ivh5͂vN*E꓍z{ޛKج1NMczuzTэFG_2y読7m~VO sJt(]URIQ[8Fm mvGDãva:z_RAz{f^>+6[ws#nj!]`DI?AikkV$H soh W {wkG;ɯ^a Ul+(5\ub wxxxP(\FÇ_.P %r7TΔe\nk.#8{:F惶NNщib˱O7MZߪKZmEWѬz~сiktэ-kefW!WMUH'h\u>Ǵ`WT>9w};~ҷ=ߔj{Pu]ehb3ӟ \ʥ$\? Ά(UW5{ Bm٤n϶F\vLP/S jK ݔ<{-VXL]+g9VX{ lxaOv߂dwx%Y)/fse2P <;}}Zv0Bve$+3cP;&QÆ~Mub@u)2'ºO}R0[!vZG5R/`7^ohdt|Ae-9͎  Z@`aa~)'L>ED(QӃ vXNp'^? Tʃ5='_IEdiy__PqiWek/~L2Wۘ&[:QzltхF'#rۺ쿉dh[9ݵ}C[OLH=!8Y[`^>~rv%wt,rnϏ< - <<"pMKet>mkk_RdQ-9^ӂЅNq#bp Sr,=i Xҗ p  p;H:'!kfM3RPwUz TN S,ׂ ]X{4zwDivܠkcZ{w|M̓(2BG6S&J`s$V74Vڳq Fׂ?Z./qR;6|$!UK y)&B>V'әWr)'R-R5ښQZ{ڷ׹%/ ?&dŹ_*WxzSCmSڞNǦхF'htѕFgݹm5ps"ڶg;mwVW*fOǿ9O nt4SF^:hPP:LGe|s|KV+ VQiwqڇ͔S⬖0r"sd3q%ULWL ]trZChT=!s8@r{!Z:NnYPysT\ )tcJw(T CɛU $_wwHLWmx Hr>(vQs-/ 9k`l7R7u%j:cH4w6磠`/){Sܷ R rv̏^։>W/}VR='lst>cIP4GPEQl/#-uJVǴպ-6IU҉ncJpHT$g+aJ;879oqMjZWJ4U^u m_XxLxȞz'J>Wo=vLэFGv Tn3Cȼ_nלo&i`&@D0 ]_]q*pg`S B[|;v)\g$j^<1P>+E\8bJ(6 .. A-4Z:<<<<$%t" P>`0Akg+6cϻ{/aCgOÆךVy8uW$!j'$v yu~.Nw6ݧq7!{^^͞'wZebA<kΜ s '?WCn(Xg5n!> ko~{CChBz[s aRayhUfҨ籙f_cZij:Gu1pEZ*eSk|WvN6:vNV/M+ rF{+ݔ5JwoSu{i;B[[fh]itѝFnso۪wDVښړ#n>bNm[8sOK9c|wg:EeYkVVd/k5d"y2Z"DH 1DA5D#"[[`ܝVsS)Y GQjHmĥvjԭH\V7^ \67UP}J|ZJ_Cg52W/7@1A-u:Q=:henn΃9/tS j4G%7 $s~sU{;ڽ6{#&p5}$Lĉ%14J<<<<HR0/WΔpS{tu =DoHMQCMAulpwf.{q:T>c .}7C:A>;ePW srA V5 ,<2,`ˈ@҆H`6$KGHyP=@NxT/2|?D[!9u'29S&S 3d3ڨR |}9S /oBR뚨$„ +Cٓa.+#cdG:QuV]-|?gDAcuQ/>g|  v+;.?uT oE;ijJcF, kLd]Yfm+5<-0Y#愶 ߣ59.vb{)k%cwazlt򀹑 k ˋ/ʛ{ԷCVtdBTFҔ7XnEr;3ai"$[xxxxU0%2͵Dt?Ì"QM.M][Hg!~kfG4vOUUPZz~A*v&hW#o^ S) 5 2%.Y:ߤ$@~jF5?syȞ&}^yT3X gi'D \^ Dp;BMInBU!PW8H= M*vT]nR<)yQ䃌E#u`j`xM~=</r[X)]|Qv*r]ܭˢmqh(K^1Bdsp58rlfeOn]ۥ& *7n D8pY5 tA8~.Q1 s8r'p 큍4ႺiR8z<<<"j9i2@!Eȑ@.Ӌޡ2X2˙efj/orr.syn:Mb ;Ԧݛ mz*n(U ~|-GRJf_kqqɀAQFGɫc8IoFqG]A \,WK79Yn˟lu-:&8'V̒Rܯdls&|WUP\x^`QNkmr; G:HELznt6m]^[i]zC:Tޮs:0Z|jI="AN0ЭK:7|lӒ|/?jlͲ]'GIuoQr%S H-<ֳDJUZvAQ CD`*eDPltSo @:2T@RQa2>d8s:b\}X6Ntbu,n|5.L|~ ˓g3NWx$JE49CS<ܽ*[,<< t~n]zI͠0RH'-a]ΆP4=z.N%K[>j-8+ N;kv xl&iP@אeg Ai]!;#P @Zӆ6rdVNUg^ 8K^ߚmw+oDCLjoSW\rޛvfkcSz{Fgitѥ[ [ 0\tքbs4@mu5H9ZgzOz^9mй}B{H~Ȼ"040/x q~`wv, HRir\8PAiEO˵RN)O Bc\%S*/x&w*$"R.H/)XLhmu& |C?P SE[iFl;6lŭ6F'%}FPe| 9 D(z꧎ nOI}LdG7lqsྠ?WfXʠDytbl5mraMϻPYnZ n:Bl.LzD~E .[BJ@I+m$"6[NᱭG:'z$'Q@9$EwؓaLrIB,n`gTwl7.85<24<}s"hgtެ Ml֕Zg6NC.5:Vc7nZh-jMsNi`B6F?Bh{z-k?z.FЙGws--=\i--?Y8Y-=C9AiKk,|-ЖLQaKL'=<qmgjBHgMd'Eamƻ`'yVl:Wf Htˠt?nQ=ڨY40#Ed;}J-+HǶJKctE oZG}xpZJrYYs}ta }ђ#(5吞NWoA2 QPCU6[4o{vk*7v{DW S^s&R h @'BlGɜgsޯ\ϋC)LzϡjGZ޽U6Vzputm|wǫ L?&@{ FmǷ|C#ӗ0ПR|<<YἝ7ךhϷo+ [ϔ^8kP\bve(8P5PC-zj$I{xxu0!Nyv;g۴ɾZC BedSyVz A^T{=w۠rzBw4li6̓â1PJR !qzv&:EM'>~ 'oYЫ5WmsR'[y=r_vz=/`@bI u_$D-masMaбiʅѮvPuc|{*ԵNORAGj8t 3lܦCj=WUŖ[y+hAoSyKm4Z:{VC7j)`N9Q|"mп'ﬔ w \o^腢/w GGn?noϳ_ZO[9v^}Qζ-Hk鐗#9_EB%Ed "EpnF+*%W9k(r@.){ڃ >T5LJ3`}Ij`î o3Sac)n=.N,TCj;H]G,V{ݞxkKy/󠭞Yej9_yu:fJ~u84z ½V\74;[8P$Ʃ& FXozxxh] Nlt&l9E~$X\\#qjk'Gމ=ko?sLdrpu̎K,+/Rr@¥_C,k]_2&|k۬;[Fjtѱ[]4V18;izl<3gikNB(VZgٗ 7YZ\pwѳşd~ 9MmZkl>0:x\;[e+-)?O򫬎,UJ^41ٙKrʬw$(WQIR"i/`'H)40b,@Tohg< l~2v3 V[JfD_s`vq_TM,R;| Mz6G\g`MnqzތMJҏ%| qPR|-XwBH=9j`=Dr;d6\ /A%Ac{PgHkDuU~T<<vcͰ9/Mǩ0dƨ/y؛;lPtxww-eivzfNlAlp?Wނh0uO RލªwCa=oC=>|[-xm$5RՃ~ PO1I^7:יW /C@gH|s"]&cdsΌAr<-sqyWVʊdow_s v ,ު@sJ N/-*OZỵxaɌvX <{sq@n`FGj]٬3PKN5Xk,\K4mL9mC'mhC[sBcΗ2lN[[!qVᕅË.,97( γ!YyF|D6ʹr+Oe?NdpIFNtK eRdTȐViV0+-ېh]Tm. BB"fHqeMRo<{*K}W?uæcWP1m?|rlW3'Uc~;"*h>'dx:kֱ$;UC̳phx0>gG>P7 EPC=oknvV'}:}xT.wSCp.Zlᱭ`tI|MQ&I/0:Zr3 Lfr`̐;#ؑٚhMM6}~r^.>MٰМy] Y';Ügdޛ]mm4:NC.ѭF]ktѽF0+8Bkm{ik)P 1D[Rmワ5>u٥j{n}`~ZPƲŹsMk'IVjg@ޑy;<ь}kJ/zՔҚ֜O3?t. \zU=<<5=+۩5鬗\՜DXO[t9j5H2r4Rwl:64v w7C.P?΃ڙ|h<0@j  w3Pztґ8d}g'=`<|PyFtj%$F+KDCF%*uO"5*ӱ2ظwTlAA*ɲ*1+K^Rɔtב:Q_q]{h:*uUWFiu)IO{5WFɣY[My~_ł"s?+pM%596˂cK-d7 ڤ޼֗ͺ7PKNm֭&u}o6V O905]Z}9Q1'ngmPꟻ{P[kڒJwB~, /.qVq*>[N+J:EIW!,:?CP^_E={W3߆,@X2Nnk VC|\f:j?f@^nn:8~PAj1$dBL@5ܓDx0p'~*O ۓfޔ, jjKy8dFB2p9bP.6TN" !gɯ`i-BVu,@MUXϵ~Hցut-+'Vg qe7=<1pU%];:}l*&d?T=Vѕv;z{K]ktѱuFE[֤mtV9P&„Fd ?]YY.UFΖkrN=+㳕jݲuvr{mb-~ޖ0DL+ ܡUzqO0P9&POTPFXlJ6PI*ՠ2lV1mcDi+7ewɓkkCϾe'su=ްZ7"TU5!\NF?9c=X.ӟ7$HvntѥFRϮ^6)6/i gPsMNkޞ"MF&sY4,Y{#M=3?? tq}.q(:m.~- ox_]q$g0k,cI Fc9<<黹#T'tݙ:ªVTeif=ZDef66|?0O]:LT{ğHh84y v9߽=6C.@l(BA_&/c]$¥`)Wk=/ X@5q]\#fJ`zxxl+d'Ɩ. `әFNJ[9z`m7]j': V~UW <8/_.( ;2{T\Ycu ̎MySRSnBZ5_oֲye3mL?Fs1.7hXBO4=ԉ#eOw}3.u[fͲ6Y=wn d\ vQܡhbh@ᱭ%:F _8}D@-6&posH:̂hmNקUP"Ύ-sMVέ;Ğw[A)pHݦwo6]?y-N20;գ:;ApG!ALhAŔpB.syu⇢BHw(y5LC |}<Ƴ &9S͇48T=gy<<<12ZWňJp/e7]F.&ևwWfK Zusasr.%}}? I|kkBu&i{F.5_kty5w]sӢlR&F^semzlw:2Xӹ9-xc#wv:БI֙U}2Y}psy?BLxse"c%8z峞$V&YMKӭ0hXP}iu7Tw/u'Aj4T}cP}gu>29s7}tsu~*o%!ǿʼn';e_lԞU;HJ Hjԏ:rscq U]!gu p682d;yFKD.^#no71;ᱵuI!M@\/UZva#NgC[ğwuuK+uY 9{EkN'eXv<~ܥʯz ޜ s.؜ntѩFktmKY1xhhjb1Y;~+C&(0l_l R\ˉl4&q~ G/?X֓y)V3O>+$yDd?&s>d" Y\\/c`˝8pUJ*r^EFUdK2%h> i"w3l#Ukc/GBānhX<] #U%N̡70IҵswMvo!fg'T$̻vHekP| s;GnZe9nW78^qZ_KnUݭso8|ƂՃBߐ"pfJ"zКP_.PcFt*CVV[ZB\;?9g=]ΐs*]ar)$OcSyZ!֮ڝ}H{C|C>QcVlZUxnv[}er.\)sWFЛK^n֭F]ktѽFݲG[)2G^ 8&:Ѕ->|%E?|3kᱍai"7Xr%(sz$"JAX~A)>0;6llj~kh}6kr#Xu$6e*9 =Qb=\;R: k~S$?s->)ց5M| op9645fۀr+kjW@E@Rr%i\H#=<<,}pkuiNeO "DŽNn^ѯzǂzا8|#]rb.覦gbDF2q&e5F;5:^?; W[f]YpmWm[k@du\ÎɎ;K)]Cv́K39?~ u-_r_R9MFGngd|>D3KWp3ӊ f"GaPNF~WO[",m[^vn L1 A*7hJiq#w)mhr>͜ ~h͝ UkjĎMUCS%|@l|;ixʗ']<h^TKjؘ:sT j.Ϸ 3w ^u}UM-P_["WL1]{q_Yo@ChE{J (Վ<(rz&ȡIyΑV{4ށeWC{it(x_N.sWiLeϚH((\XRދǶ/,%WlHܪS1PSԀ;^e9d3xf3 +:j kNl<4s+pGf ?%wԌ?΄j21, evj7T `zxl yh楙z^-a,l\Ա=&WrO\\&HicJs>]?N96o|Լ֕׷zz70, |Y#ѥFjtֵ:^.05gr!mOmuNh;\}ǻfzL7/G>GF l, u U\z!|m]~yoY`9\6H{6pFqsdutZ.E4F@\2WTᱍOC@JqP^CnZbBt{5KWPJ\Mu!P1i]~uTruDKj }Tf%E$+g>8Ro[ߓrnNaYC,HAS ]J52%\){%;J(98u8\N-@0J 8~bOe=|K,v |F@.1bʋXؚ1޲pHK.I{zO>BgYT739]TwY!?iъ[}]YΚOR'r坝6Pؽ5t`:NJLJ w9H[K1zkkj]ktn'm6Q[\δ7T9ږkkrhs'DibB+i;I[aa1a% v>3>p}1xRt{}bruUn(3y(#C؛}Doz'QB[Z91 `gA4OLO{xxlmLPL,8 8bCI;Od;F 7HBh/c~_|$#g/A@rLjlScsǶK=w';Pê2߫i̇}%٩#ԯO>BMq8C Aļ*+Z]LO۽:-79i} tkh bڀ[}Gb-K׫}jl"VG4ݟ`Ä[UcEаC@%!@$6@uXZU/꧑)WVw716_?v\llڠƨp!k^?"}wCT;]]MQ)q7jΡ۫KG_d]"tJڂ|OP;qk@m:S@)-~sc+Bg)dvd1va=Uy^N >#Zz7قOg^1lӰ_ܟ&|{o;MGH6I[ѩfaZGzg[ѹFv; mWkkͧ]?`vVS,99P5 Ӵ=DoնҹC]·  Mo ʛl_&8qdsO~@GxJ-XsZeۖK.ȯO!2t VRɷDiH[7~-;J͖4)ڍ5#IAZހ;АGmb?S`â12CEmJw>ԆU U[!:A 8 P 2rUX ^˩%4Ћ$A͵TB1xǫ.hRCnNW;8,{S 3!ḡܸ7u NrdYe>uW_O)H :%15 IޞK&]dݮQ7ȡQ>q9~7f앿3wK^J1>}3Tm9Z۽Zy1 -ѽF]l"LjxGb=6snG=Ǧ-Bm?g,xȹ.q6ڮyiϐ䡼dlXNL@g,ٝ;i^ֆjaX HG 7A 'ڪf<5_vG!1(Ӛ)OS]=];߹APѧ]NJ+$j3pkwv˟f/c93Gߜ!=]}92eO3EjuѥF6VcmֹFjܬNnFG߈ӫ,qa̍7| b_mMyhPm.vW?g}ʮ{uk?S sۗGA]>W 2b9C7Kݘ-]]k3g95{] @} 3ţ) 9P1~6][vֺ*j'wOķ*{dQ炻P U2 2/}ܟ'D+db=^l9z{'_O3Tcmֹ5:R/ҰS[޿@/lRL_D!azlB-66xh#e.I.y͒*;j \-7e|x5W4P\yNy#̑ir 7);\\2zYq[+-} 굺؏6j!s{@|ZD  j;%{jأdw#TՉjԿĺBp;xpϕ\ |0K$(]1Orxym}OY#0odV_wA=FH~\̥U9P Uձ\Y7ŖH(( t:mOf@3yk]9x^zdivLo-syxxlҤI]uRNkX%2BHӛSC?K#iFI9ZXi&Yع{Ƀ 7\jFğR@ 9]^ @znh.}^Gu` sLiՐFQB8O:)XHC;.h ?p/--Z{{K r!?H̒7{d]^uXkHԁJ0m.S怘~J˜} ĄHsvqƉ>QaY%o.*ϵY~s/E> kp`_2.<, $_Γcqc{ Co`s]D_7r@60T>M\HTw@ݸG/z[ oXknȸ@MϸmT$zfi3{Pg6:jI߲ФLWLwsđǟeit&;2^dfp4yYPVK+:&4JXa#}~XڶldΔa%n3*'i5ͺu+ѹx`nmtѦe Q(Ei:h)g<"͟ (\YMɕ{o{nய\sK7*pI?֯V~p|"(B<|nrb?M7(CQ"$`aӞ iRdNxxxxIHd8MG2jȀZ.Q=A} s~H~MM)WCM98&n.5]VƘƼ*yZ9$ۼF\vlW[fe</xã:0E9>{݌wJ169bHoV{ 4QCչQaQӢLx *ߍq@L1h- Puu r+}OA-V}DWd}}c+ 2ZuDeJ /eՍr\}܅V)V*X/J(c;ܱݥ_v-;J/F5:Zsw`hkkoW`ˢ~F/V: =69jk"hχtbn`jpty.uzUtn vEwo^ne~;i}k]N2_>.˷rh~f9ݥ'o5$TQ".!L3jxxxhYt6;Sx)V2ש| oBL{u&4KNPBMPU?bWㇹPsz| N5Nt+]Rq`R`ZvgZ^D5GXnR ,,5YMyCx8KaPVTLӝ1*:=-vlb/caȗA!%! /P {m=<<;]ReCHy<*B Fs)D7rT5rUn?0KkKKC9Ml@lה#zfG6gFF[ތvWsꀚ-U+wFZ5AZu䀺H^ÿ`v&&d-_}7Hؤ/8.W:ִ;/;ZŁ:kpq޵ jϚhc'p;7O9V3G&H`\ 6\& S؞XrmAr0df+yn1=|X En007:gj 'iFjGc`&]UkO[|Nc%f=<>^z;~uAiwz L~T &UT[Be*:ׁeni_fBc)2/y d 0Ly.`mm<>ש 1m3^z86u^)i-wО$nFkW9(;#)xpqdvc2?tguTxZ*15m5B-qeb]moΉh&87Ƥ GI0{ s@КpI.huU\ƶou8Â-%[uι*<^ߚ_&LT? zN} ə}<ӯ2 jM|^Jou?7.M7bz.n@}֩n H\D9p=>dKzKmH`t}Yؚ2ZQh 9ON͔r\zܧ]JV:0uLv(=uV' ]|_i}q'm5:{k|7T: m?PuСϛІ h.`O6rCXPWhg²Jnjy|/og{O)&cgD2eqHz^@ Pd~-al^8Gy8XC6ğj@gqVw*c!$ous~dJ-MscO3'_º;BmuԳ_W n?n3cu|J-}4+z/=<ט8}' @M('|N RݛfT@"<-z#?q8 6͏aJ+$fZsB,{b@ޟ4>O=ǟ׌sh'U=QD!aNLN/Sc¯ÝOS>.1E,v)j_& W'% =<<4uЉ;s˹9,"{003?Fqִ zY:qo7Ywnt3ejm￀Їx玲h!ϳF_&:ׄ;١?70#pGGs3-u}u[,,ۇgq&r^:ЉЅiF{xxlHv5~`Wj(zյj-/ҍ`u$rc **vӰyX_w8Tɵ2A%!r2/r#KH4H)6j9+\GJڧt~AݣSk ; wC*Uvn|72\C/cwԞsBΪ _e>R'BjF=gSp?Qg׬' >`/ݍDċ05RZ%sI'[.7pA]e`{h WqV CC{b>+>ciKB[c[vЩblMd],{6kc(x6vhqZCdC[G.?\^:?4N@s_&=ɹ͙Z큹IV,T%tJ!sHhOPlH؟B{;nLx$gHפֿ H~SOUP)^ UqDZ+l'$g!MW :*PQ:`~ܴ==<²W^[0zND13HAu/B>]B}&_́ͅXkwl7z 6uvCۡQh$|Lz R!u1)A.F%HZeu`.=PnMIWiҾeȹ‰8oo|w9.88<*tCmZѵ ߽zk۬MNښoZ<7 R-~x&,_|vSR(cԳP=^ԴWoW*`J.nPd|D5F. !-<Ǎ)涐#Z&&śNM50:p(d |ɯ3z\}!Ϲ_% ގv/ܷSbu6K?Z.'}^k;ZgST_~/.u FllwAK7$&/{ϓwt7tz:bm۹9K~Π|_{Ł=+:P ,~hn0B|oo]G7Gm7kk?m2X-_8ncoECR9Esu/UeN376̎ڎ}m~kuUuuL=PYpx߬w%A\;?wKIG4٬{g/U{4FADT@ Ы"v+vb+vw7v X H< w n|y^{{q<2|$;ePOª V<7VU'{YPU te: m {ipJS!l ԑ5 lC[s;pe_f5 " `M9[L_rdf({rԜ_B՜R+%{xAɨb #M9r< <4:PȻbpb]`u]dDQN[["Gr.)}ewxi"RyHcbbƶD<yA&/T~cֵmo=o_eX羾 i6Z[`S%l/׌IWƑsk5)^˖7mH9yKJH9,v-iGD~*)ȐrKY cjkM7m;GE.TwGg2zDZ=,B֙o87_x,٩.6ŝ2X>2]8oK? 99ؓ wp!_'q,%jU&`ǏA#~3&pܾNj',&9 A$L|+SO'gbQ83`qYFLX]Xj7/fp#o,/xti@ޏs@&5u2*iJ;xأ+3);Y/En*~ %~ 1|\>mPLOוtLp,^sF8^Ta8?Vi@IDATiȴb݈aR6 MmǮH~n+x\Kf9̴ gZړ3ZXVpX06>KoC*s%Q)w|D7SY:Wc׬ ܬ%:޳mifKrp:9_;%w72۲*oRXGۗNfzHȖ~)O}bVkSm6ƖܭHO[}]sw+?:`}lJBcۛ+/ =Z9^F-o;G&io;XZoG9X/+zHyٕ)XMiM1w@.p8SM(BJ3A{k4cƓ^e  C@{=\꫟fÁhUQa Vސ#<n )|i(ȅgea:ģ}mk]',\Zk?sKy07tY1hU>s2{k;Xeb:=| (|mQ_Ú{@r1%nKec 8ǿ;0M4cJЈִlξk̩8OOפ\Mw/#{J:{D~Wrm?E!_k~kѱZc*[7{u6%XXho;>KTF>Zދ}^f_z^AΑSUZf%NVl,sDȎ{!-وVr('eA.p8Sr@FJ;l&Ix$A/f?@,| 3=xIu ueZUyDFe7þ|DpwXSjBrB@P Љ&Abpڪ˿?:{hA`~n[s}mhC[|׳}t49m x(Ց,L ;Šfny@QL}^ᓼz-3xH NJh#enLP80ctДh"[βGd98yWfKUQ.Urw^\U{-bI{d8vXU,sqmw{p%Wpmτnodlsxu_ߖQ 5ƚHXn"5q96ѾFT"DGZʍ~ß%2owRi/^#d"scríO؃#ҝ4 iSvcy4!fץ 8M)#j oBps=;go=D2ÙT}V' aU*Y&[TNK3?@Z ? * s e2,Wp%MBZp|e@.G(| M3mkZa$ oU/ˠMPw}jN΅2oұpOS}ȧ$يr!&0agZO:꺌yVYؚc؍ߓ|n5 x i+)K2қPTL ?ɟwttT-b']΁)F sW`=l^i )6`|7cM KlCsyE' ؈E1->.65 oCo,&r\Y.ʴ%Iя\ǃrU>0]PNSyKH!&5GeW_h:y]i|iVA^C:)㠮e&_j?y +&7êMPuFNLK&Pn>>w~vojk6ssh(3?Onnlslzy_k3m%1 Sl A]޾ޡ6g_i eGM.{o-w޾?"K#)űr{_Cr<?UNg_(۲l}F \V䯟\D(C֖ 8 *-YDѴ',ch\ ACV!s5}S~XyVbp8VT' +NԱN=P_f.l.nIz>:SO9@6ߎ v6޹q'm r]5?=~כ Y@LPmbV]l +'$HX13ql99IPCv6p׃z3D1L0ydž:RF(%h.YF1@R\2! C*J:\)m*ewY/+mX{Ӊiҗ8msl0)v:ވ9ovcW{xv MmfT_1lGtA4"G֕{壥촫fwzͻፍz7? } Δgy%v)r {sb=vOo2Jʥ!O,Bp5c`kmk:D9qfBC`'R}rN,wAp8,x< {$3S!qvvKA?4 l‡=|W{$"?¬ҹϽnVCxV2.\ ź3x鶺 VHχ} t7 .s =ؒ20fx@L- Cz8 uVe8 )<# Ѳ gWy98)9U'zTocl/l+R_yLFwknͼcZumiw[AǗ>'#E'nzkm/ͱ̱gu"3o ,xѷ;6"a{cmH˂4O-:9l6ɻӜ[2ͣW6*kbW#w^5Y-;1Xz%C#Ҏ>t3oQN#p5>iD:dž"7]hsiEx%fF7:a(<5Gj71(<t;L[uo]aYzgԇ+fzh^} tL``*ө'/3up8c?ǥfU|C 8X 5'Rσe{5UO'’m VQߓB͇6: =CtRtJAfr %ȇ#CԅEދ#NTҘ&5tec-8C#d^?.K}-ݼ߭nۯWz6:ɾM_b\sƚ 𼰷Sl@ tqYKh6~.3,zxdfݛf;6"!6aq7*o9Ͽ2-*Ҕ#QV36sjؗ"Ė|Mq8o)|ؘ]&A'QJK҇@Xvn XԾ,<]?>V}%WgԾ, q8>&_>O( p8,EbJǖlo?`HA]̻:VIުA JX ikI#;IƝsu 8H;O^?B*0 r$:Ǖb: ?{BhrF'(# Ӑ7Z6̏h9Me|tw?̿*>i+i{l>- њp^VSmAnN@lp=-Wp%oLVۂ9ncJ~7~: 4a$d:VMO^K2,E>Ά`͉$.L@ձp~]Pdr~KnjA1q1ñ!ZOȒ D"QA"N\H?r77Dx*ߏ).6mF:UoXHn|WV.ގ;lʾB`7ȇzKƻl }ff}__}}ckkx&xrsɷ?s6i=f՛ ` ݴ/Ck0㠦2F_gÝ`73ãT,|Q%\dO[ J>.$qNR銐=ɗf"a5Btx$bd$@rOҿoRg?J'6xCd*G42s+;UB6׳=6l ^׭:rӋ 'h/X`lX&;1 2T^ hsUKUk0>hO$&јIbd'R@xV3p8o':RLb;*G)`a%dÐ>x['3BX3= UCU%` ӟP{s B: 0$/] mZi\?7I0bQ"va.da bv2ӴTH`M]z~k&&J ԏz:d*-$ޠytRM/ƣYG-“cb3iӍi"(}hD'o-u;Kz[GĮoV/z5x4~eeᦍn`^uo `v ̈́ZmuVw[^|?+ ^g}1v܀iNc`f6`c6u276FoG,?b?|'W}ūˢu{*ȥV Ro!?pl8쾹=nЗ9f 72k*A&~ͅPNdᩞzj l+&?P51Qxd##BjD+ W =ovћXŝwȤG]caG<tNU+t*ua\W .IZU{XJoU3j^Ntdr/WrDC(R ČYP؆=K)-iK%Jvo_;.i΢v%SB|Iʍ}||ŕw{;ľ٬6LZ\X`rVg[muV[nu|a_^6\pb[1F4F(ljƶ2HxT)}lr[ )/F㊏G#EуECe׮h23Q^Aڳ_N(%g@WذHLQ9>Lh@@PfA:Bݙ{SXB" /\+K)X}bp/#7ꕭ ;q D_3+xWטQ34KpyʍGhbGV͙ PނtlƕPwAf3FꇰbD ˻& $K;6 58T/CYg E ȁTNHӕl: Ջ ch&Dщl7˸R^Mfx\=75v\I1>joM9hjgef)y1_lo,BMTy J,YU@czd ;r<kMP Qk6o`np^+~mXDxZ'„>Aw,^5%p ,1Pf@6D7amJ(7ӡ2҉rblEPM"@Qk]ݹñaX;&0 ,2YH70/v9En Kddtע! EQm%JE_/dFi{hCB^ voWFV07\*8^m5ߧZ?f.5pXpQihjrͶ#>SlB#~} Ҡ cӽ aEeb7 ˚ֿ ˏH&Mu2$Fg_)ȼ7|O熫 \NƋ9k8:6/c->f)Yk|KC݊yPfi}&k >?OPqOj1 \=A/MȂ<(@wUٟ,up %Wj@THlɦ_*#xы}J*^i9<2ؘXجE^Q.EGTKѝy\c: {ҟ~bJBCp8E.s%9>D@9bM:TP<΁&V’a;AG;AUIJw 18Ew,1d1qyﺮ+Cs?_e'_>XUN>av%]:X>1qnkƤ.!A0 쫛q1!,K lLl3~09 f@ !h(GZ>}}V4?[FEF[ƿ(zc#âF7VZlWn)ymtu^gۦV[]nut|eX wPHHg&vAإw-"wG}ehm׼a3?F\"E3㽽wSQ;M6z!G)e4'A3pbGΫ.PI+h=03Բ45[탩7RsBX::[_,?*TMߪAJ=2ڤh1s h-r}Ǻo 5ՠ@9Iאl_k^4;˅(Mfe hJr$^ٖz ~zۂSdЩ, 0i,Exk4-&#X%ki2hLJ-;+#}+y#zwys3esу#CD5];6XCoȲ%;p۝{n-p[n ΎX5 99M 4'cm{C60O7Ye>Sdћ4^7w. [ycrwȰة\\ i ,emdp8~&_:KC"@WSD'Q L@g) _7)Bݻ=t i>FU%o oUKPuvps.=U!/!,GdG/5լts uЍ3A}Y}R? H_o[>͓gKy6iQH].9#Gxq}ؗ%ZH<`k" ɂ~Y'YDz1kJ2\s@bi 5d|Oeة2DMgxMFtN-u.} sQ{Ŗ؞{V{[otg֫./kg2W/jvS` ؔ Q .?)rL􍦼#FnW#$Yk?>6^'%4zR dd| MDM`4ћ`"RZŕ,`T_@x>㐸6moԥ쓚)X327][k{2T*=!Q猧͍jL"Y%;?#]M;ѵ"0%\C^Дmq.oa?L=Au5!Ԧo]PXC1?{w\& hM83z 8?Hhtbl~ ʤ^6!lEsU9ZZ="ߟOO/,<#jdb)淓ܜTVZFZluVg[muxaaԿ* /`k* ) ͍5ShdEDGwl<]赏x =➲lϼ~clG iDw!Cp8"#O S؛JzJݟ! .ZUSEz'<9CUd$<֌O5 WkJd ~ +aДNj_g5Ьۿp^ilJ{gJ@ R6/! =.^ o{{+LJ{|([ȥb(y-v EL2Vڹ@00~$QI d7D9k@z26g9q j^Oo a։a9W3a9CP96Խ&\BuoI .bm;uL!ٚrfBjBZ'@~VV$ғa떰i7^!F&gAֲh MB+@r;vkrC6 ҀJ^ rVt+g@ZI;\,oExyM*zobggÍ:P?u`u:P쵙V] ny`soF0|c+Rva Sz9Ge7%㵊!7˧(ڙ&y,[AH[0[CeTȝȚHN2ǯϷ+FTE:4)]!9$[c =D`w}/@=X:T>3I" h&% av5gdɬ}r*i ҇A w 9&/2MǚJl捈1rwMB[!Y2{ٔ}[2g(y]mtv^w[nuV ȳmV`S̍.az퍭1/x}Yv^>L%򘬑f&0ˢ$l'3~ ю/{X\"\'!YK_xn(d#ݩ}YVzNv.TcH fYfj_,#M3uF`ͥôl!*{*L}X+2$z7z_ñ~S?)E>װ< o0o#??@gBu*uAM*6څю2J{AIE;؋\ c]X؝@6edƏRX`)M'0P+E-,a\>`E{t9FGͼH?E8SoߘhM.־tۭ__@&/c6'P|+ g5J\. rJ~yVy9KI'0dߞQt1tmd{JR,Gl_,4)/ p8%DEFp1C)iO|'Sg z#$d͡COMՕ't*|eEP?;s6Ԍtu#L`N]`{g5MLbW/M[7R\ft'}J!$_@s e͡"-ң{y04^dFu.$ Z[/qiG>p>C(v Ev ʩ٘^lAÑr\]HwY- %_$#5޳B.e+s% =XA6?R`~&^zc3>0m˭γ |M=Xۥuo$/70,x|s]!}7^WY(w3J]W|(c-R~>gr13ۛJh!O=Ys=\rK9RنrM-ķPpzN^Y \@)p 6}70^5r8mjP0 IgBP.1HFwP{Iz}YZBb[(3DCW[ҐȽ@%IĨ)(r8p[!0р+'[IKZK=z./-}|"U{YoOo,fȕ"7sUƚ N.lgUvGf3rӭnXo>F\`F׵ˌjY@R#oby8G&{$كsr>[X|d8{\)&Bp83ٌReo}hBg: ZP's.%'gG`VqPI7W!g] z :\3xxfa]6 YlTCc K E:Tn (;ݠUKSջ${CU|.3OA`atw/ˋ; ANc @EΏ;;){˱қÞl#{yɅr LOxBJV~ol+`Y(;z{ʉyn\cm]zݰ6`2=N7@l&Z#6y|/˸Jnf }DY!i۸Tja&Lyҏ^L&th&!W#ήih,p8~ ZW,`t@"}چ!}XPAmDVoMυÒ×a$jiSH6 >Bn˛z& @-ƻfpo`v,csG,0U$x*7׍wu8 yDpGfէ`T+'^ _vT{i3x($Mp]hgs-~p8,ы\K_MZ9(:ֽQBmo.^HF+{5gr<R$.ڻec+G0ׯeK&%XF PLFտs.c@,鍙ѝsMه x 2 C3Ro+9ǧ{s`IA:+K6 C̈́̑z)4hGBpD8 1a&_*cj͝k g:guO%K֕nM!Vk ҍPo1CuXuCV(!""/Ar.E<B'*mh Q ЮZNT5w)`Wf팓F XJQ,ҁz1lᷠh6tS"] ym{Xr|\'E>^Zcmi|aA= UkKX;&'9e DW.+)yNpׂ((βHZsK>_ɚ \a5_IR:S \DK,* !_Arbp/跰bXXu 9NFfbn5%Ƴ0󲁱Ƌ1o7RҺF`VS)}N۳R+øjְrF} #gg@ѪyrT]gCx О Gir_A˨r8f0`7Ґd #CC[Dz4S&ЉZffO`%+L%]8 5kٍ*c6M}M GW/Px 6`#l&&bcȱ!OҚdw]tB5`FhF_{)e*{SB1{y@ν:*v5;`wv@[1uDZ߅dIp{B&z+K~7 M}aUaz;ԝM 2|Goݍɴ r dӸKp/y5SEUf7j!i2B.y> ~OF O>dE'@Ph`]?PT7xןPuSd%.gimO?$}AőO#ZzK9UxR#5;KOQe`6|5 `mZ_VDPW´S["`Sl$ثh6q;E~,fҘUzH&K!un u0dg<z>s22९o) c}_;8*#)U($3ߐ?/ _/.t&!qovQJ&AX臠8QN==0~VɶrִU4WЌĈSĉ49-dSӛ> =me;B.e q sHs׍uҌtIi~N5~L@m @{cm~^X>ݞ_ 3 xlWC7loT`2H@[.t`wƴZe7X3{(U**PD8 D ťCrpkjD ܏uvg9U'dۄK:#OgP[W=~"֙fR[13IOԘF=0b6Q-s.Ė<w[yR\ud v@\AoBmL\WCl`2.x8y(qz֐4# ,JBЯuԓukC/%㹌(9JBӖ-%?d(G0)/z٫#J- #^U6kcv xےbc_Th- ~+͎~># vj}E1 BOOјI 8ֲW.ci.ށ;-ChL_vRB b|'cq=DD4% -1򩡺%)d7 뽐>.ܗ!j.?Iiuk2s!LMU8s!%*{n~p6鵼 &Sw6-MX֥:X?,S73;Q VAp^3DٳAǙ t*Ԝ>D?2eP?:󄶂*@:܋3!;;@h/c%kS5~~a+j eD -ؚ^/UN`FI]A9)b;J=KQalmgQX{~m @t{T6؁~L?K}T糁(f90GiEcIzx;ҚNg>~7IJD-p hso p8ڔJ6u([*;!L73 {S%Ae4 j WewPw{fPID";_p;s)1o 8GLWM~wkVߤ 2 |ГM]a8;|~Gk??/j9EkZ)ygh wB}!]ct-E;, M{ ԚǟS2IUB<И^ޑ=dK(:aѿ -Zs!6SPngos ۵_zk ޸MMot)$3iئ6e ~FRƖ=[ˎlOL 3_Γd=OKG_41e+iA#ZH5qSN|JY@х8~up2muD?gR}.G? qbvFAz6d wՠW;Qx2x&ujQp8dT?Wl\nmLt&ɼ aK=R;dȎڷ2h56Z(9_A o=\!Ɠ 9M("P:q8ulEы ҂ y!FѴs-+mFَR) e'ّٝ,с*n7( ;߯5oVK[F]alJnf,rL@W*_/fTߊR},1û46{-J`z.p8hLlL p[PF~uN{ ~zfA}z+0}N&tWe'#o  >D˳CJ,5Tێy+g!n<]\-V  7z4$>ϾEK};7} oK, r>{w4y |$_0A 1O[n96)?'B"рriATHW:il31Є̓{?s?Y(8<7欕&VG۵򂻋M6[.fο7v|&Mޒe2ykr{SIݻv, L{Eҁ;?&?@_?MsJs5D(_@ɠO@gzT*o=R9R}weWe :V1zS(,}3;aV0Ur8֮ov=L ҷjvjA( :!2\^S!WN!EгY8|8.j<#.=i@f̖ Ji^zl!()U:H_Iїb~r|-GK6?%n7)-򳌵]%Y_}~afk,tII =虹@\HK`e|483":QB4$F+т*hC)}e[:R@iBwZ&A`тT["owM[s16дVkca{?6tboؤ<#\𸭉H˷,|.W\%'l)Gz}FцeM)HkJi!.S9ʱ6Ω;r4pK=MkA)7ه q>-rMmtK@jRU/W!T5X$S\';m!M؍A# c.*m]p8~7~qm4R:*>8omaM( NքCR'kPr(muz!ݵ;s؂r\@ wr~U6?V_}=!q| KQ M%Qp`9q|GLm2R/`9WWcmnZ~o%}cX[`ζo\):HLZ޵,='-)vh yve:2}~rb]G,f q1E W 0 30 wꢙOtg,OR_Pl`f[}9_%+Hm9+RMR zh;f[HVj1:O/UGljIfi,cq n C!64D S`m*omIؖ4?;-= ٔ=9=K4gs0*ĦKwVRLҌ(DI4`55.p5VaOU5soݙGYz {S*qPYv#+tTW_EPIm9d=)z>+HjpCKċBuHݓ=K27hs>?5NAu*=YW@݊LV;BjazOӝ;Ѓx ::`*Ȱ{|_T|! GlD`3@BJ jJHKgQ%߳&/2E_SC0gkk /o0 [;/=lkKk{ҎWy+kSGiM&vDhM e5M))#J D|ڭsg?p)ʵ}vR!>HWi$ M]S>?d wȼܠC:z\ݡ,S3K1$ofk{1» >C3{. M+&֨ြ_MMG{O2`7&Bwl dkc;%V@}-Rd/@qh[op"?gs TJm{x}"@k^%O*#+SEFk8N糜 _煿?l~___tsmz^~i?S{c7Ѻc+nB;c%Cr%(q9rpD)brI>ĿWЇfDAfi )Bо:e.T 8Be:tH q_v:}^3'ԟC ='xVpw@2&I:0hwك=$g7O yZpnюlBl( J^:g3H5lndH(#?RG5t2)WV[ou}X{c6E r[_Y*F0@Cc۱n݉-Sumrs6G3MН03c)d YjM,ߚC$k-p84v#1iEtWPЋtAvԦAِ(.Hy]X=z&;(d?7~-½\o|E;p85:9!.KxB}492ؗ7ZHܙJ;f?s!qJpF-_BQzQr#''߂(Dؚuǣ4#Hf>s?Җܜ~k&VWkuˍ 7/xؖƖ\uc/n;@랴go=ÇzL /<48Sa~>)c3XLt%Ii!KM @Q ~:c4(t# a.3܆2;~H\UP{Mnpv> /S@zyx{#p?fZViKLgTKY@ϛf|\9'cId<(~vڏY~]3;LO3]'ޔ.X!sF0[ ׶؝*=$#wlN /ˡ\p]].4Js0V̄ɊlufJ yN[IrhwݘYOTBn ! W7~ B"jz e5&p^WKwq~o=FuChu0{7ǽ_ema@[Ӈ=Bc9. ҿ!lHb~QD3,#CR(vn"TJғ"43^^=–ڇYy'[?ٱ[gj;cI`{х MӎL%'2bY67$̇A8U7;<ܧOB"@}$SPwSe'E~P2(a-9UP r~ :!@, ԑ$c uz7rq3>| O2A=_o#xh`@46h- fXy\xumf>a^fڱzт Ѫz0 Ҙ͵Y[3Dwӫ=+'O?m^#W{\aI<|s_ssvrN6;;f=tfA&nH^.=LSl \*50Em2-V65nryFña~u9kpv/O /zHvO9?^!mȔ_p7}s2R%$$dPԓdYC V泐;17u }^N&sުWʜ nV[o3ڛ& ?FmmV6сZ~Z@=UX+ xi kCGCQJiCk!*D2@40qO pfJLjDM ?bgH݊PtǡLT;AlJwL »GuI[fZئnp8W76!>3ICd赐XOA{2MB]L7ɉ٭2chap G" |As/ R@H- e.#ṲڇiLgؗ;ytZ + .NxM}o)mmT5LW˴nw3'>rkx< .P"I?f\?7)A@2c2/nHޝ@} uL@<]!}hwM0 1f>5:__~7E?l u2- u Ԟ;ILE a?, {BY^t8HGqggPR5,{>cu|KR$/=wn+z>$K2W[_?j[lؔ/36ֈ fct배Xntd`ೄE, ц~ETțO1CJnZe;f ѝ8fD^ p;݊!3:\7+X'2')^ol} 3$W~0xY&^H՘ܢnp86( r~U}^Dr~8Z{5d> sHݎ)P763P۲G)$˞Afp1C)59;=1Д*bJ,R:*,:*p2guw>eUx[Rl7^R$w?˹-}z6WXnu5ƮM257h_h/u#mȏ>UbaS|.&v'Oshla-Бe,Uis\/H؝Āҋ"`;1xR)$^ȞA٬Z(-Z`8SL5Ԕp8 \C2݊!#z7$ZuRԵA%'Av~x6s@8 ؙ#LF }+nt8"H~j>CoS*]cTO+ a*i+%B-gMoEGo_`l]Z]nuvo |ju@Q,/Az| 7A,z9idO ;s [0Dަ}d \p86(֯ڀk1{IjkZ$WsccRjj ),$Ѻs!{ Tp-}kH6џ +X;BvZXC=+-9Cb@! @@@o}oGĖ4u$:f8|9W2v?15x]zI0TGt`.w3to0 ~=_eXnf۷olSc @^혂@/ѿs6ctn:N,\,.I/Pb+XI&/-`0-B.p/)tfZBfU`H[ uZ0!Rx^ Sډ@z4]-M eZ 2:V_,]z$!Xؔ'Cԉr:o 蹐) X}t%i 61*>~^$Y,j3> d Sl0:x[ hT׷mKC oR9>7VWkucϷopM!Hk : Sv}79L3OYFnz%eAZ=W:Uix6{r|A#je\x 5}, Rzgb8~J" }hLDVQޫ+!lG)d;d|9 ?K S؍ ߱ v&Rf|Q+rFؠč_6'g=W} 2ܞo =C&l(<\'CGݸIWl&sAҌ(!)bt8q!BgPK^[e}6xw6Z2cuÂ=i 6|];ު?Sz݌mߍV[ou w`K " ~{QMhnfs4y5cp89RJښY 7z-C@5d/ f[r3H6`). '9zWQAȘ7Q"j5RLe_郼C>:y4{{zlv>.x#\)} \'tN>ϙ{Uٷ<ޠX;F$ <| Af<Q|rg_<lZ~Vgb # [p8Nf|TrB%VCf+'x1 2ʭ7~ Yc\6.Hfe8U0~OZK>2f)÷qȶ A: F-ςnǮL=Y ԓEnƟw(rOOa@ :2iz!yQ7Y:ul]]GtûQXNs5ntVG /¿vgߖԃUCVjxHo&^d [sޢтm®^ɩ$$C?` 2V?KJYFړ4IRdLMKǟ܂9VC8W/c*?|pSBvNSophd0Pɷf2cCc3l5QY#c l7 ln7C6n%)Cu=y &P\N"rWpe0П$RNDk]rNflDЋ?'}RO˂6:]ۆrҘN%s}-zAjc87׵c.3ؔ! TCc h=F7 sU8PoB'gr~FT^/]#w%sN6[g l_ߧ,:*ML@'Ig{Қ/ xSE_lpkmy!Lz>=A,dp8 qWm,`^,Cn!;*@yB]a~Ύ-b 4%?=k&:SI5 U>.9wc,0d?=a/i՟˹x ٜՎEaɼ_ />n؝(lN`KIڛI. ,<+YMCF=!)1g>pdm Ћ&D:҄8+!lm zv ăǡ|d_F_rDA 43ñA~񷹌6],Cv7a2d ok!Iؗ+!X!7ϗil,fM(g8?;v,)Eae0OY0(؉^ҳ8@g#mm5 R ,3g-,hMl ߦ/7֦vX<}_gSNӬ6G7* rv[.:M( g3CgQG>݈ 69tMm)+zQZg5:i d f9deLRf^觠ɝR<&иotñagbi[cp ܥɮy# ٝBv>h aKmp1ڏE\sgs{IUe>;$AP0YTsdcs@sVT̂(IDA2H9tpz?ލ<9uyl*[rzrJs4:]HwTijrxR߇5M,g'IUM#k: =2r+E+e<9Y Qnw׏͒dp=_I1PEk+jQ_mh q\LAr ! kCFwl+pGxCU&cL5M/ܷ>>(3@*s=Yva|Kxf'ؿIBC IJ)c9{K\&+MjJp_rsOto=Qk5%f*tbH)}\ ۡd ̍衵{{|q:?{wEJ;S0)q |由mҋ_d@b3||zL 0W/\QL$"U<yS)l`3@G[P4~ @N4p3]XJ~aH;,d &(VRML W:}|~Lϸ~/a$/C?*-du'XRo}=utsܨ[)sҧJVuVH\kRŪq1~YjRL ꦏxG]6vGyGy?8=32/h_{/a_(B dsSq=b9"BL@ߠ7Ǯ(srQeS VmIqcOUcE?fFZГx@ Z-h 4P@5B;]Į{4ޔdC`_w>7rYX缾^z[}ܺn;ɹ9ks/VSHrVh^ 3 :f s#kmus{=JQ;/vrV{߽v\"RS%,U$xe ?0E)ĥUC0A2CW5 ]i*I' } *d @Ur*%%C!ωQ>>>>)f̪-z&+ p(MZыu-@S<ei՝F4 F&_:0翀̺=B RL' 1rU6bJ٘>»;;'5Ksn\Ľ6jsj l6γdggDƑ7] MB. }PdtXaZ 3ܺ^Gvnwtf EOK^T?.ylXL$'Z5W #}|KpT;>ϳiJ:N.{yj3Oeyӆ;kD`\mYz,=XN Cg}!p5`]6|MoPH'PЖd: (` 8@I\2?wg\P7 gII,m*b\Y:zݒy㽧R\w{̽m0@]NZj5HƱk5W{y @vjA,շt/uV PS`"Osu7N4u>tLzLr7+mEr7~`[*RJR(-4u Hgm9ƥeu`83c Jp PM%ЃC$QcQ_0ZG=Tc|5.Qrv$6 ijEQWKe_6Ovfd L@ eROn+<2̖dFjْjvt?q۷;u)T07nc9I }5n-0ǦTcj5M { `M:?8? Q]cܥro.Y$UٞOqܝq|RJ$.?@M:p$p Tswgf:Gij=GA`j˩`W`*98JB;RzP h  _0q@PS'H ֗*ʹ_`4P=@j0SbR lց90PcϸRJ)&=?9{JtxɆ.,wuxY g@\fEIiѪfv_u"ygt{sNÝn4+szM v|&p}+xncR?BL}||ftu+`MP}hVg%'SjSZ:(WP #ɘ㸶r:Ъ3\kfm&kE!k6`GA`KjOBZ \<-jP6@6S ,H2XJ1eRnP>9>=B`= &_KSFN3;m_f_gሻ[[BIDAT]<9/iM$_?%uiOsn`;* ^ORVR8R 7uB0%,Wu`[+=>TWE͓@vp=;}km=4 Ŕ?/%kޓ8-( j5)T*A>>{3Uz'~!E8 bQz`k :!tUj4.ʸTWN՚4SWe;ۦ5]*wUՂ{hoԁS\ ށuzr#Q9UC@r{a&pE{ggg@&F|&RW"FyW>w_&[$'K\:ՇT][e{k,P&~?MZ7fDYsٮM5.Zu ʨzX?%u+ 0AKGi-Wצr՛3+fxUʇoPE DSd $+LQ|SG҈$k l# 䲑4Ј(XBԷE>/-9:J!}Ջ$ȁT:*5ȯKcVeajB.V/Tu:D r5 Y Я< u~Un1?6>>{=;uh"JʁSF7 rvpkONOJuL>Zyutőu:7;B|:Kl]ҪfgxA"4SfߌuֹZMӟ=Y1'iMӿfEy~WK.v>`(uFdSwpKM"t>p(H KDg>Q!D˻ fAg=i I'%]>>d2~KJ`֓rp"ԪmIo'7O)o-+Iߝ&o0Z͖QlP~QYCUV;ǥI@6(ʧRIe< Aa KWGrO1% dy} p 5 rtz"vczsz^ p$6Z_f4"YF~TsS)\8P}#~ɺ8z:L=BSn{1%ފ hFGVR6Y IY}ew9;SӉթەEK~H}Q2Μ;ʺvӡ2B> xv:Yj2z݌7~*Mk]94&~0cb2L >p[F\q^yp%Gj)[UVīUc^LNv;uSH~HC9Csv`{oKwCf AC!:Y(nVHgFfI@S .X ]zxB[Su6'2P5 Mh[R||||R9(k[Q*u4&DdžH8DW!):r2|Meircg>x"=,ސ9|(w|!Q钞/?"բlEВW qJ*+_R~W۾5.];9o2h?\̴Z O7~=ng"$@t-7: hXqePňe{)y7eqULώ;Mm6>=.|$e|]Cs*0XD$WBI3|||uӨ_؀ U A9j'CU-=!rj`!h&~b`yjj[n( jmG @.hDԳS/SsB+TP!4 |u6%J0ˉX ?? ?g(@-6Vr: RAe)r|fu7RWP~m'v\WzB٦%Ý͕O-ī~,=#Tn4+U73~qM/)>>\kC7~ӍnVgvȞ#:6) &GIA0ЌV1MuTH}ʯ+]^43zntW)]N7mF˝v¹,u,rals&Rz4$a9~" r@3|f{=2dcJR@]@:4+dj}HUv"-!>ikP"f"m 0<,+]i oᵁ_9WG@dY`ʇнjRR&̅-Ʋ4:`ɱː_~b=ӵƑZ5jpo0?7MLssLjI_&YS/snWgV҃$!éDهӮQIoM'$_Y&b"'ݖ$zjyQ8 GEd/X] ϞN^M)?r@?\6@pؗK :5 y"}lc`fKQL ԸK1vuX&9 m XiSA@:?SNT ʷ|zA@}ޑLQ.@+`pq"N&6T QR7}g)CN'~<;^}o+_T6]U|IֽaAsk]3G&@ ՚]bo|WY/,q뚅9fߌ'0 }>6)-t3y&=*5-5K>ꌪ I~rٖq:GvsyϾ>I&{JK;%cœv=!#;[g d+E$HP绕 :O/YoY |b:ut(s4@Cu'oB`#:Dg6XoUX  kjJmWu+B@/ZD͠FY   %c! SO@5Aj`/bb@hhAh>>>c'6TH9Bk(y6ȫNciz*9CpZyzjwgsbɹEwOX-zW֫-֝> Oj5)~i5ɘ7mpw[#E6'6):_T?#2Yu>-Fr\*V*6}dw#D% * 0*3aAt,ȴ=q| +YiD XC%#D 4 uQ ୼S7k!^fX e,ez} ||||DXeN-$8\`Rn֥ ˃w gd 5rk Ip0@hRBMd"p(R ^_ =*?HTK!&vE:ȷ򋌑rt(1-"i5}':oIs9~^ʛ<^mcFd[\xk]O}Z¤izkkzf=~VggӖLD~BLRVImБ Y RWH&ҡS"i;RI30g;֋zyoIO/J SiZX͡2^j9[(aUNSW "*HڸALgٳخ3>`#6< ID[,NSSh kU/ ܧ!P96&p> zu:O3TKB׌Ȕ F2ܝބ!pnU]Z r PK *Z ɺZfyh\@%j]>>{8JGU JBbe;sY,o*#xgJ6$gz?ɽ[`9AJI}iLrxUCR|^+}օZWI_G?y0YI7;-&feilw?n_o/iݠ4?0iZџgG28f PgxkZZdIfޒI[>>{<[0Q (9d2*e2a n#9RΕk#=:$p{߸/^Kl1XG?:T/6~˴TQ@eĔVӄ4/0) &<,:O #>&:w Xq/przzW'{H//=/eW)SNK; eY xĉdRCϿbrO녝^YXD[cľ ,T_AqyOꩭ8BpQMnI:mkt2=m0ϮvrgˮJX*A=ÁOtp.y)M y3G Ƚ;@AlUfQׂUhA ț@Qگ% *FqVeޓ2\^'s)RY"W-Uzuocgow{si>Lq9 }63ܯgf2dcj`y]G6~xڝ^\,͚ 15 5iv`pl`j"%&ִFW{3~=-s9z﹏W'f^QFկKRorX<Pr%T9Ew~T<,ӉfGYA.~zH= 3C=6 S!+3|UAxz\#L*{Ki?cH[3b4cM5F}||||βe\GU_>Y lg3%`h 9N^ }jAigU><HTZoZut7?˥V{@[{:;8ͫg=]-o79{C^^əW22kG9K;Cl]Q,eR="C Tmi M[A~'>ݧr <6Ќ!8`MWs2-Zԅ:k`m"SR96[Sڊ~1.hd j;^)R(ZAkƬ)/Кᐳ!tZyNW!ml=ܬ~P0p:7\-2a 2j =||l_:@(U2_xuxkd}dJov~ spNtOնafgsvxFTO}lvk~kl3]kcL&ҰEIQ0&",q:ksc1Rh=ڽ9sӇ>K>gO//v;i7.|"ʚɚh L,ru=F-GS(33Ց46) =;V摃A.U#i V/]nR!olU K稍=s3ZV_}ՏbuTu3 "ڟާ2ot|;998q;ion1'uhadܩpsL}6S]ckZn^O6~s_]gպddS.VIXD,:5A7 eZMb[ 4̜yֱ.`s}|(1-Y]H]H~4']/"+{o >z ^# <>Y:xmUTLw||lz9Z(\ocU +hAzBh=8PK R 8UÃ)w> uOK0 ~)7d}E}i+.hHԓUM|΄M֋\aj* ?QU9OU z 3 Yzx(8Y) `H钄1~] _ng?%(+_xG';3y5EoMJx]ccwY|@g}֦Z?jR?l>>>!lGԂ@OBGS!P/ !vxzrg*j>`u,[gJr@f3 L"I5*t/=ׅfg3e,eWovlxE\;~ 뫮OU{j˪Nu.lUBg_cYim1M`6~"&ʴfaw;녦K٩jҬ9Y_դT0]3 u>jk?GתFUܼxa|f**f^VY+9/2/>T&xWՉyrWSm;|Vb^\;P^>>{:fWpJ2F3m14bu!} ԃ`BEk, goSՉzϽyp:IOr@}=ϛ z 7?z8QoEo !p:"ΐ;!FƑbu1y yQ!QoAzH'K@F]@Ae^`?/@(&g"irW2 }&9Y^Y: 9:!.Pshrȯ 'T+6.P pzW \Gg~[.H[؝3vpޟP.3vF#G *ڝ#}SHPuTxȱ06QWp4- c!@n:X[Ok1 ”ygd_nf?!i&D.Am> r};PKLw.|ztGoU>Wޮ<^UT_ɧ SO*[_v="$],L3Zu{_;%K;Uj{/7~z2y?"{Rsͅ~fIYZiRH޸om_\oۻV]Uըr`oNϩлsJfb/e{GG6 `ͧ0sh WϞٹUz a@`AyՎ!;po@}uGc>(x39gQ3 ݚ9nj&Ig d6&Daly㳷c윱v(e딀: 'NXP^yT@[Pȃ{ x {tP2qTIvN1Ϟ"㧩]!2 @!1U\Y*Gke^S Ton>RʱVc[l۸nbkůxN].ƃl5Q0󦔞7Skl 1d 05.?F͍274SpӳSR[ֶglbM_Rݾ6Qu|%TN:x?{ȍr&,`)&NB>c *?l:PH{E봜h*@%ـV':"m=ի9\Ձ:GWG"Iu"C=>WJ3]dn6uWE㳗mܤgd)P\Gg8rP腿Wuh:j/P]!H"@X픭dy28;||>h_hϩ>Z\0E^g9Ny!RS J/[񙕷luoW2w,y1uW7_KwFj^G:GL3?Skoll?7;d՚/?{=?ɟC=\T 6)ki<ڱ*KTTLN ö|CS,z.Jw%p 5*5m_uW=^HMLLO^e/8[~t[e`Cl(:TSMO= T @pذC]E9.pL!򻺔OIV@[AQD.sUVgxO! \NF(&PFPY+[-zTo̧|m#Ԧ0p:` Ե3)4\ OF*fP{@4O-Z%^77t CkVM2 d:E "q$.o}}||<0]e6t]qjfHiG&ˏnV0=i(uS=ǽ[S9Im;zꊥ,Z,\;ovԗ}Fw7cL|寣Քb?3~񻳦3ϑOJg5#0 kzԈeZu@ͼwRllw=N+_4w+ʖrڮ^rt˶\3$]Jfke*Nc8s}CFe3]Il- ԑ  KKs=T/TdY|h+/(jKE PH:r[jo$Pq|ޥ ЖS=9~tM}||.,;{l9Os9cyr_~j(~@ F.Z;")u<wVe:Peӑ}[*@+S1~YPioq)U\~ew|.<\9KMdLSg'Աɒdlb?MmYsu*~xtClh|0)w}5SL<zG?ϺcMqf>q#GjJi5]7 DꯪiΉ2m龼-=6vm۴ ~fy܃MϽӒc@YYʱ*y~)g X)+pqYCHeT{ Jܕ O.Tl3?$JC1{T_֒Hu<~* z;/ JCЙz:`2*Y_efo3v@mUO %J-P`}.G* &CT&"Pv 5j-,V!P}ȇ< T5Qcץ/c(2&\}|l̘?㧅ⲊMeL`|.zy[j9ȑ&1^H,Kpf޹^[wMTo;znt5vmiᾓ94ys2[5uƔojRkM٥fpɸ7k+kNds?Skv7C0 MZZU|o;OǽލrXay&yWCB ޶}%umpuSujWh+ETuC9L")&}(Zuuc9d..K %c=홝y$@.;*)ZJȉuY "? u&>خ&AC@;k>:^5HPy9짛V U㳧b옱ke^_mYjZr$R.(])G&RPxgX j}Ά^}$  \b=Kt  3cYR `}||T_&Jh--f KY$13FHo9"UZD]>'\[HP6%Y3ɘL&y2D.-jbwݝrSIa=[oI%>2һUΨ:\DxUM_"-S<-Cw{pppXH9dAEߵ<٣RI"NiTSӢJ} ӭ\ чԗ7-t9VC(iC~~xy;*) R !(pzEVg5*TzAؤċ.||||1vwm6b:)5"[! ިA }T5B_U+/ lBT5DkoW@Q@=Fъ7XFTR~ge@j?n9+rNHޫZ{吪-s_L|9cI} :sK-i,IHS>3UW1٦םchV̆џYfcL)Oܶ?oj6g]ZvD.LMI5f Od-z{KxT^&_>~׫x~*V*^ԉN3>Աto{W^?װ"OU~H$Ǹ۝YӭYJC V1"zY5fрyUg"=헩h& 8?EWonq.d?)-<.TxgyyySaOSܡN cӫSg9+N<=4}cj3'k%yY.g)ЁVk~87#oۮ5%Zw mRsbwUդ&O7`Jß=A߰@ 0?M:;P{}tHpU;j{ޥrw|T*1AruVf3RlfC.9@b@@>>{:v&_J)ag՞P?ӏƠnSr[pα.UC΢5j%F#ST[}I=W9%`5VYq%w8yL2aS[Y??)T&jvs HzVVOܡ:E's~X7U :W=EҪ VBxXq0eA \u".("ǟci,J\ \a.do"i"]'x^7ٽ4ڽ=Й8y9Yھ._u[C47t;b4 (jvwL4v Nc53XS2 2C_XY+9K~ ^|T7]v(l+Yg7y3<ŧ9t* j-3%\i3||2FƓBP]JA>c)zĀ!¾ȵ.B}PGj۬ s?sy IE!37C;SqmJl"o&;@iHȰL!%*L@q5TO@AWPȩdmP!T7r!Q˾vf"\W V=٨eg/4LostM?*y'TqK`i;˽r;Z=#z'_ &RbJrk2t*:_kmVN/uuӇ:v9;[/+7yXx# U@N*St5UMsWЄCLC ~)Q\8 ɋ8$FPU: PtR@SAjEAb\xF@fJEܾԥ;@f' HvvSS9czdV9:XՓ\΃|L8`m ])sq*a~1~Y9bDɔw)dP-yIտxyeʅ.vWrnWu&R2},='][9s2eRMOw3bzԔ@g5jZMS|:Nf=n2gi d2(ק}lv3cLup4z:n]&%MI~~Z6NG> kz.U_XJ>>^] '\PmP\U`=Zʉ,Ѝp bWFHMusPP~a%9JNU@p˕kJ)7xY}D-` &B}ӭ:Q?XOcZcX@PS P.%TAI @tQ0~G"#P-Vw2N}GBB`z+kjla.p2],d'BPeyG +gS{O.yKiw|3ƾ>(P3񎩯Su7%KM亍X\Ӯ>٨6MLJI7zVqJLuծ*&+ZM?>& 2Ldd`zAMm `zkj.ʴlggTTUi%US'$ğJNߝ>kAOwޑ^C9KNSYbz3K.P4jQ:@a2s'`s0vJӡJ5HFQNfiA`jA7/ȵhw|t5YhmzVPX;2Z9Q!$% U?P88h Db΅uj8?*mvbbbbk+/' Mj#FVXBl6Amh(:7u4DR_ڟnd6f,dxLwOd-{|-㇅P:@CK0Ys'K;O:^UǷ9J'Q7-yͲ:ɞى*UUOyU QN}8Nk'ݳ"_~|V4,5~(0g̀5j slnV0dL:%yf>b z}AW^RqnDʂV-'d兩ƩSGuq;.jyUʹ҃.59b{ Gy:DL&Ϟϋ3\OT#oPL`)ڪR:BGz  WAݍ#ס~X/kԝj-D!9\[CtHf5 0X/u:JeV|:L[W?ءRm)ԃB9qjRPH'k;.:?;Zun*D U1 #NL;^_@ס/M&?X~I2;^ $WZps`U[)1:?qc٘x^孕W-](^y=vP.g;I2"j\?f#lj?̾F'0c {n:uB3]8xȴG٧pUв&eKn(y6NAAᓅ ]Ǻž.%yoBx\.9$c|$;JwJ?)lpqp THG=?֗I:9A 5$ڦI555oXc6PȹޭP0%тSiOZC29s V^~IϞ-UImR 6 U_8JlP#}}jD^Nh=zOI=,P_%!ͩc.@g_q5_M޹q?fZXK^ |ޡ>ry3B(^zB{sUm#z j^ G>W[!@mٍ_zFLMo8Z[Z߫gY r&&P"G^"| t׋~C}| N3mnJou,+! _Ē`PЏs O+7oeUN/]Jrx*-2Ԏ1[?lblWwpq9(A4&ٳeaq+E84ž`QUOVzp&AݩcШG?VPqw xӼZftLY_mKsfaFeϟ8!&Җ%ܑYJ%Raǂ).(%>{*ITB;Ie 3Dd%D@j_dM^ڤz@ݫX@!়ޕ) Q. ]ʦnu= 8RY/_EfBۡ3AYS ::b?`MZq^6hvoR4 7lX!9;TAhT] j;H1QrAP/AURqlcͿ@}|t,,, „wflfD({bf.T'.Uaa>8~tEUwV^iІ7_?`dz}˶^]][yrv޴Wˉ s}UZh5gG՛Y_=/g=r?&`vMjl&&# [aVdgh)VdKXtq~~fy߬m*e.\;>l¡*]~hK˶ko޻qdhi.O'd9ў{ X-ҤH1Q@XQd'ZY2HoƓ#T\<,Qu9J5j~C9V%4=>@hIQ uC3ݐ:NPՙAj5zǿTMJr4cecG]1v؝fu%unN":B(j`ڡCPwB tƿ.*ёU}&V+oc? =$H$vkZg!1PwIb<3cʳ s-'J*L^Z IޏU/^uXZ/8Q5+XzSl8m5뜋K1qGܛ>tpWc|SoV]/foY3nV&~Ɠ4| &%dG~jzԤ^q7;:p`f֑Zr7ʝ_]ݹYtyZǟ{gLXy^Ʋ+Qtanm(;9x=i&JJ/r\n+f $ICCNfJ>>{:f\Rj:{NGZaajU#At`,ރD mMށ9u" :z ?`u/BUDn V ՉSH` vmjk^8~#k]6W.6Xԡ ՗ 2!P*Pu.%h+Z WԲAOcZ@pjcXGj%Tr| "2nǜڌL>>{ ƯVLkI/wr kߥ@Ңxȣ޳I!^˯*(ab?W]e*IN[taGw~>}u-= W:w{VW3'#WOzӴOLq3{x/j2~[ݵW)jRfaCs#gd /D tÃE)Rf)Rp+׺CuӛӁÉ !Ӣ2ǛuwCFޣַeXckPzq>>;svbY&Sɨ:P_վP}8"mъ@55zum>zBu$kKZݡhyO}#CU)^XhŃ!Nh9S #opFa@\oPd|3-ӭ&C/^5;sl_I07Livu>I7mZۢ&¢:cAyT8% gw''&rNkb* msNp/*GSíHP/2<4CU\UF#j@>>>{&d;)<|G9bfꪞf `~R#A!T̺/ڧP?b-r^P5- jʂ W:c\ K8ޑ˗kUoP@}mM^~Rx|un"jDKYy r Q%P?r(Կ9gZ :tFBcYˡ#P|iRkh2xcXO d0)gW[3nW@%N)#=A-$X z/Nw۸Jֹ뜶A%=mMͩGRS*HDrR{\ SYVc]oRcChn}l:窱Y6HI)2x3Jf,). UKGxi쥜19-78YzM5Jx!(Z*O \2bowhmUr޶jUJ[{+'2'ep&25*A2]*M=$s/YIXʳ؆ 7PgV FqbuΏ-΍,BƱe:I ;HdxXyW~C69,jH'U,evS@('k>>{>;iĉ3xםJBnܙry)q'_o?o,^!}iɞp2$9+y]Uȷs,zڔtzCZˠ7YDo״#5֦d֟jr c2VPMLʄ温Hn5D~E5ZfU_ā_[CbnO/ |뀼.Rj [8y)H5ImR@!Td/(L ̖bQJzjL@^ZU*|pKCW P'@]נr5r~vKxHn R׸ pxCU+/n U%ǃĀ2 v62r5;1Ej!J"SJYNXWtՐ[?tzjP ZWӜVy&z!7 S!6'XCu`V+UoXV7LU e@!dƀw}|>>{ ƲVR&PF I zN_(j6.4Um:vu4z2[pu0<9]Vp]Eh_u'fD( \ɟ rNfI2?b]U_}@`e"S=;𸜞M#yfKζnbZF!zw~u;X[fnT^NxsdW.-m*=#GM}a&|H=%E2=uݨN)RuJnrI)%Ǖ.(XXPTc-]QrwN`J/}|*9ZkewSՔok5~!_m42D678@!1ctՏ+<^i h~RY9+z;q+ٸ!v}XC]؍y pbإ9T(M26yVӛ!A$_òY ?A?TϞs3:Yhƨ(0N>i`( A5Zj筗)?N!pGG+W#d>}Ү:҇HGT# orZmU dO>>{>!J@2mFXU:AD5 zec* SPk~Fu*[uU>4ꒃusUiVhl5##!62XF@C'~[M;ۦm]Qq/֟vLU w;nMHCݾ^}L7OoI7~gC/f1Jg1uucy_ǔ 6cLJ.XkQe%Ch$f"1&˜;kȀ׽KZ'G#"oe9?作aՐ4go/GzާgKgoL4k]qgVs*r~5kSaD$K!:֌ LVő`1x@Z/|TTKm4\Zf{}ç[gB7w #.`jAB>X$.ɧo?S].i̛l6'Yèj7ML[|*S"?7԰3?L|1Pp W9"[ԛDXԉP{ŜKɩy<3ZEVX!'|Smȋ R: sr4L#lg8acV._CW̗d,eRdL:z 6;[SZߏoʦWu ֭MNrզ7(;uy^cl2j2Ƴ8/ԪKk[_k?ƏclZFӏƑ77L֯ә5sM@I4%zѪL/e<&N+S_֪&y:?2/(|ra+uh:}mW*ܫ[e C,:y bHNKޗ8coЎt >>aı#0쨷.Ќ\b@>Ij*P7!x-C'IРwΣtpޑ| ;>*ۂoB_[O H[``/t=I.} 'o RG tBm=kzbCߧ_]zLmDH/@}:S TLuW!ejl^Zl+heM;'p47z;j݃)E F5VTp R GB&1e 0<$A@T88@,#gz0dқe̐)UWB.׻+Aq;iX}b_eʉ[scRl%%1=v ̐,#RwjMC.ZuwCVW?WohjhWeeZcDJξtE(#3L|&DMMF-f0I,5b^;[-^`Y-+:'OZ3zE\|u2gA*{ɯOE'F49n:OX.R4;2bTzV?<ӵ2&} d8Tu>S Q:0P)`tM:DH i$w'`Bߙ54UE7wUN.oT[;RWT?ԭTf8Se=m{V s5*gL cH}xӹKBE3dw7=@2?F^$ 722`&Hޢ5Vg 0RL{ t60 |do^zN~v7vk SذP@.ځY[Q}3:;G)`8r{T=U@J[VǃJܪgߖx}h+ n *6k@T.ҍ `M)[؝egBYwː7 x Ƌ2:Z Ϊ@sZ֬(4>$ yse3dERt!8h,f$C}ۦ{A}t~ӭ`мI7Kf!d٬ktkt| ~߸!~_ٚms&P`<i6ƛcO {GN5h@K;U²,MRʷԏmyU^N|@q^h %,Bmw,}+# ,7۴yt,r쐃>BK>['4,sڷ}߾:o;SN"h]su#|DZ|q A2:] uyz*Ml;uBu7>݃vRejR=i:t=POkr@=z_ !uɬF{mOXA>;9l}fSk-h-=!t}| G@zE6 )! j!d׿/I2f NOnw{#Bלr 70TBі:BV꼳h26wXԺCH[" S&|[- F@S3Nv_宴gB@(k* fMa'XkpAHYCeؽN9[8|@_Xx'T􍿪Rbr z=ftQyL"ݩ&KՉ!x5n\<\9%:1D*ˉlo>_7&j6+8gOnt6S)M[>]°^WhtF@Wͳ57MQsz7%1["S/yH{fX ^_l(1ߨϙ7__YsZ5-j.kW׼fV2opZ{3gۏm?;=n Fr4(>mh$#.--߬wK_w#k]SB_nEF~qA]$X,`ugFy}wr6[X3jaon=/ui~'yJ@xBHMd]-.[X e cb /P2.]  <k luS_2hO\OmvN*ZD_ɬ:NGw`JlV¯17:4|fmͷׯoJ.ltѱ ^^Kt @C]im)>LMhM ׬ Dz]esJ9J߻hUΫ6sw}h@^ps踌37s>Un232:?~5=8NXPpO)q깗QbrYbs66>R> Ãg L qFaNJ>WH)k<節`}*i VTssrOb,Će}c3U_f"- .EaB< @lPG1 xHVJP_Zr]JS݄5Wmq-|=a~t*OݵtzYcY+ t{FC {<'|V^2hfZ@P*Vdiz wTA `.Tp6Ѝh @* :%˯S6R@1>XmV[-j 8xX{M\کJ[x 'C)Krnci9poQ oL4͹>܃"LWAg0&\)\LXar8^m*oB;d,c7>kz6u$ҞsuZ9V _@݃ _dm+(op=T 뉢@}8Y Ǯ;S. lσ,Z$, |R|L)RԝɞsߨOܚ8V+F{W?ZvWq(º֪桚#sڎJ*hLԬSlͦ\+0t@uiݘ7:RSnFך{?lI Tc~`RM? جԛ/t[Ǎ7˻z~f0&G6P7ծSmWW͜nX;y2~YO=~rB)~p9+{Y;׭n.yON2M"0I&|V?r!WlUJ8N5Tfؘcc f`VMJgt&h6%FYsC=ktѽF Hj6֬t[1=C+^3} \ è]#ucQ0[!9+k/o~->3l ʹ2LJ;$U)WcwR(MhJ39hM b9S#]T=xgT'Rďhs`Y!IS , p%VG +.xZ4>g9I[?6S4/;*ގ֨ʍ>IW@dHfR"u 8J @tAV}ujҵ^pkNLi̙wtۿ4/ۧu t|&Rb@m7눎ҩ75-__ZNQ'y&f=B+_}Iu-tv|~.V0UB^eh[1.GuGL_dEƫO>iJs%lg;Rf<zTuK2WOA@4*'WCAw>o{`JSRqq9DLUj98}blSP zgHq{86ǵN7=!g;?vBlߢ]%=^hUu5NM "W(?Obki [\hOкњ4:RQnOj^٘ ?_dllXI d 3nf7a14d/UuW[U*vެ@Ϫl2z ښk7Jolw|U6n:;JUo9ȑ!Қғ1bd4Ç?!BT?]/7 ~o}ݎN]Δ sik2 @P-ʹ߅ y,"ȫ APcx`-PkfaSVљFwj&FkRK{0;H1@^ay?] f ̎0Uu(} 4PS7;{>YtQAy_(՟E-}V7WNlS@d*ӸsZV)ar=M f;Hd-~`?l,l pP?/ß n:a>47:c _PKr䃼`l %M@y,׫o}4ț^d uA*x[.`G9 .sA`Ʉ[R6iٽj^fAmD?d#\~`Kj˜*cRm/{V; Pyga`\UcGH~d?T}7[Y b-@g* ֳ2 sL̖!O [2r-(&mX^Rh;#,CYh/cA# ;B@+{9W|EpbJZ 4&$ vwv35ўe666I*UG0IH9,cZV')\JD]FD8Ӝ_N<:~E N]+J,?w3e*^-{K/!*bd d_ffw3tj@o\67zLltѥFjt93+:rtPuG\?ϴ DLccL*qe4f &?L|*-Wz;y˛Zl%vdpphPFUu})pPqY+/ 4"㨌[b6cx'mL (8,'J. F1ًl ^K$u#mZP@V:B:C@R%D /e"OEX,1`XiezGE@Z7BA5Ndo ^)B/V΀ь (-(,(}%<\Bp{;؏EF}TX] JJ GRw'%AFYh_vnl;qax@@y*6śR(Rfr8`d}dr/dK<,Mnh͆2;ZɧZ@_2FCȫPxyh ?.?B^IJH*Zkw9 IpAmTϰ4ΧJVjpJ"( o4Ht[btI(Qf5K-"e˾rO)Du~W_hf(093ڦHٴ;IsoͳZv/k6:Owg )(:ĸ<+yܤwPö  _s:@󑊂en+W|b|;֍v 7%ٷ-L.ܫ۸sz挫vܧ&9e*d::By'3ʏt{ј8f4'PWňadص"g6oK- @6lPJ{*K\:Q :̴3y r̆pR_19r;lp kUg?L@s:P_Yj Xٜ|,j$ ܃Hw:?y[`;'!'<3}zobW2@Col m.6৽c} @@>Дr2@kN V;^,Py낟xSƅ2h51Xlhme/FC?A2f(,td@Jv,@~E_;A>.Dݮ 0 d?/QkUb$NٍKI6瑆O{ U ! JR cn3~V=YPǫ#b.P5vtάNW+FFW]_|Pѝ;'W訅˭Y7rFUMmmrӵW&mS3%i)2nZ)]`L6coj5q7KN5ϡY&-ԳnR͊9zffk6of 1.{j6:c@=_}kUY}}TٺVdiav_>b>uߴIi(MZCQ{]P|dɃ<88>79zH xTzI<{7,>I|Vj`#H2 ! ֹ2(Yk/ }{׊ZΪݾUn=Ǚ`_`)M`Lȴ})PtbYfN 3| N|pR}ց*SwR`,_R lfolrlJ28ˀݓ@Ngcӏ~OqC¡#`zr, mi /2N`'t{G]fM$gZ@'=*~AAY۬Ӭh=4ChsUη(hzuv4:Dy% kA2^}(u2EͨS}e}}ne&OtMnbo.?R)Jgc2jPz3缠f]X5Pgj63Ӻ?Rv/SQO9zl@z]ϛhL!3M̊NMbCOUsf8EfOx&:~<9Uٮj[AT+u"|X tױ:pߔ쭭k8|Y?]1f u5voyjF-142:J* W5ȭ/z}#3 fYoJ>d3* ΀$M.xg]`-f32XGB32fBȽ-p%Rc}{HXWc`(-Hp)ϱ$IpZPKT1Iv b68<4I_yH9 ASB PqjtJ^n`'YW2<Ѣ|dx=«o,S/z(_yqQiq}rЄ)e&?eL&j+Ju5Lo=ޔWf!=1ntiot(40v]S0n&b.=C:3g{XGv 1&{팋z{Pl< k_ת̚#Oo}#&Cs BgӭcG sp//9Cv' _1шF645m@rj,ͺ~k^ ~kMjT~JA d0C|@{AQ.ka9[UM (\./C11;cynw8.Z.hܽ* ,]nVn{p{9ͫ%u75ڍh@y**Bv:槽R62``λo=O*mi߆T懚L9#^}\dj3?S;A.sُߒz/[7Cr.ĂwmPx}ue(h:X`l˂r ^i$F9.C2;"]I!kJ0 ~;p@%w_}@},Zd7I^Q!s;&8's H-PO.Q38#]bS`5H=h}oIi37Jgy"!S1rhBK d89 kl([NDOJG(<2tMgmg Cɩ/Y@'Z.4i9&@}5ՐU_!c!t};}9'HG e0І5=XB9p1qDYN X׽fDZ{%4M9EB,`ίVi퇄 h:/KnL]i&`<La)9Jh7z\wltaAĈSqm(:h^Ԇs:z ڲiֲ<|ģ֬\S_=j|jW֜|6ԥ̱sB퇭gv림*iY`ٞ\C#z2 p*0 btƏҗjzR92>}Gw FrZY!i]C竏fT|*dO5 8]$H.H,v>nPyScYn:-vfր{rP0V;+zĴ# H]EAC9!k0ҁcڋkP^LҐ Y-I6rOm׉(e,M:%`-F~ Xm,W r ,yl%f7 apQY _FDžf h#sUgg M_|Z MVdtf̶ Y9AmaX\2TRٛ p`I%Au%)!}ݤkuO,]=x/L 苔0ғELQ\5Oj!P+#9 U{>]E/WŲ6sjީffUY0n }&0wUMcZђ{)c;;G<3zt04ͽ5ҏ~m6֝Fn\Yřv}f7Ctd&&PT:#@L]=o7 `ЙMu;um*2cxjvKJu)(mt\㗪_}[[ed֞+}|-Upo^*^H,.Vצ!J5DH%$@?,tfCڃ'0r(.JrS&y2TIGv~" ?!A4,|S ]"9SšR-b926q߂셁e?<]Cmdi/S[~mLAx\r"u D/N rP!cst!Y>nĽ )+!_;uwЩu&A3YAs']:Ns }mɿfiXBgq Ð@w71lXصwgIIؤh^%1+סr}U-Տ5b;5oNش+)[u>/rP,wqXs &ֱ7rN\ sLvs|M}'$!W` ܶ> vFwNc(.ĺ Gޕ`K`FY}!s4kA%ɝj')l P؏gWԟ^ʣ+3<\v{!n=󊭯ꩦآVU-[)Qrgq3AR^3ԥ1UXU]²7WTRN;{ˇXsD3ێ2a7UvMٔeMFy#ͺ˛сh^ǔq/i6:/W tJCقI;*MIMzl<^{_mcd)^Ufe{ޫZ8=8)qO(uNKV#m}{L.̥Y+ݳkFZQ :AuTe!rMOFr\!2R7 $URuW /YaRܛZgDmVi'9bRjx9.NSAgj.[XW˗[KMLPs߇r?MRwCb[ ~ >KPuDlz *nPoBCܯ5jT~MU|?|[5S^kK*w|JPϹm;Z/N0uhVWzNlVM?ٮpW19t3M Ԑ'K ^O50\sJzNjeCX;Edu@0aW!sdAΡdV,x]T*Koȿ?xNBz򲂷HWz@5*}\ !øo[ʵ`njw:P4 j;q & 6U\ZjD< ͟_d2 Il@E,b>K|sꔨU3"ڪQǻ9a5'VfG/ (߯բU;{KU+ڶci&k{B&UgWsI_:h=Kw}^WF7=wnuWM*gRltљFwj^?_6k>ϻ"@C5ۀMjihJya\&^癶FbghzCjZr:yM7>\fd=ڷr)سc#k9*c+36+#ʕ lX7Yp#7 8yבd hA>PO-5@?aՉrIZ(P˵W4;Je0w@X*m&q`]jh"*C#O:'w qeT{4,V 9pk=?_}Y?܏ ʁcmU9dnJ&~ʡnFE Tߺ7 U;AչWu~FQ j WQ J=L nTWTT@ûT:uz*hfPd>  j;K-0ԃvwEEA}vPFXl{u:?<- ۑ &8AVᴗTiǞ@eoK9,[@ !dGDZ|( ʩ䃬e \EcIȋ4ه%$WELN Ёow=!:dB^[LC9 Zn#pEh5 .='á-^zX!mH)X2>as p(4!lه37S\B;H卤2P.0^| %]~$0d MyJ%@ؠe{/r#7$PG}̯u/q>^rir6^?/~OqO-U%[شk~7h]m{۲wL^^?Zu^E ʘ}ٔfW>=>by:i6A@SCFw_5{mMg+E#zޔhs@iWt7= JȈnqdiJ/kԢb%_ݹI*gp@$uY=&/=QM}3ng{H_k(9B-[9ٲA6fkiK{:1t-l?Ujvm<mcWyE=S+r!<Ł5+ul'YOXqĀKݯC:+)/XX K+jdU{Cn]@wŮQ;ڸ_e@-!ցP2]%Q93y mN q\ެ>ZwO+zޅd}L}~a:fW(5 f{yV~ܛթgBPUL% Pw>D=jJz׿ 7& =}Oh t@:I6v5K=ݱnlӲ yT>hKbe'Fǖ?S۾fmuڢmWn^,i! )oORKz%^ljy7i.o)MS53@0|f#3O_5а-I0GqupDjYQw|p"ʎ/vDAUJeu/7o 꺣2:>25[#òJCeD[AOzJu@Lo$uǺDkP- Lh2 %`MT#!Ur v{tu DNT{td<:Zi ]rڃ]&)૱f3R:ojʉj5 z !u,%_h?!B X΁iBnzھ^.wAClB|Erd<Xk%k co: `_̇}dd,e,Ȭ/Ȝ{H>}o˛qP|52m#҃_@6҉d">$J @5X4f6ӿ>xl<+`tB/@k؛%X ~Ous+ 'NW|qNScw jfM?Y{wd@x hiLMyZw+Фj64f6~:C7 X׊0W?_Mm:0D HAz<*&!̘tI>~WseWjB1+v4&Wr=8 Yd yGrER+}! [d$ފ g. ƥ.ϵ*&̕l| (6uNЄX /R L)?=U r uK}{Q '|m{%$wWBVWC8=ؙ~j0DCa'yjvb/%Q6&"HLP!mr Ojr2OV V9u?׹Q "0󶚨< N?O}RmU߁6o}T+x1uۢ-R;7@y2`"u)s9 u /'ϪO\O69^ɳ|FV 8Ύcַ^}e2dPA| A&mY?&} {Y[~&H |H6e-.U[=}d:[p /V_OJ._/k々r:u~A+),rH LQKcb'O M@D1.SEV2-]yÿ ::? (PST~F:n]hgmىsm#S#m^Q}5_]5ҭbEE#ԾT[S{Ys_>td:M 2~O5%ubZ&Oi6ƌд7:/WpW ˣ1_0Ɍu xfcaV)zDzLWzL{Ś4A|+|"hlihOT\Xz_/d7Z% oFHˍ b{n=k (YKzEUgCUbNUCPgo7Htg0ݳlpV8Ur\V:B}vPiW$g%{H쳥w>*'>r}R 122ǘ mѐxW6CX( ,AY]:@v

/()̱2>lwo;!N"!t~z𣗟cs\,ȋJjC\]]ܼneUK%0)z;ٽZہTQVe0>/_@o:<7]/褪}[/ESB ݻw퓳_"H~ ؟MG"Tu:+gSaYfa`>\i,h<)wΨh}%]v8q*U4]Ϟ=-mzd"`z{[-Lwۓq,E1BieQBФXCc!` l'>|&#Lp40ƚ_0u}vkߧ~0Ӻ~?ܗl<~JqAa%@mUavo !5M綫tWȶ(Vu]sܾ-nA+BNZ~69fBn DvEYsj4a, Qţ;xw}@8tȱQ0)%6E?e `N`LAWa۪̎cseb`1ep$dY ׎B,ve8h~4Ic,el1MD{kQ IDAT,+fЁ}ǃfo%SnEE"ڞ[RбMas'ݕu UX'RK,˪ϟ[+z1|v1nB}Z52]̫}~~~2_eohe?{ +9^hBt|2{MSՔmƘ_/mດRXHƸmd}?L((veOӣX. Īo-;+zot?PQHd[ezȳMƣ$qݾ-"sw)&t<ʇ^~˲ Ef6NH)>\_믌Bg}A,w }X(QxLJl2M1eu燎ض;0ň0V]i@J.5I(7wmM FJizWwq2M7Un_/?]o:/)!N7ZD=N"0ݧ8{vp ü|zu}6IPJmVJ(Y_Pԕc ).B0m{Ji]VCzs]Źڞy޲.^A0toE9NɅFxu/w< cdB9|1{|trDI]׮mE SjT^Gyl==M=}zz:$0m.3@MRdY4H`:ac0-kyUǞq$e_9R}zIYv7`@ w!WJN(Aj說w|1)쇺n0ܲ|F<םN'zLgol_x{^-o)0pA20#,XRu3L[VзoF7(n:s+).Aϭn(<;B@9Riˢlbu/''ym}Uwe]gLF!󬲬y`l3aOtΪla ێ/%ֻMڂKaPDQp}' O'Tu[E׶ٔRemmxuJ:~}{P~ pG',>%X#mc˚[áupsyfA~8X b:rvmZ> #[n>(BErWiC9[ 3#^_Cz%5(p>E gƞ뺞4uUrו[?_xd%:™04b2K o]OEs|xz&iVV]>Fw7B㴨o,M 0xry.buU:6/q{g #Т^A9הywoC8/~nYftM:eLM뾟N'~gsכ?h M?|/_6x2A2&n]ū^uyU]Nע_D4s΅Q-QZ68/ʶn68CTZfY}Bi k#FcC,"nד鴭2Oژ}YH~`uwU5&][s۷wZ]},P~YVh aJKV830ˢl;훴(d Qq BGZOcJ]B4x88I4AM1}rlfwenjf?0󟜝M0шrzzz4Ǜvm4JWMőX}kP~d @=>o:g5u;?8"hm֫GqIMU7xUoۚRtn p8g.rݦگmA8Omno f9(s+Wo,_<;+W~9wmnq vvYsssg(\]WdPV|4)!cQ%4WiS4O?; Ʊi9޼??8JwONZmdS0@srrel~ ]S4ݧ.yVYYfTBEx2Ƙ~}sN=.wZYb͋S&q"MgB Jq8RU {n*#K?J'duCRИ R.&8nBHP[ 0ʸ>OFw۪$|sDW12vZPߧZ+׮Q,'*D>kbaH(=ivrzzzzZuӶ,{zǑyBoyYU؜gYZlc\yQRA 4v)fofm;N!|p|gYgA8l eu a8O?]oVQWH?aQ1,n ` mٔۛ[Wh;q`bX.ﳶJh^Ԡ 9$ 2^@1He2l+㳺*O>c/Jjp3Ht:i:a/8Bo^ lmNw]/?\2UEhѦnWj`,kU;c;b$nvl:Oa8FyƙcSw4 sQ`- Wuw}WW%chi>/d:'Jwe~nlk2MBNhH ٙMŎ#e-f bϏny۴-*8dkjY{ M&u7\^/_x%}IϋAA[.mm,7w/?9:f۷b~ܶm@²nniMmߟFަ/pN/i}C5&ߕ!1!dbqzy|lrB@/5a}IGq+ułs^j)J!v# ^~ W'Ћrk8S^o o޾'Ta;6Ѹk[ Ƕ%r{pXl (,vFNcqΥFż][ő;BH^Anv 3PfG(N(' Q,q*F`ױ-A꫻5s,]<eBHiQausK|4]zxcL0*z4 (!]S{#>;'u[qxpafyy6ZcO__][#=?9l6$:89>/:۬^* i/?9;8t6Q²C4 x4lKv]mS1F ]C=gqcٱY?f6cYq m'c[ŮHw|T7c TѤl+EGlmhϹMrOp}y]-?:Qw”_fug(J9A  % '6eVzh4-Aof>PɚU/@ϩqϷ[Tr[EÅMH`A.P6a]\ BTEUٓ3cRz2RLqϦSen{ٻA Sы~>G_|z9҆Z8+wo.y]^\0 NeN>b~}8[" ux=yhF Feyש4Whm[#DDSKD֏.ʪ||4 Q瓳#x_*-KǶ J׌Ѽ(fh([8/cn6s>el6@Ȯެ֮J EmۜZt:F_~9HI)ڶLMYRM'(&$IT]}1l4uaٗUUS+(N Ư_ƨF{\L80av֮ˏOk̠t2a]ijqfq+IbFy(956e{yj@k,VZ0QlqޢiAJ﫦k[1&he=? d6ov;#eܲokϵ]',#/'nܝ7wڛ×g8N}9LJ{۶<Ten(~2N`P]WQCgl+{q~~^7c6y쇄*|5R^`$F*ݍa_>{rëȡaCW\^>q| 4nsmÇU'>Yo@\)"Z Ir25 8CGapUUvmNBo:Jcf >O붡t,lϏN/=Rhl"0;v\`4¦05Jjl:~xُB?hR)]ײ,ꇇU_˗~~UefW8^9m3(] hڮp0AR Fx:]wBTRx0w*mm߂ٴ8~<쩃㐺 z0edP6}eeS0LKݽ]i0' ( ȶ^5ޖC'Z!6{ az=H3` ،iS$ Aʡ~%﾿Ͷxݐٳz3_kDWiKA:cu3F*Œ['qm|f<e;}'|ZT.OcضO Da/Dw}&MA$MRTjvmy?>:$v|enYU$aYQD&IZx^H<˳/^!)^Mӥ ( CQcVRyQsBf|z}7DQ4i;%h2~6I8s:!|@fid٥kT{} :%_~c:?/7ynVlƗ3t8HςQ{~yYQt9+Fj}'18VMUnX`Tfx]n L2#D fJRb3SWR&~Y7R*r{8+ˊs$VeQjwA(AJ?8zyvp~zS>b<~}`/~cP>A(\oK[]oea uvSK fmQgi7FNGRhVV9p:QJ?{?;?OiQnؠ@EƁVk.NWDwBI1e;$I߯7t4U5" CDNN\Fyeq6݇ Awb~PkU4I&TR1F˲=KUHƑElkP&,cCbhʡw|lgQM?9d<|6ٮ7h߯v ^(CӇ.*Po~rro*QTϦJxAvb<wbz{}ͺǣmgc,1C+\ccN376Y ]Ee'eãzjnQ(Л&$bKGMfj0vwJx~rtjYVۅ^.ĵ|Z׵E36WZ+`W'NjY7O.ڶbt:gin|?`6w}g+E+Dp}qv7uHr6doh4M[miΦ~, N: CuofcBho~FayM̲NGͯvZSFA8z6 :`& IDATI9\̊f7xvǓwwg#Jݻ׋d:Ч 9} sV6V`04! Hk~#EWe.O hIn>PՕR&sNb}+d/Dp1>jOiq<ûkڮ?p~vpC~stq|ul~q~ۯ糳Zbvx2OaS4>~URHĀ!Jo@f @3#NOlt_@0B9 wM{ pR%ǖ>~w^l_m4xC*3TmONq/nn,cx6RHv1$\w.~r8} BqU4C[vy` 1lj4o*-` F S <ۦre>}Vӑ{w{U"qu7,f9a2HHtmU5LValdo&,dYfǧH"U󃛬:Ӷj٨k,(|r|g #`QWuu2JdoF(Ij:ͧAUԠ~#w"{]/[qoD˳6+ ]2 G/z=;Zm4 ` Xrѹ]IHFw`Ψgھ3VY_iC]dٲ(@H9te1j$P,Nhq~, jksֽ~\8eŋ#K*lw$nN;k4dȮmbˈ 3M=w*(ZH6g~{y'[ M[*#!TJD7qJttYP  !G@8ӏ FX9ecf;1pd0gCs/e6]`S!J)*$G~0d'i7R@@l |>hRP|Jo4=_Mru=ƀ3 #0$\ R- Qal;*sdWt %ķ77 `9`T2 ,Nz)0vPEO 0`uZrs s0kyE~Vl6;s2hwlk!uE5@0x(Pk 8~ZIWsϥ\I_]EiY7u8fVS*63/ XkWفvmpiCӴm+MǓRa=ȡ0v凇Brq\ xE"0b ՃȊ'q<_5g`Y*ǎ}z1y^6TOA,KwQmu]ģdC,ֆAdW/^<;:8q=c* Bׯo_<{ѵ}]Q;`68\m8h#7GccmY8 YG2W7 'ONǣe6̦ʧOapuKq4A6UwŪB,߾z9 zn.4eS][},I#X,"ߧt2L WWxtg.D'yﮫ>T$2dJЙ;.+Zu`q@q"kz-a1AY@R %*VCi0E@ 6eF0A4X4`A 0Fa11 %B%,$8w C=6z9[9 GqވQx9k K4vvv,Χ^8 $b>lV:qdm]["w(`JA0 Fߘ4l# q|( :FQ `&n~#T'A)@%IhMcRгrѽߔKm50R{وRV`10toa4Jf3|4.)_|vًo?|]Y6A!#)EQUՉ~W-0:IJm1 HC(#,2ȀATQq<ͬLuPW7 ZNkc0n+n_%q\]ו g,zx7i k룙;(mkZ^jbW^GFAj5(mA%`*- <O[JmHi;ȀBeM=۪+Ola yq[GdootE@ױ`b~׻WP@\ʾiP[\X򳫙ٯw]uΑO./MM&fZoGEqGzf}/?3]sfo߼/!a'D4u(wc.릖 6˒Mg?7x%}% Mc/ϭ`#t5YifQ'Jj=Rł-'>ϸB )@;@b 1D2`]@pHvM$ΐ(HDH: (͔¤dQ>@$,Ј|s w2{o a̴GrЕi=@tzחvaN'IZ`!@ lD(d%pt  RZGrQ0cc S }CDM @""?[9cSDĎ]TKLy Jf CDB`Ũ 6P s)b [Z@ƅF1d$z/7myM^cB(u<0kmhc,$B$ :ZAy<ٽZcMeRfGR$IUEѦ塅rӹ<2Y-ZƲ* !H0<׋X "A"D:֓>81d\qJɫm:1-s-&.x%%!]:P@Β47b6 > S~_f&:#Vwyt~:ˇ(İەys;pE/<*.y$\iAwBۮIrDUxD|i ޿{/>G6n1{n|۸Hb߰HWI2͏Wg/ÇJt9>p<9W~lN!>,uYYzqy)6J*n|izXD`:Θu?o?{,F nˏ?h8N2@,B= ^}4M2uBlŇںo>H11FFa<cϾy<noӤ?L޼}?9R06C0.q.Yo[m?zSB18: ȁ}& ;cM/GOFg"q[ScYHg &Y졨m7Ls q69.jO\|hU$ xz謉. Nٟa,5` K1Qo]Nl\eI"x(9`HtGfZ9OReɅHރ,)PA iR-EhZuE>tG]y9SL"BU bi9 b~t"5C |6rKt,PCH3.g_X@ R>yv9Ll5{nXq!ORʑ0??{Qe0ϒD)1RYOeΒYk|!$Zey@ dGr>i2m mtmmS4]L]DxebZ bxxSn^]RɴB$3֙P7]Q7>,uu.,]iWZjDgM/nnnFyQA?I~^N.w5RaOe*7Ey?5u˗_|[ں'z\,O,0ĺmHQw{T_d|\H]mjYo_߾iOdzyvw82{xtJ'PeIյ)i͇r{!D0׶rN1dj@0O"@p5!y/sXzl  8o j!;te6H1v"rb ` qF_jcHeaVl?̈5iq[Ag)ȆQw4Piz|r, "kŸj[ e}Prq~K%blCP8)r3c24J]ۺcAmb"BDp&Z{7!߼~=\]FM ϸu{yv\3չCL󴪪l6޼} N?IE#\=:=O3ӳjdba~v6do*N&Й>PԊ3\lz6]]'3@V7uaw4?Z 7F^<}"H%RI92(ڶ2m[DgLݔYp0H^12{fg2tm4\t|(lއ.F\g9 Y_ht4M8HR6/&g$Kl׵sa`83JU>fJŷ#rn}΢!,{ ye)ooiɨ.rLz6.ж=Iax Nm6 ΣHA;` lLBC_1d2ͤatmLRHFaY(!WoO',ò88(Z.ӫljմn~y⁀&(q9W'xRU`8L;4Z%nԗY?-6W?{Qgl?<ͳ:~_o6#Qo2̵#.׫i?891&Ř5tH0c+G,sr2_lu_\]evv2&o\m7k\sGP%^~Du_~MLHL  y'EZ`<v] yeYU"%i:Ki֋TjߴMw.8?BM  d @p7I>BdBb$s/(  Xwjja?v~"#%)R֘c#Ä91ĺ( [-vE"u@qqqo}RQކp ew9c)"Bt\ B7. })Zq !#Òp]Y5 ^{Z>QdA&RVA6u"bЉLZ@|rΟN~rquVd$JFs!G d D>ГP38g  IDAT9@!%ZcI%i ebû `'\͔ʙhxwzӤɱ,G~󜹶*w`*DlZp4~Q~PHdynYe3?=J ZcYB~R+9_vi-^-$חRJ:)E?MbC>MGgMnc|YVLzd8m$Tlnq{+B@] '`q?,d3hwH!U3m&)314[WVGk|z6B GskobSgy欗pOօ~/c M窺OCC@>E TK9 }(l*I'EY}u" Mo0ɳ.ED͸ ~us.(E/<~붪]ΦIRw @,2lmU|\ XD'xge\)$pu'@!9k-`(yF0jhrEOP2be0p!W$Ҍ3B iE@Ѐ#y||2.MC RdDgC Y5 {,j%#'ɅB tƸno014;t`bwDoRFY51H$kG;]Z2 \ibqt\#Ѳ4\8K^{CeɉB \rq cNh{7NG3t JINk(D"gs>+}b-#+ˇo1Pm>P$Fg1HIdv2D6M Kn:)81dhLp("7"ʺ`)wB΅XJ~ !*)9"C] "qlñ1,cqƚEk]"YҜLD:nBK4@x07w4ϧrKz'5%4Y/K!F9fiX_U]Y4NWgV]vr2O߽_F}i9gOϹhJyljⱻ8ƿ~p/~6R֋vϾ~FBT1gy-/~qrqͫv:|zNf.N&tqɉ_}( UTMe.9򼫍mSئٕB*ɣ?BϞ|Ce]U~0Ng'rG <_/YX./^`*IX/zy<^k3)ɬ-iM,Zd\%v4\xv~q1;9sΗMKa_~]ː Ns뚲h\_fśE/ӘgQwM[PC˳Ӷn :z}LBBpHq*TmSZ|Eye ű8.kFJz*YBʥsG$ELNJaY:M J3t9Ȝq BH)ƭw;cA2(2Bh EH1 w1\pཌྷH0\Dr-c1h9ȹ]*`rǨ2DL~VԐfB+t6ͳ4 vȹj9PS 9[G%Z>mEDdRj@;S8eRvn Qpy:I!'D Or9x:ɡ,#tJtۚbWq@O /2:A tZ{΁;r>RsJI7գi/ނVyfu] !U slh[+z]@..Db\ h"Pԑ"cѹX0hB錋ib@)nw<ֶnDOLوfѱnIf'>x{:N&SxKr%h8ڶjMжm$&=Ň劢0]wr>k6n߼zAći* Vp& FY~ XVBcҶ==.wZhy>nJ(eZh-08ΠHRg>F1b1 1Ĉ~U2-X_ 9w"}!Jy)3Y+}Q*i}I%D$J4Gy@ѵWU9֙NL+ 63F[#=8_JN9~6ՈXTH ELS"J)Q0E1xc#c<2 OTZa! d,J#g!FB1q1Ǭ~<>zvγ\޶e7CyjʶiB 8GN<>6XfeCmu#H"!r\~geQ}|(%X!>BGc ޅ9d.k "8Se4F1F5IQ r1Y* hbRȽU&݇byK_\Bcdt< OO2/mv}7"S1xaESYI ~cJq͂`8hYr0(|_޹>lɌsٵIo(36~n}c /'Ǫ M"_} MUDDv 8pxLr:ƲD0,+o(13_E[77/OOT1opq4 )޽}L3 D^w6!tvh6ۏWO{^y8>zlU_{{84UBF!Rr<>,9cBɋ9v!|2MdĐN]W1Ɠb}r:PLDL1X\8;$WZZKΐ.mݘjN&d2 5ux RWLsƚ\0FI?a)"0F 4=rK($sD.qc  =@s^Dȑ3΄$g!2Ti_ϞF麺b\KXmg#cY7'nW)bs!8

\máϿ?l,b8 A ޮZsEȒ$?;>g}ݵ뢏 UvM$",SZg:991^>}4ִjhdfzx`$4p2%j˃Ï^<.8kNRʮm?u#M'l} !cWO$՛Ǐf'6M<ϋlLWO{ñV!H)~/NU]vM3ͺ>|H?q.aq]?M<>IbEw.!>?uׄŇB8 L3^K.֘O=aB5]S;=Ⱥ6u眉X{</=t$rm]oΧo*rC$>dC<=9rl76O~UoZvMHeA-"ze&ͩMZ8T.vg1"Pؔm*&:#*{t24``!R@esid6tGrsA$cB1HOM Bt!ӳb{(.E|,I`"g tEm_A&y2:UUnPOZHgA1j{o, &^?2'fMduW/()WM[Ψ@y]ϟ=w7`H Tx Ig Ӻb*f>7]OHTb,ySl>5"ň0ͮ<97?_?vwWTpmk ¹ !MԚxq69OP姓Ϟm%_|!YSWqY'!_w/!~/KUUuzz\<ت@ X!tr|=~vΦؔ:M9#`߾ٳf3Nt6X.n>?ȢAr}qYDY^|2DUU=}h 1C }ۻ*4q¸wnJL s0ˋnx0$U%Z͵o$/^rkPϕeYe KPjbaK(uCΤT SY\`wQ<ᮬ%%g<b&*>Fׁ]9>}Y`@@BTC3d1F O)m%ZY*@hsY 8'%cB$׵l,E?9 dg`q~C|@$ק Mtcluۢ۲0'wP?,O󜟜Laphlm!p m7Ǧ<四o,|,R9o-[AqO)2gyL01"D!2!p!1'vRrZYݯk:Wgٴ'~œdMЊ; ɉFOnZ{TIuoºI N:n{c8OgݦYwEUOʪvF) F5D'чg;~\F ,;޽blV.YzUeQȅhXԓQvpju:˭}oީGv .Lpae9v c4*`4IVkcMaTUe5@$]$R`RȠFf$MZ8Jn$!B>1J)A@b >0dxT($7:# C 1l-DL0b I5mg*"JAi@H>R℀$$, D@m"u~ ^]׳E9Hq>Ve3cDElRi(5 DDҤ1!qB,SY唦Dq!1Llc`%eBcti-N['6k饽ݤ! {eǤ-{ C`<4DC1n g.*%N P00 G@V1*Jz2$!F1l߇AW[#^ѧQUէgG'wno2H0a]ے`\"F* ֘;G2 )ףq9;_U=}7\lNr<[7&eivgwOF_β뫳O>zݴ,IT]lݻ_<>:j}3=}Gʈ5˫ӳWgE}}q*׏ vJ`WZ*D 0( $"'a 41ɻGU=N)qYdLROrŇwf`ol޹7;~$'O~ ǟ~zrωQν!\rч0Kι;"YY^@j\.gWry¿'{U]n^P5f3?1I]_\K,%?@ڙL|}ˋ޹Ǘ7WʳGVRf>i`o<^;"k ?yN}YrjԼ"om\ O[~(xuq3cf_LIeV+)tMp~/߹7%p˅{ܫޫ:˽>;;ݻ/,JJUJ_7O.Og:a ('חQORd>/!hqcɁoR!+*>yTFǮͪjIwÇͪQj?G/>7g |zpwwwg\C,nfbu }=w&򃇏Z~3j_|x~-zz3?{/s|\/ݝqh%%vзa8suL]R1zw7M; [6Aa4-R&7_ot lg1u XU)3nI!D-jiAX;kX쌉zyA07+f2R]4N=SΘ'mm?w!uEЉxvwg9xl ';F(r"dR@!u !ŎUQ% >%3L />?1Xʪ2N>خz޽@ܝ~L{ߩfuuy}>N&?K:RbSU˗/̘!/lU2TJic3[tu^dJ?G l3K򫯟~Œw騪Lx00ū4MiU|eӽٽw $+ l@z72l=M5Dx6 J*DAb%e@B91q Z X-/wRufBHC)%[Ν 100G ]⼏19Ǩu4 RJLVS00: TʋI1N~>ޫvCSՠ,3q"AQϿg4 3F6Ke{M cD'FVERc f Ax^,ad̕Qy/CVQihV#n^>tWjg:)BU&m6 +X~9vmL2Eq "δ1P(RRօ.E ޟU#N;v;WXvO?5Y;oˋ积/Ǐ>8{rhu_?}zq{.x? ]_X[/@Fƀ2wy9~lCN|^\]ӏUl6y{nhWMs7__DV9%PI0i=ΛzTGwlw H POf 0r5㓃iثe^ӗgW>§w}sݲmoMQWh<ɲ~% YQ&^P덤ֆ6G~;57WW:l"2&&)QEv$e8NbbվA<"#$4FiAՙVuQ&gTU ]G"UF$Yjīeimto @Hwf2)E֪kۧ7 ~?5u^(bcR@0(JotTThbTXS~]6m6)ji>z"b2EI@dK( V&110 FP 5ނl-ٷفo($h @BT lAP2B e%'#i65)\|ڒB]~0Z%Aˉ({E#De P)eR@fGa|sщO?1LI%J .uq'O.>Ξ/_tZ&G ARQ)mI$5@{LVbFwh"iz7;-6p2N뙦~i񳫠eJm'p KkNGyբ; >,ZDȪ^,~ѠH@ 1JEblTfhw_~I NiGci;1y>*vEWF/<_W҆}&WWe= >x>tM38two@xvq]EEպ, kL?.nh7ɴf>s%=QA)|߹wYFNr\ fɉ*ˮـ/o TY7ETp`VkCz^nUi?4p6wΜ;y wh2yq| t@mUi164vJ ޵$q)DnpGN'g9i@Q).Ġ5Y9Aaa_,ӊ'ɿu"#b&ZL"J  ߞ5 oK}P V4c7OO/՝Q() I) a$@ĉQn;⼽|Nv y5t~#|g:V_n߼ؼr8ޟ8n}YC.d7Dϝr,qjqyP_] IG *j3m0*쳳$ͳ|'?|(laNnx2kY UW*w1!鋫?|owg>\I|7F;GG.0Nң?픛uZ4( <YյE<_,aV^6O{'w~kozZ}GN|;>,3_1xf[n2w_ 0Jä@wz{1j˛Շ{ZԊzڪ]=z!Zy}1PwE"OVmSJLPUe5( 0 xvзm iŐ@h4z7^\,K)hu)(!QHUY#n(˫kflp%r=BH$(ǒ|Ob89 @s"Y0Aڠx[Y) ԣJDڦ:FI ^[oWYV;sr^]/ʢ4{13DmZ;eYM3?xtdlӇu+uY{O忸?rDbd@6μ7 & Q@H Q pt;IE= Q (!P(P:`zF z|3Gۀ*~x7{d}"UH.-o ɹl7߾g $[@,Ƅ:F"BBT b4ZF7!+ܾ@!*@'|^_?կ^o ZuFÒ*%)*og gݐ+SPw_/4Crl2>77m69xGbӿJ|b,~R""6]*QBu ǔCbb raS(GO^EY$aS]}?W*{`$-R #-1 +m?[nɃ~W÷J<G۝MHm׫ iDBZ$c ܾUBðh@H(BTJ@9"6"C$BB`8%vzپs홁$]%^jAog,AH o>6"ײ@>+İ>?oO_7__" pDCD1ĔRmO,Wȫq4f!@Q&ۈԇ{LfRVh~|3}iNv_nS7Mx 4@ Fส>:>_}]ŪL3rvϊ8.n?B@G`=;?'6hw:J96M;tsp?pzMVgUߝ9:wr?l<9Wb;IB ]?,몪w|~qyy|tt/ۗ(V|4N'kD.?lږ6MO?OƗ Jr99[HjLI-G_]bys3?{{}Sl8{؈VN!6-5@r]~24k74̜8qbDA8uY @ !AR/+UVe>^yݼϖCӬ{=ι7v# \n*3үN/ƶ"1?F|ѷ^g!) M軧mlCgγ>2)=~~{yu8.٤iq<<'dVTjcͺͦ/!e^PRYOo7<|7v当헟?]yQId|oʼz>;Gɹ_E*E~fM~p_hw|u}S(}?gkDy0uz1lɸ9]}vt}1ᴪ8ڴ_r^ [2]?l2 ܰF0&)d!@&DC K"2S S2!&"iEAm CʇMcR̚I]h??zuzy7fxeFJ;w֥&1]_\)Q~g|A2s,>&t~a |hdru{:3Vĕq4RThuF8]DhT>6um"N{6mI?FJ xl֫z4&q~; >`dLSɇw+DJ# &VNzM9}0ѠVZ+|!mkW D;9*BB пw#Qo$?ÛAت~$ AAH 4FQzW%R%.#@"A"= m"φ߽V>C|_tFv/uoG% !p #CXg/.yS! ^RLKI$1#2CZ7amkT) 3l6N >i10`Ϝi tΞ۵v> h THq\7ͪ%(C{EWE?߼ޓ~yvVf\*7A,qg2^]O;{YQLŋ;7~Tgphݥϟ>;pղsrWWyfٌ|X^{[nzw4Ev{G{LJyYonoИۛkcl:w}w].WO^F/n_H4-z\},YNE=gR||6VYM;ggƣ|;ә~^L6ฬ-G%HeF&3!Mf! "* tٹ(2A * Dk#"1L qgi]MwyplNmfep"mm9tS&3dfȁߴ=I>x}tt(Jeb\232ڈ.mdR+/ME,%q +2c:Q~\0ɣj _H~i1\w. % @Smgmw9`>=<ϕ[,rMfհ*Wppoj,oG`f<3BR|;u7O_x<J٨Sfr7k]`ceݓ7ˋK {{;Ӫί>ѣF_xaH{1vw:}WZ.|NE`~xr['#$Yjvxj{rnGw\nA`/Mh=ĀO/wO֛M?PglVe9rUיVݦo~\yfB\.8^ $oC0b46K1*Dx[`8ۏΡ}}t|R5]m&#(33Ъp gޭ74K.{lgVVV6=ݳlC D$H  z t7*Ȍwo󈌢g3;عofr;n MJ֐kͦԱJi4M"k1.<I,JZmR(@t;wMUW֚^j*ߠJUbd A5u(d痗-$X5[6~?]{xHdUPِDh H;@:5P;|i#wrikfaQ; hnKȭx`ǷBXFBZv2 8Dnyca`i;npeZdm¹ tSƾ>xww߮_iAHm  r7nFH Qk.?/ծ*R!F6I$8YCCZkgY4Z۳ͫ5o־Ӌ7/Њ`g8J񎾜- /D'(B}ô3Y,͋"r\x7Nt}Ÿw& &M'{}]gM^ի7u LcA16:u p }:gz @`6pٖ8<'w*mC[Cb5ngٗ/zO߹wt‹| ,ů_9~zMHEȃ3U6iϞ^3O69X{),J`4F2aw`"dVuΦ,˺|6s6;v\WE5>~~n5"_ypP0@JQ58ebKiRQKӺl.W4Mݞ5v\nR\m<cBu-RYUh6 b2QT4e'Ҋ~p.*STEmױ!(wӦx'lt g6z)"k:Yr(KVjicQ*"&p]5IE8;j.Lbk4@XV$/jdobyu 7a+4J@GqG=v9DIPxh-m+@A P  l{kٴ5@ l0Om -+Ţ\ [-3m K*yHTp7 N\߂[ lX5uϻsEXNRѭ t oޑ7U(Dnoo (oC =\[g@zv+("mH|gjvF6Ҧ(7imכl'X7u&8tif`l~W*m闥g*mQ .5 L,@nU^Hy@f~7xQ$۟1ڮ@6K}^?돺4W)y^9O^:M^//s#,KM^z%c#T|4m`\>L%c~<|ȬDKL꺩֫7ZG,2X\.adq&to..O櫓ي ʃh=UU;N4ݬ^UI^l,|̥ <>߹s&|>- ׬UkJ$EeqNIgeI(Y4VLٓW/9G1vI/?yӬduh|*Wuղ(8<_WI'=QT`'"EuPbR[FeY[{g<(Br ~>"yqrƝ9M"nzv6{o4Wn!iq2噍N'Ym!{{{ii6.7X׿AH:XogoΧwCmtΠk ypIo<ƣǁ`9_<}h0]\^fi(٤ {RtyyYB[$NuzL_~_3uҝ-7yo0I:|*<` '{Io =` poη?a[|[e]ԝ7ofrt(V8EY,V_|xg&6Z7!|~~_Ujt`r~1ET a !a/'TYGWuݼxFk=k*̗7Ho>)W~ujQ}@`;Q/A"js]@RZa\@TUӱAl(AjGWՕ7Z)N4"|>}?j|G7gY7޻swyt#/Y6ޮ_74G݇0erZmn\xK pƁR_"1Aoߜ~ß~3i?ĝӳƻWW/tOl7[~s-Gd$NoBރ50I&<\g<^d]NǫA`r- ŵF2hyצl =7wDb2l"x,*#p/04&6UdAs``4Q[kH%V٪3<~>/:~>3/ *ԑyS(2UQͳ{'t60஛wdali a_C;ږ[!2-҂F@DfDeFiHb Q"$ JEG!(RҞUM}: kEA?j*(ZF)FBmD17ZIEDu0U;/GOr낄m,k+Q@λI`ww|h3ArEf!lx,2P᫟dq o E6"Pwn(MUHZE\DT{)]hQ *b,Zm[V2eݜV.hҰU91&z횮Бb3G6 hP=ߦ@wU8LJ:v]^uys5[O_>{8MP|L0)ǽŽ~:A LX+^m+hGtX gI{|~ç &rq h]ZEufYYSȵ #F IDAT;I{uv>xMQx4(UQNbeȘ|j $6&p<kvpP{Va]Ŵ1Ǩő"B9rK,!r|HltfZ<_nmBezj? /M?Ňw퍄9uU&VLUQңwQ8ui7sWU)Qd0GIzc"bafѩmDbދH (+lCaVڔo0%/ ! Ս!y AE;t ~{ؖBucU tuZi Y$  V&Fժuz3eCo_mge"3o_m~uW _Qxk-8)oe}۽8gx;y !3+ O?hX!l|qE!<: //<m1Ɔ~?+vzCGlISGCn9+W,}4 *+"ky+˟؞gIj8QD 5TdjjXc¡R]uNchƃ?>E> X{\uݴϛ%7ի7ϋ;71huu:E"ufZ-*NGŀD"EB,k99`գ__NWww{{vA:η~& W? v4 J(RH pG'_F$@Yt̃ @uGSGk\F0K2q*/<і91FNJ-/7%<OЉRjW,$eժAr^^% ?NfEip0k®!4pYE?~3^ .h|4뤱Eҹ:#*fqAK&o_׎_/?Ŷq4Ox4OFq7я~}7O>}TT~oX_xyMiҩ}k#eݻD|Oכnj6I%UR kniAޙX`g@Hv$;{cw+A Ed {󊨝D!(]&Vٟ_VUwק5ZkJk_ )"r,+FM,g=bvnARIi:[V^\PtUV}Q!q{ 2v~ͽγÑEPIl:M{nh$\קo晵{Daw;4d<#j^.z#!p8RJŝ~Źbv#NƽݪbDTqgU.˲W[ mb72NP\E)R$>ibFքD(UhAݔN^֡ؒR|-5AGW4P@~wXj}cg˺n,6KJXm7@` 7$Rj5_FD$\pv"eg"Qj`U5u<o?Kl(d_{McȤX%m&~2|0fkBEͦ(K16JϲNZM;JiϢb'I-ڹGYƽN`FQ6(wQٴ8NPF,-c-QMDd+f\Z`5fF((4(BTPBmR9IXI|y].2榋&hhryD(/u1:ժuɟQ{^0.XCMȂ΁g~{.Bκ|gb;[ώnxiD(R^(SW~:N+9>d^_\ FC/ߜMpYU>K P A@@9 @D(,FXl֗Ff8 DDh*ck猵m@M^s `:xa WEI?IM3l޹MM]Wvr9N'Mѳ;6aړ8;uZ 꺪ˆHnRAVK"cL^ot~r2/tgm]wGO%J/,m ƍGG^hΗ1Mt"sRuX Kd?O6b1GؒQ?GI4l"3ޛTέy!U7?~K j偿O>{^i:@B؉i#ឡ#vE_x6 ARBJ" 2R0FF"ӦĴ6|aH="f[?!lfOj[^<   P+Fk &`agbpBl[h V݈p,(˵w x% v1 ?n!"kkRעۇ3 j@B VIǿǟ''TVMu E[5 cCWukL굫jy7"\W^iպ^7Έj_z9զQ ,_.WGl9[l6 D:MÛEz]ݣZMKtv0F)4qlOr7Zoý!N.:pw P^UVVȚEUS_\ѡW٬7,W;G|UVjXkЍ '' ~کW&_+a;82JnMYXWXԨU, V g1~?bźje^LW`o22:Z̗>84:rSEMneݮ(2*؈m4۬j\`WIURR[V*QT^Dk2/@kҞGQ4uq_PצZkwPŶ i ,{n֪̋9lw}x/il4cP5|?dze"cuz)4jř%":U]qx/"DEYoE'*D4_I "Y#k`t^5 #}'˂zBѠ"iJRybd$E@@D p!"T"O[ "QLSs+2Zqg6]n$ =[+#(lLһx`~:|]3; `7^&FFig2[o*.VJao)/.V9L'ge!M.fˁ [Ϲ cY&&yYYxTFqVR:ԍTՃ8:vzA4{q?>[7 ;e,n">|}u'e,@IgyYgcu^ۢz]7M]WFG痋6Ϋ[v{O_<ؖ?y6w}^^,7GaoTyO-΃&5&Omr d)#\.9rUqT{ŦnZs,qä  9"cJM'6"r:E5J5Q h;Фi."HnzLT0\e}j-dqƣ2Qcp8|5n7{o.~6wMDJ@ևƨAٲ+>:N/߬|7ߣD9kWkFw{>{uz~Ѱ*ˢ6KōhLzQǪGA_~qTIΓȚקUuezi؃e)A8NڻpcsHkl42"n`VIt60;$BxP`g!@ HzvUlƢc?G@Im 8D{C@",$"H!.}m!bD7<p`ӇA)c+(rDt@Z`!@R m@v9l ˫~Ǔa! 7*l pxgP;% $bfwlWFhVj@@Di MҦ6 2h$exk*moqW Pv^IaQF@"PbV!6Y.CF!8nb]Eq'IR؊MMSvhQ`4bnR< ʇRJ)ɋlq+4{$qɌ,O{dU՗z`E DzpVL!t`5K@<?ˢfN~zw=LR%%B^|u\9f.{=|Rx>-4ۍP]N:"2u= z  juK:-M=R|sHo+\nT ND<A@H)$*tUz^\֧_48 JrU~8H n! 9f{ l!J!?bPoOtCDK:.;i Vnlu] EڱC a.- 5B" Jq߉ʪ&Zmʲ/Uɰt==s3I"m^tzYq] ȵ~ykaEwh4],ow=}R7}g;ni_3cgM]4UQZ5yf'of3v)d`{Ѥkǝxu6Jjϊ(|źk0p1Z59ı>#!he~meokOQF[cցm`6FURkK "U iUz]eQoxlݏAo-Hb\$3-QK^Z}c/V/^6<@p٧Gvj]xbrYrئۓvNj5u%ţ{uQUtY.{w`:< z}+PTkNkU_lQͻnf*ڜ_hUDh}uuE@ {{ *U5սw H! <B"5 "~~F C|~:}hij prb `*B`A h0vwhHt@HD)F8pP1"Fr%!fPf5N7+ZE&]3Qy7s(NdDRօ?yٲԌ,(F$j]@P`g߹ZQ5[~yvěFjj@PvNiTx!jӕo+" V^,(¼PC{ NP(HJV&D4 .W7_gG_Ejݬ~qyWtWbjeKͦ(E" $A"EomNCR|IļۼRGF@Q2ߌz`*yh:d,Ez@_4e޳z)$K\g+⸪*}_/_E}wۭ7jij9_\>ff_o6OqTLw a{"HқFڪ IDAT<̋ÃY^9A(䂴CDId:^v>ԽW_Aܷ;iVx=+vվ7#?~B@ݛ_F@@{{9@`x#wW9GpޓAcro~ G%G8~gn_.磼T,7d9ƛP 'wE\:Zx>+_W% }R$Ѐr $c/˾Ӫd|a頷{0Y5ݿbuUSɷǙ\\$I^.#@i8+˻/ ž'󫻂A{o\Q9rqQ$":!f @ xDmd[wM]@hֺ{IŀhOC1whgG)Hڙ (/ 8R2b9;`8l)xrvXY:=>Nb( Bۦ&mӛYm]7am{<ꋧ82ˢ$FG]`y˘q^DY% yP<85Iprt'n]|yX/56, y7TҘ3Z:$QY=L-4x4zrbB}LE AKMC!TF@[cm0DBDY;@rȐWc!'DLrl/O3!pȘvpqXtˆO5 (v!y%5qgz4k=TRkOTaum?)dGM>_^-T|p & $I2F$\|mWyQz@d 뻾1 ~|Zr& َE䘀o|ZGDR; ܼW5Ď={X 2ړ=l2DF%|[_Fm߿ n/հo?~\^~D{#9o8 ~OA`,"j~|G X3TZ,PN1 !>#;@ K @ A/DP tP 0jģ|7fEeg(T'YtXvc`IvŬ%CDUͺ:.K7"̓pPRA=,BGs^^~GGyh@>{丮vۛ_>d9oMa0L%'kK8yv0N۶3I:9o3E|₇LTw 0P Zpt`Q2+fBl;nB)!Č P2Yc,QoQArxm=yt|qNȇnHʈ?A M ͺH2wEQ]õ͓8wշci)/~;oL'(+.OB5_Y,>nHq<avnhonv H*)yo6 ..7_j A `lsvnA>8F{p!hC$`?8fXI>m福yP띉#}FiX`ߘ$gywz:rAϪnG Nx/)vޥQ|X93ʻr2 ۶?9<ID\FJƁljMm_3b{,/rrO~g@inO'}tZ;Dl{r]Wuúm,Ѩl?7[mnfky˼vr2XXQ1Jl4,MFa$ġ20(F[!y8,8Q5cg4GRI cGQqtpPDYz2itVD?|[!wݓi>0i1WfL8vGq5wWb;4ά6C?rV[ZJdE>M&Lwmj9ą:>9c8QE—y0D(]o;`=8;點vۦiiowb'%yiQZ&u۶o'E_=}5*̣8G8XY:CmӃ 8z\ ' "9rŐq"fȣ5R BG/otön1QD!Hַ'y*+57vVʏL$i.ۮi&H3+Ʈ] HQn9{"G3,yXΆN8y'ExϊQ9`=o>rvh=3~"lΘx HEoj]1v!xtp\#ok Fwf6իo$Yg-wƦLifӶݪH~ ˫]}#!XE\؃0 $ I6MO,$ YgT<3HPwa8bbyE.Ӄ;$ Q*L!4͓_q^EZiqyze9 fX 0 dL7tC1M?zYo64ݮźHxͺM=RƌXŇ/Of1Pfǹ",T\t]/i%˄co-^.w͠<Û˦j Cq n8<,z֝ Bo,ϛ gGǂ dQr42$b0)''ѶnP8}8  3dVaf2B F@֚kR\ d.kq5+rƅr캖!2]SQ㺶6D&Z,|ׇA׽`v}8 D$ŜS:3]5bnrk:r^hT?8)FiIx6 `WWȥP曯/=zIzoF;3*3$snq7׃mvj?>,C.jebv19uc_ݮk@<i|r|Tđ|\N(IPwr[O zs֢~4T=yK'r{g#<ާѽK{7I}OɁ;r#{r~h!'{o׆?(p;"OHt{ FO;Lquuw+I4T"8f #ۜH !2uSߓY[ 45f@Bp چ? #z8 ~Tt(;EAypI 8$fj@ s4̷ұd4ޭwqe10kѽԭ[9-`Cl{W2L!v,DH~|tPWշɀy1FD̛Q!փ|:b[iȸu3z!ShlZNG4T̊$P{0KcIQDdybn1GiIyF.狛~ ɰ{@vglguFu֦mQM\ Yo~{oeӣo}*zwZ/&eo*0m4K`Ͼ7d@`pkܑ>dAν7K.䌴,je%YW_>Gښ,I˲V ͪ,r/~tR׵I$I< ~ܐeT]oEvs}#UuiQ^na(zt[mQ;`9@P 2V3kmˬ,59d2#A(Ct{! tT&졕5'1%8}!ZA@LJ;B!GdspP IG`Zw߉g2 |DB.ٗO8W9oW7]1~?yO8 nm˔<0ͭw~%m=0` !LoDa%9PM#V<9V4$ʨ.pzP:kX/67R|4CR2ѓ'xx(g?XҝnI!Y@LFd2zPp-8I#DN3Ī& gm!z}bXpvp<.AIL5M5_\Ũ5]UuOOMDQXރ%aDsi:g qlNnqŅۮմly|<+EhQqs!1=2|O'~ !IKcsW|d@R;6?Q{8r%*0z+Ziy܃%`dPKҶ~}s'H*:}߳ƚ.{W%wB;cpgY7'8H%C"g8I1y=k">ɳvUg, D^lfcU#yė?Q*fLF/nB$b_u juWw30"^Pp*n M2v)Aʁ>.w>8y|ֻ;?3%`Th윊^nm;lvټ~K97 2IN/4n@I 1.K\oO]XBŁf$+s (in:e3ۦk `_ו=3% 2f [ݯ.nB{C ! à (F]GE0 =v:M!جw M記*a2y4=ȳ䷾V&b'/4yïE5`||37ѿO7ZLH=ͣg|?߸dV2G:ߩM7}>+Oz">q+gRə!Pp&<`̾ 󢪪ah"Q6*mF >ObY]<GYd]nFeJnGGՍM&9Xջ:=s]P(`| P8Pºˎ-xBxGcɣHz4>3|aϟH)g_s~(MyDAFAFqC7Ax'Yln//>V}% e)HbksȥAD>+F޺B d2Me-BJDhpuuy' }6*[%EapuAm ^f{\UM5;k=@ 588ZA0Yj'Q]\#ypͮ񐄐Y?/ &jOc>E]>b.ntU*n.os ,.M׍ZE>r4`dOg~i8 v]wC΢e|v8o<~$8np1\i$Iιtijk-3q1 ]qFX{ۿ4ՌH2˒Xƒ+ahd!ԃGӋ.;u@tu\- 0MgmL !\(yQJm: %sq} \,6imkc횻|6+v@蠔 0!&q(1lc<Ί7, 'P՝5vtTzu[w2C7,yRk/0Ey'ag0 UAWU-C>X0 7+|jյ٣ǕoרԤ_ LyAicPV9C\0 rƘ`Q2@cp#pzUoK_!^3L .]~1ln3J)[3pD1 v9xݴqƉ׵&IxAD1M߶'9Qi>C T(Nʬp鸐\]lo'ѲzAx4Inim_s((q:h@xٗCP 6rdJIdEp( $,s qrx&Q?뚐_dG_w(ϚM(T1KQQdF\n˛mnHBAM2Yc8̊Qk3 TԌ,?ͤPnvٳgp2zo@$H0Bkt'[m 8gH:gQdbBA 8\nz [\;{?{OsRM]5] @XPd`-d N MD" YP?Brl[g=f;=ΛژR/˦D_}FG3ū\I:h 7V4z~;wC3 j8x~|<_\nrdW<)L(quuXwwY^Nfjo:y֚QQlf,M8g=t>:'<9>Org_T=&4Now&`r|e$1"ov9=Ur܉~¹?R )sι " 2F.8g"c-pƘ^w{=Afrt]miaн{*'B2W}߼Z. X'zXm ƣ$ R0QBhc$z0s!nۦQq#}; (Gŋg:͢޶GI(:7};Y"P 9_8:#,V9z d\q@ fT8 8hM+XvhT1R!(GCyw{-ey5; -Ɋ300%TaCpUif˫n֛z:J%%gXF13~Wuu]_] Pigзi{е*HySUH){X-+g.p3~'0BNRfjtNY_ =:'G>;ߝA&^(;{^/y\-7_]~$GOҹV;9v9xz{j'y뭻W_߾{:( j8bcU)r) ~<;<҃.6ۍ2Lz-]wnݮlD}ygR0tf軆<@(aS2⦫$zoM<"IQƛϞ^|X4 aח77x6+—.Pp9YzOWtjr.͋󀇛eoF{ipH2O6vCكY24hlygG'ƘgxEFf.CX7-x7%fwv-6#?`-i@:S]'"vƺ^Xb-gz}^kǂ(02"Йa(INN{;>{sx"7͖1N)Q0ν[KD:/׈332%QȀ C,b/s9Br9kk a\{/:m9*q{C߆K$00mݨja-fwOHI2o88F*★Xvb*H1%﻾.T^z[;2{[4>iگ.ugFG@ӒPYcuyY6f_~~ }t#32Fd)"Z &lc n?YWsr:*"ض WmTbRvuDa im`{ KE7)5Ga\Ymy~skݜNHHIe[l ;#;? woE p@,N$-vUNv_fFy9&x ?zك\xL^MsEV >),e]"b^*K2^o~O289+q,]>:yDb?Ҙ-Nl%yY؛- qմyCZp9'ZA9VIwqD(Bpc3j<'z 0,~ÿ=;w}]ɸ~QJ(NWk vWa,' bĨBH/ϗחo(ꛦnnaRLS֐Hz0H6bsmpy' A9 1gι0,q'Y/~fG ٺ ,W0$I%FZ9Gрm `ضqH%bcFIhȇ# R{ GCPeDFy)q 2Hƻheq>`7R߁ R'!=F{ `! wH;o`> 9k!3yQy`rZ+J׎bKq.80&rXiE { !L:F"(IVWje~evY  xu],θ 8(:0Ab\.u&M(lQ4P,vz$SY s#)'UX)^ICvN{q6-b>I4NC׵]uEVizQC1B"eFju 98祱0`mdIJBF`魧F !f bgY6LqsmTfCP"vq nǣABRʦir\_Ng$,kaBojj2A6Ѡ,EC٬۶nv4Oq1眵VR ~~y|z\U5@ YFVvJ{(Di$Cţi9HA$7Аx<â rssQJ4LvW (ˌ5eU2&xٛF>7|>o6Bo\oM9^n|Bx6e4ꊒ0 é4vԫ c)bXUssE1ELI dwW2DQAGzpknoQR(>w~mAd8EŒ&E%+_{ݛv_7Q'\ƃQQ eRJ]_5OPj[uۃ#OC6|VޓUm#f"0UG8-P`EI nXxL,f"}xURqsƔ]ʁ p8(|};8ah:!lm 5ۀm/^[ `I,6JǧӾ};(i docථ6]c] `h2ózAdsFzs(8PJӶn9K1ap c (]U%ι(\@`xu1Ɯs}"V{v $zʈ'-hf A0F!rhYީۍZX{oxNG BTgaƹZXSM*i,(^. ѰN+"q@H\wXq$)lIk. IU7Ͽ0ǔѠ<8,Nal#Q1`L `-h3F(׃'1AL4N8Rmw4I%%o^r80LH>dߴNͳh>bBw,+c^b=@j][Ғ#[$|rdS0 5m`|~Ⱥ:cv.rgJ} EDM]#'T=v \0{eFvN6[P@ ag$IX Njn׫6bU$\,UFgQ!NkKq7>,MoxQ"k@sWSI%WbcBp̨΁GA+BFXPrZ]7&8B8.XqfG !`y~*,bVսDڀAi6@EN)ȳ`1CླA*f\[ܼ׮!gEY A[5au0@ >4;M80aٻوS) 8] pvTDDZtw!KR*|~vZzpM*ל4ɛVfI uEAqƳ,ic(9!GL1F9;c8A,bvqqv uJ#`Lp'(ZYt$_?O)U׵ȇQ ӴkBlTvFNN,&BxPmwmƑPʺսGIaE,Kh>yvo[7 a@uw@;o)M8dO.bH7Vq)-|YJ菾wOog?onͫV':ӬFV zU∄02JQ8N(;Q\4ŏ8⣏xSqqo7~l2 7r`Yn"}8bLP Zz;wfխ5PVQ>nQ:]aqob|Z!..7|~>;>N(4:l70"vv=ym+۽$1@;fQbsFTZ T۝Uq`@ Qw^ʇ`]{uLHn q\7ݶ-tN lP", Pvd8[g`]ZZ'Nq8K 1뛦B`9L=rT c[Wk'XN}TVIٰ઺=&nw__\dp 9gfEt8 ֛ x:9/R^848RZ8X+y<-j֫d87 IDATTUo8Fo7%vSE1vZyW˛u\1l):M0//?}Z/?7۟y[=:+tϟߟ{VNfۿymLve dI/޿X̳{oW=h6m]F94l9b#mdWQJ85 zFE:M d\ܵ]n/w@azH!׻z$E&"K r~4Yt^$ a,(ȋahfM<ɲl~r| yVZk6i Aą vFHA(B]Q=g/ۿV\k'HFe B4x Zqf_; N4ZU%B(BRʣ,\ThMSL"C[ NEH@wvx̳2ӽ1v!筵q=N~k1GIErY5]t"@\1 (`9 \+Aqh8 rPѵJɫd2B1q}ө}]W\X!ɐjg姶\pC00(¦`q|R/1#d4aWWQYe̒$mni@)Gڪt;Q1yj/ep׭|szvqr1͓$bY1ȦcTOҺ/~IR \W;'X c|TB!<,ڶh=l'1}TU#Fz6Kpf1}l"½Q mdjZގFcfWAa\u*t10ńvMyzzR̆kiPBvƹXآ@D9 q}ӣ//J”QDol>ӬZ oPl̳rm[y'{tuyם;'@ q&pӔ1@amz{{]Y R%#PV?} 6aVLQ8x{4^m G/ۚL''",A_~~S"KX(J/WDuʮ2,,"O;n(K2Fy{-ܷW-~5lKGD(I2qT /TjM|[|1701Ɲ!Nh KGOJBu^^V*c10J']g c7C `qw6<{8HJUo{r_b x2n/W=$&p"̀^_5!,R 7,Jo;;=鮮`G@~2Nq%4볔YT%pҲO_.{vrhiF|D⼗=8->9e0RJKcN7jx,vd=Fȣ/~Kɐ{`a 㓣7+}Mf7 (n@7Mx6B}SL$hҍv*?vmP`@ 9+8#fF4b?N (=aϣSмnш8B7`ౠ9TЎa)]zó`:/Uv|:DEbt])<}סY{v(),!rmҴ@̢8(]+gS1"DHG#Ҭok|SWJW_;i<- D3nz_#3D4r[A0Be7FwFZ9wg(!>L@ h>߿w$ܘӷ5&2/ !JQWהm+%u6ϲ8P!$Ϣ;FbSN lßsu[v R.Eqx0\a>y,us:Ҙ1 ެ ^!cLfcCI~-TD񼒦w~8OJt/oeb;|hFJIi`.MSF=e8s 8E(Lf4I?MN`蓗篮ԢNs유h_՝t J'IipS u#ez/hr2;;Ҫ0BR|v}?TPGT:r[tn$%1o>yOgyvGy@\$6_\t4(``-|z2yX43ګ^@?yu[]edBg "ײOFyQmݭݫxLsiicaDOM0s<^Z٦ *5>41:)>ZvE$:lG{$@#L4,v>,yu]G(7M`d80#l~46۾2R%[z#Ed"(8c꽷PDJCL|sXmcj=(={b8x{|c>Qf/ Ư~w 6OAS%_?wC;R7HDj>4O} 1f{g$Uj !G "hؾjء6,re,E0h0pt䳏VwtUc$7RZ|Z L(iNgQ @M#Hzx (E^~yQ !(Npƀ8`uE`Y^P!ܽw Xy("(`+uxza $Ji !3 u4s((!Cp1gS "IG(M#?իk'Ǣ@2/ֲ/./h@.⍑2/uSyo= {VݽX/?y}b!C ge$HNDL`HN)n7d4LW)yiĶҮu̐7f4(RZkB6J(%DH9g s>v4=yz" VY?J;nU^ CSxhw!ɽ!XMWWxṘNY_uWecV?'@= Qv1p>l|: gFM (N#¢ͪbݮ.JyxC{ѧWfx<>qjKt'e!Gx)FUBxG7vo=T mzDr>͹ȬOs7t@GkOmdY: RRf6dynGZEg^4jys4}ϲyCVU)R}7,@$0)eSB'BkvJo5F{811!edIJmw>Jy8}43&N8{@@0=7f[s [-(n){."Bvr81&M(Gck-缪jhn}tF$/g8< 7?NUװ$Q{m|o*kZ xQT- FHĤs."}4aSD6}_,d(\nۧG ZR3e^-]o~`ĩ k}۴ao6yqLh'1F8b,ԭ6W͎ ̏n?Z1>E2G4iZ&BTKY/{v>΍3JKB\UH+Ifw=޼K$Z!"9z%=o9;5)Co6a"P&yZ 1b2(͡fx/Ks {L!x8*TYQ GZFgqx$Z^-__ )z@2&Ĝu9e"8ƪC38~ OOr&,6n_~q|LU׵P7؝0brm&)4(gȶLtg_^܎p 1.u4M'+lp auѷ?oΣIO}Ѵ~fȋ/O, õk䂌_-'2X#{<^%BM_^UЧCwS?r}ky(d'MZX\7>,D AR,hW_^ώf a }B@w qc'畳 $Qt4({T}:;+Dʾ= $aX12DE9Y@M]"X#E1cQ+2U::> P.Q,m8}h@1ZLq(>TUS1catG1ZD,-)4ʨGg?|-?˘1[xpvӛu1̇bEq|]1#×7NjqVv㣙j r>Ϻrk2@eBwG|p6Z,gf1yųH*MQBPQ~H:QDh!Y'fYnZɋ] \Y #ÜAk`:{<f[xOߜމulh8Äbv;H"v~2>7iB`qcB"*0aFXYgC୶oև[pr$@$z-*RI~祿n7ʸPc00 !p0C)$,(MZ8(d 4Mtr8G8ZGcHh:2?0"V=Y_7ݏ~ŧ^t>1 O~{7~}gE/[@F}u~S"͖3>|9[pV9)M5`ͤ IDAT&F%o0BDFAu^\bJI3 %C?MC< HTLov7'r4>bJVLJۮ{՛?7h~r|Z)*{S,c)(b"bi0&;buzpJ…5iaߵ7Z%HX%`}!pZ;aJqC"$(^WVyq;(ظm14Fz/X,L_e|PEs8O\Pl!& #oǺ@0NAm4pi1.B60C!P&"s1L0_df? B~TIa]!TcI8&i$RB@s}v,`b:J(QkDЮ8 LSlhgqF%BV#Ó"mFk1~2-PFq%]S.8[mnoY>ȮW"%%TkzqܔMB(8}OрCp]\Qu SBQuV겼FpD"t 58P`>)d:zmz\A\(kUiޕ=89:([CMC{BzmA91LJ31!pΡ((E\L&b2#A}ދ(Dmem[ [gFƘ*'Y<- kmq^ȃw.Fx FI!H]oCpĹHʍ$JZpxG)-rI'yەMSգi㧄(%/X!Y1xZa@SB!JQTǜP٬ooozwgQ@PaU( ,rRpZ#\*t#F|W_\0!&" j0ȸOBLl"z'ݻNݬݞB)~ȅaG7;̂c P+Hpj֝я>\_~ R7/uOo~?_-hȓNʪh Dn;8e  -hl 3w+rz¹@*&iUoG Ø1UU$ PVJ!# `C$A(滕$fᄣYΔʺELEwje$AhF]Qi&c/(1&y6 QZU:{ES-W$θqp6e$&mM4-EȢ8 ð~/n,=<[5ͻRzsА+FGWn[s?#[ :X#\dAHv ̳gyHj"yyu+%fa(d x>;\5j; =`m49 #aԖ ,K8~CV]EqvXX'g<cYaR2ޢf})Hd4Ji{$o_(V91 GjcVK+ş/?tOrqDzk(G z D$AXch00F:7*)%Z%/{rF1.n[aBdrHX7/ɤRc0B:{%mꦉX8c{q#03lQ;cknmk1x>;>;Da|p|$5k5(yb}KL< NqEQ'y:8I!gZX1A4vIgJ`d?4M@QͶ|S+|/}dQ9뵬MRLH1Rvn-s0Aio$xmFdh ;yOn ^d"ٟ{QLT P`חݓ']Q}~mē2w89ڶVE;G( !0c)u?<< a(p9˻no@$4Ktmk|3AcطHj SOӡkaC%Hm1 1Bi;O?b~}{3GgP Y 8T1Vke)GWu6UsNqWח/ܽ`z]շR= BfW; <9~zAVMٛO?8>7zpb Ax$KpTp { t,f޹ i,%6 Em|s5jB1l}7@Q* 轇)1"DJŗ$iZw8|2%J{͸Z9罉o?L ZL,gznR8r3(81gon޽U|=RbbFJ1hdz4HBuӏ]9 e¾K ?7_nj%G;g>xj{ڱSՅc{By˜Q 085[#I!%1 pF0a2NA`Bm!;0BY +aaŔR@iGBSi_%1֏2q@4, ÐR# \k}Y8pmwݾI;b䌝h1((.b1 k/u_qtm4c眉8EG1tRxg 0!Bp{{Qn[L#m/ͳgOS^+GyE.c_7.~ !LQ,"9

ZсGXctOR^PەͰٍ >Y18UB.}AOYrAݾ98dB4!i`B;RkR8rUovf`,H9 zI 0Γ04 =nz0Ao9b#L(F;h%ZƐ6z (NaM0hK#zfU+Cm=BC趫Ty#y<z͒W45KZ@&B1*~r~6O˻mk;+Iu$ؙ fkڷb(@Ta{;?~SUw;7O|˟|}{IelPppHD"aтC?~p%9$KCh3 8DŽ` 0$zc6hpRj!97Uڀc3;;(Y7{RJ7J )"a$qd2J8;Ky` i+JZeD`J0XZۮH?88ؗUG"1L)icmR8ڮJs ]ǀ(&9JѺ+g q.$0#vvr}?8m=8DHƒ&i&ښIg="j//|&y,@L+5"[mySer<}]7lRdAE1s6 XJ1V&GQtŨ.wIʇ$Hdٖ`ZYx^ZL ɱ`4Z-5FC<4L 1(1Ja?8#Yryݺ?ۢ(&Vf.nzrdAT˱nO- oyq) 2eh#j!tø۵7Ak=@Nx7 pk3 gyp""RLp ga; XOl0SjyqG< f;Pe]]' yP _FPL/~ScJ׫m>c'7}^77rc@; XS ,)fO擣 Fh)UrYڲ,s)54 ,.IS[Y ]݅1<8F59J!tc0rUƔ4ǏVɬ9x{e $ 8OVWWןk-f(Fӌ0ROn,fa!N &:#s&g$"FPBZ拯^;p#FуS.X[/k8ڹQz !޻'qMzo iy9S}ܗlmVǧbח;e`c"zNk!̜?KbA~w޾|ptA1vY16'axJ.U%y<{)&T3'$ !a{~&G2BI9:g !)푷{GR[G 2N6M=Fk-с<Rr0m;rθT8  *( w*G<zܼӣ ,RJo/|٣SyaRJ1/N<guq3Jw}׍Rqֻ(Xߵ֪IK9NY$ \YVݪ5SF׵5-!Ǫo[ou9 ,"Ww'G3~v^"?:[7u`mpM]mCX4Z*alXB(ߗ6IMۗo;~!0a+,d9 ^ʺnyJM,5A{'c  k{ByzQa8 cF76BY^@[t ?^LN0c:Bw^G0<}3%]-G1GET5.OjBN" E4-xq]U aP 1Ƅ !Q3QCNZydvRC]iB=9>!??J< , [\Ti=ób6+}t2 ;qg8Onrݴ;,fLw@|[;K$˵u98ʹF3|$І899]EYgyE ~_qW[t J mx 6nK<NS'ۦYڃ8wCH4CAx |Zt_7׷"4PyM;4E"HH׈B///]a ,RYUU]m7{+ux9u;t ` Sx ? рA/ViR)}/w('}Uze3SFB(:IpQ0zzxBX}7(óbZ{cttgF0 u$IV%&$`tv{rjB= !a3k-„1*D@r!Y$,2or* E uVK7:紒]ہG]m,:eno~%cH A1O ?/^|{WnO)߬FB03T:c:@0X{ &(-Ⱥ]y/?)d|k8"&1.FsQB@U쫶aXM܍xsWo?=tWGX7*zYD(CĸH! xe14l[w;ͫ[#V3 F;4ͪ~f@ :Pj2zFiF1M?2J(fRAadBBǂaƉ59G01jMA'QE $"l]HGp7VI5J0 CY;! 38H`42.0bn eY;Ge~1$ς<_~QeoM1LKc Hv0IO.p0Ygv/o_f_$.W0 X pyp>;YFIKɾިj7?~e NkGQ4Zd(A*-RZw][rJD۵;$E r0v9@e48YWJJic0 hkzQ0(ՌNi31F)9oqy04Mf'g󢐪O~rq9A rh8ƈՌB/q.K("G' wm;=¬7|X}0"ξx cw%ӏ#Wf}q*FV"0lCiU!\eY.&6ASF8fBBpvW:F92J4 aZvrɪnif{|k$ܕCR=SNsBpOSf&TmFu3f}uQ*ofn69H^]*V,>zn`18e䠵62d4=*r C.=qǻQJmwuE!I,㳳`]oJq׫t:I9FQ zEanO?^]1&4wPkJ8 g Ȣ"@xoGkJXE)}SlnmorcTX0ޘs8 (/;y||dxgôȒcc.`TFwkp\~===0l7mդq콋nk}sy1nzठ:2(xx-W5O>޳ v]}u_z~~ruZ`źxaXwar%v$gBb80O4zQθc]60 F9oqUvvzEhs d? )'?~z~E$eվ^n[a8ɬ mE1L)##/G8~jGY ʢ~0Z;=r#}@BB{`HѮA ?q0lVy" 1~"f#Ny`i:@z&8F @S98!selc`kD0}J @42!& - aqxBBFnm;9 ] 4'a Zc[5K9;x8^ob!&)xS`qv8Agn7B\4 @ɓI DV߾|=n{"W^8aJa,8m"a<~ \jXs}?Jڱ03"KKC"NO=rQ"(=lZi)!7{ HJ=zc"<cJð;ϨA"nI9UCMOWW5m zNuP$g;3yRrn]UV.AQI˻K5O~~ww'EQ\0]糩1fصtZU&#B8缳="X6z1n*q6aQai!a (:~G0u0Ā$ij&ipNkF0ň"vI-mfNώ(wmfcя;39Gu7tm'QJ)$l&A~]-mq\L$  $+@bwl~+]&^T?dqb6y<;bľK8 ۶]4a{凜Ji=eC0<#о6Ph^|4ϳ8:͋rQ'Of5Fr %j>ypM!etɊ R?S_zVQAȏf/nwfq àa `mof Ny ~P%b;K" bJUCb“4Q`(j|2;Y(y*h\Gck`ɃdyB:d˭Q.M4ai1{+oGGxOf'q8_}}ݔg='ś}˗E>9NŌ)WONN, Q.ˋo"eӃPFA!!c~ rQJrʝVx^z۲$Kl_wᑑAfeQJbS9#`DȬ̪l"o<_{֌u=<:fwefk91Er:;w۶Iӱ;FB@)I$D0'kPVx?NbFV ښ~g6BFU4着1׿i ~/_&Eaaawϟ|||TJMg;b!awZnPl>!8,}RH2EIHSHrƈ~DnBF[TM8&DXH%c Eι(mN'}sGCOq # "~wS;PץB휫jw}]>e3%E.ų'?}w̾O2Pu<1Z .Ic[䓉!0VZ8p-' D>YLkR;OrY~ĿxY*h$Z@9?6q9Xv]D-+]O04eU*ff17_ys}ؾ{wTŪ ӏ^<̵wp`ѷ>9[/?=?ݯ?{dӧϟ=@'܏Ŵ/ۮeyYNr} r ܚov֠xVՔ)S3"TJ'I1lz#P0hcP(4 e5/ω23=uuW9)SҘ'M!1&lG7!p[a ѵm`¤8$@,HpO>zxxRP)aNLa;R)3!H&̍9<_Ǯ 4Vu]W9%%q) ecN'S!U?﷛n0;;U7xjB)*l +YK$"eRRTN޷,e<ӳTnuscK-Sϼx^_fRXmsLA Q|_~9X0V (w(˲ZZӶC~[k]umnvno~(_|_<}3C_<1=6SE ׏Χ>BJkYQ {gsqw$:<*w! sY*PP#)Fb 2Y cwQ&d X j4(A}L D\H-l,&e-L5b:H!3b13 rN 03Bmps%Znj!N?E#+^kٳٴBղXJo1&QrCl6ǟT,/$f*M{8տ0w//ۯ}.8qR÷?~l&i&D?0r"!RQPpXTwq .&YSVRx]\w9b^|f\ z.\UCͦxרgcLՓI7î j}_~1zA3D#T\(+3 ,@mR+K1CGui)?h9GFdH T$%DC:#e2srg?0Jl_B$L]f*ep3G<<1ͤ? p`N-a1QQX?x"SbM&")@`Y´Vt߶M;PY-*hJ|LbV<{4R_4Jä,rmtb@fe1&8ܻ\hR*'P"(>@Xĉ- 47}{ ~ `\/^f0 (Ǝ2Ӫpn9[H3WU,i3ѹ wCFVus"'olD76tV|QUuWR?r~6b_;wee% cFQ1cTP6V 腱fr"Oafw}}V5ɾ~{g~ɢ1i~rQZE)?ibden,R"]fsFx~?Ǣf3z!}rs(͇O. oG,~|Kr9ª/?0F[i;;kL15)=W45EF Y]Lv~#Q6 K[̊Br-gRf3mr tƑAx>LA@)dF!DE68G@$KTs,b@)>dPBZ#u l=C0XRƘ0ɬqLCO(>zٻHy4ӜR!dS`B1g=>v1Uj\ic(=*NR1~C_ ΡRŤ] pfA=@UI"H)!'Q2 RZean~tF< Umli43=׿-Ϟ^UUlp'Ujaw(ˏۮ=1ˋZk)bCo~W(jZȔ yU13%OL l؍]JaLQMSʇ~lnJ.|8h"@JդTq@%oƪҠ _{U]O1GbU$dfb+Z=<ϮtnߎH"4%X-eUc?vGS)DYuW3͡dƏfӏwly_f=w ]"d|:5;H KիkхB iåEÐP7œE%jRbwws|}Z^/f_/V|a@̈́\7rzZB#sL(@F xXP&P i|ې9BYUXz IDATcL&m¢ .nŲ|/ $OUαCs.0}}:[U! w7O/!bq˟]]Zfw&KO+=P(RBٵ[. DF eqaD((!!Vǜ2@aT)䜢@B5%,YIvx"dI`VҢ4߹U w~4aCꢮkeL7{ BY4q@PH1,|:_!sw8]C]fby5Uݶ@QuŐR)MbV3Jr }L1`$F[6LlNǞ ! )=:rXbJRZjSd3E8rvV(EiF!6fCwCC/PׯlBP2r^cLC"eL4( l>(;N.*RP bS'u=}7earu5ڣ.Q`B<”R2]#g%H?yTZ8s@KR `k,gʙrȐBΦ"64 gn >VWRK}y~r"c`Md@>\8[UInί{ze#{9$Η.lf6)}!e`ξ+&)є!I3!GSq49QRJ? b;Js,%bEeJ!8c ]3VFM,~*TŴ(RRZ%Bʋ3S& `Dw8(deއ aLqt솿v+̰1ff >D.ϭ(w1geJ6v6;@y5GO|֏7ik/֕~8nwPd@)v?vc]ZFPԥ(!ĮƮEaB9P#])z>fA@S%q+*bZ!hBH^,2UzJ'8D7o޿x qPhP|uvq{8T~#NWWOvCp8͞H!?&x6cBdaB Kϟ.^ TWSSWR ~8b⢞VERhJn 'ѻ߾ĜkΖzoY@Sȥi) Y)(frvZ6c,;Nw솣R*U]-gf!NӦjX PҒ( Uh%r4ZVBhm)nTI!~×ꝏֶ.*v@hRh90J [m̴q" @hʼnHD@"``H⤭%Q0 , B=DL_͝i=Uf^+HCBFMU2y6Hx>ϔOTzZ]lL&) (YȲ+!&ϧL,=7l]b(c?f5]Z]nL99 6@C` [) NNO'c]X-퍒*XD;w8:^-R>|Q@t#rnL)`ZB#w}׎.fӁ/z~׾'g>uY912FHϛsJ}vv?޴B'a;bVg*΍=ZL]?r.2!%TD)R JPc!2c1 $ #8OIiRv1 Fy6z}$1>Q{u) g ~q 볕*kb.0DeQדy g˘ݱ}dB3k||F03))l臃w^6ĴnO.cJ?8Ss3*1D(@ Ĝr@A ?Xw!^ Y\U16 npN`L IDdz6mfJtC!z-Ebh-a͆*_g]&?.4nG\J%xKTC^ ZM) 7I,xn/zص,%dм=<.kﶣ8 P R!N캮(q-נ囮sa`sNRv-Rt^&& d"'Ӊ 1d$P530BiaQUiu#j{B"><<3ͦ2՗޼yj^'wHq cB8(-1-ȔC\LkW_~yCH2ebbB1!$ϐSfHN&r^ɟ|Z~?tBQ:|w[!Ey|FWV___ݠQ[0RsD4ɚq5RfmLn{t7X^(%1R=E`iUv;`^]\uc߷~;n@U0RF_Jzĕ>SJ0JZcT8rZ)%BL(VV1|g[M &[.LW_=>hp3Ms aZ3aTtwb:M~0VCn>{qݏ;(2>ry~Յ:x ;AZieA Dd0&OJ xzXhHFH \eftFtVT@e5qDYn]ܻQ3ҺzN9My} EUO)B_fkR]4yt/uq%QG+-(kTOϯCo=a>>[^,yS_QSNFY(V|zppyq1 !iun9=vBEBDxPK5Rle{s4 %ܨIUXe]z <d>N' aup2 s3դ&m5_ZjԅeuUM,Փӿz%/u\9BH, *FL&C_3l/̄D 3` _`"TiE+()Ǡ;,ˉ),'MMnmш}UK !#3$1t00`&)1p}ۍ|J  S(nAi-FU]_4J⤱9sLgg)|TB<=|:]]\cws{ssʹOkk )es,TJ01S&D9'7 z: D熱 v~v?c 8Xk8Vڌ.6k4!d$hk1%¨cߪui:tGPl> L1Mlu:B(8чRI"(RS)4U])窰!w)}˲6 @ԇ8-ׁ (P#pT*לOJVx~qH>g8\|Rnz/ u>xz؏!g5x\aep!%bb`1I]nCQ~<5 z∀ J̌ ?@IA28dS:&ZE.mQ~OR CN+a s]\ރTU*JX|ZCS=k%٤v.C<, @q0 ׻]yG#DZZ=eWw1X9W(#@34H!tscη1o*]j=5g]6VhH9*2B230X)(Y)]hCyO,01EiVRbfnCG9h5I$`Y>čs @$gRsQ ;(! s'9v{PJq#F̤RdT,~2ȷfZMk)ʍH%\DXR0z  !LR9L&RVRbJ#Q$ w1X PcJXXe| Adg c~T;@P@Jm?}rۇ)|2VB>đ1 %0Z P>9_}G_7O1WoUB%9ĘcD@v!dNRr)@! !Bf"ƲA \ 0Ƥ攵L$q1ReiEarݦuWϮvM ( KcU7nL"Nh#"$t_Y+ !7-&@O'\D22(lEf EELŤR'udj<A49 8`R0"K,s.,.N.bO޶_~**F2'Ra&@ $@lNXO( 3 fXfLɆ\Սǖ!0"04 6b1e*fBv~Hɧ {~@$2ʈZKM>x@!Y(d$! `&&A0' !@;us]N]]m{۵$ Ϋf3`J 8x EYiehz1OVHmHE=S#2G%0/LYR8`JaLQg2Vw7w))jϦc7]??ΥJf|4eq}cH^竕}DbJ)m@1GJJJ+MuιT s C|LմȔ{bB C?!=t1xtsļ\?9+(!{ן |>5ɤiH}?9;r&fNsi蝒J}Ɛxh*5FhRZSl_ Ϣ)%I*=.":03E mq`XD BLOtlN8؉P-_Ip<cpp9i Ut 1&F O{Xb gӜ\_ިZaF4Ѓ~.Hf `tOWW5ulm$uoHv "(SWTo}>C'WU7jAVr$O"A8)fU"'D٬njEeĤ"Pݤpwd" zUŊ/QaY7!.މ 1LUo(fl1nJ %V Rm94*VMX}S߅ErMj4t' x<DBF:4oё !zquYJAEÇwS7|in"As~G*Y[Ƨ)Yr3GZZy"I:rAe%fzRՎ'6"m4F%QJX1K \Sp6q!!t8B 0S qu\\}<vUUOZ&-" d MX$IU4#sٲf09VS V!MЊ~Rnfj?cEOPE:-㱗: 㲪\#U1r}Dq.,Wͦ/|4X ]T҇ۇnjۦP*ƺi*iaE^/_|+gRNc?eb^5 >|,E>ݒj6T*agCyqRW-br:Rt݃yxm6ӷ), ՟|٬ۡ>>jY/\6prUEDTDyf㨢uhf:x'v],֏C>jp:T*)ǡ$`"9?,YnUۋ}DzA2 dPaAT`=P)rȉqݧXëgE[Y;NYrP% seÐVb7d]wE3tyٌ+nۦ?i@j5ŶLm G\ 4MbS*%P3E(O F0)5ҜA v[[~(FL6 f罨BX/l6-O߽})`:T/7fpw=|O,&y#,ղ],5K"r;%7%yG=0ΣodONqvLRyfhn?|]_|?9 Zdz&.p#*0 T}23H~h^^\-c<%OdH@29p ԠS!Xyݬ:|8rNأ u\?S247coJ, eUpksSIbQzQLD XX 8b߽~\89BsZlbEs( ƖLs z}qQ>}5qޖ)̬(d ֛C:YY_\oMhRw?.:.6ۼ_SSİMKd4L)ڔ2%,7u])XC ç7'>˗x|<cuu)R̴F(HJ)VU ]$]@)p:S׋ESjLL=uyas`\xZ>կ44»pS53K)%g5HrYӔqwĻz8??*zr]o?tHDc@9uJ>uGդ`vU]dedy 33⇥SN+yM!:ཕ)?pPKvIhs,JEmtVJU[6c߽ZU۪r ݤczRM% `vE~SC7w y /IMj`y $Ӕv!tyJD DjU<@5;|*;su1˪ޮ֗«zv9}I3qsonYU_~iI'Çt8]<7 ;;昺'0|R񰯈kH˛+Ս˥S1UV\^,W˕'RRuC`daʓqJ~^5庌j񁼫4L˶qNa40o͛lZg>< 'v)#DjO׫Ã_iHL.!]//؁ژSvc?h1(:Vq9|:\/:@@Uet94!r1gϞM)-Uլaw:^o w<[^^󰟺Ε]kEܣc0A2=9taF࿹Yz2z\^l;~cpi̦ff00y3}9BƑ 1^?}ss]IJQ<8U1B ֍ӧ`߱ ! s4"$QLSɢ KC6V d'|)}י0ر*<P! 5I2WX6ĹgvYTm˕6ԏS*I莧cׯ?9$USn?~W7o׿!?yq^k&/]lC^U]d2 =N#~z0T3(v~RjΥ|c$K& e~/_-֔}J勛"Z7pϪq<|7/۶}wcO1c?>)rЧ_7{W;e0Np8ԜK.`Show7U)9)@ċeY IȔBQ1©?\T Et)EZ3gQQ+S1fB>|1Mic&ޔg}>!\n~N N7.!Ckl5/2Y(j2WUH&Bi31g4W/xxC_]/˿? @ kj^qDLRq5L8<\&l_Ə{Tʂ3˪= |?>oC*-vꟷU}7_[FؙNL%{`Uƒsz_ _BǓCgj&f@7`M~ v88蝚S*wT&% 쬔lScwPb 1a7c!;s3Ç)5]-բ]#N㸽^ˊ=!1PşiS߼w{yFAL s%Sԋ j` *6N}bmeZ }Z>yY/F)1ݎvQvSZbVs g Cٮ }m6?_o.ۺbj1+@i?xz+Ug!Mn^E SRUNc?i5cX?m''=IyjsNןZ4!FfS.hЫ@H4&3Cr .TjiE9N:-9Wy_74N`[1l~O2tLӘ* c)ޛ(2xeFD :¬LYeTJ(d$8@48k9=Q% >I2($I*TП..=9U<^TЕ_o7YafQ0כ/2mMCI;1{~g~"McoL5EQa7>HʗMEW/~xc)eHYC ^S)j\:d+U/fDD9t s.0-Enw%i03 9>TJH1%V2DK4Co꜇*B4oT #8U! 3IyꪭcҗVj&秜 (Yr. "W9:vSaTw}/cUTU0 hj:kXB#GNhU50Ώ<쎚D8%)V" ORl " ]NIʘ1FE6Mɧ)I6Qa0A{pXX.v3vEmI'7˵SєRev y ŠHUp}("YSwL@tl,b&\pjG4Ly*9S2Ui0x`:,p<oS`,Cx}qbv9M'/|~ncL%; c. %'y޾rbI 2{O"Zʗ~'S}6`oXĪy Oz"ׯ7kU}Ir? 85rZכ墍VCh˶n+JDĻiJr:|ŗD]>)k]tB :J"~̄@gѮ5"b}]i>fkiR^xV6j18'UT2U=]/a߶v4cK8zh Ī.VH1<[P/Ԑ$Tcc1ԏyVSuyK1LTm? CN0(>E)E(LC h xTK_8YձJijW EgIP!L bg~~?$:tnCfb*#@e6p+MUV!aiUEPSmꐻvR:{ƜWǏi-|k2K``Qv*]T~y !82aUZr+&ZT $5c&bR'?{a`#%r9*z]RE 9Q)Y>JdͥwaI1J."ybhNDTJd eC㼱[]Vic:a2^Jڶ+-ő\l:͘"$7WUK9Oԍ} o~= Ww{ػusƅoհO2|@~)'̭:i?=-vR2má;%bЧ9j?y]}MSǺnrBrN9Vf&""))4Rj\,El4MDiιLSa梚L s*S#js7~m8oO.d$-jF͢%ʴ6u;SNXb1NE=LJj>ZUN"Sߏ!{8as|LӢi1F+M*TOjf1GI(0ꏜ98 5X =?\':'̌@T@ N >xBt+ iWxdxFbCv~]WNmz7ct,OIY_m Çiw޹*9U}ڵ0@,:3f>8"g*ً^?t˪̘He@tv~}p<*rN>P~wPC㧟}Nw{#.j1iۜqH2J1c6"/0}hTP;"Opfc'^<؏8X6֫q$b)^4x-5 PT^?]/mv 9a(jLsiH.9F3V7xlZ~ I&zY!q$YD'YB31{@MM4&A8nCTHEڶU"2S&6C*BLDU9!ٹsӐlē}1;5U3&`~[D6~OLyj 4xY=9M:%""SLKsrysQBZ_ YsX 쉙2{US,Fj&IDfsk$=W,eaL({(LXfDQ\)0LTT=gA|^D@23@ٔ@'cS93;nVS`SuS/B FLD#3+"Odc;%&U35rNUh֊:,uQJ>+Xb"*RΈٱ ޻컥)݈Jv@|Îh ,UԢȪY'WQ˦OKxf[Ob3^J cgDf3%gv?p{B.⼯} IJ s'bȹ:p#̎e6~ק9tn1IJq1  ޱwDD 35)i̢c771O޿cO=kɭ}?r|!`b&6S^D9954ك̀ƇNIL0w.e~նˋz{Eϓgt^1O8ӓ)''B*@N931{U鼏iF3H~ ̀0YڪDS΁HsUׁ(z?M)T5u]UF *˅rN DL\M!x0LӉ9b68glKQ+ُ eD O;#:G\"_ss RO f&01R4o+okٚ}9ڵnDb,Hd`a#+Kp$B!! ~@ Hd%REQuQ8s{5?.<v9$*թk7 DsfZwigFFDFI@9`pFQExwI &f&Jw4$YgDl9+cMH(Q$jdhyܺ3#"!#Q n쿔e^0sY7 wn6OMyݶny"F6g:A,"[p& 퓅s &r'dzx{ Cel"+j+IDՁEU|^qBLm2Envt04:5"Z{6!e $ֽ͈]y),1[{v} y#CDG \vT)xHA.6dpz#pwx*斉ȚWr uz{9OSkixd{t<h]4Mク5u]'_0Vxͺ]F= aaʇ$8 'K8qe0S\:˟qV)+e1u7$ʌR' `m"ȠJ e̚eZLd6ۗ~c>w{6@VM 2NDy24/w@7Ƿu=/ywNdLP礈a2DN[Hjp#<8WDp0=s&dg08B"7nn։Ot0pXn=3s]7o^'NjCQVzkfRN7ձxĀ3ScnRjEf^. f(W+, HYjs#=8DPmGXErbonlG}UL#qSIŶޘgeUE0rV1W}悆j-YFJӢO"u[0 D2.7#kW88; QR-"e2kJ daD~7ܽo&d"677 ƞRE&<ܝ( NvdDfjj"sk4oBѽb Bf!45f([b4^%y&[ֻm)/N `-`{^v:>Š[%I .0{'!L{mZ~la DOO?{'"|[vg2\ ftu])`mjzS9.۹ܝYt40eRa榒lʑ´!uu[U8 AdDbĘ4=@[myY'"anFԾNj;X_ș%8L>b#~Xyn{; ]1MʕMH^%^N# ̸DUWt3].Y'œm LI9U1-HX|fpvg-#RQn75DE*g֛6}mY2鎡N"Oz}>wsrI "NdBX 4(4TAs5'LDBњ[[kUhx31iSqw>o1C A83"f f2&,ɛ6yp%t g*]^/^̜N5rEVH¬"t9ʼY{otzHv0f͹ݺ<)<)}l~cUB36  ,„a;lTx}ҺaQI'"rw&UeNU2RA77S2|>oۚ޻WˣІU{I&I M"VK֋MejZb#\peywdʼn 9?865%"2;=bG ](V5 ՍR0jx؋>[S޶ D b &dFrҁI^D"ާ.Ln_~ L*ʜBBAB kMfQډ(#=u+=CӛMDX}TV{3L UtNQ9,K̨vx"ec8PF­{R"rܚ;sU`6E B)s֌#JξaL Ӽm$dr$.70аLF,S~)> ^TDzuU˶_!4O_栱,)9ܘ?',SI蟽x@L2o뺮[AE4#pO>9^TNk 1PXEr)6Wum{g!2M ;ߏ_>A?qeRZH" yn1^ ΗW%\ yig˝ꐙB~%"\[u_`Q䀴ſ׵.g HĈ,btغݻ{EA5\U"ܼvUxdl}$,šxލCD 8/NDY<""s}fbdIC#Qw]<qG`F%4 ՙQ_ 1]Ҫ~90CkB}C&7EFw8c/Ϯ@BDž~tu$[5gdSB%YT O;zT@ 6j D*\Me;%1Khݛk*\}9;S%W>cTX<0!NJ w3,~_a IDAT[o o´S=z5X4=ެmrY;q}W  '̙=/Y0^ I<wݚPkv̾o >l v;Eq{j{w\2=޷ąHN{bb9NνTCPFhPAZAGTcrp}^q|cK;zǧofb|Dk5\`O]jW`&\cM@_Q(#}ruc|$ϋA+ٽeḒIlQͯ/5@W 0#rX_ 2[#IImXd hg:?mEG2("sL"ʌTQw?ǠyN}=#oڇx-ҷ~kVG%Uww;7[߶%@EplC?(ھx5{l6|9b<ynmZjwaIע7ieP<_}T4!4sVh@IyyD?t:<9?`VT!u`Z"1H="}qvp|۫-}A[[^ym{|4W/_RCH6 _s=ֈúv=n8MD;ѳXF$" mQ 17&,XXzjeg{'n٪+'s#tכB\Y.&HqV=)"^eʤ%mDD$.wѫS>ۇ^{ ?Rh';7u3 hò[<qza0(vIYW#X>ŷ=]h M. 7oN$l*R  `3Q5` L- at{\^i0tM-*OIui4Z&?se:42̭ qmtvX|"bSzE nK)O"3?-kM }Z׋Q5RHeV4<*@@)I%^K!3x>?֦ϟgzшA e,p~)UB;Z4J @i҆ܐ߻}>OJZ4b[PYJ<:!"p{za!Iz D#Eۺ֪N(5<-5a /-myiؿN>!A`ګv"ڟ`9i)jOPC}=C5n奄8` 7≋S>14a=1>VCI3SXJ}jĦ9JPwG`r5%y~[xo܍$DyjKkKSe"{jvlȗ@Hd.&Z7nݍ0L~Ѻ5!LufNO |Tvut5icLNeZt{vsͪ|直 6V$pfH׈.4ܖMu;)"p^ʹHH"VZȌ|{D1U@퉸1Ș- \jPU 0$MT!V\{5K@w3t'bN0wcT2ȐFͲXՉLT=mx >'W2)SݥZؾ̭d٠ҘmH"/JXxnm:P:cYkW=k(I>Z`J̧v?䄭$R{#csjP0K$ Y~ǟ[^bMŽk0(HLOlvhbq_݁$qI"_=AkFkʪn4LDIV' ,"7τ^|9|~x85##Z|!(`T唾x#_4@Ya6Qi[&!ݦ4y!airw^OϟOkt@PydbV}sdbUomfq:upxq퍈Kk{pHmQ6`fMeR=*>XLLjF8~MdnEE{wjUhp.BI ')a4s'h(ud!?c@(CcԤ]Ԛ>c&wOyje ꉃ 'UDFң17w:";z~{94@V CTߘ14YTY7b & $܊{M}^5Q,R#sHZ-­)Ex uՏ v'-l"P5/6TRˆνʲ=Wqw_NCU/^cffHb$ 1!j#U05%2r,#z@BXiS2aRi2p +}=xO6#rlHsWxt]T2i&iEE 9+E6&D@Ď?oo^bw̭ry}3Tyٶ EDE!B&NIm(ev3=bt>FLd $24M%M yYX?LfzUM=o&m;mbTh}իIy]׾mBHX[;hkR,ċBh(D ,yٳc&EY"|Z{PdPV޻{RrPbE*2O=}|AdȐ|S!9$ HYkx%jVИ yP w-OLF4E͑@F?^LT4-dfYU2=C*$D(;M[8e̪9 mm_xgYpBYg A)DD҈N3CTUq(wZ"3 UL!pHtv8pL9.rC[ "oL<U`S2$xC.G~Y %tc<]mWdý"J% FtV!A涅dRJX"%>#IeRt!&|Z sD DQ7W,/؋k\ޓ}r 3%} HDpap[&U" oML'ne49S0D,ݪŭ"M0$awG ɱr'e  x"fV۶ZdD'ddнW gU>kf@c{Fh ܈b'd 2C_Nm3ȕ*S z(Lf=܉t_q8AnoúE"=v̻6Ke{&5%,*ZL<[_|CɧE"94M֓7w_Ä2,!sz X͘@m!Uj[z(ͯע禞nSkrw@Ĭ#ZZu4!s&ESX'I8"-iLOm?ʇ'K< mjq (:ÓAַ3ք &q/%!PUh!9%.d;b ZU[D^NN#)ȱ Iiv"w>֢ Mo)-#ՐJHk8'RT4Cx1-rD(5snykJϴI⹯ֻR`o*Dޅui0FlqšH7'f"S1"?Y ħyyWk0Y (Zi@kkFf X?rY+#Bi჌[M;Dq9$P PX@+n}̷B pU,^mk ;١B󼜽 rZ&cֻG|tp6뢭ȴ뺭fݺmn^mjZkE#63RF sЦf˲4mQm뺞ponCaۈ) 6c^I (h=Ǹy{"݌De9ny~i-SS !D,I &rS6M.@٤X yd= 4՚aMJC }m%eS{uգw[TF˜T%Qf{_NN攑EFfj4gb||h #<3BE^HqߖRMA{QwQZ.ez(N~7[AS](I!0QWTV{TIΓ6aa&6M"LPfi4-ҭ3kf Q&GHVL"5&O ^5X~Y e"RE"|:,Mʇr8,zݎNk+.Jj_0 <oS0*nǟOv!_XD2MmF,I{I`Umk}h*EFxQFŽlDzg}t&aCfoo7ɢWqϔo?VCc?`/4ݝEd 9=Sf /733QU,tt:mۖ'U+N&6PDL$"M{˝fD"E&fF%tBz bݼ996f"IhK} #J%4ۺ|:ߟ??NQJ%, K,|2<̢Saae|ȾpX̬oۤxUb VyXUSS "2xiy`@4CD JӀi(#"ܴxF%" wdOk?o}ܯʯO|ׯ |i5?] 9_'?7G򅣿wߚ~_Z`x`P|W&qFl vyDDe{"ͺW,}Wd4{vZңELXxD.^,֑ADeyxI/^0YU2[R,T#FVYQ{"j$si}g‹at>UyxMzoFD!2mfIÞR=-1ЀGX!R=o2L0E-ԽHa\1˕ :ovZymO6i, }W>Qߞ= Er1ԮZlڄ;J^܋_ b%k`޼Ħ_?~4:DEgzd7mik1S[yȤO==ۺjĬ;V+' p2q#` cHrlwj/JT%2=igkMDٻOMk̞2͓ΓRBD>fnvV3fJ*+֞XOٽPҳ":$n&v,LDZSx*.P1#E&޶NE")V 㧠}"!KH~#r!5:3 ٻ;;,a.b!yأ? 1S/]9x!`} ݑ@L=K#Dq:oFBi6TmjݖINP& %٩.5M23 G@fK7^G*4)`ZِMm$rw՗/7<{fޯ]7 N$Jԙ!xDhDѨ1R4-2"E!Gd =BI){O}jѝ=azESI;*i;lQbHC)K: 'KqԘKM¼[ߟV2^oXƬq[;LKg7Lp\wg*QnbnǏ^Զu;jXt[ @#P[ӧ4#( IBqཆNVώԦev?GnrJ(L ?6#x1mT5 W/ekgEP ??kܟr~ fބ榳fHŀQFD旺=0&'g_RKU ņ'eHgʂ6j]Zʚ8ІLj%<@/+t" f/=/h@غQL[87&p7kB*J:5;/rFzu+뉸"uh4ik^Iw Ud"UHg#Ϛ$U>|h7\lDD41/62wd>vBtԂ: IDATB*aHJZfQؑ;MP蓄}$!Z:ܦIKmM ؜mfNDj1 qNk{,P%c"a$zՄA\jn9ݿw9x$pkEJ Re91Q7=SJ o<[F,fZOYQ[hd KJ7B:̣ ""s32VkC!,FNFOg/Eĉk3fe ,sT ii޺a3e*{ԨBz;.fS师LLΰ4ni 8Dw}|V un{5DNћ^,48Y:Kj2~_9崴~0m{S%!⎠OFLAL6@CE,@'.u!e vXNTy}޽kRեa2jP0!VD IMI>TRǙZOIRv]]j` Zn9L`1S%H,I%~2H-#$8ѝp4Xo5]'6+#MжzJksg$Qn]cp' W9DD'%*vrVoeRs 0)vwnNDDu䜴k 3s^Z>6ŪeQk 0sJ6S)7C]s/"&ۜc GL(0u!F @Oj^%qiwaw+y".5r8HN}$P>ⓖR400IЀTXrS`wtxLWR=g"d@J*&DL)`G3n>Kf3MWWW/zڵ,pt baoǸV#\&X$D.,1s5|JsRrY2Sڲ,5ʢ:"!j>eÀRESܭ~\Sf9 q٥W9[IcbB꜓,ͮN% 2Tk)1CI9 )K޵u5 m63qou]awo#8)ݻ'%3r"=hYrP &dd@U$Z% n!\klkĉ;Q4)JLxּ{\*d" 0!~у 3G41StѸx (6h4Pv.c~M׋DpGo^zmXF}!`df-05CI ZcIhn<.PZ13T5!UT8`]-ΥH8Dj6#+ 8L 3'L4s%fg \ '6<祅LH϶n|p޲r7.{ --wۨԘWi' n2MUaS)n4tUEj_xh ($> %ːq"b!M[WdII 3kL@1YYu'Ij&L,.aښjww񰴺t,Xb0'b^{Qq z]{!YܝE 3Z9ᘄ耚̚8į^30MvʡD14}}~{1$@c̺w4di $[n)['&pw'bޏK}7q#mg 919Z!ݦx@~}KpxH^7-Ob<]%\L^k"p~[@VDID-wQL,6!zCrm}~g#aQ`.Կ!+,t" HRJδݻ[34U5b);R9yrڝw.ћ6)1h֔l޴ZٖY ILwS]v{RV }|`'Bbr? |wcυHoZ۲4ÌYܽPرq~> dy@OLVBq"]^%fz_Nmu uxMlRdDn=@CԎ݁Vk7bª-r\7w !P_E0m0^k7p-DEmS )`r?;ߺc<9'gj NHCj "Lܻ<;ߞqoZuPUKth݂Eq10m&c9,<\Zo''j"ֺ6oJbV7-Ir@0//.ݽv8$0s'߷DNƜ͆L4\{bE`cX ]; mQ++?>xow~,stltѦz?SG$!ngdΒIMsJ|<.KmPG> 1L;2 }ތw=z ~)jȧN1CbpxvSm}問#~v?6oΎa.%IJ"ESv7m9LS()=]U3PJ1t]L.sl$fh0ǽx܏/ԧx5uN,Ltllϓ[G7()!`_kX\TDrD``YFkEcȺL""8>tF,eӏ|Y}=;.X-S»çOpDXJT=`P(VNp}}kybZĵ8pk݉H7% nY=#,% աI&bjhJ?myϣo|]qJVr~t;nDJJ'6Y18̣3޴\$݃Wa̲:5 7zq-efPئq; ڛЊy۵~8 Zk{߽>o|eKUE,.vL+:/TUo̅8!kl a//K)p<\{p駟}YFdg&u魚"#ַh}Bk x}2Ժypq]%km%8 4\FOb ZUtdkD@bIКUnB9%am1wa&Rkm ew n|Gk?/:Gэɂm0b]@;%<3ĴSvZyJ2.SNi9k֚z]jқN䒘k7VL|5%9.)ZW̓T͜IZ,rN涙gU0sk̀ 3௒/F|>Mg_b 08]v*tqRΫll~R5 O̓Pu;,)\?O9Ar~);wD@ma˚E63jӵ85]NO|P]NNDK[“= ;w [}\%IN8@Z)iK.mƻ>p,F̜8 E wI``YRNS=?Uo~ɶ堪gFT%)sڴ%s?,y>,K7gެ7^y~zt]Çc׺<'0#jD1McQ m0NfB}FɈ ۼrPu1_bJ,DTR:DG|])Ww TYΙvX,&Uю!"hfހ(k )Q4RʶJ r#j[D,`sj ɇ.Hn{!_ݶhӁPR:|kHԩv };{rz[Zm9)i]"R?lf痗)At=K9zy]$)vs9m$m%4dVXpݱp'? nfja@$%@8ГAh#NZN)lP}m`߽>DBlmgDUXnβHRC͛ei2~ES_ð+hB;RJURr.i w-Z{m"ZFB<-cE/{ Aoڦig2TJ63kNvGksWuY5ZKk9v3GW<7nlKojH"8Egk/|ZOK hF q-ef% 1rSai& z.`U|Lz{toXy8E &DhM|X_ge]3 .]B=ESjY_ >}sQ9Eu= .i|9J҈W/?? EҰ+1 &8N {KI9ڛvla0Q0tt7}3Gau`(j9sLy~5k*k.'M0f10fvw^o{?.O˿[>wxK ?E|lLڭvq9<-Ҫ?wطnO<~}ss~v>GlĻλm߿V]Nr"#D[כwG @ ԊN8+" x5DJb@ +Z_9*@Mj wv4vZ\,B&2]#@nnun4! KӁ[g;uVpgA?_]}Ww~|ٟOy9^'y3s)Sg۳.fs+IHZ7Tmۧ&͘<scD?wV$ww9o6Ft?.fn~b< l>IB/$Q IDATci]HЦ,rVc+-a,4#"-9%QGUG?~^q+D{yxOSW#{p<`s˲y;ޔ$MѻZaKȒڲAR"noJuvߛ 6-ܭ)b;]nϚ~W}]ZȎU ndg3Mh--2YH݃));⸾`֎DC[.Ag; >M@XHC$ؘvrp;;//Mpg~2h֌~̃otޜhX̺2Kk4A̭ T7eY]rqIͩ\ss3_jM9MeUK zwj, ;TuA'/={[ iAoh PD6 5?]'vP@T)./b87E+Rm F//R1PwxNyXENٟ߈ _?ȢddT%&IלReq&hښ(vB폌 bx(b}C;>h_2~C>|!ԏ?zwsr0x-Q;:_wЊs؄:v֯xUf ֟~wz!f>0:C cmOQxr/tVe!,6}/_Jao?}s ]{~E_2{ޚH nJ쵶yXrkl[[m\=sXv z}M{,*?,j~R9@4 ő۹LB }4VyVBUYmXĈvxZ߰B\pxsɉwO9齷Vu<ɇ.x#w6JDàN-}ュ0K/@c}NwY_k}^ g0E/ۏ{//}>󿾼5jRË/Ժ{k"DfZ&qF䇥;4ا) X81=Tv#E#ҿۢO- YI]ICyo\уñ{m9&?7ocn{6 d*jyνU5t6I|///fܞahlM⮽߉>8Q7?>U gCK,,DS[Si rpkZ3{fvX 9_WvR3faٔ\oZy3TyvxpOܺ6&eъ(_wk{~1e5vcT-<~1mn[KqY,4,d%E*oww7lݼi7wbtkZ~ގͭ)%IbQ& m|JrnϷq$J;Ae7I2SOȻߟ,5߿pws5TK89+-5d=<`nf1"6P%7 J&F^$I' lHfL) :%Mi1nYhIZrv\J!N9qf,".M6u/殝çI@;$X3iJ)%|<G/8%3G1!D>h!ϗ*)eͧ~k|uܰ.lB0$`}3@fRNf ̽՞Koϥ$+P/UDX°zswǃ.55=1tHdimQu<2 f ņa՛ZjL̅33GV"4k{CЮ~=h[~~wГ7X-n~wC\?%ɔRbI$f DpYt5I bc[7 Q؟l3>8 NIZ{X tjI4A_~/\ﮧ3}'IK4efdfA3}ȝos (Kw*':M'Nb-vx,MT͌)̞[Hxཫxc_?aO, Olyȹ0[)8lQUMg|h]pG̊u? 7bin̸nY<=7~C,E&N 0]ZVUZL]k?vXRaj>V#QW;D%Aaa OTǝw˃D?+bJJ)//;kTݽor13s$Mr Ir|)\{MbyC}n7ow-󷾹R {geLB[:&͚v[Qk "Z맹cTi81[]ǒꦷ?xM7|ID)ЫJڔr~yqv_a+Qk Jl7@-DBx'$auo; >nw և mi,O=N$Fm_Y3v8tgÏ#dnדzgbF1ZtGXr1A Z)LM 7)f ;`ۂd.ݜ) #n:LL=;K!fs z sH4TXۊ5x+/&48H70g$J"˲D?$ >0^B V&"Bk&XV}15 ;X|4ڭ}fՉQ+:=3'$]aVƒ nN,bj*"nAD9pwb3甘< k>%? '_ ư 9*_+#=ܣ47"&xH %y*f{7,rɁ'zZ)9E̪&|\j\W> {=M_ʿg eă>zd&z ߍDSP?}9I@Hc22MuLfXBD@wg/oS"FEBp~oٖ㥤\Z>s}ꈹ}xns( (%ZiaA^:0/p*v笅~1=~]k?veY?ksΉs"22"+ǺTAab Z\h~Eė7>-ҍ>C#/%6v7E2̬^k9aωȬ{p8֞{9?bڮ@\8]O2<#TKly{x@O_l49$lCc1sia&7ѱ0 2i/U)MT-bg_)'3K?L~@ChR&Q WƐKQ#UhDSP"A=쇾 $f HO!Uyf7W]p#vn0D޾ x&0Ml3/ ']I䆤 0E _m@JᏩB>afMìB$vX'ŪDӉ)ua`#*HMFYW5OD63!UPDULUDkQ)68L`]DD[2[vǪfF[-s.u46wVU T3;$5LrӏjU rqNm'»3:ԑ9F|ws2t85Km=hH)"RyǪm X1a*R&}=ZVGD"L=5ol\䮾o]>ṧp;Cm[ED@PTxLirsoB&2Ylalk#K j3H.ÐĠm2bAb7 ~6]!ha~Ӈr)mH Ɏf8GĨj94`0@ڤRɆ8k>g)9zjЏx9~M;f  `(*$[v +&6mI45-Ȼ@L5혀ߴޓyO{!AmPkh7 BeB<-R%T++a1x&,Ø-D5xEP4 c9|.3`e7sabRͼÛW4d۶n-e3TN;_ƊDG]=PY b6q]N~A-r60(!ڶUٶn߀Ec)YwzqY<jف'rrDN `0b,4L, &19FL{WhRj?un;|8Qbe2QĶ,߼JT3͚@*ه=T#t\1L<@Į)jjHi(͖wFTT-) "r>`T&[Ooـ^zR1@bDFߒNQ W ]N'A>3_V#lC XT=蚦av9J9ÐEjV0Gx`9ƒyVT@C0ͭ,vW^5U6c;DC;bukެ,Gk$ Ri O>f\w`Sx7D7jk;IʓQ+-^DV~SR┖ETٔ6,0RJQSf~,"BlB J*ŕIɺJwsú8>BWoo޾%jWC%jS>NLPd0V/կk#$f"EJ|.J DV jĩEU,[SQip S==yIxŝ|эgvrۅznϼjwXoWw{n[>9{9Rؑʽ6&&"tm+^c,)09)9X6%xWrJCY;ºP6}&1y_r9u]35>*H8T1cBYC/S@3jC38W):Ϭ={Aի* ajRPQsvwrz&ATjZZ&/ʜA"@e6]en1 R}?2TV)E5wmڄ੆dٗb^ jv"^!~&*H1MʪfjB5[.$LFK\3ˆwDԼ51zGTbV:`UP ii@kvt۔Hm6M,HȔN$f? r^ѻH%"\0чjb:9܆h[)B]5B[njj;d:2UrG{NRik;m,hD4SqPJP!B4mlM̀[_k acICAsyߏCE@bvALD+Er`0#VV"vDyL9UZ1]s8İ9iD߫<۞bەc@;"w39=bpUU!ƦRvѶ1Rn ZWb*6j`E.u\^i}=R@9ȡOjUFyO+k8 l}q1ŮeuDttxH9o C߯발¬[7Ǿo Xupm\ʓ3$7ڙpK&e[BLp *, 9Wc};v!2;0,sN4 cfeז\49Ib%Y✋Ȍb"̘JV5 UDL8`1w ^~wi(]\cC8{( Mh!rRD㐔 X b]g}nfal{=:/7lPWPdL {24-9!UG$&%J} +V <vp;HKWۘDz0&fC.l"wiP2T8Dݐw߻%||i!$Tfɨy,2Ŷ bZl/6kpDgLJ{8?e}IP].(\Jmˠ~@"vAdRRlӊZY=9Img0cG(KR !XYƙ )7Fx>Jqu i3fOqIKۆU/Upޞ]<m6_gl xtp'@qc %C4rzfZl8wa||77^qyxrܶ]T] ktm_o; iۑaz9aFqQVi]`Qs" +by|xq8[\7y9>'w̛MG p4_DZͺ / Y<j}`l_?>Z)_̕S7_?Gⓟ;syN?ꝣGǧBTyfP \R% 0bީBʹ`eײ p TT0PèHQJ-H,RJ0kAŲEJNdsq^8 $X,$\LJ)ȵ̤\(B< 3a.b҃mwaD$*WdUj 5lE*%G&HV?`R98$*Z*bX/_m..NMoy;~+s|H9_?9z &Lz7K`zce>C|FbDv1m64yHߪ*" @0z#Bm6Vy!/杩4x}I.^C]zL jL(tzTЊ"d_2sF%dd&:},oo'o}+C>z5fa> w{7Cx=Zέ cz.20N@TZvE&Бm:omT |HSJ$ŶdsU'n%$l(9 k>[n8v>K{Y?̼[K*"mh*InwO_1|n'^m-iWo i^vo8Y88;{oϟ67=\.\Ӝ]}|uy5QXp]{?\. ?+i;/6tٗm\Mڬ._X,16vn-rv0ؓ|z/Ԭ7^X~x̍g߁+fAp·H:yQ%y3'4g+ZN` U@S@ bUaL}SJLܶ흣;yIycl6kf Lѥ 'lP-Jt0N׫Ag'}EQ o];mk=Ri,۰\tA1{ "5B* =8`T3rĒRNP!}΀|Hvh\RF`1<,g^%kC}Y%sd C2wr]ج6 r!)JڈdH3B( >?4﷞5ݣM߿gg}8>>9]]{FIe2FsɋLJ~9zu`_7 =y{W ib'W#XY! uE nޣw!;\/fΔ;BDחZdۓC0񄁠m%aOܻ{|ݣ7>ÓǗMy\شUnv9-y3$PJ{o{aƏE<;oi8ϒ<2MY q31eʹ(f5n 7{8ԛ}~ٻO/ f1b?w]ـf>arՏ[f"#hNT:OT_ m;b_01yDIc+ .+fؙ"d~A-ۤɩ|xx|guy]bh.r~|x[ߔԷ_]G.\xxsy1C_"#Z"K{k[& I7\+Dl6uιh-_T;a5 lW }]<}zuuM1c RC?,b8: D~s~=g>6;w$(Tle۽pg/=sXc dju 1o ֫pHb wӧ{6"*0kd ,Yȅ0})i|>W6jDֿxӳG?iL @CV䒵3Yhgl<\6f3^&GO}}_m כi@3ޢ/ "[%6ȄHClOjozr-w`%xߧr%<>; f2$bFHM׎CR yTu@~v <+;p`)eB=u䱌is3oJb-!l3AF|!QZdӢB5]΁]]^heo}>I]>Lv \:@ر:椄*j "1I l(]6c )WJv1cuݰq,n~)g%ɲxbpKIDAT~@޻ZM Y ",fbU1P1tH`R΋'yWɺ/&ydž|m'F?ɏ3ظ-" [#"\\\5Mj Z}IrW׋-GS7[`./ׄpt v֭פ4 };k"QC }/ߗO//oV4DSl6f _?y_m?+_G6*rDaVՇ_r?ӏlT{!^sossfۿ>ӧOO>OگGW~峟2|K_ i/?|W{K_~ ~~#8o׾q?T_˿}77OG9~[ouppQ]1{;|C-|ѣ??߻wsuG9@G6*?9C"xH{!BX,>OV"V7Q_'>U_Ȇ?ԧ>ٷ~^e/{^e/{^e/{^e/W\3IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot17.png0000644000175000017500000004075414620351225030422 0ustar00hanshansPNG  IHDR65fsBITO IDATxyxTy?mf4hw Z$@lc/Im'n6^i~I۩44m4qj1 A7$@bhA+5Fr H0!;wG{}_B!Lt @ @~R`BQ4@ ~iHa@)(WE;Ե\Z:u,tS,Bc,7F2 >~^z%m(@\dC|F: ç[pW}|H"P }ÿ乘k H-xPp#  !l{0~E_ v-,!s u>y>_t&dxK a\ejϗWAkJ!k1+o~ڪ`Uyep z v|\#߁&Ƚ җ>!(@tEpeHEdOw{Y8i Q 5 7Rc%|t%nS<un  x^LG;2{t!4 ?`CE[>UQ3g j, ]^|pV|f-MPU :O~%W PPH)SPR#I0\ İ۠ X $PzAS: ԃT)ޔ !yƦ/eLXq! 3zu>;2Bhl*ЈEچb+eR7(q ëqtox WЮ3)epFp2/ }({82G(ФWOmO_֧^ Ҹ,O~0o'9"wL>i_-`k@ PT V Įm @j{:K`m(nsU7o_ Mv {_{;OP[x_#osEG2{<,WRu @0Q.󿁘U T4y40-@ X:h ;^HV82,78}Mo Ő "@v`~}?B%pWBOZWzab]6Qc:WAHw)С   ջ|~ ]B޽ >x a]>p`2߃ȹj#8 019@1X3`KqPxZpȆC tw@AO%cQ {Nx4qж~:vs@́M-4Ao@N΅πh(Ix7+Ahi07,X ^'_Pwf? v} Rᛕpuh; ۿ tv?B/&S a`=/Fk ' wA^]4Ÿ C3Y !"_a 4  ~5z= *ö'.@8. J^xqa/ cʀU?c߻/!tc@j_)˹}P}*TpVRTu>u_%YwyAh^OW? I3=zZaAAx}qTê"'8?t;Bh8{̫‰QnHNa+k4Q93+KHkG 0`r>~ʔ)˗/444,Xf?~tgeeק:w^պ`tJikkd*//4Y[[[듓u]$oEСCN>=>>СC燆 [ݨ,TUUEUUUU@Ӵ *I(v7 ---+VXlYVVֲeV\ܼet5klݺVZU]]zqx뭷|ͅ FEE8pĉgϞӧX"++ɓV"'|+6mD)+Wܽ{joo_lٶmDQ={]/WQoTU5ͪ:FM?,~Jŋ9EJJJ8니(++[ngnnnf _|QUը̒;SdڴiSLEرcsERʮj5&!>i111.mE" sٳg ^\#&B-))f΃((f]Y/qF) &  f!(Vv요c󚚚>㶶e˖UTTŋnfx,**0` [TxI5vsNUU(999t]z+W,..fp8^/ ]t:mۖ`-[8wܼy0BQJFYFVk$IAP;88|#G8NV<< ?RXX8wW^y;8tl1cƌ34MϏpEEQ\.ŋ/\ߏ]TBc`v#bu^w999+W2eWX!BAAALL%%I/~aZy/..~뭷l6[JJJ[[[uuidYu]4]׻}ݢ"X~c|B( vZ^^>r 4x4Q[[c2Y_(SJԤ(ܹsN(Y JiTTC=(zG_ݐ!(&i…_kmmmmmm!mmmj6771A׿mhzzzII(DZ+`2AdYE)(( Eqɒ%}}}7G']׻bcc|G(5my~``yCY^͍jf-p!4gԩSv۰ <^SUn;yd{r rBBBP-b7 !466ZXX8ri؈̿#B$Fil㝘hiyL.Э! B(`! B(`! B(`! B(`!ͨB/UUBq\KK'|']d2G+1t!8ndwQm޼51][ZZ֮]{?4..b/2W·_b5 Ճ~3[1!!F5V8\E__XGJ(7nqimmMMMeY>ښl0z{{{zzػndeyYpr:;;%IJLLd)V5,, B,˭jA:oM4UUYwA85k!d2n.wޑ$W^a9OB[l1Lj{{8{7$I|׌FK^~吐˗/<ܹ;v8}tww7;7(aѢEgOӴ\A\.WLL5kVtttIIh 8X~}TTԆ t]?rK/TVV6geZxć~RZ]]=}tC={vIIIXX!l6gdddee999f7ވ Zk}>ZYY9X))rpp0%%ndff1Pu]$UU$I:{lxxxiidzgNUUmjjjhhzؑ'JiX&fsݔRY].WHHȌ3چ5Rꫯ DGG>|xݺuV߷=n߷o_AA󭭭C=Įau]7L!!!gݺux1J-Z4=BC|8&cw#+`k;ؗ7n غE .,\PӴd^owwnxgϞgϞE N:RZ__o4Ffknn kllljj-,,NLL4 Νc)Il})r3gf kF4mK< /.Xkܸ֕q#^vfeevu}ʔ)ymgoAX4ubUX$Vҿ{/h+^2,jٞBzG֕F?*kQjkkX aoy9:|}}}cc|cMӼ^;?~\۷ ^UUrӧO pٳ}Ǐg+._\SS9sK-!n]g\\ܰ-0>{zM˗ҵ˹1477XZZq˗VZjժ͛7˲y}-][x !\;ySDQ-**2L,8zoEQ$?퍍={vΝF… <_pa&  q\RRҰb0|,sOoo/ki:]ѣN3t]߾}{TTTbb" ]**b6m6 {ikk8 gYt]g{rаdɒ .Bl6[zz f֭;uTJJJBB,ebBBB$I!X"4pv#w_vPVR@000s!DeEQdM$x"""TUe}4o"f0tyϷ'-en/!4'N充8-*EQX>7y &v4M$I$EQ؉}&÷'BARj2͛g2Ƶ~jccGX,ػ!4^gxñE7BFuހGB7.[E5P\C5P\C5P\C5P\CQ7`U1|e{,^{Ǐo$I^x݄Hm6ɴiӦW_}u```Ν&mmmM !4VWpX󡺮'$$DGGϘ1#---,,0''W{$֮]rVG2ߔw}u9s˿/700ԔE+BcuWIg\SUuܹgzQQQsqF1%%e!8N*rxxx__M&Xz ㉉e9)))44ws!!DQF3l5VBv{ZZi u\(F1!!AQQٽ3,geeuvvDFF^xd2uww!sg/---^UUU`4nhiZnn+++ޅ nڴRz:uRx瞭[H IDAT yЂUUYB(zҥ4vSgؔh~V <df(dDZE(:Y!4ϟ֒*p p6#zVVփ>8} ,p7˨Aw#O!nQaf!nQ!l0Bs !l0Bs !l0Bs !l0Bs !l0BfxE*O#n sgڵ=+_Wbcc!& JKK5kVQQщ'X=՚;00fff&%%رboڴ୨ǫ RSSٞ{5 dan… |MsY_8"nQ(Ξ=h4tRM4MX,8CFBhMLLzmmmXtC=TTT&L&(Iqqqr0BdY.-->}lu,<[,򨨨X^__Z^^~fa"&##̚5wk*Nbx/--ذaCuuuWWi f944]/9wEW; XDDEEIt}YK*㺺TUu\ݔ)S444ьRn4}[[[M!… SRR:ڸ8*::Ο?Ŋaaaٷ~fYQ46--w3j?78Ȉ6t:7n8VUU8sLM*++Ey~eee.k…v=<<\愄a2Eeii)s`}Vñ`^ 9KJJ=(111555-bmZq[,++<:' (^_9 C<|!k#p7d ?2 a6F~{wH y vkފ1fffBhg]{q8|!49:Ea=P\C5P\C5P\CQyxWE 8tp@w?`/=@TYVU !45 #q!9#s#BFhCMs qs"Wp_B8*l6˲|O!0<(sB[D%mCLjyVRINW7GC}yyyJqqlՙEw ~Pj2i9da۶m XVu#hooe955|a$:BA)53gY{ĺ\JyBC8bMřC,mfo T}(j:\l<ϟ>}z֬Y6lp\$UTT pᢢ I>m۶ HtI'BuyxyHWr.h hTQa5BHwwwbbIMM:w(.\:sTUU͜9s͚5]]],x򁁁7J؜@W{4V)|,"8_cTrd]ԨNUUUHJbMKKeQ_SMu4]1[BFUMWu++._O C !txkdj:t8tmU5]V5FIr!4"NRSRTSi:4,IeȚ'nh܀)B6jDo B(`! B(`!u{8!Px7G8xz---7B/su]nrC2ܽgwjjjrrF5BR.@M">o'\:7?Go_O|l6sdIi#1aцKf:^#<֪B[P=K%XWxIBXDŠ*RBR?/Jk̒bcJvT=gWȓn4=92V\\4V-RӴa}X1pwe544̅288pwyollĉkx"$11?Ӌ,Y >]xb )*33|0{o'gLYyp{" /m/I޽{9kkkKOO-,,,++`yC=c{\z,cɲ,Ii!,,ٳ3g<}4q.]>VuppP+>>uݺuaaaIIIwuWbb"A((QJ=rb K8 sH92Ҝh MMW~*xz\frRz\\\s>kFIOO_r?,DEEm߾;8ydFFFHHH___gggdd(o|>(++EԩS)))IIIǎXz#| 222&&jFGGbqlNIIٹsg^^^ll`l}'ӦM!BGQSNl6Iq5㺻<7wZ{V "pR.2qy=Gwt~c{TTPз8(lr@4A4M8K)kcUUٚ ̀oVo>u'[>]fIkLOgBckRG$#?9ߵ)K)96Zx]MFd4BhRN=%y'~̾ŇOY̑0I  F+|ƞG5fev<Ϗ|0Wq\iii{5uuu 3fw޹;wUYYi0 !LLL `  4-22ŋ<?~O>ܻw+vڵsZÁˌ%>PGf_d <'M}3@V/*pˊ$ dz qSJW\yСiӦEEE $ÑmZ=OYYYff5kve283gNyyyYYܹs ! ǎlhhɉ,ҥK~6EQ)R:uT7::zٲe555ӦMõxX_iӦ<<s?m|`ݝ}. !>sK.痕6ͦ( kb0l,F#(rnnnxx8q۷o?rddY7f$ʊr3~FiDDs疾?NkA/B xÁ]BG~TK+SEBBGNBN'BhkW.\0zý^! h9`IHP\C5P\C5P\C5P\C5P\C5P\C5P\C5P\C5P\C5P\C5P\C}BhB p':P HkIr{*~ 4J%i<}%hrʮ\KG`6bxyPpMjN)5Q]N\/nذA 6\x1>>~O?;}tyyyyySZZZrss'mڴhIDATr/K/4ѧs}JKK~iߗO?tii_7 -۷o_jD&MjO=TMMMCCo2&ٳEQo~F9sLY]/Jhȥh\~׿8'JII399yB}N`Mjw}wiiܹs!rm>x_lo?zԺVZvM6>}eڵk˗/g[߿k׮=q\tty q>ƍ;;;oO\_~uuu/Du{SB!B!B!yȔFyIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot19.png0000644000175000017500000004075414620351225030424 0ustar00hanshansPNG  IHDR65fsBITO IDATxyxTy?mf4hw Z$@lc/Im'n6^i~I۩44m4qj1 A7$@bhA+5Fr H0!;wG{}_B!Lt @ @~R`BQ4@ ~iHa@)(WE;Ե\Z:u,tS,Bc,7F2 >~^z%m(@\dC|F: ç[pW}|H"P }ÿ乘k H-xPp#  !l{0~E_ v-,!s u>y>_t&dxK a\ejϗWAkJ!k1+o~ڪ`Uyep z v|\#߁&Ƚ җ>!(@tEpeHEdOw{Y8i Q 5 7Rc%|t%nS<un  x^LG;2{t!4 ?`CE[>UQ3g j, ]^|pV|f-MPU :O~%W PPH)SPR#I0\ İ۠ X $PzAS: ԃT)ޔ !yƦ/eLXq! 3zu>;2Bhl*ЈEچb+eR7(q ëqtox WЮ3)epFp2/ }({82G(ФWOmO_֧^ Ҹ,O~0o'9"wL>i_-`k@ PT V Įm @j{:K`m(nsU7o_ Mv {_{;OP[x_#osEG2{<,WRu @0Q.󿁘U T4y40-@ X:h ;^HV82,78}Mo Ő "@v`~}?B%pWBOZWzab]6Qc:WAHw)С   ջ|~ ]B޽ >x a]>p`2߃ȹj#8 019@1X3`KqPxZpȆC tw@AO%cQ {Nx4qж~:vs@́M-4Ao@N΅πh(Ix7+Ahi07,X ^'_Pwf? v} Rᛕpuh; ۿ tv?B/&S a`=/Fk ' wA^]4Ÿ C3Y !"_a 4  ~5z= *ö'.@8. J^xqa/ cʀU?c߻/!tc@j_)˹}P}*TpVRTu>u_%YwyAh^OW? I3=zZaAAx}qTê"'8?t;Bh8{̫‰QnHNa+k4Q93+KHkG 0`r>~ʔ)˗/444,Xf?~tgeeק:w^պ`tJikkd*//4Y[[[듓u]$oEСCN>=>>СC燆 [ݨ,TUUEUUUU@Ӵ *I(v7 ---+VXlYVVֲeV\ܼet5klݺVZU]]zqx뭷|ͅ FEE8pĉgϞӧX"++ɓV"'|+6mD)+Wܽ{joo_lٶmDQ={]/WQoTU5ͪ:FM?,~Jŋ9EJJJ8니(++[ngnnnf _|QUը̒;SdڴiSLEرcsERʮj5&!>i111.mE" sٳg ^\#&B-))f΃((f]Y/qF) &  f!(Vv요c󚚚>㶶e˖UTTŋnfx,**0` [TxI5vsNUU(999t]z+W,..fp8^/ ]t:mۖ`-[8wܼy0BQJFYFVk$IAP;88|#G8NV<< ?RXX8wW^y;8tl1cƌ34MϏpEEQ\.ŋ/\ߏ]TBc`v#bu^w999+W2eWX!BAAALL%%I/~aZy/..~뭷l6[JJJ[[[uuidYu]4]׻}ݢ"X~c|B( vZ^^>r 4x4Q[[c2Y_(SJԤ(ܹsN(Y JiTTC=(zG_ݐ!(&i…_kmmmmmm!mmmj6771A׿mhzzzII(DZ+`2AdYE)(( Eqɒ%}}}7G']׻bcc|G(5my~``yCY^͍jf-p!4gԩSv۰ <^SUn;yd{r rBBBP-b7 !466ZXX8ri؈̿#B$Fil㝘hiyL.Э! B(`! B(`! B(`! B(`!ͨB/UUBq\KK'|']d2G+1t!8ndwQm޼51][ZZ֮]{?4..b/2W·_b5 Ճ~3[1!!F5V8\E__XGJ(7nqimmMMMeY>ښl0z{{{zzػndeyYpr:;;%IJLLd)V5,, B,˭jA:oM4UUYwA85k!d2n.wޑ$W^a9OB[l1Lj{{8{7$I|׌FK^~吐˗/<ܹ;v8}tww7;7(aѢEgOӴ\A\.WLL5kVtttIIh 8X~}TTԆ t]?rK/TVV6geZxć~RZ]]=}tC={vIIIXX!l6gdddee999f7ވ Zk}>ZYY9X))rpp0%%ndff1Pu]$UU$I:{lxxxiidzgNUUmjjjhhzؑ'JiX&fsݔRY].WHHȌ3چ5Rꫯ DGG>|xݺuV߷=n߷o_AA󭭭C=Įau]7L!!!gݺux1J-Z4=BC|8&cw#+`k;ؗ7n غE .,\PӴd^owwnxgϞgϞE N:RZ__o4Ffknn kllljj-,,NLL4 Νc)Il})r3gf kF4mK< /.Xkܸ֕q#^vfeevu}ʔ)ymgoAX4ubUX$Vҿ{/h+^2,jٞBzG֕F?*kQjkkX aoy9:|}}}cc|cMӼ^;?~\۷ ^UUrӧO pٳ}Ǐg+._\SS9sK-!n]g\\ܰ-0>{zM˗ҵ˹1477XZZq˗VZjժ͛7˲y}-][x !\;ySDQ-**2L,8zoEQ$?퍍={vΝF… <_pa&  q\RRҰb0|,sOoo/ki:]ѣN3t]߾}{TTTbb" ]**b6m6 {ikk8 gYt]g{rаdɒ .Bl6[zz f֭;uTJJJBB,ebBBB$I!X"4pv#w_vPVR@000s!DeEQdM$x"""TUe}4o"f0tyϷ'-en/!4'N充8-*EQX>7y &v4M$I$EQ؉}&÷'BARj2͛g2Ƶ~jccGX,ػ!4^gxñE7BFuހGB7.[E5P\C5P\C5P\C5P\CQ7`U1|e{,^{Ǐo$I^x݄Hm6ɴiӦW_}u```Ν&mmmM !4VWpX󡺮'$$DGGϘ1#---,,0''W{$֮]rVG2ߔw}u9s˿/700ԔE+BcuWIg\SUuܹgzQQQsqF1%%e!8N*rxxx__M&Xz ㉉e9)))44ws!!DQF3l5VBv{ZZi u\(F1!!AQQٽ3,geeuvvDFF^xd2uww!sg/---^UUU`4nhiZnn+++ޅ nڴRz:uRx瞭[H IDAT yЂUUYB(zҥ4vSgؔh~V <df(dDZE(:Y!4ϟ֒*p p6#zVVփ>8} ,p7˨Aw#O!nQaf!nQ!l0Bs !l0Bs !l0Bs !l0Bs !l0BfxE*O#n sgڵ=+_Wbcc!& JKK5kVQQщ'X=՚;00fff&%%رboڴ୨ǫ RSSٞ{5 dan… |MsY_8"nQ(Ξ=h4tRM4MX,8CFBhMLLzmmmXtC=TTT&L&(Iqqqr0BdY.-->}lu,<[,򨨨X^__Z^^~fa"&##̚5wk*Nbx/--ذaCuuuWWi f944]/9wEW; XDDEEIt}YK*㺺TUu\ݔ)S444ьRn4}[[[M!… SRR:ڸ8*::Ο?Ŋaaaٷ~fYQ46--w3j?78Ȉ6t:7n8VUU8sLM*++Ey~eee.k…v=<<\愄a2Eeii)s`}Vñ`^ 9KJJ=(111555-bmZq[,++<:' (^_9 C<|!k#p7d ?2 a6F~{wH y vkފ1fffBhg]{q8|!49:Ea=P\C5P\C5P\CQyxWE 8tp@w?`/=@TYVU !45 #q!9#s#BFhCMs qs"Wp_B8*l6˲|O!0<(sB[D%mCLjyVRINW7GC}yyyJqqlՙEw ~Pj2i9da۶m XVu#hooe955|a$:BA)53gY{ĺ\JyBC8bMřC,mfo T}(j:\l<ϟ>}z֬Y6lp\$UTT pᢢ I>m۶ HtI'BuyxyHWr.h hTQa5BHwwwbbIMM:w(.\:sTUU͜9s͚5]]],x򁁁7J؜@W{4V)|,"8_cTrd]ԨNUUUHJbMKKeQ_SMu4]1[BFUMWu++._O C !txkdj:t8tmU5]V5FIr!4"NRSRTSi:4,IeȚ'nh܀)B6jDo B(`! B(`!u{8!Px7G8xz---7B/su]nrC2ܽgwjjjrrF5BR.@M">o'\:7?Go_O|l6sdIi#1aцKf:^#<֪B[P=K%XWxIBXDŠ*RBR?/Jk̒bcJvT=gWȓn4=92V\\4V-RӴa}X1pwe544̅288pwyollĉkx"$11?Ӌ,Y >]xb )*33|0{o'gLYyp{" /m/I޽{9kkkKOO-,,,++`yC=c{\z,cɲ,Ii!,,ٳ3g<}4q.]>VuppP+>>uݺuaaaIIIwuWbb"A((QJ=rb K8 sH92Ҝh MMW~*xz\frRz\\\s>kFIOO_r?,DEEm߾;8ydFFFHHH___gggdd(o|>(++EԩS)))IIIǎXz#| 222&&jFGGbqlNIIٹsg^^^ll`l}'ӦM!BGQSNl6Iq5㺻<7wZ{V "pR.2qy=Gwt~c{TTPз8(lr@4A4M8K)kcUUٚ ̀oVo>u'[>]fIkLOgBckRG$#?9ߵ)K)96Zx]MFd4BhRN=%y'~̾ŇOY̑0I  F+|ƞG5fev<Ϗ|0Wq\iii{5uuu 3fw޹;wUYYi0 !LLL `  4-22ŋ<?~O>ܻw+vڵsZÁˌ%>PGf_d <'M}3@V/*pˊ$ dz qSJW\yСiӦEEE $ÑmZ=OYYYff5kve283gNyyyYYܹs ! ǎlhhɉ,ҥK~6EQ)R:uT7::zٲe555ӦMõxX_iӦ<<s?m|`ݝ}. !>sK.痕6ͦ( kb0l,F#(rnnnxx8q۷o?rddY7f$ʊr3~FiDDs疾?NkA/B xÁ]BG~TK+SEBBGNBN'BhkW.\0zý^! h9`IHP\C5P\C5P\C5P\C5P\C5P\C5P\C5P\C5P\C5P\C5P\C}BhB p':P HkIr{*~ 4J%i<}%hrʮ\KG`6bxyPpMjN)5Q]N\/nذA 6\x1>>~O?;}tyyyyySZZZrss'mڴhIDATr/K/4ѧs}JKK~iߗO?tii_7 -۷o_jD&MjO=TMMMCCo2&ٳEQo~F9sLY]/Jhȥh\~׿8'JII399yB}N`Mjw}wiiܹs!rm>x_lo?zԺVZvM6>}eڵk˗/g[߿k׮=q\tty q>ƍ;;;oO\_~uuu/Du{SB!B!B!yȔFyIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot2.png0000644000175000017500000040417414620351225030334 0ustar00hanshansPNG  IHDR65fsBITO IDATx{mWY'=Ƙs~>9 $$򸐶}` `7냦 ZXҩKth v!BD@뜜~Zs1}>{srNmUk9so|-@b)ƶ><ݥoxm3;SL=r=W fg2cؿ72czL7:{}{|xl76+ongggweYK_҇>!&ۭ??Fo|?OUURo%)7n۷OF;5<|!x}ryyy0w'ջᄏ?kkwqv]FDo;??|+Eo;N1)OO;wn.^su#|T{{}7C=|.--x㍯}k|Apnӟmz؏?~{^o?| ox^W/??s[~677w񖷼|4'WĔצ؅o??>?r~\Hgs$Iy)slTE] B]  bfLGn@KJL["!E F3*!@5-=Wu{+Dbٕ5ȽL,j1U"Z,2wc%pu]#(VU uT#&5PUh2!%I`F1S0 "5ED@t]:U-bsCB.s1%Ǯ:Of LSQ5WywDՅݖ `mɕĞr *G0C#@jM'520|䗾8>1RL"*PTE0D4,>wS۞m-϶\G+gbp~}}es:G @ =Zo]sh;ɵsҙ||qhXˈ1hp8ebB]Wp4ϳVgk͝tZZm>zj^n+뵼$ڿs- c3l=^vf_:67ęNdͪ`#<;n/}km'^u,N=ǐgtF]Zt_ 2IIU)b;+CmxjuøŘ,ZYVg:)cγo坼0E^?0[r5V6tk34|| }\/|?ybŅvVD`mu]aݖ3+a(d|՘"oqJd+qP8%KIАw^Dر)"&BBD5E @fU/ڿqaϞ:@V䳭|țƀV840N=?7B,w3Ks].>q)vhg⥄ˈ[xQ՚ؼ%oB,(tQlLqc3@QM$ABk# }eNم٫Pxc^QHnl/:A6#o֑x4 펣\Ge, yToH2|OpqP 6$B@K"hNRJ"S:TI*bB'`!,qq0!a WQgUCr)b]<,-,wﯭ\n1͎/zN=5!zʒ 3/=c_{,s.CĘ" w @U bIuI"E)ǃRsDXVo;4<{e H!&IJTP>!P#^^¦F-1.8{y M4Ͼ.jnRoozsO˪p*XƏez 1wu2Q!"Qu"` DI Q5́7p1 XJE4}j|3T4 ciHݥCE[3)g(D0/,qo#/?b-Ϣ1J<U3Ke[e6ymϵğ\"˘TlV$qKIE AMSEQ;׼7"ic@rf.<*[^ BrodlfL|w$5ӫ1Y+y~3ʲ;ngy|ܾT&4{?#LО7ѬQH'?ç}}M~;Ų= ĔpaDe2 7Cxu~:w`E4 -`18_W }9T8K km8VAڽ<˱rr" H h%$i$Vl8Ntb@$DD$$XH3kṊ#Ve)A)vs-v񛏯G& H ,$$$RUP?5m-./-/XZ:xbTn,͵Cecê:Kv]8791,ːy11vUs%+7g@H`!F33Q@ fBHb䔬R:%%(b " ϋv)r4*,Oָ.Q5ݹӧ*nVv&2&2$Bd"Ȟf7ƨSO QlfFD&jSEB5+l}0(^3 ޹:f $SÂEL)!3 2!*0y"RI.@dC0Coj6~FUAT-nX\XZ\Zyfw칯=hd-P(/ם1j&2D=f,a9j,0Y T!l"#"V30˘fUw65:!j-"cSRZ>VzzUƖϨ3ޢ[*ZE.ӮD3] ,N{;ilS1_;˞;^d ɨV}}:0B<:|uWCt6w|o`8¯| C:P- 9XƾѸ\]mZ>o|[ˉTRM=ѬV,0 Fyr~\G,9OPv8sEC!TsDDJ7s$VuVV1zhq/\oA0՘3q(C v[3Nkx!"Y2>3kj `l\*_#;F034@d0&@ ٖ:fK)*"IUYbhgrDs2FPH(J0P(e]rd) 5 !FfF!ldz u B{؈Ho%3S'NruY[3u&V/_7Fuwh$4^JU֜wHA ̶| &9ff93A4R0[jlQ͑FD Yo~3}  NhfCkˇgcٞNϨ]hjZcslenoa[Jռ%}.۰yr/HB=`[(C lfi_}!1 F Ѭa4;EAfMF*HD.VX0ϭ-eGiu^aTյƠݛ1$PV/+ZbDCYVhonVUϮ<@$h@j<ω9`(F֌SS IZL4aH$9gBM3wC*EgvkqiWF?$0@&z3ēՕK!:gYxMs1Y0SEDv k"$E1Ef&R@^Q'%BT) D6e檪 Uc*6BcWV"/Nk{2F:r׼6s<Chu\h^EaHeU!ͲTPVu@D&f$cAF44 "ՈHDv{훛vO?.#C?_*쉔/htU7 o99ֵ$uhʹLj B U\׾X/蒻8no_C.,`^ m[f=%i^ugI&cQ|%Fh/8/F3s_ l/jH) (ppn0x0Fي,!bof ,UF,,˕3s0>q'ϫaQڐ{5T0gf$3$-̵fdn(2TѢ""He缘pJ'bI&=:ÆT|:ѥH ,^QzT'Qʻ9v~6ko&S@$$Q1$j# UˋD ijlkIMD[eUhbF@8Չ\b;s!sQۍw g I-:hךJBNWo.tOJ"I @H)"DDeڶ; 2a"0jsrm\Sg7'9WBvz!\㤀&u 1pdljH 5"33+A @E@̴\nImllĀ98{d fx_U~a٥W[ھ3<믏WW6}-u|Q$2 IDATOmeq%^C=|14= 8\B\˸ZGm(0mwV>`"[9zw[/?ܛ>p'Q=!wZVGe-\xxpX!ZG9 b l2!(c͊|rmwhn暛^o*:4' euǮ>ʦf; "j 숄]0U4#DUr]9!م13DLbN-eҕA6GԞǬ3a(DS1 !22sCKĹp$%%D T1sӉ PK&)\H1$$ܫЛEDnǕaF[9 YΤ/ĭo0@%Cii20wqT+E}kqMș2  8b*ѫ 䛶D,R8QVUU'qdݶZjЬˋ 7OuL,~wp`ϱӰIi0oh,dFaN*jfb@$!:eDk29J vxi&Zut˺-hp|Թ*DDD33bF%CjtbBbF['ΞqҌ CcdPJLWYV&&R09v&IP 7bl T Vjb5E"Z4,\ (R!us1`o)!ƌ!J) 'Ad;V$iQ{ pWij]@4mh%ŔjAkJ\Я% ˀ<׋R2$bLe9̬Qj̊\T̔jb"&Dhb֌WxPmZ`wbqRȤ t@C6V<s:͓`+wvsm4 H@ Tҁ{vnF=.t3[7ʆ΁+P^|q@hhwz_CgD>OVcCVXg|#iYJ{h{}_CL@,yvQE$:oQ8aY ];k6N|QLԌTRaTB*J̍(8)*^S*8 336PM"4[_bj3R %AKΘ[Ď2ך"av:on+ou]qRD&n#I$ԩ s9t "KJ"e>bU4wCެhwY1^QY)2ȝLZNIpb"tE,5mXMmgSʰHʰʺUq#ÁEHĩY̔&F%B 30,/shL |AsL&`٩hA@F*fEh0掰R4cKh8bd*zG13#:Hm}''رNM"^>O [WYr}ڡHLj[*O6 TKmpuTYf٧q)FqT}ǤE;*YJĘp)9y Lg1'Бׯq$3ˁ0*PFqB斗|Qǣ0G1^vX}*AQ:X%&uz\ozvio3{гKr.%?dos-"% _|е]~ N=rmtg 1K> guhAGF`B2c`DYas3Vǥh\@hGSQ Qn!;c䘧SɔhCWݐid☹=9Ę$qv~αZ UL ֦Nct! bJfH>vlidUUlF:;hB 8ƪa7@ !tα$Icr\ΙQCgg3bB5xC¼H1䭎ׄ)s c0C] ALXa+e9:4fjKGC!7_n옘]yBbuẃ_~Սqb*Ǝfvͮh1ϼbyf>_3383UHDcT3IL` z3s>v๵uGͅMB,벿IZ3`< 0V;˻ƴi :K?R3`$"#ۙǂLioWo x^.fP@\ww|ߏz/~O9vUqd<"nk\!Vf=$bP$ (hF.,k%TZ즙b>m]EATL(\9Q 1:jUi!4C74u{u(iZ a5jm;Q, /EHE1F4$0m͑(mO*Ƥ[c&;Gi|TcA* 'yU5RDf'*&"x_TU ;SP u`J^Tsj=g%tMv!f:_ fJYTa&,LLԢDLARJ!˽wNF#FS'hT&l[s+ ޶]`H06r\2%WܵWyG!%r#>'7d-T0f"U5Ju cLdd%ɟAKZ 5{W}RUPZ5K7}J(>`Bìg5[g-F xZ3x* t"I( k}o;Ŭgf@\D~nߎژqUЌ]i.HfG}SLk3RDD5#_ύ!; qbQT9 HR 7\=x'>c$T("fj\ t٢ I #W]52 E,QVס4Qe*Ϯmb 8.v+ |f TR&%5RIAEvF&*;n ",fR2v슢jXX>{``̄՚T 7{NΝ>=91FPsUĈwD$)cD4UM '.jȶuR#n.s !<@}@s4 dbc6BDhѐ5m3y^1Ϸ-D!ZJRשӧW>OsEDu," |>"2p-t=vD8{&HH8uQc&IRUp9]Yy3UZYYRGܬ:"VT:UYUwslBJə=e1z̚h-cQF|kZl@gAU ;g붼?qd-&j` fMA&-y?sf=cl ;31 9H"QD"iJMR@jLq<gy> iL01>TU=jɬk)fyELvXUQGxY@` {M/sڛX%a6sF)#ZlR lj!- -h_i h-Bl5bvWfMYY1Go9̴#|jc׎}6srVO|^@Eת 挣zV}=c!s!"ڲ_:! Drąw09Rc<9 pwg:}/MMض۽[Lˢ9u}Ej?o}!]E<Q{n lVfuL$iƿngN73_vznMWs t45QSS4%P]kjݵm ;~r!X97شh\Ly+J.uq2Zculƅ02e!"d^$-Z;2ppТJPEY9]\ ϾY5~>3n5W>w :޻mDw}k6ج0.BDMN  *40:J?BwOGm]S iR9!OFU #r:0Y$ff\EPTl5kg7lٴSr՗]`)(l=߰~g>=}V~L͆O 5$H)j$)B)#3C&S[Pӻww*jhL"A 1ؙ YlUQSO7 ߭$DO:Uuvrh=S1m6+UpwZB`Jc物k;Us/ш" #~a.Oɸιk$15^<0rȹ;_I:f_Erჳ8W64PeBsMĎ)r۶9BѨiz * $3Uc島&m/3<1"Ɯ* һ;.lul\}+vwwܾ]",A@[ޱ\M;EVϗ_S0MI;$+@;y5CT_>>fF9)+fO?~j_~y0ܝ5_,?\hDNqYϋR}9r%è\ݩalQg 6 Ao*:mܥE1ה/\Wr]7췅 U!h!j\ I9QaUS3 en=)gx4}qX4&x6* ڞk'8KW50$&C#@d2PLٔ!8)Trf ĐAPףb4DBp˶#Ћy 6*KXT`WX4޲rJ*D`J:h!Vs{Kc6 ٻ]lEXmugm̆;ȁ)cO~~}u׷v'3F۾1veU.VRVE$DHNrT3Q-E`9@)9"&C{޿~q3Ou" {ܟ_YFc_ÿ}qzx$&pd'?3IU7;~dշ&#FQΩFt@ l82R A*>qMWE/4.\V0ARD %'y"mGf_ݜiw*Ⱦ:{hěŬ|:>^,{Q"kݹVc>ޔdZWfBO"p֎ȶutb]!a ͆CYLDOSN&/ZH9v΍G{w4G/{>H=qy;v!ciA l SUcb%"@<Dq>8fQߝkKhغl;{׎sYI(x͉"37,Wgmڔ0H\ۓ$kd)]v#H>%`^JB~-uN/lxy5JH|DIչ aP36oJz_/W?_flc_9$1)hQeU瘘QӔ IDATL$X{fLN0ivx~ztxV@u`522M<2s^wݳgsӪvD-I٭N[Ό& !¦Y߹6.U5>wT$EpQ{Ł+>h9NwQUNkPO^5s; sŨsf/&{G MՐX  "Sv0/fYXȌ ri2;f,s^r늲TU#2o$6*nSy:081weYޚf!@^ۭgm\<]Xn^6} Tpk uq?$ʒIјx绘4RQղ YTDDT |Վ#P`̄"h:0,TB fH}ٍ Y( #@td(3kz {dl7׭xӋtpfws˿ŧw?OV8p)t}61g0,vJq/" oyrgXroƭO~\ɻZ :-|U_X=>8 E m,%D1 }JT荛w>Uk;sT0TMШ($r_]^zՕjWmے•Gvs`pʾFj䭋4C20U H~4,M9ƔbB'OMAlKw>€ 1vdEɫ1B9C0(}ڍ;je+@@d*IIe f jα0]16};ε~p8Zl~=oF?]i߹P%NJt 6{rr,٤ $i33^(I%'G$Lh41.OgIl-~cGe1g@NDz"BpvL)!#f"j`h Emp-EPb1R0K?d T'uY]EobJhjS}DD%KM0mo\o7볽[^LE-/b݅{\Szӽԏb@.{Tsbd35v[y%DTKA7:礪'Dbk?ex7& 9e56qQJ+q[&vwLewROF3)8MOOcmh.XV+PQ}q団]ʸ|F;~ݜϾYmaFn|<8s-`R ;صw<8kig;Y\]A*NVE5m64gɂ`jeI)gE$&ʪ``x&*%Զ=?eD~6˿kB6Q2*ɥرQ49AϏUOFȴJج\?dS$+W̧u9CtcuM .!3:]~T^6~sɱKG`OJ9HWLU RD}(KU5Kd`9wLS㜕HIٱj:Y6x\Ԟb`d  QMh䧣QL7 NZπ3_3˪ޙ=: EZJ veDlVlTCO7g~g9v=?Ӯ;;@oN;{L7zz^}mv;u)ʎ(d<{ޏ8ưBP24_۹[ʉl%H_:>^p7,Ȳ7@ji]˦mksRY=tK?xhbtF>b2RVU˓5A(S*JO%;viSj$A=d@} )uYKyɑUCCQec3ˠe"1e$̹|?y]QtM&L;Q,(՞g`h>a3',*L@zg6[ǜ:QDd lZL{O#;Eu5۝N_Lgh(1"Du*#dQ3BJ*Α&`f4EDC.L4.Ɯ A[ʹdG2t' IVE듘cfieŦB/ otrry)y j0xų) hp{|``/ƐiTUfb`Ĉ@='Y1¶XhDHjޣwIơJUcOL館}nQD&g)nHɴ8-x2vYG=dz1_/# K|%Xw3ҷ|k<]YZo] K<a(Ы. `rF:~uIӿ??ӯGϺE?v4) ֭DE54"T٘ M@I s ͸QFFmRd 3A3s HGSY/W]η~w,"Ĥ]$xlm:8^-> mwf{%q9?s;卝rVFRRղwnLeXz5fvnfX ډsEe1Vo='cgjČ3;IΈjuYց=C4 r٥rN`1uY.Q2]U ;11 ̄f($[u r:_#$P8)o=%pt`gWU/a DZ5ǫI<4M<bL<袇AAժFāj/ }(cbDd ,@!;>އQ]d/槿ŲaWeIƶiC(Bw 7vcDŇj^ֻ# ,ffVj2u)ulßuhs4_sӿg[]bſewDD|˜WUnv~KvfO՗:<ݨ|VSGT $L L,*jҘ`+3֍ǿQ՜y֫vQ;&UݸƸ{S5ol6M5.M)f$nfn= G,כK`s.xBk;yO"h(!!CRSfUd*9G6.X]$"#2$Ʀk#r 3)DzSjP%8 *%v >X;Ϙ 0# c"b#6OL[ u`-P*/0{$f^uQ񏞌6M|wifΒE-h좨!-"n^aQf@gثdS( k|tt&ie}]TWtԈ}v!/J.݉U<%qmm3wh][}~T?Rްŗ=prDK`>ٟݹswǫޝ)@djٯ֍!J"$>[LLR}Yo_su*䶉 6 ?כI&MMA3h}0 eUAPG;{wkqrd %͈\@ǣ&.--;ٳl7,MI~w\ֲU ٨F6}ĔG>McӴ0Ⱥ1s |6٩FDdi DU33. &Qsr.1"]B?31 2DEl6нȇ):`55ET,4/T0q+*Z;>wx+A[-.s>Cd<~f=NORQ3ssg@D3bd1r=L8 3䢪Fui8`=}=w|.*ͦ,g2UQXcsvE/Ʈ4fDЬΗj#u1 ^簿ulTWL7t[pAR`@>#4/?$s^5vpy=jR =Jîӣ/~ѻӛ)k=E`yGٝ`9}U{>z9TM4yu/|xyMf4& 1L&6м[ܻĎ/[!MC`,` h( dJO셂|a'69nzcFd H.>6ލti7M쬬xTxi I0&-BQVeQ:5[meعsDMlE" WpѣGO<( 9O} x:J ƅ gh.83Xj` >رC2U@M9E(i=3BةZT E>[K XՐٜZ:sdٓGuJJͥS/og i8h4{e'b:zq$c,̮;ljlh~NxXTzV}?/>ߨY:p{?/kiIy ē{D\D<Ӧmc/ieMGuDztqs4 esp둉"iy!Pa,sj5>=Dܟ??8|]]@QEUSqEޙP(%.r]f$bü.E([q!¡,*vfesdblesG C&,r!8$3$`b3+cp974X^U!dksr$1ĔZ #HIB@Buڜ[:PbfS"7e1#Dv,# EjșshHԚxw VϪxI_a3z( om bRUu=ZAsP@MQS`aݦ3;ѬwG,Og;z?9xܨlRy^u`ǵ_==ѭnzR53jBQ[ӓǿ2ay;٩\Y.OyijRԦ/=ykcg8 . ϕC~D~~~7jO,*;g_?jȻ~[aBC>jYtkU7fѕ#F-䌢,NdNTr^B?SÃ$3jΈPS }jh|{tN&K"5Dԣzbߘch6I3rRld j+J&mHeMܲiV.g!E1MGgMrYdDpf#"̒5,YDqV̀ 9ް,F2(J̲I{PDєr:U#ΒUlyy<"iB5fg`9z5)wGLc2S ?aͪz92v {f`97+zz%0Cv ")E$CY5ih?ȌfE1dn}"wv>{^op [U!PLHFq=׳Rɡ !x_" />es攞-zrA|wx]]op!}#u=89 ^ԛ2=xusG<|_\^K~Ͼ٠n=/3rX?nqn֌@e{0gCMbWiu+#dRM w 6V;=Zoֵ`jTpvŚB=$!m bIi2`ܷ 1*y\=xۮdK^c RGt|Nܭ}(FA=*zeԽݧMY"3M]כ226fٴPv;_bn<ˇO*x0@"0˪xJAĘ hYb"U)A=q:dmLAz 1R J2""fEAfUQ2^S:\iج/gI**`̤E,PhL=|Q> e^1o2yՋGKq~gp~a 3eu+!1#N@ET1 D`B>5Ӣ~=|Vޞ ߿[vMt`D7 US(p\z\PJP-zSt=Yz6^޽}ˏ'1_4O ^ w x9zxxõG5݆W҉/MK_Y__/?6B@{7&HZEf$gF]k&/NS] )BHuKN:F1k.YIΩQQ' O,j6Tc0Lt?[RABhndQ:Η眔 cRY1,[[RY}?*ԵQcfʯ[uL:fݯ7Ih($99^swVVT$"1ƔF8ECQ DKiZ:qh@#p7{*"uB!P ăá<Z)*h6tĎ(gv@ D5xY>y^y+e[=o/w&%pW~0hk$ USIMД̝@SP2 G¡-(rwwģV]jbfm}Z;iBbVݩ#_sE`.-ɍp>H8J7n僧zO{<|r(A_V.7VW\e/xrʵ\h UU5#p>Ds{d}MUl6cBh>Bz)JW5gP8,I3 aTs"&OF5͌D ˲0,]9BD@M'vS*|TR7*mSl6)ɾ*X"Cj("}۟n6).쉻?9^H\؇b:ޜN>_dm[)>EQؠ1C"b犢}R2>kDT(\z;;Uu)`#Wu+2Tכ00 IDATլ*RLE(T_REtsM;$Kxu d&#d"E>W%!lT싫BlF]&@1a Zz*ǔɳsEc$ $e9OVUmI۬ KUx5LT`IHav7Q&[/:?|I3j)Oãnr1r:!H=(>9|vz|oWCo^x킯9p%zIczk{EMEDҋCN^;kݙ]Y|)+`xuC[us-&FL ČFm'''={`,˃f>Bv6 \F$!+IgU9gI%[71##(HPUU jjFD]+aP5URB;7'gMdED`ڴխ7h/r- ]q]q&A"Ad>>>l " >ƣ{g"{! 9U3T$D2u Bޙe"<:1>8&6,}{p S爲(8"Tctђwlۄ%'er, (cGIQL bO[jΪ;㣍)!xd~JOsyW Ϡ恃\\49/[mq99l3~}{m\ES~/E$so^7׺.tkrAΊ?;ڟ>A~svET~d "9e09F CrH1"gƀhuN)Ŕkjwgha?i]HM޿{qf*fFHܫ>1s(kϔi4jj 01%~wɟǕ7]6ST?m^٢}E%w]9o$> 4Sy_EQɸ?Eb, H x 6A͘L}[żf\6ݺilM Q:dfC,r*ˊF$FI$rΈE#zsspqU7'{vv]ˉu[2*K^ 6/+Cc@ثMc@iXob/``m5INg<t)<1AZ2Axl1r]`nNfr2h=C u2<{q4ݽ΍e~|7/=?1"W6؁r&ub頜0۵o˽^~tᦽmz6L*8y9^qS_sI[/u|gLږͯQ;V\Q+(@Ew1n* 4ctXt\1t 2!+:j 'b97_cnYδlk7ƚe6;7>{~XAkz@* UJi$he*)觋ܷ]ts6(qɪ۸Pڴh Tl/rrTĢEUUj6}ee]Rj T-gmYQJNU"%":Bl # zeN=CAuT-CY489(HTG&UI2c6$Ȣѐc6'=ApZptt{cgM͙˶fMdǙ/g{sʪ7 Aálh1=PHoFo2c3jDʆ")r"AA[ݵee]b9!nVeVUw9aiUyo879~}Z]n%6^ =]뫈z$ڜ)R-&U%qbNeV<:sx$5E1%X7e8[oixWy5m@ zq ^#VC=·vɍ?Ç=:+ز3tޟtN0թF+sW6u*^|-⧥/:ֳ /pWh9=qhhYꢕ{ߺ(z>xԗ\P[S鷆wWSlkפc)uJS6SU mQ4l[>܏~ 92KaXTT9>\ͤsfv3wN8vTh, ՚%Xs^:,R[f>,A0MID-!P!cCc$Ô6Tj45!گײ^My-MJcq)gj6Gw[O=~ZhU&rDY9!hb*l*rprɱ;LuU=#;س[9Y=3W{gu_moAUp^1}Xƭ `Tt֗U6!|1W'a>>Á/̘^u𞃘}\g\ x=Q\pg4Բy÷D bM6~Tj){KuiX=<'oH]D3e'H!M\!v[I&ԃf*L dun ͊i-o˽PSf2."5un6@f8Å/oAӶ1"15讞  ⑙H 7qpz?'p|}6ɳ+QS"t ΁2Q:U Et"EZkݏȑ[DT )A!\)y)HXr9\j4"\O0:V9pA0* 6MMm g8 J !?o)ٞY/\ tGdpjOIpR{r̍͌.,eL'/`&br 3+ 9T viPk}KQ8kZw땣KnC:]YAqLMޙ̱%3{}xﭏj t%5{4M·U5dֱȕS-Hًgk꟱^ 1^\RǟgrI3tUաj Bҳ-?:}osVҗ33CNdJɵ7l|-4 ^kirӔNWt:|i?C^~kbJ*GfEg1=z55lXۆv_7PD 4 qe)TP%stƾ9;vJWui\ÐPK6CSŀg%캅gnc5=x}%8<<:;;y"(yttG8ƋYQ!睏2M"*C!4$@ŹTAؠO٦.&(3fbH+L-ƹȢ['HqTE}穠CU@3vXR^-5+-&IjA2]<)//'< ]b={~ <eDEq^;QT0׊:#t "9Q!Dak9gBV0ˍRPZF"`Vڻo\~"#ƉKiSBw -\?UUUM4{CEveTq佶ȱoC߹CPpٵ]԰&zЙp?4O*|'ϾgW l.+9R^ܫ7O_+tgtm|C٠".jzZ@I٘-UrRJ%''8^19`F"W~^U" 8bADMg ȵ41 yT}*#J͹dPQUg]lc-fƷiU41rȋ}%| 0~T6.t琚9"V 9zmY m̙(E#U33&g⤈'RmRBJk9`UJB)8F$1#|m;[#2!)wjt{fmχGTrퟲsf{yAs?qkDjEX`֒@U3 W5j c.p^MBݼu]A ՊDq55m7>^&FaJDM]6|/_ֶ>\21wPkfAFҠ޻R]RǹLSOa澈L=93}vZt8 "/99}|ktr?ߝBsl/goػfRa#Ra(''[5 Eh@7gc,*W3UcFhji* ZpDP|$_?~9D)g?6M, >ZKZbt1ժԙlBEDS dhDY+OX8Gfc>^~K]snZ P5$ ZLR}0T)sBLRLAH#:Vje@9;@CBdBUpރZz\0d`ڏŌ`*Ef>mw`b6S+e*Tt/F`'׎^~o帍w[9?4\a(ÔƳhb#ĎrҔo,ƖVq񛔦!Z0u2Muoі-<GU;[ \Km۴#Vj[ X=pțW^nnlo? Bc1U)y  :UDEMJfDo0#w" #ZcB_r{tVv!&3ۂ9RJh(8vsEz~"JL`U0;rޱ, z8ׄ4c *Bu ޻TsHfNLptVku;T1:X4F9{tq3$3' ؋>r]kW6+# bH)1sɅJK!$1C"l*;O 6v\sK]8ZIYDS`rtH3whq_xEqm\\ J} ^Mچ\<i&B)g=Z%p*MY^H~~ޞgw3ϵETwh?o ^*TEC040w^Yknn7Ϳ?~η{6/?|to}x$Pe$i[/Br֣VX'HnY^9K yZӸsO9 h\i\ Hk\j- 6CUthCP{;W+7Q ]X#byn3(y2302s>T! C_JޑxSe4gӔЪI)HRB>I m[ELmلϾv?ǡ,wλ1{ACo]r5C$B%9ih`g<:ȳ oZ܇WpN7PIņis0u.7s4t2/#%Zx~!@hB`Q,ژ ZD,Y9Ŋ,.磟_#lnWJۑL/_CK8.6fTk۱EO\vtkB,\:9TeڎfZOfJm0p!4 Tl* 1Ga#~_9~|]b'g*~;V1V15Ǯ"%2.aoI$%Uj!wn^}\LjL mFf _?}lv1e`L< %f 1IR-2Y;gI!R 6M&94MlvLeۡ LJeS$IMBC 6v$u>8^r1}v>wu_L䠧#~vGp:~6kAUR&vETTf7Uu8]U116C9Z,X¦շJ-߻,.=;ݖ ]ӘO6{. ,GaZ0%h(;1.kf{lͣ[KьM֬U?=s]F}ٵ5/K>wѹ˹J;^`gy|o7߾qO t_ݺ|}*%C=4%gjE?>y)Rk-ܼsb?yJppx@Ku;LC2iih !nzm'<1CbM2m(xShd׾q͗nANiq~դ$qqۺLUZ35t\?9O)kJuRns 8gnUI AqB~/{_Ŝw3b`#>]@Ոƫ$\@O:om !!2#*j;9;i:S@5FfkXsr>j\)G4pDSou*J.)ךѳ5Z D9ǝް9fCቊ"~\^o2@Z5ddXh8+1~RJR".t A@re5M+CiWGVY%tW}ƾnzIgLٗW^d^`ϥjIvQ`;#5i`7~;G9璁??_t&ݮɽw^~~HݧtZpG;nZA cDӔ {&)%/i`]yp G{m2c20;:s^;~7-3uft.y6jΉ44\i zKwxqxU!:e݌9$CPDT:GĬJQ0tSWsɻo qǦ*žqp'4\8Ƴ'],\w@BkE8ꎳpgf+Gwpy}lTfjP3-^ h=4uleoF^ܿIs?8d΃Vt ygg3W^>wB1[^է|x5׋8gN8[4"D31{|P`y|3ΏYۛ:cՑŜܼu+}?8to{׾FGCgтTlv(vP*qٹֻI2MpCiOlo5p=:h`REjVkI) vvFoUHws׻nlNʀLVdJ)/UmP |vdF\ -1LDWs; #E@$l6Og*,5M-]0 z;bѽ>vqU{ 34G~JjۓՆa!^ţp~{=x,%iW#wn΅ *yA!_ w |ᵞA`ws|t~wWoKU67׮U3@RG'ۆ3+1=xʵn1l@r`U.*b u-6~he˘[: wU Ik`m[Z, F44қo1wx|mׂc%"q\S: S5MyLXqRˢ%U4뇲81P$t4L{GDfR*)<+ T'$45|-eL;wZT) !V"JQ23A/C<ҵu.2ڒQؤVF4SC>e̩4Msff( Tեjl#ff1PLEfFBq)263T:ylSy2yJT{~>\r/dzr1( ZID21Bs! D1ErLbZZr>zޭ;B 6s"oa䆪3 @LG waIz/oM=#CC];fan8n:j22Rcs6  A%1ꛟZ 6'I6 U3S"$욗~WqҏW;zw܎$-Z ӤZNQG0Ӻd2lRإA*}8]6 O%S* tTqb)*L)bUZ 8GU[o&SIEH1~FxV3UQU0@`"v#;E[rn.zsqiqdD!("22`K,y @zއm,jh@8'nIUT@EɨZs"LZ+MSo✢3AXM}Gܰꇔ[\ʠh`@r0 utuziV}TMOH <ɱ-›|C㔽g59#S:xGBWg!eE12`9Dg4QMc T3:s6Mpq߮MxqɁKÀ#3@\PSVɂ{}[~N|zz6qoW!_]%>xFx23wi =s3nigfhlt~jp{gCִ7W_ /ǽck:% 4pNhUۍe~VfZ&(SC$e3I5mhmbcZo_"vscaQ""xj[iaw- kZ_D`*(a:lqf3 ZVQ-jAŴVjLĔRsYm8b1!\ j*ILE{s#d!>կ/Oń\R*ŰN*].ʍE{ ehZĢ\&JATQ "H!3@D&3ΛZu*h]T5plKJ"+$y4?yx {Rĸ~ e4gR@w8 #GǕSѪPEĔ K1dRC]͕5Mh"T5)N$d':{WM7 w.L+yor֟=:ݺع./;7&G.&ÿaOQ7. >zAl6>.rç_u/_r۶^-x]S􃺭۸LŢ ZcjfD" CB#TS}N@$8Z f 1\i"(iLuv`D}jA}-XmZD,̾ 3o23ժJ̵vy_k[w#[r}Je()wmo#' prL73 I!<~X*QUH}1.ttQ hZ6Cy?Ӯ)R2&3ת{l:W13g1<`@9~!qYOʛ?\S4<.T2f~S8̎qN\eqLM #ýkGjI|ɷbf}l! Gpj"^|pxpZ),)$5G{):mtUC"LX4l*i,ȔjGT-PEJ.ea*o E1RDfV,}?n #KCEFCP005I)k))* PٕTlYyoÝ[>}x>k֜٬'KΥ"AMۜ e1@\̐@\15kL`0Jg"1#"K5E&J%J*]+:Z^[*XFV \ׄG'X FOƵ[ Z nFD6?~ *"c0C0U1UfU9OPsbBB$inܘq2WW;Ě!n^{s:&ZCp{՗!iM*qD FJ`vmn3Ll:9KvkXCF?iH{aBh^η^͈2\NioE3K'\, Y~~v=Q5!Tıa{f!lu ^Z<~pDē2]rz" L5j54@jTXlJ}vJ a -X04eC0S0HÔȐӔDMfvp|2Sn|lv(fA:h:3*iZR?kڶm#6۔s!!x^jMSڎ$#D"+U@T3/#,9:~r#"S"pfgPKt hLƣBB }a*ff$2"LDL*j-@ЧTjiClAb Zze' 7ۼ0;n;*lx:/9N+YQoOS? "9fSN͡'Q`Z WaBDΑa _xyY_ תF-^hW??{8L@zzYw^cQLyqss#.%p}s^byg"yRwb9gK>؊~B_(ιMm=gK Z 6MSrtɃ6~>]rǒW.i)&EOAN/qLsb`08,yk\@QM@QPK13=cbU? HsxwLE)ǧggb˘JcA*!RSq~L5 n7^Jb`hT"CtV*TY?6]@ "䉼s Y~%PUYfǡVTj!34)%?W\TDU\VSO.dyJΥm![E˸ܺyC=s UvlvӿoV3cf0)#)RCO3DD r+$9:_ErHzq9qg s#zv yx?aӸ.if ~ ?w7b7pyЅ.f{BٝA] \^3p|+9=< "b_(ׇ;4zBT3+oW/?'\d?o$VŃ3@6\VEb0*P,YÔޤْ:;p7ˡfP (65jIfdFd26Zhe/d 'M-$*PBM{w ZX䋗yp7Ή3~*冯Vl>lTJYob8fTa?XZ}r]7%S 1( IMUI}gb," m0Ѥшo yu:;]ro>kSDnܸqzz:fc1Ī"!im1WCt7@H)NNnf+E +C`N( et8hQdT+c]\0oh(s61Pp P|4/ `6ũIfۚh'~5Tw{nj'$4v.pǀ?K7V Ժݪx^\r~k_y+eOFm3TtuT@S75 ˽v}h\H'y{Enm0v]F4[Gl9r,Rbr5W DFUsw5s7BrDh8 y臡xr LaXVv:ꦩCJH,~zY,L5Ħn\ ~)vfyԂAϷl3c זͭ<.ӥ+^_~z=__HZEp'xg7;ٞ0TGuʹOM?ӝ7^<&D]+NGtrsf?gK%C@DBb0DFB&oϏ/~~&%_!t: Ș̋[ BLq6aہQ:j]Uv6gɹ+WYVn(j %\5dwä**ZQ (e!g3)kIfF4K;"81aNyT€@H̝}? ۾[Eǀ<򡗡oæ5ub8;?[o>;"E)js7t$!r Ls1)8P16ÈowzsaȆ̳DD`:a횫 `qq"ARוÄ !RН(\̡©vEU\ͽOeU$$ǼhyFQ'a}d$Ȉ7gp]Xk : ㏿Vpu3VPH/|~ IDAT gGs?}c,LfF*`wCh)j2(E@eզO8}/bt}7C;߮0b.ooζnlH8jU !:Sw ~#e-!UrĽN7̣Wm> >Qs??ͫ[Q ;ݯWd?M(z~'vc 95/6?}w1op'uz;88:Jcw%:z7s-xV7c%=2LBܡOa]ATL-c TU.=l^a+r@p~L U`c fYDDt}_LL !D,!t? mgm; n~Hd΁6Iysz'?yϽg%s,90}{}7[xAnܸAD"2/|HD)U"d1(bbZ0&6З2 L7d;JiOaWـ"39;!a):zM)`LbLL*1fԣȉ|ܮA{@몹]iw|BFOO~~?99hdUӨ"ڴ*ךRW4kA%@ba-:bw0<me7c[8aM8NfbdHHȼޜ}z_s}z'_@v|Emѩݴ)pŭ]XABUmԫ0~d_ ӯ]~|_/}ך[|7>{7zt2+YȀh5# Y-'U2zLB(ĵhH89hfVJTUё 5dȃ0,Ɖ` 23a*ƶMꃃb4zq(ّ]gׯ?#GW[/V¤TUD]<ի]ު* wOΚ Ԣ*Pb# c*9R8x"&";-fČq*ײ B7ʦ/W) !":B#}z9ZF-k`TMՅ0#1s[oW !]Hw T\Ld*"1jJ̀ս&\98@S7}`˗&Gٮ|؝)F~\q?yO&HyqD!=[V74_rGx 6xh, ~01g#^oˢP͏_|K}%o\=zWn~epq="ŪAH.n7u}Q[/70kgۦD̗5$`Mb2!3:Ĉj!<_ƱCª`o~t4;:]=ۛ1})x@@@nuK/c"ܕDR\.k_(_zvfߞ~)LU5Mzh"5pqHDuDפLy+@`([" \̌o!ywcETw,6j*]?/:0@1ga YDLkuq> 9!@m;޶^ƾoݧ(9;٘f0@LPAݻCs !{`Bw7MU ̴9r8P8--y])B7/;a{ǝHἮ[:­&*f+$^H"2K/=|阑=rLd5|Bܩ\/yw o3;w>~{{6g^^^-.g/0;8-W,[~g{\%ĐUUH?n\lHR[A!cQ2:jy?l-عNLK^6D gua0psGhX4_/-1@h.&﷪ZJs/x|>7RTnf!]}Ŗ+^g˯kc "DSMzղX;" |]k??;!J)HȀ:f]?6Aܺ#F^zr;8 MB^L'L`b3Eb"솮)P X FQuB )RL *8Zq`ȼq#2DÔsz>ମ0Nx )FšIaŊ!qЇ< rݎ^*]\| :PNFunӳO9%@p~:zo:%_;|pp4:'Q)Onj±}҅N~7?H@I \~JU_FH)k7_l֞"Q5*"DC)ݠݠ^ !@un͐BR:J"!(9Bn XnP)S2BbLq9% 7hګ^?<'~ooJٺ UYϚM$GG[n;::r`5 8s\W,bsZ_\"3ׯ:9I1UUUʘ<}d,+H4Ue5fs< @ `+]'Y t.;X v+DDS$w+2j3ct'5= yA`D hJU(٠6X&6ٍ]H{'j77T zU;2!B 7FSvY&F5#3Iً@gX6D\T T (Ƅ8MëWwvI߶meqay'YCi8A"-U U՞{k?_#@ `ɗMҔ8 [&%R @9sPa̦v˔b0:>Cwz6ke,S-LUlx :7?|{rQ`V/fBL=aN4$yB7~w_~潟 n &F{''qpb5H)pͽo_şcqQD 7щHsUE$&׉ aF4w緶1ֈnff|ם҂谫UB0's t\I)EsHs)`zeqWi*Ds@lGhHɊ_?oO}{Q ܠjuޘ*2%U3aR1Dd;%hc%:ڜu~쉨J:?\.0gĦ^6ӓ~ejP:Q~mVϼtmjhE\Iۇw_CV{R*iIIkFxϖ7ppX.t@1xwW_|[K'6ڡ޲I&S/WC=KU#9wqBLA3Ɗ0pB9!Pn`a۴82)|8thqt5(>_{;O/A3oro>[*l~>v4t+Mh6k$Ο&,fsԕ嬢Nh"0:@Eő`v!M7 2qwf&%&sg՘bDdwfB2X7DjhnfJL(CZ&qP󨦒ITU^\dHV3[VCqT7" uM".C q>u"?zw󍪗"ne, F00o[$pS)Y!@DHQ1%€,NMjtu`14rn{Ghv~.ש!Iiqttpێ{Wk3Fvcau%?J\ظ>\}q&JH>vϾ2Oͱ<@px& uUa/6(y9zUP5tiUP(TF ":T U}ܜl lqS-a .E`jS> DFwҚ#cqhG7~?=g&_)C.gZ,43r.#tr>]ɳWݷ?D^νc60BWƷ~QZoa~f\9Aj fC)Vtx|/|;w:9^J3ULV?A"*ȧ0;CсBH)vC]ߡTUH*UDF)DU10D FnfRD\$dȄ>QfY?~w?899)fb概dE &Fd@0\r$*Rtra'~:)Pqu% *16aSm 1-M[ $ \ ޫ@.ds/v8+on1.붍DtJ qsWj/.P Cw9 0!|x34i-q׀]{ֳCo)0nmue1 {85꬧8΄: 9p0S/bC$ =sn!DD)URJ S`yӏ?+Ml&tՃ˗7֍WU|ote٦KW/šcB \4FZͫv9ۮh^]X;>ڔ!gЯ>öaXuJۦ  :H?db{eӔbsmzGjjh c"DmS/FLXYrZ3]F1d9MYHDSܧ N}Tff8u`5T3+RLSH n>alNT٬z4p{A9eߞ=bJq9o듳7O>d{znLU\&~-)d(pB)@^BcJ`RPՉ-`pq]usT:U\d 8loe芝IwÓzY[(HpKgUO=IX?ǓVb~)_+QB7n}T-R!4䃵)1 vD#cSe(Ū 9fx>ov\px\90|uʡ2ҏ|=RLa N/O?"wAw"/m,+{< 1nRSM 88v.)T_[?>0ϪSA BMMN$` ‰ G0s!@̨:b΂`dS``"hj̨qT@d!c 941t2 nٸb/bn.XE̹p,}7/딴\DXzcf!Tfjn9'SpIԊ;:a1AT@3FBA,E&Bw"mϛ&hu P4)n]1"7:q"{Gwl4W98 Չg=8)gfv/;Y#".џ`0ZSjx Gzl(5k[bujEʘ L ÷mWgG_ټ^6G^:|U! 2܍y*`E+Riږ$˦Yl?޹s \k.u]k##y%ƓO5+d\;ĶdM+\$pR?^ܴ)XmLaKRce "LD0Q~ZۑDp:ͯw)]-NoB}_F-02Bss08)@Q;_ouDPzU7)CFn(ifʸ^[:|ʕܯr>v6K˫loi\DTUXFm_Q(S7D&PY{ɃȘ},Ecdf,A h5DAƐN3k_Oh*H˒!M.cUPY jى|DI8h0XTytst脪wI!8B'Wq">HHa>esLTdGhC`dcTqUrA61T"F*9"(h`&VqVWBɺ!T-k<4㢭gUBS #~;_I` Qݣnߕ6/^q?̻#SpAgH!gO0S9'j|;!\,#x+ pT6w,}naRQ'=d$S<_1 q<^nt}6vU]ÃYxV&=!HWr/k.{ ta& 6KTճlޚ}ˠJ.)&ru$`bBU4_z5m("!hoopYMB)N9#!F#R wY߬xrj(]Ĕ-6ݚc$-N؍qɶ,H;%w@1 $3._{嗾w>p1"V"R;ݏȌ.;Ni@.Уt%&(mLN)Pud3?W"7al._F!E"'6ر!W*wQh<'n>xutXoEFv)Y"ĐRUqwuXT)E5@j(""#4#"%l`bY}WK{{GG3BfULD&6RSu焖NrR-&Rֹ#R`/TME T+81MĐU rXCPs lnNKjR!1"X&RjԳPFuS;lЍo|y@$N!DBYEnJnDW8"39ѪXrRe5KuA޻~I'VF&TOTOW 6>cf ';Iy;o;pB;*!"UWn7M\m[o&nvs q&CUmuokIi8Ý2+nv%Yhƒ [7~3lH(Q(]{5!nfPy3m ynĉg cZ`>< e>`@I" [8 1Qp?@ΰ2d ,ox.o~_<>\dW)?_Y>3zQ6 ֠Ҋ6` 8"{'!y) >Fhqc9LZ.jm:pʥinzRm˙Ҭ tOru‹d62 Tw*FTW@H`.)vլa=11g,q?|0z hZ0JJN LIRbJbkjԥTj=# ˺O4^]݌'y$s@nYdy{v2|c!Vþ5ߠ<}5^^n.%U|z5{qɯ./WZEhdlس* XQWMUva`wq0y.C*^Mb@F"K5Oh4s[I$"& >#$2Ի8Uy|9~|7M1.>zp~?ݎg@R3DG*L 5h*jMI sR&",[}G0s3[esɜ`nsVA4֣Ҧjqjއ011fNԉ28S "8$fPmAH} R$DSMb~~rvĪ*HXL ᡶ^36cZI΂H#F~sgHNY2jhЛ-?TMv+mo;MOa%mciOdfAq{L|9:}ojR3wa}/;ٻ-okxTzu/F ·Veכ9rv@LIXģsN9V(W`t57ZJSId{jnm*C6i%K' ̗"$Cnj'Hdxa}ܮ<;1̭PpH3~o d`3X*1±C改+Xӡ>Kd$P7#^=>6R?\+fHpJ9;hm?}pMnRxMe&؜g/"YqPK_U;z^/ zmI4;_%V ,-%4mG["&պoMWui>=]iA:̌Mbؚ̉ \f I"P:BD$RWh6 B?O??B ^?ih\}~3?GyXt6GA…l‹\~Z Ъ,uPDI;"y愨nMXD]Nӣ'T`g{OL*)AGzNRb03p'I$&p"̉]ڐ4o]fnd¼4(@O6۪-16WTZ pAϢ]j풻O醢]*$Z[s"^*3z:v*^:!RZ+`&o.>8)/Hӯq)x#q+xz{fws rwtˬ'"E/_. |G`+zo.9a@n>8Sm<>?\?=?ћ^Vd9̱Y_wUdyZ 8 Bhn¼X tCeUtv_f4.(%Xy1L ) JPƱ̳IfmI9IbIHM@s3u.LDA0yoxs=oȴ 1'"af*bM 2 -/pEi` Fxm{}Y:7DB SL clA$ͽYwYn{-T=VV5MdXVK_˘_q"!rge}5^C\$$^N?9U׭FU+%60s ֈeޕp:Xj&N,8ٜvspLЫPp? E[=3@`.oNf?w YWA3ԫ6J`DHm-u.//23qr]cD,&D8rB`7Q=O솥V&$xJa5_XKG .mޮO00P,),#b$ UpsG[$m LCeI$P{RRutiPaH0a @" 8JTI3M\hGSj XD<陫bB7CZ ?Ӭ:_?f҂100, 8q,I(z"Qm6-$wH) "B2Rc ` E*:J sb4\úC)9a#knz$d"FE1A@r| 9 oepjjUB @f@ S%0,KW-F9έIj3t6çq,OϯMU!MMJrN fǽG }^q* ,!)LLnaMrι)2Rp;fYbZ}my˛m-C_HNu+^"ޭ#g/Q;WVyPܜ r86xذϣM(qVz=&%Cw??RMk@27mhޚZi-8"bu&,hLfU\j-Vu*f?͍>;Σdc # AwBrG Zjjg 99I"Nb[LT U!$Jz'_ONi@H[kt[f r!81/}T,Xs&hZJY=S5se$Ԛ+Epʍ0",8t8z-t0jDb$otlt]'N'(Zi5qoz׉YYg.92w:!Bx'N z=v)N~|˼Fk;|9}+^o>B=.,oQ@bB6Uƶz!%}nZ8!˹ |܏jW1b[\50 pR54Oq&mm5zA@ġF)8\ȼkn|zPiQ/Z  ! d軎YTͤ$L:Fm{rr<K#*q"Q) MDJH0lS?Z?{x}oXQffFD \Y܍ `iŦ*!HJfʴ] #=<\-"2Xiuq amBL·Ys>dHRmԴI:89r~i0̜s2GfgjػJ;.į˼_ keo[sj}/ksx]\";bQl,ILOux}p!Fyu~)va)S-1493M!KhFXzoW!,r6׏.w:@躄Ȼ]֐@ҴP6mXJ!&@# B H"" `ۇŽ{̓sx!A")id 1!JVlFf!PK)%%ְ]>*TDV5ZA|XRa"rYb!n9eͽ[ [N iNDXpSEIDĈ]"CZvU;τx>)Q/dё;*%06چܫ*832*I8:t 6ĦeeIᓟ._´ʉ}};s%w߳˖/{/fM+~LsNck,WOOQ`v9SHt2ոw0á|Y移s)t$ шLUf||}Ji IDATDfOkX;잎75fNͽ>Z0_^_j tK3PdӦ-#k%L9'ڒ䓋4ibZB  55&k- wHJX*Osǽ{zDprޜk` E$ &3#f5]_-!1bDD$s'3_~hf)"%t,Ds)q>oW(fFPWIO""F &jRbwhAl~;T25#榓u'qNT',Rl?_Й5y^m;&ۤ~E"%eA$ T6^eC&um}=Ajm`8}Gnq!}u%kOӯ} [f_km.{r I@BU:YN &miZUS`"_u0Rfe0.%dqA[YݳZjДd7iH"fmA<Z"2":DD \Dc@0c-$`!fVYar3#mmtozr]_nD{ӱ0}ʹ;ÚmS?͇xڔfZ 8hAf݀ȔכO`/S_o b5+w!OﶗP/Y Y=­^d~oqf/7v+x=zOoj5@tD3@1ّG6"ּ`P~7=#!c5] 1M4S4;6 uӦVoo?M:\jQs@ uV憜Wv͔DߎrtV+1n:Sr&s::E/c'D00C4ʲԑL рεB J%"nuKMћ.w}"42N[hyZOjp&  ]'aHD^usnf: }j6V[ U߳pf$g9:pB sYH^N:w(IZ\[!}?|^3Awٙ/mї?_鶾j˼ {k-^{g'/\{jyV;nN_]V\ EPk$l UTSNTj8 ܬ5U:X7}ɩ PyZuҚ'qnM@G:DjuT4N5=Ԗ)쵪n?짆J"%&Z ÀpqGONNXNR Y*b*b0 zipb-c-+aZcb f8;?\M01"x8U#D? HϸDnffR25D$3&JU@Fb fqbSfPDci@YX$ѯiU/v3 ־ൖReg&sDiI13"teE7]b!r9?쳋(mZZG5^ZUi,EcF/yRw|% wRZr~_?R{7FpoK,WȤGPXT(ܦ}%@6"oYQ,D 2$ij ZӹLVtÛϓTF3w>2".R5 \6׺ڍilN8! Վ ԤO1fl>.7X͘9(>"qtЦL|HGhA(̈`B;4h8]%A+j t:0jsPerA6Ϫs>9ZD8']76i6C Ps @&"`V9tN\L8os)ū{RRCZrZ,%9:qYL,ew}8߮jy%N31_gf!gW_oN^|tW Ns޾{ҏCX+]9z6_o+R"*0YYx+4Q׼Yu+M]c_5J5Y[53d$E> V-St]nOɪ۬Wt}W>;LsZKQSfa!7Er D!g 7EH$ ~pNOni楶RURiy᷿}2 4ll>qq~O5u5E QDc9 jA,M#qZEJɑ"V%"^HMְXgIikZ31"Z+FyҎ$9gԦ|@@ †p@Wp_j@b-Drib)5Z HK<}D_cH${B|N~) !yۅ{:pjLYS,ܚ9{<{f:Oh:uǁcR+NJm@Āf)IqNКv}]. C:;ۜlpW=p6N5x<ͪPcTcR<9 Q͝y -?K<#{E0y$4̛̈X1$ᡣ6\K]#@b1hI1o$2zVǧёs2?=vqN]}C'f%{ ϣ׃mrzk8?+oH]WNYvlN 6%?g>qnj!̓Srf>s\Y B:"99Pk@ 9 9Sjݧ$]ק$ՓO~?7{tl<ͷ| Zq !0 B`]+)Z[`DDr҆af" F7 m-#LQ)q>\\|ᠪ¹Yq"Z^ f'rwg.v4pp"^ڈpjDęX+`fH,DxKTD. "W!SC)Hx=1.u[1gC9Mu^%y~z8vXp">OnvWuk,ZF9lfeV6A 9"2Y=S|%w:Z "|O~u^ӓ~xvzl,0zԪs:7uJ FTح0u ;r4L2IM30-u[aEiƒ- ո=Mj"9Tu.~>G_wWRՇW)!6:[ $ f"D$՛/J2ͷcb#,<9wYդKu`W>ː3!jknS+nW;<!Y:KzhVI[Ei Mw HEDd,)<<<iJ#‚XsNLDuVؘ#4LV$0, nvC"e:jHItLGfb6b9*E""P6rFPiMRGZƸ,U0VE =͝q]BT!f$ 0M #Q,+ m@`,$h0os/3)s3b}tQlޱϼ&"k!ňgm4RPGfa❊pCx)~@a9Fn{]>cfS|,n|ӄ㻮li#,}%OqFVQk}ikW/} fnf2KVKQctASj!n䐧XXNiǓ޾_߼1&BD9<&s RGTf‘Yff@q} ~HQY>t*AiC"3Yܔ:I!98f` 1"`|7滋k !A#[ohLTq 3x9oe/k-އ7<۲Dl NS$y>ܷRөٗ?JYC#Qp-.fDL_*Nm?ij[tjpjw~[[3$9(fϤakh]Z`yoYnn079@ ڐmC$İl9Drd~D|-V$dwJX=jII/^=yD=!bïH֩f*7IF2#ٍѣhUuW*m}-3mmt5imkR"oi>=# [Suo5+ReUOKۻ(_Ջ\/dr w'HJ2R΂J0/.n.h[$a,sM0 2ҋ˽H庽wsQ%$-f4y Z;*ni0VFNZHS֗M,qWШZ m]UAMq3d="]Q 7DW;nGeOvZ˗ٳG닫ɕhÒݴ&_q)<>yigؠOOmm?}q3}q;ݝ+aN:4)ň  #"1;n"Ci.䵅9hkjEkyqޑC[ %ρ"G)9Zhb̭1`i(|2@03 9Ԕbvq\*3=x5""lnF7 e9#6 ҲєMۛ?i-#ztF6@hp9zzD8-(&u}qn']Ms]s[_Lhkh433w @D!+n%uYVRKk,5k84 H'#S+FF)(eRK) A6rFiS)'wslm=)dW?IوNt)$#b'2ri--[t{ZtQ,ffF^۬й;Vֺ&o~߼swx`ZJfP*SB4B5Z{ }JuP>W"RjKզ:M3T3e1Ui]O?j4l)P=d:'F|=L?sc׾cлw_N|jշ IN7sd?Ο>Gxr=׿+ŋw;J5p֋,\ʞٲ|M~ٲfi P#z?%kDBHswI)96G),pB !{;[4*vhRDfBa1¶"Zl92<(6DO0zRI[ado.цQu㸤ZF0Lax`BP*%퐧\t3~9228{_2FJúlm,`Y[f_뫫ں.-Ԛ Xj2ٯHZX֜_\ϵN?n<|ܜ _QӧoY)'?q_jX٭O\Auޛ|WT$!֖X: ǷoH^Y,;yk4Ǻ EٖT-u h]Y6҉$sj,} 8Y0L $͉Znut7Zq/F+I>42CcQ> m$Gf4zI!lqކ :s<2"htr:L-6>r$F%Yw9&T[3Mi?W%2Sqk-y3D.xly\[Z=5 y)EOSK?bT\^w{wj>g?:#L@S۵gI`mSLc|ȹx27wsb揟(vhT\}~Wjc[CB)+kz:ӠFn"íM$h7kTkxh^TK16Snf7TXUjW R|cn~A10<i$ {K@[MR6JB0rK/ж dfdBj7f.$FJZ{HFSH2a Cnj6,]dp3nN# @SkfMIޯ?Mw}5X,){}<U,^T SqWԩLWWW  0}Wο _C@|K@PSo1%AHF>EϨL T |z_ a=dhLS-AMLeR[[G*18} KyǵzseMHcmZ# D"ҋf7wj`^f#ݬGȩ=8%bp$mDܑ4 g̠Q !G0elVsRu`@a DSY G2;`]BsoЍC!6ed\)5R+˯~z<~o@5VZL'oޟ>_`*ui{Y*[krq#oHKe}~y{n2ꌰjxʌ+vS@.eC rTiJ?GwbLEHӬKͮB]>:ŧTV/[fc&jJ,=Z)}&F >4c)j&h)E"R!RCL8MX[s)9>t#!KYKezL4̕m$$6̇aԽJq,430^0Q۲$Kd!#iG)̑gDo=us؎@f.%̍ =ED`atͻJH@,̭ɞs Jr"lQ̑0uM Lƀn_7i=~cqom|y*m|1.IRuMF^fxosR^^_'8o>\H}ekwrIB!τ5GX:Z  1i…2H\ JJ J|:4^_qw e<*GDtw{PZ("}JiC#aHA{]澮k ZZ(#%P>8t EikGvd)^KuJUhyעMSnWOrRL xt%a ,F-D"YFÁC#in`0)D:pD¤٪̌Ȱ4 omAd$5lٙ7GBImda=h dk4՚wŻ5FR>YHe*;:/.i,(ռ[3eER̅͏_|WXf1UxK8C~>&dמқл2-r8TzY`z#M3gCz4NWcs27\ڪаizYDdԠ(: ;6!GW”hpD몓H#ۚJ"3zWj=p/x)\湰\Z7#RsnM (HTQ`)ȡK$"P &KI^ٰц#9Q ']僴=j=|r=Ro440Zwt:ʼI˲`s!`^_x];_2fF?,G3ǭjUj}{:\a2ctdR'`6ZGwT_~U^(Jh~gzzA_]{|_> | |nc2Vw+,abI|D83\ض6kT43 \DOr4$իEu]S ʴ|>h9eԩx֮t:-)̹X}7ϷxnM )̿˯~8s߿@nߕ8e~*!LXAi#1@):Eb7dm)/F7vwota:I/uW̴g~lwhH!3#*CJx ] G|FʉZoJBXX[_3`:ZT5\(\5Ծv#)g#>nK"!}ƶ6>Di ِ&#ss߆O! m6ii@ ir_}k^y.^%7&\PxR6k`sToݜ-Z7meEhGt4ի/u-{T)/}0?,'do]Mz|ڌjO:S1h0Gg秄7b\$:':=sPW-t8޽oM{ZEI-Td*7@#מf@dD2z#9()G7hQqjGB(FΥbs?juOEu hH"2i14첤e7lKm8?Hr:G)![B&FC!#;טF>YFִkud9iZo6OI3Y@jԤDJ^a)qP sdbp?wWeϽaqz}<~y=n=h4ޝ޽$~*eWfY}_?~8mY)9C:>|*ܓxv^nj^;f#Qݾڵ?c/:x\|[I2I,9\'SQ]B<,9tbs5Dp`İi^cZimNtǻo_kmb4Fbwe"C"s I`H"{{PV2_cFH97 0\\^~_|(DJ@t<شIo7E"m*uh{qt7a$嚃Ɂ͕m2=%3vZNvwN i#F.b,axZH|IF^x ٬nkIbJ347>?/SFq#:ndk ϵܦJ͌ZȂ/^wp}?0yx_}y}jXXG?$~Tg׳ttp!eOQP,X/2:OG-BЖ:^)pBc+<;ei˵]67m<ҩZZ>zz 1Ǻ.};ys?c3@>qڐsz4=2DF Ԧ{F1CNR7R. ܤ8=[y3r4ʔG Z ew%5O&2C:n I\>DYg~nB##>I3ü@Vl323NSDAȭ։-Rff::Mpx*JqX[A-H;wt&TfȈhA#^ܼz7b9E/a !zwm)hW>UN'wOO˻`"#cC4Hx*#~4O a}WQ"FR(۟90mW@%7|r5yE u}k3QۂO$1DO? #7S`xz z9k?7ߵiM e"zJ$ b}U0P*sKf Z?w)'M4 Ri_yӶJud9M޼N4m5Zޢ" CUpT9y$EՍhH-X" )93:x4=ƣ<Ń2KP"cFԖn7ˉL^%6Z6^4<$#ш$ GE@y@v=_}o:vpZuMfohyuMdkuW?ocyHVv_Q8zn*UЦ;x켄NK!y>owouNCc'eOzXOHwEGʬևpG4d$@7GDEǥ&7b"p(rPC2~_>UwCq%2ŎL)!'৶zo Ƒ~0.&R$B0FРp.=Mv /\`;IKۼ֌$F:edN^w!j@C-B y F`!ƦaCdJ-/%4Z쇨ShLkM*G5 F{{XGe]O IDAT_OkZ~o3[2Bք&odf0)$Ӳ(s8FP%,6O{HG4"|1yȭ&[]&6QIvW 0rr m/wy'9)q% %B͞zr#,\eZ뺴ǶڲKFѲ늈X覌> a3 qaFf[%"/D&e$²0hMzIe)Sz,|$ҋkCR^vYv<~>[HRtφ]h,gB07A`|.y93읂9UJ\3p[J%=akk)ː1 2Yjf;?&3{rm'^^;8 KF,t#Uto~6vܣ_~iY @kz k)KsgH|:Nr$;1&+v K L$` !UyzZ.Aax5XŰayP=@4@q1V]6pt4hk7F=VzpP6=B-3>e>b w]`[Xᩳ"c8ξG)#tYCjsEݷXgik)ptP{ddz/~/wTyy{譔RTͪaW߿^-`23$`I]x9yQ'< rZdcR,/Äڐ @Զhvq6O'A=0=7@ydLƍh$9'CBr[[.- ܏I=́GGخkT0p.XRp86#[?e¶ dߝN {B`jO(1@ht1#}l6[F(V;axm-[k$1QoA'0aI=/˓.oH̶NkCOk3ͽdfhkp6ϳd=Mpa4Mv,n8MWi̍ђt3#]eX8Mڴ]GFK`r;Wl/gױ._g\I[3RyvvxV6¶ ٽ>5<\|gS>La @Y!ppA:/ɩ=[6gU犨8?NzyΜOO(ln G||t աytލWAj[>IvN::M#){vO;nϐ'ǻ|5;;n8{_g耰sj8ǂ!H#bqvZz@%z>粜NḼ;K[1&)*(!CSJdHiH`; 3*aYbG|sɉRTP*6]; X(z0Sli! FS*th!@7Z/׊|J& Rz9ߜ3bņJ95}R  p4n-{{,#,$r7{Dd`V"2SR * 7\Q&D+#7uaڪ }uwwgVK0ꋫ}bMV/3޾= SZorZO_^?z lJ(l<z͘[$D8_iǏKz|m>?vl. CqkKxv=Y8O/m>KP5#=/gG8ar\C:.wwwp5ǥ'ɔ+Yx1[Fdn"iC`DW#98飬503|=ts=Ҭ=jY#HG ٠ l!ݔbJ>X9"G'XN| OX Dq*R0&Ms|9<7Tw&zNwx)H r&" JdUIP*VG B`7AJ-TJ2$D9bnHa #sepP{764L0Fk Tg5g`=^tS>؛TEc٭oufV|6o}#ެ=woDœ)AAdi:235S˚-yvP<#&`].ݚo۝` ]z1Αz@FfZDf8+IM*^mQD|dDdQBWpvB3">X V13 @5[mIl}s?9/%BC vq! mWG@L-8Im"绞l?{Wg;/tt @޳X%^ B혻 fi9q1v[mp%sEd9j=RREfRO)CycG7ۭO_rodۦF]E8zo56 $9Q@U8n" ae)nh`BG$[{z?w|/oM!K+ҺtSAa}D&Nv@y=i@n]%6rs(M=d-<1Z* j""X̴5k[>0K=|7yAה[X ݺibf"5U]Xƙ gDMqF];#'DdN89є5 =k%[t02#d\XJαbB4Yji*-ݘJVFˬU*BHYMͥ7F̜o[?"Tcdb#0gH`"z)1&YL"djL55噮 Nlܕ\PG̴ZD133K៦>֛}oo1o+smtev-PmC o};Lx݆xjZScɐ4**cO˗_`3v`doņoZ*m9,Fff [Ddg"Ĕ0$?]Սd0RA] p̧ z/s BHI)`DP{nqq+,d~5|P6} zSC*@yz|en 1ɋz=/џ!dL tDsԊ?ǯ||x| 3!v7Z" PSOH+O)@2DE>főg\%'Bdm2g#0mwϜǔ24kquQI"RںHOVvDd''DlQg.PNOʈ譯Nrq̒^M7l1}{<-o6}~?8om÷6n"c QQ:]"{߶?EDkff]3[L29"ބY șdx1=?<\MӑsUq"@0O +ìƩ}iඖbgeL>qD$DI7Aoe hA-T!%?@S]⭊:|_2@RQ+w+eh< Ǿ[W!H<>c/e2#no-QsoSM[k>M~}#:@fJYo[ sN׿cqdxװ/WLePN3 G}w˿_w?'?;1rJs1\Yq]OtɈȗmd-W9dgvن8-IN<+LE,,Z]8W}eIP%im΋_ДYgN^NiŦ`tEkR.y\Ǭ0ob~oo9hzoc?"1'爣AUXPᤈ9h)B'3@I2E4=fn8/g_"c,p!<Ɯ! &iuI5F5d(`]3LvCoo$A@mk1nucE/2DMVyɌywwc95U U%(p$(u~o?o_*rLT͹So_E=ӒU"X =?ɢ$ )!Z(@Tzy5"22\>z9_KFq&ZSԨ"9,fZLEV+?;VdQ*m(b)F#G4˦-M:W}Cp%|~\{.]Īn-z8~Ln6 "bszx#3{kQ+ɡ&ˀ`v4Rg*_P tm^@YUP!6 &DHJ!Adz}2km]!!:rznmym s}SSEtyCd^ jt/j2hۺRGd(#ۦ2M>"dnpie"StFz>u᪯'tRfAs(!(Eߙ@q->^˰$Yb)%V~nPp,u6&HF"QYYyĐdIfFSj#e&WRIkJIUirʼn PNs7 R#TD)"0d<&ÅF3TjV_8><"C8}!̮ju$ J|vy>%Z\i~^+KDƆf6*nPV ȄѻF8սuDHR>be[ZW3[p\tI%Gu(USYn;dmB[r* ^^ėLzOp m6ݻT-SǾۦeyAp?5~nA~~|o>Rl8s hdVl"Dˮ@ $e?g1*:RGbqgPV5e{`ċiq Y,tt@P,W3'DDDטV扎g^G%_\Pf@T`[+4aV-{~Y%TxFZk9W;Ǩ$NnVp LDF(HNAB"-2BDz$LK W5dŬ5Dβ?~~F @aqsY` c#}}@"o](X=" aFMq_ JI{d0ED:4QDŊ~Yp^+UV֤ @J&}B)l7HBUMFy\f 5uV\[65o\ϔ c-:sy"̧> *dq)@ϡ"LY~`>ݶ>#$3v[2%(fcn/cL-3ǘ$末RP9'4z.ZӔ||>Y['Jj]qIKTV1w^1ڤhQVɏĒE+.!YDYL.L@2+qNK_7_ O"TU1ը,vuu M@iL^py[ |&Q)#}I<_a&$U-9[W"N,G,Wv[%qW̌LhNY72Ss  $ܣ5zCJTmϏ9n{b}43wG֬LHTc20"ַF8TĖ"B(vʛ"D"ZѴtʮNmzĕ~Ns6(d5Nk[ϤKV#'Q⹗ggd-uk|ۧI$@ZQ-j1w[>J`\UE"DzYٽ+x%1-NA3@YԻ(6|,KE 8Az!i&[+:Rw o9X*T TK%#3)Sbf%vÌ IDAT˻N?DJPd\xw A!$ "XN ) ʐ /#f$@Q} JQs1UnjFpUgG4IGpڐҴWEjؓˮ#ϘGtq轥{fn[1Vڜh[?7kmo_쏇5cĠAv6| Gd HVaj qi5䪅ˆL}ֶ>a?}<f>iS~M(҄]xµ^P| D,O%n'< _B Ъ?eZsN'W4`ɍKRXipM*%N>`緩I)WDKVתF)pAE4PP\PsL+:1/w `F` WuFI&Db %DHC5@Su{^zSiW]ߏ9késZNJcszKhkAD839=s$ G 3~}ߵV5jXͣѓ]5>k( dyNhdrSUude4U^DD6YDM3+S f|kihLL$W OJI)\LMMfZ@>Hd:c1c1 nC+Beb@ƈ}7Uix /_}w2{ t'#f"f*0q44ivdzp1 Ѳ/i+]i(. U}.;ۇ|nr`hFhY?zя~KfS bqIXUan vEĬ"?7BV%ȕ?mӅ-qm^F-U' שUp)^p}gl$2N*JK䫴0*S# 3E|_iN c?}/}N֛Ic?2cՕ 3{Gݧi?A^ZIN23di!*`}7Kp^?'|^r49 \d\ E{zWt*J>=SL5,^%6cpX OHmp5͓DJ xN( F]Nt ҽzɸk+;šbsBePʎ1U~i _z.H&S%;総* yy(wtg#W-'c_~Xk54R=]EEĜTLH.-|2HZf$EZm+h,s&8uRKrwQ 0[3jmfu+JSDA) Qh*Xs+tj˓CG .RbqnI]^k|z<?Em;#l[x|ud9]m&LmZ8q9gT`3mfjJДimM Yw73ZW@Ȋ)z}|ΎP έLasw( k\z _@τk=K%Ob%,qa\/P+s`kmD$22"֚Y3mUTe>"ZC% #Q Vl"P*pr! G.oE S./*=Hr~~~,)c9g"# EѨ J]j2h,IAYIOc"]E -o:*\#+\&Q,wEjcK֨ 9OħE%#d3EMxDasN2?XH(z\SME[>F/_:fb~<*mS}1`o䲏pO5H=iO$l7]`2ia!ݹf>X n⎜E3'LEx~M(yQpmWFQeק. j~x}=Ah=ܧ( @dDFiZAZ$fT3!мs(/.NﳶZHe%WY#W9=gӀ0s֋^XõFѼ5t=EוtIjƽIuU*}~?d6 |<~o05"L=E2陈Ce!b''G;VixA`0Y7m-w9kUQxle: ScL`_VԞ%-Bd"R1"$S$N'Is$:rko.*v7kcjUsP|~7|[۶ErcZ2o-"~lۦj9^&eUۦQȄ5LIt=#ܽ먂HƘCM|>[kxMzv^Ry5r/?~߽%]뇾lg:s9J]9Ufnu`h Ht[kR5`DUUmڽLnۻH#FpNї]L]Og j/']~ljH]3Uu'3! @f9@´##:̌5 j[͢?wO@U19#sN'%uS&lk+O$t: د gPC)&7*[BWkNjA*8SuuDp&selM\:3#ӤVDm\ 7QUuwcD4fY9MܧYs٬Kq5ՈLa"Aeխ9;5 ڭYDtv߿~:ЦN3[k&bdDe dyh 6eC[[x.JF/Wʳ?@p&DD;'Wj3)8\JΞ W+`+X",l 8M[lw#U5lvYwHm{ [nw^#3۶Ҟ_VT `xzh0qԝEr ?7H$!*ﺰɜ ey|~1"Ib 9>8L&>##|{[߆{$|dSM \4ˌ)c1!Uޤ)O bJP/Vӵa,̚\Qf8EL1-A(*&umukuTkt,Z煥4U ~'d۶Bmfj}@Dfo-J8Q [k۶A )3n7msRY}ogM>pћ"*k U"1F  g\\Wy|} KYXݺbd{amf*yr/^./iHLkH ES4sM[rԚ2bf'I [hv1_J Tӭe{{SC;\߹߬,HfۄԠLΚI, TJ&<勥~EujR^,מi9-sFzefD1X9<s83yD1'EQ_ fjD5'2r'D+E'v!}J`Q ͌.MԄgy$Q׆.**P keRM ʫ"KQO\fZ0Us=BUk^p 3em 8FڶVPYc Efz:fosYx0KaE`5ݽ.*1߶nf[>>lzkǜSTi}k[3"32/G f#R(vdb3Io2־t6(O⬕0}R"t& C=+JYK%#+}g寗ŵ]oUU1ɤTpT) mzOWk֡{Ƙ%y!D)"{pxQdn%5KC*j&6z[M`f[;LQi/kZI35DYoB՘§A*5}ɚ%?;XHHӆS7 L&{۾ f0cߧ8|zF]"#tIEP=e꯿mk*M% ݛ$X̔\l,a&RkP9D^THdKU{ RIf8Pm QެB)SF0s-[ҘSpMܽB1l̚^wfF,mA@kj&wm7OBsVaXkp lZQYS|fcn7zjA:QLK걷~Cֿdy^z /; kkiI0pH>Gr0ʪS_I[ZbELל$̩joNuVOePh(bZE9Ll1Gdho 3&&BB /9C[(eQ5m&7StGnw$<ӓaMuhԪ~fZB]cGNmG δ&!_Ѻ H9L~s~#PU؇ 8pӚQH[BDל$~̻ӛH(.hTXJ߽uu/-bJ|N\h;q)/~!}$.# HfE9K1129L a եfMA@/d\^-ݪ?i$d?ss !Ն$[3gA!eL8֚1"Bm)+wse_ FFVG1F0A<3:~|~vּu"Ղ8m*&On@צ@_MƄ ,ځBVyzc"L-]cRDpN82'Z04h͠DLBqB8 "B9oc|䶽 P*DTcJd#tcep*,aJ&&A9D`LMe&HYB Zk*fR("،lf}'GsEXwXS5FiSiLdж~߾m緷w3w~.d +i$Wx5Āmۦ/qvk)1c9#ewQ #t|#ȱ1<#}(;F$e_>~[ ck\ՓVX7yoM5@,L9gQ٭'O4ns^Yޞ2<-J$*Md`xWJͲЊf=1g>}RԷY[*p֠RĔOZYr٘34m, DyE8lĥ9oÚ5j"LmJ.cƙ1wYۮt8%!0 fp 40=2EEhə9DL]pf YOr!I#~8#g4!^-88[wj.uZڛZW"=c<-TZS1d(Eɭoݧik5CAm{,H*MLUMafZT %AvWE"8]xjv #l}nb$!diifRSI:T..*3a.[c433y[Q!zT9bMm6U93'eh]T!2_~ُju(LsDJ?@sf22!ڦ/S}|>nW|fZRuq+Y\࡜\mD/G$>njCUGvջd9KJt? &,#M.ш{frg%9GDy}On"0C)"3T#w?&0v9ŊLH޵o8\(s k[>>JfpSu1#8a*XwrFQ[y W=Y?W33&l??+5 Z{#[?˩j`9h⪶mM*ycJ0MR} Y}J/yQ(@ wwkoMWl:!8|0UfAwNA.YoVTLJRYifπIVÚ#(ҚX ^;IYXiY*[S!2 $.3(J!U[SP2ғ5vwqiJjk$eNflH"S" nLpk/)sLM3}I+ƈZۈZ2Wu(``'`Y7|җBYn^6FEw0CD5uiH5&MKS/LVjemuE ykϊU,Z 5(K^4YKBǺGDxHskVWMR谪:j}spњ1ǴH aZr1c5q{;cczaG\* JYEV)iEUJaJDPnūEJf.Rfdyط#ν9f7I) CM22lS @/ ~3zd&iK"{bWהY7='b5aEܬUBsODַ=HW:)bp(%T~;b, w cp9Qef ֘í(f^k̤&[lx4mU !( gfs4w7 ˛@:4NђN3V1*tL!q7N[1%&gfǿttm1/y&m{h;) apr̬xՆ]Hf>=m_&TBx1mX8'|D"2~XfMX2<RyezM-'8wUYkH3=i>lE䐣O6eY=DGw̗˥mULwȩ9QDeQM)s#L6VyՖG"oSDDZH5(Zy6D-22@Bއ9ͧW:Xr tcDP$^W#3IYz[HiDz*q4*/k#}; l""1iѕ HgaQ2Gӧ3(SA|TH~Ms 7Ĥ)u B`s/cLq(mnH~XrQS|w! ((㠄4äƬcq)U4IUgk"3c^۳('2SU&43+`oZ>M|ۮu&/zl9gOn1?^cۼ/H!ݞ1ٜ"Q xԣD<8 sLc2H^G4ưEb 7*ix5AP&*SD$=[&:uȧ,jx~`Xg"p7Uz%84Uoz~C> cNiGmuc ^U2=n7ܶ}];cNƴzm?=nTy]eFum.s3D#OP*cl&07,E z-s̴fTUy~; Yq|!O!5 wc2Q"iyyg#2}m#ܜ"{U/^=>>Vĉ!*Ęs(.~UkcDU~ ")8RS#BpmHZ>loo])23mE}Zt(0m֔)m@"фiѐK_dʌ@2(iE B}B80C\8`Qͤ4g0HŅ/m]:ammtpgnX<]D̴aDL$[\ڸ_a>^{g[c,O ջ)~n?Ŋ^* =Pp$8IsڜM;3 cmJ̥TλE|78r ;* cn+ HS6Lwϻm$d:#aM۴m9-4P82ݓE@3:w:G0" .6yBZanËpJA,g6e8pt[ߨMQ爀g*7!ÐTS+Rm_sQjql^pm}TЯͬNB@͙aE+[ w>x%{֤;L b9d滇i]mzpk=3}YWF|\Ӵiۙ"r؄O; 7ՔHφ4E ˓l@ S;cprrr!PFZBEs#}?oj]E2taAo(c)(32}1Uma ";i#It22%j:S$mEQ gRLkNQ$%dm*ӌD<0xQ47aw{uk nK6+&o-[z?m^77=a gvҷȰQ )N/u"1!k_2~I[Z`܉n=mv݄_nK$d W "ѧ./.w2sG8si6oN fGD'şٿqߍ}xtEwf i}@*ILTb&J,Q+zQCOʚJE-4 v1gDuf^WgYix|͍&eYܶ/m~\ZӆG kӒ(˺1CTU)~i1uLen~z%,2sQmX828AtEDZdmWHÙ3dB(e~_Sap`BTI[kRZfK9xY/i_/fR,ښt8]8֥8\U[3P=ҋKo`S̹MG&̣%8=[  HI `UΨ}kxz#?ٌn3#n~O֟%mᷧwnnq 8XPk(Cy-ZìUp+oGdgHև_qj#F[Dm~%*Mk&}<<!@|`Mqd^Z"#ǥfRJ10eBI9gl{#̊skc>UùW-]%2U`x>=='K]۶^aZ}kmeQc\U|^{L(1J([Uv#a8|p*ҋC4FeeNsl Upv}?OdYۥKRTjV)99[$s:z[׵ em KB$cwwݲXxp*O`F3־岅'v](k™@*.3ݩ(~uΠy7/~Lplp#7%oKywO#6/͛/<ҘHDx 2ÅHZRa",L "qT Uz(oxNOgH+'I 0ϩɲ ʘbLڿ◉w^}}16&{-@Q3 uK}#IRRQj#X{vsp `>ӉNq|^L\$j :tOss+M̬\1/- yDqeJq³U-*t pR3aX?skRqu:l6АY* œŒ=8 y.p KLG N\V .%ϱ LŦ04gg8",[5\D,5/˒u]T[ѡXUiOã)Zk"#3"Cy839wTѳeTJɇ-q*7qy#YT89'gQI ~ry ]VYzcA͢J;*MYUoLtn1H:so.ڛt&Kބk,B wKG'2Aa=2|#2L&:Qpw+N@N3 Gp(S"N_oE_Xəa.)b}*{-%q3eЄ#3%^I DC8cr$͠R2qb" ?L#_2BTj!tOLi3B#82;nOO~}=91YNsKZ%FqbYX]…=`ʈZfn>t2*>F+]#"f8™)*6=F$bqNx>.f)sq Sf&5!ӉF$ϫU!3jFd\8,+ [ctstq +80wV muu-NB$^R wξ^D3"w|ꫮ@s{$&w *Nl=)ceG'栤EF"y$~D.LeKѐqhcDвveäy;QtU ͼO27]#2$nfkqS&q8vd(Ez8w3WSCY0$|RYgxwzj (-32yAnu2Z=šḽāpGqIRBVQb>v"¼OF*Xɾś#v"B*IE􅀢̳= OJ倌cN[o{>cLfTF=""ZQ[ꡐlM eP >Xp IDAT $%<#wB ؜a,D'D36"qOdV'BT˪_LH{Qaڈ񄣺JpE?U5{Fl#3ʸ1$Oz DDry3̲2S(Z̼nwa[׵/w_?<]R2e:-d[mk#ȨhMY֥b꘳$"d0ry[(U^dsfO^a{p/pOkkDd2=[O.Z_-r8fѲ27ֈc.\kȤ֧gD%˥(#7a {Y.M.MTuDD<4| >A;Sq KLg_V1B]7if. įPޗaps"V0Gu۶*^wֱ6AQ_2s۽w@ë4,I*ʂūyv.9EU8`"^9&9YE0B$N`d]f K:([ Q "JΌE &RAP-E4"61uۄu]/szGFD7Ubn$= 13i=T3?Ld"ڴ9^G>TV`ç, k$|,zp:JO~$(R~]DҤ_<.e;Y{\79)!3ք&9IYLz:HɔqHb 2GU-EweU}AㄬR7Oa IE?˿'__ݾm>:,3afBk=2@qp婔z擘jYWLZPfAAp/nFwV̑2a8Be" b;2_31VVX[lwaD^Y9AĕT}߇zg>fVV3#PaxHσ֗"lKkMk_23#Zr/djCfxh*]B-"%,\wXLf^sxU|O%pdḋSQ"^L0Qj'HG\F{m"F"6ǃ@D &%0bdΙ (i9o*]Hs-GDzȲBABKD^Ҭf{7~{q{p[8A32ҝ"Yץ}o3(̜mdm8^˝t4I{6Vbn̶]:wSg.1C#S'(  "߲{6M&?R-s9܆%#U1jt-( EsiF#83;"J[`>I6N$GL3&1O+v^&QvPLߛK8e6D0X #¢52lrd,r$&H'nn]I"^8WQ.׋3vZV{a\B;v jíV_E,9j4fMUU;@nxAX+Ul.m ۜa)<"|fQ)T9jBSsOSxE SLp.fŧ1F ]X X#p~Z8 ,MSKV OB*A̜$fcmiuW-gו0cx]PXŝ374  BP0#^]{~؄hU`~\w߱>cF0|rIl*`2)vKh.}[}D.5(Mx5Kas_MO)JU} i̒UW@H#tF d ^A` đ/YWۃ}KxD3Kk8onJI"$L̘_g~m有g^NtnҚXXuQK:ĨA"auFW!& f8nQeDIҴS& 3r6hﱬ|5Pճ5w 3;G)ɓG^P>ʏPTۃ9i%*ry4 5@zk.~I !* KgemnGY*12CU@U֨^ɰ^-vMnnf%_v "diZ08g%P&3ץNϊJLuŔx6L5\{/g;LmnQ ۴)rϸvfmF,LIMe_sbW ]ks}S#HU`is 3Xi9Fdd_GS^IC~$>ǙuՔ^M~ 3%K%hVn~[ɟ?WK=P%WQ9 bp ` aP;@K5E{wWP1q=PE DE싟}x{nsgX/TE{&X"➶`av\*-ҙȣ*eMm .HAEg}0Y :m6mE(f#EL#(#תpr\* Dak|X{~37KK ixܟnWC՛m]oL. 66e1|l{DNs<ƕ}Ӎ.k>xrX"ԦDJJMD(e ^7>L[8 XȘv {F~aݛ/^(Ǐonv2j^!D kI*s9f:*$h0=D I"$.Ҷs=B2CeKPFPB}?O{Fݔ 9zG.T},b60a6pg؜u7-kXe#La%4Rf.‰EEdƈ򄤊F0fubJdx+IsAu:Y,k:/R63KbGY&RU㶳D\BTȎs!R[ph+wi`T:zYP$qx.E5 Y(8=@j82#CX,Hw "A(ݑIi\UrQ7u-̖z#@PۘzRvSu(*~1a gҳ8l@QcYJf+vdBUw|Jǎ>#jO>zoDGAͩ.2#c}HOw|0Ʃc2'?_/42s>9<_?5„'s]F_L'K`ҧ קXZSiDP1g_{_gOuwA<*_5c "]}/ZDNfNhMWN2`e-]"$k~[_~9F}} ͶTYR2N`ڃu.J0{v)`pk99'M$ɲsTcȡ2k 4 KR(Boؐ 4 ].TUVgnEHdG;4"9 'fi&-Z#ЁK!Nۜ ^C}bїd~ 1WƟ([)5Z3۞:Â8Da#e3<ޙ=6cD}ĿCS7r K}ΰh +ϐxe|G5V|_>oUn~M^%-"&ܖk<.]~XOnYmv'%4emBA,.p70(|A g"?@Jvo7g4QJ/~_?{>nnL4JKa,K)@`e6G6}Gaޗ~ M$U̵ܻ9YX-ܙYL}~i5z=@MdE9;a:"iE(mƲf\li-S*LťrO34ߟtKofS/Ǡ?ri[K9_&`ƴdDl{xzn5߯}tFvqz;z~բ#sx{qf˫s7&I/ԉcGq'f],x¬@Et%; LwiN 'j˥_^H }m&=3s>.~\_=y>:(rg##r,<}$.W}m*.sFaKHfmzM^g?h?rC#TO|q:F5Nj*$*4b7Lg!y%3N4ODGdz_LMؔ]G̗Q*PL}ϐ8t0uxEabd1DiI".p ^݄ 0UePppٜ9U;W+#=A0{8uۢS2LY%UctQ)HEl"ޚ1޷x6IUì["֦[kf}DW֖܄yYmJRf>MaIDuU |N-7Tim**o{_zHqtcFcRHt3trL0Knz~_o ,,LL>"Qk=g9sθ,Q1nU""Y\ 7 H܍}wOoȇ.ܯk.ׇ鱽?ߎ6:Ar]?ۆlk:sY"˵vK^ndD땰ooz޷Azq}LGf6 ]dY5c%Xws&u^.=wE&7&}t1$eC[linON`U,a7wW{!?x[E7rJqy/i{a#70ecA p2BKdQ1)!"b*ksz_/GI?U; iӬrO%O9tHxD1Sf-'9=e[Y/Nd0ʊm.kYٲ5su]*V$mmKb2D;Gf!cβL~UNCnqp:OLOw#$)">'gRV5#1y+ȠS&av1 +9˾^?/.fwVd8/`փȥff޻f6_Vc[ q`ү!KeeXh VH\uYwG>Av]LٚrM%E'H:ѵsiIٞ$=+Agޙ.*:݈y.d\ }iI WbӈB $"&ִd7-m힢V({oKcd]ĔWg{t%_{?VG_=~I^\eKC,{оz՟yYv*QYH@x6dRFc# *^4V7 L65HFƈ,2nC-LF"Fcr)UpZBF2AI 9l}Q[L1ݭ"gNf2l@4iO(ņGtfDJQ}(Q aF IDATK3TV`RF}"qOˈfPš>$"U)TYB޶֖N4'gb?`'U- ?%b(q!mR_zX<ݛAcv> O>wmF3da!'4>+;.$4!8?[dK`EWRqJ^ڣ6#¬xUV.qZ5x%aqӞ&Ѧ&}dW{gxbs[n>- NL{ۅjf,ܝb.m X 3ATmL>$2JK˺=^:;zkeDjoY4S<{\}{? 17l`y{K[}=u f6Wd[cF=AAȦl3[ 2E) ^!KTE\׵h)$AB,jUBe&ZС iBDB5-!Y32rp`&LV[Rw#H8LaS @\)jtHQc9kZ;R mN]5fwxa o%OEhTb^ %!D/KVlP 7$a`=cLT`:vL%@\[۷Ƣ 9̌on8?J9 OnƔ,>EvȤ҃9hV[(@] bb27 cyXKjd.UhL||_$(T"DTuy, ZW[~W~]/ME@Ud #:M/'r%/Ko)9s/ÜJ^;M;38mmz *އo Kg7`hUUFu;4Li,˥=F)#Y gFED܈C 7ZH3r I;3И.{_AdAF.ܸm)RwuNv,3"28Q~ rn0ae:3DTfY;PDUBwڊhi2=XB42CU-q@P+OAȨeߑFHlʍ$&! 7RNK13I p/|!| iZA 4(jcbWȣŀ83Oe]mzYby!m#ds$OFGάi/LM*/Uݹ>ZSX V233D=ib>-UEElFgfTXbLWNxO~gִ3#iGSY7/H@0nP /Au1Cev3ƛWr}loK@02½kSJ.%2%VA[^{eM,BZdALihv])骪r-oTN 4Y{9!Ծa}QwԐt"7z{ a6mk|1] ?\f>-9,TF&h[s"EV= ?13-)Jc UJQj M&ʐ|gӧ9^ץd [-< aBPԦ(1D=apSLB 8ߵ^Y#bNyaV޽_4B,?,sγLr5U:iUFG%={,+H &2 &H!P&P5G'JeC@F$#'L)Ǻ.>`gBRd-Uo23U - /ԉs~2; BX~7Dtsn/9q(=&fdR&GҦIc 3ϟv)**d1*׎U}Rg.k_( yg.-_gIDwyedŸ+~*߉(:.!ZG-5YʤR%2jcwQ ܛ#%3)T%|&ޅ.ĖnJ5LўϷ?+s<)qs [2A٤Aygu|z3&j$P'NaZL"P%!DkWwcJVe)Duۇǟas⏙rI@ Je*vX-"M[Eè̴rq-˺mwL9{_1ed9#qTRP fQRQ~" g =lj@ ;5/q~&MrtLSbBƴY)&.\DJCY`nyx>|aȴgFGGo|yj4%drǕPܵ9AT2q4~(ͮmƶ?ud<Èn0! @W -},ǻ\ QB L% ehd"A2%Y8$ pTɚLI.$m %.~==b*wa) A̪3=͖WIOC<,4,HpS[[Z߇7Vc~X6VϫwFN5FdҜƈ*BA,m eoB `V3gl_zl'f 13}Á7F=, ,&%l>o~|>K{j ڕ_@P `fUFIݒ5F P"C*D[ KmX1FL'&Ur RPAxfW҄.LyyEM=9tT[3D&x;fs}i' 6''EX/o 7pCNp11XZTΓ 81)8?gsLsO 1SDW@>U“}u]=HB5bY ww(a0E/6N{V |As1Ҁ_ʉWJ8"Q 6M9ST1e9KdGx /g֧BA {w"M99no>}deY"Ҥo.Ec{.FD:epq~ƿI}?"SE7CFf NBv.23E߶&&LDT;ȖHKWii[0,'k;.$Idʴ E8(m3YfHb#mSz%YA#҅mDDs7oj6$!@#ãԬ*`p8sgV~wۦM#PiOz9nTfc Ȱ 97V4*c9iƙYSDd0%*l̲oW>Z >sKStm:ܖ3THEjjݻ(erj2V;d!K>D+TIGY}o@vHeHQ/QJOKOZx dDǖ3Ȫ(OϡO \RE*Z+IE-y̔a}j3PA^6:b^'*uSIĥKg4ÿ($D4A$=~JZfY ~^?o).r蟵-]ٮ>'z^YfN"@z0ER`ǣϜ? 30} 6Fd%# B !@ш{<~xEVGj}i]yA^5cFHWЈ B?c H(rBcV x`D#F,kB͉KG9g6 Cmߞҷ݇#IH |GRDΚ2羛ݑ!$i|/>{ݐC$ X3,Kf+S`̼y4cW/sw7f΢2Qt}faaOۇOs[-01;4 MnqQQ=< 0Orӛ3jƒQ p$r+MDY[/ l wn`TH0'"`#<6FKr*#iT[ZU, ^Į8i(8"a`pTa娧huEUY"@"{,~kgkY? 10>jyDAuPkג8BZSg-2t .}bDfsTBI򟼔D`j}q} mx,-\4ѕ֑w&A&Zk $3tfMƞ2\ߓ||Z_"$gQdNT.H Ѯ7?wx `.q 6FDP#\UV[׶0P.] '$gaK1go~seuY## <ǰ& # ;x`ꜣAJgt5R0Kl,BD*=Z 2|aErJuDd}C\`5ѣ*CU@J|o cLgs?tC/%:ͬ'QBen'5 iG_Ӟ9#A(T61O;1< LbM"C] $puB.`rSE3#BV 4GPd2߁>F.}Gq0D?k~w74nL (.} ),}>.?vص 4nBkӹ\{]}WoN˺$:m:N>F 'knb@Xڒ. o+&1feZ5#bxk<ヘ99e{@Vt01Yc~Q\z~CDHu.Lzu t22c0O@F$R z*5Bh{D]+9RD.D bt8(pNv}:)> 4":j5g.@UՖn5Q,M @9l9ZmY$@N\|S˶Q㬏O:ZTuAy0_)Ad{k4d CUoKFUAyIqNF$scMv9z~^}?fr$#M.5FDD*`N'ԼZ`cEqQre# )Ypۅ @O)AH!bMgDln>SLxElxzKKR=vZ 흃(/H U@6ȋrK\ھfummSMgz[>\iIBia &D: !gKEL@<)e.uAXG$;c@dMPwUv7fkfYD-x BL#J(Mg6c*3e:pL4i11UhRXe/6E9<JRx/Ik~Y/t71T"FFP"#>G<'aDZSkBq2rD$Ow%n(LZ7( lviOϟa?JuwR  LD iϱPLąo:RDGtf9C|*KsOL#'2<@TDa T2<dfXE"#Tx8(/U)/ڍw\XIHO+I_{~ǃZyﻟzW/opTZ[%k ,yֹRjNȍN Fkx<0dD< QbV^1Yue[%yįqU1GKcLn0$TYYt{xk٫0ߛg0V혒yun31$asCbMuV+Ck@LB$byU``F9h2@ $72Wb|zhd9d)QmNHjUY"hJʬ*AI\ɠZ2kjDCf"kQbt4׹0y.Tbӱ̊tRx94(=8Ԧ< gvmBU7lAҢģIpjZjՊj:(SjE͓REtFb(@ bDZd,M"DV֨TCMuqd!xmmn=y[T0h>}-j"Uf&dVIPisUejƼT[#%}244R<2ݠ4/~cnA3ra[ڪ7+ҠXU)}9XvLDyc0 DXR"raNyڕi:̗͇s:l29dfRAC9%|$*HcV+B=IXŝ4\{86$tQ@Es@nnp"2>T뱨Z#Zp[zV_dGy԰PmkGE]$qQz@kRhaDˈ` D'X{_ 6p\fY fbFWZlj̒F"RE5.׍@\Kx ZPwok9bjenhhW}fH >\Yg=kmѲV†2dG *Ύ:1'b|a Zye|'?LV uLĉjefNHJC|Fa$L՟b;7@fǝZ.؉4RqqM%Sb''4:{fZjeiCWͳzY-DΜdݪV.FuDC5u^Sԋ=MIy "fSfU#ӄnwvC "wgha*w.Lv'#\Pj(c7ɏ]fQR1 n=9R.LÐaO*ڝB1FmoP7QsqDÂmJk5T s`΀;x)lIm+ _;1FծtژwHZ /Mс1_tj"c!GqQzP}W6 zX󥢽[<8"p"-ہot\KqyvfyAnx}w0<#OOYd7OSɭTRs'HEPJIKUW"e&\$%b ƃDVtr:Zp2 yնBh5!,FGieE\%Wkx%\}x[ܹJ­;/XuaY~!Xܧ+/70ʃ­QLSkhnNvtxr14"qN", ωm>ԍG]/YARLmCZ@+RTꑈRM)̢YǃkAfra]Ne@H2K9Ov9Jr{w8*w4H>I:;/O]T{{ 6 ꇩâŭ;du( adqv /Ewc0RF(6bogiK!r,a57]4ö{ѓ/E~m VZ i{0uŨ5Uk] V շE!)HjMVB0,8he{6qϢɮXv]\L:hjЫTcM_^n`{_G$n㷃+z8CBXlLͧxB-+\ ̝TʑjO0jIff$B2r$aiwnGߝ zDBqSQ)|yyr]sT),2 g"kydDYqw\/= F#ʲ]]sǔyɝc!ȻyGGkp2.9MWʳ9Biَ2 ABE ha*DZG.gXq) 9c+V~ņ8.TQb6oQz+t-7mI*8U|dq2s0 37`+"ePp;u8B棖 qwZVUUo%+uP[jbg+!jdy7 5Z=@.y- 4[־ A1>nnPF|Ah^8>-::(PQ(+X'Qjp+r{zN\) r}o/+L};+͕VL|7%d]+&Ƭ2}xUNzwdžFڌT=Q?mǑ  D6; > "ٴ*bUIk~#RAGӻn4CgIg)l8 ĝk-!Ztf)p3deu1սg`HdNm`Vj^ͪUѢ0h5=<"Ta)1Aث|7d='=Y9/j,2raPBȝʱ$ \j54PhDa@V_bl:fRC0ţ .lAqxa: ']%-TzihUCc38ڈsn~˛Сg7ϝ(uݺ[ڶB y{_j^{p9<#ޢR3 j<]յDlK5*w$v4F$)-N%R14T"sWF+$ N)DBT/)(\Mk!aG40+8J E=R,gaVtGӽi nыjLN䬳ldOU5U7WrR&Ff얲X(gN9sɚ(ߨ*:wwi:< M"̴(L̻3TMg:qphUҌ`d ?`7ªYl6D4.ago^GDbDx߬ZY :&usՉvDGD/,deQ߁-K:->("+Ujߦi/ƍVv!?įq&~nC6[ȲUt~k a69XI">)Vu7ɔhGI+LNVh< C2#7V́8fpy7_ ^=<QRU}(V<]b02T]tv>X6+5qV3· Jjjy btʹYoX-\p.nbŌBnP'cdt,tRQ 0*0vԨ=zI57 $8d<5$sTjMImosWE;ePtͲD."Lb'&# Gqs J'H #)P F"RrTpΤj²K2 2GN>fx ֢,*,ۙ(%&"R"v1' [:^Lryg?v&B.2`ҁl6]T0=];jaG1su"$At2x6-󡌻P9+j,}[s^}hZ$AR{fΚ0۠/)C CJ-h.[f/z<;9cJ+o)!?̭bj!R;qHt]0LUb6 [i/2NS0C3>k)t`SpC]r[Bg| ]U%iYn?b7|\fA^7ncrnv8DM[PnWŬ?VzYwi] 5*1_pO`UpCVQsq%3$^|p|nsg̽C1CѢ,I@@<ݍsvɉ(1t9'\]磟E?DH/~>&dIvySm!BifFjVUM5|}CªZ.C!{T ], @n{(Yѕ^;*jnt~:hс:37Z Qy<~JN2WqDER2Q/!)F&f+&dvvVԅH4OvjAr} q8 0s: 3 3PK/}g6O*)rGrwI<ϦN IDAT %6R{*K;IedB"7|$vmG@$&Sw;Rq52,A#U*!wplj-ߐ8;*INS݋$C pxS#z8 Q5vo!]Xk9["[.D$I$KUNb"v0>C/l9l͵ J|t)tiQaL4ONɞf+P|VXՐsҵҦ fZh!eP0p{qsn w۲P,жBU:Vm(~iBȯB(HAgV]3^ય3nn ɠ$Ds18JPF5egjP;y!x< R$9c68X P:č;;yWD<]Ǎ0=ǽ`.fsd-FL8l27<9{:9!I)V3)0L`Uj)e4BAH2ִX@InĮ (nJR7ͥf]?S %!3x˾7CFh##cEP.]%fFZ= ?P/< fS0`o<^}w\&>^,UG.4jCZ-4ƖbH`yֻ*]Ѯ}0>JW)2~l[LlԣMQ{o-djZ'DpFݪ7G;{kHWWjpXR]LjRs#o%ꌜz(d_cRknP sS?{ŠB VuRNYB F` Gˬx  1?KiF0a<(zd6}r*4ۑFBzXDݟ|f$8AHD& Ȓ]lGd%CQl@| yNYds)7P"iDS\He_Q&ՠZ]vuw0+4\1B[fǦ6d"qmM;>ӍlM%#oDhMU h!vz, -V%ߗ/W:y ј{{F-B;c%WnlQ,T7*mPoAD,Fz53̜U)@ Sx 6&6t1W3 %ݕ,[d .d@[Q <*ܴWn6{UJ8qV0nBaqi@fޱKfRIKuZ ѴNѬ& ZQ+b3%: =4U'RhuUo)(h|y2zv  S⴯K[n@:/ծRӐ3mVܭ"& CWt}R0Bܸ$px-3짮=0- :SjZ{5)Z +"Mu!Vkm%lldt"XǾPvW<:/ܯp^َA%zQR~4.o.l^?X mIkw%<]B*@R)iZI/yȵT6t3.6}PAܝ\6l\p}QW4ⶇñr5grqhi"!JՈ]UYaywKVRLT% 8٘ CR* #SN娍x݇̔T/ATU(^P-]`f4N61$SrdTV,%Gj3H3AȔ!. BNVSJHСҗศ?Sutէ;oX""oy ,GUlPw0W($ȠHRa''PJ6.8QK2EEevY&zѭJV$[2V4F7ӸQ Pw.M-;ojʢAPx|~.^OTNwOwَTVw/ Rv y/ͤΣ"Y@<~hY!fƗEnfqE?w\AW*.[g}ƹӶ -+-x=/OOoo|>sOco5ݿg{w"6fpYA VbP2V~L$2sɊ ](kUJ jF ,P-$^#-@DbRaGIRkeqv'$¦ZUiiyZ̴>\znn Dd% G1"}IK{OOe_6}/_ċo37?A[;%bj1G5WD©@hl+#wL8$㭩SM9.*WG(,FδxE/l3,%`--oXPV; .j>dWԇ&0 <1;?%^Lhּ ̯|_J[V-s_tۅ>4Ggƿ8v,j *Nw/9_@G][#Yxe6'qBaj;c$J-{k~wwߟi?p8~pyր|m*^t>"DH4C `Sm,L~d|wZLzZ UtILF6kP qB%j<iyF5u \9!e6WbìrϡZfQy ;9p(\1EKLRJl,9'fPDQ O]uw<{^wi߹o?`$u8=vj֌YFI ON/?eGOµ.<u SoJEb ;+շ~jy-}GOݦnXL _<=LBTG0D2Z Z_HX?B}?Exx;nElGN)L)KTyDRܭ5Ͻ XO>?#SHB~a_[l(nʍ #}Ͽuإb&`ӏ|;nSUs]фУ@f.$k\rF &/#/q@ HiItmgD0&h5s oIJ/=g_57G˔h{a(t}5;G_|p.ƧO_ -.6og;4]͘q[ i͊? o?DO~'_C?}|~oo?_oҟG~\=T 9ER U]gutǞ2CN9[+^|>8PݝݳJplPXX| <Κ$tm4唙% ;K '@Vk`v7B2RJujJHZaQݯ%w]xjW\{x׳}g;Mi1p]2L= uʙԺ#Ӧ7Z_arJ'OTkA-fO~˛]:٤W][CVC]M@XL$xvͷO2hC1&Ixg -Da`S)`Y8?G"/{k~V,=ٻ:1GZ᪮X fxCfj\Tu8g[x>O;۳p Բ%{w}9ů[ sEQr5~?WFOl:w[ժ}_)A:r5Vks.:NXGnO_/w|w~w|ok0ʺKf05+ɴ'L {/+ekH؍=ï~w>ZP\^Jf(Y"_O5yvREXܭN3!L hpTOC]A\ɇ1QC*9sĂtɞVjq\6¿|&|h CÓw''LJ|~䎔?ʙǓ`Zi-6aEmW5zdf+fa$n7vCb;SGwOj?Ng{l)?ц B@w|k2O2{Q?Uc<}ɵKfer(g6d`duY".]zƙݶʆٴ9cؑ 0NG1xHCKN2|vzgnn&ftw~Dnxs%>P"NbY4f+Aqۑ@kXjWF,\B0yIwDpYw}'~{H0|'\LF-tmz4`@K}?|Vx=klV_w9ʋKO1 4rϹ a̟_{O|'ܯ_v=Hrӕ΅lUӌ>_ZVw%?Nx|z\[5o,ǶNt>ߜjx!  :ko=gϞmnw}0 ./_{u{ι׏8 h(40^T 6 ԉuCيJJ5iumEԊQi >iV%դdyB'1;^BUTv>BB]_s=9g. ~/Ï}`0+ 1n0iWeaoEQ7qpDClˆ3k Jaϗ"/`y357xD js)a)RuЅ"jҐ ]LϋV) &|L p=L{l Z@JC2!CZ8)kܫB M:\bR9X!ꚎT O[&nuSfQtIDAT2clijtd{@o j:S`D'E-&V?pO?]UsvJGj098fn;U/*^HIK7zh)HX,&z{[] nྉAfr=fexJWOӠ$=czGZLZ#ÒbˀWɜ~F0[k_b\@k'uwM+o\F@c0ۂ7 ok33٠ ݀76{ @ҟ(fS:f,V>"Ox.2 Pl20( &TBɢ \hI5%^ߒ~qq({3qfzJw]dȣFеS9*k,fWrڠ t`kxŘ*]wu3\nUΧE$ZN4?C ~kV?*cҺ/˷p@M+uyS_5${ oww¡&8꺢\Ce00 00;p0; |vC*q)z=;q212Q&я_k%|Ѓ @)&`W1l8c G-G髴Wtf]Dof-\ɀY&T@W`T0Lj.58ր[4ڂߏ_~/WcJx%ޛ'@^+G:  _ yv9\æ6ŋ'bx{ :xZq88M?1itE.Xo(1%xj |pÒҘXwY Px8#V<|? uS]ZBH:Uu30*23ؠZaF?~syq:&#kCQ`QKxX5ԃiȟ`h@>g k 7VY)D"N zbhDU3{7NaQpÃ_żI<E`Vgw[Hb;FuEhvk 5<>lbLf?cQӴ ,Ά֏5+obj:C23p`atŬF'!rxd2SnE.a 5BH%D5BH\#$5BHI5BB !$PB !$PB !$PB !$>2t(ܱ1U#_YH7?xLu$u0]0U/4M| .<3lYxsWdVVV}}}AA(YYYږ… mmm3U+4Mdo˗ a" |Ϟ=Y/\ 75ӹs}Eȑ#q,&&o$M6544̙3nǻCJKKUUϏwiwAJi^>B)(ڎ;ݻ}xMy򝝝qk 9sիϝ;`#TUUSKUUUq+݇qZbŪUjjj2'`nrٲeDvB8NgEV >#1?Ѿ l۶m˖-%%%w6]vڵf͚~С[0%nܸ1Yf| 6tww*50pnwX`Տs*5s1`X4xb2kdCC !Ɇrl(!!DIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot21.png0000644000175000017500000010625314620351225030412 0ustar00hanshansPNG  IHDR6WsBITO IDATxy|ŝ?OUw=Ҍ}Z2؀@l.&l6&ln{r쓐@& ` p)|ȶdK>dY}>~%Klq 35m;o A. } |>TU1[#_[o 6l< B{=9O$[lpח g,ASeeW^z ݻlq_oܜoۄ[>Mпo%k_{W_ o{ĉm۶AUUsss{{{~cǎۍ7ޘzꖖuwym ڝwy]wT*n\^zW^? ='SK_R45,id3*++)uuu///?qGۗǟc,777Ϝ9lkB,v`:\u08wg?93ga^{?. [nrm޼9###33'5kn馱.,,TU sY|O|0=|T*uA3z ,8|,_?~-'?9zy ~JiEE-blWvnᦛnZbń;o؄̘1^>3Vu(pw}wTVVa΍7~ _[bم7BTU}7+**t] ]]]o|yyy^w۶m? <φ ~.l zsUU+VڵkTe.r~Ϟ=ӸVbq#ȏҏ|#M)AŮ]!>@ccﯮ6---]jUaaa$9d2~r3nx6NCə7o^,[|jI_lك>o߾}eeeu]a蘭e0(ٳgc$E#; }=Cw ?>88 ''gѢE_~ݻb&=ŋ9焐y7oذf˗755}߸qcQQQ4'>1s{].htI뮛ol1K/Oee]n_OX,@mnfsG vmf('D}{y3AgǏ߲e 3xN룩Ƙ$IRd @R:6!iӦ|+?o|o˖-w}i=+**}Ѯ^{m )v۪UKIRO81vu-^xls+444mڵDZZZ*bՅBlr[[[q7A.̞=;G"9SJO<~ pq#WOgZA."d;A=o١ 0 s$+ bvFoA>xƇnp.pIx # %BtAK 7. ]{m׻w%[uo7gA0@[u^~8'GiͿ.3FxviC~ -wù "|/<sd7mA zR }aㇸ2ҲIQ$it*7>Y-npW uIZOB ӌp@F`9@\|0 s 9$k0k19 »a\]&+?-.f77& HS,dorg κ@ŧŝX=)i'hɉΘ"2o2g6DZP~{ t1Pm @Ax8^)5@:wIo}X0͜MǧddPٹSNz 0R)Sgn-0&SiN3!ևأk#{>_]TCpcz 5!Ё(^@iJ7Z߉$G<_d (T1vUdEN8'LY ԀC` 3З܃۾ѱkqh R#tb׷#nļÕ5x|/xvΟbwL4A;Gu rf~$ s ?G DZkAeHL<se82%I8_#ٗg# CL(`TÐ4.6)s-AOz?/Y(Yys rw^@5K0 *6i׏ȑ_~L; jwŏv!d_G0tСBt!4&`Id3@) QL/tQCvٽj=8}?w@HsO2[}sP 6}'Дy3@ɭ Tow'o/рYw"ԇ H.;܊ OUțhx6;l9pYԮŠO "Y,p OɸiiHK[A6Ig)*W4Ac}7t1 lx˧ w,b$xt O sQ~7?ȼKPې {#>^w.Z % м?}WA&dVꐟb\ia\}AX`76Yzei`@>Em|92h4 sΙ t2RnYaɌ|@}$o.- \ ,"vR,V3#һ{gt޿ vH]! g1@>yAK A." \"D@AD.p]! %BtAK  ||=DhjOʄNȹ';IdƷ-x&?hMKt>fw.H.^&UvAd$;$;$$@vBvnJNR@l : L#@k.&\IrznP5畔(d,$ d'ȅ'WMe  !`dkm"%ွ>UAdH/`s#ԏX0Z:;™ B0 [,2tݍ(n ?w>F2W|8j̻?uPUDG_pzѲ3W@d z'qVc+<-.{X1WD ڗJF7_P[ˮYy CqHU^ϋ┟~Pgvظ@i^ﯾ`Pt.qb\>B"cs5Yyj$4k' tA"#Du!,Y ļ; 0P0TBo<>BK(ʗ g89pi9SdR {zfI"8 A=oC q8 }b*C*o% 8ݑntP 9 o>3\>83b+/{'Ӗܕí^™.7 <ȫn dvHv^x9m|]zЇg>Ak_2V esn9UCWJ[@6Tlߎï2PA?NDG5$+f, 2S0ЍBp#8H6HnA?"  VP{Chʼn}"¥}KoNV'f] n v:0sP !Ѓ s 9UG!Tcpp'fCW98  :0p LB$ =ӄU>ҡơ*= O[<2q6y ϛ˽W`$({tMzW_e$Z#dlF`GH=mڴ]_c;co-!5.+̀Ã* !>9`CB@Af |C1̽yI8x U*| YA n s .X B2ρH!d 0cȟ P TIAȏn\zS;̀DZ&n8ȹ<`JBD,=El$*8j䯮asy_%p{IK-ϟY\gI3t74IRQd_#%mKB~c3K:*V_=x4x9#-"Ŋ +P,8Q#( Jʮ;'Y yܔ̊ YW[uι81 (E0pivd 2o a @̊ZE!E!xJ`h }`6pc EN碳;$4H$@={#AtqI`t ]prLNO@b|U-zE 2/V#m'&S 2}hN>ohJYkHK2h6^%)H~ 2] :xC`EPA*g:H !B4h7Rqh*aXp{UK:VX  YB! Bf`u70@Z4+謃;mrKЍJc31 Vަ~BdLɝFOBG>z|0FG W8H4X*@ \(0@U1Hx'AaLu0&MEF{6mR!AD %BtAK00e֭6Y \Sd]vӕ&#$Q )0k`0nٙhDfz܎@,j,'?JXղɨjqU**/SbsZ/wAdur{]`tڹsC`(><JOKsv{n#::[p&d,Jwv)bկOcds;P"1Y@'`DKѨrux X^QdqI cO*̪TţIErQUzd TAu]ӴrcLUUS!Tj-Rjnqa恆!2EDeZ둎=/ OQ: j$KRn(EC!R4|8`錫o^*ΜYUU7G(gϞzMnT*5k,R]9YxjoιU)===jt:ovJ$If\$Iunsx& JѣG%I핕aȲ k.ϧi%B AxI_.D|bN{NbDV748 2|n+0̗ v[ZHsg3TWW/]n:~xccŋm6EQDL5iFb`(,޽{pp7ljjr:? '̟wu%4#7&UMLe¡Pt([D`0 4JyDW$<;Ir9fcv'|0,\s\*馛瞚]D"رcV\lٲ|36mX,wyW\zUVuttzw/YۺuwXAAANNNzzmfXzzzZ[[biv5הvtt !{J7E@w8i޴p(Xw*F"q*S*`jڮ _K fQyխW,XS]2>2Jec <13nZyNby?ϻn3{no vs< ΣM_-n=n{ҥtGѕ+W\.C#  l)j@ oFA4LXvxva/vves8.ש暟U.Pˑ[{#i,/?˄UDfƍ=mF97nLKK16mΝ;>|;v8tPyy믿^SS_o sp8 1 !oSO\2_UUUUUUu=L2Ƃ c| xٳgitSgkf5,),9=5w٥;+:[ܲͲ7LRi}?/Њƞ8eWq#E !d2 ȰDsp8ۻ,YbXdMMMeeeaa VuΜ9fc2FfFX,v. IDATСٳg|P(dZ)xrJ,K*:vXAAAqqq$1FBf3Syyyw9s2+ͺY8e f՜V 7C} W+Ur9>!!MOm=g,?8W4辆҂-qEd:, !f6f4s.Ie10̲EfۂyY8Zh^&[̣ѷF圛hnQhn˲lhļc {Ҧp8\UUe7OV9w<~#­=l l˒d[dE-Q"q~z.E08dV 3t6k8u8doQ6cL(3ZQ>[s09皦n [`&hx|Ƙ/я>!. so[8k?B;H !*,Ps0 ]gP.F 4KcS<Aceee5{d)Jޮ#.׀$Y9Pb>Gep 88fWuPpMlXV7{2lf:żi͓]#̾M W D"5N=TRKsrE%B @$B),7{Y1p0 $jwDG1\"HEEŬYF 1Rc?}e&͞achԬ}4w-Y12 c͔ҴE%!~?++KtA/`0t:N{ClvEuHeR(%眘qBE 39eYXi"j8?o(۷o߹s088XXX(9vWhά9Fa .(--d2YRRb>\n9KUU࠮'===[ַ~{ҥyy9#pq =4b:t jPI `RZRSjZJTUSSZRգT$Lh<&ñd4 CX(r:]탁??PJC磔^ZQmݺN^Gۿ?dzꖖt S__ؘsȑzպm6rرH$bVAxp322JJJqҔ !h2RŪK܀&qB J,I8D%J 隦k)9HM8:EƘf;yY^UUezWTT3K5͞YzzzGoo/缳SQ]Νi&m6Z2늢vD&]ѻH$8D'Ѱ?MPx( 2]cbQh}hJd v yf-Ul.[2-c,77̚5m``pHz8FE<Ommmss륔Q>|x`0##fnO:h"IGzzz$ijj✗Y,G_-pLV(IrDb4ce<bAsVŨD"Z5.BSIJ}Y]Y,#E(Gg3+ׯ7G񌖦I}i9c %I2Gn6b~Y mA([',w/eIB1CIs]3*}#%tJEJ$ReJ <OY)M1;O&,[H54ی^{hAg/Jf7\)*qJ\=mL((WOOH2"7qv!?{(œ&L7bͦo'5sNhA Sq5 ;zEe>]皡,TJ?65 ;ݩTMc` ǒ;i6}8 s΀sZ DaJ(EV,fR@-fKF2!E&q]3ɸ͂ =tMS5M}7HAs% \"D@ADLrx )pqrB){w> 4+kN]ɏA.".p]1EʅB5r`sfsNF2 }g* LjN O0-@(1Trz'>p{i|r Xԉ55AM)ᮺCSj0-Pk?;g`0:vq@5WZk M 5  1E%u,tǑВHik~ h< }aiRFϰQtۑ\$޿xȑ'f-6D 3CQB=3]y,tP'W[:8qʜ4=bI܄PnM;|$c[fW%wh*h"7<)GCptX|— 0uahN8 h8u%:@PUejZE!hc뚦M9J0CQ IUTXKiMgEJ+|liJm4L4NX݃-߽Lׄ(RSSsAM̙s 7R9s Ls8sm'$Ax|B(pɘK0د3k:I7-r)VǒO"NEZNCY Skz" 焐ڸqcIIIqq$I'Oܵka===_Eݹsg$1]mmm}}$I,=zt޽f7ӳsNUU:s \ mޣ>uxeqq۩tD{:_;D?W\0ӹFʟ`]@?!xGimm=vX}}?9OOOW'X,9'X 6 رcǎ'Odp8| E ;v*J z2mK2EEifdJK*r b]{ܴ}Kon~T½P7hPO\97"kIѨG?rrssgΜc}#?~<߾}u](JCCç?d2R\\$Ow(ȍ-X"|_fvV̊r{p ?w_1'O_>=@mP/q fF|.vca}#inn޲e<97,s%Iu<\$ι,999/3g Ø9sf{{bYhQaaE^H p" <~jonf&uS&P}졯|oՕ^Ɠ?-:{DVvx@iPzY2'˜b!wTѣ۶m/nݺxp""Es^RR2k,6~dD+?O Bw>tY%AtJ$KL=ʏ[_޾~$T\Lدz"BH8 "<--ѣW]umiiYzu{{ÇWZnpwmۗ/_JmVRRmX8?--СC˖- p") Yz ,ʖ/O!A)8C ?Y{;=yY&x'1ڽ@;I PXmrI^)K QJ.3c̫0(RM̼ !Dusvo>z <6ͦv(8PB1͙3g) 2=ݮ':;gUͫV{h+Cv?V)!tޛ =iСFI4y7t]WU6 Lؠ94m4nn< E坩mW9dI]d링t*aBM< JnXv_I' a0Ч,I_a=AsLuf eW"A+//t#EEn sr,`w`=I/_61O=Ϝ̭HY>}-*6IPj&R(gAv#H#&/sA.fx<>444~=tC1tI&rZ9nsj(o  ;!HYfL4 #;;6 ]63 Z[lX,ҭ[b۷\/fL+bZ'O644R۷Bg}1m6]Eڷo9 EsU^^>S:L#X 8P_7@Cni׫Oo:QR_?esE/ ߽6,E"* NϥiW_=44tȑF <Ouu_3fhޞH$̴$I]]]/fٳdDfΜ9wP(b֭[?G \ͣ%}n,Vk"7qI_} _lnFnna_9֍/1g(pqq>~EJmV^vڗ^z)Uy󺺺4M[ti{{3:t7 WnFAA>T*eND^ifhMj[le pɘYzQt: H's %Gv^5窢™{Ӄɤҧ>6oWk}X288$bJinn]cs xjkk<OUUU}}}ff !fɜEUU0c;pѣG͛gFfff+**Zxݻ48 \&)*Jލw@lb`REIabhkWOg:Jˎĕ94]KA&ul/-S9}ƄE}962z02pT/ p院8יPU-7Iqx;@ H2ojL)Qڙfc~O%N)6ëYh8ht>us3^^`~"Dip`eMKS ~xP5@QG4`.4D@%>n2^I/_^QQ?qxxokjj222, bEɾlN/ 7/7pvZe %7[\0kOs@ss&p*kЍL#2`|47IdXw}С7~_ P*F? 2&s@(jvayiwgX$FS9c_o5x6zB&z6L`SXid0a 1F)_s5k֬Z;w\~ӻ>)F>3z{^+۬6k[WʌteNFucIVuTuʸrͯbm;#=tsh$zC!>pR:00"33sںw+4JM |yiƘ$ISV@lD4evb8;kN'ޢ} O^~<843FwZ0fp,5ebeggfs. ?!N BUUUV|cIwH(e ]=28,#%s9zegfmݾ<&n/4a0OOK?oଣDcF` u0A:Ƙa3‚H"5YT9EZTVJH=9뺆V,ȗtnf9lGZ[ ':F&A&4 €+]=I9)O,ƛy`ȑoaYA폛wgK%B0O0XgM8ڂQ.BH"H&gOH4U(DcVlt+ [7m]x?7~{޽x^0F+ 5ҡ:UU-[vĉYfegg-Rs::{l33:1!DӴݻw'IEQ,YnޗD"o~VUU}A.B`0xb-*vWm9K RnH=.3;դj勖7僇 }]aY,fY{JRYR.y|Uչ - IDATt3ϐ@H$L2\VשzUp}k'zZkmJւ 2H@2ə=BHuXߏ|N^{O䷟gص뮳Zv2 /Kx`4=(mmmIIIL5M3Mo-))Yxqggg^%$$X,xv;o~p>vr)ybCǙJ2C6r9=B6wr:jraSo-ywο޲*A8 G P$\rMӮzEQZ[[{{{Aعs,ˢ(ر#o۶tڵ+#YaUUU麾gϞ@ ={ Ðec߾}#|`Qcǎ'CǓx)\H BRIsj'9ɵ}ErrMaѯNC \@֭ۘy5b$ 6%t]_hQ{{{ii0uT˵k׮ޱcnܸq…`02 >}7PU[n)))9sfrrrcc-,,x<@  mܸ.ل\H!` hkxA 隬X^:rQs<.ҙC]'8afttWnr릡1$I͛7\Ey޾>bzaa!XYf566]qH9jԨkѢE̐xmڴ={Kpp82ä^oJH^N7)&=)f4 R );>ya?i1ww8i[a-C[Au$/'QZBĉ,@ pq] x'X+[oZt-bf[[ѣGEQdbMپ};twaBH B!]CP___mmO?]QQn-kGEQQ5kְE$)//7 'r8_No}2ӏVc˾Ϳ @ǍvffMMGAnjRoaFt(J՚p]wN IRggᆱ(ƍ`ՑHDMƌꫯ666G]f_| ppnZvr]cG40TUmjjںuj-..nhhXzK/x!nz! ,())azCCÌ3~{0y`0tsʰ`A-MOOu}Ң<h'p J YP{W5rw|[G=l8k+++[noܱc{311+xGpz˖-[vٶJ\Ӵ_wlt:A B?pBB Lu];yd ذaÕW^zRRR4=pĉgΜYVVt:V%Kƍ}!;BN M)@`ʕ֯_z4Y l1cL:U$6Z}}};vXxj=tiiz<^.P___SSӥh _He@.ȷM5zݪ% K8v"`151_zG߸fryWq\xS]H`0ht]w8j&M ~dۣ(]Y3?0zN<)BZZ~1{w9o6N>} .dhtƌ<o /,ZHQ_~y޼y,۰e׍u4p2i~衇LlhhسgOo|h0 b~7[?Lv:>hjj*p> =Obbf#rʲ, ZU_OʂE{{|O -wu `#F ʙ A'x}Ysekfbi5^VV6}tM|>ٳQ̬fvwP(3LSSSAb_>(1G ;tPNN뚦7 p>PJG(]r?(r4e.$IJ:eY J 8 1A ?[k>q)ֿ|y^/!d*1uuu0qĴ4BHMMݻ.\DltG HIIA|UV\}՚Λ7/..b@[[[RR,ˑHcĉ:tW_)S$&&ӧOggg ?ӱ0z{{333 !MMM(677޽{ƌNRr,Kssѣ{zz.]Jnjjf۷ooii;%Ibb2zhD"gԨQ'OYd+άQ`3Ă <,<6g񱣄_W7tSBpQf2_^sB)eG9;Plr&g v62vlA?49c|)SXX(jjsh:mR՗}ZVQRJ&@V$I(Q7@PVbUe-Rc:cPIo);bGccЋfty͡uƎ.{p8S4MFȦ(RBzT3%k<;0 Y4 `@S,r0[?{קS|p(FAmrrrx=ς2qD~#Mڪ =D, UפAH QNHJJuJQDG¦EQs7GcΪ s_\5b#cϑ}YawqKD"qqqpT!$)úRA#$}}aM) ,5Unm0D #GjP{n0DQ\vM<9pnNMM|aÆX}Lfdh1dHp^YO8[K_n]]]]pIصki` X"?_C[oݺ5VL[,K| 9uTUUU`3B3!HvD#fMIq iGmOחlzTLJt% zw~B[zak+))a,0P(YrwwwccEfϞ]\\,bggg}}=vN:.DNQI )JaQ(T(>EX8qbԩǏwhevzz:`qcuzOOϜ9sy'$$8μ/55inxy! zzz-Ku%׷ϟ??v`l,&E X:e[[!|.lϹylX%%٨XIH RXfDUh;F{dW.";1v[g\͛UjHԭV;FrDĹ;$@D# {eY:U_Ep6&ocRHlfo12}$g2̙p8bY;O ޏ 'F'ĀUv0X*i3Bt&yP(5+5]͔U IM0t,Z^#A-Pb'FH&%/b60iiipҸ8 gAZEEEv(@4ـR @ 7BR">g9P>tF/C(4J(+6qp8` eSJEa/ \9cD>t|%8 9s; :p8 t0>8p>pp8/\9 0.Q00'4X9b(A(TI[II$ n_2p8czp^Lv£_ !p8ނH`YM@Dw'R;dr8'')\icƵ\9 €йEzYO /Ϙ̥牢z_ٿgk~bQ˭$ (p8<`#(PL({vIM+/8޻%Lk飢0#tL!0. @#exki`?:b `t:SSS{z<{g! =sXۺu?;w666nذbررc cf͚;w˗njjz~Ჲ#AxW9|rQn;zg_~W^yw߭i( IDATw؉pFɶ:,; ` 0 ,e?wI9eNd' („B B}Nθ?bGstBLErر~7pEQs8}}}w>}cyo}[7n4 #fdY<~Ç;::ƍ;gϾ{,YR]]}WN6-%%aҥW_}ѣӳ0ϣ>ZPPR__} htΫ[kvM7YV^rBE<5w*' `.s@"pmCC#@/VӇ϶(0 X4.uzsZU6Km6[4u89h4 oW^+eYʲ,i,lB]ׯ~޼yG޾}ĉ+**^z%ͤrEQvE0SAxKKK5M;!M~_jJJJFFPŬ/33s|SrBYlb2XԹ>J3e'z7^At`PƄp!]]]'O|7.\ZZZ׷e˖Sifnn#GMǎ+--MOO?zh{{}bQ***g̘ PJc[lKvXBH4=} gsߟ6{ld|ӧOo H"> sڶ ^jp R:ˡW(c=vc֕KaXz " [ȴ\C7ƚ~2#QJn'NhZw9o޼ɓ'3al \sn6mځt]׿jRRRii ƌBst\'ONJJ3fǽ^ŋv()))nr9И1cl2k֬(ϲw޹sfeeM4)??? :vu]׽^ojj*&|@D &usi~5ICdDQ__߅I]N}*<JchA?!5C~ X텞una0K_A`s,毸G5M^iR68+/S;ga-lBHh1yobc!KT7@=0Y pEo8߻d9č$q>sm @Rin-GM`Ls (dhF갳F:Bp8/Aĭ~sߧ@dr`.Z @ E|t#.{#b.Cm=،{䖜IoVS  @ࣵLi¸ .`dgg09 ŢV!un(:D/@>2uH5fMά7 գ/ē>2w= Pҷ47Y_F︆0KZHwGc^V1 *7P;|&}2p8B԰}^kܾ m4gW zZÆ=+n 9D@5LMy@0|wP?2MGJP8GE OfnnvoڴiӦM`F!c 1zl66els]k:ù< D~m ! jt< c _BuBi, `^A.\.:L rM7$*` _D\S@Ƥ|d_–$EB={,X`޼y%%%ax<0jkkDQ 'O B>?zLEQq^^^OO3Z6k BWŊTTTxޭ[۷B$IbWBGQQF`0*b9vXGGݻ٣,a?)@ bC1-nx_|nad2߁(> *pG9}Egy&M۟2gA`__pe1744(Juuu,c nݺeMƍt:}>n{>Ur\ SLIHH`'rAp8 0ڒ"w|ڥ`耇c$p!#.|Ic 5Fj ׋1z`XBb!aLNAF=eʔ竪b$6biookf^^^QQ}Qsd2!s+ *Fa4} 4uI# Ap-ra$JE^܄ICgޕٳgceYlN3++k,Ej:UUsssn*W^BE#Geee͚5㉋c[<$IGel6رc'OaCD67 d҃WU]pĸV|{>MG3O f <' SU>uw5/8; m+90)I/ S0b5Ί&JY,_#h!̮3og39&~e?׬#˿b66 v:t82p8Jl%ϷtG̛aׯuyhlvC(ikagl(G]YC:p> dQϧ0P. +6}`@!7P㌋j!$HG9Sd@~u Ζ bD p8/ $mRu#7ُZ(b1/C}= M{ =9ʀB_3!EP8 ,!(Ž N0WO([68ЁyZy3ρ!90m}%=#{$xCY蔂Bm坠Cp8U7v1շs@gohWR&,|P p8_x0BN{ջm &ԍ+U P>Kp.3$&L-x< &4'P5bSC ,Ut'FE) Oy`ԨlEKC :!Pr8%@m55Īo_HN(8AZF9siPٙ~RdBBvkq2G&8c!.\9瓃{|pg@Rbt[iD4Ĩˣ:g c,r j\9Sz$A  -L ,)V͑rT"K0.eibp8_f(7(kQg͏PE Kp&p8Na-pqX[t&3~Xm0+c~@'kp8: :+0BS`M#ii(H$1p80"A #,90#džNFӤ4BЇj- l ֞⒉5-BGRbF b;L1QdQDEZUns8 Dl9NSQᴹ\ qCU xANj h#T 6o4L{ʨkBBm ԑw=;+ϝ} aK\/!pc#{}abAm[|QJ !~_3NEp.y‘Hc9yP /WWquu+**Z#" D:0Bc2FH D z(%EZ@u @I7λB8iD(t#^QSj*r ï$޽jwy:?ZGj ۱`%'!t=7O\>z\VHᘠ~]֬>RN8EP(h0q  ^Ւ 5K?i@ ( 뿇L_X2B!],~VE 1< ?$:`8gr8Hg4nL.I3b3"Cp8p8/g n f$g0H{)dxRgq# B( "Q4! T k!MDqD@ B)!NDIMSpD3t lu}Ȫ/ӿ`ˀC0 CLʿ\h~muhr8Χ9.Mm )p%"3Q=Vw:8j p@H7u{/{#@G{챜3C@L%IӟT]]m=3k,@ŠB0L `P(6p(m?TUXWQ, +̚gs%%'+#ct~rX0 mmm~!RUUwbV8E׿~_u}GYI7lP^^.IRUUՉ'֯_xbUV ƺoذa߾}aXb/w-bWWתUA8zhIIIgg'ȑ#_,IW^cuZ<{] | ===l1P({eOp8d[ǝ>q&kZ^I}ך._޽ q`k6ib<>Vٞz~)E }'Nx<@ }[nemIIu](JZZZfffgg端yh40;=zCIIIWW?~~]F4_bwj!DeBH[[ۓO>/677DZcdYB(kn޼p|ߎD",\QjӦMjXss[oO>iO?DW\yisY(E$ |*VS޾섂7]=}w-YL\ثy#ݝqIٮ1}PO?Bm۶WQQ!BAA7կ~Hym67|w(R__wvAvEn+gjiiF===cǎ3gNFFFvv9sۻN:Eiii?~}ݗ@)0aB^^^VVVqqeˮz`;v,[l&%%QJeY-'[xqjj*!_w8'N]`h4&%%NKK}P7ͻ{^~eAկ… /_Cki$&&(z衇k&##=[R^^=nؾ}IV3~op>W D@yN,@(Xed$)(?7>>vggg?SO b4M"I҆3tbū*?x{x4+hUx̿Wm]cm6 V5TUe(%55~/Zh̘1)))[{{$IɡP90+E|̈VUn`SRR#554;40Z[[].W\\\0TU5Tf'$$|Xc8VU=-u]We͝7YV].Η`M8ӨM@3!񠰛S@ $Ku]w.w͏=O~a}`A!-:tؘtD%sgefb5hl^x5{yacBR"RInDYYYIIIl'OdPJ322 !LX VXRt:.hFFF~`4iii,h2''rBVk&$$8N]].ѣe#CUն={,Y!dff\.ΗD5ېS|. J JTXЉЩ`FOQFktwlu>|?ٲmsWͥg-@rr@L 3IDATuՕWS5[fRY`\vLψu[u;ŎN<^gu}Vl󛦙O_|Ak45|Q5Bi0{6\̻\;0Z y}R]W'ϭ[=NSpv|RaJ{ZydE>2#_iCwD8? Lf=w jϢq&~/BpV2a  B>P7jʎ-Mv7Suȇ;'b(;-'9 o$pj {aǒGEYQ!C#LӴ![ʬ ˲Vڵk R 2b)e0k,<兿]&:GGCmF'?5i?Hsl==}qqh D*bEQ%5MOO A|ᅅH$L&۷(EQLFR566Zt:Dduup8H$zJR(2LV{^ray87}q$^| 0e2١Cߖ2HN>@QT0V]glnO|rbjY%]u)FU/bimm5n{mml6KRa4ӧOvNfDkZN755%Z-ETFQ\nz}((j555HEb"|(uEZxcH$>e &u ۮ);{?mՆI*vnVa߯Urf9Ig3gvȑo#"aEH_lר}͜| N@5[roٳcǎk/U`Ź ȽC|36_Ⱥ?3%^jeU\t ޝa 7'?̖ll09GbCEtpfՒJ** U:JjnnZ===,˺\ɥJUvib„ j;wnnn͛2HjxraFBvq2Mbٳg z0ĉTʕ+EP b$Iz^2iii9xM|>{t޹sgwwd ###@@8d2$;ҫH&Nn:uP!V[UQ$i'af۟?~T*%XxeR4ѣGK<66666 իWkkk ]vyܹqW__T*N'?NUzqp)ϟw8w 8m E,[5G/]T޽{)>PpB^xj~g癙 @TJtK$5?~`^3gjkkh4|>Be9RŸ |^VVVVVVr]]][l}9JAU={ C80ǫcEQR988(JևeٖI&dR ,:::rO(fǏߺu:=Oggg/AQvGE%`0 v{n Z?Ԣ6rIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot23.png0000644000175000017500000071176014620351225030421 0ustar00hanshansPNG  IHDR'65P)sBITO IDATxymYU}c̵>4QD`C4 ()᩼ƐEl"h{&D4jL{D-Rz:n4{5csn[ťsYk͵s4o|>37zɳ;;V͍#q 0;Gͧśnz0O~l|SgV{ ;;;7<䡷w:flX.ǷƇݸfF^kc rCcNUe$V-jV8@?oޏ@ d7#i##%$PP8uTkO">3cq#60;F!ˑDdfp3s#ˆ0BPIfFt8R٢eಐ-6H*;fe~@\8?<`}t+yt}eveK덼/;KUT`LʕVҬ5[Ьp>Xgco)$t g(p>vM(n@zð-`QtCqҋ@!jbT R e)$BB2hs÷6mII YP ^Bвih2JHeqPM F1w& 34A%v2 ;ˀaMh >Z[}*2P+H3jSLZzݧÔ nF(|ˉ3X~\{} ~ai3[| rXo0j~%VW~G C6Gpf[Ch]fjlcfJmβ.k3/&g hu5:$[((R*WU*?vմm&JH0$q,Zz]LP  d}( 3I  307)Q[2Rn@ I)N֪"BIsx"kMܷ#7I!qqPD5cPkB}cu#NËj/hFtl 8i {NOi\BquۏÏ&N;{=ezѫ?$'|dq$Ơ<3:ZEPܡ'b$X=g0\VFZB (%Z6Nb2zнz-hګ:[i9Swj]؏ eq e2E ֑ ':YH2PrJq!&7h:LY 65dC)nqDtT<_BݒI憡?S RRp7P? 4s mCe)N #$S=EX;3@w fq.¹%]|KOxC{v0!` ,MDS(73%+ ]HB̄gD Rj55O!S"`-3B20|Y[@&k"Bi<htќpNrU-a+Re6E`q6@0Ð2 BJ&`=8讣(Q0Mh-b if>LRmSČ`Gܝ0l ̀2mڔr))37;O%FR:JEXX)JHP15(U96;~Õ1.aNƢ l85n$u9eTWח'FA#[Ɖemխ0+e Mdc{ߩ^+ "F3T j(s1JE»`R`,hQsZ4B 3[QJZdAX 2u4@TiRrޝ`_*ƈz`+? qɹB㒏w s=I Y yb]Ι!Caef .C]zFVlc5W+e& 2*AK0; lQ$&2m0!x1j캘)py8FP[ejKPj6)y1 x(jM%l~B МYGFrY a(@W_ R^c,6FB`"A?2rJ b4it$3۲گ;:Ύ:-}[-0v賫ƑJ{IjƧ"JD@gh# GS[fb##hX(6N3Z/N& 03 TR S.@TB wKHN3F% ņɦvG8ہh$+8;h` Z:';e#%H4t*0B9 CLDsgXZR&0Zmղzn9˰V߭eSnΈ-rj)5VmjLPf*jZSI/#!XA](3bH8i9߽k6f&[NVSlYZ,bؑf&\_ Keo?:5g(kjmC)Ung˳{˽bwO0jXZlm(ʞH@:I(r}mJ 77٬ueb)2Z2dpZuϞ]@y#ldSʶNNZS$BBE8tNFv"8xH#D-s}i ,"jm 1(RFcqW̆a<#LǶ`'%#ִ=g\a#uPg sqa.,%k̹T#cbo: @# e`k8Im5AQ3f6,0)T#׊f(DO0oUP*o{w tgrS*F Hr hU&9%E$EF9%Ԫ֐a2N7sFX`R Nf M̥U88fn4N-# HaVZiJ(AÚԡ\[>A~ nT2SjBV U;;}b9A$˴ZBuSޏ]JaG_hK4SP6折D]M㲆h4&:if VgX᪌LA&pmgэ-3*٣iR U,CU݉\Ƈ^5w+6+62q( E$Q΅̡TJI CU䯤duAُ`$ N#!ڢjSds2!:@1}^[fBdF P%h@"cDLed@$ѳSmf"DJggfk2#YHeAr&.Q@ltrvonnG6#6fÔrc)! f=@RsB}kssH-#2kk{17/PܘmU%e02h2<QpggȘ٢XnaG_xSO{Mтn:}ߩݓ'OY.NR2=Ody\~?/spp7t_tJ ` &+ 0 fB 7Ws0Yr 3 ӄV3'D$ eaXǸƵ̌mL\ f@!@#ujSbF&="$VP (J Bra6Vld)4Lh5a9pV\aVPFww/]פ8U֫`a0iI`r=kZZk0DDvSFe;(69-y[nD5t;@,< !~+t\P^tEXMvWwYmg>@ce 2 B)6/[QI}N:ԙIgRkםtN~fYo޻n{O?|tי_yͷz=;T{G5'~vNS]䟝k G= u%#ss/dI;f_4vwYoyW|ӧJk W SZodsP|\z~>9+V f L1a'LZO *(a(mi^2}?ˎQf#}9m|W#ǮW_yMLu5`艪?[#ñ)>VW+e98z 8{_D:Ë7~FOf=ך&p%甘Zj!8 1ݑ4pG4k613rJP!*(1XADF(#`UgG$]yeВ) ĴNJb 3QhW:S굫eټTC DK): άͼ.&&0$(t^a7ZK 2b#Xe7=b:[.M[G)?u^VRg3$B"AVm笮2EϝVw1آVy8$3 #\s\>sqekYleU%Av\mw[E,ZA_]vCnbXV*r!Rk%YJ1wHANm5#ED,L- PbI Z%CXvs3Ϝ<'=>W5o ; )o}ȍ7ΆaO}g=nZ跿;n?OG9{|q꾓ǎ/k}?1ol6W o:;/һ_s{{3_K7|籏}^󎷌x7V>1_:Їo69~n=v:Cf|;ox;2TkV=w~0?ǮEVlllhM3?~%/cW]_}xGOѯ|Kַ|xӿ扟G}kKzϾ=˾O[[nyW>__/Z.OƳ'|͗y?Uvi'=/zyJׯ(!e媦'p\gV|}jϲNE t'k [)RQ!EKьldk,wePlDe; PpF p k d˩FNu)I[*̦h 2J I s:L+GLcTchEҊ+F B֟ )3kT}ޗ]szA_EO{/Ƿf $ X:K֠,=ZBm uo1;}t:t d'ޫQ˕ѡaYϳgk)s!ձ6e`s}jmjLgnBXN ÌVuef 2EǙDburֽWSƲrw2e}zyjіIi> +ܹnA @Odv"U'N|~|On{ϜcN(eܿ3gN?9oOolhf*i]szfDc6կ~7}?xZ.^c/;sp"O|;c=IO}6vPDd{IhSUm0J):|I` ,[\Fi1:( aYJNs&e2aDT)q(=`1٢gAM @l(3Qb `k2V(Q@d0!ZuDRC&E" l5#ÝY;Z (SM)fLuԓl:hP*{ɑ9!ۺImjMGLsq#GEsW/?Y_'_[[~e/ܤNucsC6ٺ?Mwcyv6D|ɗ~?W_}EYMO_ ?|ӿ9<&t@9A3zA7~{xC|3g 4=}Ǯ|n^_[_ƛiZf BtHsE.:.E.}{k8Y3/kpދ{ytɋ Emn6""EbG6-IS`0U%T!DSF03-&'3!0Y\gopY3a ) fR JvMVXM\YJjs|PhI T"`0AZi6/ M ,j͚rH!RU<DԻe a u42W/&){#mʜkr}coG|0}8^D{ {{c=v?jՅol txr9nsC] +0PCqxÅzitP"'A2UVuj`Ŝey(jbm7WuޜVLeEY)elR܋;iZYTa10 Sk2e2hBK%aÊ8lyp`B9s{n~;яx/ȏޭ_9uf𮷽q왛?~:rtj"}>q6?替[e5<}ϼ}u¶6|= ͌\,OMdlf ~6pb~Vmo 7{/{?Ͽ?_{/ogםu)8N좷jii_/|k~Wt|W}'^+a6xr?`!\9}*6v%M@>a3= }J&fb [1C""Ig6ԛ)d͊z@:iRb.2aRLIn̳'].L^VwݦH MK uTC/a12 k =rBhL7Z% kx huz^")zш05(o` z ]2G/0 ̐qxnWKᎻ>0%F<4x3C uj29-97;VV!WG $5P}As}-2ekA_sFrrܺr*fM\08{Dm6·^cfRRdj5Nu4+~p [/7+H;wy=X\WNѣwvW3g{?/:zZO>?}7 {~pםw&a<|+~'رco~n>5 h0ZfMas:$EXCny=?oy}ۭ%_GG^zӣM;Z8l`(Ƒt掏G5yG[9~Dͭ%A?}P3|:V >x'ϱcKw[;hᢈrOh]iU\Ͳ$=w#1U'u;bRVI)-dn^N&\2[]ΙO-Z*h=C3vuI+#e #LZf 8FYTVM1nL֖-H읠AJ^Ceݦ'é5 jł@nN˄R§뚃"d.1eJu]Ps7fp)i}MiM07PڑP2}Œnj9UMb[4"uXs?B.UoٯdZ1hъE0<:|>_,vVRQR&33gϜ8vb=9V]Lfdd$TdSJ.2(k(7}7ʟ;z5Ǐ`ѣGnmot淿u6IL5mDrɓFsU_̽imYreZ{;K-Z`ۘI` 1(a$1c˲@(,$!&3bllZjMp={G}}WJo8}{_~Gsǿk~5_u_{xxo73?7w}Ck!K$Y<1>s~ү_wַy7/7_LŊ}oosM7o?dS_&mڸK[9.Z_vٖ[C9}N"=Q#G[h*䜌y-@*[5y`KvGp]V-{"jR&`z޳ƞHHk@D T&#E(pۅpRۢ;s~/?{-//|-'~ykwYu]iO}S??/V_kWݳϕ:y_ 3 a^{:կ__afox饗ݽ[T?#~??|{_~5?ſ{?gw93ԺK>SQW^~ǿ{_˾䣿#}O%qt|o;ǥ|W=ڍ7WoXCWƲ@=Te)i/@1)@Y3-Ia;3Pqe^$X]ԄޣT ݏ6±_dG_TTi3H9UdL&"R4dFwDV(-OAYI =΅ ÑA 2b"[WRH_|xpm[z*LhfO| /=xǟ>k/vXD֮f/}@+qͧ}ϧ~=}|VvYxg}Z)'o=wr?gw_A3'?nZ{OO||ݯ3֭[~OOhz2@?yL]9\5xe ztU)Nڱ_Ehk|gJ݁N~&KT&3@othVUuqPLӗuWDmisc]"%yVf\V#cM5fŲ{7)K,4E̮Nv;qrqeR}we3@TL,@D`Hwaӟ> ~oo qABixDkꋧ~Qٵ9<~b*>a]HqSemS<,{#F;S&VTnҟT,mwܯmiks*(+&ÝpԳ&f-$ښ@5SFhILf&U9<135=~syږ _@=98'AƨObC Y֬ aC&,fO?7"k7O?{xFD)YNwq^88<|3^5}UÀޞ{ϧHv(eɟAy5RQtm}V)"O?+C^I&[^fL붔#xW>@Cٔ z| s 3).XUf }̙XXN`w,ҝ%DVr;т[#h  ɥ}`G0 j"d uUEG!*TG4G bhÈMV$4!Б%;ͣH8mQs^2xd) ڋX'wiMH,{{l=P:PLBAr?$#̈T#f:E!X=Wrȶ=ZxW 帨HwSzطfǺfBȐRlisgo}gS:]~Z? H#LUͤ z3L։`7x48*dJyyMS^M=V`*\TJOE")6֤dlٚ 7\H0tOGw]~Ƴ!N7yw!]j5r|uRF)TM`z6*%[>`>|v RUeM,!zbJXIٔ4,&a҈d#&g] aoV $y[׎@J"ULJE6-%euTu2',e '&T1.Tk?_Wk=q ۈ 9=s @UГAC)2LtVGܞ6?c#&4&x׏(#ɬ _ۖ-BX-Ŋ+1M<?[RHOx},ᡦ1)A1Cwla3CGl~ېp$#LIl{웯˪׎Jx(ZsS̹K "z&˧#+IO,w:ک0N S-DLTKIP. EzYj[l$ ޳9 IDATZLP+¾1lI%*2a$֌iWw/藘ꍛO{/~(L-c73h< ~gMV5J8ؗ "PNjt0WS Ygbz# jJr G4xS6Mj(&`Ah"ѿ1%y-`fܚ'eԶ">MTRrLf+UXMjAKs$B=TU%`*Ѹ.*b4 M^̿ZAV'tݼqOm*IXUIԊ3PEb2&fHXOjȁ]{A [ICMOU9B<ካuK)$^fiZ[K-U5M ߟNu*eh""RkgBTλyjRT9*[Lջt\t48JHh┱>JDv,ck=9ptSzpzq0 &'@5w CHI "zRDsAOՐ=?ppRXJanP( D`f'FGHG ~eܞ[bFKF ȵnMU˲ &W{{?2.Ck@Ć+ol懮\jtchɸz pAh)jFQdbHې =:>&L .zJd0u (UiwEPE,ͽ{^U@r5@3<4EKc┐,$̺\}Cb> nn$ rՅe_]ՍaJZ`rH lR" i""taǟ\wIlf7cNl+N2Mbݐ{w<D2Z}S&-UkjRgѧك_&Ts>srX>>218ѫfzFW.5[Z) r NNN̊b(qw3l$yyyT$NOƏq4M\>ܨg>DJd z5+6ޣ 8ՆzX2:Mm;ٖHjuJDdU憪QNebf**wV*bŦhem> I<SRUJyFbt8~wPթTlAZ$K.LyO0UqDN'pB y H8}&%Xaܨ2)6lsC6=Qi{xz, %dy !|8RYZMBhIz;A:QJ!@!B̻w璖 LD1Ià8HGҔKR$,Q?YFR{>< ( RThRuO~6h*Pa sEF a$"U3-"&RN5h1QF oVLL :wɤja{oA;QDeIA"'"j`5=>MXyֻ<L-g'8A.@BqIb,jS\- `zNZ'#M,D&eL*L+N 0J)ksS XA`GÊr0>"oA*YΈpHl7ѷn~V(buuv {K7BQx7QN`=[nȒ0 \-J5يl. NbiH1 qXD`?@ f%3iO SF"/e)3} ?P4I)*} ^"C( |lY+#1nM LM-*@6DN`;A~ G{>/uOY3:P{ .ȀV&Mhj$]/OLbeY;f*iB rIrRrl.n^7ZG>jBRb@1 Yjj6YT wxk6XtB20BzKdC fVL!pϺĖ4Si2S=b-ӋT A) W4pӓ[n[?g_r=}wG[b\m-L*T&Ҋt0bOS \-$ݎUpPMDU[b4kE5t3I{1 1IЍ=+K_BIxYP͑^{`\xy2yx-t}1o?t,z3Ck:vtH)!jwI[@ ~4jh-2h,SG뽁bDE ;! xVe e*h=g^DHK+:cyy} [Je DDa65ɐ"3f"[j5ޑw/i,P}tY:qHa,)Ip9??{^ |/WwA@ƟC5e.IpwSVzoV hx,}mg޾ʲҖ.)TZƕU#Sb3P,"DF-I|D3Z:`o " %ڽZCjGxWF&E5D1#Sj0{ 5ම>uv䗼~`_ݽ?}W/MҾۯ(/яDRv%tf vDZZ:$ylhG!. tZ̖ ";їh PU&-j&Ԉ8۟rpx} /.si Ү;11zp]3c/@ }EƵKECfXe0u#Vbfti7ZA?:FH2)f`@DUM6Q U*STf8f}L((Lm遈-){a]dQ=T Bd6!at(PMDdƒN\Z Nax^0$jl*QjꪯSOM4Ow;Vы}]^D^|\5Jvƥ9"Q`$SM&@ڎI|h><S}D~R J6 pe%&T=`(T"0uQeDwCAwH}emI"Ku]=|Ӽlks0Q3B<`{6}̉Y4'opݏ?<g_l~#\|cуC;DD*Ӄna?ԸHJV%{"uZ@ZFg̨݃@U5֢# [*R̤(@,D-絑""h-)mIsfU* sYI]Y}nUxJy u  DT@?aE2F.6tnv?_I?_=oxL4|pedEgN  `h&]z[p_|b9찖 r=/# W'sʁ=ã=~iDޫH ;]C쭞D2΢ Jk[&m:uej Zkz`g2ZJ!]$ ޅGws){D¦Z "(JMfgl={xdC;k{JI⬻(^o//h7!"6"(P~ZFV,YI4$[H&B$Gjɲ6d@Y"on67saI4,un44+zx,sεGvYȗ<?ɐG>W8{®Kmuei`]{$>f:=ŠèpOƜz*jj($P QoHEqj3jQ T: :!!tE1ZXlGDfli@} PMd B dPV!43K92?H V< AƘH$ ug]7֥uwPH,k{{ӹHz'Mu5ӭz>RSފXPx~Y|b^J5 %ZtWʴ_xl03=sFΰ1,GΰCVNZ~/~Ww'>VʘY$uEV-z;>>$B%JgD1Ha! <<:t{TpE:B`H QUמAL)wU]-e], Q…:.RIُx'clۗ[3zO?r[-r?YDExc O}멣y?/K"*%EDjmF(E//mݟo_k~+ܸqWi~j5c&j6?C`DnVJ2)Bx"ib}mZl]ك;^Iq|$2%Ch&' cf9$7o=RZ-#BBeYe<QU Qq6^oɍ[|:eE\ַ]uZܷw_#+H D`iYMX9yFt/[iDh(Xg]eY o$7+aBRh*EQ`({t5dv#Qt*@RRӷj! ˊ,aMor$H%9$h5C8ސA=#D%kӑ5\ՂUBdؚle0p- >@(IRY9wo,s)q8={9zkwgSݚ2= !z.6dppщOlr3cET̪֚hA¬x:K5Tjmi5*Zikͧ=LGx49[z9XN IDAT-t Qh(!hHTQh)2=xi1ͳT/B^n߼>;wNjyp,9Z_Q sQ@zt*VTLGLvPj5fd{2@9J)\SfZL-eokc7jԜ< ;]Ao=QU&DMmX瞮Ŗ;{8<Ŏh@w=~MGxFA7pq8uo/0}]>@ZJDkI&YK,B5:TUԊx<B}=D#-W0İ;G gR`EJEba&)ް;رI.zwP5Iv [gXBiYw ö3)DWMw U| 'J.) ElKG3;OC )[}@>6s+jE0{*\)_8ŰL;D#MDLA Z@+2ɠ2oD-3 ZL'2Opn]dQv~##Ex#b]QwZuF<Σ8(k;[ΖjyC[Ԋ㢷|qHtۭ`x}3R{X[ۈCa[iWO`v{d'2MifI(lt 8<ΓL\sQ[@!k'w bTfVk(fn,i`ιj9 oDh!I;$P^Pm2 lۘJpiiJɬUYPSd!=q7p5孍BG^шb~շ:ThbRYu N$֢Gir+fIm{qI_6znr"FںD?9q-$MS]ET̻RR{6Dr+roa˾H ;42󫍍:4 "eI+C%J)T35+LU T B ͯx`6] =أ-]u~Ss{{sX?_-RLf:;I \lta+%R[)!Plh :WռlLS!"]ٲM蔒i~"9&Py ӓE9O8v=wkTL& `SQ+:reeRN˺昻׻37;ROȨj=v;Ww83oVيEOEUN] 39ڗF ƳTX+5{-G, hC0m+My|]\+C$6X$3ic=UVgbUk${z[%5Nظ0eh;O!t@r,_'Z,o@w,Сuy۞1A B}&%\ڇ^CG9Kqx;ȗv̛ L{c|Ua}[A"KJЙv! UVCG_p~s!B8Н4 l1$JEEd jRD@f5Rj*3PB Z@s!PgZܽymWU's9%ĄQؠH} bآ~CDĎH Y*Z)ZZeTzL ^{=֜c}} ={Zkv[uAF.-\TC# [ij@:b( NppvUEzE*8cr jn*QMG̒5yE˻֖̃mgGul/4}х`w%R\ȳv5s'SnmH;V [ab $V82Ku^be.gZK"lgTaZ$%XR%VLdDњYN3euD<..}Pt}[T)o0osnQsiq:$\"ת0ZGᇅRRq;|Vtٚ)lړo+FzpK AC"lM354dv[LSѪ$╈Ibu O"ͪكus;^~gopwb($rN$v ˵[0֒0' bQf2/AT6|xQ) nXj*^x^L@*7$(5 ]F%evZ}|#o lFRL$ERqGgvsSr L!XT"#CfUÁsxPL PZfh9o}Z4 [`'rv)T:T]\S, F;joe\ ꪮ~nˡnq^lGPK2e!7^ANs_#)B̴)IuWs3>dfNq8\.At#tمo碊R5[2SN^I  |ŬZ)x<ԔFݙ\Hp:}&fN4P8%c{Nrg\oy7vpbbІ}\ooOӴԉF+Ze*0Xiyfa]t~ٺj*gDL%6cJ""bUݬ2ݠ^eF`N"Vvb4_eLѧs5VVN$ OBsU]R&TEVښPKe \X(uYZ)5AZO[U4Si -ehpfCN>YG8fً)HQ w6<$wF9 l½gig7hh">5T)X?-r2'2~ 7j<\ZBS<䆆iD9ZGKP`Ƃ DBLLfZt" ])BfP sD9ϻ"yObvB0iWA(”|9OǖQb,B{v NbZWT/{ysȬH.m_:&Ω˜9̫8V!I+;jqשӘΓk,LB)XG'N mg{웧N!t91~,0sURrc⽽U%"2qTjj8u99*Qސud>yY¶e29wӎ7ahߙHA^kD8IbhN")Y Dfk޶OaXcaYY'dmOwfZ@lD7J.&zbn0c  1ĹټemjT50f,O)a 8 D /MH{79)VE PCXslh}ӫӣpΙ܍Р߷fU$HyJ=U*ͅfoB -+̧pUhu5&@m0)lʟ-mFS07 Z9$G  {V'$)h<*MN_ sL/0ZRH@@"G>z]C,V:hmٟ{k7t{3j}l{ȳ$T S/ZKwNV5IW$"Z Ybޤڶ/۔ ;0p#ߨbkeH"BY?JN<^$?AppH"!םT\JJe 05+zV t}67-g>R*{HnfbREr:dhTwh|޾Qn?plJlt`av8L,VMaJYʨ^ܽjБS"2ήj 4~sb 2j3P(~Ք=IڌܬdeXCFRrżbz3u}Ino]nL&#B4/͡rs)(Tw=us]-8XH~ij,2BB vIǪ!j֌x*ANwfz 70Wx034 I&jnTWZl$yfos7ncH'bWl̜rԖUUiZh& /`{;VV|wUN,wż?5'B1s'|'Lpb+N#L&hXd hew m'o#6p՝]4DDTu{{Q1%)g2O}-Ek}G`UzmGZ$5K) cA83ZsdU97pP3 4ca3@@_;}r 7'̵nr&L$!j ;+SD< D$V`>A:fd/ی9ι[G,~o~l~w=o[ d5BS7E͵DZB D* 6P% UD\8i!YrvPf"7Ռ&i%^ Mޘ%4Խ XWkyFHA︟9@" f3g aa6ׁTܢ|CXͼZ8@\*7߯٨ҐN3-79naD,9S\ctnTQ+e,9>Z)Y@boo}4Z-9Iu rsj ѪޚFCۋ[#G[toUn8[v?.FC0C(#Eb%FF7 @Y׳D691e~LMؔ@"%!Qyi͛JE/Dp-2!v4k)awF˲V͈C3A6p&~u8zP u*ABUK3}D{DwM;Zy*҆X~DKg2%FM#& l9?z=QUK "^m-}SJNZtw9?:; FaST%"3%✓$$\19B̅s( 8<%gY N"HĈצuG>qwL=gl"iJjsmƭlrZͭ;uǁ ׆߷H2hL)U2!"zwqw7d.Am_˰mig8#'p33ƛX.$A,6#вUX m\n};QsJݡ>%KxN,`¨>ZQ' w6t;9g"BDմ{`!UvC\6LB,$[O{TZMr)SB\L!1jA4^uY@MPm{_h'kipm%Os 2X/d$y 3}*GѽF0U&{c`Px{Q^SRVS|F7q|Kmf&%ʪx:pr$,H\끡vӸIt,c.'0ZV|>_V~zgʙuYeq:;к$a 9QDhfba&6U݈"Rݻ"wIҠ6ZJƠk7qb{>Sp@L f٬ 84JU,Z`Z `3M)UMܬjժYD/H:M7C=T[> rl{Sfy~V-&TÉ8鈀LaD,@b&0>OW[ۺ@XO@4{7RjrHnޅV۟wh?;֡ 9c;Rn}5j٪*A :"%Us5.sHCF̔M& 9 ^m2qn'&ga-0ɜ0 w5 U 8$Q2wZL °1kesosIgJ d&x{IDa(jIyUHhGM~Yf[Zbk+Xڪ8YRZVu}_Ո(LD!9 ^SkgNG 'C<ݦiHם8syGYdhZWȋGu}߄Q; q"r2jVDzZrJE%x0o -w:Gun29:^28!NQ7[lfcHYrBÓH$k1! 6CM㶂]HuPM]3ի Nq(mlI&g~Sg[v6c$|0SQ-KPuU2cyUrHL qASߎΣ2H7;-1ƦzZԔ2 Sr;$kNaDwe= 2wu0YBu{2\yY>õx{u0-=uE폌iZɜD1$XN#I6!ѧmkQPAKD\P%T;3.#+;{^Wcc)(F$Ĥc[g=KS5i>;2r#q܃,w~&)Sa #LDլ ִۛc`UW_ һ]:A.'w%ŒW_=.KjT)I29w9uɛ=lqX{ݝ_z;DVugo)u=C; <מּO}"iȱX%PJY^כM;r[aX`6ΌXwµqT5BLmZk}PURXVc*XRk]*ȓc=ЕyG&.ky+_y|ݵ\S]-lm'}\ZKS-՘#Vɵr~ã3?8^k3?ϋ}啟sW˽b@_` b2捥{)cܽnw{|1-f4BM#gffz^c)ZF!s?+zi3f-P %,Ne=>yz8srh]0L<9㦵[7?_Lv>x}$9&<%I ILxVMW0IGVjèq2JJHHth! 9skmIF4}X{`nRLX: >Vƕ@P)<1r%SXu򵍻uq-j<)e$*Vk-ăPٙub,e90Ե> ;qUmoٶmlKnnU;6 O`(8b^b朳c7N tLJ?u{_sW$uڦEͬ'OU~{LZi¬ju])%uҋ^Wo{w@zl}nU$ꍠZNY J];z uu)!JM5&'ΉL]Bb'0qvʃ+7ETp˃KӓV5q|R E[u |?H&HE"E,h4 3 U7c39R`͢ !#\ԮDhi0L[Ҵ@ױ4/`u&7\}Ϸ̙SB.7„{,p#%k[աJYC-d-9jrΕ5c j6ݩWߖ~0W k['xtCfɫ7%qn5 xdžmmI 쉑!\f?u8A N`3Bt/OPWsJ2"V,7WsI©#WU-jj5Z >*ODfjN ubugrc砹0~+^yWv]#?|^r]o't ǯo=7'|%_w|>sRױfI#7~㟠fH ~~㯽_~ U\<˿a]wK^˧O™_Y>.pЇoO|~[7һ^\KY=E/ceWczluǿI'N׻q A|WO^[o?_Ͻ?E?=?_;nIo~˻;8}“wÕKD\"DXWY57s/TuS+!@Ȫ&I9wZkiNDw|L~ϟz;}{Xmf-#PG]JjN 'ɺBz@P:v1 Vs؞*Hp4IMcx8 stCۤ ΠZNUzؘ) k"%8S'3rs,4gIpSD84fp2i_ JbGhXK%umɽMGr%|FW{g'aRWDF3r(g0/4BLu%SJGxRb=kʩeOo^/!e,!ӑr'$fDM,FA|&s GS!J#:K%Rn?AgRJΩݝr5ZJYHZ'Cy1Nf(D\BIU56ծ)NZj]qk)-U5 $-PjP lj=._|[淾_7fZP} s.R7\G=A&27f>4~`)q~R?u]3j}?Y)>ۿMoW]󶷿'z_wH WL3:tY`j?ñcǎ=׿~ou띝˷}7?Q˿۔|oz%\zeW\ _#~o7}G<ݟg7^o35}^trw~Osb\ΩSgΜa=0V5P5xRDE, j= GF [ӷFJ^g6nfJ[}2~CQdIY\mtlFҵ~ww%Ji)X9QL(BBƊZ׵;K-¬]O)ЪeSV qTix2ju31LR@AJ2z->Y$T>020fU'IOڙD@ SZT8SSKu9_^| rW}ci`h*9uh4  ^!$*Se*ѼRø\0.ݽt};[^#ǎmݞ/F֝5-1q%,џKipWLR\OtD[}Nj-㨫r6u]7˝ Hb3 n^O!S^UkZSNC Ȥ$TuT8|al{{n'E?2V{:)u>;Cs-,)IΩ\܊`[×;[ƨzfo!TAZiah"0Ёk؆א}7-!W$)IJ) W[1"$ocnpO~SOn_]ԧonڅN{{C۞o|߻i>p7O9rz^_1/@$"Vk7"G3N: `6=+b0~ IL]-wkFl1bjo~w}/_gS$/rh /|[޼pƵp p]pN-n8Tt}qg|mO'>{_GOQ-2&,S /A7RN-с Tۣ8;_b`Lm&sbs/o j<$Hɳ{cK\cybL ;9e2"lEV!uWj) W"(%$NJuT Rm]dIz}o>?|O꓿|aγ_y]N7xTȉDrhP)zsG?||Y{Yןux[oz>q'؅;zqK3;|Eu߿x|^?я|kgD-? [Vތ-]?V9w_}?"zהү쥯mbޥ֪,Gܘ(%)mmmf}듢>%Ks`ۯ!>ѴDSԢMA t谻aā2RFGd(z쉎d{#*34Y`[RJsXh²T)!K2F-4I%U9EhPQ1dr|Sjc"b c 쨲3B-܃؃WBSS@D;JU݃@B{;qG[kM4m;;xC >r/}?tY[zA-AJeTw`z޴Nt2j^/RJłUՐN,eERsf9k[V93D;Q[2ss jiRLC7~Yg9>}mwwoa&"g}7;,|ȱb j(UY/۟R!*Df.qKJZusiO)]k_08Yޟ},1 οKOozWg~k!{~r}OgR_ x3oP\~28huF^M7f{'N5{gf_VVeZ${c*8 j]~С,"1b'noΆ11G5Wuk{IBq0$quP3[l\TRAko3 +Hը8kr@򓲚Z KmjepΩh2ȟ+6Pt^x`Gl 贴 (˸i<]{*̌ZPŷ =iZ歴4pt8hH!E~/4DdGBpܺ~LPo(zeLHkTRfbƩb( g`de3(٘ ƪHDiXglwūBVT.{># uLSpiX]prt{{_pg;rּﺜ7dܼԪf",N8l>3ID@[|1ﻭb~x{vhk6$תuwwWW-؍6Q)423Atھ Ow^W꿼W_җx7>I1._?Ayȃ>Kr^z/~}>ozgsp]b,U9ͺٜ9Z͂ w9j𾈘h1[H#3bxoZug1G IDATv|0j$fk_oy/W^w?>]nvϜ~Su]wOe^r ^SN.Wگ=e_Pgq@f)/מ8'a_G>yvV-ֱ8i*'>>̈́$RΤ%I[õK.$I+weYVf<:2K64cfPàKEa.uIR:3I Xd-2b2ZtLO,x$͖6LpBzf 8hhCYzGSԐH 9#%}C=[B%EPS*ܥ~Auѽ  N (U.t ?]{һ.qyfbu n1K}uc+ؑ#GmQu}{{bFU؝ݝY1 $M֜ ʮŬ_INLR~:P-XðփUUt]yNZ#[QUGSЖ5S 9a|xرWګ~ũy/9s[)O>iOAw?~?S7vqHTL!Maj$֫3OItݝݝC[ٴV>ǯ{c%W]3we/f w]^>}R:cٟ|?~_?~ {u/zU OWG/2_W;oz~w: O|"oawwԩS 8.{ /t;O{ /Gz~6F0Yu ﻮﺾY9 TC:8t=7=o76Mon\M Dʞ}St.IoL j5+nwx6)U#mcm˲1\ksν}{``;r( H( "J XQ̏!|ۀ v!8nGUW{k9c}ޫmuk9c¬G " KXx۰RbRJLI@P$N9 Twn,*Yt')$OG: -P27!R (M ~G!CuԠ6eܨ,6DC NlZbM{5 Xy36&ԭ1Pet'vdVJ> q`u]FwT7z{,V3;N"reW8u:I{q||kT#e}:omPχC 7oK.>{vW8ɋ7Q}߽s~棏=_yuJqYWoG<؃w]^ww޾8wx}}VOmnK&wk=IqZJ֜5;n_ˋ+3Pug>ɷ޲ZH |?Ou{}'b'>v޽ǟSeg+%ŝ2ͭqiTPFEO%UEM:nÇxxZ>~½_[˲w{FD[Ͽe_ZJyeN{ofy*7/Ri9-ˋ׮u{|w>rO_ؕZy{w?}v^s矽w< ơ_o.D*pqg{>ڨ>(H|?#ٰȂ/'LrTLySEDf?wwx 3#Q=ŬTR.(o*\;ԝi^Yh}T+zaVZZPgXt7!4*dYgbM:"9Ͳu;cfLL9atKSHw]ڨh4*/DTy%# 3 U`e] 9TQ-EԔ`цT(6Q0DnHSP )_7?ǿb@L-ˮuЇר($}R˔tҙ hp=uCh,BW?|[GUgn^|VDe|mz L WQЗwvܽVlͫ\hV'Y[f5kG - ?1I`\k zO0[,r`DZ_afK1+XײLRJ-EK)@o0h;#/`|!2DEp8+By_{Ib&SyƛZ)Ac&tt8L@vŕwG0c_ \.>?;[of2iJ݊ɾ=TGx 7I=DquZ,z{ZץX[׷y_xtNwݽ3c$#wbrxE>Ox =n7J/G_nROp&TsYr )9x拝 CBZPpTx +rqQ!$=$R]"i}>{wy_.dXU@Tv2W)Kx0Foԥ=ڤGްa4CGƹ6;<- Jҋ)?>p-\ƦC|ܞ/jEͰ([д%aM)!(>8 9JD @N_ "~WՏWU% JmD5(VY*ʡhΐ.2b "M#n^?zqaٺQvӻ SN5U4/8'{ /(B<9DUٖP9P-kPEoS)FA~j*t0QK.=-V~ޮ+nUvsi.>{e2MUҒ9UKI 70ޣئZh E:l4) Tfٌak:{ S-f:e*zҙ 2HV8EDqZT֒Ҳ:ؤzNPTeʲ.nj,Mumkk*~Rk RL?{R; S*D"=L4TU*IKEIBDy˘LY1XtLh t>hb]6A'\4r;[) u,pJKl\Hm7\d0XR +A$zæPYa %)3Hlx^ֹK-:8SV}?ׁg`;Z4.E<»GOe^EAciœ{&t !GAQQ DeH%LL!"0o6:Mc\g|q Aɔ,9\13NUTI1-=g۲]>!j Zn@lvi 4PN!7 s(鐝h:OnTXP/i}Q?tSx>Ḷ;"bÕfb34n~'Ms}e#CiRdVB6ݮXM:ݬ|zYX;Z\{;3N9E۲ި/nnwaJ5zLB ;UY6͊AhIbfS5ASS~8Sg =5IEiY }.蠲PO&zWU͑jwkG1bW1Gb(AH3HXQH=b)XL4IˬU[&.y y[o̦#J-T)㇪:pGxϭX)ŦbsuJΘbO _}I r;8yyG&A/^\a.~+T?+-!bf ;G TiǑDAwIuK'RueVS\e:7ҍ0*@Ql.Z2Iίt'AYƞrz n4gL=B"b"M, O68c ںL鳭&IVÀd@T،?KqH˘jU+5GH8[b#ٌ|"Ze*TtHr7R#s4D+H'@tNu(T*I[$F~OzPzGDxBitLBtZ <;jdU()&VPwrѕZE*LjX)ZlX_ H%ZxE A\ J>"МRF$tUTS 9)EL([rsq m0EyH ѣ77ykZ9H68mIZDE5J4"4&U|YDfk-Я㺶^AC{mmb#P4Mу;>SUizpyqa?M.Z[5cxv;t ]'鶗y'u*4B<`"۵:MNڛ.˩h-Ek;IH0(/+~}o_׭yk-$7տ]}_6!i0o͹k =j)j`>M;E(u^[3=Q:F:@%s6t$hBjFmεܝ RxZTl<+1Fqݜ\)@;$" "ֵE~Otjg,ݮJjj& Ӵj.?!'3㜉WPICSܜ䰇`ljIsOdi`-"g6o.‰W QJ*;<'ɊT_6ʾ̳6~0xxuFPU}N,<}inNQA ȕ"!9L|@FI_1iͽu2wI7%< 6'y9/Ns#6D6U,\<~}~ס<CKSc;e I ZU+iPeΈcOBLup5"4a C 7k>k'?i]Z3ISb3ɎxWϟ\ K>zj7u LHˍ8NmmǾ:A;[sOnkRTP.AkEN;R/Å9#NGi*"-b*݃QD[[o- ^ 7oL?=w?OB:M,0[{ouudz)5v7&Q,H.l IDAT !`@8<͆0x:sE'"C)~*hY9 \OFTq%~y}~jlu'V|[:@I f'f"`'*<}TC1!P͖!9 ;ʼn ĨCEPC!\K_.j:(Ueb4u-VR#rC>nnyoTCr  ͐ta [&OA*t IBP%9<\]OW츇B!lWVo4qcIp=vGFˉ֭u6 Ѡ"dhփJ8:LojKoQWJH!AuGD\) PPhz"/XGQeENTܣLSm+՗;UU.\.ͩ $p_wGx#{d _E˵`Zfw&e.sNt/ʕnjݲ w;woRJgAiC?w{iOey[??C?hj[_oا>5}Wfoj+:՛dc}%_K b%\Z33BzCߤujy5f@ie5ne0s zUqUSb4+G@(X:uYTL f4kJYzWR )U46bi"VS){$LRTTZcZop_Iq?rrO[LGrB*$/x i_bZj2(ז)=?إV+Vp)V *5C#5JRT+B/ϴ,:3PiaPh:uzi"TՄѡ$qo%ւ֤/12h}V:)(TI_i'PSԿZeTu%/Gַ/vfi= C"Eۇ*2~iɹA$!cplq!7Tѐ҄eޜ?1il>,jww^Z.j'|o޿w2ϫS;\c.b/'/z_9%3bFAg]N4J,QR9~ƽ悥C)S ;O E0pYn}`Zßx~73\N'_Wߚki_u_~obf&%ֻwv$*!Qi:pjr,:#z$Ej  H52hD@Xu,q-ΛDѽ~{lE EDĐU]֥M.WR o}7յuMs,3`DD)&RҖ5TGL`%c<"DK| |16G+/;_/86l#`:|. z`* GETPù0Sirygi mKJP) zCva1щ"tX@<ɞCZT^b`xgLl} Iz v}FtP@eLH8-Gع},|Mك_GW}@!"$nLWlZbcKTzO&A o_NC`pk)f(^νac!:pȐp]40a(93j 0Iln9$)?tx}}=OU<3]Mz˱'RHiotTn9^sYzpw䵫WÇ4rZ/9r{ޒۺ,+`l ռ O4L0A5@ -& t-**%E4>Gd6 W]^^ϵ_M?3?Au]no~;wU` 1`CUTz_K `&\LnRys;$@s5edK,x adaKЊZR`zڕ 3|,VKYEe7ݗ֛36 Պ4 7 XbcX%Cgv0~kl: 1dP|22ṯ;caԉQq& g$$(o'17Dz^yZwSE)~b'H#]`YDPzM#2Q)*ά{N©n(Fzl"ue@DKWf+$DyIۮoZFոA1ZDH ^ Hr)fdrIG[nkh1Z8/PȰ$V˳q[Tw?&PE"ͭ19F_tpŠrˆ %HhB  0!rp "n!#_LEyz{{cx|?.~=8xBΗOFi,Cu[kw.|tݽE +?˫zsme]֛`keY)1CoqYEՃˇJA a%ק'Oꬪ-oֶF *z߿{ovqyUo~o^{_~G~7||7>xWkVE">9Cڊ((S]wvIG<_nNX..*n;sSNSw*u=g˧~omH\ #l~psAзi[ǯwɧ?i?M33<Ў"2O3ĠD$3;˒Δ3sޠ^Tl< ,w!/r=ZjRkE /)QAv4S [/@u/E=2Ov%A;3פnP`fq~f4(/4 j#g 3~e-h[U_#um]2?lJr4DD`AQp4bW,*SS{;o( "ĵEښE¾Z s@ޥCŰ+RmOy[ң#GK#VU 3ӓkg+G"7.j8 b; ϑmV֠_-;B3P9W)g?Qe,DC߷:D3T6*vFa M(2P u8C ?:|DupFҎB '0D 9#y$D\?_N2.lq||QfWVemx{s?"y7XGl*ϟ>}|͗jyvVf3-U{;n#ݻWw]}5y:.}]emPȢ}nu9{O_o.֎yzZڲޞz+z \Ͼn90)w~_{ l `(d߷Uc7iLHFL*& ׵MF:L6yeRws5edR6QG1R4hf=5u1@k)1}lm/@`8ʖaAԠC91}!Lw/x~;g@Aׂ-"xO.1 *Io$+rY6{3 չB ;o<Baj&(*EDUmFN)6|[1M/k >QPH C{) BT8!^y[S12IK`jU5cKE C#x<'Cad4VSGPg2ޮ6ڶ#BXtJUlmU"*JB5 QSH/1"h$8Gt@@t_7Yq UT>%kozzގ֪TeryA>>[߼]QIu)_xxo5m)cek|e{k6DYfGקzEon{K;ї"0ѶNYsnړ؝h& Ϛ|_;}k~G~d:!Btq'"q+Q-]\Ed &Dw谓U%FwH6Eu[N%КsD( !L{~ n (E5H4O-LEr: :=5GRI[0ֶzٴ.'`xNH4ʜvP9 pJ@$+0|u:eH5p<~c3UtZ?ye_ y=gZ]^x]xPp1ɟ]tv:jVu˫zMz>yzz. t{盏.ҧutwG$%i"Á}Ta*eZ䉉eiAA $&.@&QXDRn(T{DȈq6=Z#\UZURYVLj+(P =hb 7p]LkRֺ YjMIW1R:Rb]3(ݧ:C7۟#4لAHI^s9۾|/ӟ 8q/-҂"$qwYPd*ȋ%%I# <+`"E,#D^PA" JwiUT$zJ-S*e9 TMLl@ ۀv0<(K"IB$Œ&DP!҈ s1#/-f,F%[Iβ 8n/7_!AK2x#.r0;C`ybج <=A 1ZktE@TX択vJEˢ^|Fw#k;㐥X{^Em9ꌷPD X( )-}qj{o^T jÞq~wh!2׺YU#BY[ Cyv:; A4%r5$ IP3oԇOY +zcO9\ [꼋d 1^Eyp8 ˥X ZCeE5I vv=v=ChżZVcЪO~wsL:ܵu~;>f ћO}j4.Vkhe(b}&nG'CeBb "K``ڲZ_z;t'B,`g$%QpLTۊ\2 ]Bl6UA4._f0[NUU=LӴ^VE&0oVηgݡES L^!9wTkʒ%Hkrse/u -de~?栩pQ%^ٔEDDk %臶m*Z본2j6赐Вd#{TIZ4gaTSY9B' IDAT@IP(BLLJ\.P6#"t }&5zhOE a*,:-BtYЄF-AdIKrV%zM٣-hi0L5(p1ȒޠAw4fDy "' Hڔb$BoA8TԊ@uȁߠ"hly+InUsL)|rrhW}ZFn FdçxsԖi1j&dw:_] ))Ҽ)-+fVr֭$pk; ]g1vUEy:lJۖ7t1f=@9UoQFݯܟdN0@_h7$HJ3R6$YcS9(*ltaЗe)]@ZktOC&N2"C<1klT 'ZgqfifNo.bl[Cm%T5,D^aF@D:~^>6@pXNmDv~c eS=$ w> 7G#yi_ptX奿$d9x_$Ԟ@. aR=`9".L@ƈf"&PQ:m[bzr&-=Kڡ!(/E4Y4 R. lsn 2GK9^f6fd xDg49Q1QD$r~\2pBB.WQOFE@Dr<#=`vGd":$eܰSw7 8kM=dZ~Wt׹$"Ztz(!=Q d12=8JKbXFG˯6fFo<D)%<<<m;u)A_@@n"Ygypg I4& SlPԽ,QI?3EݛPOS9LIw)e@!BS)QZn]jה FB\ iUo\:FjcӔV"Y\[7ʲ4`py?2A3aQDdFMTK8z*J)%"a,bf6#!Ӳy7ퟸWaka[Rvvp8o=߈uڎsLN) ŶoZEJnwڄVJƨ2g۹azRJ7Gy#kbeJX&BKJb63g@eV90YBGCQDIFKO#r  .~e) /K4yR-Qnc]ΧW3l JQmب4oDqs 6RS*T‚-"~Z-ѿγ9Q]0}v e)pz/B+Q);Q̴;Ry%~\W%/ԷuzvvtǴ叓DO}Yݾޅ`4$5TUYnڨCv/$8ƾMnw{,&hEME"+ŊڑFpnH~FR^.Ο#TT"]M{L>&>7ovbH_!Z5ܑA,#@D .&n8#=In3Je8%%N "b%Yb4Rs阁Hodw֑M؊ZZ!0 4DRu hM‘ЀFM]Fxݽ] ,ql5G#ġVp_Ytˀdu\!e1 q*ba#,+MX45BbAe(Exl2R\ʬR#9&"HKo~6;ʨ:p1j<b<>Y5416CԴ"iy~_y:*~X ,a(כE.A&UJXc4Y|jIT2x4 .P&/5CaR4) &>,\ycV!`"蘘 r6&Mc1vZ.5M&1F.{EVIJG(TYѢ&8PjT6ɋGgǶh>]{<' "-&z) 7Sܤ:Kiyf;?pxcd,DD9v/ $`, L0U-^4o?e&oxv$11{7Ckۺ[ԽAC,ef̌ }*%g  ;}тnZZ:^y7Dh^]$DJC.&uȢ!TmK!7tu,cO/JĂ%+f]7eip!k߀]`s%)SQ ¹IH,1P)EHC}"4S.`DSQ!3JU RH)Au굢ϴ _f~o(ET~1Y+e~c\"YV)zrخPpթ{wjp,JkG4A1 Q<7h%[o,DQC4 1ļ܀k\CN6F=O4fd*G&{NL3wTIcSDb"I1Ub R|ԙ#i#iUd(e[ۄ'HMBὤ i T:7[qhO~U_>y-1͏w ?^ X<=miAp0Tbu6o}D6v8[i֩}~)ȡhdh+0tP<3z23ckU}f,EĤ$\(V.ahuʛ8TLKZȬDuoyz6Z6|]֫ZY9;]4ljk5xx7e畷 oj4Ef9ۧܪa H.i筝mf6Y{fjVF:^C1bC䣈ܘ}y^_Dr2Ig%c!ld8CG9ߔ ۤZTRVEI L nF'2.vu[|vٮWP T(V C³B:OVRYnb˲;t|i̦TOCnl$h1VV%'D0t6:BiJK_Z[k9[0SHXD5d8/,QVki^S1l%O>_&9=^- zqZMrw|3=]( uM FafQ'.*Fw,$)$CT(DZEc4HB mA8uڡ" ܽnI;?lٶARD` TEpF/gサN"*D8!nWspbVn1]8 "|a>IYD%h.4y2MG{(eKDr87(I*`H# iX1"& UQCJ"M,Peq;r;)b_.qU8_vAvFآsl{ygD P)"֛*`CtS 6P@I6UI#j*QQgFEW= 0b*^TXLw|؄vn03fUS^{:c<\cS/ƳW'Qd({hh+Frf2ԝ­Vl]8+Vvks뱳}w !B\ )։"9xw{"erLMe.䤊=UDJDxp(:AMk)I,3#l;cxtqը+#HŃQpt̩ ^?4phLj8y8zf0y`ٵz2bp'C ^ c0ݖN y $+/w|ɷc |en~уPKit)V@8g%?:XDs푿s$%|Xs3]oŤdm$GmLDPc]EӡAɹ8E"^xbRXc96{a I\StX *d;| I-l'aMR˧A'x љD7o>$yūIm!1`n&Np™t6 UQ  V(Du'<%pEe:nҫ !2qs-5MB"2F0؂SB) p KooSC(=I.h}tL Yڂ]8N1% PxuH)LvcqcW;yFTafU9D2/p`7rCXV,ڵ'IG.g+1ZƱr<{/߻.g0ӡbW]'܂Rj#47gcxx| o\ĆS!WLk1<[1† 56:n3Q7r}p\a{1=dc"Qs?wc7@aQ7v^9xoS" !5Pi5R-<;lӊV/n_x}?Ǟi}`RpB\M ! ٍ:_k7ۿ+_*D)VJ qi&>HMOŴ.xs9|ɿ|)vo~ANzp__h?ǘrSyIwy(2Ě>iX!07}Bٖ"""aE5ݽ+cf05@&)']gdrWZFN$ `Lޮ"vI$c"LjQӗ bĀǕuQ;` ?B'6WBIU"3xd-tBE@u1G+7-o"q"8KE voY6EP)hrhD=(El)vQY FQ!opH#,{^d^6x q{4,2GPc_ja#'-àbvvk_1Msgomkiٹ+inbv 6V+)8T-AiWd7!*B(&ņaUlU*b|i۫݉w/0PI^Ǖ3rԹ7>C}ѬZUkϽxbsWS[dԺ{!UeHWaZ e-¯/_x^0N:J_{mO*\}׿kV^:'xѦa};O\m9rsv!@kse8\N{ |Ͻj)øZ_8]<1àVĐ|potP:.Ӄ'3=ZavC)yLB7zɯyoH. \/jhTi%ǀD_NbhA{],"{Ng!(z앀VҚM$?&wt$R!ˆIuK6K#pCw$Ma䰆\7Vz1̢(%,= E fKV/HI"H&Ba: e9y\^`5a"eH΍M*fj =\ZA4BeDAUVF2&8aDr D~(Bܑ 0›K@ ݀rvvZ4MӤ$;al1 /vZw{U" jb3q]fHyص0&0<5fifJƂ:ٍ4R+lgqK8nk[j%Le_sLKE ,~++_𚧟wy/O>q]}u_7 7߾uuݯ|O<~q{Zm_{_{?7}oֿwSM??sټ|[o|᮪ .ܯwݾs}|cO?`eR?>կϟ;~=_uX_zݯO;ˆ5ȻϾmɟynh)c)u[~{"җe[!MhnG<96/5 v~}_g> W>tLX2 zDLS\ENt3'(1$=L?bZ|rd?\4T5QXZ7ٸY T*,)y(PFe Cd"A{+ghFBO44T3@8{槩ߔ2'8$$) B )tSA}F7ٰ׍ @0Zd>L@D{eο??QmSgX|q)/iQ!9vQ4O e-C̜@i(HlU`lgiu C{߻g=ERz5<9ʝmSt&^2\\Tʟ ]nO8cafnw2$($0 :'x.BY6{يi8 "A&~nZj0}p`m@ظZϷ*N22Ϥn?l]WSĜX `>?O~7V/]/~{~ӛ>>u?w胷۳}?=1M_ ~?O|տ?S?^u kg~[?g3#?zOgi{K?S?Ə׵ΟY~m_~{gO>7yg}>{"A}՛~? <*&#G)(qn[;3-!\$T_xػx?]BWl KaGN45GpOtBCɌ,/Л#[Tg?R6K6,h(KFFH`fņ2ɽ,R8I]hq2-{A#@QEH94`_.}az|\Xr,SI~~wBB54藚EdetaOMhc2U]$sّȡ>7k_:qc?Ev`tA &ܪ uᨹ@cG0PP(,.CќGl 啁u b%sKcS7Rt*Ac[׽ Uw+_y?7?]?S;?O/_w5To$Xٟ{g|֛?5W/܍W}9w?}_0 Gyѕho]#Ժ`Ns{Y{ăxY#r!Yn&˗Ex/7@zi1PŸBFdjd' YegDkIiT=BEWjrrN8PբCf=BO"0{өT.2Gdrg re^\f_>8a$ɥM5#0K)F!REs!p!!"PjPD"VtKkbxڙP O: дi*"Y oֆ,H,f5avu{k鏞 *vRc8#WC Ԋ)j)bdƙԩΠYQUcml—>(\ FJk1 2LU3 &QPwl\=q]vY(SrN20ZkmuZ`ra7mLt ܷj"e, ü]mfnщ{QJ1JVRz@ ("j$ XeVquhӡ2F4"~g?o?g_%_WP}W۟{s>sqqgs?77߾}_+lWgO}_??GO|~;g_{om[=nO'| }Ш6oȷ}7?v5\#hr^^3?o?gUg{Dp}w_{{K?~0rgS 2aVR,L|_0et% Op9/M̓xstKY t$uw:,vrNQT{7ɋ B~8)?$(;3uC1S֥?vY0bP n!R{TQRf[T4HX al֫X":7we+(R::AK,4]ќcmۖ}1k{o( Jl0^GDG2AD˼@r w_9^AϿW=|x^|+-Hucnd>??_?O~oA7P~3 Oҍ@w:^]]N[~U5AuaqSuLez*co8IT<έџ^>~*lL!ᦛ pM[%8HN%'Ό(ї ,@=Qp7`i7!|_qIv[fKk-2˃#iz+j|Q\UZv@\0ݿ[AJsrն,.ŝ0Y&IB6Y80I*f40؃R/z͞!a$ap*vM+‰<2,>G!^<:s2(Da=e8;}xRŞ84&tB#- /m?J_rܓ$gp EVk:S 8,+@DY0Қc;M(̗"Phr=+$։tERj̦#Bbq>G;lQl5``j >6{LGi" ${` b>'.h%|dܻKݍe bQ"5dãG_U_o6M__%_Mr4r)|*%ti%_w/gd4{;kG}/N> oɟWR<~>o{/mGq}/^O~W D>|s/wԐqGs /zkw]o)^~'}_2, e\-:]Rܽ!kxn;NϠq+?O, Jbn=im'EOu 7x#|:)1s|"613CPl̥VYuwPXDXVEY[ӡ.Dt6 <}~ ]}9ҺHi=FAu?A8wߝJIi.٧8| '҆r8 ! Jm%cn:A(ƒH`DDm숊ǑzhN.cZ8`B)Q(;,ǧ0ܒ%3(S|zbENgOf\B$Da 3I1cs*}@7LI¦ 4}An1PW҈Cֶorwݎx4 L}Zu 3 pA%pnЮOda2pa2 CJY/{<(U 9^ܝ=>Lð+e&s\PaTR&"c<>>|ZffiSJ2}'_oy?գ_]9G}~g~ʗ~W#kL'B'bv_~_/ڏ/O~}o~o7W>ޥ a>cpTU5b6s!-F#ܖDcĸOn `o]cm5"N7x)Hf+'ē'N[W[o{V61`vz,n)la(TXRxCe!W+˳OeO>P:P-xMV򰴫wqН}i>/OM e(ErA_|sm^wðh,i20VGQTFGY0j:9B@)kS1}fa,bfdJR㚙Y@jnF * 85VZ|j ]M,(YJ/Ͼ?yG~7z]fi`&sp},૾{||??>CC'|ҧik~}0 u//?D38@Y½N8\___?y'>3>|؇ǿ{~~Mm]椨 IDATrTeY%,>3_ C^8t'~mf/}Ɇ<Qݎ/SвosyrG.OlxbM6Dt֑2tEx.q&4d-'CW_Xӷ*Ŧ9|uᶋNGppr#wR`2W* ¨Ld\H);)|/lD4L7T "0ʳ/{sϽ~ CrNoYKvϼϿ0nڜh9J@ IJpB{RXRV@ <v& TC y#y2!ZCmj:!G:$WrM'/N"-1߶[O}a~~}%Aw7: 9B#}Q ZPF X +VTk f6C+Dj \]XUKi+IYnf-4̄P#ZWfpb0kFp3з_~ۻޏx|/pqqn _qbEqAG\ٝi`$"Fׇem_|K_iJoy? ѝ(/;=/ݿ 6ype `4/~}+Z2zMaUmi4/7i,A<XJp37,Dy*KS[eys[wm9UQx˛/xwl<ۭ,06/C=Ʃ-W/RϞQյ:s.ׇq72sZcUz{`s]q:uiMs|8ԁu]-˦X=oLޚaĻLq r}7v[ڂDlx m^6S&wZduAp`VV8;=Sa!& D hliǘ vU:|[ I;:',M,~=+OO"?Yytש`~N(w? $LH{ss3+LKcnbaJ,@paC !rkzDjw4-E{)Vwwb 3Zfdj=!g{/Wx9LǕ>>zy= /XFc%LWcva˹:6u5kuUb7\솦ѝ{) Z 7j b <@9*W{ ~OrO8X=) 7EaU\'(Ng~ʰ{UnF̻mTPơ~»fA~8LÀ)"3Fnff.<ӯ:^NqPVO5t' <Խitap*:C]V6g%,Ivz=U9=@H/:I$)wq d$wv]ڍa(@sC3HE!@uBZJX~YWZ`22__ڼ}" RW W"Ҥeg©~±4)TIF `l'hHު'"|zېKvd'-)FhY"5( [y,h z&ZG1I_'4EeyaCf%NR2i268Vu"QkqJ:<ǚ}][kBL1TH0#a¹,<i' 3 iXoeOQUCē(Ru\aB<ȣk[̯5ݛ2Jk3. KzР ʥyZUumAغ4k` f ykŭq04o됁U'gۡ]GH_T6g@8 8P#6/>:<0 0uD$y\Dn,U; ;d\J'R` bqWRc>[+8eoq~ 6;EFH| CiQMbD">ho}e&pa.%!uu1FHUQv&R0x)?p a"]kiF2SaJkJGbukzqvq?FAVp)`0 8Km4.bP$k2N u!|h=vuUCO!y3:#IHB"B5˱bDVB!""LP9eb#܂ EDͲKé+  qǦYtf$< v0ok }!-Ϯotlr`mNg3]RDqh#3e{w]Cit1n&"m$+](!C|`c&0Lj7z!&Zq+7>vh)2~$z)X q!qp U/!ymU]\9T"l.=M 5! D,ŚP@%\7'b)t1Me`&g( "mNw:-I[ydlC]4s )MmY΄ π;m)ʒL'(2tǝP(Dw;fɡSqHN w([G4"{=u%ӴO\R̨3>oeh[|\ "E$[[=!H]ڌwNE0S3sf,Dk-c}CӸ0GH.DQ@6,xtP*q!jq$PS@-J\K^8<|^۸"m^J)M/U}i՚-~0Phؼ(0RŃ /vto[k$<?i(Lj YT`4VN" Lɩi&VZXXP5UmK df(ΐLm8܅b?`nZjmԛ US>'@]9#%dNn"؞9]S?"p g(8ĉaAdk<,܉jZqdmFENNz V@㞤s񨺖aZP+ 7wCqHH09݇zσJ..]tS 𤎡 g SRs6 NԌghތ $m@ "@"a9P'5lqXD[iM`ymUF(ۢCr,A0Er7̥=ASߩrAeC*9#T9ԴaYL[…NLUXi6cvӺfR|dmŴSӡTq<6n&fn"0X5"P*03Jqa 5zyҋ֚p/ǁ#`kkֻgǶ65mTL܇i寮LֶV8ݸ~\6 8x::je0Te eRjjƥaHhD[#bbE|Ogn6 E}(4JHSMj)LHLAڔS9.BM[&ﱑu8;Nq[_j{0c{1GZeb> ڡpPd 3Ȑdl Iu3aaaՍ=CdB]jC3'H*oDz˻tWuc~B)s뱱n}_޾Ϝ.R}a$tbO|Hq*}\LfA{9y!Bf>6/mxwg 09961f`0Y>w6REyE) 6nNB@c>۝Oׇt~3jGp`=z+,66tSD=}z.7woO:e۴D6֧O $[[Y:̮23#XmM x G6)N׭&E nFUf GvV~?PeDžc5: ̐kZHLݕƺ"D\ADH0qqSִ҆T A.h^*j%W?75f7"^ļ2CFum #h5[=v#Z|5a8ɬ\8q^EDv]*zTbK[%GDxbhj7Pjwq&Yj ffS ww5.??qP],ь ̍aIm* A2wS,]~ppa'ExZ1"pDH1SfAp/'޴d}!ms7;9,M!/7xADMkNHa )K"S9OWtn"ĮJ4a !oB,,>Rgy75y]d2}Lp4N['j *JިqbĩbYO?px[Ie2 ".6ݻ;%mDiKDQe@Swp1n;< `B4Zxnܝ &׮YA . vѽe+mde_[4$=cXdsMގVOvj? gNB$=b&JL Y m'^[?ED}M+_M'yw[8s(/Q+9LՈDT殮`6#}ߔ8PZ3uvs5sW3+hT *ٟ6 I-F bpeŀõGDΌ2Rbݹ(Rhs9尬I*ꁫEg!&I~!^xD4|.㱩qQupΗQQJ`Mf I)e %w h F,Kkd)0eM-/.H . ī6U#l"Jf?+C~'.GݐN%l݄ť隆@|D~tluf᜜ՠ-KC>a@v<(q-Mhe/pReD[Lv΃/#_5|_y\b76+Lndž7A #U_6Zdž9 TMD؃kJ;]MJLAAj{1ki*tY-d`, )C-TZ͘ WS*^H 2ppcH.,y9=Z[[i w jhb7>\ڠd~4Y^eWJ2qLý9 0/yQ)1 W(w WƼ;ji296W5Rwu׎??5y/OA쥯cѿ_`qS"N ՚ pT[U IZmɝ5蕛gjiZn8gr Gg"gyb3JUtny3 '2 ,b*|hUʜjG1&PA+c!)aF/"5lXJD/VlLVx |=`iF[nMp:"Itiʈlp |ue4V\=YFH2OJd71fn(c-TFRj nxҷ@)oF8@8.v\\5'";R tGWj`+7Ǭ?~2,~`e;x8qm4Kiׇ/?O/sDk#_E _GAo?Bx[C <~HPj[U՜MކZ;1>$[08uU昈 0d43Odoqrso8#ba&BmWt~ndK$LЄ8V!Jnm ]$@tW颎$9iӕ+مJ&6X{7rIm]4J T2s.tPyju$'ell%)/D2l+oz%hPG!"<ՙzm@li'RJpNp`n@)f Sbv67mfWR&9 xa3p R[ k̮ 7!`M¶Ļ t8jѵX'TڄmJP/+"D= Bn ^I#N:`֩'Dw4kS䥓 lꝈ<;ﱞI\ itZMѩ.DŘ=EE IDATՇ:"DRA@쥆[>oyLĵ#9YFbYdV AQJ&Ӿ|l=XVJHT/<2LgP,f|^DZU^ U4`sh֨G ZeWwWՁ[)S5DRjW1ZbEݙ|uESpd;w?oG1/{C>C _O=?{?WFg_Qd$#4ʩ:1QSEjlt.988zZ0@P$ 'Ph5m:Ѭ">LұQJD̜6"+{ w.m+̝Ђ͆]@ox(;eFc*C[)xuEͻ̠rӒ4rTU~Uh=Iu4܀}jlPٍ! `oNrؐt=xGNl9h st0|+PU95ԡԅÑ )p&';y0Munmm,v(Ի213S"[O:<""!L>3aa >ih4 n" d2nd,GY v5hd}Gу. 7|1{%^ BՉN8]_ipXfgw55jSb?]qk@D>Ͷ D \TRk*)ĬH5c W)61`o#fhdY+,H9db'[E%Wܛֈh1[9؁ͰG7It @XtG)M-ӣ ujA#ڒ:ZŻmllpg*T&ۨ<7c2KiPmn6k3ozzoRmUrbn P#wb K_YuZPkk0P6}D7{ rPJ/̬4\C5 RObKy9kxwcg m>@~c3ylp o< G5.)*<ϾOw@@nhoMODM,0"՘X4n z)fu:V≅ӂ:XM !saeEQ+<% JT O{FB b0K-e!(Ahp03-7h.~\""0EN$rl18Zhggmyq݈SmTx\=9SH E,lLTB0mpqq]ò;wΞ~n~Xv8.%pwn~'֡;AlLeyteo|og}4φݴ,KjPU:"\\K -;,BVR bV`5a@eQ< 2Hrtෛ=mq& @S 2χbJLIFR6( DЦqzg]0!3#JHmy3[V{8_d %ƌKQsl5$ʲ]# &MV`vb.ݷRS©{zoˎLFh>%`@ v*N$!6E=@:T61891ެ2 N`z)6"'jMmUmUojI PS"xS 1s@N&=aݰqC݋i5L$/!p!P>u˨ w3]͚š7D*vO'#]cr \q['zBCF"f֠Ȍm!xD߽g]1@:kBSni )HBӮ80Vbx`:i0 #ʰ,ndĚ4R* .cu J"&*"abXX)R*!*0fv29EaqI8@nw6n7%.efQ0qaZJfj-2wt(%eYȄr.cJHYu]EY T|BF9ʜIjWojۺ=1ks7ޜkcBh_B [ 7Q" *AA$ UEH QCPBH.sk9轿B{{G}Oi1g x ,bpN@#Sf2e0*LTiUԿL"dn26v|G*&~kL Qr65ͳf3l6M&Qgߍy:)E{iyᢂ$q'd{:fJ[p'A2c%矶܈( ԰,$7J4N z~2Ir__|^PX'tXVCE,(j,0Ƕ0I XAHasL ̣;G6gE2> l[?_2-\X,@ &$gjBEZkέ5jWAML*IEX>jp] @SXB8=@8cCʏ| !KN@SB48 MF}?!| R䰤$L"a)~S e\Rm1/|t v#bRfun"W`L栲tYr:8j'z "*$D,) ,WV[AL\h݋U?&qTY2fen2#͘tR! ـem>h:JQTL ȰKiEp%p&bUʉtL/'d>-mw̝zߧiji̧S9Dcd.5"f%6oeV% .nNn*wc1V, /3 [˻ox:20Ef0cjyLJ5uD@!^D%Tl"H㺘zà$r< q ?."HWฟA_^ dyp S3z-£"D &mD7Ԛlael,YPD-TY"d|ifsC%Zi Y`![cUI%QAKbКhC1™n^);ݙ,T+ 3lM^.NBS345m}'jp/=dLp$rZ2Br)N1͒0YBDhLܦK.DU4M-FM1i+ΒX4t>;}x:IhxdEUb}E$<}37ZKlt>oE1 o{|N[S}memG]NgQyy|̭GN}շ0?HO姷uUm]۶40gNin 3O׿W?uhU=<2 B%%)k?Kj" 2s]zqKdCFB뜋Jn>d@HYu3aY{VSO ^e63yL,w29 {۶G^Tcqp{L-?/YQQ`i#)j r+N 6HΠ^0>8G&8@J(TIf`2g(rQUVAE6i ,E=®w%}L^*'}lPUi(u݃@ DZx!lYb JEGtn̨BS$(yhe iM 0 Ӂ/3{O{ `k"E=zxW SE7 > wDqXFE(D a#єp\iONGx#G3sBIQHI8A38#^LL1*'qx: soz,ǣdOLMaB^! 76 $hlDXqH S)ƒYzbwoM FBmҗUgv[IT>k\ _8m{Dzsح;?n" ^`d-29$&s.IiixnlB3yWUFȈ!(Њ_5P1QzLShJz5Gy0ieL;[Y0)11ww!! d!blE1LC+@?(Wc-2A湬̬ k'™`j"Ad:6 UﻪfDSa3ZQ,k"ALY@k=s0U! `PE(2@)U|gpX5RVa/}G2yF !LMY=}.V/AH sPCX4pϯ/N5ve7P -mj=}|vB0)Y৾fi:4<6}?ЇX~w3d*q[o?~kɯ_~}}Yt2SCrH<5'mM#&zitaCZ2vߞo'nQVVK%9PA T}5MYHEaIz"݂DDZkOOoo; .#̫,*iby q!97wdA!2Ş o%#n,"=hu^ I)"`Ep$1/Sޯ"r|8\E~8$ , QAd\%uѤA~QQj(mj:{O?Yn.//LFx r&^m3feȤiG/0n}uáw;,3MS΢a}Tvvy ޔͤf)3{6OL i0Ѣ?fpKok"2s#n׭wֻ7 DkmOO=72-'Vn?Ӥlo}:5kSd"2sJnm뷾{DǢO IDATm@ZE,cOs~8mgj%c}ff6%Kd,3wϽ#gĠאcT~8% deR" FTRԈDdՒcVR|;vY/ Ԟ*XAexQڷӃht--M-瘛;%u)"Bh:MnD˲04}f'|ywX1yRTVPGڠ)$3@Y  7c*#82jPpˀ4r\LHr+)U$Ԉ|@~ ̯z0GRq\n 70nD3@G4E%ʍ|tB U$@g" lE!5(3(`q^o:jp$N<JT%{:T*q(UREG&*W2p:کĵhq9P}: ڎ;s?n L+s&"y:- v:efm,y:XNNl)#;N8[7ļqM7eq}Hz,7!5||^l]Tu%&̋.kM&L& 0i47Ua&m"wc$mLm>=]m6eQƑ؈jMzI:~"iO3)-ih}q>9DvvdFf૤ϡ0\ Ffu߶~ĢaV/䈠ZG "#dFߣ|l8HP( 51a8HBQ':`EJ xPeh^ǛcLRvsf7 (C9!\$0Ø+C 3)VXXzTyFQJ$+ϓQ p'C:+e PrQJg 0s*LBnGl 2U%MQg͹SXkuȭl(. 22bWX}<8Yh _X4FoÄ1FCR%YhA>OދU`*S8'mininl}{7')ЉT~Ƥ"mw7כ/sh}߽ڶͽgDmMĺk6 Kl[;G2(r>%汛GF}MO_~t:O>&ړ)M"V{RQt^rYX0Ԁ%+|y /n(F=3b ૤~.c\=0ZpnUS;NN >}|\Χr:~HYԚEw ,@qd^5UQI1a!73'#Ղyt.%F1LQkX(R]$AO29>Pӟ%Ersţ\t>NDgg&{`c/'Be""=iDk OQj$ f  T<(纆S=B')7jޫxvר.G0lA<.z)I"Ujԧ3a˴L&i6֖xl*`3]X1>ؚZq,c@¼~}zΗMv}{R~踱`S2O!\< sԁ" ="U= @ ̲!EM;s#B"ï>;1#(HŅ"$" m>f𽲗c)̐F2D˞۫of+TF+.P3mg!:}nQo^6;s;*!SX./?IdݣarFq 48R{6U:J8))i5n [_8LU4T.jB]ޘ%%Qrk$eܣ:1:YP@?FdH#WD#s4E2n ֻNP'7-I9X}D{Dxm5{yRLr`uU})RLfd{I1ITDi5mԦl-E:1qZ%ҥ55$M'p;6)#,y7ȼNJU)Rq|T3y9N5p,F$IRD r$<#R8tA""QmJvg*?30zʢ+vbdQvAGs}pݷ\t:-Ha4n +T&!ٌ[<0)cUf:dy(tJ1m&sȠ  p񧟞.O˼@]ݼ?SAȊk\6n5a%,-a2rnz%K|\.AkYF$UUO9@̙5"bw{k{LM&D*)")*de"=%KpSj*8I/2A| 阂Y@LYķ&G\"y&^ǰc$, (;.hY#erDHE"I@AӇ<%o[Eí&UY[(!$z<+Z݇<=ZV@8lI&ڷHwLV}H޷$ط^3j m7*C˅ۤ۶m+{ 1E`3E2i}ө;R"O-D=F}gYv0HLH="t֦˧1t,t6zp9MS(3-2B$EtwwN8]17XS(()"7:|n$[mo܆,)jRgXZ\4eaE%Na%1.y4˗僪nҚRF8<r,L&zzyΌҘL&$tQzRfȱ:VPeTvJdAH"j#u'r𵘅5_]i4(<۵ߥna TFf0i\vՕY)񰤈Y 5v"yaz|o<ǒR8*V[!z?Ek!AJRKKxhFzgfIb?G.`IQfbG‘T!BLsDv_u6!V7R[ɺBTHߺ0~=uC̽)wTz;_\‡J^SE@ӣz%Z-ΞDz>&N|pCn6lXWG"vWn9uviЦmuXqΉ)/ZUQscjnmKB{30;{Ы'.jqP`H"prvROu?\u}?}Oa|絻3FFbhjૌaޠj*ښ[~x^sۯ\xV7I$n1}$UZ8*jl4U;( .'QzT`nHDgt4dV4Q$,jiv^-Ѹ:Fet Og qP:C+U-7LLK: Z(bՖ f{ѐX;8ܧ<p"f^F/åOF{4y|ѴYGWv@N.$,hySg2(KeR>7g_ diNDto.ECY0c}J/ urk@@2:eD GQqbRu <Mvo2(]]NoA_8sJbVȀޢ{0%Z\ ~#mnd4 VJIx 1tܝhI]PSqa{YXɑ0Ut13&,8Z`7êJltW7Q"iȩVj%uu]|9WND"9Oa:9SUNxpszٌM%{zrV4u>՝h0J^oM<ԪVa4 9A7mC2댹zx*m8Hbx\'B7֓:)y:+DdNOX'w~n}'wCV˄ͯ>?W> ^J>yA?AcG3۳KvP}b?=f,m}`m. ȽsƏ>\ GvoT&7~tQ KJ=Osʨ?]7럿{䰾qˆ/zi~< #Ͻ?}k!gWl}ZVW>7w?pmru‹?`'.`1Kݻ&7 MG]Q)EPi>ޗp1v)VV=zwAGZ-@_S;_^B"%a]g@^f肃)T j !j/6]!Y 7(p؀S$C ѦG7n'OgZA9$a3.g\ɰNm!,w[ElLҫV;AfR36pRB'xOcZė|6UHijAT0\mL,t=6hZwg\wەeYX9/پQZx*Seyr+`D (E,%Rqeڼ^PWHNaUmN>8:F@`ś 0ZYvwBZ\\xuPwU+-f(yx-SL''$S<_κ-R*U=hsSa9#"91͊q/sՖa{Y6Z9. _?3NJpw5re= z:ܫZUVenm*|vrI)x b#oDqҊ1xU riݏ|,gNm|\%z2f cco}?x>-w?繏]_| /:?;o>W~?b9o~՝W>n("d&㏺RL<)_=qVS'gНͫwu/?،ᏽO2yUGҽ[?o9Sqk|;/~R*_/_}W_/Vѧu1u *'7 XOXYeBZ`ODwk~ {\YELjE/l968ZT%xcb 4fJmZju¸:.m[)Эø.H,q\y21P{ArH ߥHq닿a:t a:s _h ZJ<υ9;zkP%@ZZclOKi!ZiԈ,9׫|65Sc<$wV;}1R'6K(c ymmgw̋FUwܙ<$fi&;kZTە格ZaX)^\\ΧҔ.boϞflkI'%J̥̉r73d.I{( FP75s%Xy!CN_xܲ?ο~+k+//?55ɾ %g>7ǛRaX`=^{[KFՀLCln8kկox_5O_okwWm?y^(gGm&Wo_?}7?[.Bi0>F:o~ӃCL>g|+~o|O?Ÿj}_o|Jx#O~8-9 ɚ!iD̺ F gJ1Lm2f^k V{69t N@bݾEݍY@f U1V%Hz8 cЪ~I|Щj+hV].ã*&8tw8Ú# !\j$ ӄQ%" 601Xu=9#ƴ;q aPd,!8e YV2maHpu/-),(b/@}_.Hm>>:$ j݉c1'Gt=ӅPjqpӚ{֓6զ*TUМ1ǪZ#5ot5nW &jJֆ!55BsQ1 aC8Z{-2MJyPr9ZKU:`5 3ZU'uXsrg6M9#eJNIZiw/yB 3KwlʥU/vpV'9 ڴF-.s*̈́@!䎝wՑDv/?^zwܒb˚ jEIwc#y2 o'V|{ű{O4?5<;Hr4loQFHv3ܻYd8>.vfsc_EDž`jWqdp+~!W["J}b])ZX_q%]{yKtjĆX;K Rkv IVs?y{6i ( A śucs'$8$lizpjhu8{|ˮ-R4l8R * 'XUW> SͰ{^=$TÎ3@Vh<2Z@hNVvlrZ0%%,78PS ]ܷA0 W~]o?)Iw}spJ{-XQ}N]&Z1 PN¢ͭuK{9*)\k+֘ٙJ)J<䬪faʬRm0q"H[sDzJ"tC"";JEI W,:2A(+sUj6s40DysN`y{yJj`Y$@}WKuݶztx]9\BLJ+[9MBjmrf^oȉad-i3&y*V󢴛*EQ#^i6+矾~EVތ2nfQj1~ƟH9n7?͟1YG0s7pd;/Rww> IxC[w:)!q&7?yy?+?7>ƌ},`w]foY*/;>x9qLQXQ@5d&ŪGݛen zs0\۞X]_+O[=gC֜)U:$9NNvǗ3}hndRE3k[fm'Ąqs 8j#V[;:c}A,{7X[Z~IzgҢ>nNQ3E]"Lv\I 6ǽU] ~`y3;O& mq8Қ 6LYRN3^qΥ/y/t,zhԈ>ݧ@D[omW1^ [P:ƽVFJyVɡЈ>mJIJmD>f1SR3)sW' :j=/Z-œ@0S3: cJVA.M"xt9RHvX2#W,k_S)gfbqYY&/Ksq~y;~ഴƙ-8.qϧV՟si` Npm 4d)wPyX0QNݻ)̪9RNҚȤՅ.1Wqd3&hcyΏ22Ԗ8z'4oi{AO)%W"R9TMUCmfѩ2ɑ>7 bHzF DcZ];}x3^lw~qrJ Om8r{ִ5._ ቤfԢt6f[d_mPskF5/"niWSW_2QuRV;Xw"q 3S,ŻJp'Zkk-#oͦim˴?r\~MOn~/^=~p91kUޚT6m7\Zk51`5o &AJ䮦ΒH-V'ژGwk]gmj*uFr1rjLZk=;ۙ@Rh|NULjZ}ڕz]:|}#\WYDn>=yO޸yTsan޸G뇏קW2ת&mG?3vS"(;zn)F)m?VWvsrp~J_zr{o;ofTOD933;BI0t'*,yA?])àĐ|:нٺ$Դ1T>ɞSQzep[J:lAyQ0DPئo+ثҁ}.uM< c f^c$"rAk䳧Avc-@OT՚ZaWSIskcrvS-j53NL)Y7T17rgd<ԎGdfʜ>̗"Q -@Jar4, ̱Ҁ\մϣdIsҴ|^ }b"r3dQp6JJ`r-~~swyh!f0ED$*{v"k ðߨں%Dpjai2d8+Rr3@b@frdY֛}֊'p0jӶxC-S5{ X6k $(_9~ wݼ痭0ؔD@ suʋ;E Tk @4 >uM_,?S|H=9/]Eq3ssǧVs"f*wxr e.URY@8y״ļT/η)z.λI~y7ZQ{eBbR7"Y*Y2,xg3]h3ϻ]2MU܆$GeZŢ@nQ'-29IhJwiNx0 Vhjqbn;vz{z.ۦMi3ڧ3޸Z-GDgUU3b$"&bGXKEѨ{d _yonZWu# 4nNx>IF0~U_}g #n3'0=$=bKmv";Ja4&F_|EpѸh+斘J1:?kMrU$LIȅ1zuGO<׋m-Mhmށ$ĴNCix֚w}1s󙲰A̋XXr]~vMERb"Ն&M<ȂY C0A` -t1 ZM "أc-&b$*GI8fgy:osv֗@NhyU㴠}_3"{_סE^@nWu[XpsYzVW6qؐI_p f/Z~%z_?~aLrz`JGݴ=۩ ͬW!d pIb{煨on|K[k((Əx._צ4'5?ߛ,@+8;TIϡ-&߶l5Tm5:12 9 #(Z-( 9 tewTJmm[tH$}W.x_P]rA˒] ~ܘ<:lj3wV3󟳛Vrbɹ658eMcv"i%n! {fsZe=lLYq}ڬWf;3mrps)4$̆\KqRr{{k'a\D \خGfg./[Ց}R+!prOU[k]DV_mXieNa 1݇.Ӂ$!9)I2&MP?z?&*̦u#-ݴB%=~})=-%Ǘ['P"?b^j{'"+"dҽ=wzܑ܉lnJڦzs~ s SKm^_*:n70!un^ZkYQ愹nc!y2kWŀxmH=]+N"*5tM$@磏XpX^q?'&4{7vԭra). ꭨ 6<;9Cݝͧ_5ֶ,;s8n` B)J(qPBb@d "D8A Fb-H @bcĎ#9~y=g֜1:Tսלo|_/+H:SH h {'!2AaQ2 P΀1ED f*8v8p< .uE.W R}_$wRt8C7z/~#k2 =]nnmswi%#8"*mۮ%Z[D\7^W/m\25!4aajmfu쭒B{4 E @HkXE`b&Wmy>NfZJn:OT|Xzu3/fzؚ-E A)glXJ{LCk6AP|tNd4ojneat sXխ)y f&?mP,cgmid)'/%v`J>I$Tbpi?Kg4{ɢijwp˱$`-H rkW9chB:U]7׃_`L@!G`R:9-9ḩ?חZFK;tN?djspnm*,j0W-f:A"uwDevI6d b*gd]O  w =ߌ6簼7HDܗ,9H60hް8aNLB8fVϹׅq i,<9Ga~Z=Htt1[h{dܡ5ЍӔk{=;ua0h`, kkꭶĸ+"^y~ J[I7~D)xRz Ytx50Df!u]0\LìBGM)mk6 ,<.aaL2V )jᰮ+jaDBonՑLE$"Zk!\TDL~$DRHa*VMnk>5YikU#)V=2tۅno u[-2:BB&{۲Ne1L.oً'k~" R "~{?bp?Ӝ %ث,[1H\X{ 7557h)DxGLR4M7q1ͨ]R#б d6F@?Ǵqz ijpo:i?#b\J8m1J+ހ-'"$fFLJY|r_73psN^ =ck^\;"fi9 j6"يɀ4#qwsPO3cw`{r&@@iJ)YkD `nr*C#NDnE:s >vecضM&I4U[ | Լ61`шw:@0E'HQ\YbN$"@rH'jhᡵeO7BD5z4@-U탏^ ;à ͅJj>2nN"ƻȽHbbdFf{ȓ̇‡8rVvI4;)W,cdM *it4`ɸLa'FH !# Fg$O|U+t$$BLO&Q~YmD+[H+s@F&4hSUC&  Z3ȲOM9b}|ȹ/[<)aDxamB'/ؓthf^LLFrΤfaăA"$K-ygNV`ogX:bȹh x">MԪc+()QRj v [ǼM#HQ-܍iyf9BmEEt Gcp 0O[m-_{|yz55mn̘pyG~m7_{?鑞xG?||y'wub2}Mx;4z0 MHC4a֦4&Zmmf^f)K u"b]Z_.Vc"Dt_ ~MaDD"cu2 qOuy+4s?|ywdᲤ-c`$z]oO kxLԈ$"9$f7+,{3fdEV 0_UJGΌQtA.*uٕ!G bKqRFg ne`{ xՋq,2n=GY5Ͷ7]+ |][/u&ނ~Sx5BU.nzø_2U7a>t` @7 1,$Wš|瑈U@4h< w@LW+#g1ogO3g$BfX1;o# 2#o[35UkDHɔ:*y8!KLB6Wu55h2GZZ 2D,BTF"n9t,ʵ - $en[-SZW)l X˗/?⭉|jfz궱Rf‡yFD3&ڵvkj!A4_"DP MIЫ;JSmWzgn o{?'?zx8CO?gϞ}?77G0#<<=t [' ́rd8 s|.|ŋai*S)e*AJx{L^_+gABNYO ?5vNŸX)|C^/@0_.ܾ8E^q.ؚ LD&b&fH+e9HaI퀒@ fF CjաkC-Gq0ųp }؜=N9{c"';QƠzp]De"se$_{9~wwOo?7>CDIEdBaPD%hobYעP)¥j !R nvYf*LȄB0>9DϞORC!"lr!{ɥaK#:gFD$ R'b:,eR×W-{]^7[X5mS)E@麽ÁL?0Bڶ6p.B31SrU/c="g`ѐT x h,{ ] wcn5~X܏(ճ?PM<@$RJ".;=lPrS50Alp\L$  vQ>]"|T :h 4Rkm\q6ɴ"u(gaR79! PQ] EUE"@ A'8+F@撇0Rxc^/}G}@@|zܗb#r? "f`C2(1;Q%MF "pY"T7TSXziZJ̉^RNV7z.CFJ+z\_>8J#p˦6!dtFe)HnK)>Y͑tšfjl\8,LRݠ7o^X?;> @.e6/Ưf/Y__'_g7~}N" !HXCyq"0 O4 0jpAG[SPgsQgZ`XӧwO= +8s1bb!Na[$7CrG8 L-t<e*$oxm;jOޚ>_.o?#'$i(-Ux0!{EZzuPJ)cqxSxt5z{z t@s]00}}s7)z˜YVɶl9e]Wj wY{ƽVpT,`N "6iyjV6pD d,GVP   ?rˆ[o;̔_АĄa!KLS۾. Yv i !p TXL8a v BTHFK)ϝAcf,κT`*Dʠ7?תTgn a@;D(8W{edbihp"uqfh8g/^ "XZLM55YuTmɽx $ʕg gLɉ9ܽ1U$Rkm\YPkӦ431X:$P&JNDj%|*AtY6V'kJmmaY0j`cVӭ)}r<)Z&<0ts𼙹;zPxxBk2L/r & 6d[C3؈R\ui^/ȿ}¯}x#|O?/' Ͽ/~S_y " )`բױg&JF\n8`QDH8Tz1@rY/|R@?={z9_]/m|^"lȼa;@Ci*zS(v}P@>y]p`&k~cQ6+~NJ@jBpc*3=$`҅rp4K&G$ L1#A݁9^D$!Z5#2gw#bg^tp2gAp!.Z۔)L69%Bӄ /׋{Ǯdf `ADf 8Ɲ7AqGD[Ô\fjP,лnXH*ή= @4!ǀ!m9`FoT3%`fwrO˚`zyp Vݡm TMnUVt`Hfn!p۲z)3| & :M[zsZ#BiʛbM(RɆ<p8-̢S!A.rnAQ̫Є}aSuOL5 'f#Ԧv IcM3ǍlEP"bfZE[+%"@6 #V3KӨ5BM rگf8Q_?|]&9ޜ/?}{佯|x|؏^gϞcW'w9"y3Lw0$\H ƲDBauG`@CRh4d񱻏pE9ݽGco^7"\|x""YDs!c0@ӹ)0r]hR!m~{$ZExmrSuT{@4@p ȆCSf*ˑ'W2 E$~Ro͇gDFeMD.?K`Ġ'cɂ$rk_1욐rr}h%"4/ly"=/&Kì h#` ;cqH٭{Gu ZLm3ڤL[B9]kkە;\>_zf)uӶ9%zMeK̨u]ʴE;,D۶t3jai=E&^*󂀪ʄ*S"Rʻ_G(WO=E3!0B p0N͓x,rbG3HR=3,aYp.Hr Չ=P6q9,u_xrcjmcfDa -”an<1P8+n/Z$| 3#—fd T·co5`K)%;f@eA`sΔ:x:ҟ!0aqߐ1# g,/ }PDDd G\ f@ʶGfuN;2$le#'D(L"_uv =OdˮN4LB=v IDATحLZy#aBj,ZM-u7k<>6@ a 7C݇bcjV-<0(xa$=1˹~or33{$;~66Vr C0 9cPJgX$#GxC1{ ZkM!ЬcxbR95$$@ٶL\͍)I0afZIԪf[DuA,XVk3kjPMUVR|[[ՊHf2 YnnnL՜ZQmc<T|92MebFfzgœ85G*t|r:"ҫkk]Œ  ^[S-3cYx `0s ښ3R{ 1;-I!r266̥'Iҫ T HaC6ffA@fB,VH^߿퓻͉cx対VëgBNy]5o n@"ivBjWFq\泯[PH eKLo/?&+;7$+|5``tsUE]0gZ%}  Г@bFN}bRQ?${;O\,޽=$Cz8WɹLe%;<%TsKw6J&R)2S7`"(E# WGC,[-k}E 90 ; `aRZ#"p&>ᾶAfG }18Lc[k1^sD$D)BHox4-L'"@PkST =(@\(zPs+)Dtl<_Ϲnu=Zc:ΡfR8"u[WiFk" ɚִ~%)iT&w<@hkSհjh{n[mu5M#|׭+0k?ۦ-ef61?9,E|6&4I4)b3vi dOOfYڹjigpi Zk t`b)L N3\x}V` D\Fwzя!HfBH\H",SrM1005Hm7:Ƭi/?"XvxF͝ +4T<384D@BH7& MICI14gGԲ-+>sls%!̮7=9=kDx8ĩ?wL0 !(h2݌̠ND@q [$F#ùR؝zUp! @b@n$A-H>s!:)yzzh^\]U ": &&7[4.Ŏ0G.d } Tc4u{p_A#X8 \5DJl՚8>Yfb I>H/41EbݶJB$$u_V+5\[KpU[e3;_̈XYk aC$ B`VmmUW6Eiv,6 \R""Rk+#Lb:x+S Us).,̬ź\馶L|ۇ^4k=TJl U> U^LtP/,5U\hD"!2!5ԉ 'BPUn]}.+GTɉEV7z Oo#Q\W'CSUxTP8#rB:NJaY2^0۲ AG2sI#'L R~@ @"@^9"̝E"Fpf[ N} SK~(~28)P7gB]XXrs^kԍ jhb 1Nu{ay%Aٲ n˱kc]0ƹ+0E в0\k)Ċ큶ZI1$$w 'm  YMγE#pZ}xx^:i{,o3kӨe}u0y.r(bf,O:MYU B5&<f$#%@,p3?oznFǙO <9_oRYhAA8gAW>NR:4\M],?=4~vȞcpd1#=r_T=b{GXʑeXc1VruێsD"Bj9'$_JHDx6Zݬ+3auɧ)D1C$FJfLڎr*Pk!".Xwd1AwϿLC/G*Wvݟ5=}@خIJMqHڈM rDLӔPhyiKCF{i.jZK)ԵKU;@bb ѻ7eaL%.5@b,\9we2t:Epj :L<-VpȲ}s^47Nڻ[i7!y(}EE}kN%|/|bjv2ss `P@.9T;nbsUO1P`p֣?<4Ef5[tFDRfUZC-Y#BB# v9k4"@SuHA]0J>(H# @ @BiMWE{!0 cS"閡e';AC Qu0 hpH X psdx>Du (M˩aJ\Ұ%(w곞w{hhcP0Ѳ>I`f]]C8{E+Z`l!*Hqmx8/؊P$x릔8JļǶ,o{ͷ/v<#I7Q#agJFISC@6[3f06ly:cPF,0FSqu<i!ֈx5"0lZe`NZ0sA!dfs@x$Ld$ᑆaJ=Ja#ci" n}eۗoyftiFPF:.-vꭉJBw0HbU֌f䁀emq&L׺F_)zU`fP@*:NڔBZWW \kOkS#pX殓OkWWs´:ĸ !f5*;o7qEepR [e;%Xz&G <*YL6F$ d˹_Vf 6\l)q6-RzO @3pLP5!F9M0\qʚyS- aRjamjpRZ(Gpk DxÍ|"9?P,8GWC+cenD58M%nDA@o6ٲNSj5{N'p +鹉DuW5aAB7o܎^jZA _"8=L4l?< (ӧel t>Ff'Ca !د\@ [ms#,՜<8/D<{ ؃9;m H>` `Zrs0.TJAu%^<"r)u/NRL5"u6#qެ/fbx&E`#po_remE"; (] ҈Tu>p3 8"y83ǰP$ KJƦck=A MdyhV7Ttɝb^1;{ PUo4MAq'(eގPx R]T5JewT"Ճݭ<ש0bP]W?-fO=r=!{7͏!Dмޛ^wn]8+QPP8uŚVi*iS7 QYL",,,"Sy" W# 'ʱ-QmC59:!#ѨǼ1mt٢9jM/1ޤ= U!,(acPp=SN6Rr&[o̬:ݼ8̙G83c ;{)(-]aFD]*l(I18 RwOvA$L,sxtU3'Ub{kW)]3A}-€ #)ruqg[ A.I1´̓nᰫ|z2^% -Jozd]&ޢwDa9*s@Hvce nb!!t Kn-ޠbi9Sk_m1pMrPKu,tE0wMwmYиpHb^3;S^Fhj!bp.0֦ "w&7sBJN"a'$ @s;Z*)lLkm=Ҙp[IҸ" G Ҙ9?Dee:y)|3}2{0>2˼yWUҾSA (eÈbv-2A3p=6U FϵjCQs]9bB m])|bqw! TwR#LJy0SӛⱴH5Su f"]" [c/j0MSZ#8pτ/xkn ͨ+BaB^"vhUU#T.#d"ӗ@IF$U5.a8`6>D8 C?nkRpq2]cs}LnKaHB(Hz֚6vsW5Ps@fw 9$)D.C ;aj6úM{yț13 2o,%]?53@9nK9x?LWJDۓS>4սS[s.ǭ=BW5 VLŮJdr!<^}C!{Uf'{AaHc2lAD4…̴p dDlce6 c% p< ͈ؖ}3霜P!" ì$FYFD>ԏ z'%!+WxL sedLؚf4s-!a"##GO٦CDp7$C*Yfֹ_3Lj8r"ƈ?uk=7Exn$|go@-BMHMYbi"HYѠ1QXՕVY# n@ N-֏&@4W74YpA\^#Q~ blpG܏3+/ q4LgRgg5efI \läL fU­&8բ=0A$ EK Z~YM`?h IDATNDGe[ B7ε Y 1 yjj"3A -dp\;G(kG4wJx<`<`XT"nf&TD (sh O2Vxkq}ky{n8)_7HjO>qgp ꄰ~ F-f *)8 N]4r<㉣qvC9eb&1oV*=J&p'\)bZvš$鸌= 2"N#o lV"$~¹rzݻjLXfb'!Yo`9p鱡_CF"!HigW!xc`,cIx,D}HQ 2mabj^uLBy0{&Xd#9j0&ܚW7RԚ^?8;hmgaG !@޹sqss$?T`@QiWDւHjfvssݮ?>:s y, sjz;t*zm:O6S`ߺ9 "8 J͔LBw//8rqkDLžƣ^DcYzZw4fa[u ʈmB`0.Tj_F%=0mka k8dg# 1Q| 7B Rk Azl2af"L<8xJGI{Ip!"Caaۼ101=NSbDĈBU*!%")6"i$vKH|?tPʂ%79@,KjKTKufab͑H2@Y-TCV*sm]l#dب? :=dڞO<ُڍK"@AKm|Df&fRJM8# mCčlc[m&1?Cͩ.{USFlgvȌ*)"@pP4)`3Xx !QɓO6K!+B3SAH;H/efj=q@Q3UbtGBB^O 0 EItXڗ!2RMxdNVTYڂGIt%Ucz[G6ņ05(on:MS@Z;11Y#4YJ H1C31ȁqNXץ7M-4;9K# N,BUia7qv;q NSEGQoWAF†P mvrK ``᱋}!fB !1rl;Y.z@B,ԻB-Չc/' JGǴĢGGDܤQp Z.TdJX&վap,xpgf7`%lsÈ p} rօex47\#{5. 4tKetE2K 98az==!{W+ 0LVFިT{stY4Zi5 e٧ Ә;:$g406l=\0p\W@a#\tǸzI7V5Í Jxeʇt U 0vc3.У5=5wFxFDI Jpq f h$"!1Sɻ'K"ylX$yL:Ǹ |ux1\$rgp!ݏ% <DH1e<\]a*c?<ܚJ y"ݽ7SԥiVDz8)ZOkD8[7dk:Ou*;vRp2ioνS@ɭf"rWtUh[a\z2HQCBg>W~[?#?ceG^\[ZJ!3,wޝy>>cxu9ܺ[=x|[:Ϗ=̮պT z~+髿]Ⱥ&0aSz ~"=L~8S^3h"@"ͅSOk K)̳x2:o1Z7z`Z'URxRN590Q[;.i=2QxTznnnrtRk RHXmS#$K(Lަ:1owUn_욙ݜ"GqIIו%"@Zh"^vཁֺO>yFDPՉֆ ̙By*A}ϫxO˾꫟>{[Rj_w_]/s7o{kz-Ęz3w/>g}G}s/W /^^/ۿ?]ܵ<گzK;z3X "+"/>ۏ?_/?˟g^䓷?Kǟx_}w~cp7}G}?_C9,]u(wrtP&q\tK,0! ng2 GCh7aƅ2x*saZ =: p89u U0bJ 30gi '}o]iIaXYȩX#]r_:bmEăH4VW6D)eN}jy|>h+ץD9'w4Bp^nie,s!"4sW@?n_á kf榫yRJk|4u) Þxk"p]{&Uy7O.EywJRD;kW/yWeeo{_n_-xq6xs?|Oh\Eoz=yۿ__}>G~p駟?zK^ͯ|}Al}ޗ7<7UqY B{o{~?x+~O<_/| 7G___Ǿ;^.o_~o?_{ÏOw>>zk>MZF8[;nEܿIbofp$ԩpFO87>MM6( P:.#@|_ʘ76@'uss>sV-#`1h*0$\Hܱ#\!@5?[;fȡ`ߊj2ظZia$ȉTM#er)@f)/c0UіujHR{p٨M"N7 WAeǘ5760{0# !9O"9"CT(xw MER[͹ -ܝӥ)Cw@"?. z/|}˷٥<ў)[^1 }Y֭Zyc&$"A\eIX,.XEh'SےY {Ed>R d|د0j-2׺\nu(Av-fnew1K ρI@fէi^ͼ+3 Ƚ>_lzt<)vkB(I9ñ62xVww{.fF/']v;/󺬀hFݕT!`\T ! Z[ױU!ǯJʩ%Rw| .w?_o!|i̧i+}N)g|Yk ^G'o{_OO[~7˴ßOoׯگ_ٟyg~s:_| ~?L _E_?5o||~7?/zOB퟾|B@@Rw5?GDO#,]#ܠAymrMƃ0r7*T;;hN>OP@H4,̅3q閜n怎fD aP%*\Da'CsлߴJ)ޗmPaJ'Z,q'@$jpH yS@f;H`8 #Uט;JgY{ wb)c4pWn̰La ""ͅY!D#K)/]A;&"=2V!˼[EUq8a"R!R "F@rP:b$a Bľց {DBUhoph>FAr8Rֶu8A#(-S-[䤃4;Qwc<HX5$Io!:Ti10$L>"ՊTR`5DfbX"Θ~Ov5aWfݦ]ZvN7.B:Zx\k)ig4;"R"NnOۜKsoC4/+1on£RJ9&[l ,<(L IDAT#;Qܙ-K DzeAeeֻKڍ@2=S dk[CRpsݰ6c7<3şzm;OOeg?C~)F|Qp<|$^ ohLKBĽ{~yyg=xnoы^ijz}q7t3^)?39_yͫ..ww-o?Yyw}xso|w~wc>Y{ۻ/j3` \t&HDdYMӣaƳe RW@K7>|>_g-lNͿh)oEd]nLx=aWn!Λ/$?f+g! !Zqu" df S$IGZ"`dH@FrsOUܽ NI1ao ZK10) D4YeY D:u 11]ܺx챻?x{LD.K "n$[3I0$T֭[wNnv򒫬]{Dڀg3^gC< R* H%-̜( 0{roO|~~:k3$[ǻaI'"iYTu5ҫ fVi ,$3 DT9"H,mHXN,_H{}s3BRkRϼjkcBdbZ:]xK֕7qxhj 2[w_Uo:Le~p}7mLu{we?><ϯk_ ڿUso܇8|쑜G3!"2TjYLӑ#tĹu5jw`P[4GS[ 0X,lU2yJ`rZkڼ54>Sv?"JC""Xݫj@pwcd8fu@$Fjk\%%((` 굔# 8vK+EHwY>[J֖4HKF.`jnp5xu TA# l[9'>_4BpG{dlښz}0n<'Hf^+am58D@ațiqvNt$"iJ\ x~~OVsӔ;TuE=>G(tBTQ;B2up V]J}/-˼l-?7Ýc/sJ0..RCr,EPزpX lFԪZ?f4Cil7aȃ'ZxTHڪeaX%Wb-4jiK ZUss\ԝX$ywV)"uiࠦhlJTq- | R7MDFWs'7-ETAo|-㏿=ﹱAPB8ss8ʘ/T}_]HRǢ, K_R<_^~ݸq7޹͐VX8z)mQ;):ˏVl*9<W N[+{ɘ-QBA4$T"M]׳1u p܌L˟!8DSSnM[( ;8W=Ǣ?*DLDfTpC/ )FF$bt8l:'BD4` Z]Xݜs114=q=к1tٴE9g)E$)'0,hX!)&GnadS/~β,v{ƭeɃ/rX*]q"}챜pvzz=x[<4NG8 $adu\.e_t\i C}泮SYaeGJHg[gl`w=ΕQ!#ϧcjԫjiza/mT]m<òK6*'>pӒq4l6dsz6M7Φ픶9m4 yRNbNecUjh fiAg%gpb]J]U(271e7\i!YVdmjwav+|I Vؠֺ!uܪkm tVusZB6tvIRb>lMSַz[fFeY2,h\ü,Lc͔s>{~eōqp ADED9R:"~@; &z4o1eAwI DFIyŜ)@D}/vs,Rq\JcQ9֚a,Rj%RKӪYY;5k,!gnƒ(ڼK5)/f,V.K]֦,W;T-jkaD%r8̼KLN@JiYeY2h#bI̜"rQUZQV`ܽ{+>rDz[^W8s+`Qy3棧_~'~gYJ_S?oek{#Ӷӟɟ|woo?==dMܳ`xZ,?" [4y+_დ{_Oas.knCƨZYa3g"/va\_@(kחF?QXǏIg 뿮u«BI2]7ǻ=Бj44:;`7 cdӓ%DLƓMy.iҾT\Fw%M du L1a"Paxxwy8h8V1RqhN`w.y)7nxii˽Hj3DPTIp;8*D9hV"AUR]df6ZINy_!b$ 5^m}s>{?a?x7N6xCs9C8an|2\R]Div] G3OwoMOca۞#+zuƳ2}֏+([fܻrf t( hL]tgCœb-I$1gB7cjMkY9!1'A&WBT f,e^۝G?JoǕƓOܾYP붪$"Y "8.˜hjxhYlލZt1]{fqcYГqƜ0Dlk5sNY^]^R[-gv~.J̭:lLD P"fCD$ue:w{VJ ӳ7ͪ&jTxK"ZZpW3Z6,*܌W~g|ŗV$_RFVpm_Pj/]ɋtwϻSk6TONNqU-#lƲaݿwy^<2fU8i$*Ky;4/ռܼukCC5 agJ"pLFVm'lLJvLi{w~PJAq"9K窦&]]TiK)lZbYOYyt4U0f"h`l3akfKHi69ŮHXd ڴ9c}лPN~QK? `<◮;z_K[x߯,?/$~É x爘Dz?}Iҋ(2;QyOo ynn61@cO{()=3pH>z\~Y2ݿd3sX6qm00aKJ!dŮӑص^bV$a\V=DޓQMiL&zc]/uت54 E12z`}wiuHQSzfJՀnlQ+ 2T e\X(thOdަdfPcvӎ_ 1;y˒I@H Ww3ürYb7c]f6)-;*Lu@1":Jw# DG)MU M|J}/5rnma9oXbڪ6Ct+Q a0[kR`-+Gx&]`'3(dY4~!x A'h#Oj$ `kV/Wa?p3*cPd0u0Է/u>g$Y23%npܽ{fR8 d.KU۟ Ci{x=eNKlv%eΉvV,4)u_Ym`jXYZ x؈qLv<\̓HQ81ɝs-%"VRJ"PJ,O4eYҖҵ5զAbilͭ%I9loڢ)^CS ;A‘SfpP[] alj\Zg^NIḾݻ`6?'~'wٍ;竵 A9X",/5VvgN;xLqz+pj{$KJ,Vs+U'fNk.DM]vճ'Ӵ>A5I@ x9x |Dj;cU07k˿">ǟyj= b7֮mL!@fH1Vc[g%l{I3O@GX 0]zvv =wJSqgbh?P]j,5LGp=UEb@fuet;FlN$XpvcG rj5RnJږ0j V|ƽR6jpFP c>/%O)y< &3%* CU 'IrLb< $c-3! Ц 2! ]N^X[ е)/>X z%$a.溪i",uLj/L/#'/|^waqҵ{Ɛx>J\ ht]Q֬d,5#izlpMzq#fRαdژxYZ+3/,B$z\/zdq-D܈&'M0I!o68`ċHvY5n8V}^/XWun-fBd렽7WE2_; 1앬1l3^"B?c!VG"fJ(U\%+0,_Q5>2â'B+丛7ZW)!]Czr3dzAip-"y/sI )=lw>08x֔)vDމ~DHB쀫CcV)o;pN (ؖ[ 2Ӵi ނQ 8<%Į5@HᬧĤ݄V{X_A{ G޽ rk =RZLAP̄v{TzNo[HWNL9gm!>cρt3mC&7m`B闎 DROq=c91i#P0PxO"1̐RXFW#ǖ,<!v;~f#'tzy޳'''0cV+ZKknݹ[YJN)БCTԈuMM#@X`d< &K1o7Sf;`ڈy%E4XQ26x%XLܔ{3i)5eHYIլ4bJ)u b\ '$y5gs*H9,;A0 \rtfb<4 ]ˈJ#VKSZ-{=VJjY,Dcޤtײ7;3S8z){<14&+h8 oNfJ̄ 8Eu1tBp®s3G-T hZsu2] :u0D`W8F|aKӯYl\ OL:73Q9cи _K?1k E+7"]c $-"Zp n- h#5S$B ⻘]9;5]{k*f G~}>prkӹ]<U8nAOlňB$n wͥ1VZVnIU38 Yպ$EGB:P:ϡU_$pDZO㮪9ԬA‘pzWkXlZnQO',IDj'BƑ_!G >/ϼ敟{>''PD P?,8$a0FIVeN@2.g'iДfܫƍ 06hܜ.uω*˘TZ%Qr6IBӔRk]'e9es7In[<8Noڌ|Lssmr"TUېh?iz5 Z8;,<%Z+jv2Labզ.:- Zu?旇r~(.]^.д!r9aXG$,+ LWW?Sy^K?U[krwe_U/{G]W՗ܻ ?ÿ7~z=fAk5F*hZ}*>/:W+3g|M'^##ǻc$&n⍶F Jߡu0ogŔ|mG;Y|}=]1U׳@{bfUa'W-ܵfeDz hGַPU!#sv FVb0]>Gh-!1$9IZ5ΐZ鱲( Sn[Ѝ75mJⰈB*;d,\aq\tcNW;Zq4]Hdz;hAv^aL4u z1qRJ)ji酹Y(^t̴c4' }o+qw7֪PA [Bw'B#w ; U~= wGQvTF6%8c6Lh:0QZ 8 @Ո䄈L5 3ᰏ[eUSJO)cbqi@7yKZk9%Rc!}9R<,biL}JbuUۼ,Z,QjmVM)w;+Zs s >{ RVj+Ι7Y6# 3CQ X4[PzVPVjgtz+i{>~~ǟo|ɍۭ>=zgO~O~իX> Dc^1q|Zp⾒Ib# h=»fu+BciIi= z_aVgQX,F5+bw=pc>G@ZkZ{GKbZzXSeg=1 ̨0aZǘ=PtH&d!xq{hYŸ S pAC&q3Ngw;kh$jzwqOd氫Wͮ/cX|ڍM4Ŝ5sV3@CN)nA ]ݢ7ִo8jܵ $748O)EH!+ȅ$w!7{<kt@lͯ}u\fַW~0fq) HL9I]Dh) n} ~L)gb ٹ8cjM{nuYn[1ϗrN 3Sa~OrΥngۓVK)©VJlsJi7/V`[k5vD\eg3xNxCDĻLf/, ñiRMDw;.'?//w/yK~53@Оh.u@ &m@^I^c!D) 5rՀ(8(_i} 9#YQzl>2,  ZpV|+Lu\Z8]qt5WN}?s {L7.F!T~h`.椞NNOUv*ޱڎH &$,5ĐkW{X B+fjas$'͸y{$i^=wAXd?L$<ܠ A=ʿ*㕯 ּw-N AruwYA[+^01cG0֚)Rr_)1sXR@&)oLR@,w pTmڬ40pfAhƽ Tby7ow?޶ۓ_;7^Y[5f S -29im DT47捄^ΗyEsm!RJ3f6fnFtisyq9 r80Npo?_yq̵t[2;盛&J̇V[ '(:͏cU,Dj2 [YzAaZkyF J[S%D)ZkJgSK5}p75:ªxne+Yḓ5v a\ecx;?Oi{DW9PdI)ZejkݽR0czv'SuZ95q,*\s&?dqT/kxK]sQ]o)~MLB!=%ޚ4\*_;c՛K{LT bqYHAO'ehakRP<"ObP,ljaB(tΔcOcOnynM,H{k R٭cFHZبRP31["1E!3rӘNd\`NL[ҙͲ)Eݼit[;ORn,ZN绻C[,.RMM}7UeuҜ·&|.^ߟӺlLv9?j Ãxmg_ʲ`[jֽBKUY2; ;v`nVX7_Z>pZimT IDAT 3;3nɃ >H@9#5uٛ/ݺ*RBӺ@fl͛z7SK4<|o3?E)/~/W}o~ͧO?XDN?c?_<w?m Dׇ tv#!L]Ȉ1%ËL #f0.L0x?md EG.wyI HH%k B1R/^!>'9 /:  AL0_p'd.G/== ws5mdPd C:IJK"b 9TRpy: IMI{A$ tb@`98`┍vZbf1Fm Rc IudBjf֦izX==9ȤGFL *Tk)ZzPŝpjj5rm4)djĉ̎E2Hr鶱Oq.ڄ4f !U͈5p"23&Líι[bh}T aw^SYߚ1OxYǷۦǮh۰u5K瓺;O`sK]_t>LI3<~~XVrk[kֻtS+UѴ>ڙ{YdQ[s^sCh3OS x0fr"",j:5ܤ)SF~h@p^K]>85˖#"oJ Rp5 & JHqwaQZ6.NjѻS B 0öZov\z֚^J{T Eb 3SH,4Z7U]UtX|>z-vsǭ52lE7 x0Z Fe{WUjkN+-uS4f4O` Yj=ըx^E~)H{,?~zSO_<r3fv^qY޺xA d]yө|j GhS>?55;=K܌M<;edF~-da}$LNp80;1ؔU\aC{a.԰Ih-^$_Gbx'N?_k Q>9 0NQЇ/ퟓ8g3Bgel`{ꍌQźPgw a6Apj]e .٣wMsm̖bfa)XS7[2w}\JDc}(xGfU߾Vw̉]@] C?NOU5uQuj4xj3sؐ0%S av;9|Hպvr3I۶1*EB \Ơq&@C$ D \3NіQK,ڳEmL 1X(g1! TD0"Rm]wH@W5shT{wHLDC"4u5{)e]mۊmZnooDgyeg݈P_IFo.nͼ\f$(C~1!.4h;җS[# ]3aYme裊P 1v"L!].ac)fͅ6XSaqZ7Ms|:pnUnŵʨUpZEb:F9N/Rm˙ UOȳə\zAC3"@!ٍ3S%uU4|yS _x¸ƸP_LԺ^an|@HWfqȃ@,l Vv0 춉.%-EY7֤ BdN' *9:E\ēM %Z29-ESvkۦl:~HEƫDωH֔.ݤ-C{9=*7SEO8/z;f A)RԶ<χcs"RsVSE)Z)($>?v#OY$/s:ihkY9L""1 w#L骦VJ ^]I0FxTV4MKfE}Eœjj1L3 2a#vRX FN^L 2@2kĺ7'f6nak3*ET?#T Q{e٦h׶rz8-K擩0W ч;i )TuAT %SmYZR]wA_4Le,˲,w)ںn˺hHxm<;ȝ6uJgfB6@j* {X s~5^FWc&yHW> ±Rij=#%6j"yOu;d HQC8)dECM_~wz+}.:W;³qxx/k842gvAAx(+:**(Al{53Eo])bLV!=%ffTs\J1WUb58jrw(E>yZ+q;!#TT?E`yG@^4`.zc͛BLTվP t^ζ7t#n-MԪn58j6ҙ@ffHVn}3sN}rZv︙6.G(TJfw Ó8(^`?Z4*h3Z=`ҀW)\wf| my9e9E<{ Uub鶵mbZD0˲M=N·o.}[ջ'P6wyE46LJgs WWXZPek.S%ڱ9YBq/ae( FA"oQC`rGlu-8&u]zjª,D fw-YK;.Y2+Az1MU+*%oO(##WNЍ`KywbFfrRxR1MSM9E[ǥlн2D7݌ ,ѷvSiэF#RH @j5EF <`WOEx;y`B",=U@"Kkhk4J]T)EͺZ7"+!oTT=!0 "1e)a\ l2G{GN`uًMyYv^reHX*Ix;3CfPQJˌ)TDyaӧZIR8ƚtC~^Lyf%%XjqD 08L[w GjNfNE٘=@<N58~0st6E{\~دpl' sћZ7gytWIJs)2Mxܔݔ@t:E_kVj)v½LS+-w4b=@l֗9 dii|nQqԶu[$zɾ=U|X`> YeGeuVՍTAL9" T(n5c@ #y\mx昡 gY(-"T/G^)qmw0q7`n:aF1ĽT-tu-tqG7h0 Ft| 6s@=(. <0`SPs pZ摸.+N4 hj0:)41vWk)#SW i^E.LLff$Z ,bZDWNS7C;'J]ENa(ڄ:Opr3 ̬A.1e9HRܭqD!65NNRDUCQT@p&MJްJRo2O"Wkz|\2s_zj ֕HX r+Vk"fډPc½[?OS9joNn6 ڵQ_L=ztS\LJtpx$;>]h :qs6Y\ݧZV'O4JhaAugPja"sb_d7@Hol~n7sa Yud({& qebwdi%`/nL a2R5w/ZBoc|ܕϺ GgNkt1H41?V7ő`{:T-  om?rmxNAV>NS-`)rasÛپV4-phDedUWo䜾aRl+rg d,9eAJpFf2`lHgTcT.Y7'yn[#Po}pG0&Jk[CNZ~3$jL3g27'PcVu&-2w5DݥZ 10K$w)fƌ"R҂ ebj ],#' f7R'av7Z/|YA&ę cǫOfARDCR* !g!UYJ9=fJDu]C|{g7b&'ftEZjmѮ|P~֖ňxdKY wN]3'rw3miy[1r5*Av"1UrJ9SRy! TQ' ~ZIZ ?:TR*b,e^r<уga|/؀zefJVND awL7e88_.0Ptb=Rxt r1Ss;)yoi ߤ.[bw?rd!f4*HObl) ڮuq9reobǎ 2YU55Fvqa9bf$<+9!eewkw;&&PJىJ_@H23eAP 9kw{:čs0a0"ȗ:8apcM#uFvG\`0\'I4iN`r=JL!RC5\.ZpgWT_,.ǕCC+3SA/6>HR,"^(ɜ"ϸ:ɫԇsb Epp:<34]U:X69ɻEmO YG8%r8[GxUB3kLe; |T;1TJ1 jDd &wa!7'żsQ9 agϚqDzl޵6S) JEZq8,TL|:WF`jڍB,T+kwbLRRfn<.\{#XftO:붢7P$4L3dgZ puux3Չ|KcO#13gЮz9bk\T;]EđZy.R;"8y8KАP:S6lmO{Lη~Q]W`$ V\T.%g"#17'wAq6r}.EE h07xyVWO8Ս^y8ر/^}+xy$u)OY06eA"Ecw(zS{S\xWrQ5.1h5}~/sht]=?j=Rqv8g{DF3l`rq2T:i83nê+Q&f>bP-wN;*3AG"b6]tG]՚h -rF2q-2MS T.n mɘHk&y2p{@Lc@J-Fm Qoc]WMJ_;8BLp,Npu:N"$& Jq+($!PtSAmܼHA=*"M{)ȘN=`QK֖2ʷ> ko-[$Rc?nq43 q=Y 3I' !HghOX3#B #qˆB9 3S{GH"19L}i94/2a)Syٽe]ا Q-'8GZk #u'=xSe386XED昚H7)TC9c(~ g ZoBRJɩ"[ou wʒ |x2MؑU{ n97!Qӗsus&&NU"x=!LZ_Ey%= h]TkD i*SbK33s=4M+J)"1]FC*K֛n[ۚ! &TW_}؎7H˄"xm+S{\uqá:\LMfNLB-M#o4#f &a#PUtHv`*^>> sTE LRkBkM`&&MY#UaۦD  VoU vx~c=8j5 RF/Òx|X@!,+=a.\(8B`cؼ3?0v3pA@b/Du{dx ! 2 h۸NVB^za/a73" óov wQs 藄QID9\U/wn$EQk5[O5VRG>0ezQhu%q1Wzkwz@+J6 < %nI'"DOILDn&R{T3E ~{% K)jf^K!)fAFw8Ѕ!d(32 Q0ʘH %Ʃ/7ԨFqsJnjeT-wY03zI@Ymt_cv^p;S!\^t\͉ۛӲI^jwjVzmú)Jxw*e[ikO6ag{ñ=:l[adępU{CـڀP3~XTqq 8iK a-S |=L._S8Ε]X1w>x(HNaTC2+ŬHdKKCٿ&e殎n^XSsw7j>p0-0ݲQOy&nYLӌKIͮi7]HZL'2C;+B e_(D0!~> [wC!^VDx\>ET#V@ d0iX=)6çjd2g(fXl491kw?|:SrC1>#~e!EܯFs7/erx]W2Ȝ)˖kzp'ݱ9m맇L$[keIZDܚo[WAC뺵{6ϓ6[5 ][vS_fTZj絹x)Vr:o?)S6ɶxhm&1Gnnv` nf7u]kz賂Y#[ccm aĤED)U={ZDy!fܧٽ,[u׸MOT&d|_T}°K lؚ{ WK8#1j~>Lq여FeS n^ݒGat́}ID]ߖW{ѕ&\p#xl4a>ƒ:ѺǏ_-/]e@u5xPZ &aO4Vk$, M`rZ-{37ɖ>N:2ǏY#~`.|IO zzyfjZ/ՌemE FC=#dd|19 u7iߚ`Yvh[ζO)Z:vmu)$L K\ӨEΒO ["؄lKhrI|_D~73Wd=\[ԃ0(v>F&p~D 0wǀ}OżKZJL)2<|~tG^܈|RBգ1HHAC\>W>x]c'9";RJ%DD6ht8{NJ~cjٵJU+eבxAD*QA{;HG玓# A*n   j6{GDR0w5Q*3.Jn@$E477i)l+9[ P²/sF䪺,˶mDl {-j2MNSW"\j8 y):^sHpK נ͍Qt21GZ3{wEutmjKfDX ֶmǃE")hM}m[r+,L/3P/UkƯcgO?>ߞOl9Irz<'FN_3u<=) _E ׳)7^*"5LwF8Ҕ{3XսUޣ 0sM nQUx #|Is.pp uab?Bh@F]mhe̼Fw:R+Gk UxD`9ajb1)$+bfj_977EVwb)hLu78V<ȉjAw6%i,bw57mQ. RnM!)~m %ލ'tٙݨ"nHƍC/ұL$+('FV:%>Q8b7j 1TcЎP-mPݖ3X*[?sf^N>9ުnBNmˢuQ=;[b;8i[7x9i.OOGĹ͡&<}ZΧ֬z8Ѻ@IJn[3[JfnUYc9SUws.AD7b6 ]{m5QEu[ pLuPA4J #.pڍ&Pa=E"+B)ܷӺ\L_y|{_+?O3lL.?O?j-_o~_]__U~_Ǿ?ǿ|oSS]~|xx7/G7/o>{C?myו5N7WnVMl`G~/_cHQ"2dW-ǁJʹnuMHPLnH3V>+N0bA22K,\o=& ֗E>]Jy|ʧ~?Cww??ٟMɦ޼/}{~O}? oC/O?kۺW>>r)e}ƇSk{}g~oo{W;˩N|shPJyt9֍ɽ** ogbKG< p '/ک㧮fC]30Qz%(_<;f+r6RUoՌ3n!F[TJ 1(x)"%J"ޱQ EAys H%pk ~"$"6Ժs.łpPR.rMsyô~9 7琨]0) I0O!rJE;ٝds斳tN5=SIJJGUzmYՔC.a}V>AJe~㍏HJf-C4pld"q("efnN7MmHj)@ րSJzx'<Cm6iEsN'bf9B} p{hYӽGwZGmۦOzcbSR0pik}a: ̀BK;4 w 'kHm65spp2ѬǼ&3ÌA5pI7L!LU|mMʹ hiL ۸FWP0S!fwj:OԸ8hzɿ_|߿Oty97|Oԏ|׻~W?''~~Sdz?W?w};<_tu9/g>?3>3[owOOO|'k9;?o?S>wo^ C՟?/~oy7}nvcwG^^v .Ŭ=+ 1fR7y! E'rpIƜaythTiϑٕkety煷fXiM]y|3_ytSca]Xnn*߯ ZHGwnt2Ϸ7wp{ش>ߴL,yn w߾򸃨 6"n7k/goޟ:jkoؚt6i?9NTpnp3߼|wve-q*d{b._ckuc򛙱Se9^w8w{Xr.,S 'SsB\ 9`mm o|O]Db){mM<QHtz?s~c?>/Us>wͣǷ'}sѣ~oǼ;>>WuG߿}~~?|wW~~?w|f|"?AJEk}Qzw8KTڑ7 }sjDDQDgaG4G.]%ǾY/mHQ%'jaV!"am#W ϸ4]O]MjWmo]tkڶ޶f}`\]""1НH0}m-3yώ=8ҐE*G#f SrEb(5b4כݖ]aks7tVnuKB0`@@H`aSS8fHĀm1vlʔ 0(6A1@ e#&YR4~{9{VX{{F7|sZWC|ֵMDjS[H24<9͗䜽¿}n9w1 pttt|t}8ڬu; juhxgJ*jvލ 2GH1EFl&%0pB1DEU|Cs '| Ui XVyhZ;"B*W}W|Ƨ}K_SgT[VՋ6ac<:kvBc>ƵM@[ub"qµkM͆~nqL)k< Ԉ //{xEɖ$ݜ4i*4i1Әq@88%Jϳ!UѠ<=˥t](.UK2aӯNGW&)r|!s{8^O๏>y+ynLy=T=ͨ宻@PPqT5s4nk d*fڠC0KEDjA833b+.ZJI9f"RTհ,V3^NtM5CUCY$Bĺj(:.x>%O ?yܖon~?C0{}?_s{u7,ϣJiMXnRZf^mW뛹Ƞ?\nq2]tu:ifyUp?C7qvuYB̫ ""1r`UC%shʁ{N#4i!-s4咊L-䆸Mp,V:7o"Qc!F7f")r*)9 ujbfE4DJ,58!0h,% sJs)O }`\DDvLӔ%yBe`jg/ vRra'ޣ5R9(5ի*b;ZJ2 ɒAUJ52{v}C ` ]? w=V}vO׽J'pzm˔d߼ 9DW aD!oðyӓy&ތ..ǜ-gAk㘷49g٦Ya{|XmR`8NA:K=)')RJYk5{ysf-DELI2SZ/AQH@\v㼛S,fV O1"s*Ӕșw˟ !Bɣ"km6GO~{!CED6{3`el?D^dy/W7؏)T9!x‡Z.ݏ=_7<  Coc/MzZ\x|xi*'7r9:r.zvvϖwDΪc'xBbA7|T672a9RSJiг૝8yi<C$v줰9KBh."[Iu%ҰPJ?:5ƛ~K3?J||_ kl<.Tau/|՟W/zoyӯ}=y@|zK*1xRByɗ}ܽ?'zW |?'_EJt(s]yi`c"٧8[> k WL›5=NTUQ4X֣YhXkКZGvU NIejoFxnP^.w27j n=Bޥ+o߼JyW濟G)*[RxU0\g$7aXa-)c .8v؅Cb͟PRnm;8iΥ @E<kN,3{uC!s? ̔4C)'Ǝa8'!`pVD!zp^<uM~h8%<}ߏԛipzr}:֛hj%!Bwyr(G9v'EqќݸqsDl>Q..1vnْ oivr;fJKrLDwp5JR%S@sRr0Su]bbu]C? }r隽ڹ Ő&M ݷ]~'-o®+?W؇NoWG?jq?ɏqN?ϛ~C(|W}3<|K?O}yBHz슼ks_4o_U/{Uz/x?77>Z[DʡP[ a/vj/J4ބ?!Ƶ%4S B[$\D3Ʊ"vXuxED6 [*Q33Vd40ڵkyRdM?pƩ)"f sJDqsa/@m `F]^˜dr߯6G'O?}g5"@X )zdh R)zcs,Rx+t􌄒(+ETbJlH3S1o}Y M$"cU)X9ijgC^9z!@L?s>24M?s1QJ }WϿ~nۮכ}_5st:+Bx/;wN];wo[c`b& ~ Ιjy7c̼}f3=q˯ڭ1c9K0%a =M=KY$lȢ0\O!aH`L,*{-h!,і*]}!`>ծi^vEQʇg/ͯoCٽ YǠEȀҙǻp%yK4^֥#WҴ t*qg 70Y" KEs@;|7N`MO@!sHL1`R!Ō: bY$hH"^V-"m8oJ)g3:3HEwE]0$$OGBb%%FEFpZk]W (h*G?uXEjfh[%!Q1"֭TrJ"aV!,RJ-bI% Ŭ y¢䚦,(D^M;c%bX HLƼGFA3:SgyCR{fdZ./ HF,^;LO6 *Z&r2 MȜS,n&wqDpdLMD$Kj QLjFCwp5 nccVכ_}[~kxc7֛ ]oW|Qp׼W/G>ۿ =v_:"0 w 21g\r7)#R磪s컧;QJ`E<''}w_,}!`TWd%2* F\~՚~9pwZUE͎48 T?}]Ihu\}a40Xf|E$$B1RC8]m>h%U 7 h !H%k0+!`8NBgZuٲ@sVQ`"DArNk(! 13FR# 'nܥQ ;>Zwi<c͊n"q 7MMwvɆD9t+9Ԍ*jȑ1u'`P{//O?zDTQj<<\DsUZbY)4OE e(\(<<f9!œ`Qe'"F YE$\<b9n3 =uNbXdrʻ< lׯ_P!tv~sgCRrf{T<{\M.w;R$Z(u4ބ2 =&hOrmj<p*B\jUz[z)ZZC? HqYyُ|@qJ` ׂZJ !7@KGLeRwYf$Pf"U4cģM'&)ςdKn J+F5TP"zcgsr_1ľ/FDy"@`mU$Q4Y7sf̜r2stߕՔlIWhR|@EC`38l)P88/i:)b%x>,p HN46 EuLQJNɈr;1wTJ>;.9?OӬ@<ΎO11ٔR`<"! t0piLi[.#O_\?yr>{~}i4Ӹ# 84'M 9,$TJ)ʂ}#B348xe_]Aas.bSUT4da;H癈'*g_ mQ 8☪^ +.{=Dc5?l7d@/Kf&kk]qPiSP3/zģzׯ,D ,fuTZ4ǻ\H񽯞"0siY-p}5'$& Mfi9bH;fUX}϶b84x\yUP@/h +UOD2da%3ErPX;PU,gO8TV[kj-^Ljzۦ -?[݆[FϫuO@.)#↿!e#U7L9a,#˄^} a@6 JѢH * s#(dC Z D"HeS) :D/bD[:~ʄST{c= jU! 4J0Cf!̣>wc!"129'5ku+lP]4˔HV}.BR!%KId Q2ӜZÜJ)6l~}ww."4e6<"L1Hqwn];YR:Wȴ;o?uo i.t9Dvc4 TClqUykw"#jO*Vɪg`!l`^iH Y , TLEʒe!Fj"5ڃ5H%Ⱦ Y y{v.P%ϫiY@DBb'셂_wH3@ig07!M%/x>dwXZفQT* 79B,(}`N@JziChҵ5 fܿ[3{°(:\̒ſ,F۲$ 3[&`?Ã&pW][h v(ŁmځZPqH[Nam07ZzϏc]mT)V %։ϚT$D!jFBPb׉\P!rTtY35DebRT ȎCmjfTM[%o]yIPSGpI0P d ÈS 94xjpMEke8?a5r˜SlG,R\! Rc"S7lqO/%"Q)Ӕ1r1IES*!w>s6RH`>FR|^{Giwv~{!LywoV8]LG|Ct%" l7Mr&`B`{/a?R{ ޿vp}@ "sQQ+1< oQA)ŃKf{T5{J6Za03ZJ!kl2U&I0#K}%\;}ː_ܫOt0BR!&2e jK IDATUeZ5[Xk.Hj:0LsbP4z^ v(+x?zv,ƃNJ jBا(%ucA{5/a)թ۰Yq mas 1q#읕:c3AU T3jB`MKV'kQ)QjOllekb' x?@R_#Ġ )HZD R`UPSc] lS"-n]/Pd"\'T٥@=gd.:fF"9v{-9sCx&7@ ~NL<5UD|,-D])@ qK*nM6\9PNԩ4od@LE!Q)f)g$EEA ,4,Fa;%%D.Y,Bjv} 3R(0y"s(;FJN'?TIVİb"bj6vnc'>S>w/Oy?xOyF̞DزԔASjcilJ^%Px f~Z)Z+$~@CE$X8+ 9 ; HeC08rVڽm[tBSgp?w,Fְ콁.L\ U*ª,R@fvI8h2  .9|h&ڶA.-זKU{͈v( VDwړ|D/jm{>oQW_-zܢrߞ5E|pqh"HSkhK>l*Ol^Md `o4p8k \D/*-\9KX>uZrjᲄ*.ubxYTIJZ1&4އlKwƑi]L&֜Tn[q}rg:SΜ7E/r} irZ Q2jEPln<>Qq.ʱv3RB!n/^|$Y0t֭B$EPbR"tw]ud(H=<'jaed Bʆ:X)]3HRQҌ (Zo>_w+v>/ZrW~闽^DZ{⥟n{겨-[ WDR1"I۵m5-Myȶ 1l6'bʭU`voutMXljiB5v+s S薱!sWC" `ҘDt1nh=T6Dz~U&XMC=rRѨx5Ww pż׊Dتۖ[=#TM] ]m DMD@ D"V$(X6Ъ&z6Zl$\L%hEk\+Pzh+nf^R[gLhtoc*ưC%B&jh 3Q4QAzƫ枳3} "ڇW]wO\"w* y 8˪-lL8H)4\dI'&P@J;лCv <3n%L(&y供ْt]!䀁 ]OƭOKU3Rb\.yfɑ$(F%]^~c㵓M0l'52ltP 0s`3}}IXŔiuj@uL[w}\ cЯVl PV%Cms[JaJʉ6)%˚`MTi̠Ր=JwG.~`+KZwI^daLvay$lSb OˀU6!R?Ke7y>a46zk*cu T{i%5wхM[0F}G#wL*Ӵh]vI2ؖg։2qRDEB6ZɤjY٩,T@MZD =m"Z P[ +kl<̼@p"f,m̚w۶ֆ- vIn8)!Id?ID]w7~7?C?3?tRD@x떖N9 `ӗ2Q `%3o[con0dpN:o|{y9/5PtK%'+`Wvﻈrvkes;)DCFli.n!.eӄ\nhEfwZ2B9:cP-Cy6Uɢ)gkUcӔ(>٦Rm<2Rbc9LF+fPJ-s1͛= `@(E-9 !80sʛ5 - *@M{j@4}ݻwK_*".̈xyu4]Z?OԠ \` U/j+ >`-r([nbY mgC؋yrx]a,P9W͇a@V5aaYr8-]6OP?K[ZyL["ܫp?62G[ ߰Xf-ΰ=kp_ѓ%+ofvldp- X Ā@)&ĈY**[~#I+` Ynst;QLTѹMZXB,kizB1T4gȪT ՋfqB ̂;(h(SAnC 5?JDƭ{ԥ*!Y17aNf}#h_C/VEX?" ,fH ,68ͫ8='LP0žz1pRe1H(ƅmv/?'+d$FUBWOX޺u#ۥ@L:([?6dÚj󢈈l!tB[7.C;2ܯ{{ 1eU1G`Vjd,\0HRL Si2 *z ]oMq͊,@(fŬ6] KDH)EULTlN|{W/7W1(!Y)_G^?}}qT=I-#3AFG̬:\^Wşg^iz(\,g3hX *rܩJX=x- seUBCz?o²[EjnU`ZH/[KJ[\ lt&xN`b.2oz"Ț}(ۂ4o0e%6lgOlųYS BDш`  ~ń} };"w֏7O,,Ջ2Djcu.]a&ݑ^;)j`ߡ /䎣hJȠ Y! ! *S%0 }bd&:DTTt2SY&[pâ{dԒ^PRs)2Ei8|n7'}wzBb%ոQD"-8*0SEҌ *j |:A$qڅ4Ʃ+m=CcR( uJA@D,gg۷UlkL4cg9v{B^vބ_--;9j_>\n D92 w""xA!PRăqSHq$vN1nsg_VU9Øϱefc|u&raΜ%3#MEkqXD|>η'^x?W,)G$yd),VqwQBuH2:=*U;P&UURNiVʒG%N@*9;aX5lT1 kw߯]OiV8|?|:Wo~=t?d%P5NQk BѐV<+ɼ̭x]ɾ/,Ncz!(l/? Y;I>o[Yh=^\cpE_ՉaץT2l#Gy+1hhgy+Dx%<|[W|kw!Ϛҥ D7 tHD4.wѢ5} [h`1gU"p%a10K\Rgn@e0-x&c4duLM{IE\& UJ8 "ދprfZ׭{w`IB1܄aF`bURRε&'(8Yumrz D`y1q/8T* ܈ᥔЍܕC3ojRRauu="c;}7wbR}?u$,x|7!˼CMuR3 Ӵ <œ csO~ɣᒏc%e]RnaZQJSvR+!3 ifa&0!Lnw?A}ُ}?/o/ɋg42,O gkZ*ͺ&EuD)Q) N[$5ޅCM6Ȁ꠨gR_0=7_>?W?{~~~Gw?ǿw_?>uP`h[7qu'&aQlcbRʰT}k-J %5e*˳i?z\ǟ7~'C=>$Ӂ4ɛAn|8\DuOƄdT͊VJ1S*ժ2Mi9&TX']3")4ŝT╉,ŀ""N(߿͟/?Wʰ;_~ͧMY)CpNKwPs`Cnw @ֲӽAFsBȉUY8H ǹ ;d#ɁY^L鸰h".`)񺀈Ux~}i^y.uw]*ovV!:ǷoOYi-qflI JK^Z@$䴮; jQF?^CNlJLrG}i`w)x(~0|>{9eMLW/ch: OhExUsLVU#+\#vlnueOіA/ĉ.Ky6ֱq{ԊAw.""2MW:C n HBLI0aÍRzs;£a2sU݋o^8c~サq$MjOyt⺬UDwn>t^yzV:VW;͋Ya,ZO:sr%s߶Cpzy1s "TM) cRZ#6#W n2UoM Z,~a ~ߴ¢*2Hݦl }H|BL~|_K/O :YEa%9;IW;i͕ݤ2:޾l͜<ۭw?w֧_=ݘ"حE={t=P'ʷo=89y>^kqw7eS!$ pՁׯsK7O/ΉTnHH+Nw}Nò,LJ'O& v4딇4׹$Ra(ny!{$R]yϚNU֜W;|d%|*V%1'IJ 9*.m]#0?asa`7+ope͈\zN_0쐷0HkO\!EhfN*f"겸9\0@;$PVWMG: ?|~LD uzUܬOT D+]]mQ`"wOqYafk*vэ^xtח aox^jNetG/Aqw1C dAq^޹V GRJđ Bma%*WUVG!Q"jޣ50@jJmiVV@ lLqJ]UlIk Z87~0 NN&ސӛvg)h}=<;?YwCIuo?yu`'g;KaϧzkËRS5iJ|^rV3~f^Y:I(WfB5-~|I:d\,< p> }k&X5qf`!$:c]&Tu<:m:=ŲZZP 1rJYv:LDvhQPcsU :VR͍ r?8kj~~fwGA89֭p5B? dcac=3\#V7GLG7y="U׽1]pAD9޹n~][oeRqsψn!L=~5c`3X@ :.(+lu\(4iS :1)VoP oaL+Bo #ͫan> oP/FR_57P1ZbkA^*jj(sԂR׺V/իCj->7n'b"fɚDT-e陶mN,N"slC>9ZB6bH#vwcj؈4EtJ"ACO ."r)3Iʸ~|FLL-یm[C#q$*"9n577%{wYC̒T$C%UI p*daVpNwF@L9vpK.~~w= _yw< ?}ۏ;jie)OLiY r\D\ MP wUM)qt7Z&$%Dj̟ePWX?zӲsG>y9wpR.U RyqGOiƤIAXbO,@#^Tr%c  . zQ8'"fzm&+l03I19a4Cs7$IYT@Ο781_M]eآ~ɟ__ӟ7XwFo2p] j0EA¯QBH6SF.lR%_Ë8m1( s?[ǖFT-_q?V>#|֥뿙É9J DF 3h4 .+@!nr@~UsxI(S cP7R/Y*!UJbh4Ç,J̉f$M`VarX!*#eX`ѣ_E1TISmix+ʃRoÍT*p2R) ٘\لJ|unRcp;]j;Id"g_z:dؿ؟n)M<}՛O$Ou6ZY77|>Zu2V=0 Ju=AOgv\k#>yXkuJ̖2YagT_}b>7/BUmƝI=eO~y^V[׿Իӹ sNB:D]\1N2{ DsJ* 4_tI*̜]mf+x6 b =SV X],7av>k*>!t~H^]6,3[mzIB.,GhjL%o=Mu6/n&rC}4D \'5/FNTNUs0b΍..v5\39="t 9$SO^EtҨ&~w2@!u$`"k5~9ZV^Ll-lք= g=[È[%Bm]HKl,JЄchiJ}R#[D*"TU *ZۅHH-r8e"'QcwU!&NRuxK.I|dLRmeVɅRR*QA*\H4f>& #}G!H~2؞Nq:|CPJZKeަ/URZVw! i?My1eYXrgK|U8F?OybP<jRe&9Rz7[@ʜ^G75RY+d9ٙo?4dwQEuYEsdu%-mu:ݩHIT6x &iu!ZVrA?%=\HbLeI\ܒ$0eZLJ48T1,I0FznCYG9^B"8Y D\Pw|pk( z g"@ 䭣-tB"u{Bfoñb.2yWms<{*F,]<#х%.rsq(QyK._'aր2|a]Acd8\<9ˁi;3X •͔Mkeb!wGur6G Ɣ+U0ƺ0iv,AԽ E WfNDTAntM V٭#1 Af GB ٌsS@$eL"c2 (xj:+?PhD< SSdy6_%kIUe1H\u-Z/RffSKjNJTEB )T~44^h'~kZ*@d8q-HooCVN¹ !~Cra<>1dלS.)U^D̋ÆR:auw>z[ݷY5&&Q%bVv9߹ëe48@јsg{E?}! $ 2!רG  ve9f*_5f3Pt \hk@t ROst&''58ye_І8T;ieY:sGۼ2"1 mc;9lf^qE[Q7e۹#I/qeLBt#3?܂ʒk kU,jۋ b`RI5iZ9F-Q)ش>&%E'UUm؈%B- q Em\Su#80wNT Պw~_=Lg]]ґfnBv~r;}4\uuźz DHc]OfV# Р)d1IV!x.WuǏ_ 2Rm-"pgo>pG-~iJ`5\qusT&34iK?&W:)zUC{kAiw)~ǷcKb Q3hB*DZ&0ՉX!΃n4 Po.ޣ"*=ꪭ6KJ>['.ܘ|]<:J;(uiڜ@Z3VOp"'X6̬Ec%ͽEccoݙ@};V/:(bt/zF0y˶unX醴I]9iK7ln:眴 E3=8H&Oc.Z;;|gfe13jpc@#_nx/2*JS%7r;Ma[Q8^] b2}Q[1QWɀqGbb=S>ԋ 9aHIE=nBHXC9ml6]rG Xjl^W5iV0,k 8{1&N''IҲ.:V1-ֺ%-N3gtʕ]eJ-&HIX2vjVYS<дLJӺZ:0.J*A?AaAr,ŐZ,;+;8˺TO=\=;DUnn)nI rUa?&㇟|WΌTZ+*H.(8D$V.]#WV{ pk@X$R"xwӱ@NƦ9;Sش⑎,(:;kn:T%^8 sK);,"*JœYO AH)`J{Z" RAf Ppw1nr*V47IgDJFILAʆ , RjZ܍%5"9$!JP B<1)jKD-eSP2Q0Mli/I`i 3mzt$ߞlݹttIm' 5jőW@8oV=*|1w+6 U0(%g7H$|)MbA qAl|86Ɗlt!5AY nj;[X 'bH0V5'w3p zԑy)| pMd^ <5`3]V`(Yi7sW9s+{+hm3 0XT!B Gb Aa'a%5 <e&BpQ,|_5{Z=拱ݬ1XE' @h"b("Dס!lv|㯨~4{@녢k_y!܋U༼{NNWx;v]Ϳ%z vv5eL# #? cVvs@g_j Eət鲖:ކ8% dg(h|2 ﶽi0\pIPM D[;3uI q\%UkK*"n.")Z-J{[ B<s3c2pRb|rtbTw-iϫ-5j#bU'MD.ՍOeTVW<6!n49'"*^//}Yp%Q^C /޼6#=.SjlJ*,iԜRCbyM-eODd+$R5kt's Xq Ɨ֬FGzXYț80jכT ҹ6C LsOET F^PC.IQ1`db"!RaAp؉\|Ci03oZ VԲ?P~{̣̉o CM~1C 0(("h j@ RLTY3"(;7I'ZL Qf}Fv//_1BL}[!.0=P݊/A@^qZm{%7;mK6gKmS82 V\o汙-],3]8`ao; ⠋rd1ц LA qO ds KJ,̰ 9cMTJ!"U)fs2+R/'%bZM8[?9rߔd[QJ,rLMޔI5υU DL!3&"ecF6h3YM#g]L4|ʃ0ѽ䗈 }۟3SZ̒vYTle)bUk1f 72#wZr<߭Zk%b%N*rխR2W.G8ⲇ``lVYb+bMo~P"V!UdPg%\%p%!0ABvB( 9M):4MK|9euʃL;zکR8 IU+CNSV< o\GhT'oE-UZvhDpvQwUqwciWa!ZϵSA5Y|E􊊳"%*aC)vqv /6n;cB ih U4e"-bz_f=7wͨe%Ե@.n6A^N7͗l@.#v+vEWY Zmq1 7X tZ.֋slmCڲR%mۚѯ_}|WVh !Fxs@R-#j;!!Җt9Ugowaoü:rG'Ü d"g%qA>YH\渰ӥx5DV[fJM"^-0{H V&S5QMT< XUSxJ&jF Qpq# Pl !0iLNKNUNZ-+*ʰoޜk2Z&vZ%Z++~zOYB" ZSݭk9y1)48Nni2*KA?2VO&# J9`1>4*"P3%)i{AI 8O!1ƌDfB)&, 5m6+%/y{C$G2{} ۯVFI0Ѝ2\\.7(}є&&-DZcf5؍f7gRCZ;Q<7ȵaM-s%f.X5C;xہWi;jkܼPM{+fiVH ,`0A3 Pb0) 4t.͞HI."7)efO1E1"dA_BPZ-խmiulMRRw7qlI Aj; v9٦xk1v] pv#pZauZ+鐧0LyLJP/K]j rss "7ZCEZjjCLS}JϧUXXجٜͭWX\!Pbi/a P꺮qYdLiyyPIxJ>eazw~_?3?vw B$BsU1&˾7w>w>^~ūuR1HM,]U;*>, KIbak=2:S Zŭ/D>Wϟ^MJR j=ϟqrk>ϟWZ5TY$BkY63{?~?o?%&UZJJDkYj-ZSKbzob/$y~# Ͳ.t~Sli-w|j rݏ>O?cl*q9:;f! 2l2{0ÅyuxN 쒚Vds9E,u:R6L}F [c|jn16s$vHD @3o.5i^Z@M#HV+l冺q@N DŢ)&2Sox'I:$ Rtؖ!!P:HSV8rʒ"{E+V&A_yQw( 6Fm4.,Ck &䥜 Ajx✳ǘ85X&Jh#R֧ܥe-:fWniVK)pTimWU&<9Zkg6M# H`.  () ǦO),AKDKDHC tO^k9c̵oO眽s*Գu˞HJSǶA UI`gkjh(1IX籎< W@Hޡ#j$QSr-0!QMmR"xTJ!pԈKMޱz}D6 M )  F@YPE"zpX%3;ۦ|ߚa )I8%xKצC?89 QQVt[e[=zԑ9,fJwss"M+ -j4j d >s`mg^ǎcW%`eo~IAй*/}v^3}o&I?{7R(/ܗ^}]GݻIOx`0\_xO>ޮ@1nSǏew߼+|akpU-=9{}јbv-4?AUWkӶ0~%?8|k_Y@֡'=>p{G]@NQ'+眻>g$xOÏz3.!_m7]xM+~H?ňBкyꓟ]w}>lmMD`%:B35,{0J$h;և~?n`iFU0!bHI#^dÜ% D (Zhl۠ (Ym z{GN$7S(v?v( W^U?uM5[%t$PfPAU% 2AƯɤ͂;ch%Q U n;o "rLUDO!"$1ݺ aJ)x'n+ljc}ΊIT3k>ޢJIQEsw dTU_{K˲溷=~#"XQ#mk%q|7b*WUbnʦ։-$ڽ{rd)XBM41r)4ӪWgL1ZNm6䜋)P{eYlmNsTVc$1zgYgTERmq˂E|ZbN9;.z>%hG6ضb.x1'׫PzB63b<4u3nCQ R۶\ gimQmNͷd{kJeo>m>8Ɓ E LgJOǎ|eڼ޻lyCl>$JD!x mS>kb8̀pfw^7=ztyy{^ԟ}ذ&m{߽=뻞Gij"zk^=Sls9wmW]p>.zO~y6ʁ?/\z]_Oz W;vt<^z埿zαo6_}X[[7}?|4yk_W(Օ>gm$Gg߱U︃ASĝ_ Hۘ-9 "(r6!"H`v%ݢӳ˹@"\@s5M"ӵF }(J5@gNok7-0-Uɜ@ ;;D o.~grϾfO6n\a vLTgG/D@a>=h -Ps )&#`!1m4H"fLyFI> fV^f|0+E:6 *up0ONݾdzlAS2-A8tvwYG*ٲZI)I<酏27b4XA0 C4ݙ=KǨUJTB F^?c[*m籍)!"$ lmc F_1sm$J Eذm4m+L*"lmoE۶,KL\Eq=ClV39PT%J*<4?T煙 D K{ע숨Wv\Ab8aΚzjˋOo93nY|u=MS_߻w%z'ӛi}}W1.˲׾S1] ]|Օ^׫浪O8{h47S/ݽ{ŗ}OUSW?[_G^kמGijQQ`midǏ8yĩǏcgfInb9 PAeн۷~9x}.VG={V}Y,ΆaPhWhv< Bի1p9bdp(>=EgˋW$}s}qC} ͞e:\w}c}x/,-PUUmMyzH"BHlAVWGgNo!-ʒ)V=117kM֝'o.{}mf[I1ۙ8s|ZeWvAXݷrE o0ef>.֙:t=1?|s1¶sB6i[z_rԉ}}{*@J"wW IǏx;6vUUyAfȏՁ!Tu=:*O 0/B;U UO{׿գǎ<?WV">y?wwoc"e$D)8d!S@QD 9S5VQgKD&є:D-؎H@ԝA%N +tJ2&CGf gf si@9m`ۑAZ0`<$ԈDJ0W8QD(L̇S!* $쩐YUD"yJ9_R4>!`߀$b=]t !r$H  v""#"!%)BM)`&gy ~} ^Lc}OIf@HhB )AQ괼񖏉Jg/exq *cb掭"ei՟ Ā&@ղ*UU|:߷oW9E){7%L"6hwvl6c$Tewe6\\US7TEAD!vΧ4s( H"*IqZC'>5/ <Tz?^96m~ԅ+wˮp}}*`{\=&U9w%(1sƛ>wӃ;}-_

 +ppČQw1X?F@u.8owo~UWa>8}ԩS'WV{>}"mk{*/XjADD?e0 sصgg󨟾x#*Z%r]| , #2*\WPLPlC~BsDbD(>8*uIȨd(4 R2u"1BB%RhEҢJ$k4F+T1 ,t=.s`&Q,:U@QXOSH6AcۙѡG[Bfb K∤LI`Rj`>+[PfJ"b:k B6Q^eQ\8SUdIJ)uء"u@2+[,s@I")aվ!SQ 735 Tr'$vUs`FJljB"*HRom:=6D6s_~=PQM޳s.|۶uWJ2H*Rnʃ>z^QTstVH)&DŽkv:k{U3ZPvz+Κv:o0U,V烥A|#δ0gQzݛGZMPijJ4ƦUNƕ'zmmՆzxo\;ٳ5S|z}SO~㛟?{W?8C!@v py{^-R//Q:,Jvr8 1#f̧ӝ x/ Ik!0Lᓇ8q]{ۋ|p9yk%:nFy??O޵m'n©S'r~y/~߽A!3 EY:bK}[~kػgF=W??~t'OE\c_>[G襯w?^um}xdzp@79W\u@EKE.%)~#tw}7 o ~&&YOyM1LFC^ rKGūDSZdogݮ$Mb¨D&qљt*Iwa.o!I5W 5lb!{vJ$"ݷaG#V ,^~}2[')C$&Sz/%JH'Q :$H)UU({ t1&I6MuTȴLP1B8 8{vZ#"=Hgw$&f"@5>x˩dL'{!ZuL+&l{S` U)vNVI(6m`Z[Df!PT2kk;;#Gc-) KAQML1ͧ5ԯJMJ[sn鼎 З́&y=s6Ub)+ƑKLyDahc @KQQbB$B!e Tj7~˟kwo6S{FKٽ>D'wd%R+K. } w^NwGi=n>ѨZ^-#$s]A< ǣsP}Wn^{ı'BN׾th H-_lso~;N:}]C_M|/x?9*Ұwp{u?[n⿼Y WzcǏHsy<}ʗg^yȑCw!Dokf<co/#77/}SKo{^u8瘝1 c8ln;ey{ߣ7n=^{}A-0MsڰG"J9V'ݶlIg1&Ua&h UE!SQ "A@2WIU`[l5[%叽Nw- ,8|. !3AMLЈY@%60[VYjrh~β,ۺ0:&)kF$рqUyP-FU)Igfk ٨e6jE,-7 ekt5bHReVȚ̏GƄFciXcH<ݻx_.~sJYFD QeYA,+lSj>kPFv I#_lւrHD;[V7h z4"'#DMEQ1֎5h:|tCKr>vR~`8ʰ<>RTK`‚QY7tٶh]"q]aogI3ޏJoϫġ epg󶦧bQe^"HkW]OIШ :yV]^']!?W3I.dlLvOD=WϿ?GK8tUWmܙΗ7~ӗ_lg}o/\`j__rCg^xE?os&M;?y{_}%{0y//uᣟxtvrMxS{-Uovkz>cyx7"?y5_f{Z]_ԩ:^> AG?qSBxxd=udc5⽋X+QdG#fMEw%TyrXI",L(Is(R.UOg}ƌFR< ȪjRrCvܦhˇ)۫XGga`ʭ "{V"sv+E&T{9u.cw`C-ۢ<@2-+ o9sDuE *1کs(;JL6(/Q1cDcrA@ͳ2A 1BB$bصZ[gwf Gm0h1Y*ZYV$FC@FQ30a~fncK!xB$LIYh0sS/2Yw/z{}[o+7j3]tة)ƈRcL%"UχwӧvV"\J ;r:uݖ3Ac6&r =7=#Q;66M DTUUԾDZE=kD4 ff}c#h CDe8S˓bƲ0*$Q%Ljl:ﶦ'q?mȅ;ƣ(S0r6s?ұ1"QU ?}yZ^ZVjsELIe~x4 r%%v?[?:woSٞ `?I)UR :S'ssUӶ ·>񎶅k6z+έeSL@JkSW_&~ey_ $~FO;<]@Pw0XikSM"EQM\4옝C3"(u Hۂ^ۑ*.RwN@ b]Y!PZ)2pUU<ɛ,gZq_!9@4W+ќ$ЂdbgYEHa婓;;ӪKUu8犒{O^Y@#B+vN|ؤ~9 8GR JDعmEMӊhPh6Gc O%Y|8( t^ E`0, %6PTܴ۪l'^W.Lm9,.h;Q WڶMwa2n왔Ua#ٔEPN[gaYV DrWߚա\^6} $T!  p& n'2Cm$@1c \3k0*e :s|3~bbl;{ 6A0Ir Am\^NtzU!D4F&Y6KBiղiLв}߯=!4<zS`Us2g<;3̀$%|>Q_&ι}0>:/Ey ! r1Zr>zA5) 0 B, . G3UX]SDqti</cMZ !۶uUVA9 W bKiNMz"Q4 <VdKPˊhL iL۝=鹬x➶Qh9{bڵ>(hPg|iϧXUkI@.fW1!:- Pi.q2%hlU@AT}`sp1j*#JcfyvΈ1I2 dBjt`Ӛ4tJ 1IUH"ٌّIBTda4v@D͘VƔ4 ɶuE)Hb5)ؘĨf,If3eĶeH}Xo*fk.4#ResGdN"Dئ`ٸ*@mَKDhc"FIA 5DE0)G@%$@D]6YV#ͧ-{e)ĊN12aB O.P%I5Lډ!;Y]P qJVtBL!d9DVUDC (] U~AThu q]*y%'I$UL,I59c( 96.3+[f] 2 Il}!ILBr)hF"gM:*G3d )FYP,lX@L6 8ۡa.5 W `mӁ&3TƵ[BO7{ӻBQ# dl "CH 6m4G#_[MƓ0dCz2;tCY}ƮQ sѓղXڙs :EI)r \ߙսM+4=G#Ϫ"N]*:;QT ztriқx2 =Ma᰷yfsޥ= ,]P FCs_oM);7^핽bJiu}lPv[kU*lgDhmuytclm r"zg%w -Xވ e:H6XC]S^GbXc{ pYhQӾjR놙*JĀh=dJ]!)tS r24bdYs] $$7+)+--JÜaw47VZг= GqKwUv)3XEm,{YQs6Md̫Wdc|0$#)')Q$;G +19\NfBgdD lr`܇Ȏ 6<VTb bP}6B6(6(w y+,M;RDh]:]zsӑ]}g!g3iMf>hFLZtPbgN4H)=pqF7%# lhQ,T@ȶ12J4,(*hjN;^$ 0 I~?s<'PRYqQ`Be@ A۶"mJ,=XcLơ4w4ZӢ}箷E`g,U J <su!wf{W~GmPƒB 'Gz%˻C` Tq5.yVUP&UYfP8(pQjXJ2Ao!(IwyOeWGdh8þIĴnr5| &+T^d h23 јSVpΉc6+[$඘B`UI)і`Hwk3& , {"Qe(7QW*c 0UQ "U]dE)[1Yh9 ~p)?Qc"SKX *f4Z=]T1LjAE;d809$`T v@ؙ2#ECv@'6B @g q4]z| 3uD5:>0*^dI(I~4rI傥y#up,O;i_<ˑrA|hsH;]Q]z@Tj3ҧvs`Ѥec+,CC狓:@Ju%/V0"XdelX1Fm;GsL몏@DTh*x[ J6rfPh4菊PT8YmOw/ .T/B+ =_"@"l>v\rHpT_$7lgSDHy4EYbL:njmB/ %]Jw%?y޸е 1(>sA_ٞn#USJ۵gYUhEY1sHd[[(j]CDlƘؑ-5f 8LbQbj8[vIPH"-)&nhG=cf[,J^y# 3,l&ms3י9e)澭+2wڽPאtNP^#%鞜^I` KN%2@]yG-p[0(6v!")e:Z IDD)c0HL 11yD!ˢ5 1!;0Vv|'I|aj&dvӺg!!38]?dz9&2g!WPs1 4[lQȨ Rns x%uN/=,<'Mm|4cԝ=t|xy`rʙ &`aXnY*-Eg j3 ۝˃:9HP-vb2rT%x~o t{Bɐ (u;ML6Ŏ1noGKs쬬q"yvmk8j Hr|K;{h* V!dRj7lWU5kX ঙ)jsuԖڶ[] T1 #F"MšCs.XL]Wvg<6gpLjwC{^z,ƞqڌ]h]83+ɠdel@ˁ"E9#`%fMZ7۳UbaJq>?~~5dmKzRU{}tV:HD!QbD B#h/$DTDAPQbKD("M9]}֜1n6u{/k9.gLJ硟)~gSY9̦,̝Dؽ3,J @tUK/DQ)!m,wp &S/apz2k}tOLUh1C*3jDXQ,ngC2[I &"nKUzB&9= s~&)w0Bsղek,!nĂ̹| 9bbt[ȐyqhKCr5ƍ"-YYqU^Fam<Y(e;Xޠ,5WJ-5i<)6J r/r%K}'0@~MkS_fJR($a|g2 /2otlbbGllgBS]u8,o?0Rsg-|9.+fܲICJ}1qJaG7-8Gb"N5N'SuP˧Da$^oȈh}ܑǺ <~nm pnM4`̮~!eѵ_]Zkcx -uip)>3'hB|Y/Q[5@D5>mnfH(OϪxzzZ^^^RLn/?ޞj*"?/hw8nH"}~~@˚@kH}.`1r8<>> YMaim-r6}կu/E1acͿ7]|xy+#ʹ dK+81M40_~>~ ]DQwMX~_a{lJe,١o1 \ D̃)˖|,X%ͬ#'_W__7+??7˗LSuxDN;SNCҟ0 PvwϢ^g@.[0:\/bRuU(}Rl䳝%?v6vc̛ O*Ax3%@lRS_ RP9͝8=ohM JU9k P@^ D$Nd* \~ H]P$PHDxfTAѮiH> -4sڵgVBԇ / Ldjr&I0s;K3fS^wԈ[kvm]pI+cD ptIq҈ɹ:y~i} k*%VYzq"{&тDMHUWxElag7 ?w,LY>J($݈~4i:4fmV߿'F B&Dfc1!@wlZN=3#jt> H8ׇ-lc.>|Yl @\._uk8^`-}q9 3n­GWvY؍`886ck^\vāAޗC ^Z~v *+lJ]pW衴ai߯Bܘ5ی1_#db]7}ק|؏g (J6~|JfL"Mjf (0dS_g)ͨ!2MAaK#D Fk12*8&yƛNAMSr&R^Pj9'l=<ڦٚc7!"SXޮFhO?~?ܶGO+IFy 0p`ޜ:69{Pض A,$h Sߍ=p?9w]:IE"y:Cy,D@c[ze}|z`5Rem}E!A,,W^_o)X-n}bz}ơe"j8Dc'~ُ_A$!fl _Gk_|0H'wKwpH){_^ey2'Wÿꏫe@q$ALKI#9P=7@PH;;`/&qL;L,laiR9I$E ;/NXVT'x6+@xk. M5*I9 H9H1'a9m[&lRK? teM,>K:NqQ|$1. 2Kk34r1-Pz{X/0F@)33K_xHDb+~'_K/_m_Mf`3{r.(88ABf7gAZg4$p:q}TT"ٮG<3p&0+80NIs'7Gk H}3c32Mg9Y\)PZ ne[š"$ZYQ?KiB7Os5L?/_c?ۺBH[QD靜qg,+-DHv ӵ38B^'9ȯm+}Y8ؒZߢ Pdώ[Ocli4Pd قު.NfDh,JH\f{ j<^ia)zufc[$4ҡW91-Nc rWJbR/'5y'4۹9ON~ٸ$g)HMZ#R* )ddܲD Qf35%Xm͟ewwァ%#'探25\ֈHF~h:!T͋ &L m$"g! @|/֘ TH?D2 2ޖ_0Gp! $MI,IaoNEizkiQP1ȼEd {pZے,]EVGN0p1"AWGzL펵1^v@ T㶏z=zBJ2G]LC: SO] 5w &W 6|Z&,ߖnLj6B\1;"DB.5=+ B&A/&tXMGeIbMZk{~׿v~/7~?;O yF*óDio)|:G!bq h!6408O-kXf30e8I l+@<>>7](!/zߦy/:P8#GD[n>Cc 8Y];fS|~9S#bǽwԄU?|x-՘ǃy11bcP*Ұ4EDr$#5̎@ adl')J$f`B14r-LE*% @0s' B*,zƴ=jtܘEz)#+P%#82[k2Y}( W"6-jgs`1G[0G:#ZϹ<:."NXRZ`)4r@̿К0[pDJ>t =C$g(GYJi17'9eĈ,)1">Q ¢5&pF8&\) C0&BtU\jޫ"BJIIGn1' Mrff10U^@# B >mTyaAEY*J9}H0#ED(:4f/Gipٚ>sI`gu@4v3Pj%@r w`1)=zq)۾wq>˅fDn!/mt¦#tGFlepU?}zy~.u{yCG 3cxܣC9߾O>H[S'@DޏwX?3B}֚yAdc!1ҹ,,Vasznm2ܣ$6LX9:u,ia ipRad &,Z\N%61H C<cr[jM3H$&`ϲԅ&D~@\^<*m 3AQ&̙ڳO9`$ $f@*rȴ{2 ]rڑDQݤID`"=$z&9DW U-&or.%yhɊ0 f,u:/Dƪ`fh'1ba<)CoZCH^IS"Lg9=CD=Dhj9N7 S@p `"S]TQ 1,9Z,r O(S14Rwk  oڻ=\wwSDӊOppcdaAMǏ7a~wi킂З&HFȭ˕Ǹ HU6!ږU+r_CۣF, :">HkC{|BA @&ǰk GP0c ٮ z*Fffa@ j+ʼoјY5$љe%s6gdD JxHs´@f$&[m@p*[#I8 |im! \BE  DrGwA! Dbp@flN!BIyW u8aupLKI3МY v9A^(rʳ1`n{"l=A=X aJ@S[GVUkl n@©N.H Yr ݁r%[u)X'"y1G4kEWN Lzz^"ɞT6\8K=\AHnNIfiT)$#PRLs}Gm<j+p@Ĺ/Ms$s&  m@n %KZ5\aXfokFF"hOfD3%a6yj;~s7fm aͼ7 @ 2]; 0Wݹ+C#8t~>l >Л7^s郏r#F`ÝeUNqlOOOqDEX+ضE_۶-a"tnMp17xy̰n巾iT{L|mzGp\}a_|v. پy.M̒Ng2YejD&Po5=DLghK8-k,ړ&4p b|%Y5beYʗ J_Y$@("s$ҙp3iJªy`DzIզ%M&&JGO0ZmF‰!@-T 2P3@i=̋盞:1ifow6g2OZL+x\p}b^l9ׁ"4b=sm 3 9793$DrqH̵g&@"mŲPs2kO܄7YSf_'D8`j:ln>jyGO9 JSvOij0Uߏǡ/>aBD}Y$Xow{}a@\#< ZkH1ۺlp>o"?~h ~"wq?l_u}iCO}ߙ- `{:yeͳ/c'9PQ)WWdapDmigTu2'L!i9^ GED@&D=Pc8EEչ#?y|[49P"1<-T9Yl7N4 jvdPJ$YK~/kg"䢵9,n xRk=$F܂uX@ 0"Pxгڤ, S#)E!BDX[&羖LcL(4m& I JEΊ.'>#]3wu99H%R#Vyg pjFJlIc$s+%  pgW҈, 2KN0#^sre,sFtkP^naE02{a_`I$iSaMra6"m6T] ?u301=t%jq[a|DkmkCHs8M{&뺤&TZHݩ10pW>:2wq}ZE0 uQzݶmt3u]rt]#8wxYGBqo]r^7fAX~{x&T _6P@6 sr-0Dt*G`Σ2ZO_ϒ rL|W.gMHȿɣ)"s nYb{*&4$4*o2%' "pfL91Y ^&X1dzExͽ,Y5wC@`"wgf ZI9t$uDa$ '~C&p:kJN Y 9b9DR# .DQ͐Jʐ9>" "0Kc.4w(5p,HädXdVQQm'#bYr98s Dz\ |UpMxKYzY*9U^RQL[!B[D>އϿ; x);9[դpv|zci퍬K\r2"B`aDEcf\nQ6e@8f "1Aj7R땯љ|] /B`?B8+wݖ%<Ƒ .t3qҦ޻kSz )1o."~3U\7@U_faǮn4>ҺX 'uauW2!&E``44š/sQ.%:3'&q=P+:H fI!rT4&3rE2^3FDvg|#f_6I*^}*>QHdJI rb2iڱ^E+Μ@& 9;=o[LaC r~}#%C)4mI|یwg8WsIa>uPU3*eO*-xcnݚ+`i21E쁪[%eY$7DJ>e?414{%e.̦70&|y7+DԉhJH y.(y(jh6le!Ob ($mU&V*v3T}4YR{`̬#tm̤> 34;)N$WB}M}1}k 0 'S{eݼA>>^eޚP%RWY{Wu#L>92C_͕WY/m]5~D1{zzl9ݻ秧|MA7~IK189@I+zƿ QS2+x+ƣΚy:*J5ivT  fᭉ{Y)u? fDSp4,N sB841̮Τg&KT/2Tz;ٱA.ar(c!1 EbŸo"}O /ʏADIy&ٞ,xs w0cTGÕqS<'BDosa}aސ72PM] p%6Gݕq~;=/LΖ? 35xk#_TW72<` CIJ&:߈I!,`4pbhb.ES"ܚ䫽p}|"|iD>}AIe-֚ gKBM5DUA{,ښG]D0qh?,km!H0v,|,0~>n񭯾E,π‹!> ?n{ ] }4i^fC?]6L= cH~{}] \V0}/nqe>(|Bx|RbPE@Wa6w(륬t<9B6Q(A majِ¤W E49q@viDv^uyn6QyӞ(PLin6sQ'Nv^frQy"j!kY) E"1Y ܹ >W!rqndin4~\Da߉!Q4),=*a:#cŲy &ǭ}+e׻\phDc(튡αujjf-aAkWP[Z7=]BYg=co:u|}W⸧IDmŚ~֎>p>eַ} s#&v^kqjF>úm"c0wяޏjf%UA&Tx*OρY3W?W_V#BH-FYj/ҹY[g_qd1m7Ӿa3#K 0aj綺z+Q5:1Oͷ^6+IH|6ՊM=/tJ{r4`XOK[j='矉:+PUe"\|U6'#L ~p*%@6úqF:n, >|xa4wc17 F"@LYoBDJ K@m]l6!|]u_J$y=Dz\__L ].o~__>޿sC3׈EDp8 ,cݶf ж}>}iG1COTgnrQ=]}o ұ{k$ Leimɲ^ǗomXý,8ew扊F u08q dDgZDrug"G, OeoI%㴚աfCTD8Es1 ^̝& R]$ ˉz_'i9 { c1} &]dg?\;ޗSd 6| KBo--5%CaDU=WZ_?XXu ʫDO`f@804U+.s&N‰c *{MK[ . bv{'b3%"F9K;ʊ% FstYV0l۲HfVG ϫ_, K#/|)?UY,j?"mPăi j C$u6 ͌X aX̘9V4`n1E^^o狶ӻ4fCq0ʶnˊ`fbI/ږK[uCK$ .FBׇvY" oק〗;@[jf?yz|:iߏD.HG>(`X nac[Ǹ^m> 1=G}Cݎ|eeCwora Au}W$4֧~^."a d K$#goc9 Ź-H`"sO޺-8Ƀ8]F sds"9{s0">c"ԐN gNZ+NR$dDy~,R4Nq"?JP  U"Ɉ|IPNL@ I:uyb6#xuPUŬ`1F泫Md 2ՌJ5$LL%D9-$WBmZ#eeωeoB a$#ղjPU"aNΜIZf] ?aJrOO)T+F`FZ,bj̱rn5qNUk!j%Z%lOea7ʇ29Q;/$5ZKA1ApHHfRg2I8AqUҕmD)p$IqiX5mFnv1'0& g5<xpazDf_= )`mp4KҼ!u<<mmCVaEV"PFA槇n]8:oqs&7۷zp={|^o/"- [އ*ԢH$ ~ @' v<zj>Lke]ɒ# Œ͙,V>Aphl鑛J>Y/faEԶZ8O80Sk@3 "}X: Jh!2W5>WS2xs RXA7m9s@"RђՂ뙪GNsѧBH yTѳؠJr Q eL(cGXUFr֏R(B)ĻEp{|7Gfk7(w  눳?[༁9@tscpS!̂cpĈ}W]J`"89=FDPhuv9ZL.)0%g; 1@*9㌘JR%eiɦ nuK#сP AbkWTy8^)]R ¿pb g΂RRbWorE&vd{D}aÜ\|w8}'A0SiֱAKl=NqM{aË<<1MhS}8|<Ktgvf$lKQ,-v]?' ԧ0$40%aH)uhV 뾧NiTh$MtrNX>9Tf˲t+IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot3.png0000644000175000017500000045521614620351225030340 0ustar00hanshansPNG  IHDR6WsBITO IDATxweU;fXqOuʁ*T$I Dk]#Wt}۾ҦHEQUEtrgs?vT~->u^k5J5cE """"饗p8{ {a<3zX/;_K.;t˭/|`^&"""ϝG0juժU_iv]w!^s;/YxQhiuY]tȈp 7|B8pw7mԘs_p[nm?t޽{/׿,k[?[ҙLcQ,k9$IDNLL|;yOf˖-[n`mݺu̓xpmq~oc~>Ѹx7ί{>@&10woBs='.]G9ַ~_ַHb֭kmm{SjZoo矿k.`۷_pDDDDq˗{_Z1111H#$lx5~S;@ܷs2 Ơ{v0;UKD@=Ï6B,hY΅D]v('CzGDD@&I/  @^|+ v+)ӇoU+:YI<  EG#[ջŠk=lyZNfc:X zdJ G6 "LqMJx ~ }6@/;9tzfd._~Edz:F_ѧN jtˏ_֍AՆF}2 =Aar@'GګZ `9N^ W8&`CJ>8o`Q( ~:a@J[w. {~ hhCp]/06oWGwe(>Bu `y`{V_ɋ, /( >?nHd@G 4# =""d>Z3@_V$.s 9g~~Ǖǘub@-$#@%PI2yoL@D ݥΤ4'!>~LωWFq,3AhoQ<9t|d͉ zDDDH#"""^'D:C~GDDDg Jt zDDDğ7\.`x zDDDH#"""^'D:!􈈈 ǼmQu^DDӄ0y'!ȇK(aiWP\^'Z\A RaP۔RAg`F$茱{СCoMGd2y 7xGB?j/X~9!P(g?{ݫRK.Rj߾}c=kD,몫J$hƝw9::tTgg祗^M?|zÆ 7nB4pjz-qEAP(ի-z-ַ8NP(˻vS75⡇VBq',YlRP(A|Oݢׂ뮻.ņuuu[Zo|^pms!@6UJ\ _|qk׮]bI2LTJ5:H)ţ\K~18qqP'!Ԃ^i3ZȂ pl oԾtQgb$E f̢ά3jL٩B@RbMhED@ɐLUǴl)D<Λ6[PfebD J隦(%05JHRG$QBJێ!4~ҫ%L&VhZ0Wg*l- 7 Z vB ۯ!N0 !n,BD؇>;s~?OApRJ7oҒH$MӬe9ð_XB:q+(v6t8]-'O=}T4LJ;34 0McJI8⚦ *@sW(:SV |$Gm.4UCcTpfQF0F9cRBLW0  4Jsl  Veib!!hXC2]GJgbl N y,cRҚjXPҁPQFlD)$.o[ e{G:o KH))gu8R!󆸟3 7% ˲Z x≥K^}BPO.:ni*3?p#/B%8k631:u h*Q@E$*B(EI)׭XAnW;smzS$T~EV݅5\%`œTt䑛#WQG# H0JSaAwv,D@쫆sjh eLʴm!%2Ԫ!2~ϺN }gj*߲toNEzPPBTzVAXÿ) H$(pu;J)QvO+eܠ!ux<>00k׮d2h"4ժJF|;iS8 {j朗x<kkk۶m;NX`ɜݔRu]_4oe^vNBêN: QQ1D !i+[mJ>e+3S M$S:Q޵o|*?笻tמiPF.͚-{PG v&-i1x]O6p*_X 4S˵x>7,Zuۋi;aښ;:r-͏lW23΢JlC  Twto\g-nP$-杍nL'PDqlfjr}b.[=&>Y3frb1ﺆ2&c'} @4z h|'<F>0`x ~4 @Bu#ȣ @Ց*'W HC P$9#jRR)R@ΩM#0Ie_Cwߴ{``J nMϺu"4Div< %$UV*..倎f2at耨$DQJh!$w$R*~="TIE)eR @6EW@ @J$@!BD/ tgdd"hVVoX,f6!1F)mnnnH o_r!d>8]XzRu7JS / WIY;aL5:M53.øoOon8έ[-LLG/+ϙkSդuw 3x=H=$Fj$611y<ɕ*CCe-_wa FP5bǵZ)+gYK-wsI,nC=d}Vz _. @Xldu&fT#I*V 5_:sbgl- C׈Nmș EPJ0¾diLMmhI'bɱZl1M|%K2wS !K!)5'8Rx4PE(V,5jjhVDerKn0CT=+6WyC\!Gz)|Ҳ, 05A8  \hߖ93?:40]=PEp(#.E@H(P@$JNQ"<8¶]kןbdB!f2|e\J@Mu׫I_j0kkaR7DD'&5MfRSgPwZE4 $H "%"A#+_ti=9575STjhqq-gqڕU(D\<(i0z)iFf*5%9[v{% PTC8 %$Z;3jn8#z8- ((.xRrf0P"A&% E k'HPF 1Mca6RO7MsӦM1ƘR4MDtgvvm^_:p\|/r;HTQ,c{1o߾aJikk+OF/СC=X<O&xܶm45MR;pᛮ.^-O@ޔMV rLŭ;²TSSiZck=XV+}-?g Պcj 0\שV+d)K@MR??ff-NLX&ô4M!*)}OA}tp+U{EG|z\7&f|OMΕ4;N5LO^\ P]LBE(DN W B(:`(mB&] IDATV*xZ[hߊ>l9%z&gn()8BFIud #~.gwOBGʑ*P % 8O0 ^ٷePBH%%Q"H((" q2:b[ݜ00B) ҩƙJ밴۩=?$*V 5 ,d2~8uԒTDg,ôuFCs٩39Z<֚z % y[_砭=~$ݭB (,&Q,x%0 ȩ8>c(DP7'Pɗ*===޶m[Cƕ 2̶m]4ءCO~R,9 GÏG}hh{ yٕRjRt7fnf*wڊ*6\C4b'֪t'SسHplmO0ܼ^n涞Sn;087]܏n$ZP#B4a4]~jO8}إLN|,[dQP>ws䙧_\#@*e i!jֽL7"Z4 ܽוpZz&Lc\e@ ?`(:%0넷?Y1HF Q3ΐ鳣%\KKtmдcq*M FM\h#ڔ*ӰCwrﶝ7;x'ԃs+,k՗??{1ƹ#!%F Q PU-w4Bu6>Leg$U[cKz5+i´ d.V} .\ÊYnR,k|lδ. \182bo_R-YFZP-^{ /57w34; pC3Q li=S#Sv=42jocbᚐ(ϭ^ե '$]m[C[uEav:6[Dr޼:dg2d/kjRa0M- HAPQ+h[zWʦf)xo{ Ht4 6<5 xrhz/U:3=x=0(lRR &tu"$Cԙ^z]1hB0DbH =g"BƎ,p *J ETP)P 9U0 -M߻#c12OǙN!Tj=шIh*E+HO:57zB\b9TÒ}] U(ND@#SEP2YZ-tJ@SHÐ "RR"A" 84;wd2ǥH)O;4D, a /~kjjbغupbѲPF4HxH$(7|/ mgggO)jd4.bVٳgӦMm^јX,i'WJRL&NcX[[[ 9p8U}l3m3mǍ\FQaFqLlaCgR]0 b]ό-V@b]˗-T<ٮEn%b\)y;G <͇ML,'S3mlRhi2JӘ=gN˻( fVNwG|jҝQ}A5}|nió"p9@@1 (7I{t׸i[-鎥kp*,W"(eya  !(oÝ]C?{Gm&܀hg;ڳ~{̨ @(Bƀ)@8ryy!@[P9da@J睎^qgf'bV[(tvBR(iE@V k9ռt݆xbU4Mfi6'H/(p=F4shhX./޻{3de!<ԯ>|C_nXCGdTD@0T*A R+.Q0' T \m^-t}2xz#Z@HG:͔@ܶb0[[#F̲S ŨB$@uJ1YM?XjM暭uxGi# #Zãۓ'\ʶR+i2)[& #,l %@9T҇J d{%JK׌!Pb4`o*[N:nJ$/c <{P@qAR6d< eر[(IRJ*-Mm D6Q,^_nQwʅ: [t"Y#*G)&ZB&HD*D HU< O+J$Ԫ2J!ATRI%2B%`xgffbؼ% Bd2~C |>O?d2I)>yfuu]/}颋.[5Mk1p+o~X,vZMx}c?7暛o9˽=gꫯ>/^ٝTΞ[$0By`TWo@GXȧCғWݥ̔)jФ$xWJC_Vرh1iWJU5{`fCR /͕JՁ:v4e||{:DJy*Jd3e`dϦI+FlbxnjV7IZźZ6M֭li*̴֦cXGGZKGS |b=TBN[f[v~POoO4]|Nԛ,&[ t1[@ OO;ޟQys囷|#v]ygCn(IVY;5ݢtd;V6ZBPi(L׸5eФAŭi[yUo6_6Lȡa6ByQ ƧWR 0TV׈[UԿw%31197ֱ"b2F|j]r\d}[k]yeA^|t8=q1PP !>gS%(; Hꄺ.J) r$|s (, c1yx̮8cʺ_ %`hƬ)"F(0%\_O\kZC]DK')MJ7ߒL::gԷZug'0-A@eKӕ0PPSҫ1 !FwBzK[zsuYu}3EV! s=V\ SK 24t<6Sɀ2J1H HAi$DubL>xц]Z~TnW=i%Vrla!3]W@% &(vRG2dRbkx,R*uBB8A@ 5Zڶ=!I\pc=%ggg7oޜd(1]gff.҉;v@RYhѵ^]738G/~qu-YD_mmm-Z`XV)mtZ}iv7|aT*6,J<̙g)k>~K_ZxΞ&AL_n{G[5l Pt@wם f[cuWb{qEG?=YԜE]M۷x{/_bV#@ BXyR[9en/]|3gLlzbtZRnzfxݕ$dtxL3yS"9Ҏ-uJ^5Q 2m6_)Y)wޑȥT5yբ>L>nۍ2rv9@ʰ8SV]͕Z~f]q]~)kߞgmjih yي9[q#ԧc Vuwl;@%!T)0@TŠ==5<$K'SIJ,u੤^KlS;>Bs-V{MZc"j|)(W݆\s=fg߁g0DK7VZWj ɮ;{w, \) d(E(AJT!@P RP)$@!J$}B9S#QylgNͯfBZ8IB9<8Ԓ肾F) Ƒ0F9 &%'4| "c\#La~rJoX53=ͥж^v6gjrZ'ej-;MugZHR2T Jhi&uF| Ո&]*(qFB%LN΃P+^1=1e&@G)J-OL*\ն-J`TiL74Fÿٱwpl*a뚤"\:ޞ*ViîjxR+ T:}Jy/^s,$9"ѢL:4| Q KŁjH' eaRTTHT(PB/ kjjO6RrΟ|jpn4!~k_3MC)9g>#4H$RG۷o[;::,Y2222>>Ų֭[{w۶J\׵m\.{0,sǎ~ z,K###SgӦM6mcc`(5<^ӥ\ކLp77< M&3 A8t}i}ekٛ {\Ӟ{<9M^߽#^S={zw3Ք V37Neaf;Uj^rZٟQ~A''F:yxl=^{ NMUF;mv c֋wjqxiRm=jIbkӢFKs/׹=ll)-٤rUu3e’'2~ϛg>t%mZ>oglJLx϶-٘9G34XQNUN)+*C*5%i'F~;6m}sf =bA@f[Ua2[L %3nt ]Mc978= ȵO5fku@\q\N]"8o p@F9Adf$sj14JPK6A,f⩒ׅO{~P拐AtY1F7ݨcERˌEMˉ:Uiv_"_ tB-#%(9vz :-@JcCCC?|<rbŊBHu10>Tch{{`gggCLFc=~0jD"QVO?tDlnnfb1BHggg.RÍ ޘ0 ۻbҖ0 fzK)ϧ(2LV{9m*ߣx;'Lႃޜsfh^@8ihoY;PTҩDѣ/ Pjʱ?<56?<{{gutmӐَް씊?ox=rlk;m*ss #&j-O9:. SaP&Y|q98ؽov|j+?Ouꚩ3{˚ֽkz~#fӕ y3Q_>7,N$ Qp@=7)NRJrݠ W CH ( ?4ʒ:gCΙYT%4HB<6`0zyn6jOo-a6,^Ƙ1l& ,BTU*+w7xq"Uů2"9ĎDhmb"T*qHJ).T " LaS 4 T))56 tl&WO8T+H,ԃsJWx`\0,Ed}cx{\-A#Cyֹ?[ܻzpqwUMFơĝaPS"`Y37Ҕ(5"3 ^zr6'4ER+WA. +sDq `FA${FU鹋ʥ̌Ǝvć,1zCpdLGR $FLrÏϔɝ92t` 5XH! 03PBH+l`4:hHcjH04aD#0B o\`Wqu8^\\gq7 yeAyJeYR,ԙy䑯|P(H) !_U'zB0\HYz1:6IIfOݴwGSIMf|>oOUY_ O]lZk_~j8^in'ym.tC$N8Gmwep߼1Ź *9` I)YE:a:3ǖ !L(0qmq? 4RqιG Ŧs|$U2B3 Rh3[(%8^XvX|Dlt0Lx'Tz/<ORQ@ʔ}wkQ,Dآ9Ǝ1-l"T'T TV)LQT۽`xȶ q%hM5 0ȫX.2Sr<vyr9/tI 9(B\fg8J&5CÈkk't'I(# V* 05M#=5\߸{YE6o IDATZyz[.TZKpi 4HHO 40ѠysQ zr{׻{WWW~aÇǜ{fYvԩo_׵Zя~W~WƐwe~ٳgBB`p̙}ollxQ=Cryaa4={4;. 'N8t˗kXJ?[o?gϞR/}}?".]u 6rLYF-TkI?8 .qoEkQ2v C'IH#s+<7Uٳw}[y.6;+W NDH1q;*3ns,Q,5]#,W΃"پ}kk+"K)LfKj=+qK%#% .43ɩ矼tnzXĭ7(=s*~/*L?A=YHA c%JI˙ĔI259T &QV"PJ#Rcr-@BHIyF^*U (K'+%f3Mr1A/_Fñl5 XMg/X9w9M?2 Da͍Q\8wqtxtw??g0YQ9m.q@CAJ} P)-WBLHϕ b:I# % :5h cr!rZԨB40 SP"@I$[|ɥ%29 %gCKe,QJTFKKz^RZ5}akRjh L$Bp"Cwy5>KSqq݋9$c˜K~FQIؑR)ù(Ǽ>RW%Db.&DKBJkdbh/5{a !F+RTya%l:mYFRH hr^W1!q3IGYFbK:4z /t{ݴXA0IPT뫳ik @ͼDD2]ZEH܂x S4R6$敀kƧ>8ydTw/b.JRZ-B?$I7| 899я~3p8?Is, .o_Z6`TJO?=99麮/~g۔Rkkk _ŋbj]_l>{,r'N\-)28zkGIGY#heU[]ۡlL-Q3RG<\a/tnbqb([7=[}sǭn xF{`2Yh1OR=Q7yj3t)aN2&mV1 nAEFVL!`"v0i !iYY*Jirz^,~Pt衽 Yv:}/><-_?wpWzFQ°7?_D؉gF? H9E<7*v$2\(!X# @@kcSc%Afgx`fmmԥ[3|d|!39,eTt7W10RtcPJIƠ3lAW2pWVҰ9ӍFRmmݽû'GQFq=ueW,~nP52nm!1Uv tch"y'uY (S1*HLDQI8$L(fW(SOؖW*=7=i[! U<}ga01FKm4;=~ ӔK$26hPvY "mAQ,-) PӚ`$Оm1 VrggbiimۭV+>|:ki4O=˘~>N9-M,fgg;NZ˥sss0Ǖ՛on}P(\wukkkrmr0}sۿt /!(W;)7 ޝc陜Q K b)[q():LM\ R0gSs?'W:hD=G6޺xB%ʕNa>JC Xpvr *r~J2צˣ` .uzEt/uBPgѮ{nݷʻ|r^- i0K=#nKeRbɅ<.?XH".bʶs=sg)s"P )(!kg\)) Q8{mFfIPMd}3L0?,k4CF Jts"Q9L/LZ);p'V/|nx-_]5TeJ* 'Zk3`A0G(&FD 527,w+BFQL(%a"e$\pU*cfqJ,:=QvCVNQ%GJR 6RT"Iq\:3Lz jصkp\V 맟׃I6ڍg?op;,--=vٳg{o}bb/}cr\g?~gn1z3ȯ]ժ8Ia.1UFs(M!YtOͭ:;Y{Vg˷\w}{F9 u(ӪTOsg/mǐ7#SAg&Ο@ 0GGag8TlhF5D⮣L2 k}l4j&tے bzHsv(>v1e_*gwp uT F)ԒzˍxnfE՜a{.=h\xFs79Q_Di{~VO/T5*ۭBP[ɉJ`EbZ` (BTJ? 8ɔIDRSa%l(9vo6ðG4ΤJMS9H%ЫRtwzDy*M's/}Q+ $hP # &,G_7L Ȯb {n3:At-X!0q]_j]g4xQ&ӥ:瘽#R`(5X"tr4t&2IhYJR(Ipt{q;ԣYXcLQD.HYskkΝTKcYY.v1"saJ#  FŃ0Gqp bz>tqnV=7ZU%$&%C핦OmR21R !H`?*X,~SZiƑ#GΝ;w1Rn7I?MO~sBb޽G>0(2MsffX,+ѨZvq͍1񥥥Oǎ<8 n}sJ!!$ FDZ{\cG;'fLenV,Ü.vc±{q?ѫsaoIKS!I@29A.G&S)G7ֺK ӛ[{G#GR$ a:9Ja\eD07=|{$nX˗rlV¥ *ogb%]Ò2k"J3cBkKTDiRM(FRC HY[wȁK0 ʥ)aZc`ɲhcEʔm~;$UJ( qZ~8b%wܵɩN"4W+o\URJ@kiZB13=Myb'YF)-luİ h4-ۀ064vip-A^bER ;:,׷W6kSىvOD9BNQ:TbLDqۢ`tz-VDZ sFh`b!)4BB!ZcR'ZC&DF"3VkV[^4L|YU[+V9hP?tB1VQc$,jR֡RHZa쟞Nm!4N7lv{}\7oNUa=u7{E5A_ڰ._KvC[ eC}2,E)hsnΦṈ 4EO@)h^4XiF2reR2=SW_z\EkvifW\^vQ8RZNN''B 5M*,a1Z]o^(Jnrq`QТt#X8 y fؗ$!@ˋ!$$1F Hc'$J@%c᫆71No97pѣGY8Rv^ @v({>яՇaǶmqؿ`0{VWW}ٱlN}OJ}s{n!X$` |C:۶Fј˿[ouUWWĠqp-NcNT`6as|cԷ1tA68`=f`Ap ř0k'kAgA7cKf A4Sl矾x`(c6Z!Bd2Cu08az53eSۍsK5oM77.t/\\ħfgFM֡@Z'YTct+HbFV@J”R!a~{y0P"M٩bg{ow8a3(羊J!& 3P Eގ@k6pb+'~[n7n'pI޴z$p-qd7{`˜~o0863V+%-I0^8~C\Ap$Y1c!<@`4 5b 4&7SY7 ¥kjPQl6,J\ooz/>sW=sry5{-:Cf-T`9 $'Vk Z РM@CRPNtF*#XH+pqkkp(@)sWi[[[Nj8ws>77vh>Wkk׮o~w//$I2;ڵo;񎱡XK=}#KzN+2۶_V{D$Vhn7O@M+@ lmsB5]0D~KLrٟ\;mPGx;/<3]2`9sk"/_ت.R^nb>W5CNsʅB=$foOFn;WؒJKɰ&X~y-0NY^¹T(^?P 1%33 YgCn4Լ9UoganxGڽ&I郳 s@>q|Dv;_Afa21 ϱ&V+~;i0YbJFx,9^i!DTdH+$X6[% 2LZ6Y%P@j- R5RZcDR &a>rspd~k_{<ԙ$jDljuW[}!:# * F(rel]z]ف]G*ezQ'1T4MV&2@pũXI@9WBLp!iF!nA1 ^I2"TyL`Aٳ)*弩d!N)#k r҄5{aft|+l@`j~~ Z?ctⅵSR$'†peP8:yt/G*OM[*j;7UzXJ~?|᠇s91˖֛nWEYDc?_ (eh@h J \#4DUa:q,.+GЯ}Ccs>BpС\.7VBB9hպk>[[x//9rdLjWB·!fggq'#8|u]7>eG()?OL Ybbr JӔ^7J[6L)V꼉E'82Oa(eF70CA-=~ִ,ƈivϳXy<Y0ZnjY*8j  IB" b./K-2lS{H`BX# 0"1f˥QhD8ln6:텪:5] Z @Oxym+ky?x\ ?/ IDATSNa|+xȦ IFþcI´Da^YS!eJIIsa` AfB׫f}"oc7[@k$CiXX L""^o۳{NJ:UD66*6|t&6M%$eLoy}24[Xi3zn/oY[˜p.21Ncd Zmy꩙c4nAw)se25 Dv_wB,)`t\ >r-"b3 J+'hf')c,YmTu{A0=U+կ Ӣ StW?ءkJ9o,wܒ.NƖ!S4c6ͥkVLL7!1C㠷+WWewxw) ZeP t;Vyog떅T~'N2S'OLLOr.^ZD)Q0W6"Z9dfrf]NHu%09,W9[[4NVq%V\yJ!6WWq@')rίMqu':Nh;θ }FT?H)Md<Θ~J1f<WKdC1*RPJ1Y/7ۃ(j6&V!B F gb 2!IgG]~R FalyebřpYVg{) P(gX/TI,ސr(ltD'Bk.(.-LvuŢyΠݓ%!EYfep-&\j *Vv˵-Zˌ1 .M>ۘ_}ZjɸbgI]l# X<兩'fVG?Ԩ<1bXh0Brްi+c/c4c@#!͈if&QFR6 d0* z$@8Hk5X Ra;v#4ylyg$fhHHVT]g^r'!}]Xi_Y|{- qex)SJ !qزTjsHʴlbb0J+5vg5I$S;p&5̰:I#?B0bL$b`admFƘʌ4"%Y6&*Y KABSi$Cd@LPK7?5qaeChnK:vnn>.I0OM$0آ,gdžAP=j6JW^:q7ҩR2(i m.4FK5RGR#0P՘j˯BJ@1c+QrW<}|Mgof\e<ƊHbda4lY=n8ӫkC,NWYjnֈRZ*B0:zi6qM w| ab4Wʏ8-|' @k-RLV V*=Pt@`L1QD%K>*1msv=>\^_m= ? A MDcˉ铇wφ]wOߟ/j9oz݈" UǑ3(& )0423QHH!MӶ-Od(VfTsV)Ots0"vhH#Deػa|f`FTr@bq~[~R+X!DHd2ek#ŏ?B={l"!{b;tǝ`p,u~)dEi"22MyE0"DcH*-BJKR[%dJ*ի1teJq9/ Awxmw~g&H*K1JI)1 d0Hi*aŔWɗ d*FVikrnʭ\{ GzGy#lfʶ^,EZ1) 3TQLZ(WvUk"h@1`DZa$E"Bh{sǾ+XQe債4;Rq X9:a{}1%0!ҭXm46<3hZh3J'nɳ- 2@4MAZc5 BHi(VᐨbP (3Sz%,^;(W ,<~R6: RJZUĝ_S̯sy}ͯ?zd+q&H!@cEk1QJ !LDJiikyTLS;|yySˉ2%Wo Z-)VW0h5_}WWfBL΋H\d1q2 8y:Xjn(傫N(NbTגn+.*tv .55aОm0EJ9/Hg)/.Zk$D)Rsǎ ?z8'ˎYq%Q0J/n=M;~m?֩xWJ#DkxqubN88"lll`RU ә<Ӡmfi]0JEi(cfgӜ[1[cyw j,8Z{qqmZ|h)^߼1JFgZi >*N`ދ?%{uW5( IaYfrBT";؜E:w~Ͼ1b4R3d̤0 5wꢗ,2 L:5s5Ov:s7X0PE@b^>dh Ɛ 4t"+|_hnP1̜qV(\\ssRCBph`0(qe\;off~곟<,qB2o¡oޜk+&SO֫pr_X)9U!UzU!,. Qms^8 zw!"Xd. y˳nTh1jc;&ygR}M>1nOt`yf(hR +Uln87^[rn~ڨl,RىZ;РC{ku4;O~aOCV>əٹ[[GrSd!Ox'߼:LިV*՘G> <#4>}lޚY +Qީc?q\O:BYL"8~Z6ڠZ J]4IErzmXɌogXnC(2>GH1b:U?o:=ܼz>Ov x`6F 9wlqԑWd5FGڳuՕyX7PY{ޙ"o.]>=HKy}32+p7D:Xx‹>~V[I lah FxҦܦnJPZCcri{_C:1Bj?iԺKO1E==J:2nU iZY^@{BƑViudd~ȑoWMU*%cHtZZc:o[pE3CT&BL#-9pYiFYn)b~;[ɛW.U>^ H˲R*aw AH竜qb-Ll= `B8/g#I|牿xߧK'GYQo,/ߺquj,7~=O=vߌRSkMךӵ8jԮ;[18s[$*rO(Eb6gqX- uZv'G͵fJrf+Wwn@B:dXϝ?9!#I6  wz.fʟ{LHY}⩇OU귟{Ƣ|b3'unǣ?>pxI yF֖S'OE;zKSr58;2Ae2G9'*9猵t_Ms9fdzX C! _.\q1(jBƬ\!紽JSpMZ) ƍz!_8GYg_l+:@D63}vsc>鯜 xɸ}d@ d |~ޟ>ZxaGW/0RR% Axj~^of>t+FmkcgdZsJ.;];M-U]~5h\nfNK&a55nעh7hx=a8KYd:sqo~?oF6|_zgo_ܒfÌn\[2̾gZU1j{\ܕ b7cNH#m˳oFuj}sP~C/ ,V(6PuBFʡaIG⅓[xe/sЀ IDAT[m2m?r+`<0j~l! {^{`'iM:)[ 66Ƒ]QPhcLmkqRfg/fn-\SYrMD\Kn4@dtv=QQ%m6 [󍅥viFjd({3Y:F/}cS- 7fNRC'G=5֚lw_wf'fȉ#3͆=2n^G̣Zz;J,fj=RidTf#FD$e+-zss󎧞g_oyFVA"rp`ߓb |_S9#P:'}ۗΑs@^*ghdׅ(h\X!8\=w \2xpZY=yhkxCO>>sy Wj[=5uWWhv6Xmqz\\oww>?ӜREԠ;HGE+,@%nH pnpYPg#ppeh3>ןhJD'&qhBޞVD?(sg= tMV㨢V`j=UAw{TC 37zY:"-H1ݬֻvkWsso\ FI2`P);?^}y/\\?_:E/~ۯc5 OwkG_fE~9uy0aìU󟿔n#-:v?Hl\6-Rrevk扃3)CoJ3;-AE8 bC -%w͵:) ".-r$15oG9m7z߯>|{;_^ wT{.Y@cjȘ5spZ1/16CZ%_۞kV_ҏBBY"@9#✱ sib<7۔2p~GBHhq>Y $NTjZV9Y2_Fkn9s7[e8R+W탸x\ov$),gEETON֪9Gzt*dzFwgyן=r tP' Ymj,,ssnWHδA)9 8췺@MwMt9 JaN6#G9昛l2)}ItsϾp^>^jy9V嵱VEA:8s:f[UcW6/]\~'ĴE2|:R1yq{(]%oxmF'.N`[ºd3'O6Fv{n^+It9M^=lc YOMgbS:g;=XIV0@/Y%p ~`篖׾r|Yq 8@ !Oys?s?N 2*e~ {z?fq쏊kWgaZ& :#@{>k=Gjiݞ4f2]dE?h-0wwzò;RD-~<+50!Agw7rGE#08dniwkbexR)q}dXm{V$ ݅>pzPX/Gըz_/cJE+˴(`av7d#]:ԙS{ ȫ“Rh4VJ5+4YFI 9LaBXJZ_}g_X LCBd֪IFz0d"ȵ7&O=_B;G 8fmC L+bn%}#zrXKݧ;I9(+g ':j/LeNe}V*OR cJ\\\ٞiͼ㩧W{q񳏾=/O> FUdƸm.ハu_)c5X ]dK[Y^ "bpd!L\a@tj$@wۂ0,D4`鎏7fy`%^I PF+V11t:/nt b0EzLMcc@,2kh(vQoұ/*!Tp_c)݃Ywš Ɉ݁Y LoOt{=CO_N=_ғTM\2ifbϻU~[V!R}~L3 O?eӞvSa=@2R Ba@ 0U-]wNkD fIZ5mPD  "Á/@b7Ed?Dٯov <"I@Y͵\*-̓]R+$81'C9G(j'so[ ;oEy+흶^mV #cGRp,gLn|/M( L82Io>9n:GgqІƼΑ2Gd7NDDd|rgLz4@ƘlT-ywɇUY J{Hn1J LMD>.%0+֧-83o" j\JY=O `-gվ_?FG̡ǃ_~9$\2 *%<ɳ6DLG La= I#M{:z;;u+GPq5fcĀnt]|{8Ҳ¢J`+c0SfI"bިKCejUAɉ@[ 눤;O{>qqo{4(C{\"hV+S3qƇN%c]SDҲ8]~ 8JtY eKB)DҁŤ??~k7wDoo~PNRޓ|G^97 *[b_95te_?m5;O<>Rb# 1@ 4֚{u3\&'{CCac33'`=GJ;8IrO/$<7 !jqTq8s $xgY>٪V4 pĴUD!4۽N?u2׫LU#-\- )Չ!"nhJG8+[DkYX5tnmSV7!3SM!"mLWo\pY֗ө\on(szOvDFˎ-}?'H[ms2^:#VnovLzmTk 0*sܛ;4g?֭7bG9UaETfkkŜ!yHꦴ>қcܸ>̹9:Q0܅h,! v#moJ)}R(M^j/}@M^m/ꁺ~шցqdu7^;7D$, GSV8j% zX;nPloӬ @0JDzC4*2M7mͷ=Qs^frٰրN2y!tI!97o,SWmofSO'+Wʒ8#jd8*CKQciɃٟܺ'V[+;~km+q]^n.1e}tZņY;g4s`PY˅A$YL /-TZzFαS~+#q&,89R J߶( Z8dViZ]N0gɴ Q%xX$Uk 3C't$@>uڒ9܈Rr7Z" H3(\TBO01 !"0ɘ Y3/6yA f0Tlŭ Ի~vk&^yΦ`CR D<]tH=ԄLG*#2n6] kϭ ÇLsdG}y~Tؽ\`3-:tQd;SBJisg,>"ȑDHw ʽ{io^o|_w/{9wτPcxubO yW8ϓ,0q;]qݞTf; lyN!deZ60 *}TJ( M)ӣ\Q'λ8h%Ϧg˲, #ag8MJ]>rt;+~=r [z~G]N4p8 *+_:ZsQoTp~gS.A+bw鸔;م7.ԃsgDƏ>oz4,<-:Fӳtپ9(^~$4[9\]O)ÚMSLz>\jxvEvӯ58ڟ{׿GQ 9gR "i'ţ=O:s@q M3|걃;}g T*Sm? {7s#,N6f87c PtgWIkCikiΨ(x\pp9}241M. R[m N̴#5sBP"ѐ 0EY5"c@z=f ,0|,dM6&"\H k1X"@O&2&ؼY eXg9u4;;[*"Q1  "(8l}RE~Dk}uOr&8CDB1'04Ȉ R+eUy1sUhs7v^9@ԻCǿ̷@`9q5LVh;fƋg_?u祃ua5|WVW^_z&z0bH:+QDd\lpry[=>=Gkj`:x}94Z.F0 E9e)Dr"Bd@h-$'h;4, /~~~Z/>䓓^vy?}"[,00@Aī…..>zj3|} WW"7v.gJmX6ݶ5՚cjy>bt:Eq}#\fKM|ˑ96۴W㹃E^g<_:uULJb -/_Zz sZmf>WiiDtYW吡Cɬù\v-F_zv݇ܩ[nܵ!INA=n֢hYTj4Ui cog3_ex;3#Yc49'=@qrj#K3QY(Gmf=jμG>vk7Wd Z3TaQfqP ]ZrF瑇wr2հN0%t؉4ZYg)3e $wU' &FȭU rRj\~zJ9*,z#p85d X@97U?.kIrF: !cvJEQVJkMK IDAT,KQ29:{JY> (Tz%o?\ jvjldy^p9dc(\I˗7#%,'0Ҡ0BbH4ָUPeA?u%{|m\4xAqlڹM Āq `b$& Sʊ"?կ/PJ~ٳgVk<sh<_reJ{"ؽw򞀳uqۀ~QrLi^:̑d^•9tܕ+lTø,s1`$zbfgw@&Piqi+Sn gY]Eēlg%<6=JZؾvukmu`u)d;rjo0:/_XGiƔ_qDcOm6\I}B0|RbQA Jy ^,{ ?.'=$ bN wE?_^YlNqBCd [ީC'رXyNLF2 9`~Gy$Xw92vsc{S%<ܲe!@!\~" g`eYdyc,1 YTj8|n@YQ~uo.@p AL=<9T tݎ"n #I`6I r6z#G2s;8['ȳ_Gi2ʔF0.q(GY@j_RH vM&/T!9rȥ7/ Ύ9PT ;q{M^!qiY#"GΒcBʫ 2øVWF×J3A&6͸X]_.D7nn&^_KEQ^{IKq|`i@Y {T=5cx8J@X,< *~k -"xFgٖCf(mRjNVw||?ۻj59 XS';jegc0leݔmV:;;Cˏ.?sל( ={j32S'zטAkM s }ds~'+; mkEPaRWI`YY 0Q+om=I۝?ݬGհYR^&+WˇP>4݈lnյ*Enq04j>;yZ zya'.22謓RsKι%p`i[mͧ;yC L^,ߺ8||C nOV^hm1no_s]^kmn(hOfgۂyOU9RzZWu.Z2~?ёCKZެ*ǥ3@h \(,b^7ZsGZ1ѿ8 gޛu]ހF7b'HQHm$DJeYGU]KURkSdO*UɏL&35UTRĞ؉%YlY%($@bzAg~׏UM2Ϲ@T, œ&OI(M m۶wtJŅ+#rQX6 D861|7&  qv& @ @v%H @>fB\!}Bzh$bN%j }t-9'3EMT+]lLjrGkDSPcmL+@׺P]-X%b'S-qObm۶,+^X Et:-+/{!d2l**ili($mž+ _p߾N)*:RԲjl#dvaVd橻+\g]D,;./}%:۶8#kk]7NLLИTWV+HuĶѱ gG |g" t[#|sGi•(Φeء SYi4REۢX*sljGds+\}݋>󜛟Kz ,Ֆ޻>|JQ PV9S-@YwlAGBV8P$A)OJ!- @˲<"P D 8OQK@CjhY3@Pm ?\?,x3-DRuNJ  ^)Ltt7Fc xj~R,;ՑG;R*;ڿcL];s.W]]ମrvBZ,nV وvx*% NuViǒRkOʪkD<ԞL/U2R2#]΅'k )xa 65W~;Z XEiIpKt)tJr#]ZCXl{3Hlnhh8hz~EU'0=-L:Q6Żv a%$h_O- 4!*qk8\k'JǑmѨ`-HGFbC\jt\P9̌XnoN?->3.,ّ.+6=.:;jHDffS'kyHS裷M#RGTj+_p#hQ%\d1De#! G"-ɸ)d+)#57Gʃ V(ތ2xGBܡR&3mnb|cScSI͏T*xuyv$BABslKN^竕%mµBh ibj&tb(%ǜ|TVV*,eRj\#e6qղR'U9W*?0;70?U488BXUF{  czV5AGDK/TTQ:H/r+ym[ SO={J4wExɊ`:&ҍ:pC=q ZC.D#`O}4RKy@T)| bHZi6+RK5y }@J.7_k99H@ͱh67>0 7Hjhtq~ apR qG -s S\A+(O:I̓@"2ՊWTH+,hT'ラړ-"lERŁG[n4%W݉RCd.h[RZ&,hH6ETRTdHC䟖6ZeSKBWs'?htT+^xE`pCWɍj6M>0_J7˼<;vl\)`܉PW?671၁[ܹO oG ~L['XV+y~3˿CZs"՞ NmqkΞ[շF&;q| ;fW0 nj0l,2vY}[w*h{zz_>; *J[[[F8.S7cL&oVԮ]?1=؁n*VljLRhtTwhl`nll9C\. ')ecc'DT(C\7Ԝ烲B wy^yxsKRe|76:k X+WKW`MDZkYP1_Paw6ָXӱ;[ʶ'Ojo+P(ǃoӧgϞݵkm\_QR+׮]R&IƑٲo>w W`#zX[Dd8~=_~ԠYɠ2̴L,> lێbHsԶǏ~ )&~=z ۶ms]äQ;ɓ'] [08[~(~|V eYsJ۶ rYu?jjjZXX,+KKJor{kƫ{%?O{{{W#uz={Q8N"XQ. #-z8/`cO5"ro/_/cǎ3g455E" e=į &ݻ. \"fmq^:33d9L&~顡T*;gΜy'-zx!*^xg BSSSO=ԫ088o?MMM######RʆT*uǏ>|_r㛔_sBwڵpݻwΝǏ%VJ755=C㯽O?S&''yX,p^{m'NҗfO>}=ݻW_]ZZFN\r} >|xtttffü֫hYV<)k"]paϞ====Ǐ_XX^z!3gvzĉbOLL|_\ZZD"R'Ntuu=CDtObB" BlADSOٶ=66{ر{,+9rdpppdd$ ܹ>ػwsqz{{-lkkK$t|8wŋկ2o``|T*;wn~~c=vرl6ONMMݻ̙3|zX7440 ֋۶m{7Ν;yEMNN2]\\|zJRӧ~!ɓ'oDٹgy&L=zRnHSS&%hD޵kK'ofP8r䈔ٳ/_noo뭷Į]?w={'MMMO>k~sR/c=fYV2BΝ;x`gggP8yd\޾}K}٩/}om@Y200pʕX,&rSO=ь JzMJ)SphhHk=11;v'tR\޵kožrB0??/7߼|RxRٽ{KOX\zٳ4XuʕW^y%wy矿tro_x1s/;wn߾}۷o_XX8{$1c̻otuu}Gp&=ӧ/\O_rP(6~C&'';::ܹsBGywޙ5Xuԩ^{gllP(\t驧:w=qlj?с:u[V>Jo K8055yd> .<]]]"VǏorS@ cǎ93==J.^o]v^kjjڿK;v ]]]J)ɓ'y0^zڵ;vg?JRGOr=s{w=uooyg_71ɜgU=h5744H)h4ݶm˗._ۻ噎9|P( +&''CPww7ٻwJg?77cXRuuu566rnnZ]vcoJ{>|x`` NG"!(U IDAT>|8JMNNBlBT"mX,> 'x/wX,jll îd Q[[[<gF:{ }lnn.D8Çmf:|RO3?~}7ڦmlltѣϟN:ED{]Ѩ<S ݲ/6667\}nncQf5 _ߟJ}v444Q4-JgϞRNLL\~ѣ[XXyDlhhp'Vs) '1 T.;;;7C(ZZZ㥗^H:} _|~#=ꫯ*xG}tjjjzzu]Vy_|<^xZ%X,ƌpϞ=Ba||i!+֡Pv M~]k-kC[Y8:gii̙3O?4KF`M-69sf߾}L1W0?Ök^|'Jkm۶R*%k'MTI۶_xᅯ~,&þfV|?Fv*=82.<ܓ`"s [;rtttiiisT*f``Ǐ?aB_+P=yq)/Ex;=c+;_ Q,D<|2 $R˃ML"kttt~~R<㼆9^ M{~֖ě=FDz[5J3g{,McLX F ^W~@ aJpz*ǟmQ I)p}` 0Xn?pisb]~S.cدuE b.b7V@XjpK&tcUgGWIY0O{j7 +@1??_*juE-eY 6ɛzM-{DWE 7g[2/{KܷW+~eimm:w׭)'G͡&ABKf6g5 n51YF$P?|^P˿IgNۂ-؂-؂_ll[} `  gA-SYq_zͮ~3!XRf Z~#^s%lwnzMz+`%AGD5W2uPVB6j7l֩T#8 92L6UJilv="JL&S5J%F0,-- !2\}!xX{Nsyʃ/|>9(6T*`n#TB iDfrd8YQ(tX|b&|Kc]Vk~R)ųa bo-Ed2rRֺRSɽ˞JέZkd8>:@ /[MA.t::/ ol6dJbuּV2^TkcL.rf1 "*2L&ɔjfרXV\ёJ"=ϛsV=YB|Ge-,,0p mۅB3::%rTV"gX@P(˕J%JB!f|r>|__yL Ov:fJTUX\\d2BWT[t]\.OOOOR0oL&xbR\re۶m׮]rRR,..Vb\eBfxrl6 RJ˲85y7;;KD|'Ns$h@TZ\\Lhtffy )J\'1d2T*eb*r]w~~~ii׹8&A&r|\.3\ +X\~<&\<).)MLLp XVdö%cؘsYK׿"/B]eKnBDCCC׮]?77SFWW[\aNfRittX,cnĊDg.ysd2Р>qgܹ3qV:59ڵ+N`4C.w{BQۧnll,JR)wvvZ}x<ݻw|[%@W}]w)J/_Fĉl6{5"]+*eYwFX,b]qڵd2Y*vڵo߾j*H&'ֳ###m 陙t:JX,d2\9RjppR[Nxggg8D"\ Z6miiRvwwܹU.1;wt]7qׯOMMy7>>~ J^u8s.> om Dqrۻ^at^BT*T*y("NNNMo{5444TUf̼SOOOC Aj XcWVjii1.\aLf3r@~ͅBKuB!6>eYbu] 8s60>w+a% &MMM\;pc|_JH$n6}wXsŋڲ]WasW2|ᇭh4Jsad2F[ZZ "ZH$B Z\FR.Bŋ;c[ZZp7FFFxSb1&5l.őN84nmmeUrݜ5Sr(*|AZ>lZҔP((qJҒ8,1ZHgr=TkCºX,FQֶxP 晙&$ hP(NW*E)VTVk1D$ ۂru$Ydraa!BdJ)mQSSS>Rj,qBK \+lflIBP-XX,f2۶yp^Bl;e<;r]2v|>oٶm4bM%0Rf2ncfk` LBA7py@< $5ujA;%2>XCM[ѱ5[uG|A'W,Ƞ|A7^5۠5̻ƚaMփ7܁OCowG 7iC*5䷡V{o5kBX_׷~M fI2 cAq ;neCm }<(-is>:o.sٰPUQʠ[|'>XVll[} ` -[[p2z4h9-RJ%RrB!H2 B1S"lXwy+w6rҧL[gg/?cWj* ٜ,Ne)?~/z"<<)$/oڶ{󛃏}H(v R}}}.b?D"7ݖokR__rjeYJR' t// ΙK333o*<5"؟O8ի#R^.G, <џMڣO<σV_#an hWC|d#ղ&?JuzzgffJZŢtT*!u]#}k2d¡H__ߵk 10kFCԔhnNrR.\P8g @k ^MVhD={g9Lk/O\-.esKKLZVZ+c&2@Db"&6ԲO.`k9%y"E} }>HUip# h2kTܘ$cd4Նkf `H 1]v+|wqm VD 6_:E~{7RֺoO>5ݻwddPȏ˕k׮--- !V\hwUV!h1Qh55547+4r4Sk @j---l:>9 Lm[ ^DA*? 2AwZ=rH[Vƭv8B,Z(%hКQG}jƅ̈ѧ5 sU/ږeYVRBJ!/#^.``͐ %s b@u ceRڀ2,4|25LZ+Cd'2JSo%LBσD HiH'KEhYA<@=vYB)" ."O7h-$vH(%Xli$"_QK5 ;@^%0 2o$BD(@*J=]F{^EU^2kdsP\lql!i:p2F*U%ƀRU@pBzH$H2en5FZ)u0W\, oR>7CX'!`uR튲\0rur #`@ghʋ%2x@^(P" }G|U2\#,+Svp8\zBH˒m`[]-2FATSܠRHOD1 @+QC@C<& 徰^7↗HE R#& "")V-cLs2y"(b[zFc<*R\q\۶BBڎ%dqC#mAJ)ABHDdZH)(%$宠0HCXUjmѲ2S \ܐ J+q"Zν3mu]7 1UJņ)%_BZhHVe)놌1iF0@h "RMO1P P#~<w~ )ars RX Ҳ0h A@""_ :RWl՗ج ^$%hm@XY-qB.iK fd1C"cΪI)l90"(Q$th+4@!(_ f` WI% B$a@$m5͚؉{]5`LUwx\_o2kYXTHi!֬8Vm %M4r7h&%K !ےV"PA#hIUSɑ ?[\g|5$mK 0@ͺ*Fqc*9"F=?75(e,K:6dqB[JQ?0::b0k9L:`""-PJ>Uu_y.DDP(LDRT*km2PsT}@TpڊЎn`PDs6hɀG0߯W2 ["&lD_@\&aN";&A?m>rЗi`{C}=x@kYM['D]^+\"D G 鈌ѵu:8 )"R&SPg$ jC)m@k$Ahjo d!2$6'5Ұ/K0(ВmmHAX U"o.bӇA5iSY@uLF|4c1י`4)|Un m,ϭ {`d ܘ*l$~-V'M0gL<#"@[x@0l5RKFcXLQEC;M$X#%B"C@0 !Ffz_ܾR\QUϫV=bv=ژFo*JpCBͺRiےe)?vuax в,_ 5wîL rjbKDB@a/w&T6\v'-K ^y`Lkkk[[" UUlۖҒRjn!,+˕P(!CDTBąm۶ %/(5 T*y^50A)? E߭?ē$ض#%m) R$"iIP@~=aI@ kWk3.jV 5݊}ݾ۶4nm׌&5vMJDi YCR1 %t` PȠ1 x `PX)?=A VZiMLS(4@$Ts6HưAB }`Yj^FAmӵ'B05 Bv9 AHl +ܬYKc4`a|77J (%#&}A!  s$$`OH}D&oDIi,9AD7zk!IQ FZZ@ J@UE Ј* J mʂQAh! Y34 } A5a^-C媴m!-7*(Ӡ6Z)My/<~1 6hOWǶ椮$ uB(yjBη-f|K44jV1@!8'7ܘ}O0V}W.7ě:Zh"dݽ~#O(e|g3t"HSDXDժe۶BJy^Prdڌ\]X\hlKq 0FR)$I(?kolug_&AH))qJIdɥ$N %HN4q0"(qog{׍*9B=6߰f'OS=KDҤ!i-ܸJ(! Ȉ@y(,a):DD^|5Bh2q D(L ("xQ uQB'I!RwBAP7 H Cg@dFQ50Y/"$FeUol&}RphXcٗ,m+5W2R8a `O∔BmGXYئ8)LgHBIcC_BBJ?Pu@*7@ف "7Pվ7D{J  #TY𕹋i*EZ68%j\Z2HiH(P)#e3 jx#'Vaō >FeTMlUIG㧞gmε{;oxADȄW%ݢ((A$.Kh4#۝ݣGZk(8x<^_ߘB"2|Gy+D¡y8L:Vӯ^:&O`wwINX؋lDQJd2y=}]ιzJk}he7߻z@Qd7,GEVD: u{=EEYB1M C+>ȴ/t~Pt{ϟ=s4}$ZD" = ʹ!IeBU7F HBBF0pZ^HKr(ʟ?,1+ `+/h݉=uӓھ%Z:͎9 Ż jDBb͊WC. H+9GkȫoLˮZ$BCD(@U굤°bO4A0Uo**pR|!("(2B=m:| ! = *+üU dd0 "urS4 x \xfeƶD&,fOK/,Ͽ?_aCZcy>A 8Q ̟8qR(/b0./KYxc#zy+{7%Ht׮m;ڳϿvY{o齢pBwh86Fl>xy!Hm(ffMEڠR WMfF!Ͼrj@drXbZK/^VtfE ."*8b5p";vO@ŊA/UidbK<;$P&!eft J*&"<4Vott_\]@UohZU k~{̹W. (CssH*,h*|5MlQg_X?s*;gB@XPpم9C8޳)[3=oϾ(pǏ;~C}Vhcc""ZqEQAE Q!z$D)}'=)aLԩS_4-"yu:}r~]g!.w~wq7s y_t]"?t'A0E&JH H :280 (U'/K;[/;Xkk R⧊5XXiAAZ7A@bDt͟*7̀ # Tdۈ=0XΡuN[{tY{?Lvgg$q u*fk g֞[f]~0/8VB,{Rf$ yX7PXr1Yl 2JIU%ꮫ:肀B +b`#hJ~ET)1`n *$Q;T°PN[$P[[uIS*Bfgx,@ Ra]뀀(PM:i\V%aat cCv2̣E@T=B_ǞB~[^D&%<NnͫT$3zB5ʅ* W.O\13>x`_w"2Q3-Hj HBbٹ":d2SZڔ;D"SBfFBy*3ié|"_GQSZ8!yyyyu?+/[o{O|駟~3Vk4-//+g~1y^8o[ I눢ַ~l6E{?77ۻ唊Μy *ƅ{VM<і}o6?-gw3 \_2O|. +H@J,aV S*% Aa)@|h򪂮 #BL+zS՛!V* ;dX9BF`J:xz!2eXa:hW}s@h8gBϧf (Xkݑ~nkv0+yG髽gj#PU*TRD+@&M57<" g@VN)@X{С?wF޿|Iۗ|i9πVK$pJʹ^To9ye]+` ) *NwUMA8Zj4FPkrTYt.aFj̃?{Ნ\ze87<ϝAWy/[[;ns~sD €,g> s}bvvvǾ#;v|<EeKolƅ%m$U$# oz@)RRu.xJ?JLjNeM"XgnD18J*=4Sd*bՙA0 {! *TiM'gZ;W׏[9u 5VV&[Q=Wͼx!&a}Rẅxj|R*tV+?c`=( q&o}=ڕWt^]]'6(&`R;&ɡ:mF{{;' ?3" 4T tWi {nH:[="0z:Τ:ᕯ~k SfpQh\Q)uȑ`G Q'DCO@^; S{¶>j4*70g[X5!yվ] _ә7/V* v,|W<0M`WJҚ4)xfT9ge t#;"$$DDݻxrq}7uR5b3F~oz mȉvg'Δ>V,d􁘙",Tm0) )#R4C1{& S$ Yi}c|BҜ&IdҬ$qf@ GzdjfRw{ӌo;}m-g`3!-A1 `-Dt@CztP,L?x$TDei* :wu)Nd@J3NS "*1 Y"aJ/0AD<*"!IUK@adTHBIi0Nle,r| y㱽4q*s-XٸZ3)4y龎 J`aD 8azUP#D 9W{[ϋy D((VX.6V+;z嫱Yff$ {ߋ6f,9j@ # H!ԯ݄&Ղ` P7xhի9pOQNHB (5NDVY^ĔiCVBZkhja& PeѿqڜOhqÈ˫&+, @ 5S"02r;3E=/̷hԗ:c#5zB,rea~wgJQq+Gp ɋ;-A@`:/?w>wɋ/./^$ բD!icNщnOlq%i6)G/28iCXM<#"v<RZU@!## jIL#DZk7 3pnna{?g>xϻVVVtxkk{4+Z2F>77';"rJC}zP^|lXXg,Zk#Qk86ַ( x>}:and8DX) jnBBD̲࣏>C:uj2q"OG`5̴AgZ !!g" ZQ >K +$ F`ܵ_/Oؘ|h {7^u'>~<| 91GWVJz@:Kgq]7y?(I~sρkۗ<%OJlWZQjrG*gه`e`5=É,2(&BB@Tf˱/yp3 ?SKs셗[_1XGZ)aY`0¬,\REΠĹSJa#t a&Dtd@)U)\7jNw[qiF \,Ư'W_Wo}??Hzi\!yԋo< 2ph-9$k׮۷|i]^' +ۅF|l|g?9fGk?5J;㓟}ݷz_|1˲[KkƘ`Eλh4s(~MqEYZ\A Bc uΘXU!IHF(Z[|+ȓlr'xqcqx[rc^|uQęfƵ+Z9Bz_βs7582F5nı,.,:uG|3yy"[)l(=pMvJkeZ{چ-7(¥+G,_8\[:txC<=&cVxdQ <xfTE77E#+/=!\'@Bl ~E6R(`8WW{/,OudLbDK!*l1/ <g UV8 L<@V` juLI8Q@?-0 ( (CV;(;r` 0I:\"_ڜJy$`ήsj76vjI\Iޕ8HŦ`3]TkLP2^x8+ҕRya4Z&QGۏ>G|v< MQGiGN&ыGf E))@HQ XRFk@.CJ+V*%_C}+* (d/Qɋ+Kx{<·gy˧n?~a &2lym5bbGlǚ!+H[Tg6 @ t@dbs\/nP+Q4:Xce;[f+';fb/ 'wr}ѠglܷlQL)XR+Vsjh2:Pu{f . ڈ= `g gw^ݡ# RsW:N1t= CwHwQ"~~?}HP 0Ĉxvȳl\+KY+i"/|Kh4,"dBQ+R4hMݓ2PU= BdϮYi nkMRm Mg/;hݙYcXB\ .-Bg9 F־ݢB'%đ*_+/o -WGB˽f(C)QHJz-"8"2QPEI ɈbHqlfk,($x8~i WϟE`D(gN!#HbIҊ6[R'%{Yܸ;z'`(^Ж{Eyc򗿲vV3RJ)#{_E00;$"CY^okkkii @UfKAB%€< f ZR__oX\\\]]=}`cvs{!h4;ֺ;_wѣѣ!5{w"iZV@$ {NC~* jq꼳Ίa%0{Je?{Ǔ߮%RDQmt]|.m5ſhl_#=W?qw9l8\pä{-~J\kѰ?pD("ɢ>/.SLi (! |p׊R8":ND&٤$A *8$sA;,__NIuwwMk*cR>tCPO7w.\8_7Qkݗe\O%YQx6h78B X[ Y6 - ~=c_&<x~{xukkWNfLD8FsssϡCG؈sLS/5]\Q7vd?V؈H# ;LjOՐ j_&BFbDh4_I|zLK<_7"\{mN^"0̟Nw{ՋmYEJNM|EA^BzN#H^`uӚ M>QQU*b[fMs3sEYIeYmsyFMEBlwaϖ',1[WwՓdrܹˈ>8Rńd/f(Y{'.5icI~o[;};??pyh8գ|* "4xA",sW]IRKkgfǏ5( DR{0"elpi-{l5 ;_+vZ4PY:qNBȞV_q5l>s'_sKHl܁>;;[G g H< u΋ga}p /,=z4aeJ4]\\|?sZk" c^[[SO-,9r לq]qfD~ff&^K1dTEZ-"vK^O"4 ,]QHVf5:b$%?NblV3ҨGZNj5ԤdI ֶU :2xɔll2QwcS'9 {GwiVꑇ5ˋ'ꩂ<6[nR`˓IcS1v+ͦ+xZaoi1A)2n޵k]km<ФD-vfnA1oM2E_wˡ[޼+woonvrgcbzmHHR5sj j٢PAAaGOUFVAd 6TD-m/?/F5i;fP (Z1~Um Ia D *dvf W۷^[Gi1u.(:C4RecP7[3-{F(F1LwK(ق1o_z;Ù^xKk׶:Ɠ1(:v1&12 3F zʼn^ҚANzq\ɑrB?KDH 얠A%> IPS0 (EeY*d?f^yr2y@$F0xdBA!z=mҀotdy+5/MZg8;zã}cm<3M&nwnvv,&(@!(9z~<qMzgwvassyDQTռɤ^yiR/r7Qp8t^N9z3[*"E=e1oԃ `yy9Hr,{pzAGD}%2+GiФgwQ}V7GYqڵAl &a8x<7 yVRMmȳ/vh/́(9"## {€1"#8F` ) B+ RjH>!z| ¹b= b< [ Ui <?ōݵ}FQN6kˋsF{|hl2TXZjZ2,A5 j[orh'e7/[hO&΁p{ RD5%fN/J@ f~{fDkQR8Xv1x4GgΕ8%Vk\@^=x(-@d2llF(K((8l醽a:&7>b̌Tf*5IJA6UvPՀU\2.0`bHhR))'t}/2rUqsOa}8v`&R$IͦuZ9o SSw }Q0z:y ׇ5[ba0H~c~Z3z,ݷo|f_W0*MsveEacO,-.:Z4X=r[oUO~2IqfY^r7 TxvUT[HʒD3{%s#cY,#'|k $I?oFj:㗗(x@BHjC#Xc.KRnعwm_ϑ#)Vy")JI"8١TBJDK@Bn6w]Wv{}{4f3u:lYnYޯzHPȠBēI:BvG@A֪ek;wU}n'=WVo?{ Hܺmfz~ A}?Gp8HB}oLNg&=M?QsF%3'<7*+kio´d@chue}0X5E=t%;=PѧvPFq;iR9󁒕j-ɋ;wכ͵NױD:chiyި; ky[6Yl7j5W=$R\J"tP*I2B8L((@K.UJ켷buEw55ַn馥ΪҁcȋȲ0ژʤ=??75=YEYιzwn}ݻG "W*OqQU*Qdιk-oQSrqK%d (Q(سRR !QFtٛpRK]$$#^ ,Jh;`䀀hgzazRjZQOzZ> zVRڬw ;ܯDBbWku^{onRT)Ȑsf=IR+`ՠb5E[p#fom,AQ!J:kյU%U.'V{bz3O~ffj8mz,G XEvt i8c8ڳgz R6'a\=z쉬PV+f|]u{[ˉ{v/7ᵟ})9l6CTbbDL$N+ed[v a@s4/YV TrH) u(d@NPJ@@YoM/*x$d#xɵnevl ڷwV!3/l6h..ޣYv/L- _]I(Ypevx7L pA:TaAK` v${ #J3λK!Z-3(ҙY!ZS;3tP}ō-{aG^>_GMw[:g%3{o7\s׮_ RMB)OaXVxcLSSЇv _>,M 5?K[Ը13Jq%45%ݸvIPTب2Ҙ@,.k_B+8=51ezye?20Z}nnLaAw5wuWp?:kQZ (ęs@b"Ϸoߑy&yn֡?-4'ƕ/a+o:mT1?7]$G}c8PVۖw,/:J2cH arl0 Yk8G_۾}deå\OKNo oW>=?լ[>)bŎw# aVtcDJ2@DQ" 18)8#Drr)ln ,FPwX {D+9D-IƦ#+')JCyVI&HR"eV D`%;p4^kʼy$m0*o En$ٽ kD]UJIUyzՂ^61Y[Y W_5[oZtPfPZJn3O~Y)Og~I5y>\]Fqx<=Y ]'"@ P+Qè;sr%JeN6Vw0Pvk}_o}ۛ+v CmmQ`(3%ed=S0w]~m=ooZj._Ntr,q7JBf8tG QTmZ33[j:HZ)=o֓O>4W)Hf%|8Ls0IɀAT-kGwo{̙O '  ;\ESjBijl4"/B)7Mtd"c"*HԳ0 ծW_|DQE*' ' A*@%5+wٿG>٫5fL]9KN<}t_~۵jO0Y^?p-ԱYe' Šxv?=sgr&=ɽzp>K_3\v|t2;xD<$kY^93=NV2;߅QS':+<Әݳ2< p.MlJ) e9'@x_ZQ䎈*8D($yG±2V!tDfu3JpNED)W E.{:,¦@)YYҺE38q>8b!f.oK|oY$\N/zy^)zY(5^`{$#Q^ G܈h+Gc-h ,8č1̔]\ܐ)r*2Hl)ۆij n5oZ- 谤a3BBoJv^FAAsZa 2y^PJ{v/cO=] ;"3ynҪ7OLL8aݥr.Q,"VP9w0Ŏ'ۭBZo~fĊTBSS\oyȠB°o}㾇{vtkVv:z}J^T}Y#j||+_YT sZsAPyItnJN5vδ-)3H!kz Ky2/ðR4tDcկ~M)mLn(ߤ| D쉜Y?; 3gO.-yr⅓J%όb~ێ~o3fcao̩3rx719y9&PjqSy3S^7ht$ibSJ{)C}# BӇ>?yd¶옞GZlݱwhf]he޳,#m1y]@D??ΰ=;J3ϟzԹOMf؛ ^m.v2%*?7wĶmo{޵e٪9o&]îBywLocSxn2֓Z57hQdi}3gf̪E%u6'O)][Yy2=B.$LI! 0ˡ@w%5$8eVD@d}0;6*?r)|d9T;lR`5"-\# Dv12p.%ȉ.d)(؈/40e83d0QV##:JGnѝjc0c6x9"ؚ?/O=e²Ґ]aVJrjᐼ1:+ŕ*0P>hN oO) `E1 PvQaX?t;杵)SaK!D`ރ ˼w1Q>FfDkj; RhFA(:+Z |V#"_r@ O>SvsvlY[[( ZX h%E}k˞?s=IB%;y)EQT:ePeq#Ž2k"]vRJ !RVZA kPy)G>O}q\sy}_ X^Yյg;ui=|DͲ:5%P_~{Ϯ0 $9dv,7ԟkj/Z"}*1B`Z(ܑa "(֪̒UͦɋF58wU{o7"TBI(PPIHQ-7}?Nggރλ^_oa[D &ٳsKq4~/?zM ˮ۱ֹ_O}aj1̶e5Rmsw]qgNw]W b ")N8c]{''@UP. r?0_JO bQ&BMItEAq"w̒PT̖ '*E:U*gm&YRu !gɲFV(HDZI%/T:He))zD. 0cDz>zP 6 foN>=g;9oJK+2RJEi=qVWx8E"6ߨMajb/=t$"*(RAJ(@_f_^o67ÇvR 57E tjZZ9HTg H\5&{GQ%0K%DUH$Qk^_~h8kPZEɓ(FQ.h[W~~b8J}/ژX\Y\AE8[S9EQ\3. /ja[[Uzϕ{w)@bQԤ$i?lĚQ֏ c2'Q`io, {D=(F d%{#@PpP]"$ { IDAT"^8$@WFJR2D.ނ? ?Hlm)*&X"U*I 8&#fv^|xd뮇zZ?~{>K)O_9sv8}?x;g,0B_暫$ɮoP%?tCd`kmEV$!nphhsyfLQc`bRsޒP23D:G^3Z,gg,+r1J,D%wPp8̌uu8B!T{ W^[b, (`QzBP#,4,{i {0q-rebIL}ǟ#s[ISzQ+_}r0|~]$twoiA"<>-]Pb-ksijI.hJcbݦ.B "jVݻ۝NM7x☥ .НoY8"0 ėX0D`a-K=XΓ),yЁNY똅$Dh <) NL`)|`c' R1h "< سgJI)ui=i&bgYGXpDQ)m6qX& \cKQ:U  qq/AXh.Rp2[v0 TZY 33S'=q3y60O`/ ۧx?rѡË_q˭3ӕW,R2>Ʒ^H+#eZfoSbL}zZOڹq^okF4\{{wӕM {Zl{݁K;fՅwήj4d .CcALH؃vk+%*{ؐBy@ K 2yJ D2KO@0Kf!d)&'BNJFZwz@)K,re牭 C3!7"?}#㢔,Әnl2eR0setDSDQ4쀌 %(,N>mZeyj]adj}w`J(3 Sq;v<看hǎe yOB(Av۾/ zK+~?ndI%,Oȋڂ̼#gAl  &KRm1Dhx H*`F`$W=K2!+ 1x"F@%jΔ^\n,yy!˳+2nZݲe̹gϜhŕna3Glz~?ٙ:ؽv5'}N0oUӼ|r?=Q \Xd &뮾#+bnn-^no_+j4;;ټcoѧQݹE7{oC<} <8谂l@P <{ 5+)SX&A=oX)P*,A(,+˯K) `7@`E d# Pcȥ𘰗,zG70@&V~q ҅q#&&_}0 X 770y1l7y~6J^`~ءhn( %%Y)I> b2L?LMOrzv~FVsEIDM#}WTĤ,MQ l5{ٙW) f6 zݻ8njJF< ]>lTfV}NNMd(1Rubfv`^]Zl; :$Zl9˒vjiz cLǥ-(yTX29"AaNLL0SZ5ƔrZk33D{w}W_8ydV6"(%wbk^ݻwۭ*S.sf B׼'|#'olz-S{,3EnMnMn k /?oOBXLca$X(Ho z/wyO%H؂ED୳äǀ 'L$IH4 TRZONH *0y!W֗.&gϮ p?}w.y`|br6X\\޹3օ">uuN6(' g8D"sn~?>B׸g&'g_<¯Ɩ-ՈMw٣+S#m[]oM5EAOwcMټMн 4sh|N.OMnF= VsD䋌7|p m\sDQtͯ OAiʞLQ\sxr) Dc~{3XuMMokŊV%ronc $tlaa˜"+K)gͥIBwΡRu'w.lݾ=&O޻R !=x淭c9ѣa{՚3O>uvKDZ)I^ ^*;///'IcaEf~R* r}߰JKUAh0 {f7xشd*kn=oz^Qݹkh[k."CwZx[;._Z 333W]Mwݚ8˿JgKD A 9R,fQv֖ҙ)I %32`*ޝ<؞ 1!o5(Lp~m'$;L{,m:35i"&sK,A䳤[z¶?剶NOJQa^ ߿'o暅7;mm}yD}lz ao\ / )/jsG[6;ͰQ.Rn\EzE޼aF71hq󙗹P_їk(ø@ǟ(sV9zdyuvzd(#QW^uk_d?yS'kAUמ:rEqN)YA2,<8o'EYf:t<=J5wޅ~@Y?477WդRA6X[:zn B {L[njolQ%d+Z:thjjVYk7\-RK%%qEkUVoQrΗ%EJ) .,{Tr%@ $(%(MRfqxs;DR2bcT1"Zm%/? dfF"9k*cmOL%>Kdig1XjD&"ʓhZC:$ɲRTH鐘v8JU*kzGNṬC~l-F@ @D` kl93g֘P & S kF(g3a^{n J38UQB_w Y ' u+<j QA$ QjSX`8i0ҾۿKs[Ad0>Gx㵝&HpsvZ'&=j$8RU_w?21bd~)/Kr]vYts/˄/=楘Ky&X7]JjW+1;^kTP+- b@k5ҚffZKlX2%J%T*:Okx[o4q=8UaZkabsn*e[XXسgOeY[nm6û9eePE(K%(.=e)d%Qk$⒕eC"[_~0cFWv^ ð 8gZ#-B FxHcR (kS=rǎ/ŏο/Q8+mzE"PBIcpE4KVZZ)RRZ3LM|DT5%1rFhWWاΝ[\^fFuZ2f@GtIujό YiA *A _wuMS!#U2J"3ׁγdb" r`5IWn`}P?Ԟ Qt#Yzvo `\k0F$ɓKsŒc {/cJcec=w&(G:Ѐ `D'0r,y)nw޳ԝW T̔Eyņ9B],y9GP-&~Z~~~X^DgϞ;sn Y=1;kR Qi31Z PZ(z`7{$q -վmIEj( oF;Ll1b'̏اy;vCfFD A$ 4._umf*H@uխ4'Oerj${t)R5t#ts)À钫u+BX-v oW$P"Pa1*<ϲ2ah8tXdK%كsH9(y33t \,Ju\XȞ2sW<4r{}ncB UVG@Rh|{o.`*G|R,cg| }NJ $Wasr)/hXg.gj_TI@055왹eb|ljD g:)կٯV!Cv-{nURwDsXknc\>@|.Ye;o'?YyqC&s=w7~!mvtBqOE|oF70KӇ֭[oamSo}[{7ucccM|"e_ p{zzCLG,79!r\D TJi<

go,ek?VkYǧ`U3:Akќ G҉_82iGE|:rPi#~ __ aP"u3۰)xÿ\mD$TRX!eo5mlgV-9ҒH"HY;;nr}yqlIt][.*]솒oKFU(={~:9W^jj6)tg3怺 Hc4ux*F7Vrn_eO6`Sav&k)Ƀdׁ!1n?c(29B?~ʝ辮TΨ|wv2vv}m\TmydXn ʚ h|ҷ׬%wURwUo5?빈3KNΡ"ZciKG")YIā Kjx< F&%Qid! GHg|q#2d\/na( DM.S):e1%Z2vR`H^TC9g %UAƋT6d~VdVlj 7q K!t>^` |FY%`?h]pT |W[8[ /O. tQ}e2$-9-EַDC)dyMYYOsddeb<| ;|kd޲Gq; k6Ҏfp+1j35;ǙN{iJP3DkA@mPU* D"/}uzyxC*U݉u$g'D4yhO.YUKv,ɒ*.=ڢE휹`~jzE5M)Ror/3z%>j7+ CzS8N \)4T:61hP(~ֹa*O >{iAxyG%ds rAЗTB tyBns@ 5Cr-*!F@0>9bT;YU &/j?s>'=bHf$zAC[^!vOnR}ɥ^6"BU=L=WxT VK@5U k9/@=:Xͦ Xæ<fО7r {3 `H,<,j#f}\`͐# w%yӚmmm3|}t#ϱڳ[t:ηi+*!ԾOޅw#xBW f1ڳx|_Zd(3BF.<˰@Xz%Ā:65r90ID k("̧DʙNHMSc>=x? "laS ,e1գDnpAj_%fW˜ʂdž=TקG"-wU_[?-ZmEj=Ky])=6J{T[43u77u?_MFzl/k_h؏BZi~&EߩM /D9v=o+g/жg2dNv+o{}?\GJr/ər) ;Xzyw}YV˥3X󭯭iNd+,3Gήc.ʂrD!v"x<?ؕ \I)DZK d/V@J5 2A=FQr_'@n 6&O-&dQPN):ڒe֕ *U \{ ǁs{L)ւ3˽['tp۪m<te1ԁl'+YnSܛ)۹ݴ)c[u!dS|@@H@[WޠW퟼@B RO䃼 7$\9U&$.g)`# ,GvP R`eH={$G$`wԁt}r*uxdiq`7U8X˫`a]ɉ@o&ly5DŽ@Zv{-!ΠZ'f 1T>N&*ʈWRǝ^~vzw6;$*k{:ڷ⡚so-6ll^}G68o*Ƣb/ݳ]TH(<6Y .&]NgSt*{J_f&00@n~;GIC1Ԧlit&w :ש&uĘM(0+JpN:@nEsf]b"ODFS;voeSUx]e=}T'n#jO{ ^n[Bm*x%cnD{ovI_Hi[>#Z~>Wʛr/ƩRU{ ,9?>/s`vUz~ްM`_g\gD%p庿zW>|e' 0IVo:/f(zTN+ X':ԂAZJ`I@WyXP7uM)VwzP^%r G氓nҝ8$& tS8smt#|*Y@OΠ;>l :y$6 ep\G1332`+9xC")X)8d;YfR 71HcHIx:_m5p-@c|X@ Mp3P +VmxP: I᧐|k||&Q7pۦvy)*ycbeҳ+b_?|cҊ+_8||ǫ oyB_cWWTNƖGץto~{jhh.Ƅyٴ3o&|svxokn+^t:hٴg3q 6>cqP? *7o1x {y+ d Lf:SMb8G'w.LJ,߹}tXN쓭{ qQ%o[iy?߼dش?%.s;Ki>ŖΨS˯'X sW횃uʿ)V5밭:\?~lLҬ][zl<⌾3 xw00sݵ>6qM OYR/eBbf 0PzCXݶ2AtB;Js@38B~`_@>YX@KhBI}>D_Z j_3!n @ IKJUvh_v8)qJ3S{O=1P%յԼ|C6~"nXmT?RrΔȏYz}(Dw(%$&LJ_Ft"d t#{ӏA6~f {uV[շjnBrp渊_1omS]5xgJogG.Q\Y5J/OcKMe2olj_/<ŭ7&[z|ۥ@00oO k06)&e%J?3KiSaJtH́z?Zso:P $PZ8:`mMi|EUD>ƹATjknwͮlx5XSGƾ/-Ngk($N0% |#9A8(ex .ZրRHSIsjjEY|*Kk5>@6x(6D.H5"}뱀fdbkĂp\͙:!voiW; LHeܮ:`;" 8Xg4WJb$ *T!IǒI$9(8p+H?QLt*UWK* }j=x7K&B԰Z#&s֫ ܑO&{%LU]pwW.Ew=mUrmSbNem«aTͺ2B^XUF ^9@kLu vSp4L\R٘nӬ3O)JgJS/R+9mq=ցay$m=&RͣX#ݶMXgŻ w1}3CM/?hWu=Ai6Xv#:݂ٛAtLrtB1Du@.URG@HH35 ~PG׬H:UŴsɯݣ"=kۺoļj>>?#v:-0(wm襊sro{;;⮷oQGcO9/8LȞ'Wx$q1'Ӊj,iIkPQD2ttM5H' >|; γ~e̿</~ W i Jvɠ1 Vs~I^c"&ƏqǪuǻ[+tM|xXظv|󖪪ի_VX;n݂7R1)Qg/ENV[x˴WOkct'j+ʘk2_'mg2KmoFkt&sLꆩ0;HXjb"Ob< rIO^7\ZozEIe1m/t>~p<[%+U<]=樚՟W ;W5fS}ڭغSeDG5..!c{ƛOG2iG__5kcweN>O|YyJZXЅiE1ŠH@\UtՊ+CWgTnᖫڎ@wrxrKruމK=bϚkjڶ7X\3"ɶ'āJL(^JgN}e}WƬq~HOӬWM7%` ec=`VStt*7%Uz38AϛFZy@=zl<̊9L NIzXs38'<^NR&$%Kz֞n'Dd. Npp\Yz^kN, ȗ۪7njT~vi]-ݏ@Kq:Z+-oԬacfLԗy?JsOu 6 F`_/ #]MIC@}cz#W2U5v4,͊LlLVe˜'ǧ6Ň-prt #sG#VG{9-,lgh?n]P"dlxԺZU)r\(FCWzJq@z@T6 =qfW*uCh)"sſ+>;yA۾-WrΫwSp[h_>ywď7SWfjMinh֙S m2u\yܴ 4.2c]ʝ^x5OɪG& `45L}bMʿxcHi;Qf%Y0rR\ %߱Yϻ7s{[';tɯ=ۺoq7d&Ĕ^ɀ hѡASyp#Bs2NXP>ў{/7#|;sd/)elMyL*D2 ɁHR=|XK{(=<@%jVBuf'*;˜g%&'^HyJ:6?zYqGkW*Sc_V߹s>099FF.~ı޷n2+_ZY'uq7%Ѧ:m7F^(MltmFw jRdX1.:%W|L?SM+t[AQM̹zWTu1v[P/G-~~KC(8dSnZ;U~D('ヌs15QNdN`zU2du/}/s)@"y:.m>bNR'=xwr9=]_&N䎢ŪݶfGout˵_Ԍqx床7߿.[׿/-!WuWN9Ֆũfƥ?]I鵚M@{3.l&k5ڲ׹:nhrNQE *PPP0bBE sl:\9{޻zw޼73未®{{/!0Jk&8N! *f+½{$26/ Zb)$RHy< Ke: Y2_O7%M T䮢[ۺڪB6scf%O) '-qVڵZJˎ['j]ڑu| o( d dPzhD5` o!Rmj((((((((((*LHhHD2"D:4{Q\T~k5t"TWR=ݜX5+ז(J,鸼|{eœ~`Mɹמi])~(%nDÒ|z( Zs?X#qiqALRI=%S?Y<r*Kee>}̗7!G܅ڍq/nZFS$2F@HF,FJ `}fj*(((((((((Р +,)K֠2_[MtFX6^.̖?-_o[ִ .(m]ߤ⃲K+QڊqJsv{+9XMy1[q܋PgWE")訅SR]&&OCcA$HcRTst6 vw eL&b^,d~!Z?O돣^Rr+lRu=#歘_XZVo)E/BgDJ(:fq/&Az! p_#bQ ,+((((((((((HH~A%1(or-s0~FQ_fB|ٕf$UW{ꢓ'tᔃG =rJ עie><|wH ys/BeCRT31'-Q*'E$GE:HqiJ`s YZz)?+L#rxt]ޙHqOgBd^U*wk.||~۽ڨ)guvK%61qq_uZFYLN.>ݬ7Zgjݵ~-ibXMT)1苁@wx= 0aN P>3R l C4Fk@t8@< oDS;@#ϙ%)[v~18dB"0t}Iz'ZٽY{_)2Qq|:ÞֽUK?*Iӌ_> reᇟ$ڒ{S3)> [ɽ_>CkSHq^'n8&<TD2KQ[Ҙ?1̟<3~0`^[)y@,?6 IL H4gwB;́,g&2Zl~'KKhM؂,l6HAL7AAkh;z\qRĊ)Z5XWqA.cHn3{Rh5{qG3f)ov7=aPC3ۛmo[Ze&ډ>_0 c0Z[ Z΁hb:ґ.20 e!:((((((((((`%#&L55x  s|d^& N1pq3+ïD wg9Ngsvڻk KK**8ԚK3dg[Ϡ?w<>ʴdl!CҍTi2G~I&(%(e91ޒH K,]B)+ i#&$HOSpeV (?pϽA}Έ؋HO Kgh|\z]8'x%ӌ(8V׹ц-!F̰Y^xt<^8pEY^(nI'Gp,>;>1 1YɋlSAۮ_----R",bjeڢmb,& ^Ɯ ah/:,&dHA)zY'44(_P &pk4,䍕*R&h,4@a|0"ȱ%qyh)ϓm1FêU y+lwUz]/8^Z^R2|oY󪒮E _V(plX亷[4^ODJhX|qzG,;O?'%")3^(8rsJP  eߓϽ)) "@!M6#$l֤P4^]kVOzӈ-uO/<bܩX|(0*F$O2~nԄ51c>Ioyr5;yi!OZO,ZF@mEh܈[ `d!DS_LF<T௠gEVDzS: Z,BYLwT97֌1N1UVo 1TūJosUzjGwؑPӬqKz^PZ*8k Ȯ.osaNlRH72 G\0qQ]*RB%5p n 6?L2Ke(i],IJSLDZ>}#;L+_[rخkxAYfEct߹4Ъ,xG̳}՗$FSG"ǐ}Ew'fO.tḉ888H &™2q!s*zjzKO/%e"R(_VI91Tnq1?Wh/-TVt~lź 6ѦK=S$W',OXXfc#}bH>K,_E'0gb&1U>f+GoG\ C *Q#*D~|8ċDLN((((((((((A4T54>OX GFPbUn6?e3i }b3F^^,M#_6/8s9(<2Z#qGT?Jk@3c9?`KK<7`qNO<JNTs/ A83IR،lCQ*_7@f;uڞN]3SHֵ7i$ۃx"\ŵb^jwGchi #.Ys`VqN3RJt@gM`U,M~/N>t&TR $$HBRpZ^,K`Ew ya6x k8^$Wul5f/ /W5u!ׯ|uogr̉-JGy]Y> hn\V؎΀x .R'~u,¢L&nL?[brw!Ds`%1 .b8ΊV$(?B%5x b<"H Ch6ڧ}!^qkmVfͲ,k3RmSNHH?~Ѻ{]YLb0Z #;JE@STz*i3ϥ4hd@d ~\ ؀X#;ʇ=Ujkc:]ƭh#nexl8O;[UUb}[T?X׻dEu{V9K^-n >n1fhS?҂JL..f&2,&fO48q1]j*!:G n6b E%EeZs/ 74# pcT}G9O\tl}*v*!(rqغݺj[kf sO-zvmMw ӱTi3؃E4,%vk"0bD4\@-̨_AAAAAAAAA?>ߘ5Sέ|ÆpO)95Rz.m8l;QzH_#mg}מK=KVʊv6(jWސ{֎7a 'G>HZ%4%KStb$ؾG#8<mG=+U?so>?Tp]Yұ$W5| x^RyNTF>D{O `i ] _}\]wࠢF?W^l4:(pbEb0C MuZ'Z?H#^>2b﷾0Pq?J,H j-2EnlI,ȁCzKp lC3q5e¿ ΣߘZv^։T,y"!#l)p̩IDAT޸Co5fowcqٳm6ѵp啛Oxő\wnr` }wmyVU tP?޼5ޑVbP1a9ʜ'VqD )O=8G{p\e+?BQJ{+bOLFZOC%$ 9qx(&% eH%& F'1S 7$|ؕ MiPGۇZzK=ڶ6o[Ͳ5e2],,ra]NL#jDXVfL/2&U8!.2DFUA@Ap (¿A,bĊXġ0e~A *P.'.ӥ]:f`،z>|c |o5W?G^|DA޳eY__⒞.лVbHNRz*A̕~(Kb2cwK_x)fsg>֜y8R{wGIW ,gg=~K>M'i_0s >wF2g'I fOOZo>_?yJm.VY%M<7=B[$,Jp8?a+ qq.kS0 X&Oėb)r1aEGGtFOQT! *]"uI%#?Y3'BTd!< @zW4yQ^ɷ3v}f#󀱹Y. ,[q-tbSU=*VR>OsE$2Է'I"b*E My@Lr8=NJ)^qC`-1W 9n8J*K's֐ۿM,y5yD~Niq陯i]8mYV,EP} 5 zG~|Μ Wawot9͖e5DwRVsj˵WVb{r-Uk1 ~#Ř0 h S"^r4.ϪVXX4F E܄O ]9N^EVȣgfG3y(50^n,R]׻v}u˪ b*ڔ_i՞o{!Ov9cީ!.>mAωso5y͢ߓ~@b@q ,^CH_y҄pkB+ G~GM!ĺү/}KB:t]Sm]K͇b8)Bk%; 'Vh*ÏBI;$SzQkNPhQ~= 1O`?'z+`~ޣ 1e^@` H5mZ@Tlm&%2lVr4M!m⤨a8n RD.#^/4X``@@.CPn&,ҹҀ tLX\K^Ujyl+8Zx}pPu@kθo(`S{UAks{eS*9@ijdq}~PNk6)1EWxp99sK0K/%w+Ƀ$yE R21%JR߂s-d!i>/IigXj=6iFt[mxzA HK z pjqy|bvqYDlv(,3>1Om+/_^IkPxY׺XN|i]Vhl?C@" S+ ldhHHHi\]?DC,By Q*p;p/53ʵFi3ll3v8C=BW6-L 8/?V[V3J?*xSO}tX< ??H蹒qUJEMw'1ug.2[11+9ΉV$+ %x-1Ɉc5(K~b9O=N!Mj}rΜ[O7ڋlmOB Cjtw~iW [k\|'6jbcaSMA!VxO, :mFȂD+k&Lc~B;8#@a8X:,Ƌx|JvQ;9tȻN,cAЩR73I˹߱>S;zT*|vVyj} o:eU} #t@.EMdbHiw̦J"z')9qq %."* 6bͥZ#I_4Ac#}{p>MF<x| {ǙX!m*=yEfhy>vzZV})`sи<8-[Z7eiݗ6I7qV8Цjʮa1ccn}xP,uCcY%+-w"Fm1 9ݖ0aHHC[j PPPPPPPP{CP? ΍ 2:Q#e%>O7Na9^N9Kry1Zn#~SUx"p̿4y㸣{wT]nۓNu>܉޳J-,x.kuvq[w6Mo ,ԯ B6HFFdGKy)x_ǟX/> Gdqx:~Z#3psNa->,/ dxFzY2܋3њya&,cBx EJ4|OhPβ cXMʯ+̕'y"\9׸%O$H8g맶g'o7#kdu|dy3|Zv(Y%-ZӸC1J{IC,lb BD x AhtiJt7h PPPPPPPPPkRKӹvl6rPj>X_;`yf=34Z }J_\qC`]poVS׾UcV?^\eǗ^k閼;:kO8w >{;0ocýsL =!ve 9Aׅ-eI,p^x`L?8_=+da5]ٗ6Ң>'aVMI8-7r\`|sQLnȵg+XSD=hݵk DHVfhƖx'D $U3RG@3<If?7< ;ߞ|%L$LtDFHF?|N>+K]3όFfhQk ek7y.YJWYu+r'~|Wv`fMQ"MS0w`=D}RFг'W+)ؽ=D K{SO?XFqIٸQl+IG8ӷG>L9ȉ) D'ͽ=cL|vH$1W70}]1i˯/Pbo&(_S2xo_n9Eh'I؈wp||&{_B̊ŬK?G&ޒ<"q4\q >!EP ?6Jbq wx솸6j1ZSQD?E>EBcSK swߐ޳<֡'l=3&ʖ-,,ciOZO@k=OJGlUp1z[[˰ [IG7Y-+QH.&Ä& P*N„ ^: BDU؎؊M(/zg ;& %p#2ү. \|ku*-tjů~_8Z_~܇NꍕcLiLxC"G,y-5|%$b AIe?bVOkL?h_$NxH/l*q%GpܢP&f# $5 s_PoGtr  FIbN $I )#1c!Z95%$=Q꯫kws߭[0b?;(f}\ɘ{b_Ojd=aMKG{Xk,-2Z@KH\D((byL?<1v-hK8tB!vt8=U”388oɟ  VĊXؑ t|2!׼ fȑ Lx ,3Ls\dܥ[uGpF謐(}g/+?Y۫ϞB-ߟ]u=v[ܚ_Uw|^> fisN7n16.yYo8;\J Kn.c|-)s't}`Ny9OYZi_ч`nN[|\݋ u<ƯĤ'Vqr)#R#3"9+8ฅ?Th@1KylI"9 A$%bsH+yng<66YQϣAOXlE|'Ya43Uה#&o+05{kv^Z?~jTc^ :,ߜw}̠،C0X/hOY15bLF-QTdh# 0+AnPPPPPPPPPCM*VXa`G bP1F~8P% >2}O}ˌ$ڼpyxDx@w5c|zg< ;-ʶV+7[wT|-_HE|~l˞T {=M[stDߜ*\ȣ}ǒ9#@܅G d =\XBԛgmlvV`Q2b@x\'&qɁzW?Εb8F6hm@GtEO2HdcIGOX0kPPPPPPPPP?*0Njt@!.tԣVVJ ~XZWb >ODyyqGoR>$Dث+怟<$܂|>1߬ԥp1l ~ۣxgs|pIΔ cS~(|Np=>|pGO _R{\/i|EQI|6\9V^^ZTkx{³7[/Adz1<hЄ+8h B|̗u`֘阉GqoxY^+/%[IgkJghZqdm}ߖwԽ[߽(X;9;K-8[Q(ܺy;s+?YW`"6_.fxG1/ &DɜZEq*1sZw%"WӚ W,x=p%)C s`ac%@1{PH*5iMJvo>]"?eŝO=Bz@`i_rw:JQBTF;Wz]V{WF3%@OjiZ m3,uV˘;bǦc[KMVK-iod;"G۩LxHJ*g(;9Ɣ~_3jzG7,;q=5ysڟ|42ֲ5{]ڏM*ę_x $UZԚ z/[5iOpNи\bH,Rw&?)Ti܃JHBGL$d=G8]_`ޡ}2|AOъ~?QLL[{F_p0W=RnjmO1V?8)1r%x{.[|/vrleuj%p| [nZlg񜘧D$#UFe8+z-RT@$ ( JZ'VӁ3T aE8d  HD <NPbAXiO!b\dܧw7fUjjXtsO`LQ/[T{]V.yuDŽGs9PXQUׯqoOw̬`?W͒kh?@Sh֓u \/!8?)T6|܃C?so[~Ϟ2r陯'^[؜6UN7̹歁U[SS|AZimM v7s} ]>ݍ^k ϚݙQ機G< e*sDD3o=Wn׾Q,|̾J,^/ZF![Zq90! $?lwy )Ma1"^@""#s1+ ~0.vdc|D7ljm֘;>U7 -::8n\zk˚TZa/Z{QR_zpz'yGɭ/hf_/J]hW:gw}KV?$W=\=Zpp?JOӚql΅xBO kk\i bԈnIfڧyx)=o&=o<[h3IωpLO '+ aɞAK0%τ8si&]}]n\riZsv E. wk}ఎSϺs4yu K,-,g?bklbmԆ'8cVqC̋S.Y]q+ J""HZG!PPPPPPPPh5AepzLB́OBpJ~/1{(9&^X.暝J)=.uroHpV0owSrIm+>SnsO>1HN쎒K(ZwMޜsޮF3FOec#cњZe%+XKͣ)`yjH>wC|??Fi1i@d/g#@%`>6 d ~h&xAr ӚXi '*O҅m. ]~&_3t J{6{lUK[[VuҘctԧɯ[6CI9R7[eŸ_c*llhjZc=rvv}j<hQr4xYTHp:m"V- mD3,Nj8$HAX h dCs o4#啲oh\&_{ZwC7zSGB/*^4ʧx{3uu/[}5J:M'_OAt';S`QP!Mц}K-Dk2>mZ:b8AšpK+R,?i`VpQMϣ|% Di[lP :uxLy,yʌztA9d$Msj]^h0>HL2N;ɬ\w ia}ܘi~g>NL_۝|bī6ǯ_㮲:s)og[`6K{]ĊUbx]tdݑD4Cs q x!76~[NBbLD:2@#$"q0`r *P&ƏXUy1=rw1k36ޡS 7ח>m)(vWߦ^F6jU1G䧞:sE O+ߩ O8>%srXw ,[/}oobZwm}aOC++<:Zf:rV"M.a#JDZ7E> Eߥ-^_&\$fSsuzyHA⑨Fa(:ӦCG*((((((aEXqǟOv~.!!1_܈AF,eB#y|{L15zA#fnxHxu%hIґEg^\(-?]|tˡfzqˊچW8jTQ2٫KVrϕuBX!ebbj+nۜs<sω . /U{T"x^č{.o q3i WQp; zD)1> VPxIԚZS/ Zي)@YM?wo]8.f_0O~#Mn|eʒL}Ubo}Ym)Qۭ֦t=?cxO;9 MdcOe}ںq3XcD\| @je5*aU@y(((((((9h 6a*ґ FFSHDTG! :gFc']eIgYs9H|f+_= ]Q\h+m>缻 OY xܿϫ\~F#;ؖBSŜ 1~<y7#思<*ub2ێxm.Vx71"bV+͠ iEETM:`ٴfsRpƒ3hͭ.JG|ZSfRrlR%S"\?ov=ixO~Mniu:ZתjW}>,xu/sk\,4yOMnM7v{n'G6z<Ԣ"\XQ $qۉJ((((((( ssXtd脎 pΆ%(I7g2[^\o>h^'q/11kǂWZgkيkk>ZТ2ԥ9y<>D(6`7~.+qw8Ԫ= *'О_{[-.?1~,FxSs?p9 SpZR{G.O\ѧրG+@T3s$H{Y9Q ~l?) Sd"x,zkïw0o-+Tp1:hnkjxH~/os_5m/f͚|5ےD'"R" mq' 'sqID1AL]X6?6\}+((((((p9:t耤shp?+\1 焃2Q.IsYe~`>d d<w{v]~jEmlE+w)[Vu^²6?[XV{g6nPq~+wG<<=¯E1TsB'q7zW\MxC~GnP ~ `FEϧ &BQ}8il!@XP&U@GtFW;p@#C'xI-~ݟ7\7m9O-\vi|0p`Ls{^۾bv6X{2zubj65KeZ?4G^jNlZr)ܢ}׊#fhe=+0[AD8Qziw#""q% D`v9FuҁWP,)(Gy ~Z|mfI!KQ*XZhj\l$aãgT<X?w/RRwW}̜OO~Q~]c>wTjU1L)dV={-,ӬVb<9xȋd28}]S9xkqOX4 K΢5#?3>>oL|%1Y1x3PErފ%Jo 1T<2i1) ؝T|Gә&&b51%ן{4\  %(!Հ -:{}?3@B͐;\z5vf_7xk?,VKmi֖K))a5" E&sQIbmE@#\9 J@HH1` !7Jeݢh[a+eZh6h @kHȽX$_;p94%+4 tf6rM6ui@=K_S9cPlz_.^w žAE_غuksWVz䵢'bB$g~VJ:EI9s~cFQTb嫤sr$K|}6VIR)(P #+AdԋghI?<^ F昖=sƒn7J_t=qg H6Jpcz!ײQVNh~E-vJr,>" %L1\Z|e|(αp7Oh2IXgyFfiven7Ѿ:VZUb3~'ܰѿDShn%ԘA,$ 1T@ l-^5R)dUA,5wk oU +Jx.vʇK~Qpg]SN\uoL)@̞aDf~q}lǽϽ$(,gkg?zd-i\6([,$?)\Q%_Ÿ*הi_[wơ/ ,8Φ}8EZxl>'Hzʼn1Bo1G r_@̽PlbĊ}*Uל~Ozk=Qߜhtcw{6F7gf]l4)EJ{{~0f2mhq+ P9Qb9lh[\ <4G&@>xqzl Ip!*WPPPPPP"s8} ӹ)^(F) ߒoM^2{!ص¨1ׄ;=[wC3e:+n_n]qEec\un' k.D;Wcsc"K|vBs!Әk?ؾ>\Т)TRQϊ?!&%l$g/N \@-EQL)T@-܍Φ{,1|G*_5`i=ΠI%oz?aagB|ad%CH@+tCE5n{?mri_);ܖ%=h9sC={yxdm&5 #t|/j#}]}Ye/~vAiJ֏ep|mIˀ<",| As^;I 8?vHş-z1)i#no9XP+k b*z,?6pK')?h.%P^E|(4-ǫׯ55& ab.*_Bt|I-<$gYI| -ŮF[i+SkcG Z qş]Pړ/)s)}r%KiMOx)$o4=N8׍(|K3XF1'80 >'6(RGLc̱>Vjjb/?Ye>LP 'x萸(i1cqNw'h{G{[&QkwkJlͶ2~k3,/gk#񁵕+d^XPLhBHHh.Y*3V D< ?@ hTAJ@ər<"/1uƹIcCmXpfxvxLuV[~U.lEt^][mͪL*|8wZ!_ogmBows%8pQ=΋?'#,ŽHsJVnJkSbˈY)5O_J(o+,gE@Aɝ5J&Q1(b45VəF%i%Y8`SNp 斁k,Q:AJQ,n=EQKD6:65oTx Wo+I ]brm }pj]f,;RZIw'dž+*`F<%(DsŎ,Q/kĮعRq+:Y+[ 0hhPċ<z߄)DAAAAA 3^x%Z><"W،u؈ɨOJns+z~Z_Ik /h͉ 6cI?|.&e>#fʬ\%4/ 8*Nb'cUěh?_8)a!jA(9YKLLSr%qts k[>.Ɨ4iAӲ.Zdhw.s[j}OzeTIͣZqQ{:~0DP4be)x[E_ AY\/h@z dA& 'ȷuQPPPPPCD"4vCR$":588R?370*9\^*鲩4v`[jfifo?Kjz.+_^r::(|vMu~oV\Yּt|I]Nu|~W6?sz|z\bws@O-ΟdV>WSտ'}:J6{yZ5 4;DlQ~2hXEgl-e J16o6/>b07 o6$=&Y/OTU~{xOW򔺵MVSK%F忙ɹxѧM9@U)Ws\xpÇ1b2H;:Z-|)FqS^Cс?;f}tNHɭ?@81gsWB%`q9b1U#1 Δ8p3_[81&D\Ϧ q=V<&vÉڜ-N'#*yւCo\<+P`n?Tb}iK&ݗ ĪĻ?M-=b(úv"VwE/f.ȝryq,&c: vD"@J?L}]7"qjQZ{n˸ɲl)BWUÎd=E?by*jcc7)aNKή[rY|󕒦g=_w^&B=E7\s r>sྟ Rs=i 6Kz^Z Iq .̛i+T T/ f|NVM Vی窒Jļ2?]h$1hMU0Bͭ$/A`6VZӍDp&s"ϭc&\Fxǜ`yr#Ht=:y;{)NmoFmW^iK}Ϳ/k@M웚ؚjߵi~6-fnZ׬ɧig\i~4,s7>7WВਢ&okGW9YArIEly|R_IOKZ v(^HҎE 9U]݌c\= [ޏ== IuI=BOGgi?S-ٕ\{ٟlBMOQԟ\#h\O:JVrk%:"(6eģJAJ@>3K|&)Td:g|B*>Usr>+>}qsiMX8|lrO̽ys 1 N8`qqP# n;q^k2jһgu:sRz M=(5mU2,=[m\.wwʛe[yVZO _͐76arFE]pÁ_op^ҩQw;utj՞m~|ƽ&Ʌ U=ʷOXbOb` X.Iudr(f}b~>'(ynGOM'h<{LL$˿YOPCf Q|A]}z3s/xK8eMpއx?1I@D@)1gn+9!a/'hN}'1rP ﯂lͬjTjhWk%I'a5:]R)ƚ7'm}{s܄8{vF2ܖ_-3,2kٖW-hqZ4Vk5-*VAqp%@1PxuC ޻g@%2jl/7Ya@Ed"h4GD#@6 @V@nFcm >2CKoe~6<`nwg'4cX}^YK@Mw4΃%*6;w]l my_Ҵ9e|X4e9 cO퉻6meLlX߳n2, ;Dz[`-Vkevq܇ų1hX4X i, ;쀰+ 렑?U ht @ 6T#`_0C=PGbĚFg޳iPXU]Brlʃ3F>rq.V߮κ V"ԡ?.ZK9AwZ{|cg\<׬dbBl:V`yLuIy{ЍUz\!{2t|mfS}<<ˇ:W-^|s>ϱD.~˷^{Ш6_d̯[1Y06֌}Tӗa۸QNHrŞ͡y /G$Q@Jb\ggh# #N Mcj]sj俰2S?J(hvC{@ƭ&|fsF B-llIH6c?N8_ͨy+?DwĬ>7MH99Gy󷊘ZAKG'ըF%c8,Y!B ]X3{!wŸ1G @GtFWB2# ?b5>1`C6 G5N1Θm`ll5>3F8F3:P\pMz`9ޓ]7:9?]U;ce|,m}ıpOYvt{NMޣ}s&!E-|NU*gWYb12@uvgE@DEzn>ݠR.4n0AJ+} S1{dѭ`H#8'^;<_yɺo9Nn{k(w>2;?Hj2)ykݔI{/\}C]jʫos_HޞF||ﰲQ%?d'40XF*dzwz#'Փ"<{YfhQE.9 z$КܢӣVs?p";>*( &pznG=72_L `sjMaӚܳOIws @ĕ [ӣ'Ik6y~~W&X@@!`~.(Fdvc&fD~7$L]zl&wʵD9ټ[aԛ}̖Ƌ"=tw02aoc׭/Tj/T:or ~[o2Y6CXֻdo@ppȗM٦*R.<%K/̆s<s?" >R~ zds֙?2V}ķ>NFZ=\ʾF܏(6ON  ŸX"o'<°S8DrڠDCD 7 H;h7NN <aO#PF! ysgf=66|WQ291/ԉіzyq?A\E|exC=دSmkl/ۏdnyȺzOzFkeӴsI)m(~~MIEA\).E NlLC1e * @r@֢|@P٠ rf/f?ߢ_= -8=/F {3,AqBP/2(8)E:2gtiz`1̝.s#s{qhs.7YuMB|cS=vO*[W^|wesWXW}~coenydg 7gEpA lMýyH-'S G@t?>+5YGAS"\3##>W9ϝ J_ ,&f]47uMf8@ q+K\ALn%jҾ5Y.|#d8-Z^4V"܃R\O2*Xi spļ֬ _qiK=&MN)H^I|2q|ƏweLxlw\n[n˶ μgz[|L~f:sКhbRl0e5AH@w HDԢ̆_ ]`KC/2W x>*#1G< ӾVh6ҐLupATuƷXm%ohll=p;jvaHT_nS4\z(ԯfYhW૵^69T7QVw9ҹdosx yoZU]^S!ĤHD Ϧwi swSfĺ:d6Zy8s@sZZ5W>W*ZR?qd'͟Qϙ j_ \Iy5W~!oHP Ѱ"Y`dLze#Nżϭ8! ߐ ϙoAcmؘاcwwqf-IyГRyPN4kRﯺ,6髤Yɝ\7ɸ'ge5IMv_1;sS nM-CK06acg_vG똫bl+:.5Ѿ~ 1*:pe ;Gc7Zj 8=>0_~~atak0$P 'q~쒻NZ7>tB1;d/y@n j>cN5y)~Q8bw<;,?.}[\UzosjTV+?V*oTvޣ+>()xMA!cw4fr7؊𗖜Ej27 }tNTܢȁ3I_*1Z/#6cedҙkO /%b3ROkrgϦH2x\E~bb+.ϴ'VPB%J+|v+뜹ޮG@a?{D3O Ͳ{x|_tBVDyH9ͮ,Qc3@&ߢB|(V 9̾F,v_Ry[zx'%1K9uA~=xt;sH޶mhVgtE3bZnf k _^/ <VơNdrLdp²rM #qTl f<'ߖ81ELq%Fbe;.{]8=h(HA R/1A f l8iāPPPPE֢cK '}pYTMpq|ʑlwXU9]P7x碃IW y*T/7ȯ2/YcHPǪiMnOOٮew?xeKG^O>\%?ػd̖FUj\C~6W9z8h1Ke\k7_K);2B74A5*QIJFVt#6,B'2iͭ|NIknM4晧(ghӚx|K=l'.RFŸ*W]9cbğmSO 912h}ɬOp&{>J?+ J1Ix9[PTc#Η4Ĺ"pC<,>ЁVA,F_ܬ܄z'A#A߫23ꭍ8cQgX6=[7\e4{|_Wmg]6F;G;aWR-[KM,Oj%ZS :WZ-60E(%bvLR18 ]4BD$c|jE/TF%*nE"ؤ鴗W|JQGEt~=6d Q=D&8!>xԠV\~<{pHB`sd;2\v2)0¼lg#leN1;AjɌ5yMcyx}'Jhd躚Vy׸ެ(T{zc ^7muG+M~jHnM;\nOnh1h|9kh~8l|"6?(/6u ל^Qm܊u'ˮ=.q!2JwZNHz)>iii N$uHnK3nF|Qocݗu}}xMu }icVgoN|l>a6֏o6tJ?U * -%P8mW~koL͎ ;*G꾫P7+fu9;:YKhzՖ6+*v>w6 Ӹ!/w*Zs@&q$ 'E@\€gɅYKe-|ΡsOo9jZw!~x-=58sۯQm+4T@n@3Qs=׉='uZS!`#,C8}<(PPPPqZy h ;`KqH@k@$ IRtIHF@:q)Rc<%bZ`6Kr*}]v ,J LWL[`+;>kfy˘gVO5aghOи5~7emOڎk}_tO]ѝr޲5oǣIy[O?9$p߄xEh3 o q;}tϕzv}G*N%19nms$9ğ-TZ+&&1b6?VMaSgrȣ߯=d:yQ9v=qdc1/ p^seB(2>X, d.Z&:]dyy>|W1fZXRP`[nQ>|qQeWI`}%q=NHk *R+U؞/p2 Z9X?x B% -?QΒ:7۽M?g#O"3Q]PxFE7Y,[|> A.N ¨t2H5*@%*T }] Q\ ^ƗWqOfnt"۽@r>tvTٽf/.k.32sIeI6I}I؂|U@͚LUS]~]^{^q ѓjkWڭtUEcjyѦ~J*[DҺE]%W@0'%zfʥ}YNm#CX`XQ(ҜQԏzc(N,߇ OA2@d*kSdbk S}cG$@^/ 1e{gb7d52&#/Lv@OtY AgJ h{:<=-b'+ tp .hvhCpjfjK V?9Ì]VTS%~#s?y.77&< Ux:?ZY5$iqoV[ӝ3j;_4Y›Z\{@޴Gvv']9>GOA0{=[WkRָ{Twky\=ç`+u:UbE vE/$nujڣ3h* JF1! rmTW4&&| >|]/Zy]>KjL"Xآc +RX5uX9zsܨէS33Y?HNt׻⏺;3kmV+CERcRͶK\0qgmR6t{mK6 [[&]>cYکu\dyhSH-O~#~^lODۄ$ooNޥ ]߰>޴#ts]`1XH#|j|S;v-b/if #y;t7)LU'A@!iΣ$, DJ269s|ׁa3^WQ2~"=tcW Pl'+f(&c)i-稗6AP&>?,KD+A1e L<<`*jcz5x8h~ΰ&>zA УS8df3TzmQQ%?>\еڂw|/gܡMZBW.n4!20$pd ;QUe{}eݪWN̉(&$4]-RԚ𱘅/ip^Ujz\M ۓqVYu-uZD9U_:(Y$G@ uFu-pY] |{׵ٳE<5*Pʒ<A.7FJVl&@ӳxL?侄W9g+=&3SGgbOEtctKNt<]~M^gn;սv {S^̚'wʓmڔ^h#*^uDWx |Vqs_Nl[qZJCj=}Cb{dKb,?/cR5Gd/c2ac¶38JX*H~v sP^;?^NU``₌LvNIDATÇǿ|QQ%8mnX2 /`:^$e=_d枑Jd\7USć/ED :-b;t:3@DSK<؎Nn>: =/Ya:. U-V-uejRcܚ=s {lj򜲜E ?FQA`l  6.+na7.\f _gno/x*NN.pT5՚5SݮnɝrƩ 5: g_ ܆@il*, k @a+&ն΢\5F5A @Rוhԕ ?Ç=X__:~ 6lB@D*E 耦h2na!PJ{zwpwӃu{>~ɽ½4y{R_Wz{Mt3mP{ssKdF)ukwvɖdgW/,?4uUuOkLxh!5֢j*woYJlr_?(_gP6}p_̜3/Ɨ|<.jfޫ٧(`3OkjkKiA 8 p,\I(x 'd2|Cγ]>>|A~1rꬒW5l+("@^@T~!}0Bѡg)_T-)wJJ XI^;q_[ϗ@A z$((~ԩ7\;iy[ V~UQzx'?hF'7Ϋ!Fk );⢧ V_Э˖~#ru+B*ԭ$0?XlT6-,PRz b_=Z8Ǻ{YgZO[Xёi^T/ڣ F[kPj""X*TůLoCÇ~ўc$QA$t5"y~C @QVĄ)B!`f}휤|=;{;ݝrgskCDgjU,'g.\^"BIz{Żw$U윸4b@㵏U]oMD/ I^8&5vYK^z$mWQqYj㶎ؒNᓵS^j_580>|cI vAyiIhf>gyz9)ko.rv!<:ʘ<ꏑ1 dckǀE 9a%",]gv5k}>|+~PSec{AyuZ6R8Mm}?\tYJ?|KƏuEwHQd\RX{Bs!@FdFDI[D܌^ {!Ȣc+b558J-}pd?t5էd*gm|[isJySKs7{54wBޖ)fd| Zvt^xھ{ mzf+(,+EٵF~̹7ؾBovpmj.ѵ.Dl;H`W]UM#ZG!򐧚?U jPhfm%jPr!u]__E|ԕ9H4 42 $L"ɨ@9c 6a]Xe:X% ˰XX 3G^#9Mz"y{{t|O]sߏ^\p:T?\g=sNfLв5ӏ({2yqeKXXES5WO(;l[>8y㒵̩`mV._ց[7eJR7I^ἕX_յ.uXa|ء};Xqj+tN8'|#sXfiU_BtDtև"㘃Y嵯0 L,s7-Zqx04'#5L4 = ~Hqa2 7缂_BQ,}&Vc>?I>|y`;>Gz ^=RzG]&e,2pŪe,z /|j x3[̨=3E_ AQH2(d xXjE{%mv텒hg{A=rϽEҹ{❚,lעy)EÊf7/霗4s9 '''U:(bxP#{^ Zt=4=Ǘ#ZWoy`#uzJM 3p!η@ 0{/T}PG'tQ7C@QPH:# ggf<[>3"+8W78>|uK A~׭!0jsD[͒8P2 kBLguj}^q@.=LeC_ '`>">YyKWO] b[>sNqy!kM̌L7e_O^jgĞ}(:MUUVn+æO*:q_TߔϻkC_~LέxQE3B26jZ{g_jL"E뇵^M>k s{Ic)9{yj22*JYȶ#s)%ܞd C?e >|3|KV5ţI͛B(#vVHE c 0 kY],?W8a,~LBJ2ˉ=d& Z2bPu.8kR;^R||L˵CH`7sv4l/)\|awrwmŬpp2|xД; L7'sF^iߙ;>к~#wUmY]UWo:ɺ*ʻmE>yC!7zjțAֻs10;.]C0@'tCLb ؄@TbF5qʫ+=u8㯃: U'F(T P (.b E9h&h ؊-ʱjL'b`Eߐv{q$tp tKzWڝ;m>\սӝNwb=;&{3=>蜒[Mf<;/{e̊SwN6JL=zlm^^#*T^S1-{>eûw[}iV^XyAoK-s3]<[ɘ-X&㮟`^7RKsc,oOTO~{>Խ=6lv'n𳽞$؝ƼVDa%_IJ!3,؎?Eǟ?ǟ:[GZCm}nK}a_{QG;ASe 0"!@>'Gd;qٍ}Nt!@q &[rL P8Plw{~t =l ]6eUh2:/sJ&į*گuتG?)`#DU99D> WD<y!rWNqԜ=}nԼ᪂!_Bɢ5`yq$=xVpJXhR|@`vhkߟ]h\sZ[[P\:mTe*PmjEc db^(HW&YZ[?Ç*v}J dwM-H`Ƕ{ܾFGP lgAx3~c6?ғD\)D/ԟ$\=Ƚmאָ99S*XvXOlUwezej*GfLSyCNm?Y%:#\* ŎL^h؞l8*JtMwL옼"yQb}ھ55ߤU}SQ^NRѮ| SSWoqљ'Q JikPgɛ'7k kfY;vz {OSx,''Q-]~Q9_`{?ʘu3-/1y,u) Uȇ8E3kF@:7i2`=3 Jj PP  ؋س߯dԽ3N> h:x!IH  H P_Kبd2D5Z +y.lcx֒C7 .}:4Kk"K6~بo^peQ% (QPY4)yj47<,RUNzAr BkyαUUc#0B댜fj:AF/'j=hh.( m(F1J QRu QR܂X]/Q\.sja+-vW_}gwWGgm~2p͈JWazjR]Q~ըĝA5E5*pQ }Q *TR$2Qlׇa a>R_/:G ܌۲+qn 2^3f>Ϻ/8CjuZ9d[W)36SQ3Lu݊SG2k&l޵k+FUV[.[W_Q5VʲevOUT=9#315~>vY }]|S17fGњt1n0nf+m6[6uҡI_1>^ҽ~2`@`j?k!c =I|OOYyRc=.B|}&o,'Ox cy)3UZߪ|\>|+O|/r_Ьo^2JHMC%QSlD\(l DM o;5TWF!0U 2DOmYLX@3p4,pIE >teUϴݎo?n OiWұ9zMvk h2ٷ͛ۅKJ+ٵ䘼y *90s-4o$'["*Z@(+*WK/YyV0<u6*P;NQYmVSG \q%8W] qڧQ w18Yo8 '+u:Fj?p,F[Wb(F8/SuBWP|ВL RU3 QGY@gdꬃLv2 ADC.|XP6oY;lW#0~mg!ZDQ Xsl= Lεz~YOuOkǜ=2KOOb#<ГCCqn=n}(;鞺w#Ou&跓3aDȭr_vo5rrz8~]}73zS:)gG#oWx4^S1fTuˏ*pm+y÷7WuVwY4r.6ݪt׬m:Ԣ^ci{o{>jYCπ61&?`2qZj^yJ O;؎eL}&e9~jT۱aа,ed XS}g_|nHǟ*5C}b=Y kzq5)R&,F@ܰd ɉ%2ʼn1RbRXQI26YLr̄Lz8Ut,P6jV*[YRNg;/Hߜ]ꔺ<5ѻ?TS|atF#Us?țt; 6  X:xs{gy'oY#XMrn,[/Z#SPȣ5J}Z}T\MQ;`ڮJok1( VOG=7{a88GD--dD+@-*P:MZ5" &VC-A Ų4QRDP=IH+ 2E(A9աn V6E<@a'䣮@. Q (/v_ @g y(PR4@Xj7c36?^ Yatԇ=t̡z~Eߑ]5S}ppkT\׻'?wmLw#D{}ȹ/֝tw._#$&v1avBL S9>IQĒ 1b;G5jo_;xmXVX|E51{KoLZKX৹C3j֮Hfّ|)zC6 K]>H/K^h,ͣz3]Ų '彩d?߳,{v Xy*D&\7ŀTYN_d~I/?_|F/T1 &"֣DM}r5СD@&48'm9ۭ0uTo퍇gX Uhh d8em+_5\m ;TrwX_Y"s׳u_wQ_@!`*Q0 |=Q[}ĽJߟSW',=$1׽Xw[u!wcę|;崫4<[YQsll轙6齣kG*?D%%:Y/]{| ׁ@U\Rv'd$o~RH1O$pY 2P҇|-TF~Jz+LqBf*}f/dRIU 'nİkdHԄߋmS2 b&TfM,{Kk@mP23bݽ=mN>+Fpͯl|}y7*x'bnﴏ;!O,8:6BxtxuWEEoh|t[swLozXYE%TU`/l;.'D97樢C{7ӡB']85P8Pٗ YZhij' K-K4μ~ ֝HVWԈH&!#qu $hPSPGb'4A.@>ڢF#S})E>i(D|"G; G E">ad %ՅrLJũ{P> 8X9:׾2: A-Xmz5Rq$ǧ}$ 8bx DtETOH 8!bOE 釐&k؊jTc*q<^^}>"'ݩ$pv{?:FtOw3N8)\]"{Ny<0='b S6U O~<޸:v{5=j~rAEQy&zw}OalϭsvO<$y_"fdJotĻ u&tlrlsk8Kj[T3y4:vfN)c ّ+7"ӽz܍kp^E|r/94ȳ_hSeL*8^vb#wM\:1 9 4h氋# >XOayUq|ap>:0_?? `sr"C h (j Ptw־G%r ?V=V'.p1 ՋC!35!9!c)T Pˈ(T7i%:,߇+{WLOO {=1M]3%:'ew=OktxS{{sNpnn6NEŁ%Ek,<>sm\>->rKͤ;C .k}h]eOd]od͝bUٗYWηFXhuRJ5U.PY/qNMHu:~ 'bNj8#q:Ng8X18ُpu:1 0b:L~Ca/ Qb/^Yj31PR F@t/В n2o1C^f?]/kZo;a;v>vw\?RoɱرXCێ})e7o{˳Yo_Xa lD`#(FYe؎Vz^\|ɽ ||]~EvW}Ls,~ΝgE܃7 ^qa~I䜬_x9ލtsxmey:7E~TOsHNs797Ɔ8}ݝ+b9ݜ !M2j̼L(ݧvVjAdm#ëծiToŕGlnhW$k(wo/O_ҏ;u%Tp,FaN,rԌ)Cd_m "fಆ2ce,L3},g>ߣc0ѧ/ X,s$|>5%@i)8p.„m |3Kh?2|> |/d#QH~MD$Ӡ8M,3$R;i0@ǟ=K !@ "E)Qf79y1`28ĄD:6KLax E2!S"nDI %-GXƆ4Ř~ά=1qf( >[)y4dQbr{؅ޙnKP궒J/ktwW o)ؿaɼ+ ~+724(R`ljߐsޞ)j}{4Rdf?l/y*V؏E>ZYOX3vT}Bgk*TkB Ijz;|Jԥ[*UXP߄nRSj\Su('VߨC}'@@zVM >ށC`O5c0@삺e `;¯- $BumSH" 2N!%Z]ߦuK3H3JK$unQͽM=)z[KA@8;4@ dڰD}]vtX]}Yf[gK1@NAB+<1$"x!D7#$hCbò~$"aFe{!MbMD>(~OP=@|QߏizR?#^qܧc Zׇ)__ڪԿ7/uP/OOԟBw}z[Iuз/GOAһz\S}܎n<ӽ9|ϙ엘A[!ɳϥW':K?;qpnTx ZImk~T,|Tm]kYXfEc~݌}?|1)ae~.ky2*tI@*^;=y_y6:lsˌ6c\{OCF3|?F1oWo6 ]{{%33K{|o27)y~!(3s"BBU"u ,cf:H'f(6x,5 K!K 8Q5` ePQ"A9D`[&d'2'01Rv;WZ@e (EWo->9瞕WlLN^vwL-Yx]ѕk[U^:tA䐜ICBn{ڄ~'"$xe໡CÂw >l_40)|U*x@pIO#-[싃c>x()0'%pYn>^f=>Ѻ9u5 ƹ[VrsU[X+rתjc֋+HDsfu0|^?˂wGM tG4A1uHt4(\q8i$@@I9 @> lHaGz,dPr3.Nuށ`2!PCI_v&옉iW8cdzΡW8T_u-6(!q爃A~uClx9r_A9^H! B@;)u6'=WꞀ83rFzQOwoLv뇓nċG!ڮ%n-^ָ{/:׹;#VNxIJ:ZfpvK}v{oY677e?Ȝ헌fUvhf}1ٵه'7fgӃҳc'fg 3+SY33ɏFF&l^WXʚHֲnc/g*zmݰ%/+t-jYg-QڻP,.,loKuy ,xm$e(t)^itaI-^c9}ToIRjMߋ"n+̱_ϗZlsqd&PGEޯ~ xo7lYc+|7FI狛5bÆeTAf;35'Lj8ʘ'8E=f*R/%GrN} FQ':^O1A-@r6^`FO13E0Q@מL S}2(kTHO9pIĤVk5iCBKC,A ɑ{#r#"'FϽ#47'wYfyGZ0!(?Tpv᤼s?=rGF.D *1s)4(@^Qkwn{{dlkʭ |֝֝%,uET^]~6ͰS 4l(T+2ӈ KMFl6"-E!!J66lBkX Veh!i.mޚ PKc\,b9N1VBY_(r8y 58-Jv] ]A! 4r~  4".̂,I"%6+օ+ C# V 'pP-̇Ja4T*)aE^'X&8p`#\d8pb,_'vص¼X]gjo k," 1E]F5q&(a$] xdѯ^yIvzн#{;N=ƭosq,:u~||}ٔ6{I4a>32{d>y,9$x]j^ώ[vTt_j:Qy ؠCɇ'fOM'x+֙Y~O:&'u;2.uX2nNX̱⥱nѦыѽj׮wߪݽ&0{Xޮ/ ߅1+R燐(&Grfe [$cj⬭k uJffد7|WzF,)GƁ4kE#sY2wֿ>^LT\g}CְS]v`h( ,p#F%ZL7 + ) `5xޛ Űe\#0c2Wlo97(Q 0/] 8S2d yy%InMLlաd$gʰ [\]WA]pec]Jq| p k[Ձ^\p:Rp`uq9%y[W5~=~ nlKZ kٵ̀=;:ئu&hy .?3Ȝ}s&t ϋ?099;s_ ? 3D;`fO~`n"g:Vj(*TihP= FB;{5V!h].V :`UUO슞jV}Uk`wŮ^I]]uE'tEgujhvN;脞zz m6@sfD5Q)JzmmkhVh-V=fhZJp(F:6 @rp"P\5G.ZyE3"\@e#\e#Ǔʿd݅ p " 8F1|$: $5!E qG Ȣ LZ$p?2BT߈(Q˰[Y؈z$Vc`8a،rlc(ÉzlVlR*,b=+~eXEY*,/+J=Wrtga9~r*', G%,XOwz}BN",·z&~,pga {=[=9zu7`*Vb#:=3҅,}@oK䞨q?MNrw$9Ψxs3Й)FȮ.Όy d&e:=y@щ+֎>W[[uGў~Ϣme^n.Yt2+ӪꡕwfjT@LЁL'jü$y6&wE΁=G&ϼ:WZ^]>GC sA'Vyz|%!C͟]_<_Dh=2/Pt;Z|=~ό?\s}@mwd{0>Lp@fg-~J,zks% @ǟd\ŶL'r23FSLxp;'ZPoFF'phI+%f(`Xr7${J?)3'@tx.MW3E?/,i-3,}"ܙF,ܳCׇ9%z>gLyQipk"/c#q&N{Nx=:+TZKBXwۂTU5 LX&RƤ78 "<kP|{"G&wjzL](xzVR<xu$ \MR?W(\W m8׎;nUY@uOqiq%z~EmVԮo}Yg%q$.V:xGCVA8Gڂ-F%Q푏(TRN(S^ @;EKM(D!Z uTƨ.NrA2H PW#MjP (WGa ֨S F@jFBD }6Ҩ@>YZ6~\v1Cg‹ Xw,߻A_U[=`ү`⾈)N|o9sL(K\O1?/k'\0<暼<y{~,b{Zy]eLJ*xw kHX ^c\w:v|oJ{OÇ?ÇP%vX:Ȝ0@J%k:)&zxy,?B3CCS)E,6fh8! c68c؟{sʼnM#/5SK2b̌)2!ؾ,ѐZ/#M'J(X>N&zK*yR<9p'%tAdvx^q>W>ʹƹ(3sdW;N?PG;;;gdW89gepn$ Wf֤Iٜ~+uIj~:Zdf&?]=(="zS͓5/+/_voieÔהO<~ gfZg;83;T~̤bK937R,tl)r2,U2fKn0Ƥ3.}/,\zo)UMc2H'՞Wymx0K ~i0 +k `[AO ,UKEÇ?Ç33zfԙ1'8gfT vP&NJ&X`t #1fg{A:l\lPC@AMah (fd$cE1'R9f`cd|.U'zŞTg,kQm!5Q"r`i3,;-~6[KݑL$Vm{xK3}?0ErɽϚ""kȢogz:]+kmnwj N i 4Y^ L  B[ۅuxȹ9 B"[#CGGE&zk>Zx;T8|S푋+ '9"٧7ۏEfڧXcVw,l֪=ֽև{mjxuz=no=INU燆ԍH}[UWV3!*[`oTPn?TZm WcMq:XCGCU#53j}J T@w0@݄j(5RjQ4up_@.> 5bb/p_:'"Uؽ [T=O{pfa: lL|徢+ wJX!xMwM6gwA_s lg=X}e7c4 c-~zAw˞CL9B/-d"B}T=}>q/snyv:uS>\Jt8gO>mmm}#yRU)3۩LUtYjbtUTdeԊ$$LR5AٙԢ}4\w](ILln4S#n;1uHrJL77zbsIbI}bbͣj{̮qoiT}~U܃DȼP|8C ՘c,:dXy I?+c pj֞Wq<D)J>2`:SV#+St|[?ɘrKAloYN@Ae{>K?=DAfy_x/ y|fiv|Ç NL|2, 3朸~:z+v JQc@2:F ( b! Ě 1 $'jSѬ$E JU&^-c,= '2!(:u}}i80\} nN>|6:$fe}˾T}(\ xUl].NSpu'0u*2lZj_[8:JEf5 /ԃ8rVV'u^Xu5?GFJ7%E KdּN42пyNZ%C_7~yC\Szl܂]Ge.Rۨ&%xVՠ@jQ YmR3#XY7 j_U~QMՀjTSv(tLQݠβS +rCZP0O}TcT8 ADT+* H:;+hڢJm BJWD9zolkp P?\pbyҥ8L;kHy:@%>6u 7N S*XgWqZ]e7^gW[Uؠz@Y>Pg]:gf^s/3I})s;؝cSϹ͝iSWݓ˜RJ5)ϾKN6R {fKOOJ͌N~:?u~T"tɽ&S$Z^;,XS\Mu|K)-krצ>[oiN]*U\輝|'yw<-s7mOs/rw^7Ս]uH?+܅ Lӛ ޺P7ҷ-XϸOw~=T??ss zAח.z  LlӸ^瘋qb%u&e%_(R"ESS; {M&Ue;f9f;<^ K)Cj5RR潷v@T@h-!,) AaX!ćUP!|(kƈ8^ARZegwyTYf\+cɘsdL3d Op*āg_V?<P=!\oo2>Gjh108V?=V,F_Z 57bQĘ(SbʚbT2e0:O2 h镁;n-/nKkMW5zB?^_8鐓+?\q(?ƹ #s66F um :,T* %H< }`/ iϵw;+sV:,xzheXSjOuRJuCRmnPKTcV ^ejC,,Vo d}Օk2 8D nYݨRcuC0`jeE[tĞE!WFXq]Ľnc~A߫b{o\xWWOYR|Kp/R=Ü{twN7v NN_gtY7jNޢzYo_8)~νՙG{qv[wXdZwfYOLg&fcMns<`:!SQc̒yP}eoX]Ӂ@*>K"adŲKT{>|h>.P|Dfҙj"'@j,DvfPH%RdpbM,EmYRZ %p.)`j o-2fཉkdҊ5_X0x Eě"EMOÁ1 (:*X[o6B[ pˀ0B5vsJИ-3R^vZr;_.yї’c_R}<3c}5gI`UdM侜Ck?O \>)|fh;Y'3['xfp40;2ľĞHYOڻ#։:v4aZb1y+i]αQjVuY'ZqkE]gըcըJUQezXrkg5DTq,K耶T]q*W袪tEcj:[ݮ>W=0h5 {}QPaB z>z \W *}^wH;k`>P`tqnr}^A>]_?ތ} = Nv\^~v2wSc~}޽n7w.z;ڽ-p;_93ܛם SΫ!Nuj'$+˲e;gy9N"[&&sBfht(uo:gpkTldiWx<{%v_(KwڑN5/UU5ٳWeóUl/{eDgĖ/6mn6ʑoe@L?Ej0NXfWs>) 1@7|Ve?isÇ߅ǿ FWDNldWtD}xQy%3(SXj4=q=Nyk'Z wlCrֈe1gFga1' QPg@V&׃:?tEc)!q!gOc;B\ez>1 P&m(AkL¡خ?=xH߬w%z:5zf<@/]nRg"':1}n~^垊#.ܝtgPvwsCetw~8;Ynԉ;)N,{ }8efds3oe™2D&=%}d^IE![S9 z:y{@ra2//9?W%x@{=_W*tlLe!ucrυN?Dj&oMqT3 6kI7T5HڅOɘ5R9tܘ+ytd&nnG9Ry<>o6_^ ;af64秆{5с&e09)zHǙb_0>]D:tѱ4Ds L3Ab{'Qc*Reɀ=Ug$H`@qȒ"jh2L'f1cÌ3 xl2kĒJ 4k^zAaAMRzɘ⅒R~[}R7 tX;2VɘץE.rQBy#ciLÇ*buvǤOK:P9?2_#Xxռ~2kMZ;*kZ&z$s;&X')Zbdx[&Yu5RkU:[ SGcUIJ:S:pz@AsF݇~R>@KE8W`&F8}VfsS=8o諰Z_9zACFY}>\wa;c_S?DV7l}V:gkGKFg}]W1wIn[t' 9xG힢wݣqa{{IqXJhw~T_7qwNb;.=zzW7IwBQ|< 1#؎8{>Q˧v!]1pB,yAG)dJёVS"|scssȘ7<E2%xwi%S/0 m2e%e|0L?^2x8"?.KP{k2H!AlN X_χ>lh'rf~8qcBRm+^V73NXaDQ2}^mP!y Lh`mƘ]耋4)2c,3{J8t3BRs}y=xx=m^`۱[\%_obL'ؼ?8}EĜ 3sR`q:d:Mdž;R 1χm:L^tT&kƙK9K 5~c^,ۑz1y{2@6{ \bELJ߇W_a-=d0`gچ>H L9>)0twRNxwfVoe-;NKx zj?]{/ ƞ&$cD>@LJ{ fҍR׏snw?=N|k2X߇>m>|a2RfjؑI UXրRX:tHv7ʘ*N<30!(CľҞlPmLGt h{ P^Wj?ntt8f쏮tsOfF%f 3I@mR:>tLmz̉<%:Ht}(k&Ǥae0)k2CAGhr:nd`=G!p=/?Kv.tXcοu|L2`}ӑb $k27HfW1pxY{m:55N}y3S{#*hxxL&:,usO<^zRYs3wPmx9q)u߅g3ן 1> d0\!c@~f+"\eÇv>|'htLHqgN?:bt\KޛHS#&3I22_,ۍAy2ei),,!0kNY*Pž- q- ^Q\`MDØiRsF30@E8A9K/u&CK1vK.2o'}Ίblw_G(~>:¼p$^:tx~9XC2OXϋ_Wc=kMg>R!:¼2̘2:4y{KJZ?cjpllȰ<:thӡ'2{Sdlvy3p` el|fc>?yHNX)_iw ~\OI&O;WIMF*{=|OD+c>|?NT~g?sbetRo 4Eyj&TjN8Xâ,&}lǚ]~2fI4E:p;ʴN 3R<~_:^t8愞d3G%ˤ^Sܻn4[d71$@ImOL$kw"\4K(`Od0#|2Cǟ:t 7/:jt8ɔ߁Ʉ=vO&0z,c=e!L؏a xϏ f~y3`fdpU?H%\>pf6Tv9֎:xfy|Sw5Юo~:޼_đ|[d@7`O%eO)>o`s EF3w T7Ç>lYEs`HfիN1;H ZTTq3ͽe;fލfٖrGU~[fJfTWgƚXNЅR+O<o}`ZG4mxRfqf+,Y͌·hm"o3OF0G烌Q,9dF{2Cw%c2x߲km:gRg P1`xϩ+rzX}G;D}xN3c8>q4ko6$&KqS%MJ:χ5շz ׿o,_(If@ϓrc9A 1!˙sjyz% 82CF7ޯkĒi]q>>| rbjfDɛ*׎}cqvze[)ڧe쉮L6FSStׁffI%eq+fO1e3j1l E,eB'5aq=텅y:2D>cƟBO1c7%fQed08)GG3Bt\G^@s&< H5KM%d FS>ܟx~`hEhާF I󺚚,L-@ ࠆ y3@ >3q̡g<||?Ç; pL3j #eJ[ƤS$/8g`gCk@_"@!@Q>R%3X[L7Kpk%剣@2CeЙX8 ϓgm-%Ӧ(ڵ͸Nf~orY3`A;Q@6d7 :f?h3d,,.tpL:Ҥh]CP?5tP#T|jN 22DL=>M#7z:z+-wX3ԷLK@ëig&3ky|:w&x{an2 K5LM[/ X1%H%ߐ1dd|YA"?d& -h`qV~w"M0ұ3k鈰!!q8Qf )I2ґc -L5Ϛ~IĜksˉpX0l؏`fґa `|%3(x*B)Bm2D#˜E&kd;j0@o/ko(u#!<fm i ?؟w MMȮLQQ6b,%}y>,0/3fv 1>||w)ω3TYSg<*I%@2axܧkR^&fv}̶8Ğ8.-K >KHug`Y j'q@&8Fϓ^?qt?G9겝πJ`FJSSmmzcvg1c{1B>#D=!ky|7Z 1L1f)^WeXQu= @ǚ_:ߑ %kCό=ϋw~o?O{%߹83Z%h)K=OXR+'lǿ+ :>y>?%3Ç>| #Dfiפb&ʸXR{9g*R% ˘% 8<kg23D` 4G ulP߬a7K9dsU㱆 5?7})jMM Qn'V7q%",s2+"cOY1){s,j,5 3C Lw6wS]~d:n4uӼԇ2!/qt̯2+! I؟mÇ~>` )Tktd|eFذLƽ댧1 `Q!L:dL{Xcr2 Бh t(|k(2ihx˩= ?L:\txa 0>J9f88̘zL8Ŀ5H%g[Bf0i5RYm0@E[0S 7-kwHǞ5Npmqqxy??/YB[s9rrXRjLW2-?f2`38..a\ߔ<}Q%(U~fHqc?/>|ÀÇ N0Ȑ\no<{[b۫mgffx!͚iR$1CGwI,KkOL0žK5r^)Lh (_$uד)Bǿ3qn(@Ce_x $kaߨ~P)(G5,:Ofpy3LǛ5r{3׍ב5+g1x;wCӣޓy8>ɜDf 㓡 G}MG[{)RdbiY`>X@T {z vFג |<>|c:t y1դNsˉ-EH-Ȗ lCƌ$bc dY2[R^q`v02^RΓ5qHYcLfk~^RaT,`&̩QL*ߋWnG]S\˿#ϓu:j !*d0OGrfpeu_xx*$?cl/ۀR|L&ut ,9Myd`R 9lg 8A4d>|I>|'/73#kloR-)3GǞ-кvQլVo4 v5t͒ :R1-3tTxiH땱?7PR2(Go"kMga S[a>cPoצ1Ak^/sa؍Q;rRb?cӱߙ{zL/oj"pLHcv04o7K-vt٦7^G${<Ȩ>||? :*t9DiʉY_Z2&_(弝Xp% GܣKg-1EJcΛ߇j~Nod.4P7,? r3`fF@P (Lv׏uO7ti#N7+o'u0=)~׃3EjOmi9dT{F ? YAMqaj|(al?G5L5 c5"1Lt35kO*:L 8مF?>Wbɰ@ @G؟Z &v`jA0clPo֬u0Cf7,;530Y,dY4#jSӡe>Ry$#E"wn߼y|"PlIjvljf,!e)r(d{2$̒?Zo2Yx^wÇbń|?:&ҁeg\wSTMD< fK~hGHQ4"ru!hy,M"ϓ"ĚZ Er ό1%.oj`{4>˚v1S΀&_؟?ݡ9̹|L-tUS#@< 4K0L&σ^7vXhÇ>|{f8&3tkS:3a'u35o73q;?9FKu6c7|6 oJՠ{b57:ce܎Tu^w30c|o?ÇoБ"m15k15^g阛<̀ъ z27p|r?"Fi# 1 7w_f&!Ǿ't 7XyfYC}b~pHsfhZ} "c}go7,K~ V1+7(Ç >|?3ac 646P֤!e}_(΀yvod&Xgul߱ |4 NHW GgzR逳$ ;7,||Rɏ6p|'݀lhlEÇ>&>|? 2Hgm=k`߃Pqϗ-c1j `_7p-| KClf@C^fce_uLj>?>UEDO/13G.#GfԩOjҟ>|'ÇXͰtI7EL1@l*-dA2l'1:t<hiX~~C%6Uۤro4,d||_peuj ڨ5V:zt3a75 (6ü̶*h{5}^myg-c@y^M`$VX&Ç>|Ç>|ӠFEsh9S AEְ{Z46RL;3""վ>}_S+=GҰ)ci1Oσ0kr>|??Ç> 0jw\SQ~-TrEfBCm,4VN3N=f5Ƶ{ޭ>|Ç ;T xVq 3BS/c/,%tEXtdate:create2015-11-24T19:25:06+01:00%tEXtdate:modify2015-11-16T14:19:25+01:009_XtEXtsvg:base-urifile:///home/hans/code/guardianproject/ripple/graphics/Ripple%20Trigger.svgIENDB`././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9243832 fdroidserver-2.3a1/tests/repo/obb.mainpatch.current/en-US/phoneScreenshots/0000755000175000017500000000000014620351546025566 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/obb.mainpatch.current/en-US/phoneScreenshots/screenshot-main.png0000644000175000017500000012767614620351225031410 0ustar00hanshansPNG  IHDRQ5IDATx/lۺ²t[ZtU]TXmp^pprmPERP)%~xf{~Wg3ZkoͳŗnfL# `0 F󥳐}?g6ǫ7ݻ > @/&c 0^7&洝?t YB.{C E`A~OWq'^+[`\ϻ@ZD~~R?˯C[l]`#(9&x30o P9gV&3xb~͏ x@W6>lhk @sP׽_Np}mo:53:9܌9H'c֖4?6  /( 4 m߫yc3hT7%?~ĸǿYkE5e‘V)| @go&_ֲw}oTlqwHM@f `)"pJD`s4Ά/"v Xbw:3j;1]:76DO|NɢgbwP|ު scF0o Xn`tApo r}n({#kg$u @,"e7Xo`U^}o(vB>yJLXh on< RI&i}0o:#!6GHnOGVmi;/3Ŀ% Pt*G _rcx$ @n)NQNooѿxq<e^ dsN:I6X*u4{=JUo)cx$* m̟v?߀Q'+L@ 86+!?B4X0`IJg Ҟ&ho@j4.p fU؀U 1Fw'ekkz?ߧw&`v7LBoyux$i<DZȤ`}bөi`0 l60 `05<#D{& `,X l\J l Y3ŀn^e낫.M?+9Ĺ9ŹmymK/ϲ<7}~MW1Sr>f(}wqύss<0?&7_΃]7Y@~A7$wτW7q{))MV[Z`WmGp<:H?&T0T|XPzAxؚF .g$wttH剔#h:ꟿ'N$5f}P@B/tH:31~޽[MA __mm_zC}:Cz# ,{+/F|1)?SwN?5(7&!+oVwL.1cOYTPaoǬv_鏊8,U÷mo_@4rc:ӃdS_5BIE]oEi>cfHˏokyl|h<=X'sZJfG2/Yؼ?ݰ賟o3arwi堩fJ ȟ2OӃS)Atg7J~^8}}~i <"]STgR5i7`>QB ?>7{n0PP?@pq@y Iw|}N <\߼woN blX |Ylq}( P6,?fr_QDIOT=K~,ʆx``=}&e=oT43 M K koQ1nлxq?X~_)?>h'-(қL}v?ލ1 QQ%6y**HA)A xWT J2ߟXf1>3Hb`]G)GXڀd].§X?DzDY"w9e0 )?;g*yT JLE ,DcA8bϾ371)?+ ep5Ypmo0loVD}Y9F~b/mb7^FڅXbl-v1}|{`0?J-l% 4:ۧ jG*ER1.~m #Z?Z1Q/?t0P sW7& n5 zc#0h3ɒ2x eB l֛q| ~?3~$\x]o{! {`</_f`|6 "`.**#P$*+Gyqo=Be `=w(}P]X02q2.{lFnol]3z ( 1|ѭ?BGÛz^. >?  0 G|Kբ[3,dS/[N'tYNa^X#2w%?E'An2|Ŭ& ( ࿽/0'/)x\}5GcAZc BU u w,]A%+fqLkY<\o`Oo w5c;v1_}* 86>#>KM@AޅT GZB'Db,fvgOıYǂÁ{{q{fA0R , !bF?뱁mV?JzVUgA]k{aYЭ^d0?=ۜh;ExT^ޢ:3㳭Xע˳^ [ %HC@Sm~ߟ֯3 ό϶(x oboa*ԟ{݋$fW2 zW_.V'vَ{/J`뿹% WtrEş&yN{/X\՟ $bW_T_6]ELJM@{ﯳqOV`0^eU s;g;;ϭX]6ދ{řT ٦__3K\wE 6wŢ`_W,h1 XGV'6nhg]f~۬3Ke88Wc o@w[ VϨ#Xn q_~>_& u(&a+- p_Ik<0fJGՑb_ Rz ^[gQpb0 W`/e`K@[ ?d)R>V>jqn&%,ɸ7hϏ,8ro-\:.;lT, Y-y_`0Ԃް4T{E~a$Ţ\UZ ܣ/ y @;? ^ſ+OM@[cTG_]sG:Y.:fvŢ~{5%?g) ~Z7Eq`qJDuGgY?5T88bcfi@EE <#}UVsgǽ ss?h;Dոg}f-@->?6x/goy=W`por4rM@ܫqƽU ]}rcA/21ro$>. 0, @.u 䋁 0dCܿ W%r?/+g\*P\C\K@/YI0ry>KXQ>e/Kך/(8!%鄑\q?/X 0aܑý\oz>-g KJZyIb``ſQVPrߥo=$$\N*Y~10c Acv~̪뾢Σ75@qҠ})ob1p[ @U(ojK5IyJwUU*R M 06DŐݳl/mޣ,9KiиƸָf&` ٦`] __ ğ$'kO7/KʮWWs`l߼A'QT؅ԟ=? 59W=b` 33/8[nQàwaoָ` j2=v 3Q1$f #u@bԟS&9o=^Wb0A?Us5#,g 2/6Yo :=(06d3Q%d*"_́zUلI -MřA_n10`3Q%$Jt|?_9(\BBcF0s`a? ֻӧ_ֽMm-Р]_g zJ @17\,6eʫ5g ڤ d,hz~ ؀N"Bb&?} Pl9 ` J@U$ xBSY3moWŽ 0E~()m-@@/@?xu` jGi7Q Kh7'ſ+Smmmmf;ގ׷l 06-3?ݿ7,{ evF!p?>6D wEvR{3`+n/%KpOH{=y`47bqſvfg{ mmm-@@3` @,|qUbZO\*9oYhhác\U (Ɏ ,;GTlӯ_\& n94V @606gD]O @ cӯf܎smmmiAp{ i@U Oav~d{. @K. a5+E[2|[ 0Tް>Yv;pa,݁[1e{ܯ`"U ®v|w*o{Api1}`l(*f-iLe?Sgb_hhsi°f  ;??wy}P;18Wzwn6q 0?ƹzW_zdmͭB(S~-x7j{ò 7g[/6O @1` @J W8<:`ޝ8as/z ̗Ly[2h7 l (y5RPޝ%ik6?Qv޷W h`C @Jαjt,RGGD_ 5aQ϶+f}`d1 M2 Ǯel m}}}efZ `lx Sվ> 0} @aTQJ7n_ 3 vQdſ*tApAp! `W4[Th? J @A+ye0VP~Д 2a/ʁ3UeH4ߟ{_u1 ]@P&`<1pݳ AS|;h)&@w}}}̳006* RsN߲ @ z*#@kTx Ǿ7b*5/>φ`}[jXN`# 0YJ0yat6 AEI905oޏ06\G @}pxv>nʘ 3?o 3=P=c#ణh]FιJ>aj 3 s   ׋`ߕ$M0pDD1 @{>}`lx3>1;ݎ @=e?/g06h>d@1WbX;Ȟ 0wmv &w?X5?jqǽ n~<4+7 @q3`# ~!0 c.J cϋ03(DP+[ַ) xZJ@ UAà^G)uɇ q+}06k!,8Ҁ0APs\~OX }e0/>0 @qocFHx7, L7A:i@}}e^{~=P\o4x9a&s>]'1`3 @IgO?d{=0D/:ӡu,S76@#[ 0 wmGI5ԏ~M_}#+[}q'GJN =e~06tuc3s`8ObD_\g}Tx˚1 oa]OzAԄYn폼R}}}}üVט.q  cP`;+ bG 0uq'KhK%]( :O).P QϊҟZ`&X@n A0[v<>\fo?hhhhC~gwb?``GJΚ Wcڽb=016{U1f/y4sqƽ `/N6tm$}FW?@bh#3s/{)o"xwŌ眕f&(2?6FGyYcmvh{v[ՀxEL p F_E .Ahܫ; @4| 7  i_"NMͿ `G:~' ݂eԺM2[bya]~.,0Ҁ V'@*#RjDy˨q]׻ yj~]Ehh x{2fNԟcJ) 8t.`k7,K zm5ָv-m:W?@=B9sE 9ߟto\c\k\&f2Ÿ'޳@÷4am91Ol%Y|;vcrh`l-Aq|+wۀX [gY$ך8g6jq-{1r޴/@ofk"$ȉǚT37o`p1H l󰨕{]J%=8888>m?'=`Y8Ů 21%3#G=n|"ElQ'a?@[oրycޒ6{-@VC?f_'31_( fUX[yYbo OyX[@߳@%bT `?_ҰM0-@9(_ T k?q/Ma0 T,~8 \`orP}}VOlNC[_ ǐ ?7; L߽+?R0>(Zbs7%xXTT=R8UKp6[ <\{;NI3+6e̋eˢ``ܢ߃?GE՟S   eQ0P^F#X+XTt=@74ݛEҁiOKX?P ae<He lRşOIş=D z3> wAe1c|Ojx x#)8J!z<g c7Q``oLn^!(]`'yQg 0в 96WYspcK‚v|X{oy| 07[.Mhi&1c-ܖ g+*LcAIK2ɺ3 N}bE6f``5)Aw0|+ҌKU~``` /`'_ :I :0 ?1bLO  &`ۀڀaQ8mw| | 'ԛ)-hd@)5c3u+c)gkz⬿x:kqT=l3_0 rYOG/:Opm@ 1\ؿ*|.@~S1DS³ؼ/D_yo Ńwo7 L؛!ߟm;eR?o/7i "=D#paAbރliLgzT2XQNH."4"o}>'(7I lqח;##0n|s8r#@XxG5'Z^H)fY"6y{Vs_ |+Pl06d(+z._D<4O U&ٜh"޸l?07 , &_;+-?DPˏ-:, E9SuFAj nfL)JEw9|q{ \K\S:?۠v/VgZ06ꌥ(5:2BٷyPSp}AƠ!ypr;~0_[˃7gAOL8<X;g~O=f7G̗~46^u>a}5iGo~?x 9gG ~_gMv. 0{?(+\ Ǒu?ͫ2|v]ֹO:}zsrZ1oKv\Gs,~yY}VslMk:ϱg4WbGڎіa>})=m'-Xmz|14mF%;ٴO^v7ӾYkV昌~;ꎞ{1&}N[yڬ s+.F:4}.ý۴>g<)ߓ4.գu<5+~ncLgژ,/ZlY>o рjn~hϚ<<_ja P:'=pzcLFy1rڃ?_I?Uk*Fo(Zn,Cx vnb_]6<5/UMos vnu*ִJ\mIz|M6=ii`v?7s=iܘz.6}6i=Эu i\Xۤ>&~Y5X3kt-c&=?~$.~S4GcEUu1>*K/z M/XL}w9<}RK:Y{O:&5~n:&iR߄&ԦmWs(u i\X;o?4}5&~Yg54EgʯƋMc_:.}5Om-^;n{Q|_mT|WjnIXХ}8q5;۴O_U&uˬ5/~n:&sor#@x}3iM-Xߐy w퇦ϳE?ڻˀ.ja @CWYEP_~ΰ0 էN S"bﴽRw3`MIHsȼNCuEFD;U-b[7P56_g_m<~n:&s@ڴAIY1Ѻ\X{w~h:x.Mu7XCPUZٽM JvszMSVޤ|xdYjv/[k买{w~hDin:61jW`D۽].r7Sw|VRӷM, }VfqoFsGZ6=~cەha"3[mbܦf?O,x㧍y+__?ϽA$?x笽gj6KRɭқr`n!M wCټ9SYVhҘ7nCu n~hj9O?6}{}MO?_yja @갧#3|m=DcfÁï}oݍuʯ'帎pH:c=;us4LMN+EiVW唹ni>Qw ʆު_g_³˧y?7Ÿ~{vgy6K}ο!>mMcy:mja c nx%^|N~v鬋d⁲u5ybἷW5YhWWU?M~~ <~Q|:ӛR1jYxWg fNi^ߐY v6Um<_&nײ !^+u5lڰhoY)Ďgwӽ` EJJ珶V:G2GxAd—gwp`Y.: 6ҠNwIPEEgniiUEYNS)/tN'BUvmz<gwp`4ZW}SQ$fj"g;r4= cNsπ{7 `gqX2O墽aGǧ8^*k 0 S&?~9<ǣ8.v,}Ԛ  pӳL!6tE7;>6oiyOvH;!Hׇi*{S!X) Qu3BdFbDq~0 [2ϷOl.fU|9/l7\<[K>~llIüm.m,ag >(7o<ӯx/fk7x @ D7.n!/7w7L&s'ͮsNqzdc'APo6q?`h0SL5RY|NeSA^|Ms^Ze7o5ާhy!A|]8ߘyyl}7W3c11[ɤhɶ&cX>N3GnTϐq*?t*pΔs9V]tNV-nr٭iZˁQCvrNNG1?c7qsMlˣ)my>xZت{g},gU),Moy6LkI8Ϙ\ŘJvxXjˢOO˝w,=E7x`: hU +fRsR0(}`1qMElq{#hٔ7,Svp/830uR~.Q~NWi;*}5~6SÛ hK:&״m9Kbqc}ck5lkNE{u2!6gu>WVejt[crUc*qWsh;Vnq1"`l(nȺ4x|?ac~s]ciڌH|gtƟs9=?0nr@&fuw?8&M:6Y~bl\:o9HXؚ,0m4eY{Ƿ٤\kNMmJ۫qidiLy~t5-ӱ1ikXj h2M}nzQʬ7S,y{ @߱:mG`$bΊəeǝC6-*zc^[,\{[\KՂΤ}gqˤamYitXZ2kz|[ϳ6t9n2&W9ԫ awSem`"[\ǭ*ؙV`󊙒ʯgH*MSf7O|NȬ<hyUlifXZ0݊ԌǷzYwM*V=1MfGn'i8ax7hrɹ4P+&N,~8zy?q߳/nVՖGf`QckI{75<Ƿ~i,ee)ױ-J =ݧjY!oƍ^U#}1ؤv*iZX4jz.uۥ>K&]~ Gyi^xD%oOXda, !/g}EQ - Y `4`0 `0`0  `0 0  ~L>kKX"H?C/೺~~1e?/q|s/9.O~-IpE5҇ިYX?Ћ:-h\q]Ot,WWѿ`߅i+oJ> TT]sXX_(I=G?ʯ*R0X,Fۘ"jr-A:؝-~{0X(俏 ?f 'AOs'@ |,-}ޠy!qҵ3 Aiao:L>[5? V wβT*vf櫾0X(x2)@Ú 0kxp7랲aH @yV )O);W7i#e@,F`G Ό>IC3qwtQz?)0 Z"$Tr?+L@%`6V9xK3#3ag8=ju0X*no ^_f()L -3L8cQ>t}໧ZP1mmz@DDD0)dVP!6W٦V7AN۟WD1m31X,ھw o|VѪmiuĚ80Eu @z7d6f+_ TFw+?XfbJs"6km:կJQjO|>ɕ کho5m"""`\eRENyk&}޴k']cki~UI6;OkSmm`ޱ@DD ;]f^Uzͪy8kQ|o[N(M)jYm2C^>[`֚_m]GlnPgxӑ}j\g7>M @(~9Fgֶ2E n @dO*yiڎm^k8HGi3-Qf^utf}wNQT-nM۹[x9FgֶBʘQ-W3 >UTcF5zk_m^0+}Nw|Nyw*ݧRq~EXOJjJ;mD[}|oog6bJ8::#Y^MH:9y@@@@@@@@@@@K͗ANr[w&GODkIyc@ݏ5p\_ :&'u+yՊ'GiYocvڟ ;_[u'-j 1]s8>Y?y 6O?to'mQH}_Vdw:~P[Kuxn~?*}px0ٮTl@qqGy=y ̧m;l-m?\#iW7^IKQR [o687y=yg@K#c=h$W|b=_T(4).Y֞R ֒db yG1 $hIנj?d-XٱcOXjSl/3ɒ VC߻o!Gv^b>uS#LQ'Ns(T U'G폵㵪y L>#fb"wBG7F{덱zEЩ8|/_ZXSjC0?\W3 Y0s LEtgu V3 g}旽,ٻJ7IX<>*x)?x`uիy=yX~kƉɯZ~,)\q_j;I\9 a`%Xv;J&պ2P^-Oɿ6dys$i]F193I},(``a;G= dY'xI}I޹&<^߽ Gz/ٻ,io+.Yya2ꧮ:`^^Slu}V+Uo[|=6ʿiHbTu~0s ¿l>$ 6M6|5`e@:J!]`̲1#֓XE!wIγ1zG}xT z<ŝ'`~s[^7F.>L!`uva#̟}:t= (bEai@qĹ&`4Xe)Z'=~"xWi?9F>eΎ=O00s pm?R{gVq_r0y®l(ƵLCXEq_wć/O㮮d#Êvv8nqR(1"<)@gQm79~}쿪e$/:^ύs(KBR \(VrMkV9mH' ty W xV'F D~FRLVG~ldEvfؕޜi9:9+^U,G?^c?qBUċ|NZH5x2Ǣtb@yzߝ3w/`0֟,@gFh_..6j:M1`&hq{q m@N HI+WCI z v}Y+_,,Y8 :NI_N9d &7 q`vν )XtQ gv55DW-`Q aKVZs!$X< $,aؿ_ 0 _}>xNZX.f hv: F۽cnT z?dWcXX'3ϳ6l Kv~9rXd¶>kv% W hF kwf@+>l$k/Ɵͳ G{?n3$2v#|`m@rVzݓ2L {{gx`\ pPDZ 5 IO c\g8`i3(Wz֣V|ټXt uގy !݁s"UE86&;x8 YB P|0|N@]m@׿"fZ7_.v0f@DA]WBa#qZ[6IUj j= t_Հ?NޛwקZiE&wQ9.tx ˿Pv|LѳM GWgw+~kd}`L񘽡Ӊ:"m!gsbO@a> dP?m'^WbmI @q'UoxH᪢@ȿ}xA< \ٿg߿*wF^XOԛX@Q3g?9`.za/gρb`qU`wW}'. f F__Y0s:€p _?]^X{g^^AV3]Xnj] XF^`M@_ugKe,tr%۠ec2=7XQn{Wyׯ,@Q{hͯ篮u^`=Б-:I1^6/Ѳ4ftx0[&+2C68׸u29;J}էF>VsauLQZ)jus093t̓?ỶV5 Tx}1{>aMb_ ӺWk\yߓ`E(|o# tTqW6`)~Y}@|ﰢxHy:p{&U@uyKbGM<2f9|-e)5s6LOƇ*+5s_cYx^ޜ6T}Unǫ5pIK=T@Xb;MU}{^FI # ,#EmrTxuy6b]OG Dž}EI\(|YG8J:=-_ld?[-@/yIDAT^:UVⱍ I٦>]Qa͸]<}_=9y`&{ZV-m!+=7WP©ܚQK-~d,ͮxu|UuoI2q5$^-`;ׅVՖwY!-R}pA Q]V0e?eT>Lk/WP96q*iuxyӜ`T+w/v]xm?u['SFE1xxux(uo>V,d=G Gv%K„|KOV?ş߾BO3 F5Guue@VYtT>5G-+;,vG i1U"ߖ2j:WG(NdaTuZXq6QKר+/?ҙN[9~n,KNx ڏwq]}/F}Kt+SfEBaN׹d"{ҵ=(UﻯM<)I`LKqB6" :wxubШc'9'Gܫ0e&a"0J9n_Ap[w= 'gW:ʾo]9}Ǜk\}}^@7-2},#ֶOJlLYSǫ+4 \lڊPd/|(*ȟQ,:o"U1Jk/U^ëKD* gʂic;Z7׸oD}ʝG Pq(08-+?Xxub[|\Q'ǎR,y9\V U <琭,-N({bUBe\!<"|=L4V:.D(^yIy,@Kz޸X&y;w]q]Y?/zOz^@/Y"lq(tS,ʆ.)ZecWg~!$lʣ7jj(P XckSժqaί*'9_îh][(L.[IjCǻ׸Ly,I.- R;閎'lNT]xu,/I{q$yF8~uI{ٕ:F㎝oŤ削qwQǸPl1> `Y0Ruoޯq=y~ňŒ>]ݾ{R< 0IUj-[UAՉ> mu.͹K}LQltr'@@@@@n'z` `           P~f'|t޿$z,]z\x3e+f=;¸wt>PGI7 ſ"}>W~J5l$5Ӈ \DŽ_=3'`&׭{V~ @' u  o D!ss+~y7~s/zeH XNnvh <6_-&_Q>m$v ӤW}GGIǽX Y "< [> ZEfW'I;ãjA :k&yOӫ> ` @$yL&&=l9~v-H|\f:@_h/ g緝d^|ќX֫ v'Nv女@`=A 伆+}?|sM9vEm7Hl5~n@t{xo䒧^|(6 &.b^xpG&|;H|,-z;@G7*~pa Gw+ 4n|ݙȫC#b:b&-o(8UoE}>|u'JGχqo7XՇ#>~,W\ iOTnWk)G}px0xGA] QBtdphFˮH7ծ Wp_ُ"yŕ&8,[45jtu/tzŦ8vF\#'Ns!B+?X|x߷Q4~Nvȭ#H4)?H@BJpB;+镁(NP~G sv2!`飣Uz< |XG?xYCjWK( >7a'Baܰ¿q8f5hC _>ˊ{>mtB? |`xcphmbF+g}~38q8vYpM|d݉IJ+zohOӢ6쫈@^~o~t7F>(#uEq\r ־諗N/{MN?[BB^J?1ws}:s~ &N="61/ IqL\>T~=7ϵ*;]\NTsߏ/]a9Yl#LtP#rW#vdk*FΛonr`U/C'Iznܘ5_?X~4?9T3@`;gEEpVǟ2?$yr91Xs8yZ!re1mBS6JZhȮڀ>\d8~vnFscbXv En?+7̱"$!`jE7;.jd\Ou$ꅀ03hy^BPEnZfͱz/J{LbO4F[i^$__ZB1`R3Qgaz|;0UylGD^#WP%;gkVkU+TY5\؇ʣ_mW$fn_HC?n @m.?;7Ħ`|@`W_(^Iwh#́0J1`z`Y+]sQ@N|~ڛY|h}GЇx㶧4u' 3o4>]BJ1`q@gن`@b _C X^,,z 00J@gj{h%yol(bL> %/d>Int^{ tQ;]6`..B@E:}ݮ\_C ~F`]`l_SHۀ氚NL; 9߹?EC d¶>kv9y5w'G]B3}Za#y^{!'7lm&/t?ߜ[ gO)!k=;l'00׫`+Pũc6`N.8s"pgdBiH[ӝO>XGGSP˄:C<;OɍE {  7r",s4>#j87 @\X]ccgs-{ׂhOrN@]m@׿"fZ7_.vZϟUov.k-ϛIpu]x kj:oiHWEnY7uj||ſ̲-, D{~UV&G8yo!w_>h% z}m<[r^=o]˪?oR "04_4Frx~{a_'l7nmſ,CWh3|yl Z2Daè|>NhK~>8Nv7QՁ c1qYo,dk$5_2?ɮ\1m{Ljc1+ Xe&>mNh&ſ,|pӥB߽1ٿmqc_K/ds~W ^ &gdqrQ3]^qvW?ſmljc/ȿ}$ӥ,KV2ns'?(-vώ&;^_Bs{Oַ3/`YC@%(ݡEopZ؏M \ϲ@1|.е49_V&n #|џ@/ sp^E+i|rgn2lUĥI]tc>d.~{.W}.M/2|Ȥ +3E/OC HN_Is-)eWoiۏ +?9 >|a"=U) 6~~$'pUwν;^t)0: 9&mnr(I~@ys-?@ ;<r#]7@a79w&tM{b4bRO9㎗0* 0.sFſ0&" rӤB})wY8@XËWR@@J(-Ο ~G=ƿ09v9PV-|SX4~3}%eg+~9{=,u8<+lj;Yo!Vtp^\QJZg>tܞ6m/FZ  Tn6Mn}uWx'ݴx(@icm`^J'G0(swB",@* ?^l&V6_l%6.\ A1ys~3DK}wv@ ?.rYv('9^we#i`xY@$ᕀ 6:?-U6UZ@h6NZ /R(XLN ~HM X¦[!v:J_ևk+t4j~X@% Q_QǜU@@@@@@@@Hn`=Ne0@@@@@@@@@@@@@@@@@@@@@@'@@@@@@@@@@@@@@@@@@@@@@@@@@@& XN      @E-Xn}q+~+U0pn~ir(tnt:ΗwロFri7y3{9` {7ٽWwv?77VB㛍d$o?{<>Ha&j}.C`"7gJV=L|e;}E`Q콓~O{mV;So|4l޴[9?vWܧ ʹ[~_>QsZ\\MA+"";o3iPgܷ}тph+0wI[}.{( }`/ߟa"wmA?-u9*Kߣ:fQ^w;騦%q=hn3Z",. 1G@Kgz{Ruof^֫VyO;/>pVw䢨/}nn(}Wf1!8eKfKU! Ãtr@EOXUvýƟ(-tw\[AK-FM:V}&"(zol^+s=c}tbE៵*~뇭#>e>ϯ{Q?O> PRB#>ݳQ\Tم g:[w=1 ZA#V 'F?+|v|٧2srE;cU 5_VB#X{xD|ug" \+k+BuYO͖Gy-1u\GB.o}ͫݹ}| ŭGtYϞX>rR}{qߴn "g``uk~XX ̦ZeͺQ|M V(? I|¥(/qޞ7 s޹ ^!1I1+l~@/ MDKEKNo]uMi碌zGcp#G+] abrT @(㽳TnOg$Y7޳qt (jv{7*C;8L?o#}Wrˆ܁ 8#EzDgA"=n!}֓AX{[F4f=:# ,Wb|JCcK>J[qoC`H/}-(B9Y!h?oM6Ln||#0~iXȂD1LD~@|;i1?W\D+Cq~@lh| lWغXq+CgKPjMٽϜU,       p-?-JXtIENDB`././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9243832 fdroidserver-2.3a1/tests/repo/obb.mainpatch.current/en-US/sevenInchScreenshots/0000755000175000017500000000000014620351546026377 5ustar00hanshans././@PaxHeader0000000000000000000000000000021100000000000010207 xustar00115 path=fdroidserver-2.3a1/tests/repo/obb.mainpatch.current/en-US/sevenInchScreenshots/screenshot-tablet-main.png 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/obb.mainpatch.current/en-US/sevenInchScreenshots/screenshot-tablet-mai0000644000175000017500000015536114620351225032521 0ustar00hanshansPNG  IHDRX +ڸIDATx|/ Eԟ] vl`Ał {b:(C/IBK s-˵?s٫.{Wl}gvvyggw ,%%Ei4ZڊF5 !p[n޼H?ZKј޾4Po?餓ݻwOf͚5u?ӏ:utb/ 9䐎;̜9.155Mvi%q?>pI&͞=^M$VP24Mbݡ ߠ|؜9sďy>.B[l|bɵ^ | .ਣ=|GtO/)v]w1zh\Vl6qDc@޽MEoyӥK"tiӦ;;jԨh[:jlRC}v)r'֤C/` )r'%r4";9#Q84 я(,!CӬY"kIa6֭3<h!.vYą k֬YhIhmڴ9s& \GqDwDY74M1Ҏ;ԩhׯ߄ ԫGUf/xOom+%ꪽBS hF"rpbR(Es=nHyر7tS4۷oNJ7@ٽ.)}my}T8裏 [5!@jjj59(OЄZ15M}]tA_PqM^bMYgl fӦM#xI@$r-"`UNBU7xv ~C<"w˞x҉v)Gv)\yI\ V @^({)G6p(̀踈pSl˃ӁT5JlSOaMtFDWEΠ|H DU@ ʘlU!Tk׮]pźZ$f!lٲe>}|m,СC+W;3~C%xWm-{hz!n#uvsbpqAj$sܸqՇꫯ3tF+[d8IGή0/ȥ^:a„C"=zvOB;4hV!<@sqljUHzVc N_ܽ/ةN.?6]tTʒA'O ra7(҂h[ۄ B# ]l0lذ76ЍP7裏P[o,tJxX[!̹瞋}|B(kBO?"#J XQv€ T/T55 QK/ulϐqB4^[8_~9hIbbCh!6\ ߻dS٦[qJI}}%Cq} XYuu]B 8uT]4P4a 9D=Q7{W?iӦ?[o!k(Md裏OЋpvZn-`(/q.(W]u:Թa WA+2@TDj('|'J6 v '$ *nB+K y2dBQ MShOd M"1`Çd׮]oAQT@kb/Bgw ϡ} >*W_cT{9}LKąuiq5WEGlZ7#KCD F;UHJ  >}ᅬ2WˈPOSc/z(!4(兵(Cmzx1Őۘo^ |FhC"Ŕkejh9~y8QnM%!CN?qEΠ&MR?Eh\x* #|rՈ# ѪɅs9ʋ6T޽;$B8]Zǀgdh!FAl?#TApf)†i&d 2Y }]ѣkG_S Q:tsP6[|JsqkpPN< vҥBq.Z"zkժUA d1SO!ꫯ!=! >鳧~W[{}ae]&vHЙ4B#AZ&'NW\t 959C7 ϐoVܔFܭ&'P/sA= #ۏ?6:g}62Zr7C=vm-9PV$nl"D-AaGG\IҾ}{D]@k_ NBЃ6$3X.&͉p{#>~|۴Au5ph3ϜJ`͋,@8ꨣЭPu icBԶh2pk:Z13rj #S84 ׾&Μ9{3慅l2Dc55m_~ -Fhԋ?~hdpI](InA3f6Pb#zM1ߐ+^ڻ_w2T}C'uj6̣oOMP4$*y518B.n_N#L LBt)?a0rbU!@׾c9Flp ݖ&x뭷a=4->+PS}|;O@ ѼFې}aؠKヒ$^{'ܤIwyGUA0h)Nq 8(d20UQ[_|1`GOa!Rw Uu+/`#[u>?Kξ@B. &;"bj7|VxĔNhm,~!d !ju]4yu@7Dxycx>=@S>5X& Ǫy @\PQP| :u[ogx)Swg# ӆP54"վ{a'tu_|1d&4l34 b?#L|xhCF}S7S'@9.vU& pm57Roܞwy(RqNHdX>SXA3U"^QTBEOۍK!&^fL CB4G惵Dgͅ[TGx$Y\bVCB^r6 >UmkMhg}HG!# WM̯ܹ3TV-3<0F=46lܸq96B^ 7S`I>׎ ?~x>8Ik # xP<Ԉ%(}"4vS޽!&L@p.pZqpb ʸxVXCnL<,CBŋs %~vIͅ0 r1cƠm4M<%OЛFVhK#t_JG$a8p*/IJ}=]v?3ό0!d^QFmGꫯ!~ûF&05f!)Sw #"o= 1:a[ d\p'Uk[E[P yj2Zn">ä5tUes=f**!&fc/;SEk"B<}ᇟq]v|N=T(to3H4*-LA"p~;O>䀗8\+#*.o1E / hIkMV "8qGbp5!D"T{%pC]hfxN/5koq 6B8OiکS'4irYg?Xs!D b; {{0t6Q?x#4-Z;ksiӦ=oG! ⋤Q)ܡ+rmYKK^1q_~eübFo'^ V&Tܧ~_D*zu]5? D b@\>l r@Cn$E1ֻw﫯?;a}WL"GyE9֚o>_F駟'|rh4Z%Z1Chzkg>!̋i7L[MBHH0(Q(K!4<5Χ}9fB!$y1,4,! EB!$y1,vҜoBA@wOI*E^znBA'5LH`X!1k,q"Di.wqZǝoqvkJ;S!ATx}"tB7]HG8y Dq3?B>iu G ]Yr]7Y<~jչ㧑͞ܟu!M{! 1KxŎ 2_世-]V%P W+_.ʔmX<,rҜM8/t~ەVl䪃z?K ..suib7CCB"$ʷ=A-PPo疸ytrrHH')i+lwN-tox4<.u5C S] rT-3!  X*2ǭ#\FY-&9I&oe9BBBt*5Nst[xusN{O=@9D^#j'А?}:/[nuװ:&mȡeKWP !:zrsqFh]!mG/sTO(,/{@^*j8~] SC IF;;[^(a/\#{@.TeUCv6ZɀFg ˫S IF#ʌtP?b܇92{BoV5c۪Cr$,{^y9$$T`Ek&ߗd*WfL*p_h"kZHU >lVuEfkJZ+ZHX*GAI_Xp㪵PAWNEW s+\H%$FD]o^WbX6$e>U-TrPBʠ!\eYޙ` v`ۉߺ]V"Uf!i!1Af]|MZylK_nmK1[ %68ϲ%VfUG,SDg8kl<>ȕ0йT500U ,WI b QBCK<,|#7tEl ۱?TpW UXHB(;N)Kj~IYD.u߳j1l3{~ˮj?ѐjTvaBiUU͗E{`BsVL(ePH{@Hm>5Qu[j{D̴.\!MwP((nv 2sKUΨܤ;Ġ|WqüP46Ҝ6ʜČxvlod۷-{+5GUjт4]`]SQtB 6QibtSfHG1.!luȭ< -.(oձ k O!$= $mY_\_`4a{9㪂>-<{B۪zhBo* !&$= $L4)K%;,{R--G7wζl3#mg;XScMH/{@H 2i3WT*B(L8O ;-ӱ˪Ǭ󞪳+B2^ĀO/^U1uS!D(\KM % M|&[蹒BH?{@H2gzW䊳ppA)Hcu?(I K\WW(|RBE#T,-٤&[+mG_8 Prfc-)wߐaKBH/{@Hx?+OF~t&ze&u8dhɹW0Z(m6eΉDFoʬhBo[<lB( Z,=j[_4#uBRBE#V{{mRFEFa%O,XS{wWpA%chl}L~h/.՜CJ+!PI@!J{ڊx /:~[ň߳@!phQp㶵;R܆Fl2Gm`!%x !\hm5BxKu8׽s,OIhM3@>D* nH5oJiœ*M6M̏JOL+#BRBE#׬(uMۥ)ƔB`N|N>{p}S5eaohQg.ruQq,!sDyPT:n{&-+u^B!$= $Z4Bx*ˬt.V,a dXo[QSVQIGj!!Pe/!ţ+_fNQNcht[n;-6+~ňD[_O!e1hQ>~"GT:>ؤڎ]h RBE-Yoe 8-OhAaISv9(l mBRBb@|~\ 閸 J)5yS>GoӬ=G!)xUB~k !KV7􃽕ҲBC5CK \yMf+BRBbͮx~AYKM3 9qil& !'_eVf ό9KM))_PXPy"7;m"Sv91C_96)>_@.2*3e8esP̷>zKș2!ĀF1]̔m٤瓄-F|ڶ!`fXajj |yۄ] }5N|A+">_Ps ӌ)*8S4P̷8xWvk~]Δ! = $6ͫh5xZ޸]VϜA!Tg把?$O/b9^*X!NK+?do3շ mϱ#XOP@nf>l[ /~>ME88,ye(sy\7I@SO75ɪgdWQƃO4,XF79 B>AH{@H̨*1?,nsG5$~LYJUj?5q˦w Pڊ B BjEP8lv;*q }7 [e;|G]iAoN7_nZfc(i8!A}RBY](i!uiY'-yw6K_Y@d=?V8AQ!u:@|^ŗ-+jZIwZ=깤Lu(EICG9P|I MQt_incg|?ToPެZ7Ø2$B)p0Gך9smN P bkM(%EI<hSMg=ԙ[@/p 2yr)Tpӻ꠨瑐r{BZ!Z6`^grSU!`r?zyk$ {@AE4<· P/o;اV$ɅrQ'ΨHgdieSDȹ^SD9oNqʬA4!q@$R9.#^I{0̂',%鬵RK->S] FAX/T7_LIԂ7>Lzwy# zjްURt\+-R Ikb?r|C7Ypjy2i̵ۤM6]{UgŨ{֜u[/?Ղ*4R o<8)זhw@};|ZHiJy;til&_mKMU.[7wJ'n|wv`%)Eӱutz]$r]}L(S;R'[JHSKwȇƧ)Yxdt޺sI}|Gɻuw9zOh#@Jg #Yl/q7dIȕT( #8b{,G>++ެ;nr}s g:(`絇F9_"%>M071=j6~it3,.}*de^s UbIA)|:z&B}xOu~)ؽ5.~R!eV ǂ~Y~zzoBV߸"wE5-<ʖ7p#/\(6_PZǶۄ«+WhEXI-\Kѵmۜ* ^t;L$TF L)>˓@DfhI-]KҰ}X 5 /9H[%Ww1/x2{'Wf*5=:/*]rCG;j8R{%GNjMҗy*(gvys%Kqk,QxSYW|YN\,Dא}|]"%sWy\Jf6(BZ* AW(kX#-*<#x%Vny_4Ni>(aE켚>CI?goх}"n.ڃPrO.RrwzoʨT8MHXSgaY0,v)0AROނ|UlP_+X\+1A[{{*ppRC!#ʭ Rb5-_ZgܩϾۑ+|p5Wg?JѱJy!D!{3:-}Wo #=I UK)m!Xȍ#\/N%©P:13:T1XjtF])SRPsNDUU4b9+΍gN$˰sTM%]3Vȣ۫+"IJ !hM)Ur,͕DkNcVI9ձ؈@c~); ģ }GJmZnz' XP7m]2NeP,?nD0 apg,{OWOGpPlEV-b[( d܉*ӿRpYPDpa/ ,|FAui|tf0:PO'^ P.x=A (1ÁFUBf62MB"+~D,(C4ʆhP{1\яhQ_wPb"?6bYjz[-_mVrE%B/(/?7̅$*e%G:5=puY|B-Yjzy nTn8וzw!E*jN>}OnĹU.Ď}B& k̹@9cdK:WD\ kkd^%ܽ@!'|Pqr{n4\>zvB~AʠhYQ-Wǟ]ҞJ^!]UCœi'XrfPbPl!eVBn!Y;!W_i+(ꇶUh Y7Ԡx㠪6^INVWqZ*^ȣGh wPyb0U( %ܩԙA'?U'na!Xdu}~9Bf!Yt Y`H@s:[+'-~u BzU>T4AJywdSQG4¯\<]Z\.!asb9캬j!'{![rFٴR+?d9GBBM:jNEtoB+~VT,`!,T!Bja~ҫ>~+p *WmGrW!V! 8DjӉjhT1M i+(eT*#HJՅcbyu[l "aP/ѣjsBl,BC,mVKJSTvC:q+&n#zbH=1BhPEb_'\ Y)G'J ?엧+B8Xa[=O-9bSK7 qD,ػ,4ʾQc.WˈB6]&cZ X.o3@|w{u9W-9/bf;e<ؠ"2Hc_9/2 "b9lrVz!fh RЋ w<(6)A xǮG †]˚ aY. S,.|1/.SRD&J?CK 'W BXpMaj.t _(ETQCqEE%";㰠&P:@gi)>#HQ+5ON U}^ydn7SΔ*x!U`# aȆp1"%dcTK!D*70S^X{˖Wsʣp26WQlmˠtݦ ssrn7L1( 8Js=0)k8[ 8lk)_'JyZWocByX~Z)LZV<2N 94 QmI-BG+J{Wifi"YXԖ3ߡ9 kL.}]򨑘Y Jx R9։0h|P){uR#* ?hȳB޾0*T\KhR# t '+)>h#5%fP'l.-vnAFj.Z &EA=ʟh2,E%)##hlVTTE진Y|҈ EIA'mSSӶ8!+^׼I Up у:vE4>K*]MgPde)TYkX~aD.xjCA2zeށX>`h<_2Ȩ+ Ao呋l v˳Cs0|ZrSH$ʉRg!x@;\!59ty.¥\|". %V[ְT#NzpE\@Ucv8 6]$6'dkROyrp E,yD>|o1|Fg* tdWO4-GS*Pf+%RCrFr~[a (j3)m+7I*;_b#PE՛aIE)(7B.ve&y˿+KseZ\mjKrnrN4P,q( e6C z䋕{@hs[%z .-O\Bёvɇ g(BHC#׭j-lg73B  $vUۂ?(h"vc6 ߒFA_ltЀ!w$Bvmo~궭4R.pg%) o,\RԥRB mEP-Umߋo )oZj 0WyҖ -M/ps.@}E ߳* _,/54m9Yeg~)E]#Bvە|k:Rj?ʥ~/E57Ћ{+cR|Bx:e:jVYA$^cVcWo.Bhw-Zo NT5(ɧnQ.+FM} ͠L`R;P g+_,`])9䷏>M:%hB!$4:mM]%~eP`+W(_ʩ5ة*g˱r'ⓒ'}B1Opc?G!Bund5:k[5R| _- "{WULc_zxH}~"G ! L-Y-ByJKe1gT!Tnurй?5B݂ j"X`Xf+A ]3)w_BI^AGy+V+}0;g|gN~k`<lp<JV<%{]bQEQ|.nWsyF#|BHGGMv1=!;j!B!:B!#{@!B!:B!#{@!B!:B!#{@!B!:B!#{@!B!:B!#{@!B!:BH͗]{j BHN)&\2˥>MʪJ./;A:U;P,:W&P=:Cٽ0Gך'%!vI]oB4dR)KhY <~BgV]nGnr[ ٽM/.*6T4V־fYzmZl1km!-Plu"6]n}pG}K}Yo\TlbUUzf;wwWŖ!{.Ӧ|E({fjlP i4-ՙ*epEBۈ{7O3MGx~Cl)֞6)L3)][bϿƦCM7㲿+⠐MQ=k Lץuo.{=j{ڌYݗN.?txqH:^Щfek9kOٰ߷xh`Xr1kI1 o+B"?X"X2JΛ o$ݳeS4h4-bY@nic(mE㳽|&'6V4nw-zV__bm<͕bկY=CMAHj:Y&AHrLۉ/YJ]pFAvUA^ʐ?zӄS DQ&q۬Q?_3ջ%?ySŪ oۉ?GoğCdwgy\Zh4-bBZ!|O,TR=%@O]M9&Êv]bm;5CoZU@)%CJA{'"cRRo(4$ul9rm鸟KpD^Gg<3]BK6o!(ί/v,kqP&kתCBN8Zgx۽h4-bW[3*niB|Md!^Py{PB )Bh[&*o?к]ޗ{H1B.),bZN?wS"˟쥕u\1\FRwWAeKiڟ6VbD% cGf@Y路*!=ʗdUKh s e[キY,E  cTb_VuNw>>Uٟ֚E{BT>\eR$Jz0dF&d3 4^̸v FB!o-WB[OxpY2F[ _;XHYA:PB}MBdhуsM.y (BI4'l)u1ӄTYg{]0f 3rB**OE6ZU#{R5˔2?Fт΄pV<-sгF75>XkUZMV;Yڀ=*]! LŽ芿C%hɿ ||ʕw.#!yү%Ŷ4T"^,AaYeli#41L,#G(hH_l<; b|SN9>4V/ !V&i}7e-5gw#wݮAz=zοo}e[=z7(v1mg7o-3 ***K/!tH 9 ! fី uNMBZ4bӐ~FuH! xF4;(Bfl6޽{??P$Ow5I Y3w廋HۖVNrL6NY^(b<-o _|E?뮛4iȑ#_y(4 ?^} 6u]z3<3n85M6 ̝;733rۯ_?,;v,_Ur !>fݻ7O?4XgϞw"1cV炅!/.3gKM6aߎt<<מ̙n:YaF^MmzbF[ǽmVڪ%Źs,]l%˖-Y+wwiIqU~ϖEU߶~2#C+]k۳ƃ5L:~xM7ݴpۼ1W\qŲeD#L>}q 'D@){ٳ}:}tիL= b/_O@SNE~aW!!f}V$ԩu7Cᆱ, `niiX)޽JzȠA!AȚ(dBHձ ܲe%W3gmJ[6gnu[oޱ3ǖuXhqƬVS{*goiQB.8[۷/T$f!"w^׮]/dΝwR:t^4wW PSCh%^z(xꫯ|{gq DH"]uUk֬K/^ ? ~hR"TJ7fMZZ`+WmԬA {}?9^sGI 3" :=EjEWr=Ӽ NDE)IRQZNSIm$@ըrrj"E¨=3h[ej[8x>!!!k׮}WE Ǐ`UDR;w̺"?Q>uhh~&OW^yz6M8"Ve0jkraNr m[2:?#dھ}; a>1ceRhMue.[/B";&BRY,μt\Z\ZȢ= 4!%j*&\(fRf-\. )::.Y|fcɒ2RfP E즢 _|vTTm\)K/ľ\feeLO)R$'k֬1!ׯ_OdS]G3rPK#GCf ʤa:$AA.CVUm, Az?WfE%e*! 铟X^{YQU*+~+xch% sz`FFbbѣbhGT2bYm۶Qӧ 6Ex*xwAۇJǎ˾Sw6kk.Vj*i<9/F-E8mڴ7)܌U6Mf4BuLk)/:깷W j;gCIcLieũ>ngĕ CB*կ1?k7Ю8*j?ٲiªY)#?~ЎTRfJ>m/>>>"T(R]]][o5lذRL4w}W_(!C"3gϮzzkٳMSI6Dz5W(W'A%Z;^q%WY*հ-DH+rJb7-pp Ǘm(bbcK [,\x YZdܠ5r2UNJD땭gT /;3;%AS_op„ tϷ*:R,fOjo}i(Y?z2 02:AvC>cxr$y_޶m@t}߸q#i5k,]t] 6Pɓ'8pbGrcܸqQV÷zެm)B7m1+WhH4~Ν;IC ㏩Ņ*""駟V,Ugĉ{%۷oڴiԊ n)DɂtX"[i4߀FP)@$B+BS]]]HhآO~;+_T\n%܌;RXx0%!I%erD2 MH)*.2JSG&&߮S444Ѕޣ:{ 1}wAq*P\ȽBDagE\b0قmsSf/ϼsUDxu.L#;)S^xz[bQd_TBPвN Bd4ikH_’_֧>g\MT IWOdVLSY-d\Rӓ?'P0ae,6^g6mK6&6VW/I =VҘCbq_]QQhB$Y@A[JJz R)Ԑ٦NB6uss -:#j:nN,999Q`OiLdm r.4P]QO=}LwERZRE^b 2,<$eƎz d5e&J7oO~ IbIaXxhJSM@ƈ~HRP6]cn-Oi•SMONJba\ye'f+*[F*ݷDH:T+PII)ƨqFƽmE3{|~#B-o5ZEM"\!y[:d8Sz.SAcG+BJM[:&&/Ꚋ zqa!lg'߯F۶b2=A]ovWuuuAaSW%~ྐྵ\,IJJ,q"VY9f7o<ѣ~e!嗖'4Ly+hn5Z̑"/YD(sE"n[{ =EK76(8/’֒$€pO%3exed[ªU*UHD4u$Vm,(*.-C*J#߻oO?uaQ_gDXQ%|_~)6.N-ܹYߒj`I@wkqD23•e^]|Fx3R2Rk*udZil`ƳYѳ3r:t'(7]Ȑ=-tt:(t^*rEs[wWZpݾ؂а`R^}􉕫ָ^zjSZʍr[*,ܦ(('n޲ij7@ikDB,CBT ݊ZYPXDðMl/-mW?1oCYSz)@so3o.^9[U(cb%&w;w<#1KF=Gzk\3[V{晧Ǎ{!$4AV6VGL3NM};**!ck&UM9pȅWoAłk+¶6BtU/\9iɚx3gO}vs=O,g̘ǎCG[֡4rId )%$ŗ jۙgʌP(gSMէJZ+tаŷ\PhθBӻ֬&z+=_/fi]~!=#=|}TMTԝ C_|q<ׅDAgb?s_-l֥ d|/j~Vv@ZjΣO@:g>cr1͎|o0]ʦM_#vNbmlfNEyyLlR%Ikѣ>J܆WF=a:,/5gl@ !Qkp_7t64+* τq_/ш/^ϖ N/zGJ"4.P- W+k7.^:g6=¥s 1e%$$4Kd41ūX8t746VVKs|#-ܥWCTKDh0Suuɋ^>~ʉVv^*,Q+ټ.zEIYqXxXcǠQAJy9$?ĝ6&fm;Ӄ} jZ\QV^QXXXT\L"KM9o\/˦}D~"3+k؂©nⓔJehXHYy1ᡒeА:zh+ƛ#Wed5RNMMFll,_Mi^^^CC\*3~_joݧTWRJe"J$Oڦ iL?U/B"|k nylL$R\W 04VW܉3Be2}EEE]6I\ PYY8%%է4Y1O}<v^$]qs o&5*QEx_5V%*M ^ #c/D5-Z;GTLuwܑ> ެ(88r$ /BZD7nw%)00lb.|mty"2N|blYy\)X6&TDb###*+e ۷_gIa1 ڑo3EGGwTR)3>>E'##о})BVoccP(!.<<4&6($mEDQ5UcKdYÚӏ4/(YwcN xpj:]Xdrr2e"~Ehª*[Kvyp0cS8u`epZ*SK쬨;&Fމ JTTijTyIcwuRIJ땕Թn*2HMMeaU~l D`HĔ=Wfx(,w.+"J4bmTW(ƝK]"@L ̣s%6!%VIM!a^^V !C"BɅ---uuʢ"f"w4#%}pDT'R]JG{f)N121YBpFLZRRqvkIk%/<9'3)ƂS)k~_325qAKV46r?"~GOA>j 魲"(53/6%3&9mdUUURF{x]{FW $HbbbCĪ*V"~GωA!tm455R&Q^y'S߃,JIi܄\o@Eؗh?Y5W'''b~aPPYϙ!M BN D85!"@Spj BN D85!"@Spj BN D85!FP8185!"@Spj BN D85!"@Spj BN D85!"?R6q`z:gGEh<ΠlW*D6ڠV0g}ڵkرcZٱc#:gDfh $+YojnP_5MkײZ $mTg]V׭[yfun߾=hР t#G<|Mh>!W5h t׵jcZvY`J.,*F)HQCj37RO>9vXu.\n;#BNw!nBacEH!^6E7toy[ŤCLN){":@gD@uFa]Gy+u􏍏B@:R ? 05W>Yj N!<+ዐk24 !@j١YL4!"jV"I_׻|yY1)F||hBKCqh:#Եk>|rʏ>hܹ'Nj۾};+DXUUsYfM>}ƍ`;F}R!Cƺu)?00FDDTTTرΘ1cӦM999Y05 O?eMh_fLt߶m=N$'/B TM/.5iOԟovFo&c'={vРA9a„w}wС$_~^c)7xNs 8pܸqT8iҤ'LĉSRRwLL GI io2fքr ӧ)M2eSO=e6fp,B T .7|]%pQVKL6+eRQ;/.+vAF"?*!PFuDH"lAZQ)rMScsHn_ilip./K+q!n.`,YB"<{,Nyyy_!;wβ[cZT_W/%{t,PM0aO%i]>g..Ƨ\p고Uŏ.1yyU5uG"S=߷b&_~eРAB~i۶m+BbԨQd\DHc&yO6!B@AVkѵb J\<%xIYmʡǼ#R"Q5'} me_(_iA\ MNk5{JZrry-yf 7X?&N:uϞ=?_|1f̘.p֬YTmҥﯮnaELy}|8;ӧ JOT-,i}sv9KQ/S9ZfGj֨ouWS,F!X)hlu^"$B2j]? K'G]NRv(IUUUbbbAAmTL( jk6qИ{Mقz{fnTm|B߽Oc-5nHV'l[sIzSg BdՏ-hŘ*ݤFH9/SQ/*N`ÇTVX[$ܰi{!j O(3%ojsӡY7e6Ztm{׊'ˊ } AݍGE gCEz@u/~P``'e2իWǎ;hР۷o֐:$ ɓt:Rye3088pwD&@J7ˌҔt.B|Vm9>Nn˛A`E۹r{M0eO1(\\D.t]E$!.aÆE}١C~n:۴A?So aʖA-߂&)/?{3'+?K)$,>2_$ [UVfpWzu6=#$Tޛ,sGwed/'+qӘ>3%LS.!ќ)hH} > 50g")|iLss_  -(XVB=r]Oi:Y&@D_k;XJo>kSWoq|~NyZOQu>2&> }lS?rP[ ?8,"geS@rt L,\AɂL/~E>l/St!C2KЕjz'_-:"liiq,uixIZ_$ӼDSJ2&> ya.E_ɂ،s. G[-Xhޢ<]Pr*ubAS8(XZ沼l\]Nnb{Aoi˕ yyK2KqM}{L[[ۅ٣T02 4zɂ917c3?i2XR=.) 2 .# ]Qv:0+(]WMr6[ڑ 6 E5bMCGkn)k[k{"Db 2$lN]+!Kʌm1" r᠅I+ӽ(@ @Em*>U\ㅆ-%ćBsƝ( ޵fE(4Y[|T^MڗտvPО)-/7YДH/9ڍ3YÍ?y@)) >h?n,/r$:~DSssU(;;{՜GMtx|bC`M1;tY\Z-R"/9/I7_\>Om.ϼ9`qLb{dX8H"tYZz6 G Š3!)o-WoKn4$W%'S A`_oWO}'vP1.7tY=ᯅgcyQ 2\,MQr֥WT!;j բ⒬߈=iˮfy9w7SoD$dfP)!k:W Bvkڝ2ܙ2(}g?߂3& ,omṽXpEţ+]jl5׋+p9"+83t%jRDhr(߸^١L²J"nRZQeƾ~Oi={hS,fbA.nUf k76555o/f?i!77Jh;//joXR]JU+Ē*>irz}DH465_.u*ۀ{N~GcAƂƛ+*-RXV]FEE]F@@j)UVVrPf`` mg9>&zpM$Bz)l-`"\-1k e;(׊ł$BW?JoTwd2Қ۷oSD"a=EV(ƍnhv#U5TaaJF!XUk{.hv(/4>tYQ>@ryvg.::*,H,/B>L0cOO}t3ݕFUp oռY, ?؛WTF; 3 7j2992Yx@"4:9Ņ;Sݾł1+*eUٌ9%y6S]PPPTYann.{f@ﰿ %e;/emmZMgVM^pE[տXX"t e.lUjj@?!"4D飿-xCj mEn"7-/w5,5dwD9JM NgH!Bw8JDkk\H)y1MKDv^ƶ,8`emVT>Io%gRWx*,c0-=dc@2)Ky1ykaLU5.Vk_ڞ\\ZF5N=NËτpLo hhhފO/VtKHOϱIVM6pK.9KD{0<](tss#C=gk0ګO]"ETTԐ!C^{5PhV}O?t˗/rVJ֭[m۶3gΚ5*e~bb޽R#I N&:u*7nb8߈#h3f9r$m/]U8t__?~[o5x`!qfffYGo?S,ɾIzU٧V_܃>Y~qq?O YNEEٳX!ɒ"EK(,qFZMRʼz}2uS׫|WKܝ)k;yj91N1s"Ȭ=5ܼy3?3##cȐ!cƌQ("$,n۶PTrG̭[q:OսMCvmXW}f)UPNBhsb)J,KONꊈ0gAaHHwS(sVl2{ Cs"TۥO)_{ vz=g$ 6X0n8*>n:?w^x2=<Xxm\p]Ъ7Ym}ǍE8|b֠+V%&O>mxx.X.~Gk4ʧRG"{]kd+!7$3۫3i$jh"ʿ~"N7N(W'A%Z;^q%WY*MS[,CNJ icAuRކMHK[lQgժUTĉLBK/Q~aa"h:KE*՟vX%u\dWHTM(:Pqݷ h|֭[ z뭷lp` O()/d_!BYEJl[:S*8(q<%e)RH[BPw#n33/%qުozOdS9NSL8pg}JJJXM6/\?PhzjJaff&@{MRWO4(]M 9VzQ"T M.k|ky*iӏW1w˜B8pرO؄{.߳)b"ܹs'DpNTZ}5R/laɯLSHe& Z*LzI6=RQ"ԞծTYC㎟II( ytut_BBBUUU2̂e[d>ާ1$Qr-ȹФCItE=l3RcVI-ZPE$b;T DHx^!KJUmeO7J9ኌMЂ,QHA2k-DǨ?ߡP> r1vWMߵwk5L믞ѵ1R*:S @_# 4RYf<|Ps $j^oߘ!"??f5#)^^mzeOϕiυs!Ɖѧ=jq\7cPVS8[x_$uG3E;kAH=2e4vqᯖnںwrWRg χ6?>D>r^o;Y:"IN245pi:CӔ푵zsQ"bH=oæ㭁>Rی"|ߛZc6>|ת U3R:C @ߠh1G/\d]=DoDr.Rcd;2\O-+7tC{*7U!GH ړmq"cكr)e .СgT;?S7_F%߈P5}kxURJN .7"̔ (s3mz}xFH-"ݾ.lHa{"dkܟ,fuMraIҿzv|֨rNg߅rJq[66,@c{% .^rNTK>BThnw̎ ܝ{-@_zҖ+yu>ԛe\= 4~f?\뛻 6 nЂ!lbҕ|٤)g]mc8XpPT#44}a 9f}m~Uf Bw`QJOWxaoI4Мq' ȅwYѡ) 4MV{8;7_"n>oxn,0NZ"BSssU(;;{՜GMtx|bC`M#S"C:T rbߕK!BGaEe~Aᙐ7X%7^ūvْ)yTSS_#4K\Ya_kp→.!Apd,jQQqIVvoDeWjΛ7"2s5VK{ ]/3.X(..a~NNNRR]ԙ}%''̾lNV클KVVe\QV^QXXXT\L"KM9o\/п/{_VHq 9x9@0!!ȸ~zccw?2+(({?wvꚚ=.ۣFSj2XR%'mSN@7e.(Q}EX[[{݄L&Wf@VH$6t B/16_"LKK }vffj Vܾv["hHEtZjjjyvڙQ=lMEP4ӄ>t)BuVnn.YCDCCUHJJ:rZ-3^JJJRRR !Qijjjaa!ɢ)DFPC]EEECDuu5U`{d"lii18(tJb(jGLHHB͹tPEUUms.T6EtDt\t&+oAF_vWų D@EHIDHmʡ24 mdee7`͛7mXv:'QguGQQ킆T*(&aP|ꡥc'Re0$xTaِ UDH+BX!Rhf_&B0ur6N D@["T.,: Li7]:I, PdCt)$iWʔf/NL?JvOβ!]N4[O"Φ:"Y@uKڣN؄.;6DyΝА[q)3O%X!R5:|2Ҁ- }t,w?:&mѱc'^ BjGp'Cn*iۻy.H?tqLNNNAN҉bV\\\={ZJ-p" :57{ ,1nq7ȵIJ&$-!İaШ($ZmNՠA"$g8iVEH,^4/!5xZrVfq'"B5.L ªawzYE򸹚n l])<"-|-4ThYJkPeJJoaD`_OXlB푎r8I~l~68 ;4l"eU!BnL΋-Oɏ6RJ9߂;$$J 5aytIDH*?Ør__j5?KbZVyLA|()O@)6A ֬_"bXڠVy& DBJfw2=r}Ӆʖ^$$$d2{P(,C=S4n!{i6Ķ: Fuu\. Ԝ)"d#f#狐O:SjDE as;!?`:ETƀ2bl1ՄGtWD[bXӚGHuvf#k*yWzx-G$Wu7 q%277'ݸq.\`꛵WTTPTF,Ƞ]SdJ9 $i0zBL s2 ɏ5K=UոfțzENElwtVEh8?&%Eh01&f>NS:Q[Njt&է/*Ә)ix4 ~DTpeYiK;DRQ0gvoAW[*h4;`ZpljXC:٦?$dYj ^e*p@{@O3>'2YV'Y)~/"|8 >atsrrLpA400_J_>%83Ñg6Wt:P^Ž_m"33_ Spj BN D85!"@Spj BN D85!"@A "@Spj BN D85!"@Spj BN D85!"@Spj Bsڵkg>vXe^oB\\ܜ9s.8 6}VW,U6I5uD%[ԭm-TGoݥRi'߹sgڵÃ}ZK59OPv'Y0%%zO{=R, /==_'88xРAχ=-¦fUn~i_]Or[ߠt%mO~SyZڢk&L ]UTTt˗}{nĈ9|pj>t<<== ѣGپ&O'+M9N@zH6\ ;~ )_L0MabDۢkzf+B3v^]DxuW_}6yڵѣG<8<<@zBt!>iɘcĿvcKR &tH.tF6Ir=ו fĉ 5+0vAc_!B ^}ұMKFSjYq^Y<)h]}uh&uEDDPΝ;g͚5cƌM6XmVUUq]mذ۷Ϝ9*^n H4dȐÇ!uNc`YƬs)* =<<?裠 gV;i ̂ƴxf0w)?MVkq6!ݻz1cL:uȑ;֪ ;o /PW#Fƍ*<e'xCWB‚n r{?k7< #mU+W2MfټC3)b/<~z~ݻ}%k׳gvx,f"L7g=r+ ف,Z@!"55(Om_ђ/&zM/]JJJR*MMM---:Nj4ڼ#g|B#tևέQTU~7|SkfagS&j3kHHN`` e.[}-;omm5*:L.[^awy 444ЅN("!;|/~o'90,<頙!RK/daE(J)sر+I_G<3 S`g6)[p[߹gRhل.I?={ĉH~Lq!ɏ6zf1\p5%%ϟ?|fYDgѣGD";9,e(AMcIPlVW\UJ5zӄ"'/Ƿ`1,x`ǎ?tʢ+BZUB3նmۨ… j570>c 3y1)߬s&K!!–O@;BVkѵb J\<%xIYmʡǼ#RО" ?.y>>Ri]oܸqʕ.ڳgΐ>{VPq]7o'߿o߾iӦQNll,WNȜ9s(sԩjv&l'rAƍٳǬ/QFmذaΝ_}Ր!C_).q y& ҥiA@WO4(S)ԂZ9bDHTtq|~'';PְZ~~Ǐ>^4HO>Il%BRH{Efdf"$y{{_`G5FD.$GR5-Wӓ,Eh9윺9r$0i$___f+V80 KէI[C*uʴ>ōY9KQ/S9ZfGjM----ذtLO#9)=50g^ݧ 3eggٮ^V+ꌌ̞|: g]Tm|B߽Oc-5nHV(9\hҡ$zBWE(_JVVK wGMnݺEkSWoq|~N:{._YyzQ5mL;6 ^>AɧBdiܥA+OP!+[9{cєTGW݋-gPkWv £G56=-W6=-}7˸zJ/h4}2Z6嫞?_x~hjj2Y__"<}TUU'5JWgwVvB㫷bBQXhM:..74%ϛ*Ef5.;g[0!TZ}5B [|Kϥ;Q@.4@dQo狳s%R_qv^/.)̃-R`fDgNp"44R1 \U-^wQ]ۏǝ?`~V4sm[L2jۮjj Ȧ!%AB @ I$d,;J*>>*::UY %u^. i^]9XlQ4z,0qmNMпYYYYgS>\ۄ~3#ofcm'8zᛏ))-+]8kM<"S[g:#`ljn`f2>)u+C;WӾ!81555oW^9EWmL͔| FڑGTٕ>zYր9{yaK3Zmj/E34;} I@|Gm{N>}R\xu?nI֭[' N6mS?9.W(dsgyD!ĉ5uk.%ZyczrOa~(qm8iii7՜5== ciݛ?{ ّRw`MmEUuyEZ"~Qh>7?qʄ%wP)(\t^zxoωƤ{9KC334eirtH¼8+V(ڄF.##C W\YYY-Co/E?W>|6gph;1*3NyU]Tƭ' Rx)Fw.u6l9#ʢUViIRR666z{ضm/YĿ[ ACp0a 6$ik-1qivsZQӦU97V=;_?7̿vhiK.u\Р jazz[ߎ;\;`IرcldֿwߎO2*~W%N]ZZTmeZl27#*NKKd拟$Z n坥WS3O+tEE,f^幷ܻz#̬9OL:-,eV\1!y; _;bwmW'Qtt|BPlCxd㦽:~}n"&d&~W-3m7 [ܨSfkV__K\֭[tAEӉz#IM /4mԨGMwWwqCyO!ξ]v=o5`Ԃ __PÄ FH:ѣG+++y}ӧO:{⋙3gΝ;7)))--mϞ=j6ٓ_r!/$\=*Ǐ;vL5A,(uAcֺ޴i{Ӊz ,)l7˸JM1yyy^2 !:{^ꂾmA_z۷WUU@!!4B0L#!4B0L#!4B0L#!4B0L#!4B0LØL#!4B0L#!4B0L#!4B0L#!4B0L#!4B0P[[[Wݪ֮ C+--0a3[PΝ[sWPYf ,tڛ7 @TP&-̞7+s̬|33c響 'ԛ͚UEN»-w&L6V^6- Za{ *z"༙QHi9v6vƏ;6t՘1c!4_ԕ̠ay_~z!㏵}WWYݖ6^kEEE#G|Gz!sժU c= XpmRRҠA ~rJm;p|0991hUt] z"KD3eڤODqWW[[a3B]Q&ʆ1bΛ7O˵faD._kHPu=>>>Airн%\n7y裏ڿW^ym?sm3|oѽޫ(~3]8qba'B̌XpmwFqJOLLlnn ߯ 72+hlͨ/jViF755}YUnaTYӧ_햤i0J-˻6`nIAA{frKBݗZnTcؼyM7\¦caǢKIIɳ>&=]wݫ:gΜz6.wuWG"}7=?'u}Сʾ}nA󆡛a|WA;v6UGv\# /wtjk6s. O嗕E aw|ER˵6n'&?f//=˒=BM®}4fPu?n$(Tn?Lmj >YW6uM=u=###ƒr;6>u3ƿ!뮻8J{ uTRۼ(!/;=p:dFT)/^\r 2%F%̌P} Ü(SL aw>}z߾}yoyЌ[nj*foO:5#r9s?ZM[g͚{w'ahiՕme.U__sYܩYCI[JtӖm1r4CN_^{~Ɯ/@_z饠3w KOOr{'tpԨQ@^twzaL#t%''sv65\rcRRׄHZ~ܼy; vssB=RNMu8ҸK&V_Wwu-2FsDm|2f-f760!T-~ioÇO6MxwГe!7|S ov ?ٿO?_Ncذan a7#EK~X un/fcQAwxԼ9Yȑ#_|ػ3gN'BaYn#>>DmfsoRzM7yC;L}kLG麳Z䪫0`@QQ?SO=6ӧϋ/XRR +onSvBפIcЭN 'ڳjZה,+9.IN$_Q{Ys ?\W^꡶kQ*! 4==}֭1Gn۶m CٲewN;vhWUU]~Y}%1Ea`_Cr%;/{;_'uF.rrXZڬ=Gԙ c[0;[]`C87.S{ږ/ppo^xtM5)쿴6g-Ypy;O#J&pq^]Q߾}uO>xIޤPOwllooB+Ie% {E*50<`뢁K[Aw<4띵;hB8Vvh_fB8(RN;_ OIu&sV!Qt%/\s aNv%!֎!CEמSk!,]UB81..S|!oUSK !\;:RÜ)G]wNR[#{hM(E໓ež,T-s|\W^2 >k4MR%$яO[Q5v= E 'tI(>6wGQri|eݞ^-[ZSWd?PB؝[B-">q'7\W3o^2C|Q!LXeAAmw*tRgjaWowN_TXQYthG!ܼ´B7kk8ўYݺ75zYր9{yaK3Zmjpף!ЏO }co9F畠N3¢͛7?i~nnmۢ2{"pO݉'~ti׮]?(^@mk/-,,,*.]t]KǏ SBCgḱ~mꠗ0+fˎ;/^|$\2*C}%''}EcǎRjjڵkQF[[Rw`MmEUuyEZkmУ!1pݻL͛/}z)V!V?bNNC7+xv'@= 1RhQgdnRrС] bc:zRRҲe˼zصOCmܸ111qӦMnzÇ-MJJvNhG/rMmmm+4Zw :eeeG5 /y׵Co%KxUEPK6%D?[N{CONN5˳HP{sOg趡kݣӀ5t[l Xm9ג_|E‘"o0=3蠩å_`BBwWlT&BMVjvmjۧ7EB֭[Kʞ~tTeߵ7݅QtwVuii~TVOQ'-))q?߿_wy7 Qwf>-/jawSݗhH^pxk]Zﶡߩ]WߺOTd+Bfw;%Q'GqV\\~qV5%'St,v/fF^PZ7 ]Ҹ^)4EEEzj :XN:Vn?UUUC|] MWSՎaC&?S=o{MԴ6jOw=k/K4C(okA/%DQGС2e@{P1 /5-6nvڡoy!HWѬK ˛te׮]] XtR2l=*vuu+EH`C@{8ydW]#nl*jr:! BMXk~'B6Eu/պ9NO}Y !лD93;rrr7ѡSp30 Sj:*Z]uI //.?yyyeee5Çs#ԁXq}B_!׿fEډ7 mVU w‹pe8B87lؐu:wJBypB~KBfzABpG\c^!лD?򣃣U>:tHWUU =..{-w:|!]7:-6\!q_M:HkE@TЌM6ahTe*BƩ]~ F!T5NH4 ENGԠ+rzfP͌`ò tQl簷->C8M\瘚g_Q=T3T|G_!mQ=`kmrCm1 ؂o#v^ѤwwZŵk*ۇ"|'VkJU)XUN&:Qft3cvNt3#@r>wv%:i(0`-* u**k :51 oߛ*{e^?1jcW2*'EթVUrgQk5qTsqDRSlw9x9%NU/5tkj;@ּ?rˌpi[]hKkgQ;tq3uĦ q #70n4w"}&/|4f*}w6ۢ7wnؑE~Rl;|}93zj8g0='{z3#پ#MB$߈&c9r$4 5'Pǁ"<9>{kX_xq_gDFcM|7+ :sBcb{ MHw/'[x`x4k\h+jW+ J^YxeboEZxUj޹f#} 6]|;cPK&PK H=-res/drawable/ic_launcher.pngPNG  IHDRw=LIDATHǥyPuƟ{².˲ 8ႈ 628yr OCM5V^ʡbY"0,,{DPXϟ>ߋ4zљp a22x@-q &6'xnب4Ռs-<!a^zD\W6=YMQ2ɗw|՟-f̶vJA؜s1Ym®n>/]ҹr8୔@(r1.}j:Oi> DowJ'CRRVJ eMPy|{|7sRNQy(KNnቹM{p՝Ғ6Q:h++-LxȄsՆIT~M≹\{V{TTX@vL (Ćyq]zAnBFZmHocs  Çd6ihh CCfQ!j2OPSեlUY G?15t"GUˢy*(M6\$""DJiujdo5GcF^G"@ Vx\|T$SgOt ::erOK\]Ϟb¶hӫnZ>5^7 S~6B3Щb#RجJ[ =64%1N ('5+٥bvTD%W< `y*VnJK6͵[h8l3PA$M;QZ1[,U3|.nlIuG2 3 eb2V'0`ę&Uڂg ,.!蒎Q1 F|UJvuӆaL06 cLzN׎zXYٹLGBr8#0LmMOS7onDVv͞} DLژ.C{e 󳵴&cY,ZKSiZ=I`҇6%]Nm},ŅU5SN܈mݷ<65}E޷'0CקԄf.̙3;EnK=_d*/r.Ѵ#>)?/Ԟ H\o7aU%(|${hjǜIL~ cS/LҘPPX"1sgsLuP!!"@&849^1|'3}ȕs_-]$IVM1,,D-aEDA̤rIENDB`PKHS Lres/layout/activity_main.xmluN@=[$BHA"5%$ 'Ql*x$ G;es;wofw} ƘMCt- G«& 99w%fmF)B[nTχUПg!F$~"u.m*~RUx:R}o{EO١R3~`)6d?Tޟ#]{ȣ>64u6Z?p̑?gqդ~,ᛙPKS LPK H3".resources.arsc 0<xres/drawable/ic_launcher.pngres/layout/activity_main.xmlOBB Main/Patch CurrentSettings Hello world! obb.mainpatch.current l, 0attrdrawablelayoutstring08Ln ic_launcher activity_mainapp_nameaction_settings hello_worldH\L4H\L4HT4 PKHqbDŶ( classes.dex{luϝ%KpWԾ(qH%Zʲɔe2,բdj"#rjvz԰dŎqqmXp.y4IpQ#uZH1&6Z)NF.GD7s{̲䜍l~0y;zjɶzpvp Q5ED/oh+mD߁C#jYEd4Qp\OW߁W]0:h 8 >  9`;5USx%{ y0.-"Z> e2G`߀ p̀Sl#`;(<.+i%p || ° &ʃ@=dl`#6!0Ip+ >0 v;.S$|WJz[4溮4GL*d~OW),)\* υ)({JUu1ީMj~Wz7IC!֐3 鉐 ЧBeG> (S&5f;F|$ui.R򂈥MԪbiIӽ*Pi%kc!Wѣb] :)ִ2?DŽV麒ωr Ѣ&0 Mtz5RfhF82dJB1! JZbkD$;(dN)Y2MTsJ>E<ֳDŽq9aTN?-)o ;]g)ᴲ_12XE|KU;< A_1,1#Bv*N_qGU!8Sd^/ωEۇ BY_%+AݭE RA!`0#ߎWN{B`-32|FDLvKٿ"C_P7ȯ  r̿ +ȿOy2yPRCւLQP`gnD~w.Ψqcҷ 3h~ /1cm9};-;m]젟|ЇVmĖ խX#A7Cyy{(ڊۍ$)@: _E+VX"||;VjdEآ-m>cBy9f/zqSFLU~iu6:+j} ~%exד>0v`;À&.VU<]XcԆfzǒ17m2:mkv^V2hgY]xo>;DGƣq~uʞ)/ϮiP(ҴGO0/;Wg<=iy {ٮӇwYa<)V,ջsRxLKuyVkŜuv7L+MH߿"]ZH?"7H_M{ĺqFmVrH^%7)9`={X20.`ꛉMXcA}cloVǝDHl'Ew[EڮQ2n4{'-'%gy~͚ X%7}'\o^&cG ̂[v,l-D8?J!۽u.:7QMVpbY3d>(N`W2V`I6Cv_6dUj;P9rEMED]Ů-Awn|B۵ZK&mݴL>kDꛔDxPg8%OR{&CD8677b^bGI;(?SBG i(}sq{nΩVP*%{ǫNUjx pXYjA{ܳBs`n]r(— 2)PEJvͦdɩU"OzcܩǑJ-"P \JW!}֙0[U)oj{Є&nlީHqe`רHT;mwji~Ev(lV v8egUj[pe?(ru͝;^Qkr˖-Ԏjm:8UJ͸T;1VhT?ګ5ۛsxqDbA9 ^yRk>"Ÿ#R 4vOsYY1FTU*|WJ|Pz=p-dXt!:ƙEvvl*^NXnjNi3{FמeΝuگ9}Ξc?.F^A6bEuڦ=>8OÌ8^DE:Ŏ:NxC>快\~<&kicCu!u?2-q#n}Ngt%Etmuu7ehnkaɡύjX~fF% 'b;G;>V'ti㱗:ZC-l-",W#;fHf[f(chmIJVhllaPˡ}M큦`S"kF~eqv? zQT<%|>r_<6DU~JcWE"e^y]|>.ɤaOk֫y-f4]rhlVf?*0?F.d>5c1o៥-9H'jve qN;[7D=;n1K~w==joc%3w Sd*/~go<ÒCU}.;PKqbDŶ(PKH +META-INF/MANIFEST.MFm]o0s[sdLqjļ@mAl&NUR1VnFORД_ʯ`ݹHȽi2ڵnſ9KMc6}_CBP buz맇vknIC$ J.J 8${0ku\fjQS(EL a=# T{zAKL R gp-/Mp%S{opRWseZ 7G@lPK +PKH|e8META-INF/CERT.SFmn@= E-(I\Ա ÈAf@ԧ1m_YX]a.H,EZr PlDϲz$ƢP}:X[A1|F,j4>}%Y[ʯi4y-e7 ) #%7:E3ⰂamX2\;zx}1v4{prOv; tVuspcK*ŭPK|e8PKH3dxMETA-INF/CERT.RSAU;NbR%Z̗(UZ -.*-R;S E)c_2]6`RZVRƌZR2u{?0?yyssPqAdOP$PBC]i@  PC@%4x1H4@@mP𗔫 J 8熑R eD ȃr{e$>? !.D`$@Q10)Y+|py@X`xDȕS!0*ɉbNzXu=`@?? P밠pCB B*&ˌbΚgj 9p[vnl wbR)FlvlClI;@7C(l)Z^w߇A+6XX[ZU ɕV%-S =^)TUA!{8!9EPEv(CwJUԺ6FUC%%ex"}۠[ws$Jv^x )JjK8 *:MG2ֲ]p>4z ow'd{vs|Dьc'1B׏{5N'A;Wm5jṙLl@lӂN0;|Z=o@"fni.d2$!Jƾ:eo6򲙚\]. &:9l'cFhb>C;6 ; ی<8sGPܱWcZ4"fHı> PyAHM $k'pΖS] lsղUcb;vaAoE[:K̦֒]s>Z쾇/[|t|fbWQ4L] n']@8r5qVx7T} fu1^=isxq u=B՚&qP ͊7HXx'秙M3C9®1QU7"S%|ءNoij\/]lHi7u4G6> }V _Y˘o^l:0<dl+2tXVw=οX[Y@1&pi'L'T&_$_‰;-FMɕ b$U_&>[.F~'Bze漴꒐('_lbffalQʺա-MKo$ވ=ʷvbZ͉!X1H0cFu-k}"aGc?e_d8t? VSgj3d.rA(5ViUpETa8[ksߎ-]Jbzm'Qze/Eɹ^c5 -va#v/*Dd >g[ZgT{z-( fAw#bu֤YϻƟ[?!,nw%Zs̚--Q#[x{-џ U_Ug|vnoH"ŋDb %6n<J|}KgmT2r8Il4t=}ZJ 5_Y;3ny[:q-Vfٷdfd:S@PK3dxPKH&AndroidManifest.xmlPK H=-res/drawable/ic_launcher.pngPKHS L res/layout/activity_main.xmlPK H3".) resources.arscPKHqbDŶ( @classes.dexPKH +/ META-INF/MANIFEST.MFPKH|e8!META-INF/CERT.SFPKH3dx"META-INF/CERT.RSAPK *././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/obb.mainpatch.current_1619_another-release-key.apk0000644000175000017500000002445514620351225026412 0ustar00hanshansPKcJ&AndroidManifest.xmlMo[UڎcH4͇6Nĉ? i *j"JƁMu VKXw?5B,sGz}H4 ENGԠ+rzfP͌`ò tQl簷->C8M\瘚g_Q=T3T|G_!mQ=`kmrCm1 ؂o#v^ѤwwZŵk*ۇ"|'VkJU)XUN&:Qft3cvNt3#@r>wv%:i(0`-* u**k :51 oߛ*{e^?1jcW2*'EթVUrgQk5qTsqDRSlw9x9%NU/5tkj;@ּ?rˌpi[]hKkgQ;tq3uĦ q #70n4w"}&/|4f*}w6ۢ7wnؑE~Rl;|}93zj8g0='{z3#پ#MB$߈&c9r$4 5'Pǁ"<9>{kX_xq_gDFcM|7+ :sBcb{ MHw/'[x`x4k\h+jW+ J^YxeboEZxUj޹f#} 6]|;cPK&PK !=~res/drawable/ic_launcher.pngPNG  IHDRשPLTE)!.H`D=768;er~D?:E8*  2GZ'  ڮ,%!)68.# JKKA@?#  2' 3DT ...  .; !&1 ///*6CC5'  ]1121F;2)667omk ~c omj  H;.  MNO544 ,,-111 &'&&111*!''&223&(&&%000!"&%$ !!# [|u\# RST776#G9,  -:"%*   1@IDA=DJCCCUUV{xu~754,,-{yw}{yZ[\srq[]^zwujiha``79:542\`cKMO988]_a϶^_a׶?>>hkn@ABvut788#"!$tRNSL  SZV6("Vj.ڨTr5T"\r9EhqnnJpDACAD?J?J?QG4V,vRN.=wIDAT(c`@F&f $ّ98/\XXDt8!!9SJZF.!'?k"pEbɥ@Ĥ+WQ$%%38$q-3+dyNn^~MĭBs6LViԃ`P^"qY.P:T =nlb@`hnyYkD{GgWwCo_k$ SBӦ30"pU(IENDB`PKcJS Lres/layout/activity_main.xmluN@=[$BHA"5%$ 'Ql*x$ G;es;wofw} ƘMCt- G«& 99w%fmF)B[nTχUПg!F$~"u.m*~RUx:R}o{EO١R3~`)6d?Tޟ#]{ȣ>64u6Z?p̑?gqդ~,ᛙPKS LPK ! resources.arsc 0<xres/drawable/ic_launcher.pngres/layout/activity_main.xmlurzipSettings Hello world! obb.mainpatch.current l, 0attrdrawablelayoutstring08Ln ic_launcher activity_mainapp_nameaction_settings hello_worldL`P8L`P8LX8 PKcJt$ classes.dexluޑ##u;J\RDI$eG6Y"E9(K)١Kޒ\{ڻ(հdՎH qep:.NAiQ m@h&H@Q ;? >޼ćo~Vlqپ^|{q=}JDrlgԿ.Hڇ@D'2d7!oPj$:i3>7m{.0ڈ@3h` fiq,*76`48RD.pS?F  ^ohfAP_/ w~&H4{A0Nsx<\/;^t^0n{$8 ΀Ki%5*>x wl#`?L!x|| ||~\ tm`c`c2,>_/Bn'0l -@@7@%}` ~lT$p n]p'`7)p~f+|WJ z[4溮GL2d~/ەo~*\* τ){RPu1ަMj[~U B3}!=#6?kTW`ҧa0:mScN`cס>C|dˇ7932nRl؁HөMO2ozoqsh=#Z4[[Vqyn:|jca܊8^]Qˤof ԃr_bjv>[vj@9 Z~n/Z [mk7Td qr d#h+n2ZH"}'҉hi-YIcs u31|Na4R&ke /*lImm [<07k7}QЃWoØR bdNdm<%7b^qmDn Kg3ls0ɻ0fFYy&)V{0^h{@ f<+sޭPiO'ͤݬeL?Fن%Jc\b\Ҳv¹E{ce}k LVX2FMFͬj;lT>V EgucSN{*o{{ o1].І<'P=7?,ͪA{ϮT,{?[\o/T^)O:s|58m[?V7JNзcRAHnS*ip˻>|>?Na+U+ViKܑkU+z~(N__7yhbe)q]gnmo!?E^mCCM'CC|#zwɹI {lbror/!1DEDW]r[v.qh˲y!+_GW ^߁ʑ+qʟ/!Jven1?W sC'_:gW*s7/u2E_庫oRbCm<1GԧMpjojż,Ŏv 1~ǦʏҎQ B:c-:ܜS.&/ ej凮(;~V='…Bme ^r( Ew١_gdSΡFy'sbMnDT+㊠?sG*5ԖC1x6p2\93W`Ί[)oj{Є&nlHre`_]K[mwji~Ef(mV[A?p&2Դ3~PR;whWExpy7ueM.cM8mY94OR/cOl%t]{a gA=v ]u/5/,kݮ)C3tK44xnP>gfT2-~42:8Hy>M[`[ٺV#aG?З֠k0ff}ZY]tgZOoM Xg(Y_ʠ}u큺`],E:tnw8N1~^/0>37^ GRL*y/5LH]̋"/w E~_uDGҩGg2U땬y# 4]2h 9j(os:{ye=+5 52cXϿI2 Ǒ~G6ۈ uZ!֪Рտouo[YQK~-)Io%sUy~aoêQ6eoPKt$PKcJ%!META-INF/MANIFEST.MFmn@= &]M n0P13ͧۓ/@ `.Te1H6=О,rFgUQR<2MTeac݂'Cw鿘 j]kp,*I$9>BT~\ٽ3" 8B.P(&pےr6t]ŝtm 9pHA>F5 bJ$%5ּ$J@ۢM|SKs|-NK/nWPK%!PKcJjF9META-INF/CERT.SFmn@= -TX5P6fu?gO_cڴnnrs䐂X1e$K A<8& qR,ND^wqK^܈bP`$Zьg%H!|~DN.C@X>xe-<uM+b,A#R`O=r!"S8v2=ƀ"Vs+*Xmglo_& ~{PKjF9PKcJ΅>SjMETA-INF/CERT.RSA3hbMcjhδ5ܠ5ѐۀUIqAsAsASf&F&& xjZJ&0 39Ep8NQ 0[~SbL-,\Z\ % @y%E E9ũr⼆FFfF&Q&&PQ 9xY\LM [o3пJ!fhβ v]ߺʔ fN9ݒ=tuuIM:b'sͬm&@9kuCfE-N1gwJс[Ѧ3_V|nu/8aOeqqC޻ì6('EɵVnmk5{Ӯ}h>rqdֺdzs^?mu I]tpowdZlj O='ٵP~C+bKho2v;1.~jVG&fFŊcc{=xޛK YSu>ehiv>J;'c{.߱n|*_znqw}"Ô8uZ{W?{mkq_ߝrq*|j,/̰_?Yo]0}{Kk~Z]}rM i>0 LHjbgibdضrSjPKcJ&AndroidManifest.xmlPK !=~res/drawable/ic_launcher.pngPKcJS Le res/layout/activity_main.xmlPK !  resources.arscPKcJt$ classes.dexPKcJ%!META-INF/MANIFEST.MFPKcJjF9!META-INF/CERT.SFPKcJ΅>Sjx"META-INF/CERT.RSAPK  '././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/repo/org.videolan.vlc/0000755000175000017500000000000014620351546020271 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9243832 fdroidserver-2.3a1/tests/repo/org.videolan.vlc/en-US/0000755000175000017500000000000014620351546021220 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/org.videolan.vlc/en-US/icon.png0000644000175000017500000004042414620351225022654 0ustar00hanshansPNG  IHDRxsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxw\W}3۴*jud5r,wlY.m@IH&!& B0- `c .ؒzu63X^I[fv~hW|vwf{>;k@] @"Ig`ou"IT0)I-Ky@$)#$RNkIvBT$E%}E[]2$Rwͮ 0d%3*Qp2GstS%uNFUo f"M-VehvE8OJ2 RTi)>ib#ɻ.@?Ta]/woEK$CZ}o /_HHN4`s! o`&($]iBu*i,qL%3F{Z@m@|?L_gGC w`Z@@]ejDz}'c}Kc 3@<@V;3[&)7"_Z C\+VI dQW'Aj =gH6T6I^U=e^>G\*O^ih>Z'FsNp뵒׽JľsJ|Z $m\pR0%u'j<^ wޮFj =I(6p2Bo{ _I8Ws~8p㕒fշDȳG n~+4?Ro>z1$"Q+){_}Z&_PtkTC;+ɖ]xk@è%`E!u JL1R@ǣ DD\8P0*`RqV# *3NuE_z I$>M"-Ic7(5 Jߟ1"BS-ٿ1ר`3ܗԽNTO10$$ulKGt bEiFµLҴVhwXo."[^9WeI x(7`"{B5LNjL=r??fK\2ISZy"@nu]V <PF1?1 5zj G`*UFc  ]r}ZQ_~Fc  x,p"@@v#AJt_R;c +#_v$@@J`S+wNNB a #c  nKI9@b +%ɖ%n0@G?z:%$/0DTa_Jb` ԉ')I'OR;c.`JW϶mT"&Jvd;0Tz!kD*J%+I-{޵l}`/2A3;sH:m ձv+?aѿ[>U EFT*}^һs}Io![9eEJcCJŝ}NYh_j,ǶJ/2F`J'i^ѿu{] &%'Z/ta )\dGO2gR@px?6uqh uH~u/5nʥqF_0FafϪZbeink8yexPa=RVݵhshi1ktp89- oΨc%@@ji#1kn07&kWXґnQ/ n_yvYH'2]㰷k?h֑m em=ұI>6ʷݰտCs3焰6I#5Ԁ[Q*Zg`]0״ޟ{fϲS g0j@jhZ^fCc:[KWֿ$omN䈝V+i ,^5@ @ BkתPmPy>CRm7(wJWd.5,z}{ݬg` ԀT)H=m.֫t}(gz7\lR{*ѲԵO: EyC5VCkm׭ e\S;+gg_5ٞr1 p ` 0D$YGR1@iR)'YG@qb L# Rǐ Ȭ\gfHz"WȲe."L8;@@Req3cdDGMcdY?D@V1Id12,DwԄ12,1@)1&cd YS `hcd [r0@%1 ?A@&d0@fQ-"3NcdG5b L hVzdAf cF#G@] 90Puw8# /F&H3R?F@eP0@jfQ/H-R)N ciEAa T" h#(JNciDAc ! 21@*.s]$҆?-*M c A!c T! Mh#lI& R7J%~o"x #h#"\A@ZGT HLcb$D1R$u nݿu @ @x5'ضy3GDR<#V{K;$` &' >pN+ڼG>뒐Nf磫>?e|f1w'.յӪs/9*w D# NO9/^,?g:6noŒު/_!߬w(/?rJo9/W;¢?\cw>ڷxO&H0 I1[XOS=UQH_;TclH,~ż~Rh?x ;՗VO x CCwNo^W~Ϳs?WJvsxw^\{2axQ@HH+wsXN_b " kYuY÷y+􄔼Ҽ?+>7q+$ZRH<#m5HQVt֜ ʋ:wϛ=. pUHR+hd^νs{ܽx\JClY8! DS0_κ@jk/-olOY:}l['/4u=tCi?ߺH^㉷ E柳gxz*l7`=X⁉xkX^Cgǔ;]W&2E! QTq]FN1nI`K<(?7 ?%hh0@G p1b$ sp;rIGJiB@Z j3OZ#U1Odh6 q a xJd+@ 6?^ C tDpp1BG@h/I~ua?^c`*\0 T5`pTM6 ,BVJ*_B 58c PBhW E@u pU|$cU0yNKu]1G@Жuh6(FZԆ1Ń ߘttT1E@@ ?+Uc V[1@`x !k#! (\'+P;mNɬ%zAAc pZTz$뻮u# 3x1@x>A󣂩' cԍz'"PEVt %/u!kū1Fz1FF@`[\Mm;Z$k`o^ $#b'l;N/H^U -<_~nT2APRʷbYx@RwMdSrYmV /_ȥ77OE0'3.=-uU<>bLu0]wmO|"&/2iB靛۹7"&)|qqWj 9;E|cԌZ }y߽r{X2G' $u/KںHScԄZUK?n6A@5:+-\./&Z$rߞo,}tlkO暤gS`uW$2kR~]vڅ k444<JMH:Eo;{/$lKQi޵ecԀZ1뾺rwVuj}WL*ugwl8OFjP`*]_~Y%Y {$kD7|xVc d0P%)RK+z5n(w?fKyv@1DU)J"YØ:~o_6޳DY;ֺJuP֩xT6wF+o4_ b8{Wm~Мz֏[}@\srǞ/B܅1?;9~2_pc2&}&@8ʎH| t0P}ށ[s?nu_~a=+%gf_K"ڑ1En{dd4%upN0Z=/k!o{Øo[YjE77;1Deܿ?=SU8F*]Wht^h//QSX"`PR~Z:UJ! IDATr[/+gTUJ[8 VڳVH~Õ|t;zdŜΆ?v]Aš?rW؝xkxl5MT= ?\;3f.f0(z=f/ΖnVR&U v+vE \Re};zf7cs#ۤ=@ڞ._5k^Rj"`@nu[_}9/k#@-*Ww]08IbC+O-MNسJ'[# -\߿@sc$?Cʻxk?#ҷVz}ɾQv~V̴S꺚0I8IRCms/ӱ IsP:1-\V.51I8N1wxO|nB1lrdԹ;7qY_% c㤪?rw7_f:pK"@zw.N0q8N*U0;Ysf g| }ZT@5}r/Uɡ0qxQ[ Ӣ#( %i3!ɷOnOS/XE(SjvpY9aao'9$rqUg7xF"x/j*noO֘5߫}/ŝ}Z&xS4;f) )xh/-1mJZ/t8*.SzY+nkZ&8Y7;Yi*uNg@߶_Ngl5 1$p[s.'9,%b1f=c.x85 8zR1aSy[N}]e@+߲N:k?z.x ;9 F|e-fS{to6'==#j׎}YNZ)mv38&mO d`|*k=~T{.ooCSWJߴJPCN:/豓)KFIgOmNՆ08@VϧJO)ܧnQOG9XRzM!_=}=l{بt$RgΔd}ceG8Ѿmk4Vjg٦7i\mנqMjl[&Spn(08@'$cs:sGop]'fKupmW?^«$- ;lOHKO"db i@b Y@b Y K~75x\0k$}QҎbbqMǽF`. IW;&7?K;YpϨZ)ǵ` [RZ.D@R2&INT07H^!)w Ǽ~f7(j1@oE +nIMK p *cc~n HRxkq\Ij [R88f"}>~\.-)H(I@T0K2BAx IJuIjv]D8@=R<M"\v(3ւ#cIjVE u*Ή@| I򥂳 fRhs'c3$ud7H-i"B@R>.IYUd@d` p]V 3Z2e)cS$O% .@ֿ~dOv] Y as?e` p/(Y}կλ-cf"P0%p]FX'8ّϑ`Rcl\于" Z'73<Ẍen @HgVKE'E ;sBbit]D fB:md!dkcN}|yI>lZkFƅO2_P+3ukQj;Ip|pxL#w;F!D: ;`r^庌 ^?u Rz|-@o>:iBt]E-`%]1:ײJCȄS:S$ﺈ?HW*fg.@/QY!;#/c{io<@™Rgu 2G8n."LHeTTNC2J;LI_/os]lw!R\d=szn]'ˈ78@dGZ}--i"’w߼"=ų%U\ ǿcljRIN1?to:6> gla=uJy IuQe$t]֖W\C]vuaHg軄EDs?3eH>K{dyp T=o6{uXw:I.^_/Zn|;P-J}Uvy݌u]D f,WϺzNٍ=_+\PW."h }nS`so^rq] ߕ/.Ot]K n ^{~.)0o=V6unR2]`R٦G{UzL*>P~\I\#fw1;/_vlu] xW~E{x0-WMp] r/S AIyi!cƦZ?#}zb*+\sTE%=`KJ奦6ߔ}zg=wZf䚤 RoZm*w\ ѯ?ZERIAB応k K}O^Ql7B:@V;PC@ߞ?k>oOL_+-ǀhxՒ\4B)_jJ]\4H=zgUqb׵$\*:i ap,H&>9n}b޵T~Ik/%LUl*dZ.'_fM%EMuP0%p]FV9 @w/}ネ" ߽qr3+ N P?U%?0&yP%HJԽ_CL^:?e&iqVw/)E]IҤu!#@L\+`'v$Yק<-6\G'o qB> ] 4P-{?sV'f[6roOW/Pgr2&cd [ns]F 48uã7}uƤX@O~1F?#=vIֺ"I#iRn y}>'Ќ`loё=ǽ [WG]1I}8Gbq1~yb97Ψk|fcx,}'Z@bI4d_ajozzn_igmU~Y̒vߺ]׃$<$VJ:uY38%eoՏEj46ʀ:QOBI\YI[Wu@ fMȪ*CdLwϽ5cq&Z?ȗϑ:w[Wد.VIpcX.,}rWҫPW~Wلw]?19HjJ7AkA͎Hغ. ,iB$L%Bw cdh2/+~~b+\QFJqcZCݷ~VkHvxwzB{hۮ9ΐ_^&jI I|N{\㍴Qr?Н[ijH'~?{֜k#=ֶ \Q$ .';H/zݶ5w暱9RӏWti+jET+Y`Izu\ !@dJfOo)fٳ( ݱj}{[_- h]a?뺈j%-u]\8jgsǻg@WKf[Wث]Q$] /7.{ߚQ]){xi,_8S4up]H5 fJ;2)ǘve{$5a`p}жs%6Hͭ+w]Q$[%2PPC11/ܜ[މޙ<B8u[W<6u?[ɽ*vET#Ik~u]$!/_--kqrl4[X[ghzKҴ?&#'i)KD5.[]fW.caxZ>ͽ/Sw뒐8.b8Ix8'HXJ_kO2V3gŷZo[N5^vZDU *WU#vV,/jII.s `.-6ߌ !bv-mΒ\ׄxuuIJxLRe  6lι[||3~6aMJojwi7*[9uYH-v.d(3Uv y$H,C@mfƒ޹7xga?uIAq^ܿP?CDkJ%}u^C@ -;swxνL?W;6g6?Ckw>3CSŋ+-Jw% #Q!x{4z8wuAśwh3ifœ9xaX}͏[km̗'. 8A Xr]` A>IH#rXM7sYUS/k5s.n&-./+*#mOn>d*v6 .)/^`&Iu?BIz"WUjBL$L:q;ꛃ#Hk&6]{@s'HH HBM;N 6$!@XG@b).`fKeL1#䛁 Xtb@5v`%] !@ t"JI\"!8!@8?12n,m(E8B#ND & $BXVl7c\m.8I/w?2FI׸e\s wh#nq H&i]u.4qv@W?b'DpB]Xl74P0S%@ "IŦQ^ZED(θ@AWMƉ6LWD'P'BI4 ,HD y? d^Ԁ Dgˢ,P0$-l? $! eWH BDv$#D% *H"DIWFQTk$5E)BE1*G( Nu D sfQ؛ f!@@BGL!H"B:nƅA`&J(="C^ҫ u!@B}p#k&)#0Ea-fIC\HBfFHf*ĵ"AhW 3@TiV݌ cp@̒J@ZT)auxT cHT6@ a~f.ZcѰR`X4)u#80%1D KJT`CHB2WҚ0'a7Jz,!_+0^@3|[ !ȜZWZ<p-)d!Ȕ/x/y S@&l077aJzJCR$p?2և[WG$o$ #IwFFT0z;_Ҽh6_r]6Q`F]d@Rf+:7M9kҩcwEg]]E54jvHOw$#rd}c^h.6OۯG\&@UrKWa?3%}ң\@3Zu"g/Uz4u-~SyIDATӠ˛q]pLyز^])N$mr?;nw]O f+u|M5r faӻ vˁIENDB`././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9243832 fdroidserver-2.3a1/tests/repo/org.videolan.vlc/en-US/phoneScreenshots/0000755000175000017500000000000014620351546024552 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot10.png0000644000175000017500000002207014620351225027571 0ustar00hanshansPNG  IHDR6w,>#sBITO IDATxy|Uչk}$!S $SȠP )` NUZ߫חWmV[{ZV%`g%L%)d d:k?! 䄜 ~a=kz/@`%,] nDw1jj-Ix\ [ʐlHzHYԱ@X 8!kZPz @z@m)) 0vMd nO& !d jPp{Q/ @X`K4_~ kz/__@|BtJ}/FcX| p7:@& JbtD'""\>قϖj0@;O7&Dƿb1nbXp@ m01˫ppoJC p`똷1XzOS~5kMixd9d(J_ ."BRT""р0 Q8a1E p!2> Qbpd o־,k_ި^ a17cyq#  QwCp!66Onea1lX2<'c88|HQz,&ܨp!>WPy{;73]pU|@`iB8×dTFu{Z5l¾QI3Q;H&>W v  Am,3& LL[h YAv~h+`4L^㔮힦?Z>@j}m2*VR@XrQLLhNke tgy}6YXQZu (ҋ{q )$€@af)IA1Vow[8]×A R%rHՠ0o5[ykZwӇKkP <%L ><x>g&5`4φ>'Tx< s y=XBg| lMԆyԮ-7Bŏ7q~׵92B"<kÓsQ$1伇z#N15VL܁M)O4fX- )rf0( ;:W"G:j #3v!>?˅ɂSkQSx2F# $KŹh&|N, ÿa80` "b?cNmmSоH vLdՓ8d.s!YUL|{3*]sJ! A~(!1Fhd}ÿFX a.}/*O:>@ҝ`;Q[ qMnf QH2؈氰G +~k8|0 / |.,K8vMM h]dC IF}!'H&q3/ {r ލ•$$ cیx[Ť3a@ 1HA`\Hi8RT ̓xd D`ˀ?I{t@^bNSCپN2+G}% 7;:{_C!, W/g89珨@T|;V\ S:38G#>'P-:FS5e[Cǯ^<3( 3z7 cdC.}/oJs*E^u`bЃf&~*@rfsI|ߏx5dOß|ɱc|>EQ*Ic1iB$I޹W&dY$$&*rH̘H){Hg3/9+**zWzd2m޼/Z/__z6L/^Wx<0e977wڵׯ_vd6'(s* \v][ݹ>z4m`^WӴzѣqLLLaaΝ;O>$55uҥofffEDze&N3Ϙnv2<##ĉ[n=zhff&4%R - m֦:wܝ;wsǒ^tjnٲO>w}nݺYE-Yj. 'f@Hs_W}b-AU6T|޳>K/,Yd޼yyxxxttthh(|Ĉw}wAA>*Iɓ+++UVufXuCVUU@f[S] xcdW͵Τu&Eks.Bhf6^"xNp9`Mf-0^*{+. <$*:+kRhy7csg}ޡqbE-M`4'ܖ$}o+$€@a@R he[@@Ֆ(H D(SW[%=jiH+L|+qB6YO3dã0/l17Z;yٴIF&&1וcL'?kCj$dY+&F37 7:Epr@ )*=F(0$ H I0 )$€@a2;Dj'5cn\ >_1ƪv{L$nK-aQ43cL_fw &: I0 )$€@a@R H I0 )$€@a@R H I0 )$€@a@R H I0 )$€@a@R H I0 )$€@a+!Q[%<sŖzwh#VN %Ԓݵb= Di[!ɦ9ҕ @Io~.Ch߀ ߨN W_L *|`Ӽ~;@AL^REXkσ ȁ̈EQq >=]_Nim/X,0*NLsNHAH L %0"rDc 9.$4it)0McG9wE ~d{>3뎧\"LR}qp`Ty!+L?gҲKa29^$Hriϵ dsФj$!xT2phh&N/|;64@>8KhI SxŞę^3j:Mh9zUL!ި{^4I{t4zzV )t|$I999 Pe׮]@M|xȐ!='HLL3gӧVk||r͛79rTe۶m,GEE͙3PwB ?ٳzШ(y]]:v|BW^|y׮]YYYm}QQQ ,˫JHH6m_=iҤʲ\]]i缶`׮]6mj ƘnOKK7nܱcx#G̝;dUUU !TUu:Ǐ߶m۾}!D94hPvvvCCCuOgrٳLR__?jԨ+ڸ6l111BXeeeNNΉ'c3fp:)))BDDD`jjjIIfSeĉGCp8 ҷo1cƴ <==}ƍSLNIIY~2Ley߾}999QFɲ ͶvZ9gq%I2^WgϞ0.=v@l6*Yo>o޼s14M}jΘ1cҤI[7} pYn:k֬R=ӧgddʚ>}Bicի_~w]___SSvc^w3f )+++((HNN{۷/&&&&&(222444""8::ZM6}t!7|i&c.\HLL]K}} /++ ӓ1cƔ)S4MۻwAfs;X@TTԡCM&Ij NDDDhhE/+B$%%:t[VllLb2ᡡ膮^*IRxxx^[[k6KJJn0ai6(RZZ%IQUb̘1G:thZZڥKbcc9 GFF !8W\IHHh{YEFF>|xԩC=pɓO p3du+w=Mw?"zTinoNj{z&5MeY/4*+=qm7bh5о!5qj(w^SUU6[#ιCB+30^itt`2Ǝ2g[OnBߥ;v.MK[1b;e˖ϧ !N 8/++spܹY9r۷5blڴ̙3>/>>r}G.]RU566&~˗xb\2!!!,,nggϞ0`Vk~U?~$$$Hg:u*))f>}/OMM3fL(}SNl6oz꼼ÇLǏ9r͚5wqGZR6(ѣG#$ zXpӧOKt+V1y k9s~l67zO?4-55u{Z_reB/XnqG/)כxm۶Lk׮ tLP˗//Z(??_劊A͜9ԩS${gܹ;wl7nܶm[&c…ǎ3L'Nȸp$Icٓ&M:p<;;;777AoY 1c|駧Oֽ\uu7n7iZhh;̙H7n 5sLB!fSN?~|AAA@&8)))7o2e \UկjȑȌ+oى NeMNeYGsͦ1zހGCT7zX(OӴx헠_U)$$$s= &"66Ưl/`rYfz:\x0,e9$$իÇ?|YY޾OUՋ/z ^n˲\^^gU.;v9r***ֵX]]]QQQ>}JJJ Ξ=NIDATnܸ133] Bv}Ij1vܹS]]Ѵ4;{,}軬p4 GN3**^QYYL&SrrΝ3C-//oo IJJJ>fejjj')^ŋaaaIIIW\Glyޯzܸqqqq555#F4pWVV%$$?{lfffQQQRR>\t40Pnem$IQ^bۻ: UUϟ?O&AAAAܜ.a}W~_dee=s]}ф c~竫*'ǏoV^x@͛7///o[l ߽{w'd222{͛7]=جY$Iڱc|Ѕ93蓐0KAAAq#CP&IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot12.png0000644000175000017500000004674214620351225027607 0ustar00hanshansPNG  IHDR6sBITO IDATxipu5^UY;jP$j.d^Ԓ([V[Rd-#FVLX֌p=!nKk--Mvs_@6AX5++qDMh$`/w"A|>u֧P($aEnO|◿$I֑<Jr;vEW@} G#غuz5Mz_=裥Rĉ_6o|}{xYȑ#~+I>~O&Ν7DXÕ T*t:i޽{{{{?AS@2\~(EQ}}}#qp~nA@ kSO=E NQBhӦM.\8r>|pnnnhhɓ^׺32M|>]׭d2z^ 6oll:裏bj"Cqp#G$ AoW'xsBHӴ`0aH*b_٬$IO>d454 60 qu|Ϟ=Gxz 3 rEaY$^UUu\ccc=s֤`'Irtttxx=yg>Zrn7M!#D"0I۳}gF(Vz>\6B0v&SU*fgg=ܱc4M#ٳpg:tIL~(CCCBX,"O?].CPR7iƘyoFe|>/¿˿X<|2MSE0B 0 5Me>SŲ,|u]up(5mrv`&0b ð]kީ*3~[7 ,3g8rD˙a$A0D&B 0]-0M0 &0a"n07|OC#GtWGTH-DICA2:_oӣ:AZ-E婩pt]`aT*n$!n^I $IXjKK ܱBAUH$#⚦]vC o!H|^zgz{{Ϝ98N^RT8`f<[ZZZZZ&''|Ml6 _zd2~U՞y晭[˲,[<{Fn{hh(~;΁j]@>|'L(J4}ꩧ֭[6 i`Irz3/#U,A*E:T=rqfao)a D~Gݵk׎;^k>smڴ)_tS8.l߾㸏;v ¶mJڴi)ڳgOX47Mrm۶!O} !nݺ@ ?cry߾}~OLE>SO=3~|&0"F7+TB155(JßHTE=ooJdgrٔBPxKPk6;/a´鮮.0HL$!05MsLӬ_}20Ap|p8 na?0P߯={ PUm4&&&u]\wv׃aT*599)"Ġ_~剉H$ryi# 0E!d"00CƮ q3Ms˖-E55r9;oj7mCT 5E3wjRJjZT br9@~a ђ Bo"JR( Bi H!4;;L&A݈ӧO@ /yW_ݼyĄ(x</^ON^yf7f^ݻ:,Rz./CCCgΜT* BgϞQ]}>,aeq__{ޗ^z 27`u\.711lnAYh~eggg(0J%|>xJWX,|>$`PpEeMhB'm(jmRAS طo5O mth1vldj$Ix`0h_VxeF㙙EQEQUaYeԼS$IQ!sR1 ^[$kVMu8MHTU M@llB8^i݃dekkeC>aeY(znaYS j>eYEQxGGiTjݺuLc jMӠqiZkkk>w`ͦiaagɰf#M %&EqjjJUUSBl8!ID(#fz0㙛kkk (zMLRmmm!Q9Jnc 2K-6b;kiiE$4-2I~? "@Z\.0Z0D"AdT"^e1jrYUU0ņxf$kK+\#XYbSEQ/AQV`R AQ4 Dpq&Be`^&&!-/C#M-ftK<}Ji|[X1lst+l)Wڇp8X\R%psٌe3r"n `49]ˤLlwBl᷎CbŒ4;,[ku)M{鵌l9sFEMӢ(B Ү0Xlzzz~_Z<4VJ&@$fUU htlllaaA}E1 8V5;jxu]?z֭[!;00h.FeOQLNNvvv&B`P{f٣Gnذ7ntMӳDGP a}>q!Pr_~ffFnxY/]qXX,xdȲ׫lVG:ɕNF1Jv^]'#`pyQk9:ppeXjUT!΢`U@Bf壥=`Koȍ @Ұ}MӖ9kV# øpB(T*$A`t`=:33cfTF`U]#O8}B PsU*H$an\?~ ZD{VZ2!9oMs$I Ns|ddD .~===],b719X VϏc gF[ŋP:VGJRVY]XXBHaQX\7h]ׁ l6 ޴[E'r'h N$x`@EJ'I(9[ x |QXF,B $ZVծB$Ip8C5 `i @–$p8 Ν;UyO$PXT*J?t.%~_eQ LR@s$ o---Ѕ=ɻ$Z$6hll O$p@aŋ^$I˕93 SH4:::rp!4fY6TUY!v-[7=K̈ `0vWa@]8UUU8E1!0L84{zzUrkEQRpFM$`aC} s=)%OB,D UVZiC׌1. pŶDK -5-ںiw+ _UCu p"V!:XM8UcFVfdiA'u15 yY!ooɆ۬! Y}mǰ\:ƚ]t$Bfgff fEFsrGysjL&322߱[KÎƜX ˲~ddd׮]333n >orrX,s=`sjTΟ?NN˲O޶m[yɢfF{{{ޭ[J>ri薭j^/ NAe *b0}Ǐ9R*NA4MRA%95`aADQjA]vq%MBP.ih4 /r m ;0 cv eHbaH1 bO9N};vxx(x$IryfH~,yo/߰e}β-n \͚]7_̈́;l6}K_Rkk+(%$ZEQ2(}}}eYHt\/}q <9;j7 tA3r"w à&;~=k1!Hdm OUDVӴ*xxH}X! 2$ ߯뺢(rzZ?>_^7P.X6 Ki,;00pرt:=<<766L&=`ooՈDUUxᇡ3rZr9͞?;)(*χZXX`y* |4MkD B_~nPxO~zƍ΍F@#I8ONN<ikoo8nrrWsr(׿ԔcC50<ϗj裏r 4d!ؓV,,΢i΂`CL&\DžBF?ςucHoj ]o h /j;5;^\P8x={54-,,6Be ЃJF$ȌB7t{Eu%R@oZ:(*˖aUUy4MAE5qp`aEQ`#EZl6zA?NfitkVAcxhnooWUv_pyT*jZ Q<2q]]]^!$I&f]4!a]ʫժ$ILazvcF p\r:Af-?\. fggyD"BAu(jVӴT*j@qbd^\b,5cYUrzVMӀu˲,0!*iEgFehIގRU5V.aAUBRUUq028[<taSfYv7Q9@]O?F.{k5hȲ2 G*!:X8iG4vp5nj1#l҈"(DP]1 #/wVAA!Ь\Ɍ0A7)\XᩅTzaH B "iDP&"L"TRm YDX SG1 *\`Xq%br!bS77F!$*}Tk,Sٳj Oʞ[!Mg^7 ڵ~t KgϨm A\ Y$cFxֺr#Zd,mXR3g/ֺSaLd¤nAj;{d:IٵkIb4c~UQ{?5w (&72?G6N³dYK+ a&AѓE$mn-I jA¿=K6ծJ>E)B*&84+ܛJ# +,y@r gb@L+52&0ƈrq4n4! ox-46 t,M\ V^08=ԃH _0Q*s$zVxJMrTE$sإR d {N c]Fi~B,"dPkstHAAx.\m^bdRBߟi8T*y<ITU5M3Lf2TUUUO#oݓL}$i(hEQ p5M50.0 êr755Eq :55ښI BsssvwwEhLS*:0|j].Bx<@ $I><7Wi%Y :B!8eXeYI`0D"K*A?& QM(X,z^] s\d9\z Àffggg__|5KTU8d`Š=@+jAzl670ƠlIcEa!jI0tEaNYZ5hU$/.`-VeR2*N:pCೣD`Dއ `X r-BNW! h4#I"HCԬ^,CHֳV Zn ,+L,l1VUsss2MҥKJqm ;$i=Itݛ6m15 2ЭRf3 NAYnwСCZ'ݻF" #®`+r,`g` hqsF ZvSgw`ߩp&GGك.]rh:: Kju||>2X 6}r\5::qIHdvv6ɄB!UUeYT*iJ%Ţij0 ЊFB {A۽aMK\nMT*sssFl4-b1ЩmkklXVEA0 aZ[[KRKK 8 y5 X,B%ǹL&#I"qt: |\IA' iC۷cGc2^+jUuT*,  Av vjrR DQMH3 |XeY4ӒiA OA f= f3TU-}aB@".]jVi(.K$ -5MspaR%;WW"n 5vn,Z!Un 4#a [M7oo\頃G*l䘂\6#'z 9a8nj74Ų]5k臨Č0ƧO.---^CbZڵ BՐ)+MaqKG$9۾}/:;q h%ujJqǎT*oٲ0;vTt:](6lؐH$N>i󍌌@￿Z{ァON!]׳l^LKooo&y~ƍD±Hb?dn`YJR x.^1ÕJettTl6;88(˲t,{at$\.1љiu,ڵ~EQM&@$G?  JK*C4MT*ХKEٰat$v;vYnyǎ+;֭[9 GN Khԙ2swڥ( i-Kjd?b%Ix힜4Rk힞r!`zR)UU[[[gff*J4MR࿷Zt: إRI4AX,r9Я3byv%02` C\Zva+1,u@:N$(J8w#^ƃ ix<c("0-uekHr5\{{%ުݹa$BReIDmL\կ*!8X,4nn`eBh9X8f`hFKخEt9gg_be )),K:0uU/di5SUٳq̙H$244i(3 sP(tywH$2???99)Iұc8MӇ6 H;La$!D;;;g,;t萢(ϟeY1 :::>r(xWj,kii B(>?4tw04M͚fӆ QVcY6 %IUU4GFF@qtttrr!)EұBltl6;99؍95%ID"@'Y\bd;laeB`mcўD"L&x ඃDz1X,P(o>HVXSSSX,ZE jiۯDp6tkvܜr`_ ~} 49. tEaY*AfaYȺ\.8TI + 01d2Pn>GpNi,u򵗐heYr(<G(r j|>zqQccc~d2iZ*Zn]&BZ!UU۳,q0[ )q Kz]f-M333[XRdh,OMM)q ---Z !xfffCy).bYe͵uQ^܎XF 9a,Q[ආ39X8f`Ш(?+:!b8Xw>WHӴ'N`y׻i]A (&rX :mذe(Zۉ IySߘ c㦧[[[O}W^eYeYh"k. 2h$8qaY;va$Th%˲,qϟcr܋/xaU,[,yO E@ïZR9u(A\īzQ8CA`L&S("uڣKؐ _z%N:k׮Zvɮ4'Nx׻uԩz>22222@aȻ?~e^wrrUQuMMM <;z_zv4{zz*J"(J{eP(Ȳ<33m۶p8,I֭[>,I[ZZBrZ}vYtKKKR$ 8ak5KDZBJ'|_.J?x0MӦi4 ۏ|#(|~aaA7p81d2x\љEQ`pzkz=$gBJRI{V7oT*@IyX,.IΝ;=޽{:YoٲnSl]_UQFoFWWi'OE|>5M}}}$Iolڴ &,&}>Hn۶m```ttŋT*J222R,3gDQܹsSUUVp{zxdG"\!EQDQܸqrLBa󡍩YEQ -1i&I%b``@UU (Bsc衎?BAZ ^xdYE@HKDV.X,NOO޽[UUA4M|@| 4o(òtgw;駟fEK_WDQD E t ZmnºEj) ]9!DlggEz~~`aÛT*SSS>!d 7.jR\.#b[{{(w\Wss핵j`z.ӁSR', J@0Sc6a?n*=ۻPqѣG@X;(j+ϻ\zD `eY@ޱa`PUUؓG"suwwl2L&Rbv r`$IvvvR)LH$rMF3$Zx]и1/±cdY FGGUU-Sd2###$^P.T*B066vرj JcIw- FGP(N *zbbbvv$D"93gttt'N9<\T>oϞ= LՈ.NTUkVf.e{v3$I4x}˖-,36d%-u}Z$XcL& tp3agf<}{җ5/,!*NEJi.K$QAQvj& EA(S u]zcccd u-,, L+r,+ VUaZ@3a ._ͥNC}(jH$R. ÈF\đXT:0z! i "0Pٔa p(J.yi ;N\.(JvכEQm5ԠN vj<JGq@`&(. u^4MUz( 0rVpMӠ4M~?$X.ƞ!@ :C9x@_tj3b.6e'a`njI(DE8"[4MMxFh 4_+hW.{ڝ-;7 EeR-5Wc%ʽ h> 6)8Uq>\/,/֙.FΎ 1ÂupU,TrEo8%w<+~8iY= J[nUUUӴSN޽cUU B"ku>,$A`yizь(fx|'L۷'Bz4M板UƸ^R)ӧO:u_J#,LD[?AŌ$*Oޔ_sss. С+_,$ϟ?A6?yۮo}[)J?x≝;w^Ռt#7N-}_t=[ Ξ=w_}oS6_V۵k__@'N۷oΝr;5@LP{o̞{反Ow#nY~ ֭[oVU۷9a{Aȝ;w>˺+l1FDMccfzJNdzAݶ5[}{ Asssyu%ڷ Tg!cקC'N;xQ˜vvv;v _˲БVԍ鑑'KD\~嗗oD7wݟDi|'O`-̈́i<q/} }o]Peƍ?Ϡ|ComUx0FFaO.<j^inBHUva0 OLL!Hc9h~5ov4Ma֭>(_x<gviG(j:jd8i"tJAw_2w]; … 7n8p;lun0MƚN>o~#-d2q\޿GΘeU( ¨%т ʩMƖ~O/hi $JȲ,BD½g(=~ A,t:{[h4dYpv9~?EQ4Mj$0i~49g|Vfi $I0ri6iV ߆|>y /a à(ʲ I"eYCg!\.ciԕaAZj:Ng?ĥH|>oF۵& uP(zqo P8{ $IzL*$E`0$I۔+l6a؝Ep. #Y6EQXQ%Lڳԧ$Jd}I_/qimӱ+J,vlTP(T,s7MqˠCvKor8 qcf3v(:JRx7rt:DCM&'ڵַIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot15.png0000644000175000017500000012400614620351225027600 0ustar00hanshansPNG  IHDR6w,>#sBITO IDATxw^y6~iooJZPC$!zw;'.Kĉ?!`cpc0@HBHZJۻԙZ* {kyϙ癙gyb@}гAe؀fy(;Dӏ? 5WMX@p>P@-.9(`gS7#'Jң5Ƌ12%G8I>c;OTY9n,~r9؄8wsRDzcKLO<0u -_ǷN0]Ýx߰2ʖΟk3'* -6`#BkP(_%6am,Oo՘A4D/ sطTF0w2'z ݍV0WôswpR .Q>K>J7:0X@t.$u ӄ=_ubJ{WkXxlԍkM7C~8k lK^`^'O5!&XDÜU04.:K8BGfdz k>˃m':~݉GUT  BAB;6*?bW._mp'13/2Njc_5w֟w"s0B*W7-//"@J|壮&T5Zο %SM(A$?#}Xm|e;[.OŮA,G"Ǻ 0 cf UG񃋎}IЁKqGPLj.C9l7 $— c[6*ahՑݛ$ 8 : 8*>`blqui5Ǵq~}NmyIW┞c򐝨t'^#ۀw&INj&:5?;LRac$0IIa g9I*p ߶Ȃw_/}K,YwӄxG Ggĉvad;op͓p@mq-7|:>lZN3a*$`r CEb>[$z_={԰}㳢ay$̌\8܀_ލ,oO\(=|q 0/ƾ7Πt<? "l v 0"x@%+T6`߱ٗw|/., H\a?M~筼/Ȟ 2`g߳׹GǦO 19 (C|'Ϗ3a';@j@h>݆0$C~>D~~9Xu_0 @wѦ@n)gt [~(=qi45_1 on OQj'!4} _7}9,~b`@<@=P EXH;n=/GnǀwX΃ > @4 Dʄo>V(|Z 8)ʏJ~ 0|}Z}0贞 r.<)Z0rZ3.囸^S~*@_ _#T [a~zt۫?&.!/꯰?,3W!4>o}Yr!ïC q.=X~Y'3'+r!%o | `"Gv|`=c?@Xi;3wipK QsO/__r0ohŧ䕳5<-w5rXs):9%89|A 0ÂaQ tx^QT"{I3SyJɩ0 Wv|:&av;];3m8ԠgyK&01LRac$0IIA‰܉ i8!{܉q9>NI12L$@zb81LRac$0IIa $&1I*Lb G+RY>#m{ ˲8Nb _g øfΜ8q:!y$dY~W^=+x<} Q$m# $M:GBbrI]'>_7N*;iY3!dI$vl{.6wѡQMUez=H#sM,sDH&Ɋ0s)@L1o|Y;[Z{G]V-jżnVS ڂQ0̱`T7A%ztS'LL(KBmSN/+-OBrxwa*@SX8h GxS‘^r+bla\RFJ#3O|NիB%Ң9e9T|^^K<Չ BI'Ԍ/gE)8y&ɔp\h۰9l1dyx` !N]sw(%;d)r!M@mA+ yØ`!"55 0i f޲`p5Mp<5-,)p9m!\c "Ф%HZ__?o޼\Ӵ !$IRTHZiJRQe˖zϻ8o(eWJò"dX>H& d;0_ #z [ySEU!u5x,E0nTOYpP @=nʂB@9XÎ#1HDCc{inn;w.\UUV͙3_3gΜ9s~2,//'tuuuttW^y%]z۷o[\$ .`֬Ym'뮻!߿ҥg^r壏>jƪUMt1֮]gϞ?>駟^f{קRӧ3~%K455KT 81Ox`9,T=zd--|{}ޞxi4 3z>E" }"TYLP o|zT#ᨰB%.5UPG(\ض!3n[Bp"Sq ~_޺uk"{1˲[MȈk' Ø7o^WWW}}-[/^9>+M^$X,|͌nk׮]bżyV^-IUW]rJ˲dY޸qg>|~#<8r^y<O l2Db1.x/OO>sw^SSF܆f˖-XRN̙se|xWEN@6n۽aob{T*|.F"s- `_K[f4Lj654Yڳǟ[lzqG, +e^ɭO'B9,~"`-+p1B@fϹ7n-r;8L<5~ee:1`۶19w۔[wnRmmͺ)$5B,[%ÌdљM61Nm$2Cu!أ~;p>J a.(mZO!儋Gړe^KWϾifA'@BSfbXt笛į?O<2~[Tƫ1 ijn:GƓu)<;W !,XpF3v*eSTU67OolݑJyS(L0i{Of]E[/VnL)Rc(;?6׭MƜ@X8Զe &uսwp+**k8ΛAHWz4mԘ,JiLp;LBҲHǎ}^x._eS**F!VS?`os5W:Mx%CX iZJ(l$[A T@F3)J˶bh8SV]U~ױl& {| %},[ܼpvLV=$9 |K{5xCDXY!%DxJ@P)[7u0Mò S7|A/ugw[_8l0L>H*g:9.4zɅ%&WBnjH~;z!'ύ<Oj@tWLR>t-!K 8 cB4>Bd+sI_αaRƅ-x?p}>;|Crc P}m$108]su5ukvawvX?+0>>47UHZkwکiH um؞UE:N#*pSJ#;BHNGR?h'=9f&A)!Lb(k Wjd|SωĶ g/97|j<:һkmH9kv[`+Ä)^lץ[dS><& @Za .;t$(1Bb/mhXimX 4ƨ9on- ݑ(T2)xw_]W?7RbdQVbH@>4<QYEI]ȅjstv;)cQ~>_}Y`A&P(.BM^~eJ+FGGt]_doח#H:^d \.g+|>ߺuR;m۶K=@ W0sCe3mؿsSNi(__4,.EZ6gd<hPuSb?etg#HDR7gNaw IDAT׍R>8Z͹3c[Jt2Ӯ #+D)T qc%0^ve۷oohh?m,2Myڵs*pg 8%%%$ ,,˕r-###dYBݝ]v|ݳg͛7/X =Ж=CDzSt|?BMMG3 f{LoyYۑ*x{{oȇ{}[^-(\yP. m`A(# !qhôBpIRp(b8T={9ݻ> >7tbÆ b(ʸ͛9okk+-- BSnc&z~7{Ovh ؓ{rבk߿?-|; !E5vE ={Vp_dxٳg馦W_}U mڴ4\.z[[[}>_ss8Baƍ۱c… y+Nf ۿ}}ٷk^tE)Be rkٲ}TW*xt"ݗk|5QqbŸ ;Ҙu9Y}ԓI%ܳn}8M,jOI:b[rIx>9\qp2O6SW]Fp23hVY)E3TƓ):J+V/ofΙ^Q\5yVIuB0A ==2ӅHf(OT674Z62z{S5ޠ_Ժ ];'Kԧ²~09{\Yj$mM T%*m Y/Xm ܜ̌ ۶gdHb䎆< D"Y[ U>c\R|dV\kL eB>o2;sZv]Ѳފjh)PӺ]%[;1LvH4਀"Uɯx˄ZK_(6!wCkݚDv P"ŗLluJ1R2UpŪ>u3cz46ёBY,2v>rLJ4~55Yi8>KRꗞ7Ke׷36w($3IpŚP*"z[; **B1g sf .i [WktYҍBJʲM ++;JZ}Xљղ_>s]=*cςT:x#1Б4JްZY^*Κ ԀḦhVgזl°mR4T5-A9I8$n4Eڲ#3-*#éڦT`OBʃ{G dhSs@[ȍ"iP"fTm;trc뽳'wh+/@#VbugeaIi|`v`9[sBwgmJ;[E%2kJE1?. cx~skw 5pLc^X^aޑ]\9K0rN&|iD0L}C}y%O*ȉd˲|fppЍeٍ'˲H%0$IrC$;pCɲL)߶m{8,wSv5;T/?^mBY|EN APԊf'39"YnڌiCQx}@i( u-e-xB=FH"y 1IB;wm^W^۾a#* '1X3jgY3Ruu43j,6qFԦhBzhu |p0g\ܹs};SP(tvvܹr֬YO=Բef̘H$~隚/x֭}}},͝;W^kh[[`ww%I"<|np 5 /W^Y]]gϞ}+Ҷl6{wOSBmH`O25ݔooϾؾ9Yku%>2MPPn*l&emO?ͮd|jI'f=?+Ohy]TH {d{:|ԊEyud U5FeZ@Jl4('X-I3<~X,0 cշvO>}#g?;Eٺuy`0ʲ|w^MMM_|d2'|Ͽ~{;Xfxr}x~^$?>1BBW^y5l 0Ax7t!6Ǝёڑ?t;Fb>@T6]#=[aعs͛/?lbƌBS['R@B>7ՆBaiWW캃él <\&'CRFvhp9@E H&zS_Cւ5Ϝ^%uD)F1VsYVP9QCʜr DRʋ@6b!TbjVugn4Nd8c''>[[[GGGeZr˲~_/\fYY#}z*bǙ={~#Ji"( ׯohh8a=۸qcUU͛?Ϻ:u]m=Q }>_SS)xDڿgKJ#x$>:Z :Fa8a2 0f#kڴƩ5>*+"5Ua?>:H;sz2푘\rp@r项e%ͥjcgR`׾pЧ ՝wKnя~tw&} ֯_ .\xLғ߉(%TTbm,3.335ᢘ:vO_*f^Q,ƹ^[l5F%R7T"%aI҇$˦yBdJ:.DtS,ln8`OrZM ;o ;²3ՠ?>4[ DŽTu|',ιk6&61 pt?nx:݉4Xb1B1a%5`f@e$,7VEu5jDd*Wf5–> =kMm2u6vkhVH1 K^SE/!P{(-PZ[\Wm}*Kɢ'F#9k$YwiSwN9K߇7} K ` XWe^X4JBM oIElR%eS*yz#CSk W},ζeͬ~`=ܦ\HenkOyNe;%@rzo4j U( !I5c aT$}ȃ*K@7t]H&( +ယ֕ -~W'H}AEN*񏆔݇FGSYr7_^=G5 ԗ*$Q,078MӲ9'Da7Zz\xׄI%`X#&U0&Pxj28Ƴ'lLN+ fh@@C$MSLS `p}bL2ż"{ GbAERwҖe\-(GZZ$TB}T<*1ଐ/`1 c2D;f֍b +)pBF E]ȣY#[zT2# рL 1kc`WQsOqi,,tx<3z!HA[0NfGhBR{+ 1]B"1H+e,'bPo_:J&d; -;vZ\)3>:+$K,d EG<>e.s𼮧lAp 31ET̨'鮭N>W L>ӝ ͬT1W|~Ӟ'{8kҬJWf覝ҙh?S0t:P&f֖m4X°iUG|AS@5lA& [B\Jx:ҝ^)7WK'!qR}pUjp28NEIyxN`re;F ]rܯV8mq*Fҙa tf^oEUy8$l2؆. \J6Mfs/EJ6W'LV#$B`"+ b.*8UDz)q|f$S.sҀaZp ֧-[Yt{777{(wy饗!fRUu۶mZcppPUŋGٲe$Ix+xW455Eї_~Yrʓ 6E2ʣݣɌdjai^0}y(m=^JєjfEC3&^3FOCy&Ct=irj'n#R.DC>37o4`P1V\-[jjj8c/_ ŋ{<9nD-BHooEBЋ/(K2̾}ĪU6m4<<  ./L&Ν^|EM.Bscf"q|KY=~%'ndac 0,Iԁe n b IVdu;NkN$ӌHE{Yo25"Dh%L!\.yT4"^Ztl4^Wa:R?/R;D|(ODXiSfͬ P9 8v`s>sLIn:;w.YĶm߿lٲ;vtuuy˲.͛7W bZuuuPh߾}ӧO_x~zjܹ[|>׻k׮ 6TWW;PVVF:4uT5Q c@n5˄ &.mFXZYě͘##_h;ʛ5nLK5N=3S,a¡av] KCW/_n;Ũibn3Cغua|O-%-EswBᩧF]]]pK !:::d ~WZZ>mڴ͛7oܸM&b^|oX$K^mIĬr,dzT(I4,ö G&)DwmX\wť;qw˪4C Ӫ=}T!*JG{{Ui3`1ti۴;QTgrCuT#9GbD&Ȋ(?vGs-qzo!\ZIb<eR,˲kJJJlvinkl+L1zǩp t˱20  ,EeΨ$Byxm?ŀ"/m`ze3^_?R?l!ԛGn_DQI@Iԗ>[ 4}~rSh6cmP:{ukΦj߉K8DeûQli{IJp8Ȓ0qˌ8;:ňǍi E4&F*h^EQҹ!#CI$ў=D1~37 SqD2{;\tk0(R0Q Aθi ׅG IG'I[|y:~֢q 2aD]2AyU̯ K?:j?qvm?r2_UĄ9JOM2ؔ!JKjy=܎:Kb=Txt !rPck8\1OsB$F` UU# &-nPA5aOf1yqzCVf4ZɰyxG;~o߾}o@MfrECޡM=Gwx'ht[$[th"icNQf~W:2CW`ppcGj28H96Ƒb$` 0TbCJU s{ޒ~{7H ,]=,G+++_Mg3 6o\VVQd(++4{c.Rf3gl}[ g.ӣ94s&0WUSbL*7&cSYTFU]}C!{)cv1'ڪH" Zvo<@ٚn[pϗe>pqEuWѼJ$fî~[O] sU FLBėuR=$KQVU~˲{?iMM… =cǎYUB>#|>)cض-hOOB^ZJR^{W]cy\ }?::zqYmv]wݮZ8Bc\( ؽ{,8eڵk1 !L]F555$'c{5 '$15kt5ؾO>T'S9sMuՑMӟ寿5s[FTH2$$˛dUBP>B0  xCGƸa92&Nte?Q7ٙDz,q֯_W^yqq՞P$I}}}{ݲeݻ(k׮=rU` ðm֭$G$ޱc޽{Dѯ$]6JB}{スDgrJKKo?,Ik.M6߿lٰ)Z_"UH/m,Ă9"mK"Ua/;}3; _ν_\_jESGHrMH4RLOA pF^ȹ0Rk@wCju۷/xt^{3b844ꫯn޼cy!lٲnKo@ pUWӒo߾nݺ~7t%Kr-GE}lkkkiiرcMMM(>gΜ ^}W]uo~/˭w믿>k֬\.K/zv79W OJ9"oɩoӦM˖-{!/H֍_&.Kb^sY4U 2]1Y卋;eR菮4>2Z)\JWep;A T:W[1L aZ/}d*e\p` EU]$B 2vI6W_ocCۤj[[,---/ecfuѢEқoRjժ[oUUB)=`0hJQK.3 $͝;כy9ng8˖-^[s.ΝD.\xر㊢pΗ/_^[[dܹP(444L`H #M2 8􏥀`kCVUmrwl-)lS.K++>DZ 8B\[_<CGGeDD{]qDdIB@ 8` "#ò%50@!Ԕ䭡q6+3P]]Rǟ}YϷxb.pΫ]ιw(tSLP(D)u;d, -[&Iҹ*#$aHR$T$\0K篐1-l]tp+ZԄ-Ҳ"]o&oydvcC8|AG8*ɸutp4(3A0fs!,34]T1 SILegq^?Dј8;4}ak{Nr_L#g{Bm6{S=ˆ(w hfDVr0'olxevї^|-^߶OKOyy﫯{>q_iLV$[ټ%!PFc$@!ƜX@,¶vzncjι7`NE B9m b@0*؟\\we y :2N!@}u5bl o~_=݇wI-A$lYq`4vFc|&♲`ЧPr!Bcs.8h̘0ׯIxE7`޶[q !قY %9:ߺ^M8rb܆YՅ&eSF8 V*1t*WYáP`&svxeӧ(5&@] B6M5GK@ĉT@o8UK;CjZX>%ѧێԱ\gc)Xn׾CSP5PV #:)V>)E]YA] }gO?;db{w@!$_ DRw\` ER/~AXTxDeԞgv9s- &Y҄apǭ(kvE&K'\*Kʻd 5U%-M|`<|ptrl$vߗ10y!YS dUNLnEfg!`Y5!Je&w歾2SUM N VGI29,c KuJ$./,1vL!!Qeeɞ_~solݽG*0EAhnpdRž#"Yƴ+o*kJrz_Ll-_2z䧯MvsJŠ$`_5Y&)DZPOeG&}_һ4"1~2C0Uٴ0QɏN"! إYjG]ĻtYUzq.o NLT|1HwiN^-KOFwln[()]b9 1MuUWU5eXt.)$SY0&S:5O&€0!H0I&4]IJ/7]Yp@1譅\A\煣Ptwix3.[V+h~l 4;}\щ;?rB0Ry?T7ykڰ?ja$6>8widRء&3(aivsiMdܦ-ݟ s+g1pB`8ԧV{ފFٶm۶mۼBaq 4{ߦy_r]w׮]^˽{sӦM;ve9nڴippkou;vxQlڴɲ,B֭[w6pWpT=8k ڰZ(@S{[6r,1P}A 94ipHm+֕\3I'SS#G8b8u) 0( @,=C_%\)eBX, @' ;5|=Bv5o޼ݻw9882guuuC]6& OfrժU[nݼyʕ+[[[{zzٳr\.YI6]|%K B+Wn߾}Ϟ= .lnnX9gEpE?>o !Ar&" 0ݦ*y@θ۶5M |~Æ Hcccpd2wnjjڼy/={iکNhdssǓ(--o޼y׮]^ID"FkkkSTyyW+dٷO]LT>~iQ/w~2wp|"))=>0]fRzUU]UUyl"`]υeӥx]RV5d%YNnɬKۃ\hhv=?TuO B,Ӗ%@ J"K, ,0BTIU|Z['f%8]vن i,577+2::JBtvvB"<m{mՕf YkkkGGGp׾}6où!*) Hujr&';ZKCgck](l7SOBhy,)@ue 1#J!brqօ J[f^}õ?‚3M]cBW)e0 0>odd$d2B<3zW^niiG=o Rlx4[\t|- BEBm2xA :r2>>ȋ_Z|,cC0DJKBzGu$"'?&ʰ;/[ 8A WHAkޯ7n֐*IHpHp@Ȉ`1*ʜ!& ;c8|I4pqwwܹsܹsc^>/0͛wAXws˲:5\{nM,X`Yֶmۖ,Yd/_䤢(-tzzz$I?~ww,˝o;Ws6,VRV JbGcysKj*E@ePmkV̛۴cf 8<KږSZ}.5Kš #L"S FQ_'zs%pc =%%%P(=缤Y !<]]]JE<„$IW\qE1P9{qHUU{;g8Gw`,m̫'/+,fG5u~_$tWTFޕ[ԦTҵGW^7LMMhvqtq|֚Y:y#c@ʇQ=ױc>s;Wp_%tro^ݶa?]xi'R0! ct&w>L>pMY,XZF$v`OMMn}WbClO4P|";FEkx/qY66r`TW•lא+!ɗgr T00B 6)62fTlZz}7ب+ ϗJ!`ri(Xs 28pBx-*ąk9\M $ic .Xs ӇsJS Di]xkWiR@xҘ#Rʯkԥei_""]0:>5kS~豺U-U#\ץ0-  b\0l.8gs#蜲lnlIlc"kq{.2/[}y^3PWm !o /^6;n9s>;%a -4]u]4JtLۦǎݹT*SS# IDATұ Fo2(s8,`L`.F@f1cXFsE\sinZpWjdѣ&_{eYg%IڵkWl$%'ڙc1NREysMg›.KN](7? )0<;:4L[/mH PC?60'RY<} '8c˨˅0 E4-6UK9a*aq8 &xMKmC{}Ӭ/xEmץLW=DEEO>ĕ'm6}{ob&Bȿ8pq!͛|Rn8xPfS lW508PPmиK%dr%[^ܴ"\|}F=-{-\Q&n 4";ܰ!#o^R͆i J]Ƕ8P˴u`Yy$Ll>а{X,o߾/{^WWK/ӟc{8%IR3od;O7fϞ=44|œqy/^~#w\f… >\[[ieY>Oz;wۿH$v;q#<*6p*ѡo~7"zCcў#2!$aH:-fV|ki XMŧ}B~`Oo R9afu]& ).C/0%R75k3cۮ˼F4 ,\ ƨrᜳ3!֭c 7c$=.ޅd <i{{?V^}}=>`YY޽{m۶xbػw 7C}_N[nY|/o1~;˗q}ѻP(̚5ҿB`06M( A!3kH @ BD":nT~Hc[bŢܒނspR8cmYe\PN@a:9-sAca3؎6?[[z~w~? Ӽ.z*sWW]wi>dRŋ|>/~N#缲rAP 8]9UU]ַ5o޼{l˖-{+Wz:o̚DURF̧)ZP..:җ| 5TEqv+BYb 'ٶƚ TmHg 3w%Evm[ \3p l&u:H64V!ll8kl>w]wllr]}]]]һqO_?gEQ<ʕ+{}cO>w1}}}՞_*t 0UZ{vk-SG97 B8l! kbsKAM}Usk]]C52 +.h"ZU09vX&뮻<-.lG_y^'F+**p8Ңs=WWWWUU˲뮻{9 .ܲe޽{?p8~4%D"ޱ1PaRVޟ/BqT*8gd1}Di !Y"B\մ3ΈjaL ~eԱъʊir-nV446Rf6>hͦ3J[d!ar|>uDn5!/@H0"Oܖ&Iw_߿cǎʑO}S9ݗ)*z޻(rz<-*9Op.~!466z4a ޴(MA #\Bӵ[n[*DtՙFI8pHCM座6d,t9r~GvĖXY"?BX%u)T"Чl |5B@o0c<I9cr8XH)mnnT6gR§+[묲jӛr/3̙n*n"ιB+#8p*xUfseP5M#Q}kpjPhĨMմ7%JFPLf!!A]0BR \2<-)+/SdYpe1F=?\Wc>|C{(\Jό'~<9i  viݽ綝d͹C՘ pm}zT)6$bV-WuP1qd$7R{z♼ش,/]X#Iu9- 11ZsURY$#fBȧIIқbΘv._9=8NZ6VpmrGMϿ!$E 93 yrˢXl"L齚_/ Ҭ#d"F s@o/ȈgB !<GGVqDMG[g}S1.଱6ʥ f*LN”eU%Ci ¡2_wi8( S.3F]꺌QνW[+X^)A\I <߫9 yoCWo?_ø$Ѫ?yVg;IdbVVմwΝ?BVeHH.e*L80%P` SFlwӦ@0%h4\ I,(3:l,_c/ۮbeMMsH0v藾Ї# p؉(ͤRT?E"+5eA]F\!$83\ `vBV1x7> $ .}L.pP2f|"웿YVl6oM7nVO_,e[W'\dkqfLO{Xm1}c|^Ń4 >0YV̭47OL CҪZJ1֫!tr_RF ټs@'N02p%bG"էCTBB! 2˔1f J2井A: f+.ግ  %aJ3| 1soq||S<4DBMMMׯ ^kuB /p-;vlbb²,䲷e ãWڵkŞ /p 7lذ~).Zk*:%4L$z Bpfd鉸օBo1t;AX2DD$u\溄 ̶I"!u2ΘP5U$u LJ"4!@G>yF(+r7´ l,ޅ^{C_ y=-`ǝٰaêUBX oMp o箾ԓӖ!ļΛu`pΝhԫW^^Ŕ+++9纮{QGsut'|7",YL&7nXSSL&ϟ u] [dɦM!K,y7Lz֭g)hESx3wB\q:xŽ=t;xK…3[woyޢH9+OB.bW3/$9// 3sw} 3ܓELcL ?,~IlQK @`"~?LDsL'ٟVh;z㢶 ˲>ϟ[>Ě5??zg;4D.`x 3uƦ]e ʷ $NVn Qra@\p*Bq!@ +oH$ˆ#@Щr!i3|A;U" ޔ\Bެ @ЩH #fR0l Dy0"@ DCtJˑkC#A@#!$8@1KiN\.(g.u(`>B`=r@H`& ! @ JHR|/;71WƖ7T)Ɛ;5I]ʦD,͘dNB$wLrrT0$"aB$d``s:tg@`$0Bxr#>8^y8BQ葞EFݒji)s\$̢ɩ.DLZVVm>Q@\1SLA Yusĩ$$ H:0.{)L""FB\po@Gf!'&kAI]Rܟ*_+ǖ!E𡱆+&! i Y%d$'Ða\`Md́ op?`3΍O D}`20|=sTTSV[ MVD+P$Y W Ad~]Av`&?dbe RM#}C" %uP|>L $HvO%rJF2ÃN.[?o*ѓw/DyZLBf9 6CÖ"\Hk 0FTL909˅`U`p=|l_K/&U@4b|*Vc9$y]|)ɿzP&jyHP5gx)^ċ0ھ}{ 3gb@s3N & 0+kٜe ~+_  ˚Gc(&dV,KT,I]&bɾ*c dC/H cHR@#nY_Q8|Z.Vݽ#iz.CpFI`r<߹7oކ VXZ!$yz XoM!Du[.8\as!afSj؄5A*! kixt6M%nS#u[-hN"%Rd#**eyT5`"dFCOr] BL_,dky_yOȲ#L6BrQ4^;wÇeY.zQ!pJOxzŕE{GyB+W.Xܴr's21lDL"Ødr, "+p"=z,r 4Ӷ>d…˜\q`vw.fؤ HB1C`e3L;rThDe>!R߿Ujjjz)u|uֹ{+R^xaK,B?3yuuu?OLӼ/^\$O?M)UUȑ#7tg֬YN[[[:Jak֬Q0 zJKK㎟󱱱|0LLL0***;訪oeI c9ZjRI0۶ ,T&$%*s2q4" rดunM VHS>yVv@e!;<ʪ{}νW<@UA S*"N41I:Cwј۸:ײmLIwV;m3 j$DEf!Q梊7{9z<Ѵ!]?*ݳ9᷷ǟ[=f.ꄼxsEH:z,؀P-~7#)?昨( +8zd+W[>,\R$+xK.?n?}.nmŊ&M={W\a5{즛n|᧟~f͚O_x≖M6c7nv7:t(JTL&~oNx>q?g?__6uc֭[ߔK8*@$b 0$H":7Vl9ЀDl6+Mv}wk?U.uuN~WGs򦌤cC& D;ڻН5!G$ kްMDt/ELiD"?00o߾G}4 ɓ'&Lrnڴ ؑ8*n_~جjTq9ro[Tcc)S|L&s[۷*6l5TTT@4 czW_}СCuuuo_] Yf뿹(0C  8M&8Un@vԲ<${mgV4_ٰ῾G2"\_~ϸd )~RDKX wLDFdA^$ɓ'LpEgqTss>ذaW_=fD5kV2b6Z7 Urysu#; J$o*[@^ IDATvHbr`6)?9׳X@Y6𑦑â *<Op|vvxS˯{k?mYp9gq #=*irBfa2حu*0!=2.$VX2a 2xEUOT4룭V^o߾M6544=GݰaÔ)S\׵93dk1ƴG?ڴiѣy̘1̜L&ǎNm{c8<+я~tڴiO=+Jƍg̏]w?l煖zu[ZZF/Yѣmmm?I|1bݫH&Fz;;;WXq7UVVVUUc&MNJVZu#F9YtKn" ֤uh 9764rsA*SUfƌoٵn<‰̜3e|)-]>--UKm/__Q]0rȚ۳?xHS)󄨊\?vx#dJ3/7Ov10J5dX ٲgeRG"_0+PI\+Ej*o-54|;~IMyGoOx>) o<_xDdCsc1nh!p:0BWƑU*y@ N%~O}(q+●kK~MS4,9kVUVO=k_I\!E4 0ecS/s˴LѾ}F':yHc<.ъ?'A4-6pUfckBȆH9F^Yw$ OyEﮫ?O$*AUfzn]W;NCyk˲R&uw##nT UڑYeׁC,7ns[8AD`3`P0L!Mԃ` f0p@ nbgP|٩7MGDӁѾ@iOH3 ƒݾc/Y)WAưNi{u?4׫u 0Cl8JML000 v"Ξ" ,/+A 6 02 eYDy\L:KM>0c|mizIG.&P2G#BSȊݯwIt ICf2&l.L:11 FK.1˶l Uk6 hm+BbL<3ZB+H@6UV՗pJf j#:Tr 1o7aoB="Q?M: 9BAh׷~:q"HwYQQK/`ٵk8[n>vaÆ1aԩS u0* r@o޼+W"ի]ﯪׯ_ѣGqKztwzj!ĕW^ݭjkk}ȑ#555tzԩ`ݛs΍FVJs `ƍf:Dc ߹@nTҠHG±u3bRDcM͇:=a "2+Kq\чɃאH\,|UpjAR60 Νe˖QFmذAkAkkkkk+ZZZsQ*)ʕ+/L&SOa8cǎ 9zh{{^kٲe˔)Sb͚5ӧO߸qcotRoKnDLCBA+0РPk-] |6.P6g<J:^(PV@pںIm$e\2>v?0DY)Y9;.D^JA6Z`-[L0!Yn`fl@X۷_tEVðKy{*^7*6YU|蹎[k/߸.*pBW@xijjEۯB۷?6GJYI~w},)+.\(B؄be 8_W?կ~UJCT b b}1d`0 [u+"+ ~F jb,vg[_ f(D  H)7UVV$ ̼y殮"ZdI"#G[ꫯa Yu,^osM6 wرcǎkdccc{{{yyy,Jo_[[8ÇGiʔ)ƘC577IƠ(S|W8R@ Dev$v)6rA\H#jl/-qYBdD>0>Y_җ~?cOOOsss:]t??{wu׾o۳R`޹sٳ صkמ={ϟ}ַu>{udcǎAPSSbŊ믿>yx ={]LfϞ=w(~Ç~iӦe"ݻ@P ![J_?`D*0l@!TXp@ E Gdd;G29uO>D'۶m+6e,0 -[K,ijj?n;wv9e+ s̱/==3'ι8H$lٲE =Fjgʂ;ʑKaWJDQ ^PЎ#Al<B) &%TZaPk`JO=PU,i_Vf2|6 Cu;::*++Kbh3ۋA8c0 PA#H&Zk˚cÇٵk >" KDT%GY!!@UUK*` bYaԷbQXn!v` /d d0F`O;Eo=gcm_'{V$ r,Z$+.K-TZk]nvzꩧ򕯜slLl"$ot b_ !NHHAa>'F"킱0  #mBd"A F{d)x6#jx`NU5gq zFuqJƘDǍF"YKDO$0] + I"`* vAb۠TD$8aA#X>`p(b6ml~ee%}򓟴Lw +L!ܹsgWWgׇ<,q~_p gVΫ,;r v=`C¸#=a<.'Iv$GGDG%F$<H!W"бY}%`)X D(@IhIGK":@G)KaEoo֪k ^JL&8`~DkH۷qގqZ{ک{Οn~+@ĵk8bw p#rb+,Dv\0"@Av@`mJfZ:>voW^:Ǒ R޾]}=ݩt*dV\$:A] 0O(GD?)uMct ӳkG>N09Rvxbإ^j*^<]'l6Uu;}'|rս7x97u<@J8\!,X :#ޱ9ܽHFymKn?[쓛ׯ9l6 Uٌ}d$#ɰCp\)C Ppj!y$86Ϟ=GxuY޽{7mb'gyFsNKkc$\tioo˧Lr}}c5k֧> H" &&!k~׹[`G Pb@h_" vp]ǟ]448iA c'SX(XXMpa6uЦD)L.3X)NV)zɓ'7551ի VYYYWW^xᅩSF^m^}+._@7@P*$A.t2.{eL&N$YcTWג1bf` cQ`8H (@nL %|KG[jqdnW]uU1QֶXVVf)V穭-n0sEEu=Wo&Qΰ}bJ%y?H!deYԋH9u=z IJAUG= *Ҋ5(FWЎrWv4]e5Ykci}@XdcuĐ03a9toČXKүYa"aΛ7|?K9ҜIZ !N@#$ c@q . W4AgJ{57]~ڈAZ ߀Qs==)WK(8BH8N$8BHW8K䱐|),ĝ{6&/,ĉD$&u%0"2@B15:"! R>B0JT _׾|ᲁM]kYYa#@ȑ֫ (* Y0Xo s70k5("hhKƇd ІaR" A: k/V8e]O؞:ј8R * Hd0l ?hb 60Tc|y fGsq)d#lBcqA¨ ]Ҡ' "HUnD4WƐpD.gP@h0)$D)L`40kB ֺ.I abH]`}](uWXFѰF-j[? t9\[2023Z%a(%)e(BFVIZ66hV +Q&PHfc݌ C B"!\cQIDATX cUXN7nܨfүy׮]Ǐ{JG+ 7lp饗655]Vk]^^>q{NJ9vD"~zc̼ylƳgƍ'Nliiٺuk*6Jy1"<$0P*$@! ah$k`hd.3LBa2@AiD 0Vlx&;vD"}pnllL K7l`k`#b}}mۊZFzb3f޷oߜ9sWXQdP9sr3²C u$7 毜 Xr@f'QГctE{ep+pFÇ׭[7mڴǡRnGvg_}GJ.\8wܝ;w;_LRsYlM7ݴdk98ɓ_xᅾ>Z[[WZ߄{;˗ϛ7Ζ)ڡ0ϫ **4!D>Y~#YRT*H$gD"a( P|"E;m{(]bYK$2.R|IX7^©8CpB. 3g ᭠H>}zEEEuuiO%nzk/xcoCKx1D"Y >w y8br*[g(Kuuu Y߿/~o|6?|UW o&=m0! aC0!\8g ʯ~~ nsxg͚6l[ms3g(q``K_i9pR_;ϟdɒ䳌.Rr-7tSv4iҹjm6vl6"L~c?jҟuuuK,9zoۏ<ȹj+tϝw޹e˖s՞Gy?i֭[?Q;Ύ;`\9A]]]KK˝wY_zmmm[[9iE;iL?KwG?zm}߸[ό]kmm=9pDaϿׯ_?k֬s3`͚5X$444,_|-Z4a„E-Z׿5 2%+</.ݳ`ue2sD< %FmN/wݻw>|'?sx-Zd>gΜy\sMWW ZcƏ 7\,4N}wݽ{wwzsۘ1{zz-Zt4! aC0! aC™'NIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot18.png0000644000175000017500000021774714620351225027622 0ustar00hanshansPNG  IHDR6w,>#sBITO IDATxyUu7}x g~jzUJ***TZ~Z X4A愘L'g~{<<9 ! Rk]rg?{^kkG^☽gv9 s@"$@"fDx =B A9 3y$"tG;c;E湳yn@@{@Bό]x'DDݒB๗ƓGs)IJ%T^ P aEF g"`ƶO"x P0x(kM> 03RGBT$ $Ͻ00 bx 2@@̈'жޭ[2WPJͻ;50V?1vMCHȲnJ NGB$R]?!!"B1qI?usOnuucOH)8vjo6u 4j"[디DGR0}C`ރsEA&Yb\F{+kdMoz)b1|CZxq`s-oy[ooWfc̾oey;m뽷֞vi~ҥKʡaޯnƌ1A^5f?=3C蚛rmR*ì\ŢH{ ?Wxgp폮y򷗨 hW?`A?oy?>9]FL;Ef$@ tgOz`DO!]4s^p[n]b"u]rʩuVx^o~sѢEp /{ˤW2|s{[:22q|g;޸q=ӕ=gyfUW]uGXn_J)c[7~jGKRJ) AD̈hyq?VV͙wN|t:6>'7f QDQDD?x񩧝?zp)/~vAڙ!) KIDHZ B/$!!"@ص"& TwpA68/i^_|QG`z֭RJxm5S1':D~Yuˍ1_Woypu]}՗\rG}'pW/7 _}NLLcHǑ{ncX_kJI> (w/^ӷoR+ ,[Ɵ\_TRw+Wyg$! AJD*RZIAȂP"!,9͏ٚhFĮtsӅO<\~sx+_ڲeK X/6m򗿼gðmێ8∉NʕRz׻;^׍{⦅gnַ;C? %DrkS??{?We{ ,% ʳ/_xR("#AvN~i oŊUֹk_j}LZؚjj$j;D̎f3As|{{!D+M5Kï&aJD/x۶mW_})r 't;=s;+bݺu]>wźcpu⦛n*Jp_tE]vُ38㦛n馛N? ^s5+W<^c\XINON>tkyfBR?(`n#8P`RF nZRzv0$yݲjLByLi h C/2'Ha> ;`q U_>8czʻs#0iߛc̫^f[-M;#; ~կ?C)^8]ǃ9*[Bljv;K;y8csףF@B `F&B"! oM"JEG `ڴӖR (I Aa`y;9AH(rkc5'?qɞސ!\ xJ_ro*VD~e˖:j^@@/6m_fMڸqEFFF6nܸt$IfffyE׺/ssn? k֬977 ƃ'DX<Y<>ِZ .e?|5U}7}oYibf7> f=>.޽;M#8?)8qZ6E_s1>h79w]w`.-1\Eh5sძAf9LnOY1K+o-NT5kvl|a?؛cU7Vܥ?[6DQ#c/\ψc)@)533Eѩno׷Z[onP#Xv̢EW "֭ <33xbx ^P7n[~_m޼9p-#p B"*;;gff֮]vڃ')8=+{Bn8xIUQÈ⚫j|}|&KymX=|?K#?rw:ŵWG>}իo]vիWK)… ƆCb`n[ӟSN u5]v{챫VmGuTdZ=#Z!;w۷Ffm7[e9H>M YBz#Rȋ5RZ¥D<{I bJn^73?Ң#+0:T?YsξO?kZK./[;\lYoeuykK,ٲeK5v׷|nz/;Zmٲeo">o?s~r~1;R0@')xaG.jm_C z[y  Њ/ {twW/KvxDHm׿ؙ'\A}djnZڵkӦMEQTU}/\.yaÆŊYy;v!ΕJ%{gӦMZmҥׯߺu… w====00t~_3"Kn޼n4xy?ָ}I|^7~q~"̴jw. wn2134j{`1sa~V1uEY1uz[ ݾ<Mv2]m=X{'Ƕ><UEV&3xFpner9<[ IR@^XgB]4]nfZƛ?)R)BI {IBHljjTJJ(bU EqRe\Jϳ{W:*A\#x0ҥrErYR b@DJ)B$R:i`;SKW)g R !.q@~)rk8RJf5TRWuk+HqHDQ7$/z<`e^J{[{J8 fޯϼFTfDUZvvffu MH{!w:M#k-YjR :CDB@9{XAR%I(J"UJR{ i"5i]F8REJ*,+\>TM<(TqTⰷvREJifTb^/+]± 캼wZgj=U*WJD^@>T#@PZXU("i!P:Rv#]yfYR(4 zc!!TI{$YEHR /]Vm!{ﬓ:τ IDATb@,IDq$Kvh4<4K-8ZyffX2RDXDJy #tWڀڰ{"OG (`Ӓ%K["dF$J {9G:. $IYXKB(ք2$eY3=9.tZzvju!G= H"!T\l' )8sjwJ)l}}Q3CR*/r$c BDTwZ4v/lVdMQV$J*lwʹ LN0 !b=95j4{@d g:N{s"999ZNDW*,$(byh% vK^JHټ B@!dEQTF@I(ӍfTI$" yag5ݳ7'ja s.߭ӝiA;;}dn!z}<%qIII}"x\B lDŋ=X^12 o`ٜZ$Ԟ,LEq E  Y୷ (KHDH(R:N\aJ%hLV2E5ziT(٣sGJ(lfNkݯ}z=nu_8=HVE/xDhVU+E&'zڲ}P__"3kJ={"ղw^HHJHd!u\esFEQFc&uAj8 )(QU VI8XD@8))%3{?335>:3:iVYUk30jh#"B{w{?׾/~9?DŒwL= V{jZߊe yܮiݛw7=|lƍ7odgٳ}/ly_W?ݯ멩0giw}O8wxS2*ל  o~t{fhwA ?uW,鸢#mۓ?dRty+%T@da~`%c٨blUk߳{`]&HzcE c]^ yGЧhD+TΛZ?+fHQ9H<|s׽cSN *GAsRϑv۷u]333't҂ _jpޥ3|Ӹ !J&Ѓ kx`T5& 3&+/ϼDSS[ .Y6RqsCVTiU#Պ~phϦ}PW3`HljR!WTe.BKs 0af9":rZ%2",El~opYeéAH(;q3l߾}dd$m./|ʕ7nS )eI=J$Qˉ!;Uщ7fظ),XEƌ}#4[y OM I*O0xI53hEj%!*&d4W.tMaB"u;Dl0S bZ/ɿ#:lxpɒD :@#BJ@bd$bmu!W^ {6Novkv3אb3T>рW^ye__~+ Y!d{{ʤ}R uuP#Qc֤` $D:GVVje5J)Iq)%3{ʕVj_iEJluRl쮝;yLL7[ǧ9^jgF"dR.菞sZ=҉"AUVjZ @g=мe 6@O^zŊzjA藾{.3;CܹIE3cq}`()EQE^&!ZI)j^+MMzJH󾿚$an {s䁁{oG)/,;.U*%)3[ݙnBR볅5&]tIgE'_xCvYrw^MS*IXRu @tZJJ%g/\buoe")S TՇ-lQ8cZ3syR):RIDj9I(Pz&/\B5y 3G oxܜ]„ओNK+6l dz``mVRZp݅ L]$E֙E^T,^0)r891>961g#+T*l6ޱ:,p5YՋ׽ug.~Zkf+]?5磴E&c}ޞI"Y)Ӎ-8B!ں9ZP|xu}TJVF'ǦSL+[?:#+VeNt#˲<+b˲,#DpyԞk\%.gEFr9ésVy[p;\ڰZ?#Rl\T9ޣ:oh/<3o ^sC wQ??\rM.]4ZjUxk^m۶k>9眾+rdd_bw)/V0iC!Iњڝ- 4X-ϴ[ l6fu("QFJE1zI9YzE$p6VGw+H*iD*KDcc :[JVURR>95>{˭)%Lpֹf| fY{=6gJ)裏g?|ଳ:묳zg?Yթ[fYv'$tv }}}FV]tEzk^ve#r!_n{djkR#KjC8sB ԇjt{yKɳՇQF,$ELfYxxp727wF*)u3PJc-UcjHZHKkN%ZB'1;7'@D)&/:- oC?gRjyNZVsZPZa9,Ԧ[e˖뮻Ey饗^{0'{ynLD[C~>e˖dzŸR 6uD |,&W|_Zi؞VkR$vv3==mB d5{筊GeKVm۹{ᒥ"u)Zhh2==#(gJq2=5᭙ڍ8.9oCs%"IXGZGQ$ID@~M(-46J5ZMg= f~xՁ;l*H&&&^?Cἆ>s=묳-[v'o۶ޱc{i?۳yk_[x#-"QiI/^ ILOO;I兎4u7 {盍5ceN8! !w{ :(8餓^WЧ0,Vw{8{:T ܷ|p<t@wҍ{}"=th3%IJZ?=wleվK޳ycQ*ڍXB)"x@k{c)*5$&?lϷnٶhE#&v R%ٲik_tu9 W#<4O7x#h% `DkxoSO=o~y# 1K_ʕ+OC<68䓿կ΍7)wT+AoZk県(F ]5Ʀr!%g具\icG9j8k-[7Îĉ^jG6Q$%,y7L4xkq$".-:| [ ǖxSO 3=g\Ab !*/zыK|'BvD hu"[tD ւR_9޷^&sJ-YJK:GE4wU-oWu|>3A,[}m-h`hwj.NcșBGٰiL푱5zi4Z)s$1z9T{%# ~hd#{.YTTEH%q<0T߾cWPP-NN7vm`!?ܞ#F,d$= cdك Mmlݾ}s:Ω\;/uCxN޻~k}[񷌑RkxPa RZJed6χ/iss??*_|w,_^cqjo4V)⁛ 6oaP(j;nyFL_25zgJ3< U-˥B@EO>Ͳ#g ҙz{FČ jK0T#Eyb(M,ˉ5,cՅpF{aAEaMh VYd gL,&ZfJ"ϥ* R4N6[4,|vB:u4n1V%f0i5m_qK.Zkz$ih6Ifݞ$ZJ)I$hXS4M.둈4Xb.,xsk'r[њ 8A5VkƘZJ qa 4흝Z9"Ɠ^7K+^ݽrڨAsAUuUdݽki#FiLFV㸎+%`dCK^N=BMhz_N$ =ǛƑY[kz~ꅓNE'EL?BKE@PA?#q0oi+4ݢf(|@|O/& ~Wt}O3(, Gsx˒ZsđW_B)i4gqRΝyU}C??.m 52~Gi?MA6Y1v8FeDZ'y"TQTh T;{#O65_"FIVV%!ZZB}l7^YIYZ KzlWmsƌRFC8p]@Z!8 BG)x?hz^׺1eQ$T4(mK;yCsW[y^P(Et,f dr7?#? C/{ޯ|+{{{p(@<> (ߓ̌[N/3g[H)Wp4$,G Hɴ N(dV}iHVXu `ThJ)Ui}?_$I~g1<?pZx[̡Moz;y駟~WWz'|rVP=y4dT*%t:ZZyB,R&FSq:z^+ gF5;hf`5"yl4Ώt9??O;KFSkUvg:P8 iQ*Z"$ Gu "ES 3Gpܪ0waxg׏˄ ViDX\Z"Nscz/˗)?ʯ89?x̙f|d{{ӟ46J/4˲//0W %_׍w~ !Ǐ_\\1uuu/}驧:{l~Wpx[OҾ&E;ƘNC<'LL= @k{IJmQidEJ]P_ڻ{}qPQV`ITg񣫁^9wy<&kF{$\ ׸_X\xy<s2(ңX7 +BBjsg]< ͧW>~qi}-eZ8>?~k_>G"%JMoz8eQk_ڿ˿lZzfY^\G/.h\֫^$IʾVe8'yYJioٟ 'xbYLϻ0a*-x|yk-1R[@ȵKϏ'\InSi2Ҭ @2Z:bwЮzr !gRYӪ;B8Ib0"O ZJp:QE{ly0jqeiS )}j>}˗ZFirmevf[ke56 kt2Zx<'~Gg=sՏ|݁8z駟|O|ϟϲ?d271[ʷmGy5yTUΜ93+R|G/;v3=ϛYsW^x__omm#Gw|cviyiX{s!ŋSzǞy晧zɓ>¼z(?rvrȋSو=;hyi/`]vvFrf 7wrΕRҢ(JlTH?$+t z"ɋ0RcR`TyA٢ ,) '[Hb<$vh\I% Y/Z+ԅ8jЄk,Xp\G'ً%GK^vee}b~AibtKCXٍ ]9FiЊhaHB(3R(X+-u)apΔ2 J{|)EJZ!ZK03|ϯ 9VZ:c奥[ۣi[\][k&##G(B{~ ZJq"EqL<׶(ܢRV[+TږS *E{x؄m8B,$/YwtBj?k%ח)y"(ݛ`4ԑʥQ$(8l\qVh5\lR@00ʡluP@%T/ @fQ(eNZqVj҆p*R&8X7, qk Xp]yLCxFU2Kju%m )R V $` 07yblc|PJZ` !u4O$-yάŽ8/DhTxۘ۟ -r/$@\QP0ڠXFq9]mVjpJ*- e\hDK)8GT\"s9Ods^w;']p¬h B%*alɵqR\וRfE~`$H#I8A<(jAbF>c mQ{]\%6fU'HCe ?֬ZWs8+s8BhV!jQi L&牊Vk5{{R\۟,WT2\?x~:, )hǡVKJ0O#zq8`h,'Yڠ:Їj 8Rq`>qK S._ڝ(B]ʪ" 4 f2T*z "!HXX\~~w wP,66W,;{QyH &p9ժH 8Q!F6s fV;) `˃a:a-!P< \?;X b =Jy1_;o(-2 !9tQwoVu4Me)?l87۝瞏汵FN{׏8Ats4׽Zu݊tƅBcA!uǴ !4 h@ ߫>lXZ,5xVewLL9xZ"\4 կӮh&NLdUNuuuyia4]6NPkm]YX\Z>rڵ+>)P#varH })Q,/WVTp%]bZesuye}[R8~$NtЅZÝR 0;?Mv>8N,Z ,oMQk;*iYR\|9q$h* YPj=buת.RՄ$w8ЬViTiċ+Kj+xKQ J5[q$Q'cJ!|g3 #+K=56⻢Po/@hk ֶ+8!p=ݯѠ'{\8qjAb8ZcAr?0cL ̖ e> /Մ6y^wt KʄWayajTw}hkq^^&JVIe"vSV%RхM$)q5%p0\Y]\7MJ+Uou$L¸B[R\ikLk5()ǃ&k1 P* U9F<o|01{xck\0bB(-R`Xx.qxQ4UFI<Mfv\nQG0V4j4rkm.0O;|A |j4j?~2"*Xp"isaIKfj7Vyy8WQr%\Kiu,q@ع*roFP֔w,2sΘvB;ϙ?͠,ZˬS@^d!HT4h-\J^H}7pI?tO+펚M߫NRLw458Ff`$e"W j\-X`ժS si4A^AN b&,"4ٹ6{8+`dE E"A4Z[RJ`1 "Q2/w^>v!d;LcO T%%u"1R2 {}AӬ̥.EԄ:dR ȍ!c\Gkɹs牵9LIxRV+g)XRh .x)1 &FIHx<u<ƨ!LPqYcւ!>dYjUpFJ!b)ƀrk cƛ7|O>|ZĽ#RGLLc;j( 9 }ϥ()eI./^vyisE?p\\XX j@\XXa,J4+K)8N#Z%iőHRTy^ p8\Zl"(덶,ݽ0nMRmA?=_CPߗe1qfμI%Zr8z|7h4Zp]#PQ!Tj6Ȑ0< gF kkjӨ+՚5}q!hq={\,b2Qi_xi=gΞp>L(vLIVQ`%BJ5$J1Ƽ% 7P*R7#w;@8NmAk=_&9O߿!z4:yZZm7;xuw7{BM4 'ӪFC0jg`(Am )7eFJf[j`lR$ Q<5F3Ƶ(@ * K^XY"JK4Vk淖ZZJ`0-B#XGi&ƞN&Q^8$yaˌJe ɹ,S9(fn7AjyV RM`fn/Ûƃ0'N`R+i!5X[ݭa[ݽ [4ɒt8FqWx.TݕjB&q=ZKeQ }9ߋr2\BK`ja{y4*RЬX%ѕva*,3ʘ6EƲ(Y4Imز nT.SR8RrPe:I;Cb%Y|"[yOƓŕ k`o—1-HmL2J:$zljٺͪ'8EWpkR]TtƤi꺾^J,*M) Q8}}O; FӨ7Ө^iYcX8G0?85`\+'Yb-lw=azan,"Zh{vC"@9ʲj7թqqp;U@_d'A-Uz8`g딋#O,-%Q*bs}y׬x) ZdQ6q:,RT,vPbG2 Xi"]o0ΘE VWW;zEbwk' 6L{pƙ2Tư,/BlS7BfphJ߃Yx# p\hx̮m5hzut{?'?zj*+'(&n;i:2f0nmh4Z5*>ø<1bE!@`@DZ)^cQpiU,TYv8Uh$"Z>U nFJ+DH.ĉE,Ɯ /#c= Z Hʳsm;Ϗߺ/|E&R&:>:mIdf,iMF/ڽWt[xdS艦zbu%ϑ8> }GCמ:/T GQLGѬTUl}t!KmeAВ\])o~;͵rIkWMF3!onEq\j`"q3+fMČ-ΣnVew4vegq%WABsaDA4^<;&DzR @Z Ǩ9LkLKuAp c ,<2C *^Xu?|ЃU0^ QTfq\T3u|-=yiJ߽{(h}'O>5Rib/F67D$"aݬ"cb O3CS =KcknYjotu9ZI{R{Qeuu9׹_yg@/,MF+}K. DR8_Vn$gY!2TA 溉mى>ɲfUm4h Qjsel>!0Q(yW,(c BUhG5ƘV$ - O(K"TzBRpԢ@ @?񇵫$:㭭Qܺ76&F?g@)8NP̚(Kۻ賋Qۆ>blRVKlkZCq ~ x$a:k(+fSd!QD\d'DD[fQjcLHY#l:WlL&Fq*ml%n߰h%0 FZRKy7(B[Yӎ"MZEEi|l>uk- :k6uk7vGI|4MT4E4ud;ۻm;DWA\gC]V^k'in6DhHx`\44U"jO]2I @Cc""k2 xhk"ƦXJ)B ('0(@"(G{E6ңy}M999{oxǯNwnmMS5XK@ވ8MbG0+vw AUln4O_ݾ훀dhJ1,Jh&&+?[՛N}bfB!A$ B@!(RMNc(Bm l2YβlU&gh j"bo>|щ,T%@"L#绷oTU]Nkzl2=hwMT6wtqt>(Mٟ_dYw>w7x!t`~}4t7xW=vZˋk&@Da@}C;/r䂰$2VGJ:faBTcc,n*!5|Z֎ Qa#6Jpݺ.@5M:y|Nni([Z$|<'E1"`'t>==[u6H˗Bf@q!˽Z\=^5nzd8 06`nUkE{9AA9A E1ULJq"yމ^JV{onhugg(Nd<(srXUڝEd\s?֡. .P<{_ee]u[[6_ .rͫDI4|pnC!y+)W+Yiq{zRCmh ѐ4Ybn'qő[-E@i1)2ԇT& IDAT nϊ2ll}{TJia  eU?7(&eXt; B297NRn?tb~~r9+(U;8=uoWPP*4k‡DHD9h@@hxrBVVU/)6 ,jBGrkRD!($Z75CMg׮vBFiG/^N[ *ӧ2+UUTMUi:o%I`XQGnܹšyl6͚|˪|p8@>M4MVZ k9H(B7 y=K,,!8L ]@JeVi_&\\V P4B @bVWU DWy\UUNAl9e]ճTk]UUw;y'SDD'gdxqȚ/_=ӄT]m"e>[r0Cp8o*tޏ(0!{4ѯ3"@UP;WVt‚"`(X2\Xuh[g}:__Ez~iB!$Qд0G"5:\&7B,nw#e iž\ b}{XSOf:ӱp:pyc|<:w4.ՀCBPw3e98-gRIEAѪΊ{Jjzf[[Ñ'|ק}g+Q,} ^ BjAM d5qTse#apü+$7wvmjYŝ/^߾}+"YHLg.keY#CEkkjByR)lf[YX:&DY\(,}/jW \5x,e ^Uii4ws hP 4}&5zM<] .Rϟ~BZpr# !*%D"T^'ILǂ(C8Tss޷L.N7<]]Ez*@A! Z /ꬒ30 ڂR,4KjEHrq]@wӻՒM`!YEd)WW/"4>\ A_SpMKYbsA&qtD`@|nl (a!@q(JP@N2B2Q\hgvn"ɧogIqj mTXumSF0UBh:bv}1^}'e (_T%,JXv؄e+!XLHS'Wk!?-۳"kZEFnZhDhu4jWc\4 C\jM^u% AX@p$haD!TJ Ih FR#HҤ!h`mwZi_$$IMy2G.տ߸՛7{wQ-'\$N :3Ѣ)@m`qtV3Xa\6ȂJ.5[ߥ׹x*oAm(Y-r4k%W];~a?Qno3 PK1o~Z򦚏@g$`[E2Vi:Bu5c )"ml믯xJC-|0 QQ/_;9"(5nm}}c2y|<~:G$4?gz :A guF5oAPY#kdL J]mhP5 BV'A(EEr@Q(?e*F/MXj7Y!,@DZ(S (dp @!/L,DƜ"4mZ\Fq) "YUe ػqVi:%Z:/occJo~o[q{`Yo~L* ʻ$Y}_K擳,fe5S6`ȚKC "\W|kh- w2uDqa?:0SD{ jvL5/q BXɊJ VHYDCDvY6Y82YDrAZkGe]EaL&a)Ny|w'oGϡy,Nlz?{㹞u/lT=)x8،2%t#j]\pQ*Kԋ!t^b@$x+ K sOe]>[r+q] (f0Jף5ڻ>{ܻM,$䄏7A" S)l$Q)B`PRi#6l@LA!Ң\&v?&KyMg>ޭ8NLr;o?Onѳܹ㟧{M;l1goѷ=yp?/|k\ :L돞Ob OͽR? "᫚fy.{F(Mׅ^@ */r7zaԛ^:tP0 bYU=,$-/B+Wo?L e%z H;O񘛀1>|E`{FCWW Vg5z{# jrkV*JvGh5 )0\U\ CA:!6&keU]+[vݹ^\\nWǁU9=@óc{;7wjl<:'O_]~ѽ㗧N]eV~rQoS:(Wn͍X4֔ UϣjXQJ7x"VV^pz^% q`MƷud2jeIDkYZ54! {-;{B\Z/ ipiz)bCߣDc|6{+HhE+!> *ah(JA(֘k[[[Q")"iv3NNqrCU4 V_vr2Nώ/?yQ۵'yl$꽷{Ygr<JqUҸ8 wF^8T0hJmmeܖK/UX.]`xLb i]e%>p'~B6N=}nkkV&烍mBuq~nrpb12?szS-SrzEvzVPyPm BWG>$c]}+-R,W$h0λMRT]hELԄqHemUo7ktΥouHSiӥ(BJcƦG!hDi *( qdZyfw gy6Ylڨٹ 4RPw 1q6ѫz܊M tpȕNHC"4fxj(WJaJ1T۷񇳺R5aQ{g^W&Rwߪ߼ۻ8"(jgCPPdxv{^hXezW AvB%'F @ <B QhJ/E lXڄpn{rE"&Ӊº)8 Dd T|M-oG[%k6V [=U'1V SgιbkN^}{&2,!ھq{Gis>L'm%S4Q%}M=ARc?b 3p@Vkv( t4<}: UurZ0=;~R+ I\Lót{ڨVK26Ƃ꺜3:I|1]U͍Mnf4jWf,ї|01IKKCBǀ@ &_K뿋%i,JWAg*9hVߴV @9J[-ι8%TBn>Z(gGk/_]&eu]'CR6Z?u>8ob%FV:`81 Eq d1邶En[P ڤ.~Kgon}U5m811^;,N!()Iv/S ˠb֗XeaH8 ѓG5+:=+wHOh/ZE;ZB>{hX䮗}-;]|eJc)U4FF,K1SA `9{kqe1^}f`~kz^>\]H^>6ҝYC$`k_Vah{}hL1AfNblkj`Ŗq%x_K?*}jЗiENwǛx:[Dgo &~0 WݴXO^: 5RCE"lil8M[IQVE:VF(Jb?^^nm||EEtf䴩ֺjmmoMSm K4;;qżGQ iNy}cKtX碨niCRBY֭trgo;'|T>~bkx:I,ND:]#xcx2A=$=wn] ض/ueJ+khD!̵{tfkeV>Vf&@+ƫD:9ډnpIlvZ1٭.j4N{r [ Jڮ_+yY9O Ud:oy;=3Fn'6ب g!x"@E@<Ƴj0-B:::Q*Nc'"1o˦͑bڭݒ_5"L/+E!:ɽ{izZMx&e-D:s7DQYL(X7z|4q/޹9WU] ٳGdmM/#BTFylj\d)nFD(dMt>=$V/c՗t|?4gT%Ee?s1<2%g 9GiaA@X,K1ִxFܺYfTF1,E).K|2z|f]qO/u}cMֶ6 `T}Γ3AR=oodoi惖\~o䭓IUOAۨsYUcSDi;Œ"^ɻFhE?Db \,D|]*:HӒ B!DZ+ -^ !L.Zr+p94Ѥ IDATQf2wHƦf2i%B W/.?(˷d4 %]_t.jRyu56>Se%`",|\1N?xp!6i6s. 3ƝO}b#~R 'cÇgv}~p8YVvϡ!IUͪmSO0}%z*'Y3*#f3o+7>%^ Rɧ?ݷlRH+PilNAH\Ewu|6=Y3J0%.qCcy|tTDgɓȵ}vʟ83N b4vIyp2~rp*cj u4UQtxZR3/'9ļ JKVzfL'٠ݰY %VKеssL4 "R׎AI!*DFуUvq88DQQd\}цM%(UbӸ֗7}BfrW76i-!h6zGkwr=Sg<WVp\fo%aA/* Fl6 kkN7Js1\h9)8P<ݛI6gIޏGN; :ɼG}5x4Ǐd!#s^46DG .9mFDWez!6?QU4h8ÙB$Yӄ{7ox!9DXC DDK ,*n`R*Z!ټ?@M|xWڿݑɸy_Y3ΨQ8(!Ag/íw^VB|^-,~kMͿ+P^6N󼳾RQ" q;}'IijW_fr6lp9Iڝz|q]OU̻i<"Yڵ()n#𠆂:]WRKl18s|ZH 9..Ђ+كG 5xſG?5YV+WUkiE Ajqb-yL$b*vJ |5:/k@Z8{T^(g :8q!ަ(=` "5(ekwBXp,N м^0.!ƙZY{ͦ-.ڄL pj686ON/숀ZNw>q'Vfq;O|ix˧b(°L!˃E.VxЀ6D*'Lϭ1v"Ζ9 ,ȦE*12, 4 ;IӪ!.NWHJդ $#Zd,JhѲ3NhJgᴊJ{91K:5ȓ}/u|DalV*}bpzZodvFr^=*3S;P m0!bb\x +ǁAB 8,LunRD*γ"$EY6`ۚXϦ3ppV?0://Fv~ pVR֨<(ɊZ5-CNIN$ټ^>!iv4mR*]isFG e'|ۮ7*2 B#;Mb爭 mz(Jc90 ""RBB`<\Of}rɾ{>|*M7|Ñed]uzQgi{ ^כX^ak}TUnߑ8HȔ%E5$ I o1-H^ ,qdXH(cwWx=}ZyKRqPS88﷿akϟ9m#(%cZ;cb)B4f<:}y9i{g{mzqs]" (D uQB[)@AH:5<OTnmwGG)љ.*amQ5?~7}"6B Jb埬wC.sŋRx}՝쳌,&BL ȶ߹V^nC-R.HQ0!g*DpzqK̜Q`J ֘ڻS(JjBNSi=Az0F"+B2K".R(5W/Cw՝CD"#1 D~ ;α8Aj#P2m ڔf>MOZ ,'f~v]׷?7lఞ`JP3̴>P:i2KunJp@>y/_ySeSQ9ǙAS7cUJ"o4ՠ(UJ._Nf95vLT([]'2W?}zsR|"TA܈rjs bJ'r?|ku3 0D7_}pyM?+I.9<:G puoe0ǁ09Q=13WD W[d=*?W(;9۝Dʘ([Ȩ$@}-c%~5G-*B#at٢`D!@AJl2M2q$@Q*D*S[ϯW妨ENsRa`eL*v! mqis~g-N\UhjԶ,$ȩ P2.S=T>~ҫ1!k;uotV׉}?yo;75RN1E@9KY(S ʘÍZC@'b# &FXGFIz<~l}iXŲ~4aew}woi⤙7') ϝ9?|B|qÏ8AA}L1 |u"DV@P̔AW((7[<%a pKu > ExkY)q 6WM;ik!JJJgKIџ~y>8*Pzs:[~תJ#~'O.\YR "Bdwn(0%„SJBȜpN`3J(#"!bU)m`{!cB4tJWgdN/v{xngT:ysJ~$kE>[SNEϏsAĠ>ZAwJJ]V8n1+(  ,*YGG67WRWޜ۪y0aP S/j4ddJW3fB[լOOӿ?֟_<^ %DNPܑ_;9;ߦM̂US4ַOC0D~ՕR*Z2 )|y i a׍V+] AD1%$"d7 ǁQ&kC( @UHt8wuxQrx@ 3.?S6gnv(ڋcp_ ':?4ë_{}D~1wJBb@}D$STZĔ93!$F< !,*qۏ^z4tlQ.Y]_# PLK?7z/}W~g_O?O^9n0O=~tw<0~uP|]/DW~ZnRr܆EL3{R@ɥh 3M $ݩ'H.U*B)tFxY^ 3V0xRF.T:R鹤)ϾtqhpL*(YNgNO]K?S`m.`##bksXq>9{CЅ@ 8'ȉL6e E1[o7fytD"3VEYp^*ePpE%/77ٮ_s9k&umR)̑752ѐ ^ɮ]Wnx/򣉐SdNV3 njSJXUfFl8gb R2b'0ʀam(T\|Ym鎵 #$sMЎ Kub?o5n?8w/Mu3=h|k 0'ݿU唇o&j"[) 0 2 rp>~DϞ=11Ѿa0lfٵ9U5Kb?_V=:Nl }s; )YJ%]"z‘D\_W/7?o R`9y}v8()ŘfwMjI!P n[ֺ Nme$`ZH=szR/"BF"G2$ NH!b+n2MH!KK(>)ʙ-@V f.U/@dAIrG@9f!购+j3 !DI!E8X~{ue9$ dR0b1œD!^?ǂѺ)k%/}3ݛ۸71\*|JX 90KҲ ܾ!!Dįo/_3Ns'J ybp.fꝋ3{7w "V#)oaXi0Q&;uR?.nRJra .>?_}IwZ @T@(( 'Ij% Rz I8Y2 1b2jt3q8EQ eM#qj B&"9 4* .W^|㠠 Ц*kB1 BTBBDFA)ɼ{L \ a@&kbt%qbN6a ftU !p$ 2x7" + oUU4@HF|}!+%!4)Dqt$2l_7.jIJ9Ő25ƸYJ'_zw^)|{yQ0L~]FKйdt!r&6J*I}U+CU4 \ed4h-Q1$1[p(:h *fOB(G]*B;3EaO20%D)s78]4B6Ry81C4eꪌ9w}_o~>Rf{br4N no* B8!@ibfR rn JB4hQɘR"j׶ "ZJQD eco~%%E7}J̌_&cΈ,]HDY >)EcLD\Xm$0q& 4"nP[TZ)'e% Pے֪((;dS̩g?c{8 O򳦲~MŴR>,~,SAIwAFҌ"$"eLMQ u]jܚeU*ID 9zD ,1ƔIKA]u-w< .GE`I{o->xXDuebZ@JH|)R"$)ܤ.nV|Qڣ~CuSem&9y_L93NO~?S#+mI1˧nEYf9cQVjL,B1sS t!38++Rg3f`ZM'u׹9 je@n^R#HU .{_>'em{;;d~$2d uW 12ݭk꪿ lV.8%&P s]!y;C{ %@RPrtboDrY&*ҫbT]bNFI 1Aat (`B< :W6 8D fЃI75$N \NbQ dlI7;H|}dm8?޹ݺu?~VP%*}~ ]E3眙(S9}X݆1>eEubVf 0 7t-6}o\XQ .ʅ$, ^vo\,CY?lq9&_ɪQBcQ(lY@RY ,d"VJ3+TRua[rR5݋뺪 V["J)s9e Dʧ~_ p!_FMl;MطX(J!Ko*NaBT1 N Ŝm`LtQ/K}!T\miGBXMUb/nR.`+B !.+rSzn9Ό޷C ˄9p;0LjǶ/4$3i||8)JZ9ƽK>p tb /"McʅP札)q!5#O6iehd' Bt@J1ٲ1E!dEifD@Jh! à!SZ9vͪc}YY'wM|Ye IDATE5&3E΋iCt'U` B(D!pƦf$Ӳ^ yC j^A1bQBiRB"d Y+~MJe~WjyaZdeB;O)sQi>]_Rӷſ?ln$N촤˧%SDqgS , ʛ0jGbkzH*<v(qDʅV8* x1Dtل#. 0)vtVgu7Y'7UdDy~F$ĪJUY圄TqJ0.޷z{}6Y8[Y׻u> g H j\wί.mǢ[*BEdeLJmR`J]BȤ&BBtWXmJ}DEewk1d2%Pg"ntV3ҪˈYI97x k2"h?wO%gB|']&a? t"WBg[-m!g3C9ma?/F򦍓ٔoBHau֖zq9PrҘ%-KӔBn0<|pc6-$*IBi; `3zb?~as¯&R~<Ѡm6ϺH#{wU4nd*) HSBF!ŶEa J*9FhƆ,nV5 [m4 i#Q!f` T>_R(*E10ˌJ/'),A9쑊4ԍuit1+B#3c멩O$D=wxyY')K7};fcBVEڐst5^ݮ*E<RоqTVx;bf_4 2ss*!Ei@YY6Yh)U&d`vۮKcTNc/J[CW7ZR 12h:yY!ލ aq$!b빨RaYQd 1Q]O޿|49J$+@8U \ˣ#V~^b#a^֬ІCJݴFRe?Ҥ֍Ua8;*?yl 9,w~qS͵G Q* o"旎w`TiEE,$0d ISƨk[f!UBLJ0=8 эW񽫋 #nJYZ&%{q>G҆UKk!+r^LwUŔ=1?VQj3qPB]LGKk=2H)r:%?mm߇ʜ-fgӹ,:"k&`%.PiiLI w2 D:s!0kƑ,s`WX.:PrGj b`T1뫶4RN Jͤ* ެ;-̡ P88~W6A0(!c 9 ]ڃ׋MF1ڮOE!DgP4.-sgžO/}'1<ʈ0DuJg Z[Z\EQZFf0m7XZ&umoK )ݴQ42#ūuxΔ&@ٺa*mޱ]2Kl׷OW\nJ|\9[]ͪ. mծm #f1w{P(tQ>ݐX*;/qLә C!ma{smh*;»'s).I)HD~1}~&X],88gxupY oZqK,oכIeM[oZǭզL'F7U 03ʞ݇)H">z4{iOM* (٤pq5ٹYE'ɑ1h abIyd!)ʢ8>Z7;nܔ%t\sa>Y?{:u 1HoHUY BRkkdV HRH[T֨읗y !}&B^o@<2sLQ(rΥ-q(QJRU1Lռyy̞>Gme1*(BD-JVٺjZ/׭#HJ׫ZҪIz>x:BsƍL{9btBr9pu3 ۭTYșs+1Y|پrV;=;WV*ɓ,mj$}ȫMlA>.&1>ү<ѬZ{GElsaC![$`mua>+A5zE*ӛ$4AnCׅzדyƳ 71 BT( %Ȝ)Cܭ}o&ո]I,`,B(ia}"c}f9'"; 871D:]Ή^r,_uCРʙa]ϼqL-?èj|GGK.?[T1_:i1%'K-4 }YT)Jvu1 4-I c2ia[LE`m]aYTʊ.WI9/]w,}'lϝh[&$ʲ f23EI) um(j5DY`H)tqyTG59y}|C=+7I4tY?L1\Z1a:+\)M!CxJY}^՞>,bhljs7jrݜkCZ5go;Ԕaf7jMrmb!ڳwGU;>ɳ{QZ1&e#(c?~' X3:$iW[YhBSG [ҽ{"ʮoa'"L(~u=a~@O)j[;MU9G7ۋB;0XBJDwa6v:_MCI``*#B@.1WK,vSu(Ǟ8>:a1[=:TV+tvTÔ9%G5pM*m*|i쇳EE%Eѥ<<{%ƍbVmL>~t)J)(BGuAYfNb߷ӓy|y)J(L);?Zk4 ĝӫa4R2 1b\6,mYt6Ie3ɽhYU^]<\^gu7..- Yt>ZS<8+79}(Fλ˔i> U5"Pd O;6eXB8(%r)ϟn6mۘrz Aٓ'k|F[F;WU@k1qq?:?GOg~]mmwf1h m덢Qq}MgmQ8ڼeawtdzlB ]=!zV$0􋃃^) hkɍQ䬱eQVYf Dtwc&HL!&<89ʀW7C9/& .CxvHm{x;- Ri˂mYƤ80kׇXm>NJ(7@$_nJMaJ@2)"Wp~6ǿ pKLեQΟ1Q1Y0XSe]JB˜3_\]ٻo$ 2/ =ޮP EVE+۷Om( l<jmnv}J~#c닫`5O'bnZPO PX?D*QiSp4!㺬næc%V>z 9뭛UY,zt.lRJaf:<ܸ} `qvCooҚ;J!|:N T].ɺ]!{v#ӛK|zo}1qULP哳ɾiS8 67cF5jZowS$A1RHTR@L43Q1#D20'nq,N*Uq q ~ PX]F ct phݴ)' +?GR_<=9B'iL޲qRuќ,gn{eыm[Q>}>p8FUWx}۶LfՏy6;]۽уYn[zdq&#]BS7m_~8bB>;2ɏ}oz.aPaڲѦBT,2,R<]޹(=e ;2X)! t%b(qR6hÈݍ@fVϥT1EWX٣htvHIFjֶHcJiخu2J[o0itȮ)tQWmyYOWƳf(mSv>jT˃If74Mv^cnxtcCG'ܛvUu1\kw]r]i D"F2J@P'@ h@SW !H $7Mr~sϹ$Zw{wZs41h -3{V=5`"s mKDuaU䖘f6; yAȉVwsF0d|xd+5jh5gmn&M 8{h%>~7+nyseQF3ȘVgniϞF)Bdʦ:U/\9Eyjno3OvWϱ\;A QxQ щգ[UTER:F`CuŹGCJ::*u[lBFıR; G׊oFFcn9\yJGX'vyĨam_ud,Uc듍>{`kH6zr[]X,.&nد9W0ۥ`h&E07/R'rtMk}ϱ鴳ubksk8[kvɲv,?rJt0!cW:lm8XZ,dnNgWƮd~.兹sZlk[ F3an62(e9%kʳʕE+:0c]ѻuOVV΂ǣ\3G)cksyPG,G "P.M#dM 7Y6qdLޘH?oow0=joR入GW{ [Rׯ:-_Y={ZÂz`d8ol z|sW71)\Q*rV~R,I1Y6oLR}WלK4zfgTcv4qA?6\]|M7pWj-+G#o=x{[eYhþ>|谻ٟLf+ pnA:X_s1v,UD+HlnҵZ͢,6{E{+x4.Y++1sB\)p$ɠWe97%Fđ{E*щD"ڝx/^ª ꉝ*{dIќ?ztco FQ=1нG6/Ņvv|}n.?|dHYuB++<6Ui(OK+\1VĭfvYM ;1 6`j[qYLJ5vc}ݪ*unڿe\v fG#gsSz؜PYƼuo:M{6Nf}wvY8@ IDAT✇A;t*r5?-&7j5Vq?.Ys_Z\{[E7x<3[Rrkckkr4.7f_hvKvXPya0*xhw0NJ5)lv,0#͵[1\UE|MUqK eUGd%Zh;|`hT`U0p0X Xk•cY]?{]=[wf(=gb6نVsb(;8MYk2;QǺ5FopށљN*2@v0t..6F%wl5}*,N:Z{'f5iΫFcsolx0'o;VU+(wL+fP&ٙ6YmuGD[ZW?ѽqQx_ QtYiB4{#`Ge{;>{$bx IQBx"ڱ8aQ AEDCqE";ޱ/%y JqJB&1Q"Po 1ɤʴN O 2,NT qX"B 5XzrڌhV!g ɿCԁ 11b)NT,!^`gLDT;bջ{5TC`つP;Yq!g;F ҫ 3̲ HQ~P5rfָ*ǽOAByxVTʚ "4J×+8iHv0ƪYwG=ɸpJ܃I $`u@a 26ȅ|p[HB$DRT8&TpCR2L)t\!A9Â@^K΃!d@` ˭R0@yjRQh Uec'-A(B^4U *UOUi#DY&Ԍ$` 4NLH(TӓSaTp'-g SrAհYV*HlfzCEJ/l 8:(FkYe↵wU!XEBʨ UBlA`^`C2x.0" 1!m,ߗvLm[r7:k SeVXo U~ʻ1l/D<=JQE8Ok8(*QlT| ** r^RR0V' R2TTTf0g/_6EZ-$t4,_4 Ɉ1Ƌd6GV4 VJ)YKgIT8%ɢ,3LCg&ȿ"KD~ -68=)At-@H $Eɺ$QO|,#X u*&E2HA)I'JiJJTL*?qJr*c1{o̷&3)`)R%1DnQǕ3&⩱J.ZA-PKY|‹ pAI`tK" TrΗi(KF*CQ !^i;9n$ |sX/kL |0V@ ^@{2 */+O*UX@e ǸgkkTxQ)SfQaT!A1W. 5R8P-LH Q;O̊ Z$%ttu3ק1>JGdA"0J& cZv6\ 8 ̀D2Tuf*B)^,P{FLʉ;L,KښNQ G(Hd ELmru. DVF <؅EG3j[S PJ=rI%T l@H%V#L0Q QZFD`^1!BLR*[k%@ɰHBNT{ ]2fˠ3`f䌩o YމD`ԍY:0=ʣTQU_cԨZOUB=EG{1dY@VŇy\6r6'<Qb Z@:5@Œe&6}$t%65E3C$"0 ݫe p 1 (5Spv~dP=AL(g&,z&Ruk(e1yUYVB(@*1+ CU$PlA6J8y bq1jă^4I (K)My"m(Cİ`V3^V% me{YmxAeG55qZX5lHWOOXTawV)iVS *4 5; 2paYKY37yf0"c`3 f` hS{.+}ly]Nj{yy,-K+Ҋ_A3[ w?c$'hkz5 u]^y啁o o|S~~CC>H_&4I8xE22ndƒ14{?<3XJmdC$ a-t"vީX0-%B׉R 2zJԋ+5VleBlK7E]9!UaRO{fk5ok, [:thnnNU;E]^\pŅ^;OU:`yy9#///#}xx{0,N,S0!@$+^QX&2pMfݛD)TO! 3ZNz#(1Ha&})y%B,2ݕih O %<૎Ή=TZxgn"`.ҩ@#`Z)+,7r"m yUI^]ifEXE[3EK+M 'g=:viO귏x#|#^>*3J"ii4jJoc|O΂ҪRJmc֐I}ЪB셦Q2%DUJQp^ *Q(+П%5yZd'ea-6^JU ` <>0XNWdWR8wJ1%<(ErkϒM(b$x';m˴k XQfUQ(1[k )9m\+ !y+|t"֫ #⸕0YCc,q”fDض d@dVxhA/r@LٗH&^ Q4EL0 k}+,։tfN zʹ:1WVE˪+p-bRd*BYFy3AO]g5!8)ϔ a 䓌d!X4K!|tm?U¶ޞqP6{YSP(՟'Fƒw1Dj j6>b G^O#&F0&T*Jԕ,ԉwU)5V<6ШuعǗI쩪 VT J!bhC.3Id9@Rp]XSj' QD(i87mlI8,`" *yi?5]pIJg(DsJF/ * Qjh(1SH$Dw A fӗLH\*@d joWnC8̇?oάj,#x[iFUDKj"T'38, )Uga*Aɉ'@8U= sk'SMTbF 23/)ުBi cv5 Ӏ JTqnNi=4:S 5m@_,xt AgǀT,ι6 B b1YC{2FESSAk`Z#N+ (zÍjo~ sRAp_jbf]®K t0dL\4$Rvr[^" CdL*LCZz&V֒@H"(JU;f(sʔUUB&TO\oUW? 3wm`0v{{VTY댩c"ՊzxiA֢X8GSsZaMۄN3,j% Rɻ TJW+APmg it*^z;2U4}MjP2]B/wFK~?tDTC1Z{ǝw~n逃*0dH1^c =A#`5<Ά;3//<N1gTKբ?ĉ7d[XCyd;ѡybB8dU(5=8U{4QcD@5L%g'0_YԚ[|i~%¤&&c0 NEAơ^{Ep($ ['cl?|}^ D"22-+ҙx.>nn-)M u謁N|yΫh x "cqw:OӤl>~:X^)iu&t’qMA1~:HxWu_Kz{Ož7YtVB]Q`f\{]*Jٗñ Q2Qgw>+o E&* lXь`DN>/ŚKuݛn}{߇?a!t6&l'%hT^D8װRdym#X׿'HRh >}]耇ZOf׮bKiUl,Kg>󙛛;iRHo/}J'$p }fT "߽o/%K?gHY>\Mxo?bCtP*F9x!&U{e2J_A0M I<$6Lkx'dgy Fz0{fB(S,AυdOG?h4:eYVŏ~3I>iVWxc9N0B IgDwL3>7?=jϾf骫QOP-QLg^Uԫ:8x([c%Oq`ݮF5Ň$Ch`M}uٚ շ9-T!0a|]xI9eY^q_p58CryPUlQF7J^F7 ?)&R\ZӁ9TU y 7tPoa̽7WXx>M+W=ry2׭Μ;TjtNooK1#z1c>cDך-fZw~:SpnguE#I_N1?IDAT -\A{+FW=G!^d~jQĕl4_bo9=W}\ٯ܏d˵g5. (cQf"kGD'_|ܚ'c}!_1>β,Kλ8 TAAY]_tE;.D ~GF_VGGx+^L&"g?_nt*O7|7]Pk?ځ]Woc_;*Uutr#v 8FR &̏u"Ĵr39p'>ϷHe}&{KL&w_2hݼ~re83Ń q($_DBbqJ8yCqT6JL^Wl\v{WՙgYeK8U1oho.f@Ǡ62djb&iQtnn. # /g-"V+|jDps]uUCgl-Ѝ-}t_{a+~VgC S_Swiszc:ϣ*TK8G^#y/'B{[{KG_'>_unjG1F/]^zV:V@gtb<)5$Ped@xn߹/`gטw_|qWz*@!3O/>PKcyI|FV7c=__x9`Aƶ_oD^kہO^_5&jHBxT\jm՜D 0ၞii$wShwo{e>?>A3Obr~N^9neYFCǜ=$5 @FExP  l UUsm=_F[ڶai8:k`:&ti'ۦ ;oaTz/Gzl*=Y^wu{"ʲo, u]vkJn[Uh[o]2uZº8av `\ds&}U^;Q'Orn6Ƙd27 `#V>(WG[Ȟ'^9/ 6i "1Uf&VrtPv@[ kp"ޝ;UzՋ^kh?~iO{Ӟcǎ5kE/z+_p3qǝfQdgc=-})>m6:P<ѿ]0{tLNRaee%ΝqoX7U|ݾZh,$3eo.S"cdҡ3ՐΝt<{ p+p% o/e/M7|C$#;U;;X˨Ia5<[w}neVAf`ܙ{ z)gIp D-{=W^ۻw?CW3眻+vCZEАzɯc UU௾d>Aᣃ xwUvAWq*j錀ٱU5˲--<{[ͦ1p;%_,)Ajk"PL_y^:OGW^<=7G кŪ,1A{\ em|mcccyy92.yqiKHΛ[:vܴz4l0-܂/| 窪q9GDe `C,ß秳\5U:83Xm?~wm:vp yy7S:k@k[]uoZ ~3vb%EzE&X) 0NfOSCMo,9qXmU) w5soLofwZM*-'Udes^y9*zbz+pM_G4%P/[?w3`C]W^g7l:ésݫudx(_|kg3nЙM5p lf~1ߏs/5UKez y *m=l &r _mWlzL;/V H{ ߺ+:`pw}1%pR~0k^k]jJ>cAK_?&%'gHj%gG^;84^`_ڬEJԤ0=G^Hct$Nn=gPBGc#fr^QcE ~+Sm;\ԗ{kҎt>5ʲ_ ]/8)zY~fc̒BTtKj</@>c0gY4fjELa<ͷU`az}ġW4c8DEF@x GĴ+<{DD{򕺂m-`4d-*1>{O<;f. pT[?~8<\S9`3+159cᒅ=vmsP{-hͨ\) ڠm_)v!?Ӵ-:TpQAh&1PHI9h>"bG<ǪZyА6<XQf&qB .a3!A5ڹDȢ\rB !Q6.D Rh/TE=3t1MZʬpc.}^)moy*>j2T I8j*EĆI؋Be0|%գ= ߥĿi:s^߭'aSgNi @xz ܒMfvR25ٓ5QcHU3Õ OO\|;#@)] \Hf1غhZdKg7lh@Fv̀g!xmۚ3s?XSӁ쮨Zh1&1heplΨS%ޠ1֫z/jpp$h䠓z:RDWÌ?P``t[0 br`D\DR\gX'ܾ% ePM9 t}t5K>M+V5)zC5CDKU`3ЩH(YN)WN/Md"mcФG&4K$DrKêB]l,\[BD9x/j>ղau2m @R)EH(!N'Y TK sO&Mg ;phnC 0XiifWZVR8qNyJs!)7[2D0D4 }1 &gym( D4_A}âxj-^YBep5j(xjX>Mo(bAKb!Lݥ" L! 1S "e5e 2d#QƀH@FkݒB1׉XRHnH E=t?WefTpI Fb^B>ݞ!(Pb޶3!D hQa‰ĉ,J"U*$Hؕmcsm\ }mV&&I@fh @LE ᢇșX ňT VH$=܁SȜ13sTZ'Z  &q*>j:2HpK]z*@0)TiNJp!U4 eeMS~ 4[BRB7 URN0\ əU=TU*XxQā 幚}0@Yi(<,B_N7iXkto߇Ҡ$&AD=\L]J0$U_VhCV  35uj!IPV|EuJM`LwEuPk=EL̘vp ~ծz~\Gg.ЈjoSfh!H!P5v2 ^ۼCx2DD$rZf %Jt&d31Ǵ!㖟=B7!jv3,@).i kgC}a`ժO:6aZad⚦/uU:pE0 MGY;Tūw*3yggzB A pY1-| dfcR1ڦdaUH'}CB>k;fG#탺o[z_Vm)'-lx8kތ"0 N*~$D@Ch9&4XR)JC0ş&s 4K.5 [&H!A;M8ocw4Fkp:h_l)< uRJU$ۻШ,{UNNq…lEf2fP" =D70 F'NqB1.2lGdE w,ν/tZ0#TBխ{))67D$"%ˆ)$1@[v 5lP9LH:y H~[Ӡyۿw[n~@Rlo|_{2TDdbbӧN:tԫWΝ;;w*[ # IR+rE^\\?{{ӿǞ={jJe$gϞ D~*[7+wxTNr.K@KN@JM4Zn!6B#"LF .$Mnykl:g_55Zbu eEImuAeQ("& 3JEr5x i+䨶gS(p(<|I} Oޕg CFUyƈ$KTl̎g{=ՠ 4rՅ:Н~vJ dT7ā@D(Me{<@s5gs3kZ ÙPQu] TU}g+W\lY2$i``ߞ|w}Ǐ_sK.ݰauϽuM7E"[ZZ;~"%o-Hx㍯z|1[ZZtMׯohhxwr.{>+**^oCCúux زe˃>811ž nݺ_T[o}O8˗/ ツo*++GGGu]ϝDa1}tWUU+Mp.g}:Jno|b$Ip6 CXdI{{{[[۝wYSS裏:k۷oҥfȈ1f۝NaOȝ\bEEEE27 uM55F6lS* @ >W| SGU c!05(! 0L!еsaF)c:77_R Щ/ hq83& :#` wEG@-\21Zذ\ \F(\L9ALo*>]aN>lhؒYuPfpAVyq3(26%>y]?4g:%?f$AR#(< l3_?~z1W@p+$@wO\"(ï~%W,TMAӍpz;n y04|nշX NWl qzF4o`KnϾ vo ?' Hd{M~yٝK&ߍ uJ}l>] PPB,O&2"@(m)PY _6t`;!>mdX&4с s4i24ęGt<? ^< p ]a|ιp3pq.#]'];bk _;iO9y1p.D,ȵBEǀ@/}A!f`F`Pv.HS!WC ZX8G@$e&Ѝ8Bt<ޘAN~ M3:.v+vcD~¹z8,p8p122Y%#"mWmg&f(ˆ`9KUDUfׁ^'\C&#D)cYˁP̝Ȋ) >X)>~ 0: (_|Ւcb#Qȷ0?Ay>T!4U;qHV˄R!3  4Dch EnA).Se1J26U8WC)_c(*5ÜbVfe-4k5n^|cǍFȡ_zĵS/ٱܹ!s9XMo7:ydT RRʞ\uGg0iikAf #;A,`C 2lD13Hb;[[SCH'N3:Cu1C˒!DV(BJEA\l,LFBs٠:!"L&bz'ˠc " ]b,B$ir%] hOOϜ;F 4D(UDsUS 'AKjX1X`Vak!xc˖-3ssQnᘳ9k͗$> 2#w/ qcaOXdL0EU4k0ƙL&'X,[kh4QZ#beq5 :e(#3H"iidbSJn7clw;x<c|M˓oCKp*4yRj,K~(Εc,2clv$_dC6@ZXnoc /mb ɻBB؈cvnc)%J~ܟ0T {NGw`#Yx-||1E%m# V'X+!I "efba<*'~# rVčmB\h!=bH.~*Kf-{,xʈ1@X>Ac ØBBJ4 !WHd mșH[#>mș sk<2[ÙrA#tm45`R|lB&( zm6b!N,V@*4U eVI8獘juxťo7O>'_>[ohi]$bQ-VMUU-ɗC2y7"q cc}+XIt/zW_|NQ-曂Hιj _W'DA߇H0**(J+WTcQ8|5O[vʕ(3 <؂@lV+ı͊dzm,7v ?ݷ[%Ϝ@y#0˽g{m &{KWë<+%˲aK10(L!D])$W bX$}N !I ~oP2hʆ٢EyEd>b;rrKo\ӴɕkaCCC^OOO::p8jy뭷~?tz/7!>{ɩ&6|߾w;NH:ڙLzdK^i^UYX/~CFJAΜ9S__F}ٲG677˲.ڵkǎ}xxU16{ٙ:axxO|t v"HCTT ]Yj}V͖t]ojjMR`pɒ%T 4M B 2XAB6v nݺ.'Я*l4uݳ{~scD{$:Q-_HG84&[oh-7|}br4P2կ~USSr7|]]]vZh4H$2L,K$qرGνۮGiiŦ!O${KV5ջEab"\Xǭ,ĆJ'bE"I[(۶mY|f-^x흝$566TVV;w:u{ٰaӧNIH$1/2u&Jwު(GÑ񁡟hMEC#Kk-6;tz^}#ۖ,]H>gd 秒; `Z(m sǜS4mŪ>/=5 =}LyI%KX%Uqcl4`:sB>cHcI]?򶧡.<:\t*~{V;nyGTL*q"Ę iLWxp8 A;Ll`ѓ=sPOO?єMgQjb#Rɤ(d*`^7,bԠc@E@phxa].cL550@/@'c\W~ ιjQclq8ρKYg2\Fy"d%wά)#Ie80w/5,cͬ2B)@ʦy+L&#&RZݭ89cA,2B br˩g٥|lyWB$9,̪q6n9|['?>10FB1nq(6uuZkG3"3{tM2bC^ i-.P=-0 0Ä \+t7Gvq.  `jהSÄahDu=&_~f`ø1lm3UFNJ<6iQ_De i>?2lg whU 78<ӏ"{?;_#oQ\AoeYlVIGn\I}l*Zg2Όl*c55io E> ӳAF `?[\:GH0~ L0Ќ q1 $&*!̐~`J$x|43tjx] fnb09V L&c`3OLLh01`]$dYB!D4(%G.w֨٭6.@07-a<5ϥ}麾cUU}cǎQJ$I;d2 T*Jmڴ)<37|,ˑH7o4m``  ٳ%},sZe&!(-"@b1Bbq:/l*+{vQVxt:=>>nZ-[k׮UVUVV:M|E9T*(JSSSkkkcc!PQիWKTRRѨf!'&&/^<.Ze7,G+4nYOxעx>qC׀`:X{=δ9 ΈRj91$@uUf*73_nȆ14Ѹ0kf泂'/ ;]7mˁ!@az"5|9yaqcNerӋMι2(3F$((@@ϝ߿cEFʷQPx4Hg sd,AVC_' V<ۢ+H@- &@oDa ! -u:ɗO \:_X䱍tta##srr>9+T yC5E<1gBahA3'rIgrb2SedXyG}n0MI#błU˄E ,ꊂ%;‚Yd'x <=6Yt]7X,htppj"hb^h>joo(p~Y[?BH\KL\^lYXsbi 6h0 LS?UUUL?y 8uT }}},766Kwq{DTU_ݻ?DART ر#Lttt={ċ/b6 (FQqַUUU%r<|wqǓO>)q{Yn]@4߲eoҲo߾իW 6[---EEE(((J&[lyWp(; z?я$I 7xvenEO$}}}UUU9/O;uח(~ _v8^chѢl6K)u}[n=x(--ZͅT*%IΝ;5Mkmmxin:zҥK=,^wbb,in0T*UZZ(Juu5BvjۇNj"H**..6 _\t٩a;1^~ݻEg?_~Rz1yX=C=$7EOlE`MWwx'yf!0nhݦR4/LFs-Ou0I]M5 $)ava93f=Swya1d2(Y(CCCwnll\z5c6˘U.14=[&f"r6|w7ƴL̴MG`E.0{IAubΧ1 b65r@bh4ZQQ!j* X1Ivu2,Zdz;:e49fjڦe\&;}L&p8Lw~ *ȏȍ.g/!V55ՔQB 13WX;s,>9 gQGZ9 czw3痋%?B璔!4SfZOGGh: 4ynoIJZLK=H'@HUcX%23jQAijl p-dmE@ ʌVR͹]S9Я넀BgzY (t@vw+]~M{ĉGMq( fI ,26Ԕ~+Ovw҇\[LN2 y:f6j7z[gBC{ÇX+!adӀE)L'\&k9B(J%KNQзԇb1#SjPULoEQ\z,Nt-"tww[TU={xަ&39ڵkeY^~=ѣ[lӍ3 "zfSVw'%h: [D:UGLͦGn]=iAs@4MqM %c: `MO\nV4M4s+,h:a7G%vm5T 0͊7-<39L`r''eҋqj\ s O頍ÈuHc F *Tz֗;%` j!xsp?Ĵֈ2zZi4a0өS6TA2(bFLMeNp̀%FGJKAAB$ _)c3= >uFESۺf<s?P^\UmUL3DηR f˅nh\M=c|0 yˈ3pq.#<0[D0932kkNpR-gFflwV>d{;86<#gf&8ޝY q3WCmLEwL.#%oHg_cxs1HԵl(q0ɳ4 0,0,s46:-gu!3ȅLFN1La մV_{:l[53<MRimjN a!3#4~˜j0 ct~YʐY˔s0SC(J%Xh4TUJRAf1ͪJUUESXdO}9k4&f䩓֯4|p?)*&1ŌMr-dmT*X#=c}p|o~V`]diP|U(31yоϴ?baG^?g66Q_.ٱI$ 2b5Й&$X -ՒOuؖ^eݲ^[GNv(P[K'B8cPX ]!i=`}}ڍ[*b%w ?FĦ"BffgJh~l4fiQ/)kYTRdUU#TH4[Z\N/Z\y._$&I!d w8vٳdrhh/>~媬b}}}y^I)//㣣Db<>ĕn˲<*O>5Q\5SC=׆ |gyMIDt;ccv(drA:p@EE,..ꩧZ[[nw:v\Xj9:jllFH$L&D"rʉB ƚfWNMfLT}Cr;ѰIzLs˒[^ۑ MfA@Tb֭[WX1<<F].W8>xiv2sgd2911QTTdZB7nܺukWWPU{@ss]rk9W Ƙmhh(6g"~xŲqY|ȱRdI:8 'Zzplf` 6:u#~6llL&n [f͉'|>|k֬`M!CP]]%&PX,[҂CPxo:;w!KVVbtblڴ (ׯuRuIt]g\_v-!p8֮] c<88t@ `˾XlayZ#Qev:O L2ηÉLdl(/he!ݖ' N!e.,_ؔ'_E)-***))]ś $ɲC7>=xgLZ;?3/< &oPҹ8~LF2wdLJ<ݏI../-)[>C-p~j1E bfDC$;d"!ɢ9uLcccqq 262Ys?Dgߘ ]y?lRzxVz8&<g2\Fyˈ3\e/Oa. /6gFfc>էI+3) D~0)w:aJ d!3ɋtpW6weq%fcLr -$lG +`kYJ3ԽXfKot.h0,`d"Y> f0Q!ra:Ϲ`hoy%1ܥS4MFLT==磀v] ,S6tNHr-6T6MLm9]\Z ][3y.2`9]#4"`tRaYlL/^ 2%ЁC?˪}~璕6ԟUtϑN*U͗ E>hn7P 6s!&`QB$Y0%  kNUKk+[gBT&N2_4ӚjxBeYk|oB@(p!Ay؏b4m8hZ,eh4tt..DI&Tw2/q>@m-dt\P ]T,ȄH`wLI] JO` Z#3%>Y 1H$,6mϘd}Şqwq1;;V}VDGz6y Hd2eeec31F10K]1Ip4ㅅVrs WP:BcӧA5n5OvQp{\]1ͺ<o$jVJ߿``ٳ""H<BcR_,kؘ$IoBȑ#lv``RjO?tN cvWWWY2Ok ӿjePrM+ B0txo@Ĉ$!*"JB%R'NZ1SOKf t Ji>w޹ۺ3g ca3g,oyϞ=%%%#Bxkt@B2+ppʚk߿ɊBX6mrߵe9əP$;Nifwll, F"A&&&֭[=φ Es8f\2Q#-2 Cu֙d,X,\FW][[Q|G?@BC! Z0F)5 FE wv~A8=0{رիW’3͛oԴ|򱱱&bEEE{{{mmm:--- ̎9`0h۹T*WWWϮKc#BDBLD1BraQ`<,/jy3ٜPJ)fP@ L g>a hfYC\DlƘiWFń\"L&(㙽dDXx&CvI$JHQ400eJ6Ģ1-\``X033#yˏ J34Mhktk@1Dp&vs(-L(i~#"J}J`M!/"b-Yj_0lө1A93 A^r,۶Xny1t@3!'4PyF _xz捋!)c#|ah84:5cL0 o߿u}}=ݫV J0`9f Axcz'f.kϞ7ↆիVY0͙AFD`ɤ???RXXy/wDS̮fN|20 Y@]==/u8Օ>/L}>36cM?ϹQUU46{ٵbo_yƉPQqq}}}&I&a`B0Sl#3Tc,5Cx d29888gɼ?'($qHDC==DbBFGF$#I P0ƱX'8|K/D1 Rj1C 0Ɔa\zQe1x-Z4gF{I=D4))-`1FfժUcccX^$nWVVF@ k׮naƍʧ:R̠`pN%F""$w/f=YN&߼eKssbbbx\t:tREQ̸}Db?eYޱcFUᐤYQFfHj`n6Gzpmp8|abFBui3D$Iv]ӴӧOK]d2P(4g|CL@p:md⦛oJ뉖 zIDAT;~o/]{>r&ɍ7Cab(]wcYuG!d15mŊ?{i@藿xw֮X6P2fa<=a5M|Z1p8N眶G4"K"(bB(16 : |!SJ 4=!dA;gN &8Kyˈ3pq.#N~\Ni0&9QG/=n0B"8y@},#Wc8yAl@H(p8` s ILv89jw;w& rFEW^yehho](nR2, ʩ-jjh lli Z"(( +4wp^y_?Gx\߮zVqi^Vd2N.K F $IMZŢj4MR~Z]f_=Av;v=laMAkaUUtD"p$I➪8r9Yq:Lj J<GQveYV?p8qn[,zH#D<HQhO\gQEIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot22.png0000644000175000017500000004004114620351225027572 0ustar00hanshansPNG  IHDR6sBITO IDATxy\GyTYzglfFI^e2.06!r! !/$o{KBp`C 6&oXބ5fߧgz>}z8Eȶ1s󛪧@---`0xޫJ4M@p qWGcǎRҲ:g`Y|~@`vvqbb֖d2i&)Wwq,}}}`0xͽ?_W|۶m333.k;v|lMgאָ`6?e˖W_}_$Ie4͇zH]q_!UUU7n|衇n~|S7|;tk_Zoo-[\/v|/ƍeY'|rbb"BnfXў={mۖL&ݻw{o]Wڹk׮_yw݁[nz$ !OYfdddÆ .k޽pW@v޽}d0~='ojl|챿)xWyGLl5?z& drphHEũSִo۶ H*|upQ,޿I=i,i'7 )C@G s={B'TPL@\Mc.)9"BxR{/u . ?_qKHt14M77_cbܻPa*!x=Pe%1%FE-%z^`颃n_ j59y@bVwfz7Ҋfv/{Xw8!Pf-9Y|rZ~\\7p߂ƥ{mU h~ X HDL Э@ӧ RA Yv#\v@epkw! f6]FPp|n.8\ Czl"z  { &H|NJ"\ǽtɗ!niՕ^abdƁYR`vh5 ;Z8*3 P'wCC3H` 1@߷ލz}RԀwg %nrS){2R N`"^ rCP fjf #PL1&&`vOί= P5w#4~Bj#߬R#\^Lf]25C=)N~Lqى^/Q @vG)4 eF xPgM7\btƋ< d$8,/#~'_+_f3%_,r/ْ/-_%,̂wddr8 Z`Rpg3H~PA &q.ȏT `h(!_)8|.qYq`7 GIZC(Z./(UnY  ԯ\0Q  Z`&p |Lp8ʃ+$pzf"3 D *>z 0!3@vCn|B2֍pMJ#ͭnBJ4w\շ@n/| u`D @v\5`1 d >Arp5 5xWAfw3  pDf!pAz HG8jBW+;dJQ=y]UŋyieBm8 ez3theGO=ZN֖|-rR_~- k8`76HN1d-fԗ/Dv>#~ bY $LFWؒ$Ry7@,3oAby1 +JDf{]{ƹ뿁YYA0V?*gYYRFsbz Ta.Y-H g,xUÏ0ԓ/ ` 8Ɖ#%F,$362)7jFvsT LM\֔w7 2Υ^q8ϰ,˔DpswۖNeI 2Be˯ܟ?֌5we^ zZ][tӓXBF"J5` `JGjCفV?ћRs޹\.aH7*xVL$$b ʐXAaX B!s,/K@N$#1\$!$I,#1wArIΗAJ5Hfs؝( cM ;8cJ<8;;uV߿{.v8,{<!U*rũu!PtSfYptuK+^3&K4/נt݈M|@ R^v߯*`)EczzC!?7NM ۻ/AR:Szs_;oM c^X5@!i3DQd\ٕFepƖU3sv}[˩MTY,;;ʧ xtQJ Ð$4MY-˒$1Ƽ^ܜm |>?77W__fBlZљ~>ݻ]bsvV_(tHY la~n 1EBo9.g$ko3Ua_u8UcMsC{TYkn-ȨG-#+{.?2:=o߿u؉oKBly'W{\Sɱɱ֖Z?_\جSUڶ~؁_Qⶆ&;T6Ma,K,J)&DӴ .H}-e\V< d$8 ʈptGO#BIsa)!4NI'ERl;,85!w HY+(:B@%z@̰.RJ 핮b3)%1 d2wx\\3!S#.+1jsZ`Ė6 3.K~X P;݇B~&.o"_lS课Bt26 StHJz#Do]NO_uEot0U,$$(,/6 E0 @Pd>t|U`$yyBHO# vϖX=3ڣOj`oA-1[s1Ƅ˲ʜ ۙ8_p!,KQ%ϖm`nZO@Y{ rB^XwBi!Tꭷ޲+UUUEUUYcnѨN3qITU,L7[oΝ;1?rDt!c;7b^6׵M:hlk]M0`jFT*L&IÇ]'\W^y; رcͯ͛[ZZѨi|# ]1\* 6kzc#m_8 fw}a |ww߲eu}֭^W:EQBmmm@`ff& R)!tc[&˞-bKF+<81do/VU1eNÿݮɼ>G;f5MӮASH I`j0O JeYe=?(UJ uP 9$\\/u Z[\1BH!ڎ-L)޻BrEgxDrbfPb@:2 s2KZ Ūb޻L}CXB@\c32~0a=!(}p9SZY0|:qQsf Y=քXTz[u֠"Y,Ȉ2990 ΩVL,0`ղ̯}LS (ZŖn}nnWI |çu6f.6/ \nːrۨr݆u]&*#Jڶӷ׵^uW7W仿#e[oH톾: ב%3ӣ 1gћ[Q(pyg {&[ ,o΅lvxv UGz6ݹ*Q5-AtJtӶ?t;?Bhvv~mڎ"$BP{RV[e-lٿNLLvvۅ}:ۥ.]tw Jn]>nf"x<֨-V{Z[,l69>vg6Tr}A Nm|0Xl<ܹ:>=GYpIv|ᶶh4ZYY922"I$ISSSv[zUU=~w711qĉcǎmذs>11d?p8xuuu0ܿkk={t:flwwSr}#G_ѣ EQ~WUU۔[oѣ_eYhԲ@ ѨaRsu]pkvd2x<,z))sj(ZWBZڷʲ/:~:5]5ua~+ b/Bccck /@)8|޽{9i,#͎uuu9'NxGb^w\nttc,?gff?p8v577x&''eYnjjڳgO4M$p:u/KX*|gzzzL|禧N端jY֫t: !/š5k~8q"=x_x뭷n!sz,[(T0=3]_t;8*jE*?y`_,J,iUSSN+** A3hhhPHQYSSiZMMM.xG[݊p5M|xĮiB6>c.+ήZD)|O$7t9\.&ۖ,ˊhfAyϗL&UU5 RJiDlVUՂe,ˆa(N]H2My gc9pZhVRq3"VMPLii4o֋ա?ADgubKkHm _WfkMg/eujw\2u{  8%Oگto4Vg鞩3om-0a@ @JfδF.4r$9N˲(aBdY>w?FHmbNh9,a&١ƧyZ`Ld&0+7M$iϞ=`1Lz<˲٬x< طoBP(twfYI}Q@)5MsۖML`l,՜3rtVgғa%mbsmGBH)dtdUTTد;;;m@UtE9e[C i iXMeSz~m0y-UQVɒ^SNjbp.gz#Og+,%` aHgIDATe#NQ3TP΂<q$"c-8Xbb%(m`Yp[.;JLlXNB6IMp2B%!scI! v<,%ib2%H$8+KF$8,cq7O##+,$YY4!`+2Us%W%Cū25%l#A90Fc- f {HX2od yǍa.)!|BgNB=Q!X1=BHQdJG\،eQ+\ŔFͦ3GOZd3L~U[#fuL3<0bm#8c%ovjZ6O&5ƕb&(ccL{oޑ]Wb:%'Ti覲 bDR(! Z>}6eÍ2Fg_:d2;=ŗ)6MN[!,Ʀr9cnvCCDlܜѱ8 W4V,ڻwo4RJք\.$I_lmm]rttk۸q"ڙ:::Eʑ< 8Lc^3C+c\Rz8pr8q" B!08($#իc cLUՑsn+x˲lׂZA!Y$ WEHws"DRط✻\. nvA}}$ImmmNן662O}cvʒ%O&O+4x $d$(tAB4L,!l* lvrH(l\GG!AM6B1sAD BFr؄l#Rv3^M2K_y0W\Rչ2̒35TgjhXq m,i8IE@*6&\R`@"&(#S!V5r1PqLsąe02o2Q0ɱxC9Ķ,Ƙlg2dD3x}ƖjөNft~7:1:ͱry?[MIoD?d݈H6R53)C>ǡafQ\eL)T" ӚERY-YΎfIAMug\Ȉ]+R8RQQQ$H]u;^\v^dpž %;z'th/wnzBt]׷oDB.+s+++,ˆa$IXeeizNsk=bxb`\5fY!18ntܬq[V|r|69]PAdfjt:iӦ 6CCCvx_{{{OOi+t;?˝7bG>>q"PIbCL[6 m0:lM#X(z7eYꙙӧO^zjjRJeY㶶6BH8uaϞ=4/"ͰzUln$≃Cu(nD&0s8aΦƢ7cFʳsO>,˲]֮c vEQlQ[e_.\i[lmdQ>ɹtRLD$N0P.11\2&0^خ jdkk+cYoPł(.=DF*F4E3q).' xv+'& uyrb?BDMuX ;,iRoJ8h (GHdO=^1Gٜk<۫n'jRJEBH--|:`XR^[2oaG, BF2 Dgg85dfqj0 .BԈ$Mpsaۈ(Y 84F@ĩ ΁ꎈc Fg?p*YŅJe8F+" btqSPR8FKőe Xc$ m-(Sg]D1aY(c Wt8͜ONKKs{{w("d$(\"s[lp?6{'v !D1ere eJ|I豿~zTUpDQa #K/74ڵM MfnMdcBލ$xC[r%H$0Jnw&ijnSpqyk]ןx7|s``Bf~w=.?\iG(Doss|zbbzR""ĮX Ú?7NOO~ E.BaR)y"a YRn$ҙo%zj[@󎎎իWSJ#XfPee($v=jl3+IW$Lj[lhL#طcyA)v8>/y7"bdr9M]n- TUC252@e0-ˢ OPB -&, ټIR109Ls;Ŕ7Š *g1DYcf.#yjvh=ّů1ƌ#e D|.:(37 q>0h<\.o҂Y1U%NgYI!T.'I\4˲dY&EH]K~S E\r(T dtNE:[3ZfNH$vuu)y麺9ƘeY@EQ˕cTjӦMc! B8kĹIOD`ɚIz^,vʼeB544LOO]w ٝS65Msw}O?]QQؘfNgҨeyQoq&5gGRѩx}SU:mR`(ͥ0qdi#@ X86 #_>n4NpxÆ 'XUSSH$FGG[[[W^+++(8H$2]ؕ;M44't|N FxRu5ͼͤc?nB7kʲlsnc˲l}Gl{HuIJŅaY.d,2 r-y|aRD;)%Eb*%caٜR~Ybگ Gly"4"B$Xl/@OD(̦,n嵜#18(5~UXl9ǒŜStəIa[-Sz"N#(c6g^8(lr*2_ YTkR)8V^|>"Ӧ,iJIkeK~SQVLnKPB0~SF=ċ d:+ndQab (KdR9ޙqK"V gmA&6q= #ڛ6C-OJS6h嶑 Ɓa iLNOg .:~g9wՍ^uN'莩;gC/ x/RU5y;E?MkQJE BHӴT*UQQqY#-_lاPNE7Q\|ȉ\?Y9_]p8|)TJQ@ Fׯ_sζ*]]BcO@tޔc&t91w333T6'#G۞!twJi>zK-]lD30 &LRja!-0"ȯ~d2qԩ\.jժg(g߾}lVĵ]p%Ir:5XQjt /2!SW4 EsEQ6o\UUjժz*7M;4l"*\ V(+/&[[< ,; *~1M1:3hw 6~1{]3p,l#*o^54@1is0/rgKm#d VW{Li3X) f0r(7%0$0x qSvz&:A5C$B0A<[r*4$(|f-,7 &8 !QAp,Y!#rBIsd!$9,Od٢}A17b&8gG0J#e[ `+&\(ZˤWGS!) |e!ɬ[B=L\Rp+LT,%)ML#)Re35g!-*RAYXY ?=tXdPUͫV 74A1e2/h0\ﴠ3_zo؆56_WpaRZzٛ;_^gzkwmA (Y7b #dT"zo}L57=#dtrҢs6^ꪻv%^PW֘3/daCH$;,cUUN$]K ;r =oPb~1C#*du>ӧOݻWӴvp}kFQjfV[~{a?H_I07dO244tر UU;fY>\.'ƾK ;Kr!%2"׏Yuwk2VOK=8{ΆnK4hh[[۩S| ؿ&QUU]2pW.=SO7ʉCoۏz#Wo:Wlt>.cWnC u.BL&՝= ONm"Z?}HUnT&{YSod D|E@RӾ3 ZW7޻|t$j7i맽c !ˎ+ˈ1FzQ,wT:H8zMpS2q>r۝DLjweX 1u 5A QNSVd;Ԛs0`yZ?D &״|ŋ!!#y`y! DY@Pr1OkL#8gԸXhK)v~)=BٺK8T> %kb8/0*^FHK ιp @gB3pw8 J*d楙>`Y8 ɪYr?*S9hHm,Z9Ͷr)T|qdE%Ev1`4tFD$w^q"g7~wwt_n}gǕ-plO~3?}pF} Sn %ǠV(rMJOڑOc C媛7^;("d?{*VgBF]l=!Lr?egD]_"*_7{Av +B l1J#9/Ւeَ a1 !Rm8}`qB;P ΊɞCA$|N&3p ^pfhcNs֭CCCSSS?|]]]\wyriMfffc۶mH${v/Yb`Ydn;?}㙽gگj+dN3f4W:&pt:k ]vjj޲[nennRmFUU7lp8x>D"$|>4)'Oܸq#Bh͚5x^Y`2{+ س0 r$7g鎎p铧~o| %\.G)B`PUU4].5\cFKK 8g25kdYnBڵk[[[1Ʀi`0 +***)x@iP`bW!ݕ !^K$<,˅ eI_{t:mWv|ͳptww۱v(՜sxꂌBSSS?O=cHa(N~WIp}:k?z${˲bX J9d2x4jJAEovE"HҾmcdYS8Xu[[[!ނaˏQ;9BsF9!4R c!(`e:ɛSIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot4.png0000644000175000017500000005175614620351225027531 0ustar00hanshansPNG  IHDR6w,>#sBITO IDATxyxU?Zztҝ}O EAAAqq;883Νeq:!kg:NIStNT`<< LP IbqaŁ`jPA3m <ma/a`aaAxk5f+wZSiω Ð ?6%k9s9hD}]v`|Xbxi& d8KYU%-.&@o7BP$``ubn} P$܇5G~[./~7@(ÿܘK;v:W5c~%qeg]yW3?d0PA k (c"0w &ƀ7XBxaF^ !@ĘBq"E`  1Fa =)I45y[=JhRE1&qBa60JB(K|CEQ@e(S^DcйY^I./- nU츐ڮ יL!^i_|Mp86lؠR04M @4ByBYHRχL_D,H4M#h&kmm v:oGQU.\P]]}~^{R뒋2 s}\.V~z ,_IW#mЅ'CGΞy XUu%NP!mVZ7,mt:oc₆ÂV)j^}w}<eO>}aefsqqW_}eXX-**"Ђ 6lؐzᶶ⚚Of3˲.k555^^zifuuudgΜqF]/_ꫯȥVkGG˲4M<7.7X~}oo~*++m6 {illd1sEa̩O͋ iIIɱt!=gćX *`f(P0AnZ,~W~' ZZZ?ł1޶m[^^ѣG +?BϜ9g۷o…}yٳg^lx>^ŕ+W&''_wuFQ?/ȑ#}ۋ/&N \V^m۶>qɓ1}}}555wzv VdRV]]q-`Ebc4m +igo_8QSWJ E/WDԩSJ>AAAOS!bDDDLLٳT{rի6l "94aO2MAAAn[R4lM֭̈(rWWWϾ= sзzDQ}&( .x6~c[ΟL7 L <||Gnv~|Cċ844w9rznxy׭[P(DQSRR8t(_OJ%M?ϟ|IJ?[ny' x޼yկzDHJJbF2cccK/ۿ JTTs͝;geea Cbb3˲OvU\{Ke׿n޼g}vw@yyɓN?͊SofȄeⴻĤgEQuuuDkcbr(` A;G삤ȶlR\Ճ vRT~ޚu5F5ï2D]F<[aDZh{PUUU+x<}#G444DDDs80Ds?|CLfV`dS1DzZYcS>'N^qJfҊI:=5='&Ecߍ!<_|,Y//^:y$BHקPFQTQQ鎎SNϛ78pKN~@P*z^є^XX89Bmts|[8::3`T ` fXIH*V~m#>mvAI崥+.2`5gzzVںu^_r… z{{)"jeh߾}sqyyysν[?䓫vWZLŵk94ؘ)ؘ)5c_D_;"9D5EQgOR#&ħDTk;^uCBHvtp4ߓe Qyy[ۧPa:#^ӧSSSZi-ZD!.B,O~zw)-~ OV)B@4( ҄EtYYYmmM77k֬Ç߿ʕ===I֦P(BBBDQ4p%Kݻ7---44>-AXjձcdžB ,ˮ\0?Ͽ'[i?Sl0'Q74\t1!C?}M=_+7 bNtU͘vCr:N9}5sk}CS0 S8("m6f̘v[ZZnlkkEh4"l68>>^T$$$#*++nӯ޳ o#B@F.Z֐͙c{7u=Me[_W19gV_g_}̈P\Pyfg#0UHH18.!!!11QR&"tXX ϗf" ==CkWnIuVUj6-'k/!n޲EWl>R[ソ`_;=Kqdh/ocC66ߋ}jw-?t( KXAٓow=gF`P\gu Ĭy...v25"XW#. >KSŮTkU2TWӆGQ݊$$Ă x8ln0L&NJQ HQ (Bm!N$lZ EItw~2$kWUtC||ې/Ƙihhj8Wߌ1B d\F>Ȣ Yd0(4-}Q i?dԆY|qeq!('N*JKJJF("d! h.,,T(EEE4| K^a'-- !m6kjjJ%a:XV[J%8//OP,P(HeKKK2U1EUWW/[,***66 JeKK~30)))^8.77駟&шJ`boP-M&!i49mڴ?55 AKKK׬YS\\\YY9cƌO?[n[pE]pa `JFөT*U*qR* ,<<8juvv -YrWnۺuxDQE1--ȑ#:(-0ڊ%;i$CCC)y>&&&((HP$p2.Ē#lK,!!d(@rM":sLPP=cb۵Z͛|If``@Yx,E`O$ \R!F !F2AI`T$})ȔAH18֑0zfv62.0>o~c6 Q@ t: v joooEEISWWN ɔA$n=vi#x_jUFFƌ3s-jjjIVXU"󭭭E9²ZGuttguu5eeeᨩirֺnY.cVOLx1jEQaP[[[UUw=55!Vܐ\VU4M={655877vtVVv+++ϝ;R^^.;>UvU\\|@ԉ?}cqF&1 @={ !B;xG֭[R⋡!a~4M,[YYYXX(wJp8 `(r:СC$~8-##릛n2#66̙3#!!> 0LSSS}}}{{ںufYvppt]]]~iyyy{{{dd$ p\}wϟcwޭV rӦMK,ywKHz@L999򜜜ӧOKB}}}0tAAڵkZw]XXHdNh4͛4i EEE˖-NOOHV %%%WjsM&qn '+o |w"B`{ cܬjLfՄ)zy>+++&&ygYV FxZv{<%5bFcWWWzzbtYYY 7lnnˉd.o a>ӊҩS, {EESN E;|Wrss1'%ygΜiӦOmٲpdggK*jٲe%Qil6ڵXoݺu4MgeeQum۶ ? T'Qn˗/ &$iZph4bt:20̀cc!¬Y!mkǓRz{{U*̙3j:ujvvZ&V"cZ'M4wܡ!SbŢg͚500 f;{,h JKKfS"gggO b&ɴ(++՞/t:Os fT^9s洷GGGǓ>III(ܹs9g+ ~8 .vRy oDGG7662 t:KKK̙SYY 111RI! cC" ø\.Ҙ,Deow+NX,(&'';ThiiVֆ1s:SLQ*vZ&)vhjdd^6m4-l6~ ☹s'QUI Õɲ՟>;O)EbAK 9wٯ 8, 2|EAMٵw`n4}V.?z`GY)TƵV, 2|EA(a\Q39a|&W&,}$ę]FI|QT}}%GL\c2Bӥܳg)6k.avGQ($ -UaHoe+ <`Y/$)IYڲe W_}Ih,2 sQJEkeLq_/ZM^PeٔJǷo߾e˖Zw7|f߿_R677+477o۶mƍ{* 1)ۻwC1 y{L"oh42*Pb6o޼qFBX~WO'O\fMkk㩯g t]VVo۶d26Pxx~G;::?NQULMM!44t+Vؾ}ꫯN2Dܹc\\\sgyp|Dzr@tKK D믿Rd(x@V%?uht\%%%V:zL7|s^^E<qo 044xbccz(999w(&I/8>~?A]ivӦM  4pItUª&7ң ߹s̙3Jӧ׮]zzb1ҷ.sjjj~~>B0uHQq!**j޼yK.%nX&+ %''l,Q/~1 `  #M裏"##Fckk_Oyqbb}㎆SN]"%jZϙ3СC5553g4 A׏bx @IPeXZ[[{{{-K||I Ewwj%k",y?8$$lYEj0=())9wSO=%q#I4)kLHR?DOy~ԅdSrtΝRY8r=iiiXrk4oNg&Z˙ oTK0 L9T)yԹ$BSHrL?le~톆;377,"F=quww;N2Z---D:;;;;;=ja%x}:44d4ijj"s|]]IQ\\l0Ο?_WW'媯'\766z<†cY6??d2?8;{Dld#_)ӟt3FGG+ 6i$V;w\bOIYYYJh4666tq09p .\ZJxz>oJ,>.rs"k#+ڋEIћXTizGNHH6(P4rh%^>n7u߸tOY>GEE8޾zo b,ҏv.jc0U>aqg(kdd=,E(>f 0zl1`ćMV|\6.iPl" A`feerf=UFW杺r~V 5{x{'@QTFFP(ߤ(yD@Xmj͙7sBJ!h@4`nL+(wf@1(䲉8h *,If)S,0J/‚jȏn(y$xDe8NÌrZ*T hLcǎUTT1$.]jUttז^wVdTTL+4_L ~C"ŝHbV}< X9ɹ#nd)pѐ!Rc,1Ov< /VJ9 F D6I2 bEp<3gXEbM& IS^gG!cѓCRQ}) j"BOOϦM1x Lx< bڴiuuud2)Vccc983&& $ORȞj2HRMӴ2L@fEĮ~p 73^BsrrDQp\ك}}}SNQT$(}}}Euuutٳg766VUUeffG vΚ5ekii),,tͥr)Զ| c&$$HF#q .\$ghh(q bƌPWWGח[__nXBBB9X,sέg+x;YzjU(SJ%G!d2Yuf-,,DDEEICjﭻY@*LJ>#@Z.POOq!!!ǙPNӣjjuOOf3vl6O4)44… YYY#It@$sN0d322(t(t:9BKA0.}ֿD2HGG5R)B҉tGRIWJ#}l|2|gb>Ȣ Yd g]Y>Y>Y!2|EA(a"Q/,'o{ q9޸m,z<)z;F+IX%?Poo: p}K;=p '^u&UjRII] B$ TT&C+U=u$yR.釜f  ˲w&QlܸDJ i޷oy6Ι3w8gΜ1͹.cԉ]`AddÇ1IIIVn:uR;-ˡCX뮻<G}]wvϲ5kFcGGB(**h̙Ǐonn^xqtt4Idɒ;$9|hhˇ˲ڵk ˲eeeAAAQQQHBػwooo… fnb*'8-33nkk[lY~~>e6KJJOcm߾r=3zMMM{#Gf̘nݺ?<`hmmhѢӧO۷oŊ{oEEŮ]zŋ744FGG>|j<̞={iȑ#|믿`Rv'$Q0[n}-[v!Z]UUU]]O~裏v޽gZ}ȑu}GD҉?O>䓫)@K{$+ N䴷yFcXZZZJ%! Wh<)LQTOOOxx8qE*AV/hHbHd! FC\>b9.{>bRbZW#`.ba:4V('v^YYIb/ ǩSH7_ٵkƍ'HN%=s̵, $JgEQLNN^lYeeҥK333I6^2˲,٦i3NzOcHD0VCG]tiJJʟ'L:|BO?4!AOۄt+PDQԖ-[hEeYeLeYBV5(766_~Ϟ=`6uttݻ駟BBB͛700f6fs__ߏ~Jѱzj èT*FrJRan{ FƫpVӟ+'`]+@c:tLd(hric9Rn+Pss3BHVIl/9 ëv5䨴A ?wԍ.D&d W+ٳg?[Vd!;1z>))bL---!UA7LfiRSS5MEEBhʔ)BZxn755|}}}`0$$$x< .TTTdee544\Y8y~<|vvZdYcy\G"cvtt`Bz}MMMyyp\v<((b?>22R_p!55UpEEzbg\p`0TTTt:A0LIHH zl+|s\[h% "%Y%E/] lA>Ȣ 赋Q\rڅ\rTie\;F>Ȣ Yd Ư/0e'&$1>@.3XX=vyV~H(=ώ;H= eW~KEQ(O޳g ôڵiRT* Js>cRu=2.crrr<|^/˲4 vۛor>l߾0vRWWg׮]gϞk}TWm+!͘1CPx^i޴i:ujbbbgg{wwp2 $kxm&%%+JZ/+ hp8Xmii!^>HJBs==k&%~@ٳgO{{;!bbܹsǭ\RV744dffnݺUPdggϜ9!!!K,9y-{Xbǎ:nҤIgϖ {|ˎiR J -F(/( %L'a[3@cJ~RQ~gRRRdUQ@;B^¢'w!##C|#&NR2c9uTB:lBpd%ƒ!g9*KrX+))))EEE !v.\xYϢ-R^1==!tiNVM&SSSIFx@QTCCCTT!PUQQA%$$rV -he7D@QEQuuuiiipW ƴtREf"5322I ˆ~jXG 6Laaanh]pAVZMtFF, B\rh4ZVRI$3BaVzJ[2229y$ nooSa===aaa$)91STsP(3gx>n0&&& bʼdZ~r4a#[G#~\SC 4JJ"DMXh&5%D;9t@ A@ A@ AӘ(!A0,x;eYDuH?w@T  -%.*>p\2V@ L]MGw͛bq4i0CL&>&B 3Gb#~8 6<2șEuy3ߓq+V `pttTѐnAs"NѣG}>LWW ۶mkll$90O30yԝ6u9#@ *9ĀV-6+WL_~YV`6Buuuo^SFs (׻vj}ꩧΟ?_PP6vn?׺PdIJ7G1+˲bIIIR%Iںukoo/\`$''mٲ%!V;==m4322{_L22ҧ1y[4e rRfr#HTjq!fUV9NNM&SRR'|ۇK DA홙---,ˮ_pD,_p+|+[\O! -j)f tww@½<6Z,QwfI)&Y?!8smc?1qذ,H"[t:C A Uƀj [OO Pb@@ A@ A@ A@ OYqXpqH $b,P MeWꡡ!RĉD$UVV&%%af#GE ):[㸘HC!\em6ۅ RRRFFF&&&HcQu:]jjdQQQSSӲ;:h:󟏥WkqgϞȮ/$vaZJ.4"z(FcXFc @Ѹb  gG<\|0^d|{ᇟow_1_dubDgg2;;ܐק_QQaÆg```ӦMo<ܹRR<<痢+J1 bxwG20mǥM$3s;ac ㌌aꫯЮ]Nv,Z322E!UӅӃrJ@!AݐlOaRE|m~Ue֭[o* |<|={R`0n޼MH5LA$gz H$l\ 81D @`׮]s:z-e$*b<KGVu᧟~Gcq`lvd,[rdsċܹ/nѨJeGŋj^B>hkkk{{疱H&H I! 8R 냲nt{ weY\ti|||llLɳ,z@DS%@ `d@ ;8H׆:%%E8pcL.b!˲ <޻w*"АnohhZd8݅F' 4:`:A܁XO$-d2 r;wl۶M?~|1/&% ZzΝJȥؘ""1R]fA4 ASwXR8F#Ihs\=͓%*81?sdPƌJi vѐA` aGZ\p-go0:iNzYMMMZ^};x߽{_|joݺx KAaBr\\gs@cO q܅(&''Gcݚ [U4^?q2CA4QJčxޤFt(s$-E ݼySm( BP( B,OT[o;vСCjgΜ),,D]z|ttT-K6nQ Ǝ=*8_xeٚR$++<С_]u֩eOEEENNT~^ljbX<SΞ=1mmmUUU#NS-{Ξ={ɨk׮(cr{r?CP5bZ2rl6bҜQL/bEE;S^^cf͚>/;;[y{ If7n}T\p80?ƍ2棏>ھ}pYET+lذ>~ml^{mǎ 477>}ZEK1QX޽p8T4BP( BP(XB!?yIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot7.png0000644000175000017500000004632314620351225027526 0ustar00hanshansPNG  IHDR6w,>#sBITO IDATxw|V?{7 IY E.ں[vVkZZPPAEAEII^O$ϾI#BW^y|#XXG3!~e!3-2wAs8`j )h@xA+s#oсp Er Ŕa-jW`Ko[(:gžE3>+ Kf.AdT?: jH /2z1FD4Ƣ?iл@,|s۪}/eOw35 c}^ g2lE7ZT > @x@(\D?RۣK,4+bs1n @߁@e|Kzo XfkK7d*6 ʷ0{@z!wARW@G]8Kq e=οDfvb_rMtt f\GhvPk"4e_7H-S y(ܩ3|EQL}!@xMpxLYe`]n%88~x>5?߁+y"5([t ༻脦 5nnÊ!;ARyz5Tg[nغʪ y3Q_F0Fdv+~/o,B9o0K3?@Sog(џW}~( j6E q4U"> `™(\!OK{J?c4E?@@ 5crS#xmԜpZ>4~b ƙOi߅ Io@H {16G pFƩnG<[ljЁb]|;@z ^u! !9' d N<ʾaV]{~*Q8M8~DŌ*&^b?%Sq+ٰ>}6`9w8(@l4,P5??y0 4K@wh w{2Ȁ%=9]iyO@cH)P1~xmGC;^dEO②H(ō_:@$\G0Md%O".ǻ7@h}}S AЁُ@}1iM?pvRĹ_63i>xjJow?*6e5` b)>/] VPsb!8\wk%7b'zWJ Ҳ ~Y0Ӂ F>@Jl|̏aχ $~ U"# \nq)P~ѯ1,;?? -9?@0nDg=:@CGv)@f| /Gjaj_TO wóJt|P:cKIJy+}]9.A,tԢ6 m;Q]9#g!)oAw;_s_!/Kc2.gbl|H_&F'.l` T®5,B>l &Sˑs*q:F>(fmߠx!ې\G2" &tԃTBr MƇd"@I4ȹ~žU&!X+{ %w4zOäzOXsP B9 vМ?nLʥMa~y6?:{#1fg,Wv?E[|y$0 F) #塌 ;p q3 @əسJF讵l' Aٮ94W5t=3 B(xCHB0&{\ODER 0 Ini @^!IPʞ~ QuGCꓝ(MJA_a` I:D Dk3zѸ{b !>R L%CJM!IaQ!0 !$k8I@̇d@h*"$$B-ۢOZב CT:+=W=@l" !n ߘU `bjv&l^ȿ;;{K#,G B jh?3EzoGM[[5*|n^Ȗ$pUHN]T0*۝o׶lRRpʏA(,d tT!C]M $c$h; /ҲcG+ď@{'(0,rXR#.̴ۇM=` oƫkF޶H_1>(:" 0)7Pk_)p$)E )* OE v^) ͙6" kL\1*I~P B)aPHdPJc fBchA,+++,,< KR$)sTBy?{krɲ`P$xJJJTU=YȲ?rz)ι$I/yge!?`!PO?moo?f"A7_sν^_[7!D,ncVhD:qG!FιMIIzBŋvO-sMHgy<4sff'''e n?]wiMWWWjj*I!<''gСǦ1I R`\P SBx`f4+64xwjlO8Un} l` !WM^99OJJ:Ap8 $ ![nE41LLL: HII)..NMM=prӯjw0e+ PJSQ1'8JШcSYK'>1 =>]CQ`I"%(,XRbI"%(,XR28BDG>C><& !>(5oFRqh0hHAԸ>R[D9\>V_'zB@C=u0;( $ :NYa A\NBS0apN ),K99Npu-1-+%&9EUww jVS_Y06;wPX#CA&gysYY XapQ2V_|_}{!qssA[SXwJ)N=-() q3a(lF$3>s$sՇʺ[33[ٖ7/0Q8 WJY< % /Ttg;vg3{'#-lm liGm]Gu)cp 6M6%#>ܳ{L/njkkyFGt1Tl []@`{^pj,lJ)cc p7T޳+5)~զIZa\ ;;'&&9$iz;?{➧S#MAl-O̜ԄM| IDATC'<jUTJLj HH6wdkNU>q6v'7Iߌ:*Bn0& DOHH /ҜL9wt-D_wionKOKv؇eɶ_T7a6+Cب(@'ŔDA4Cdx};l©&;:-ndmFHd{nkD(ءJnlG *5cl;dB^޽{]hSv ;xooMcKGSK1N@?~ΚrAA=V<3NsņaL_9oooOJJ9sy⋕+Wfff\r%7UYx`B\TTtc mlhMLrЄ~xd;5/edihj#HKOZZ J߿po=33L!bŊ>n뺾|O?f1z뭵kxG^~億Ͷqƕ+WB1-^nD"/_qFYVVVVVwΝ,ZNv(f~ӟL7xJjFWg{7g?9y~ےuqj+P^v) 5wRq#K-8,Ҏ?\Q>ࢋ.?yzw}. o駟.IҎ; 2ydBȖ-[N1cyiӦܶmy/ooo߽{ O^^^z_|[ne͚5nF?sJibb,~@kn[ڭ[F+.EOK_3 rthfwCx$#=vx::HloDOgsRhkk ÇLMM]t띝ٳg/Y555uĉ/c .̔$}۶mVVVjv)ػw*,,MOOçrJaae.͛7_|ńe˖M2e,gB+--thX1 57vW:;\e74˧Y.ӡ +z-Ӧ.)))p??&(޲mGiC0C !v1tkVQwq?ϲ7O=T^^^`/2ͦ(0CΘ1fB!]Gdɒ4Xbb/~'xrOB9m43_ҀTUؤ) Π\t"BU΄|ߛRvWFFi`K#9mx鐳G o={6o|嗧<6lB曕^xaǎ ,HIIyN;4gݱc+**ݽv={\r%K]믷lӦMKKK[nPs߾ʿvfeSC~0Jo lѭוV8dhI6oyr,-EztUpu;kwoxD1|?M4{lfEιfzj)4McEix?i,;?8Ɏ٘,++hNX1\o4'"~#?Z˜7=}ۯfj8)n]vCUU]׻Gܬa&{ڋ"tBew\U˪w6O?&[&JX |>crCeujr|wݯ?,:eMfNsrP$+'c- 5qr-N)ۂ0ʹpğ{V.esϽhʩs+jpge쩮 5oz`w3 s}׎Ͼq9El.tסp>m+P% !EC̊hkͱ]0p9.foMffNuuuQX[ AVW9㒮w,tJ5pHv$&gvu41%wl dkjƹ;܏>p gwۉ;%%%!..^V|IJ~$ۙ$KL$ӧiaۭ:74CE vu{ a99Y2UBBa%ťVpsQ8=C;-|tpsQG2} 6QcI"%(,XRbI"%(,XRbI"@@eBv58XHxڤrSrn[bL ,\_Y1Z)FR dp0BuVo}* ~ȟ%!\C . F=7Gn+ApJ}4i 4 lL/^#>?icY4 (w!Z$i_'!#%?ZdĒBDQ@wwUnwVWjtr UM01j|ќs&m-(HNy5SNk '>K@͍hܴԜ,MjkJ͞;ܴ] q-uv =rܖN|b o[\'ajUycedDp|},]ӸδH$V!nʜ 415|u3K 7{mo`ނcN)2fٓS=eki4{%g&9rkkՓ?\6Բ>\ uw73UݾHsYVY k"jg{73Zw֥g'7nni'h#hV^^e1͞;:n@ bsSlN[ݞ&Ԭ\xo|SLp >l$Yhajnnnii^ /֭['Olz!ظqx vW_vԩB3gx]]]?9snZ\\8㌖3ϔ\{'$s3ƀU*H|c v7SBr3J&%/*7 1tNLho'*L?XREQ"M6]|7|+UV͟??iӦ;g| vۊ+M6wٳg`e˖}/--SJ?^x[o]hΝ;g͚~zI^o0qUV]s5---K. ÷~?66uT5cƌ4Tŋ !^ڵkVv~FFmLu3BNv5Ȳ&B e0P B{F!oiع5wXm|9EEE{~==:>>@a_{k&))饗^ڰaäI̜;VӴ˗vm> K/5Mr{1UUo]v9NM.䒻+''4)y䑟'}'P(k׮!CH69F QJA#J e 0 9 jf*vC p~8E,I~a:=q9 mSJ~Rm.2{t3,˪;1o߾(''g@CR6Nf$LfPB13 sC ssaV뛽i.7<<Ў|>_BB^hO:(j ._H`6dY1I@2(! `H`pP(*٘JXe2u4%B s! ӈBf)Dp N@)2иA(\HX#\!.[ PvDKǍ\D ;0CQ뚑/ 2c,H!U⎄F6-(LLXrd *UI}]a]q6$tu'$%ӑT4v q9/llF|O ='I9 &2l#B@bvZC##n'!2(Ev8Y nt4u]qv=GMZ2bS&첏]bHN0R!VokiI )jGQoX Jsldl4"vœ &&4&qkke:;1n)-ѣɋkq5|Rʘd>CS$:dJ I@a '>l9G},Xg-XRbI"%(,XRbI"%(, 0/ HB.nK r$,+ p)xUVRhQa`01<`ZpVZb;w&[ a`R  =k4A ya-BPX')q1 ٬`P24bBC2JbV +eab`Ynxc䎢V^/3'7Ӂ<߱ \S6S)ݠ~k|}:{.9)v(.$r&׏ 81N($G_"a}y8T~w /<%%i9}sZÌyfs,Ę` ||i>4]]w[r*lIh`>C!DӴڽ{VWWkVQQaSJ,50TU=fʺK㎼I&;gv}ŊuuuNs'{ysssZZnзØ0IRBG{)"/M9mf$yk['bB '$I/>sffիWϝ;ox<GU;3 ͟?޼yMMM]]]7t鬯 x޽{655 8l`V޺uM u=aގ5k֮}wmIii!;~RU]5s̞}0~Z/Zhƌn^̙3#Ȱar\d,ˉB i6"1F%jQ ;mSgwyFzy睓K(ݼ鳌 M7z ι(j ?^oB!aE .˓eْBҎ–b?O),U$_lf߯[ormmɓF%$vGrrRBpPkBHK[M߾|#yCƦ4gN\s!R!@=pR`Ob(jv!FƎ<]f4Q=!{N|#|~̘1%р?H7xOgi!@0¡%g) UTTB|>ߦ̝nw8t=B O$0C9$ .ظqc^^^jjjiivyMI sIDATB@a_X#SAoQzFŘ+G="7'2џG׏<-lqBqjqK'AgŒEK Q,)XD`ŒEK Q,)XD`ea ! k`bALG:nOTKBXI ([v&=QΥGsX (gwҍZP Rv=w&dp0 PgZDtU0{'tA€Ę#dQ)S%;VY d4I{;x<3LH@(I) jW66]U( TZi@*EBHHE*FHPqy@4(2+=e$$iL=s}eo@;Ta< |WFiIaQ_?/eUzn0e_(gDwLg#:VǺ(=cb6:aOlez \Ϩ6bJ+$CJ&ۈXi<&%J3Jo#@y/_nzi򾨟 Mc``D0JZП 2Kx0yL@ Hϟy;vfŋA)@2ܺavCJqI_zO ""R PHlG9\J.9+Ge %%**^ء`|>1…t"8B)%Ѱ8Ҵћ0 )ܐ\.(IDz%ȅ~F(prrPPm3F >>Jl>}*@@tRXi!J!i>TʖATKʨD̈́R1]P iᯘeY mGRA? @JN(e.zҴ{I$ҙR1=FfD3ƞ^b_%C %i؟镛FpB1w(D+ kOPIy@FPatSC*NOC !dσnr'n!%cO?4{q%N/\H!P%MKRȒٹ~ߊvĭqkVQN8WG!!:r~B_?.8}4cǏ4(!ڵk捣SJsF@nܸǧ{0M~oX LK9Ssp\ #P^LP<]p[Iq#mE"Zsη~t݁@L) |>w9 5Z;x cF/]ikF傈R7ӦM+***-- VPJH$PR@F4JeqJ\$ |+@eqAń9ARzĉ#buuu^^СC-ڻwڵk]Ʋ+W4445Ms7<{;EuJkŋ[ZZ(/҅ ֬Yssmܸ>ZjUKK ,_Ν;/B8`˗KJJrss5HDN p@\#(i;PJ(B!TB1Dz-FvɤTyyʕ+ƍ˗/#bOOڵkWX14 vݺuF+)۷_|Ųx<~ĉڶ۶}޽ XԩS+W=}71Ad2iLцBqo&q) ܱ씑,QIQƂ'LYi!_͉UJE"ޅ nذ/n/پ}3g;uJ)JmۃIJuֹ֥hPR^^~ἼʃwHgb~Jŋ3@3Zrn rs})MÙ~Rpner0c}isqLF293/H֌!(ib1ڻAXCC|[dY83a88eYBYfuuuQJe*++o{EъsuwwCCds>psBm粹ep,軇=ws |9>% #{T@G41˜p6RqD?YϝR)s)?ﯮ>/LBT*ֶd@ӭaP4MMܺ=#\ Z[[ΝK Æa~Ji<ɡΛ7BJ&{%%% ̘4__T*Ez OyL"; n'&!Q 5+52\ܧD)ĥV]rDF];߼y8 ƍ ޾ulb’ŒC:#4K!P>#A׉eY‚TrDضۏI`uvvNd֭[?æM6eK|555x͛7?x [J.]:T~fdcUV9r$///\̙F5M۴iӆ qlٲeKEEaCboQWW-I#G{}%ӍCKmvlٿ~:ŋjfdVصkW{{իWgΜw^peٳgo۶mhaccc$Y`AV$)F1S}}-[>͛7gf驪uHo޼y3P(455ս555iN<9cƌGˋ=y=?onnnnn>p<-ZZZ:4̙3d2+zܙ;# BofŊnz뭷N:UPP,|WRҥK%?;;;jǎˀWXdɞ={>gK;G۷/J\1CDnnn΢$tN3UTIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot9.png0000644000175000017500000011121614620351225027522 0ustar00hanshansPNG  IHDR6sBITO IDATxw}{rU8=ӓ#AN$$Rťey%N-]}Gڧ۳|'}+'ٲ%ˢdJI < 09tN޻?j"AhI^E&MTR8>fBȲ{[cǎ[u:/^822/u`˖-7xsgzz~cӝwY*;gΜ64ZZZ#Gj}C>lԧ)/~xxnappNW|g?F޽{-O}*U*[XX[x 0އz(N={FX~ZZZ=MRd24V"0c^otgg͛|.^;;w\WW`0 ɟ lذ _0<_,:.˲iӦ#Gs=zK/tm>|xppP$L(~u׮lX}z~^BuzM|ȑ6UUZ>8 9,//<faSEQ$8|Їb)ښfoBH8T*eiJ%X+FI$[BϜi?1òmYo#GWr RZ֦&]pԩBV(X~Z*ápZ]\\ .!Z/9mێ3-\T1Ѿ~bT8 ıս/{bPJ(BBc  L ZS@@ c@cˢIA,Q)FMy슚3ֶ>,jEM5}] طޥ @?vO>\#1kJzezH{qA4s徿y՟]WgP7{%k7wpu\q* `^q _\.P6ѷ&@XU^!}yN_ h5#UAU?uAHm׾x /ew_]07&, @hޏw7Qp(l gI曻Arr՟P(8OC莇ɮ_+#zxLjxeaak]~M2!;  h Py|؋B݁ P_M!  ~꧛>@ T=[kF0h/7Ko7z;(uh$Z| 1̛vj @5pkWq!pUρ_N +8靀e8s~. RE ^%}l4K(w޽(w \e܏??AV&~*7@|Q`9my팽 6Z#hY`EOYoq`I)xQpW\@da.0kP)/Î@_"~x&/1^so]ۘﬠWh4ԂsgoIMI 4P{{-f ac'F`x  `bh,{ `b0s >򿁣)@)858oYml 4 fI`BOӮO~QSrDw:>OdCtC_F'2Ď [Ђ( u#GWqoOuA K0 Fɥ65VohG5P }lyU pdxl-6 1\LjN .zR>5evĂ[g*~}hι\b&ܷީI7vJV9z+0F }6Y+cH&Bٵ!M3Tk@S\V'_ àj6M5, :E9̐KE1LE( Bax<lB`0!jUQaRUUalAzeY4"8PSJ1^BOuB U@9sݻw p$1?<7> {ZӉ`$lWŲ&n$XZD0Inh /ny;s'%=FDm4H+>bݕkm9R2R'F}fYX,.---..M0ַh47 (Bȷ͛7?EBӧ !drr2LRu=z k7޵S\0DBņ QJ!JbM=2jhjlJ|.4] b0+.%,8w &K4H*h.);k/1)bYV333{D"jczRrZU*dYmmmyVUUϧiJ4MRBC|>?>>tZ677e ~ll̲+'xu1,Fӓ++7 HᶶDiI_\BNBy82p&m%q( KIj&$ KZGB93 cT{'wwwݻ7{S9r]7JYOvmlܸ1%m8˲޾wx<~ 7eu[ZZD[[[^ooopK/411111MqXd/^Ske)6zHJ< &NP,T}J*`[cٙ RzgMh)ŀYz)OV$ \3oǏRtT*u?b@ EQlhtÆ hX.(F"o/jVVѕ, Ȳ4ɓH䮻ڵkxkkڼM.RePXB^8^9"V-i}_ ȾʼnIpA! sCGb(`r{(ϡЇu\ Z 0Eb/':!@s'.|"3`BC\apqgOӞ°VJ*}|(!fsss>!T꥗^3,˞;NruEwJ \X)f8_. yЋx@2iU]g0CY:Qv꧰s&.ԩ\"I0G\ʲ1Ce9q]Iwg(,˲,UDEQik˲u۶-b*t߾}KKKPV P(T(eYT*!<\>P_%SIS@,zcgo$ʲނgNz=AMCc]SEFNSz\<+r`Cb={2x_[_e5YSb*Jړhoٓ+&;V0oitt4cyW7ZL(!>P'k<xCluw?׮Ex~EN}}1N%{wٺP4rMr)y8W sX0n,7r"pD[׍KR\XG.SZrDee o*,ev%[G5cb*rfm5ld P5"[-E>y^zZY*ͻwt5ⲽ ] &|}l[$@"ǂʤ|Z.%8N|0g6EoDU^ͅ}ÀH3 1LE'T VuYuơc3loz#Hl@,Ęi[mJHIUٛe7ȧUlmBtt>]{hF*^7A c{}=CP.raLSl0o2֣Op_WtmwȢi2=} ɰoB,/NlڻJ\5*w-ºY$Y%/Tm!txPJL8I9Tڣ̦.QH8 }>% [N^8q`BwebRwem2?z87."|kė](=>>^X0 q[#e Bc+``^hFc*ʕA| 됯WR(LbFmM(K!G).XyW~}Ǐ~"ˋ_+,C  1( B(j#&=2}]C=ccc@@Uh4/o۶0͛7[533s?~<ڵRTgyfӦMCCClԩS^@$eyrr2ڵW_ۮ0LOOϕFp)B1>c<p\Yd2̙QI?|/_'?\`ѕ \Vb`;::rm%QIq1 h-,, OOOo޼9رciiIU;7nΟ?7;v[n)J###m߿ԩSL&].oqܓO>y=HtСj֦z3O?~|ݧªbt&c|X%&p2S%0)?6$7WmJ,4Yp疊֗3 bñ3SjVIb!$ !/ݻwtt4 J9R!fggٳgy=r!KYYY^YYQUճ,+˲gna/n߾dMϚsNl&0툈@r"s5P/Cgſ{8,bTQ\t㶀XDa )$K%9roiiiT* yfuUUG>"8Zm֭b E1JybnOOaDs5ѥ%߿}vq$ MO>{۷_闱*F sPHxJ8"f'"#JT{T8]m =3‡eHB$b,$Y8UVȵDFH)m;{8H@*jC#R1Hx6nJi0 Bp8X襳 6lظqr2D6mf1PA{JR-'WTj~F8l)oZ72L(/2V_\(UJ~-* lD+k-վζ=lqpG vm{۶mm76eC)|g[[@8JCP@ԖLQ璢ktQW+ -mL~E+eBM,TeCK.઺c9ժj,t(o#z x\"j(6SVU38̉lkPp@̩<<1/)L{JRk X+W&,-6A]xI}M N<ψQLDK B0 eXa󆵡#+ka#CL?z̑6F՜j5$Y)Eu-~cJ^6"(PdRЪa^\^j. )(U #n؊qNLeX % 㪆9_5 "TV;ureN2X40ƖJcC15eׁCr.7rU^ʪQ͂5L4lU5* +IboAM 3)n;Jqݕz8drԊer걀/N0uq$Y{1^v"/kw]={(=j 0 1B=V۶=㒷 2_gjUx |Ri>IȬ I`J2Xj٬#$a1vPͩQ|rY0+Y qܑ#GEimmmh`R1MѰ8-,,h4|>eYޙ/o]!Ŷ[&buݥ| J-++jeZB 8l0Ñ?AB>KRTq, M|-c>ͳ/(6%D)Ue``[E[ 0r\*e[;v~E{~Lpt394f '$:(p^xe*"pu+=6=|Xm:;;?OyDcn."wMYyYWYek)!ĶN}MAZMW#gGW긔aWj!zIF#J%!b`iu'Pǡ#A(E?]BlS[x6WN3Dv>9Dҹ>ŧ_@ !F)rq ;Sԋ/-)ð6%k;50BI?w, _lϠsaGM9ʹ+wtv}^>6V {WNўm1 *}Ρ`WPk,ؐ'JE!95?']@F$4+|\}qPzq a ױd&J=mE/3./g[b]KMLLld҅|jڠ \jgFsڡ Gs練e!?`2\\O'6G6L窎jY[Rn61k6-T #z1B?x5eJW3DDn#\'{5PK*ytR}zp ᜳs3&ym[ӷv$LDeՠ P\RGJClVTuį'wmUfBq,|pfl}8132_gW`uq~+pW-X.qu5˲6oeu]Wz)]EQܳg_!d&!$>880i>h0L$wKy!Y<Z#gHEaFf&ϥ.`@^SzN;q٩_y!b>u/=?0#;B9hUB u0X!KV*VXAfk׮ӧO+[nMRm۶e'N޽uݹ9O=zM7y$LfttddDQjiŽ6mm;m۶m~~~iiVy ͮЍ=-87k]Sӎ _:Z~ a2 @fZ,%-S1Wx3 󼪪H^{x8Ϋ?L)I&{U'hmm |>(+++JRB|-T*rUnkkb$=sy^Q3g,//{F'躾zLB:\ټIbJ(n*eN-eYd|l[sxRL5풥@\b0 PhDɫؚ19_rɚ44 BHK m6==ND___"h*i O>}#<NODc!MyƘϐ[6=vJUv&{̓J{kX+ӅZ/F]1fQd.e\!{P(H$#醡KOfY$Ih8Q={뺭,۴\ 8H-3".tc _06ULH7M~apܱP/ǟ?>}mPqZT0P!]ڶkfru&S S"J<2XrmZI<74ߔu #T@ӡO.۪O޲.}&>x?V܌р1Exu*RvmH=8/P B#8DY Q8EU \5C~},JOݪr ҭ}97W',;{D+6oضy}6[t,O=žLgYjzEf)0C0a?wVVV΋16D-d>w],O/,bvwɅ[+Dnu0xŨ- }/:>vZѤ@C]kq F"tp_!ОںV4RP(@H{(F"aeY,B!d2|KKK"<@"*=PuvE4`g/?o߁XԪKMO=~&sYݒ0 86JXL۶Ͱ=l .Xe1ȱCүT51wtgLƫ(˲,˦ir479,RӓM,˪Q(z=l۶myyZ^VX@^[&"ĹQ;;|~0WY0]cGN|?HwlN:"Fg*<6|bjcoR9,T;| @(rdTZXٖoߚiPgA|Pa`0ؔkZh4Z B2 BiiLՎ(˩T2 .5:/ћ:J!޷bՍZoxܩm;}eVd\R%ðah[,08>Y[{W^PO70ׯ\LJ/@)M& -?-(^3$+ë~ۿ Š//R۱-BePfA ш Z26Yl!ԩo~-3o+d1K'bM1zxw} 5=Os&ou]K_=I|(ǎkf y`x/,,\ϋY߬¬C%MRXRm$ ((:.kZ{{Pfo 60ͨLV$/NWw MB$H"vwI>yOp-V?̫g66s<ͿQ\Kc9qMSW\v^}F7I o9l1; rjY>SG'RZgYݛݛ>H(Mugsu-᳣rZUŒZ5Us(XeeeYkuVMOۖ*,G"!yΝ4yUA=;gY,ˋ7*z^'aA.^A=m0|Y@)ҼbB%:EgjX1nziyaH 7ecێnZC]ڮ QU4lv-J辻ܷZ][\,H'OFǏ{.^80NbYV9񫯾jY###a;v̋-_ZZ*~sT*N* N8nvv XOT*`lٲn@jbIxzǿ?_ʟ~˨ji&[*մ}ܴ`p*N|[O;vm0=e[2%av)"ڶCe;mMr< n8@,q?|Q7!iρdqqqyy9xCBH{{/o9 wuWWW,=== /a>orrnh |xξuW35EY^ѯ795=;^ ˬßn{6-Q+gj+kڦnFnJu۱ %Ķ7mZUj "~Q0D"~a]קo^ew|86Mh4+x9b1q( bYBp,bMiq]\.H@vyW) ]8;^wr+7u~QmZ42ya(߿8^}o7)>h߰y4^۸sJi0 $Mwк/PX@(P]bif.7:13[$YS>Z|3D|qqbk6 LݡԶSS@@i8Yޱ-rlv粢|kc[tv.[yY:u%On*=\V3DyԽOqhAK=z諯s-{Y^p?:<1rcxҖnD }~|s?"iI8&J!l۹5y?аJD(FѤq;afCEi'?#tr.W=H%0f2V۩WKQLoemĵ˲M-Ǵc^>5 C  u,~ڋG~x[ȋһYR];wc|..K"MaZ1"Աmmp?8!Jm%+ F~}=ZfϞpӞ-rMMTV9B6W)U$E.Uo{c5>Y޴__>d9EpvY*.+!wxB˲^ 0z6E4c\g~ξh(gg1 RcjF07+c3sk5or]JE>}^f)E|MswO}y><>-ib^qB:8N^D"inK%I B'Nhmmy~zzzÆ KKK zgj3 EVņzsmr6qc,fbeR [$ 5UGK&PvhUǭLؔm#4q;]XJZ ^vxC (hg!dҶy/xʞ)7n؜g]CBd2d/|UY'=|G\uנLӴZ E1"<>CE!"Q9`h2n$%!d,^6L T[NNN*aT2nлMxr%kVKR|~ee4{7YefXL&LNN^[RISO}󟿙?gʕfOcù.ű$-!D653o֩漑xdo zۤd^`ee&=5 fiq IDATTkݢq.Ϝ9S(nl? [Bc W&8- fˇ>SDJe_{H_^Rt5muvQ Q%$!$D.AH$H!$%Dc&[%7p˂F=I PD)"& #sd" …tWgLkXÛzxV/i[jF;1 QF($č킵~jIJN"@JA)D@DFniOszj##?[2̐Acll|!錂2^ŘKpEq¸fBE[n붯ōdɹ !J&T2Fu]3]V}CV$ +_F$LVwװ_*s1JM5+iI@Sgz.mU -}c?UUEתO{)%du1==קZ.W/C?,/1}gbyfܿ$HT-?:?Wδlq{k*u>Fv keZto/\.qn1< Z;wn֭jSufJiTRly"<:ujdddyyy``@@"o.;V-//oڴݽ!uT*etB Ձ(߯9\93o~Q Ie0DϭRM6sb%yDT#tk(;S RɤSJǷmF)*mmm/^BJ%կ~윛S2͈877.sΥJRTժ911h4Ԑ PocccOrcccKV'pllڡ J)`[6p$afReK-o.O. `MO۳{zw.gmUDh"3 ݢ@IbE]V``()-sZe>f.qN8y3uw]Nִ%d$S Urm6ĠQZ3 !x)%|tt_'?t:[,MTaRo|۶mSϊ4ۗJOt޽]]]7o޽{7\04!4MQ]ٳǶL_[;;ѧz @._jx Or[)9Y~k Z\_//k}p/^]6-X\iZM8ԩ"UJ IfJ ntZ/zkb'Ndx7_,-T"l1iYn^ӻGz+Wg,JnmKg\ܷg@{iLVfŨQ`zݲ;b1JI=_[Z@*pcԝSb6}jQfcιQÆ:X(jd^BmNLL v7&X,*s-D)ɉgЫeruHl93ɴ8-z75!1օ.|C ?|Oƶo27 Փt VD: Q- gRHB֞M(CkZմZw5z_5E&' 7nZ.v{x=Q tmyH !%15&y"Bٜ4u QS۾>G4Ν]q ݱ H R@aJ:7毟o,2R8fѵy'F~mU-iW+tڭׄm(Htx賁}wPd.MM VT +DABuՖeB4R\@OP$vR-Զ'1ӕmI$bZwuX~\!9Iq{gNJ():ȃ>`@ƉB RJ*b]j 4 s hDh|?låJT,J߹BP/b1ݦSk_@ ){Xs8s |8RJDI6Rr%05RHџlK~х&)9jSg,JR'}YnDO[b$H{(]n8BR:B<3MSI [uu] u) B4ʃ(qJ" ӰJz[|l5FQH$m hkkj7 円.^}J~Xlaaa˖-JEMwqjv972H۴y+*+Ӷ\2Qmܻ}qaJ'Cci<akDYq- 竍%ptʫSFHB~iLFN41Xb13&_aryhhhyyyppT*U*d2#$I]UB0007i hm}m^Éj-wCb D)Y k-DSg ""P@"H"Lʌ!@$HJ$ J|TYѤQ7Qb1 *`6iPɓ~MMZBR]MӡV*f>8ѬwgRʓ'OڵFX#hR2p\'\CP#ЈԈ0P : @044"5: H#ycGQZGuUO剉 JŋϜ9=~8cL T˗WWWC|'4׎^p18!D4REё#GԷ"hlպ4Z=%{f4P(BPRH$H)!PM`Wg7$EXT`D  k' (#Gdك̔Zun_S1X t TY  a5I$YEЦfH"@xkV% [DRT*zj5˲ӧz!5>ax_~;;;Kԣ>|泟,!T+R={H)Tkӧd.{fggU*{ff&o߾] @;e˖t:=99ZoرWWWϞ=;22R׳fz~]qml0(XlK[#KC[#FlJlF-: Y23bkh15bSh3(X b: M][feY絷 |>ե"W\i:6mfm?~;N8q'Tچa۶m>|\Vkvwb޽J$MNNVU%Pѡi4 U$jbfNNNEziiI P`uC}k/|+ ABEB A\s+"R02<4kZ GP8jRŹD PGQrlYV{nt}q:::lۮVej5۶ R0 ;:::x^o殧lVT,w|5"P(ضDX,@gggZUك @r|رfYMӔ]ZR:uzq͌~tBnAt$HH %oM#g.L}ٿoX:CA9H"%Pr<0 y (5MgL szNY&^4ͧAjfP VU'ͮ[mA:)[ }?J{0(*ͪY70D"H@'j@JطmBwg~{ Q z๵( "k}J'\CJ_L.u{b|ۺ*Lo}xm׾W65opuFd3Tڠ @(Ey}E`sNh-j$ud"5h A"$HeO noQķ$Xs]uހF!_LR7'˵b>k+ZyaB/x Y_jBk]UY 焃F$$D|Cb? 1y^J 吥) Ju2ep.!oI;_4fFP ȗ#(ʸ:XY4f0b/a:aѾ=N0!QJAB$0G?#@BkDzG塮t(0am⍊(SbB(D$)k ?6ZOuB7^Q@% =d@   иGKCG5.}&< ;Q Z= !D'͛U]E)bqrrv&)]UGqUS˗/Z[%fg䤚 溏e $g_SD` H5E lC(C)(86FQH k[@" HAF}Ƈ0 @ӴǏ' 0 ÈeAŔ8;ط5TK|>MMM Y5;;dT}cBQ)UFYXXVRK?O>V*wq!%}Syd| ER UѣJQDQ RƘy*;aSQ-ڏMq7w$؛6*PmD\)Bϻ W9XL] 6;Nsk·㑼{P\T{F֬"-vu^lK|>HsKCY5$.3P_w L>O_Mnq9W=_Ղؐf:RR24]BM5ZsD̎l(R\(DB 5 P R 8( A9Lgmvq`O-ښ u@P2M } Q2nRf\JÐ $ :X1bTT)X@W7J_ no1s-bىLF燁2?۶4Ws"b}N)@e@TF%BF?(a 9JN4Trfa.!ҪLOߠ @8cۙyc<{^nv;;z\877w+s~D, DJ!K@&PS39o===r9JI)~uuRdޓ'Owtt b>WɠuVV5!D7<$?̙3wu׵rBkaĶtkpo֭T<+@ FGG{{bv<~ˠ < %(lP_}y"Rof5MwN;V*}yؗ3g ?AOOŋWVVj|9SVKJ}Mxgyf#򏇔RJR]dLJ!vgFPt%B_P ٞLjn\Ӑr "!J"@D TYY\,:w0Z+2ɄCU5bDqպK4jy]]]Lf`` |?}ĉ sss/^ܹsg\G^BsܹY`Zcz~; (Q % & 9t]"" r ٥e .HF% *u),U`ƌkӾqG0 o*#iZ, @.>|јPմJwo˗ȴえ׭[ $HG(8qx_58|c  24va\ .N"( J%JXʯ0]H$-^r߾}_(r]ײAR.G?XW^yE+'N$]v꫱Xl˾!T*tgrmR+:ո09_\>pygԅ3SHIvBg4T*rSWVNj=%Rnh1)`Ts" O!K(ڱcǎ;s~wK)l"l=]5۷oW?)]vq[fY6С ?j&k53W|4 $$ \05~SuRq;Q#꾈"/[(܆ QRu3&:ӀSdF?~=oFwu世ݺC!0sÆnԲwǎM!yx`Z{*E)S2T:H1 duu8u~RZaX# Z,0u( {2.Erҿ21A)LH.=t~H%&c0~0y-c EW[V\Ylдl^7Y^ӊ+5I(e'㱑AN( ݆[o8Z5i/w1ǭ1vƢH Jԟ'fԥvk[$* IJjvv4nuUZMaw7ˌd2955|^5Rvwwb1qbOO; ә Dv=²c: (rn%mK!ŇERPCD EBr.Ek<]z̈EJRJ]+lb*8N& P.14rd:::TJbY===mmmJ"뫫۷o_XXk]-9HV5u3Je4m{ g\3@ }74b1 QOR(1@Fʥr2'ȄD"ݯ pa4X˯bQJX,nٲ\.k633ٙH$Tc@!PEax=;;;88h4cj:vÇWVVLloorJ>#XY^a~OWW&i3L vgJ$Qܐܶcadtg{8RkxeNjŊiiLNMnFRd62kJHRB H$eeYBH&u=N[67˲J*WMB5M{G\f-ZZZZ]]d2m_|o}lT){+sq;繮1qmvuJ.kQ0%HB3P,Ug@fib}}Ƕ-McARYEu]S$_Sft#5vмMyƦ"x?yD\~??_M@[Zw?N1Nj5tRrڲa:|mG.Պm'54$@* ")j8\Іs{`QenoMm-cj{啣*Z5C*ZzW{9ע)B)=|Fw[jQ략I[zĉp %4BJ۶cfP(s!(frp0LӠ拫Aζc5{BaX4S}}r%.]cT5!H) ( HBHy# ;?~~|mlGG]:<d23l:ni4Wj שBX,R ׫ 0 0"."Σ^)WWjF '"F3##eC(D6nz[ {@IҦiڶL&-2 3B!lQrq4 .Bt2Z#K(`#x롩`kY?j-,Nלj )(% 4Z,tQ 1 Z%SήObajQ ĵβIc[=(O5.V] ]]]קK)T*+-HYJpY*%0 C[^Ωu]9%lu%f{;gd3Ja@ECtW_UiZvFӴ_Mk AuֆnZW|M?^XJh4GGG7~* #[gJ%uDsCqJJ .$啮\.lmn~G6F7 uvkBH0)%u˶ťӧ_x2h϶^r'xl۞ \.'ɑ3gd2ٹ U_bN|sllljjT*9tU X^^f[l9{*4 cûɡ&###]\FLN:;<)fZM)a9:"B.\ϫ7zuwjrsMMNg;zٳbq|wsި{kλ]wr+<==Zyޏ~#MlNӗ/_>z](WR,ϟ?ȑ\.u偁p,Ku޴i`bb[INOO͍yqvum%vi?$V,~Ǟm_I&x<^*̙Ө9%)8 0doohCwufSO=91{yyYӴ(=}|>Ie2g=/mT*K(Rǎ0?;+ CگʡemxI("ifŠp+Wâ1ǕhN(J}}}enYR,R==={}B>}Z]Xe};M\O=c=R,)af2~؋n}቏<>;3{9X\DO>Qs|Gatww}xS##َ-6EQe5twwzŽ{sݿr===RM6 !T35mДU+d2ŅW^[1S}>rR 8~=[{'NFQq`ťž6?}oxxpvnqw7fo͍ kql[~rLL \.bPt?H^<3MҥKX^^)WJ++avٲmC=l1!Ԅ=|rcx ] Sl,}+KK϶K={!Jd/t42LRF?_|e5K+D^wK}+ic?8"<_|SD熆5f嗾O oonf_|o~[p۟yj.^Hs ss nðVs -yAVeҫ/j>?sAONN~ _t;;wu tq+Ouݩ\FnÐu aVK/ŗ9tD"oߞS;zqǩF, 0b_}X,yBJ]ABcS| _,KuСC Sw}GjdTtUh4ƪ݀J%QJU+DJiVK$*0HoR&jj۶dMV?R 'O4ԩ7::::::b1cpp`JE (J'qƴ={v>ѿ痗;#1Rr]~seA{=sF|[6y{5 ,BrPhooWI:ιH).m D\\\T=fffF\n4B9M$繮;??~\Bj$u[FM1>~~}{:sdR4Mgx*idc'VWrRJoN@rFeyy\./9~d:vqqX,0(R ( b[[[.K$ÅBA]Uf)^xqvv0l6[. cffbFWe˦ KOSFzԸi)g}40 GG}-7}v„ hx=]zdW&ΗkxE<䑠Tk7ip===ZͶmu1VՍ 5H)=]XXPZfF&a{ҥݻw͕JVC-fTu]GB`f!4 @j%I۶ JyM7zv}=CT,~ .hhUVDuPMt XH)MB188y^"PeYݍF#JD!dtt4u8ܾ͛2W&04i1۶um;"!aL<0t:x⃈$0 {uQ> @ή}'NtP\&|cS`O<8Çya)?5??{CRw|j"c) !e( $ 50}B nX5GONL ܸec>kgCWj %J(r%XlFq E4ŋJsC /pСfZEA񥥥d2麮RTj4mk+++###\n~~~Br/饥{=z^WښW2>>^,>E׺ '?S]W "ضvn#gKϼN,Z 4NάX<7>շe~sB^H(D2s R#DE1]ף(Ryy˦#@1亮i͟TʀRqs*-JD"zL*AP Ta:ȑ#;vT.jމѣh/%mF[Q5u) "[~Ѿ'fGrٹrTY2a#C z1*G4e۶5lE.8Zm!j:ST޷bW]J+iv۽{TG=eCp.^%tR3@hN e8Ht*gT];߉'b鎸az?+kR)N7d&je_cZVmzL:}֑՛ۻo{Cmŏ7#P{tsD׸aI DJd$f$|īZ+d2B PBt7Ne׹]۵Y$f$$RV2qYtk!m3۲}_fSlqvޗqNtT ) ESj&ѽy-snox3"Ht3F3c8%=rafzQ/mm"("ZD$I w=Ạ rv^n">!d|||ڵ+7x\0x74kqq1#|Rtvvdڶy^&Yvl__3[z#BKT:=;S k. AЄO_U˅l:@c">QA!h!82 q!JbF(-7oh@6RhH$TjvvvΝmc[ZZ鴮333###ׯM8;nZqĩg[>X9Ns\` @юD)WeDQR!MicM!  Ķ*˦iz'9,r]W^]ȮrL&GFFl4 c,)7c|^ri d2}v鐤%o&R"ßß2}SBLXIDAT\PKK"|gL(DAq3JtuiWSzcHZ{׶LRz#X W}&`0XV-b0ƞɂAT2 RD"%o$f2.Ȥ>Hذ,grT#D̠),)'(`Hp!|367ej!$9`PLӔ| c0 yY="?qJ¡L9L8 f~m5b H!Jl"{/F:"/[`LZ~zzzWX.m%3B1F?{0%G]Rq_cХW^YU0tM/5I!zs.@ L:n֏* 9 b]` !8!uƸL0.$) 8 a1˭$`mLF) 33ƙq&@p A0` c3.\c2& @38g!i7 ~5qCbyo h>p`>c q\0©css q N !@L 47MP7lU1Gcc 0"@s>gQg19 81@ X9' 0NJ {m305Ε*ͪc[/GF{AGy$XFUe\P*B#`(qN 8<ưT0!8eẹ 8BB)c8rIr#BTehq*J(T˲(:[jK30bQVRWWW@`岮몪 RmeDDKII4p>WU5WUI2+YcVV 7.@ B ]SÆ!t]: j4 `4xm>l㞠,2F4uP FB haP25+kL`@Ugy&OOOJl6eYRs]U*Jd(!$J&e7ɥB-fV39UMDY"b>1hծ*Eֈm _Mi5J0Ni^}]ẘvu͠yNb Q`؈cL3N'~y[[[/[}$rUOLNr E+Bh&MDmܸQ4/ykTP㽮eUJ"KZnZ?$L!Z*/רN>;FL$tj)TEK5-c8z@ +f>VwzԽT1pOO{ח/áh yUa޴*t+i[e+[im74 l.U{"O#y}8#uDApm~Z;T]Sg>--cGtKGU,&p4~DbAhRW'j\0u`z&R>-ʉqEP%`5`O˹5]1 5eGg&Ϝ9|CZwm –[o%( ˕Z=_-zgA]YӴ 5DWNVg[vnup_8b{~#̳9¸/\xaMG\8zoHj8Py~m۷{yrM&R33ԏf֑T(SȽ[4rhEs(ʔCS[taD |%NMug?+pίF^ȝw_)sf۷}?ۀ3/|F@D X!:zFxǾ`f6gΖ #(MCgYٛΟ?- R9Pӛ6mL$Buh{{S1`` TQb6繞=3ag_{_ۻ?kUwn!ユS J䕮O᝻[蕗>z}]&?qOuh5cldddbbBP,3'5:vbC;v)eݴNJXum۶l˳՝mo[e6`f6셽h<Șm{{{&ikkmP(H$lێ333ulێD"+Ǒ0׫rQk`fjvΞ l*:~XF'OO-_Qq}Jmugh1,EV>p+~ﯾ#dr?eB)hi,t 㴵IߣiZoodm[&V#"wf E L921-k D41qiry܅ӎ[^*/$Ϝf;jʹ )ZZժj!-N5/W^]K5E A!|+CF^rmZ2ƾ{q[=.c( AR*j<Bp꺞O jubb <۷H F9qfx׫n(@ x{2hxxXWAQכF 4DM4DM wiwu޳gs=ʯWk׮{#BT*ݻ7J]UzRСCWc{+k/}K\NY|rt:o߾a]ׯYeX T*_W^bשr~nV^;֯hqt:-Wҕ>}P(\߸N}Y>*W[ZZN^kBlσGezBc"]&c4\Z.dSlh~ZϋƅwHVܡJ.ɥ1`~~d%d|I.:*G4A_sg$vpƴJt &EqswhdL%YUcez1OStˑe8Si.ӱPg5.K0(<䚐?2 mFo&ɸyE3INGMycßn텒p8G &񵸸(m O.ཀN-]7Bb"CY2enBB"T#,y}2bQ^vEBG7"T-#ԊHbZ{,@}v&\t Vl| ]rmfaLs>7'F%k5AH89yJNYnn,4B r<)6mB9/:w֦fӶmZE-֭,s9f4QtEp!2/}ZmhM wu+yrQjE0BeX.S+EW4Z1N>/~%f@cn@Cla0}wSXGzG_^ccPcrf|M2X0H14Wj6EхmAPjSl<2&\Ahb% + bDJuD^_/[)$)~=SQq!*%:e#P,b?Uw%o'P!V.#˭Lo&`WR n 1E^&Sְpi.EB&V*,`X)[/R3R`< #4` 1Y \`a9) AP]FYw60.855%=ڱd9n0&[ay/!""$I܈bBϖBV[O4ҶC ;@pÀ@kBZf(LaH(OI>LX|e3%XG|)cu-6Ee;/!'s] b"yI'bZ~a/*/"0bF "^Ļ`) _AoV~1/XE~ՒܜEwVrf˵O6Ivr`0H=0t7={#+2?;IX,|~ ;WAgfEB,m|3ſ&KӾ"83KZ05Re>[kRӸ7q?KAv?ٺ_4+$yqfwD88 mS>O!wlDLс/ *0t"IiM$L#.|< +pO=B߬uH\8gm6XQ}02C}ͅP@w;DN.2t)v0;V4هj=1{Υ{׮n+,B܇"@DH#q )F!FjpF7"6v`^  Vxgu^&dQ^e@Xi i2/s&s\KEDw)5Hao7y |:)arbJjW`uе=t6Į"'R'y\T.!^OS^4 ,zA* zk,{F xsTC$$G.mJr+S/$t;7=P*)N}I$*YI I[crN-摗/4$ၓb:>Y=&0 ^7qEv K2%p0![O(kbvE#%6*z…PeqbYl'"kݶW -i3HK/(!i{)6O1 ɓ%>P,m7M3g)ë50)䙬YhT1"K^l$m.$dX^Œ!t9KAjVM)j4$I sNkC>`I̷e^/[zqJ0\' @Lq5 לCyBYH*9   mb6PH@CcvX}~uuFm;lL00, "ϓʶ[ޑ##zIwӾ?||bҶmMַQVF/[ڏnŎR^ y a/' ,tHe&T+ N#y25‹\kby{j x>|=\q ݑVB) nh' zaSi75-?br.K@)JS\DJE"5+>IoIb}53ۆ%d! .b3v~95B'|d @02HЋYhY"VCXVˆIJh0֝rӜgf5F˽ᾆ|)8G b|GQ*/UyÄS#}cN]D%L L'o#s/5eaPArެ?XiHS$^yd?<×(VA'zlH=FH¸;ć``?A8#iu @@URȶ{ѢZǤiaa!t@UD%-6OTf0ƹbȺ1<=u\a3NqMŷt V2MwBrBRdl%,vG~}eVؒ}~ş'[bL!zM"wa{dK+fyꐭS^&Rr4V%TF0=z>fd 64%SsX4%rfTj,iYVs7UB[8kuW2bqh@FbjjB3lS]X[?8h#k40|*/)+UhJ}PfQNAa, 'L8DbLOyepiTZf4R@zL<aD e.xתCF$&XƼxo/V`֘#QDbZ[ЅLe@Ҁ>ix0݉lm=ѧM1:]7Mh\1V)D=)*yLJ)ec+)vwOczDB!˝!,:q6sōpdXv4S  Ѐ+ }1 &_p43H\ˤ^=7=-n+HF[Tܒ 4)Z${3B-ykbq۱5qRri4H;>oH$!<&A0a5O 8#H rwMU[TN!QkErbVf -S9j]!Ft7[:FKg4i XҮ)ߠorrk4<Lr8_OWP8rܥO+9@W} ,k-0 bI 7kRϢusҸ9noA{@T_R´g*n3ݤF$2P{.9ȒeqǺ@®S+f>?F9dXܪ8?aFk~$ʢD*<9A[E |zmqEX, 4b6 ~ a=C̒wAG0.Xu>f޸l%sk(f 4磅bc~nWNCWyhBxv43H'HHKWt2I@&ea*'Y5P8fTQEGm4%Dyv c0LFkOA%eI0 uPR +T^πUqNDtN[lXFaN(& b╻(BB]qi z}g[e&V2e z yPȺ(r@*&- "yAC yήwp i5醆zA?#V;`f[Gy|_Nqѷ2҆@xfCgK~E%KElM@,PpkEg6[ڨ /|Q,1e&*h?v&r7U>`sѝhA}4D7=/x-Z@ 3GTF 5 K 5#5!^K ?ÎVsfƍ}  U/Xx&^{P]Ɲ֑s9C9_ˉ;{"X:|Śtڜ1WMP?C)d}/Œ?B~9;CBa4n4 &ĝ6jR2@c-HSùBLYb~J}pEid‚W_y`t_aռZZ)K(iV`S;Mt+ 6Oh0x2Ȃ޵X )+̣Mx_aALspʨj`M='tb+E(ruqB[ܘ-,1 p&ll٢7¬8;} 9c͖LЉdS6!Jq<%XhsSSSXdדYLPB'!>$WK߮2ƤV  ; )нRwפѢz8?dӾ Tfc5GEjd꽝˃ll"ې( H?kO^Mq>s -߽ay"_]m<0IBQ3! [,Ը-hm Bv0F,YY BE}D];<ºC8.?n%},N-5Ɠtp{ ؈=~1pG (&M;-+a>ye @##[! Fؽc;>,yMaBn`މ1X9{}$摐) i!w xdʞ|OkoXK}SE2"%DO܍CN+̝ k̯TLi,}`Scȡ IDAT,6IHG yP,ss^-EAuY6Ȋ<9EDwA.& B' Q\Ym/t!*U "Mq`1/ BrF'H"Iӽ.ً.OmКn/d!zu+Z rJAJ@'(&L~UxJ$kK~e)بƤ=|QDfMع>7҃VLRʜg~PŁ7V+T Ҁa)腕n8%v(:vuR,Y./~sX,Xlic*7;䥡w$£ZLa1Ӄ} =2Pglde# Z IB¡{ǖ5!>`&YGHb?1Ddd,zT#P-Zx%ɋlFHQzo oλ)PÚ~݆н2^&:2P^rjk* JJQa@유  PҘbFPzX5fz7m$'h϶WG}'к0s4I,v%=$tgn24yVWh١ɏ*9h5"Go oA\h›g o39m"מ0̼A!LxKKh͊b&40U~#Zf.S2_d)gO >Jmt=&찠xr¼@`_"U| 73@8BÈr܌ Pw;% ?Ab}) q?iV BXQA`'D7{ƙ6Q@P"F5݇bL!3 Sw)a[7PęS^Jˊ"@9l1T=$1)b ~\cA&ˡ8 MNv/ P˖uާYxѭ,O0sa>@#4+tL)CI6x&GZSl!0SNi:#3~Y'xwMt(۸.)˜E$ßٺ^_<h 9@A< a<[Sk8%e33^vgMl7`S{v<5&Ȓb` z8E߸1Kn7ɾ0|T7x6g6y{dxnNE}P{> b &)GioƆkt?$G6E #U [/e0_%x!yu0Q( /Gah3Ҳ,\Ic=HK<%U]kHYr9kEY` $!x8Dۧ|熭# ¯LDdȘL̽,eM g> x'bsLi<AtbC7$k&Ϥ-95cL;R& i7I"?)*i_. śB|E?nr[B'b=lξ5/"# &#vZڠұ1*appW<% ") qW@ZK$"PiiSKcu?c>ʃopJ R[z-[o-orhqo8)II 0FiwvzL-[9hahMu`5ukjS@̃_9My ]z=BTƅBd!q0)ch s@?xu_C;_SHGI]xȐJƠx5oFށY$汣H>e6quqp{be4槢lvfFp_)ܝ_R@\na\<\ovG/1`prASb<ەq?xsXgB鼬XJ ,@a;ߛqo2:s%狈=^6fS zIߣF`-mF"3by0/a 5?\xN#< }ڭ@ž$uZEX'4E4pe}Ex%YY~@E& /QЀHafpލķ-@DLd]#vYiadAbT$axqlԺ)/K@[]I 2Ӧ $=e\<1=~X ([," Nݒ!Wgl \[~hjb~Kp :b@ӻw>>mi}\b-ah+2Ebc$͗h0183RG&>#SMsVw!4Kh HVa"[XXXbEcBcfNÔ|0T)QXUŴbĔ2ّ TfA/I\MF"I֍L].kb[Z5. e8m2|bH (HyH8AM @&,8aFdG0Y9q0=f?|A5"Flʊ+P,0ņTН9S慅ya (uvoO@=bmZ əBіR/T@'?n_F`1E2Y$&CY*TOFX,b `d7D)̋k Κ Qe#'Y*`LX_Y#Pe28v(^*Ca\)Vi]kEPi d2dZ;OHlF-z֒CI{z6YE>] 5&] f @ƏFC# |`Y$vyD"*6 ?GV1 GFgK*W^Y{$+qv|etzğH?I4OSȖBT8 YJ8 jBd=&')J/ `U$4cKp&'_AJldiبisи8,!&Sn!(ȱdgyw4ƆKN>f!%\obլ#n(B~`7(/ Lxu|hyBѶ«- t)x\G pk{B)kjC$RIytz,@X<* # "nQ> YBh%U$Oo"/#m7j+. eWjQ+ÿmw{~~އf,R\SMp%r Szj4}c[~=࠘! 53 [9OyP4ȿh{60L^rrsv}+s 먖hw0^ 4(p{H 3PN*jb] DR袢2)٢ZƟ̾ NqUq$; ϯ^Z1 ׊l_|fO;K)5{.ر;ܸq#\GD]!'g <4g:"b #$&aO 厓4qxFܧZ&Fg1^["q~[NBzSȮa_hic18Eb.[ wx31_43݋xX8K*"snBF\kܜ]7ɇ_D-|hE;E'3qM 5Ir_p8fV{i9Jn %S!DĄWaI1K൜Zh۸v=?K1wʩ"Ф<(j`߄ <icQe E=-GGHKynPG1V*\Wk 2 !:6o"@- X~At7*&)p~Wz x%RDe6yNʩ=ȁS+wFb@d)tV9_/: YGH6_,,r QQШ n0_{(E,G -D+PoEr7N >61$TA'`MyYp* -mA cAx4Q)Ϟ(i39nDz  1Ѕ'@tOHbA3*{iZӛ_I<0""cymĘjˏe^Cvmh(NO*g4_q? ÂM6-kx+P|nT YXK 12凗6c 6nٓrŘyb/sK'd% l#l 怾P)%g l |^Xg-vG< )ϧ]˵j" ֓ hhTiW)QYmwi z' 3^hm1+=*qZx{ 5TL^1|N%%pj~JL' ņ^\PnbH&taKzGO# O)Ǥ2bˤo7,@ hgLh[ e*~[+7>AB7Eh,Y#;1IHC*i)Xt`(ٻ0-# a㊅zmh |l}Ė=s͸Up,J@t>TmX)UUEj5ڒtF~?TGlۻT)tf(hΒ[#Uƺ p/Lm<á̑cڀuӠX\4II<|8_/PtozO_Vҙzn5S)P% М'7~4ހHAGF+02#sqַF6euQGsū/6>'?>|Aw+ǿ;k܌B0G+;v8ݻ/zG1??oK-[=;뮻ڵk 0@$ E*Rjc^Pb8Q#C F^,{Ur5 ϝ*zy^NUnVff8C'}e`9OUANR;D`%Y:J5O@GϑtA-7x-u`7y)&’ϼnw>mjomG\?_}m&:}~~SN?ömz衵kNMMy{nذ֬YO҃>x%tI<>|+W~YgvښҖ98jA1 +VEBa8,>"P?CbpS@XN)h)[9USİk:~36CϹϽ_8_?Wh~o 쿾`qaz"f7??z?񩩩;_׿U;1ݻtI7|'/}mht7?iӦ/?iQc%/֚C77d 1B 41ȄFFF1u|$3^=(YYmawJsa %@XlC !bˇT{gh .yQAҟfF6Q'qSTL/MqsA xvc8Ͽ_YzcawOZUwok52ipժUo}[_|kfiӦp>Dy~}~E,..p Vkׯg>cfzիv܇n+LSmTvxLaPc" 7لMI̱y׋] ;$VG9 PNmg6"cl%7?\WfX9[bflX,.A#]rR)bS+>ro,w՗~QCXDXb@x<~{ޓηr˛.hǎ{w7n߾&p3[\\<;h|ݺuwumڴiݺu5i1`<Qy㦤&/"M۳*43p-_ (|fmCA>0:3 R0NC4+H!8h =4`_CjRS0Hxgk~#hM ]+sBVFx $EAyIۯ/ Ȍ3L7';Wy>3O|g5~3X9GǧdYIjvΝ;wܱcb47nܺuiveqVvp<9+r<կ?sN_03#mdt?at@S|j  Xz&w sXO!#&IFq! рu)t⢜wH##evyvZ]ryyxL{+fɱ0OcB?z%yv!W#arkݩ hS~H4bAS+xt9[!oxZ{ǑY0Wtʹc6m a,MuֽMoZXXH}]w{W\q駟f͚ZXXHE2hkpx뭷oۿ뮻]zATbN؋W)9p+-ay8J v. YRcd-6&=ߓO"Bu@؆AQ5D5!C ֑'(<1߂-<,v AOn)M0Җtt͟T遵o{dwu!X!=6nq333[nmf۽{C=q+V|~=y5 -ҕ֝'? @g7dHvub&и*ty;FVQ䍥F)݄O#ףm*NCTZp^AGs;%hSbW|%qZkKk~pBҚl@H#&~%ȑ};!(Xgcx;_ypշgjSm5?GW C&%6`>묳:__}QG E͹s9g'pۯgcݼy7ͯ|+[n=3ggg}#.U!aK4xCO?@O6n"yO7\;43 B}ɯ4}Q@'aj*C_In)ûExv;% _ }.D#Ex zX9R4'elon =,5HXctwx֚v\ UٺEybB *t!4M| BA9h>h&vxzOLkEYy*QTO)wBC :]mN(/+ʰ# zGU0aΆvxWj<2 q ܣl?}ͭu햽c|ZSFM7t=_W^{~46lk~}9=Kk֬.6 C⫬VtC'" 5o(GXAO,hbHHCACd3 `GIh2*~&3Da\s# bΕtC6R5Lb0ѽ\@Vŵba-Nkfɋefay~@ZqgJ~/6,FkBv "'__W^ݣ>mzzz}'֭y\R ]BhqB4dy$ _NܖJQ\5Ĥ׺/ΐ'^;;Sh ?yYܓ=Dq-_;fDOovqE)1kXyS_9>&gdމa#L3~sre`q%}y6Fiܭ\k[ϱxklOTZ ̆` xGL\Ta8K oMm ȵyEڟs-^T Zh˿j2wB^L03}zu9&ȊoЃt-"SZ~֐kI6w׆%ɇh-`^ h{gfnGn&ߖfEo4+%n۽]$o۽ S 9x2~c) HHƽ3l2Q5, ^D 4>X " +!^pɼ(ijzg+"fwOLE顖EҽF@)s#kЍRfmWXQӒq[K~٦呬r,ChM1v;[5AnYT)T$pʠc"ŠSD䂧2ZC>%Tƌ3A06`7&эn؀q4$o[z %F gQ}E=Lv V.p6^y<苳c,Cu&ŇÂ|ˈ>RAHn3ALEkLNjE F ( ;X9ŧT؁x+^pa~Yb- @u,W"4s4VcĂmBX="5?@+,)[\/^!I=f+("+D:&{iMˉw< (3zɄ4- IsÆ ~M0;{󟿸8???v~i^{핺ذa˧&W X%)h$s^FC3kf4|?o)v3[1<1gJ lmW~`+C$L=Ph'S@ bcS~?Voa 1EC n Q{1Րb醑:brfMAHGAT6nZL1̼U !LMMs9ӧ~k_ڙs9gvvv׮]gqyw#+~>w]w%gChQV=jg Ѩ̍mM>Ѕґ&}3™_x«Rˈ`943M4-ts@l )Bpd-c3=r)>kE8UyR*-dߺCCG̏|.ُ bh v`\G͏`K>]j܊+"lzdvvvjj*wnQ:hnn.]ּ*k%,!JmW,2Lܹ=y '"[C>owA، ̆[K?8N$1N5.E}؆3g >6I-# `$ j0/(%+B=˧YPEk\ۻvP{JFɥ@} "|78fO1":dM :+48̙ :tVnb-&sxΘMw D+Ǐ╎RLoIG% \\-@S2H3H5R ) ssCcR|%5pbYqD]&laaiM)jCG!iB`ՠH+*`6䁅uՓ&j)-Y~ yT|VȖ6[!.!BbN@ԌZa`I>)9hJz~bgE;sf(OByP`Ynm~ , i甶zT]8yVǰ"f)me,μa~NԴW`9ƘP1:52o4六HcIW˒:׬a%[X0[SܩeY:1^BPn^\`%3D1qF^-A1/{fdCdo]"9»kJYm4g2QH920(.fWY^|&O!u칱}<@o2 &,(:Jᾗ4)(E:ĸqr?)`M/48#˨g98w³l=ALӠ'HȤRqo"D5( Ev|1^kjdw=| W)q@+&jMH\ Mב5~zJ]$hnn\&*vo/f@kAaC &|!aȳE9T̡#bpr %d)̎H]ܓ[$f1FV>;;~۷W{ċv)k{ZcK ˰Y>n&i%jdiʬ$jiG/-q``ǰ- 2DIgB*F=RX]V<#?%iǷf=q4ܱc 5KB>y[ @&a[g.GqcĥaU|/%љ5@18+2܎hf677kk|;>8O||6UV/E;j*fa>;߶vjFZ=L rHEI*m~N}R7H˩6i"ÒdXT-cA;mMLA,BMBOV(~ ox/] 5W`ػ77O9/x K&u+SE 5E JJ;imrL$=rrgE} z9gyC@t_dvLOO_r%gug?s9g |ꪫV\o1 <@ kҗ433S#&՝mm ='z-X:K7?QK$QY#! tax:(# o끥uF  m!\݊7JafgM66d-aN5W|+hx=|#ٽ{GSO=c'}ܷr TDք`_I8O0ݓ6C>|X UG"_'[,z דB=Wuꪫ fvG^wywuz j#vllq÷]Z_zEGݳevGaUֵmzl?\cq&Sx?2ᗁX}_LNeQq ;$+1WX-mxVTwȏY:8QI5H,YO25 `W4"PڶFuֵm{}%\O~NAu/ܛhܾ`t@7s(E} y!għuػDt$nSXqՖWپ}wϧ~xz衏|#oy[6nxwA.]w@R'k_!{m/*4.dG`wHZ#)}:~!V)r7~_|p}!~a#n(mQP+!͟V?>k=_9i`;O{[̛N}S/?_u/.zKG8gS"F;J(:=+q& c4 fC@UZ-$gdt;@{ɔ`= t=!Z}9] Op8{/CPF@zy@nF?uWier1;v}ϚgZZkg0A%<9o~/+Ͼ[VRM\-TJ:_1q=cؽ88x]o^<7h_|Ła.vrqtϺ5>pdu:#H_{j/p(dzeBJb OqPώJ 2YF&h D`-ڼ`7 'mBYnݕW^MƟK"yJ*vg9YN{ڔa+c5VҸQ[4~k1"P(ɂ@ X\ !_o}-/| Ol۶7~7Z*|#G܋^#Ta/Hw_^8"sͦ{1kc9X9 ɼ @gI#z?)|9?;%/yR4Z|Kp%]xcb/I,5 $nЦ_㕁Zj̏rQ5~?+"MHQ-V?կ馛 .`ӦMzGy衇& 7o|ms1;;{Mt&QϜͷM4gzZ?8a*̯w0TSHc)$.+~NVx_E40UۖoLa E9B!HFS,F/ġ+>ND|{`}?K/tƍJVrZˁPFfWQ MO_"`o0>Ae\sI& efzֳmիW_tEfֶ_~'ܮ'92i60fY5f.Q+6]A4; Y9f%c2fZ #"}&3"MӤC5&H RX1y E=7ț@)n{]Cʸffw.8=Μ/F.r_bEr3GHf7(dU n2¦oFG kmdJK/,s$+W^ySFӟosF3OBk+>1N%,[ʁ;j⚙mܸO?DjVL_BF]O_SZP+m?ŠI/X؅X&i,WdZz_/{|pz>0{7're_tE `G[.38{u]vZnt\~/7ۣ+ZK~db`9"Q!?*skj#\!vEG a $pvGIMO;3c OX 6?yzB7ntƐB_H\Vd( xr=t(gwŖ$oK$ /ׯ_+ڼ@o t>z`}3L& CIE`(0u ޙ)inr+狞`=55i&6g>sW/BMlذ+*Q?pƗO6?q܌ч-i!eL_EGxHJ\.^$ReZ-((lr. ˍ*/2K&8 .JRƲ@83P<1XzԽ۶_ZX!/@Q큌u\W;*\-#K;l75#08?Ru\4 6oo|cjj(7ի/?زeiMRA .Є{܌㚞Zs^XX_C9)fGj.-y&,zas4Sk$Rz ̐Qs.6~TK(O*-r= nAȷ$;K $ラ]vUW]cxsw̙3gs̙3ԠEp&>&Kl) =Zxt BJȓW^>^q9?~ɀ 2Kcɤ1aRTsAa$ڹ)NV)|ε;&xP x#26!a 퀘{ \LH$7lJ'){.'|"%CN`K74/CP/ pu 0tĄ=,29_ '~%=EԞs̷ÆDbeE:4YR4C)2%dJXT_'RMTdxsqUiwI4ʠ%s>gF31bDwwwKKחBkĢE<dk?POSM!r0{+G0z:2ai!b+Z% VMU:Roi%>J"e wAB\rr%/?g] Jc%VpVĔc hqrRe=P8bqջzyBHAYu([YaX'Hꠣ///:uhlmm=uԷ~{@ {8ټo߾zoåYYYT*(I sՙpD)IP G& ?=" Fv ,JH.Kx 9aP DV$HdS$qse-tBB8q?Pi FvSH94<NNN 6AMTI0Gp<$%կBT, prw!S[XK*f vZJ6 2ƕM80;}tggfcp,dO~dBFF-ـznLqX%jOp#  L+1*O'.i[\F*\tI@IB\7c,nW)-4nVp|Ǟu?1$.AA[EPNsnF0 aj\'o%^u+TrCUWayP&r770G0^r Pݾ}ۺh4FɓkR*IҩSۼyn0aBCZ悈A ?=p50q]lH\9$2r \/4Џ`0~(%"N†?a?S f8+rzzٳ !^n0`@GG7 h'a9\|Ŝ3FڎYq1;f{,f\#^%4Lqi\Lɑ\i ]#NBQus8$|SN޽{]]]ݝ999Ç2eʌ3n,˧O1cnW_}5e橔z`}L)Jb(%l?'H^:_(֋kfE _ُ$ sP#,IG 캺d:)HIpd͵Qܲx<}>_uuuIIIEEŜ9soH$2qĂܡCb>V{]{D)!#},&ta&bjP(TQQl2Y^^>f̘ÇDML GVwe!#K2:L'@ A $vX99SHF`,.$^hdYZot:{7gBwvhTd2E"!C(pLbiLa/6xJd0 2u+7E!>'jZQo!g\V+b NJEܖ=cE>9ɑe\YdYbÇ/,,5jڵkٍHh^{m̙a瀌 sx_ \H)x<֭[z5b̜9sÆ 'O&Md1dp#T"+k: 夸Vk2p/³ʲ;v>א KubxPFi$a ;j00+S x/Rp q :VRuR[hb`OT}@&I$%`I0qr0g(_A K/b+h*%0t4QS|?K.X,·SJ ѣG'Lt:%ٖH__p @'hhF?ϟ~ifffZZ[̚5۴iӦMl6[VVR;C]\@NTdSB&O$IP }EV'/NXEcJ)3 PCF&Mb03 bnDVI=%8-aɱK*q"'1aJ_4uiii'O8p7L)Ν;JѨL&S,! {gΜ9EEEx DCb9)'@"BqNY+++׬Y~LZVcvvʕ+}ں:v-[6dȐ P!K12:% 7ܟ.<89õ`p(Hq +gXkƞW8y/!UB⊤(R"nlI(6-'\6$F9qCֆf\)avv '0TAĉ @QP/ 9C &+S#aqlƒ=twwFܹs.\hXdYO=T^^ޘ1c`_`0F&:Q !s8:u¿B2@bd iiiP5D"WHXfÌ%LAkJs4MѸs)qB͒J\o9 )-hO0Dvh %+ Jb0%I8{5k>3Ϊh(&pر.G}g333 C{{.[nA`@(Dq&XB,xPa 6)t9V1FZn݂ |[n> 5>1c͛E4Rn\ɔ4*LC0e$YQ[ײBlǗd=5r@N+d{}# 3tI|+(8Ip?afB{(r݇T*^<*HnxEjkk:uUUVMdɒK/>K<`2oŊ;w@M7sI QB ((8qkQE K3DzЂ|'_jvf-%8c<+++z7n /@1) gڷoߚ5k?B999/6m nFe믿/OFUYYɎo۶o-//z]SIO*L-[6||tzj׮]lSxϩlX#Ιr[콂.É^ X'׻y ¼vm6[ZZll~ܩX 6Q2Vc>P06HTy+ 0aQ$ۨvuǤtgIF dfԝHq( $ ecŎaSC!,oAEõZd @)ڸ8I@'h,M#LW&A I02TPjb8?F p̙kfǎ TD)5LnW^lF &===--ߵkΓrgϮv:lno۶L&Ӏ8$':(zرcvzG}>cf[xqSSMuۏb Ab 5rꫯ~嗒$uiؒs= k ^Rm& %=%9eEEUy.Ol? t6ޘtG1֟ER66Zw$($I>QɲFYN60&"}`I &4b6e  KB^F%@|c`& (H-{ [<ɲl%I4hРAz-,effnݺK/ 0t:l~{UWmܸrİ8K_5\O8!)@Ϝ9cZ6EQFcSS_򗺺P(D/Nq( 8a"ڐꂋ0̜>vإKK5 b)PB |n=%scqJS/=KϟO$JƝ#:M?=X>>;\&v:0*D6RqdR6)G܉@nv{j @!6 0%4\a䄍} En b.bjfh*EH\' %Y].W{{{{f6`/ 3f Id㏯[.//o<Ȁrssx<۶m{FZAh4گ_ov 7_L;v #F\wueee@W<(h7@HQed$E09i⑉$Q8·Bkv޽---SLo=tHر/W^"=UDtTI(h0N}:uP@LbW?qVQCX#L k=aP)%ѪKKp*8I0$%؋e9 1c"b䱙Su: vܪH$ү_B7mڔ~li/v_q2gϞݲeK<8poݯ_nI4T%##( ?sss[ZZ^}krEQN}e˖oii͇3:6 IM,?>h7F+a0prhDb¤l믿cuD*&9s0*H&&I&yoTzkR뷵E.|ΨtgIү>^&<QuFLx 0hCgN|\)$PҺa( U'QaΓЮ(& qag)1'Uq <0gL()9n8@ c%I|x^8WH$p8>\PP jjj~FHX,H$PJ Fz8(V455E(Gd]]]_l^DΜ9ѣ/Rww7wƤh4;x/^m6χ7 W,jOq%SZz6mzGه5K577T R{T7eZn PDZC=-LQQB\ȼob;J:Mb?h{ԱF4FtqP]vmC<\ <, D:Ilf\ k&(V!'ApKAlCi ]s43=,a/㵎~Ŋx<444y<* F^Oߓ,Y,;9apС7xcӦMNԩS3f̘?q.] D80((ZœjR S4v"}dX>@ n:&FDriJ);ioK,OXzN>뒖LɗQ)o/Jwt>4zqEm?V\j *Rr%qgj!Ir@F \-@&,>g_)p7JS®A`琟)?@f/^IVp PB~ܹŹ㢋.bq{hOOOSSӖ-[\.!)gggwtt$; Ji[[[]] dYZiiiUUU73EFC 9{l$)33o/ ǎ[\\iXb{' 4m4 ѱnݺwy'0Ç,XOK/f2MeBH a#H,c>??䓩Sm޼9 h+-+o78?<۸jWB,]Vjj7KFI!X$gyo2ӄRvD;`0W ^l\4AO! 9b0sTB.nYT]-ZY8ӎ/cgOq&g<p]]]PrFmf3 R??Kh4??ǎ0 L&$IYfszz: eYo H`P^w8===ӧOO0nyWy1=YU{{{lٲ|򆆆,ŠtǏ/zرcWv;[ir233?䓻kؿ &`ہսVRsNqUV5իnmƔUV9믿>''Gk<\4kP;5=*(*7\sXR082jK-UK)4Wf~Z9)Q'@yi@CblA @ȆzG|oqlॗ^eWdee={]SpAj5{<vZ+wJb9rHiiu]W[[y漼E?7gToGywe1]q6ȌFVZ≮qvNbF -_49C'wb4 H]qwYfIIU, 3 X(I\XѢ ZQ]RY6j%@*՞1=m_b3? &E` p*cA [3ccG)c4}B0Bz{{ꪝ;wr $S>p@Jissݻ/I&tP(#~{[laϟOmKdY.**| RXX,,de9''gǎFٵkҥKKݮ222`ؤ_ڵk~g}]2 :u߾}f8,]bcYOK7?ZmꖢvMc.`AQb'ǔnzǙa9C7BxWVoDp!Z?֛DX Dl%pS2Eh $LAZ$4,{pu,3au cߠA<ht`iȑ|F e(xb1۝~zvP¾) ]y%%% D۷WVVBْsԨQz+;;U[[˭TF9sΜ9sp8qF"DْO#RB.ᗜ$3&g,XJxcld" EF( @&&b k%JD Ux9& >NT0JjőJ1y)t.f),CbŮ8{,UUUuuummmz ? Mɲ'rCC`0iii6l1cƔ)S(81ߎwIeg%ܛ RR$t5 _MuPQɱsJ؋) % }EF_$dv{( Ò$BKysN3@J)$g?ٺuzzzAY=σ>xUWyM4G:"r5APzH“TAE HjHFR/'v ,P# "B#GVTTL&xXFàA/^ ~tHfb3g|lSqs7t۷o?pbv^V4i-EQl6[GGNs:_~% W4߿zz:$iKMϟ?ܹB/1۷/??g'yA%xfé9EJR)})\\c JMĝ3,.Pz7eΏE/Nn:hۂ 2 IƵr*akC%=TW!ѵ2LAcW7%T'޳'˲b&d2B!R}N0oݵkWzz>tP~~6`GKF9~+W;;e/a<憆+h(**>d,>ӥMMM{ݱc(f`Y IDATx:p@EQRi2vر`Fvx"+"wHMѮ vb1?`bq`"!ظq!O Sn?'։$K|D@f^qPpÀR$(jd$K70n uqpiTG)cBbؠA0$ 8M&S8^wwqoq=XV٬zzz|o=33fᄐniҤI[l/ϟ?Ғ]RRRXX8y䲲2m4a  7̯( õ8aee Ďhoo "ҦLR^^ݿ[[[9Md! 䘵Yh&R LE5K ]]ʪ?U` 㢸&^*hD_HQ2EMT8AA%GqUMc:SpbjK\htذal]Y[[l Klb RRRb>\]]\g8;~4jԨ2/Yyyywy_/p EEEz>33즉4IQv=sccc߿S$:t_~eNZZZۛKEu8BHWW%8qjBuA)--u\@"V5U$I~믿ްaC{{w1o< ‘}D_[QsL89E蓰j<RSEܘ((Ku FdY 0~i@Er $Hd4Rq&C RL Lo[ FFIe9YI^zpl!h$5ꆢ*\+v1{#laf( lfD\^^>x` h4.*))z׿^uL,p=8f( MQ31v0bʒV#=yyy~!+* 9dȐx<Ç۷/ ^|g)IұcppxРALnjjjV+0@ քwN5\}}y>e˖577,]?iQQф W_}jZ<( /\X_JH\MD+ TP:$ ~*Ï'[ WV&d(JPiyŵ~* mW71+ ;E{?7ԁfj6xIII~~>g;Ǖm nlr&I(ڒpfx %"9Q)STXD/"&i=OxX/-j`p ׌ J}1[e+_u!s/ ӕȮ_EiN"t:7yd'ⶶ!D"kvڴiZXR'Ys\<|QFUVVVTTz#//k^~/v\h4ˬoŎ=0Ioo$I_sssxM6\.NsӧO?~ڵk_ςH)z›\ \>IDF11 %`5Q!Ȏ9jP\bf)|eպaMG:p =ȍ#+@~z] @DչEў s +a(Cu̟Cn 3R7Ok===#FH)M&a[,^銢x<1 fh$X,x"bd} rff/f9W^I8%ÅdF)fH~o)Zp3i [ s@<0o: z1*tb10H*>YDPxp^ahOWz#M*A!<Ea[`qxDDk@T;k ̤`L(CB2Q]]]nRzɓ'eɓW\qE i| #DQKVXdo;ح %lb,++D"HbXAAsBEq8^Z L,qEѳgς49au---?#Ȉ#\{ p\=Xww?$Ta2NM' GEkK$I*++3L]]]`^r%̕PFRY~߻\_lElK.$2qb #,˱X;cfeez|w1&Y^oVVVOO[˟9srQJpOOϭ:uO?/ЃH p{СCofVVҲ, I  ;::X'6 Z_ƸHF)Qh492 ;w.tRTy_z%BHaaO8o߾_~9//N8#:&ND!V| m-iYY)‡,'k?B3^}1"iCWYé&eBkiiq8:t vcb={vڴi"ge@w]b3fL^^^$z@1GPc$Yl6;;; \.|۶m.1wO8v{cc#6߿뮮 FQNt.YW^׮]7|+3~3}ٚ5k|Fqݿ/&N6|aѧjbsBHR~:}B+&ō|En6kkk|I}ӦMK.>}:6NaB+{IOO1c.t:w޽lٲ'xl6Ǔӎe p$ 7+L6^""&8%I+?+0hȯY`di:吴~xV`Fmiv+DGBt y]0IT[[0EƖZ ~?sIL"ȻSO9rI;v+da 9"j,D"@ 9rW_pɪ*}f훕ݍK:NכL!CBN>M;Əspu/3|8ۻaCu:]gg+^uBȐ!Cf̘ظ~z0|ܹ QJHDɪ/ EXracRJ ̨b(NPm^yDq|(nHHĈя9'dY[şڬ<O ؐ)Ū0F 8l' !$嵶⣝DK.RJoFflV>e---h4r;r\yyyhl„ &Mok4Sܔ0LwyG۞|ɲaÆ1dzuVv])+ #G`óc[;:r4x&Cːn!ɒh` `(JUUճ>k2[?ާ~W^q\p8C4^СgyfϞ=ٳg\;vaStKn{!(>^zz(2P(z"y^B}86qK11 To΅08&񾁢(q uttB!<8s&{RD|5[hb\.XN&[nήs*!DQ]PP ^5QWL&B\tw=qDI뱝Ŋ؝~X`H9 SNNƍ~8IeYl7n,++`H˲e˖^x9'Κ5kܸq7o>y$cZB{nɒ%1|sͧ9! X$Ȫb[lCb6#ׯ9s&E3J T+DXl= 1mX?ă|%\r̙gbGjٳg-Z"p8͋_OQbF@;6$6l;0&*oᆜ]viӦx17I?U i1!' :PqY&$#D"~M80auG_D)eVs5`P(XI잪221,cG#Ѩ$I M&ӠA/2Ji0 wygWW~aP^^[QQA\X,UUULm'M4eNzod>&I~ɓ'o{l'N3 fׯ_kkkQQ# NJC:G\J Eu)` {/\jՈ#ZZZÇZy$wȑ&MzVZumAqMp:ZIIɄ ^W^ye:t( ڵٳrK$r6nXPP@0 +$'kepcC1,)WEo'ljjb+$w p=u:]UUlcǎTd_9,ᔦ [-W4ohN} alFp` /L SORgAbsrrv{yyymmeNn,NYpe2) R:ߙO>}ذaGaJJJX籅 !R566UI)HRVVhOgϞgϞ~z޼y,8g9kZ^ FՕ] DC(I=\]WWdɒH$rem޼~堵P5===MMMtն ,XrE]d2{1! X,;wt:gfw 0+h g*8 A;z;˗/ba !3gΜ0aÇϞ={BtB/) k0k; O@-*9 \Dq$Z IAT=Mno_s5Ν[zNݽ{k? #G .-0Hk===]vÙA$ (:.##]ZG3iٸqcoow͌xp* ,8NBQֻ#ѣG/^|Ai^̋{bfyƍp,Iݻ>`ܹ,.04cCNrdt4Utl440t70bYbk{TرrT9!\rѣm|Ʀڶ69: X,]]](N\Ya v)6Xvtt;w0wÑoX@؊,M΄#ݻ&LȀKacX D .HT{l(RV$I}t: 7'TWWƅ\jUYY-܂PJ{zz"n(`pر_~9[& xy,4^"};w'p:f"Hm@OFxk/z}WW׺uX0!ĪniiMVSSq]vKu:g}6w5k,X]"N*h3s,'`3t$†,R AǎQ#%y(hl6D<khhhooQu IDATdZZZt:]$snRz;UZZ:n8!#XpN: ݌8^re F zd2 ;,R\K݉I0xt:]4n_4Lx.$v?3SNZJiWWWSSѣ{zz! #Y(S 9ggg;wrG?9R@W &][&`,L?b&K.ݹs=d,666JrJJ)GOT;φ ̙{y `2,Ts`;N! e]h࿆u^"fȡwDQ ;\Հ֘ $>nw:,ODw0ӂNhYTX, 41[y_I LEP܁`0l֭/nᆳg>iii84Ud0:::7xl⊢_{o&eu߷f_@YD@4FqQqLph411:3qFPHF"qTDz齺?N=<`s=sΥ؜LI'HL񔖖aya@);;=ÖϚc3" ^ 5p۶m??P(X,[o5//?2vQp͛7y6l83] N9kʃ+[ VE^ jd[nTu(8˯XYQ )kQ9cE!ю&Fvo5~CCCss3IkYOMM yyycǎ‘ܿ)]g)I -/x`[n}ᇋg̘Q__vZ2)##?o~s=0R X06)(z{{KKK]OOϨQh=:rHrrv;l3)//~3fǬ%9tz';;;??c3;do;Æ +++ijjCUUUgϾ+H}}+ ̐0`pƍeeeyyy't:($;E$uQQъ+ƍwW`+(hff 7ܐqϏbBZޒEp_SSC WuS.pذa6&|?BY{4ݵkƍ~666Ι3iwB'EJJ ew۶idJJJ$͂|PYY Nړ, B+W\`l[1*tc,alh;w-t\JJJ0$4ډmYr)'(ϸ eBݎD(0x.p@k| <9/{A9!sǎGQJh"1.=^m\ׄ"\UWWϛ7/;;Uk=u}-Z衇 ? P(zNJhS ˂4Ao̞=;E %\zWWysk_Y  %fc-ڵkK/rʞvEK(/7|7⚒(ѶO>SNIJJZ~Oӑ#GҕP('''557ޘ9s9B?@:33_[^x"W-E )0 }Qde/(333^NMM0BI}8F>O25{JψsTbz- &W^2gBd91jp^gc,x)>g{'RX?>%%O;i`WlOc0D)U\\nݺ-[Ν;_y+"55oNjWKA ^{5۶̙kkJaÆq֖&M-(2_D͇'t/~ 6eeeQ~z?ѣmXgDP,R}Ϟ=i}%:qcяV\p§zꮻ1;h,(nQ,_C0(H$F~__ߴiƌdɒÇ/^X\+~COWaଔDgȳeL@4yɛ ocpe+{Q/[ +񃋰,RܮW-ݻW)UVVFka*YCTey=%ѣǍGtuu.¾>Zزe ]:xGp?Ohjj0aBggrCy8XaRSSF"aÆW؉ܹs͚5zmmR?u(jV>{|B>ԉ`lsseY|(ȂV4}Ç/_oxA3F9%Fnݺdɒ-[б4py~_ooow.Z(55rrܗC<3gJ' \4b ŢAJd 6 oC\`6ʰ<5H,+))Ùqso@g 0K`8Tv,Ҿ<55tᶳK/m;5T___YY-r~EEEs3%%[dMC ]z{{o6˲7mCSooo~~r9X⩧+,,?xٲe>r–hnn&P䩵}VDRSSZCݻN{箽Zq&٠|ͳOӲe*J4Fڞ/+3Б NLڗ?5 < +db kA۵g1jԨ;Oh#M_PS#MW -5|AlJykPt8M >0uhL8FO=3fD"VZ?|Cjkk,+99.iݸrYvtt!0Z4a Q'Ϲh˲ݻ{>aرF唔5zDFGHD---MSN17e2l0[|9ҤdXlСՃ,eRt/"˼W\ʁF6^^xa(F]]]uuuwޕW^f͚?]]]C wC;flfˆ;Y vs_|T?6+u{{'| 7߿,@Mq˗/?skc5h#/x6ă$sMw@gdF b&XTgM< `ųM=OC0H69S:J |tLrrr,KIIR'p`,"ϖt3j#/j(cTmX"y@)gGGOض]RR!qc0\Q}333y"99yϞ=lJh4ZPPPQQ1M9[> WXǓUšK.^jվ}O?`0aÆ|;3g\x1|divF6JSX4?_~ɒ%tAA0bg}YV\{}>_0e˖'ϩ\N%Lf3̐ dܣ!2h$luW.-Ë$?qBOLCa2 簴+voTdYRRRjjj~~ɓdG\ guXi iM~xc-rW?A4}Lbs)kiQ[v) ʙ!'N12d]l M2BJI@Zkkkss3`3ek~rD1okkNnѣGpE9^mmm456H ??Ahg; .^D.۾}g 4rL|nȐ!oll~E& 7z{{wcM4 G A l1>pz)-!z :aY{Ո~\V@1l |o f"%g.HJJ֔YrʆhN iEme2 6zs5rAiqFFxz|PWWGkeݬm; G#ȑ#4ʡChQ;[[[E](#M 5w]R===]]]A~i՘$vwwqM8199y߾};w|?'n۶$r]Y8NZ{G)P, JL.Q<12^"Rt ?O~_M0!pP_amaUg( -J@r/D.| , fڂNߢ!@gC:ětoqv낟yAV(A ~$ł]wuYg&={UUUt~qNeiJ(==ѳp܆-|}M818uuuM4L&''ܹ'33޲ 6kO?/xرh֬YIII6lxꩧ(PUQQѨQjjjieYtS'o'F3 . Zm۶O? IIIv( |)))˗/3f zԐO<s^ṈgA @P9f[A@Q}NtM^#DtNk7Qlţ<^SJr,X0Lak_~E'싳EfBmͥیs~FTVVVWWڵY899 sδl2a„O< .O8NII9322:gϞH$Bfղ,3OGȑ#wލe}> O>d9۶=sLZP^wiMIjFǎ[WWG0^?O aÆ'|.{gWXQRRgq i.R[tĒL`P,,bX L&JY]]?͕߰x?L P hS0W36*p6^AB[ʂ">'d m)hf{"!G\cRRAQF )Jhs(`CI;SIOOqƝy晖ef+ T^^~{N޲_d2N ܰh1Rb1z@fya~38Sbݛr+!7TF+њ=X &"#xOOOEEMXEbjD4#Gz?f'''ݻ7Ν;wt"wvӅ2w} h 툥|k׮UJ&M:sCК5kRCmw2 b,=wuI=r%YWIcX__EE˻6M6p83fԩӧOO>dŊ7Tp1eʔ 677۷ofÞG~C⿦Fz"@.aoȆTA+ >ʚ%*0 ?j+G4Z΄EP6+b=&~mbeB1;nICgQ_Ni^E4(3"Chic{N IDATccmm-DJZlPW\qEmm JJJ=BPwwweeessRp޼y\pٳ322x,ZG; yyyTTTٳ; ^===f:x _mw߽( 7=#Ӛ===UUUP[o>}],Yy攔4t_UUU^^3ό?[no~;<3H`{СǏ3feYHzh]x)͞ Lh|`,bk:rQ2.9d DqZ+6pgO9Ckl'bGf+x y2bYa2ed3*F1_¾,`axf,'̙3wM hWٓ%%%GJ)wtR5n/uօBcǎ7.aCaX<0R룀(pA%WPPo߾Ra`?6mڸqh mn9S~+++-ZtСla[VVVVVVKKw1u;sĉ<@ooo,gsfi'feL#jʭ(DN 2vE3`  QxB6>ryER86ofagT&3 U nBe\_\5RKSf(jGz/-[?;Ginn.mBmNOO_`ٳW\vZZuKi]ڇ5jE]dYVOOի_~_) fϞ`SO=ALdIMM)++۸qcNNۏk,>lĈ4HpqM6޽}ҤIgqƌ30v/yH$\r͚54 AsQQс{BMRS%۽{ÇkFGnݺ;㦛ni82î|{>}zaaaKK[oO8p  7|scƌ馛.bL==h̘1K.]fd % EEE=XCC~oϞ=~R}_'ܘ&9E8X|ú+/Šq&7!O49B*l&,w3[ qޥT;fIhif!aPcVPۅ8R[pȐ!eees48p\锔-fBz$&''.NJ/==}ܸq&Lo߾ck7dE-6755mذbŋϜ9bqoT!H$2w܆1c-T{{;Fyvݻn:2C0 mX8XCK Q; n@(2oo :a_ |1 6 4u:k$vfX{2@D@CMm$l3BԈT" ^TгQ̔BT}aE@8gl$`[3Ġ'Eaf&~Oetift :F"ꤤb ڮdض5222=LOORs0kaRSS#Gv<2226os.Rx{tTLNNϧM! (~R/GLPh`uDayMy+=˄=642q7dx=f)Y KgcG@݂Y! NW'f6rBԌ?6%W!`i  &bar9`I+uPJCN0! (Fl5\L&''OAAywnD" ͛1cƳ>w/%'':t0󎚉 ##c֭G:Sz%$ ɳ9!qC#4afs궠Cf?.`߬|R\ƺ ⟖sErbPbk8Rñ0n%á J`p+`-⇋JMcqs3\wOCZT_ rW4Td'rv2^\1c`pt~+??ꫯVJ544444twwSlklU;h]WW󚏶mN۔W^yGI'7i>;w%K#,ˊFesd`g`i MIG%32gb2E_N@HlYPia]RМDu,^b.9o`U9b ?#8md;GVJxLgx}N(kä<`FN_ tcEksss)п^zС]vݔ/>|>_cccKK ]hz#5)G}4~o}[Fm޲N8aĈHO>ٸqc w~0D #6̴||xXEp_TTT[[˫tˆIY.|º s5Пxf|!+6N, 04q\?IQ= P `gWe,whb,ctrQE7buƯܰ%9\ S*4A-Y1eT)0[hhfv]eee+XkW__O̜9-+f ))[жmwɓ'wvvrի;::233iଳZz`n1!CO.--b(v;,h4FupI,}퐊M8fOg SA1%Jmb [Y. Jwf+L.|h4J!t,p[{( +1 i[ƐaY#Q}D.>؅|SZf bcCU1̂J3%Kwih/>1i9˲N=T CZJI,?SG}Ғ`[܂;vdgg斗IIIxf@)yW냹ov40͓^BNFsrr@oooII ݡNfL)z)< %dYV,>|e]NO0u#Gx~%:ӑU|j۶<2)=mX=^oqRc@`S<h9oa`i8Iq/i11E<s]*G]%<[7҆wv+0S QV-54Z(*+8ቛxV[-f+v!b':thiiyv{mڴх)4!EAk&M>Rݙgx￿-''Hr Ï<Ȑ!C3¢ؾ}3VZ%lˆ)+T,CfuuutB!1w@ؤ'kÇvPn]W1r [f)$!99,Eۛp6 A1CupgӞY=Wՙ .Pe%b/=ptE \ +2 9D Bh pJ2d[ߞ̐Ģhzz̙3g͚E۷Ӎt]UUcXqq1^x VXꫯҝtnϛ7ovNqnƍ7oުUBYOp0ɲp8[#ov6~S8(X,̓E(Cf'Qbr(7X#q>\=sP`?gŕN|%X;w.c/3ggg|_zzzAAAQQQjjj$CYDO)߹elR65`m@D>UVqJ _@Th1OϺ:Ě`4ßfE`.}ס IDAT8l a4O#plr_yd"(Ŷ~6TV,7&c!0 a[Y4%d&yN>:(QU"-- /B=:Zrs;===)))999''笳Κ3gNrrr8ollaʭ+¼=O}ᔍ\`7_ =eQbv8D{v 33Xi6X)8p~=p3ȉ83E& +J^b?& "džPڀT+U8`V4{6f)!%o>? l(Plt 8:NII=  g*rۯe1Bb:;;cXggg^^.V+I1%84a(OS!c%-(Sx,YfH}RL5 U, >QM9i bZƤ=[/aṟ6Z(3Z138gLOԢ9܆pP"sV)B 9c6?!'* ˘\Kzl=qCXF4c[]1f08i"y1` LІOp?0H C&Ỉ:2JœgJR69DT!VnsB2C{T|F>Q¦0~4m^= h N5;fb0 PbpA=MV;_H^wuua:o-x h>g8E*[W\@S:f#Z>ۤ*{h'b畴[)D uƼ2h'=eAL/$BC zJqʍ>4S@L~`?|JǕ*)E<@?Ť@ m^jt;Hl"303v+2s9J2֑Ve Jޘ O \mfNgX2Lɳ>[1g~.bV,MpqmI,=(Clb)L[5Vʂa}@rr2G4A#g\sʭܦxb+/-#ja$n|Xke3o \Mե8C0QB̪^í7Rp"fV,`Ho8ʯb@r3ySr YAᇼ84?7DjjjVVHKKWx Vu;pv%(A :NR*m JP+>H%(A.%p-A JF \KPtQo%(A%p-A JF \KPtQo%(A%p-A JF \KPtQo%(A%p-A JF \KPtQo%(A%p-A JF \KPtQo%(A%} $+_.'d^,{lM\-AO41BZ)utLVJxW_}?s1:j͢8oRzڴi[lۮ򪯛D|III////)),G=pm۶m۶mݺfҤIV-Q-_ɓ.\x9PWRO?vX3JcǾ_#Wim Z;|(1LVSSywEkjj9)R֑#Gz&DXzȑ#PE|>_AAOOIIVJuttY17cHR{m裏.Yi5Zx_ W^}]w)*\qr ;˖ep ---N-Ycݭ< 9ryx 8j [t7P " :(k JP7J&(A :(k JP7JZjڳ[YIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot1.png0000644000175000017500000056605614620351225030343 0ustar00hanshansPNG  IHDR'65P)sBITO IDATxy-WU.1gUfOrҜJsy{bs6CQDxz("Ҩ ^]@Fc  H }rfjjjUɉ9kժ5k֜cA@ ڎJ뿏 !9;#YRЀRwCodG:kE s I:bN@ 븬D&*`{ 8bHɳƯ]ѹ g͡#QoLcӺCc}ejoByn7zwxM6uMϺǛA=̧hL[FC& $DCAN1k(kF&ͫa_[fYW?xhJ {nSWz h7i"#T< w`&RM-95ܬ27H=&nVL`Zw^C-F)%0ƽ4ˁ֒w-Q]ITb-5m"}|HE =ҔJu3 kw')CUO1|^j8lELإ6C\J)( +0ze"0x-T@@,gk?"b@%tnKlmze:z~$8Hd"6Lt(,#6}Zn֯f`KKϻJ n].4Pz<hPgC-0Qck@ nB*hɍBն_:\A ܋q@'{tOMrQ"+R_<<{PIO\&*VA$` DU0>PEllaa/Hg HcfU~5I` D(NBi1D0CPi0 '4X#|&@"`Nh+Gr)Qn|\SL?t脻g_:^a"sG)O\im-#9lvrn Iҩ =3a JcLoB)ٺ{|[ߍezE39/Y!j-"€& cljI2@! b &Sy72kU\KDN]tA8 T|"i 9mjyZкa k-Q`ld].k3]ioD$•VcvA7 3GO4r.?2vјՅrla")@1$&`Lޜ+}1AҐ͐ 1p Lg Ӟ{=q`(:0<X-Wzb ` k0<0qѭA3*eSy:0k\ "h0psQP(1!p=qq=+Ɲ#5Mcn5v A' +m=(z|VԖ93{鳵Z-46ct|:?40GJUUP׬?dC (/2:QZ H A,fWGKEօbf,"7CAD@.r cq0 0DC\T0=SYyLh'^|TD6o>;S{|nم"7El vӈ-Tս8G$[UX[E9ڒH w,֓Ù lX/A tt]4a|?`AP[{A q o%0~!~MA`Dl79Pc7Y:t4yc#ŗ4 |ft#nl8aљ(:#1qk+sgtaHLAH C;utޯu߽GW"֫ؑ;3{HUi J+ۄO)"\'lC@#! pRALK#7-!l͉B*PTV8V%WP4Nhv1?ցDi06ĩRb-`|?Js(/blv{@lrލ 1O& 0zC%}dl Lc3@2VG_C̔+Lc2^wn RK؜[;c"sp HI6_0GkKGorzꀍ֭0md!@k+p[߽,ժ5~PVB.F\Exʵ5S {G1LMk]mbFPm_;)Z}f ԍ.bY=2[96z᮵%Y60 iNLivG`æѤ0IlGlm# W1#;OYB- F4(a j(E yH5AQ,vG:Iɷ׵^1PDg0><_nVjW7k vrF-*Z"ආ۔FRސùj%"61yanzvzgN?t({#{S1ꒉ;> ewϮjZ@*ju(%  :3^kQl2r352B~փL83´nӭ.nĤRux߈r)ZXw 1iD`Qt (h~",4Qth?N>E02&!'Q]FqBJcxgxݍU_B~Ls](FqL}6>H:pclNgUD̃_iɷJÕаRZkflu3κ`;N:|f0V1ufn>u#$zr}4u`ˍOkOޓK)ۧ0*$Uk]2335dVOnH c#űaZ|{sJPhmT)}!-\X);Ƨ]vS@8h)"჎ 76D"514w C֬\YJĔH 8M7CE!TN@0~2Y-ip%hc9=݀< `k be iaHA] k48o"Nst(d;{(]3p Mc\^ #ba$5>4`j-M۲$Wn}!hwa%/t1\q4dX3 v%uNW;F' ©^av<\ yuw<6Bo MR+| <3XC(9\v㝡`%V[:$!g ΁X:ѥ3Wj8+AXlYfϢ>~`t\$"uH8A'm$UR ꌉoXQJV$d4O%]Ym$EFet1pkYD^D&l@:4P6XQju\%__mtP2(C:=c.\gKk{Cᡑc-UZ-'F T`R{MMPqh߽;Ϝ u0~T0\rǒR&>| V**Kì2/Sq`=iLxXw ԎXHmءAyEd"PJ*h2Ri_dSȤn`4¬kG$\g*ߨ8Uau!NٙOبkqto:_Z8i/pKoA amWm+"A^4kj~:C⎩39yVZ*Nrl7ޭvb&w ;Ѓ|gBVW˦R%{>f8qvXW)Y:|ЁK/Pmg-s-'M*OHg'Ca'J򼊡LDQ4#FӍ%}ht7]`=BuɦGg\W)Fk j=Ah49@$f̃z4MjW}fJM0ձp AR(ePuBTqxjߞsՕ\qدᝐ)@C(;?w[uTb0T(;:>ԍj?q Q*ŎV`}KRLx>Q2(΍yȡ P'j'`ҀӃ$$2rcҾ _ِx{7,n=hZlCVΥK uRsIQp`c,aɢԿHev%-s1 0TZH8=9sΡ]3|bnx*r1T(dd͞9qӵiJ UTXs֊4L\QK nImmui/!Qـ(;!Q6 D|(Qj&"$0} ['^L?6dDT|ѲULK@@H}-'aE'UyM횷r.]>oǽ94fJd`0`EwLp #3˕czz饅y8N~|z҆u°\.8yb2bW*_!VBdXB;<:|ʫ(?fMȖna]:b8^^;56GK MHHcNpaMYVЈڋVsכ&ѽYa 3zmqd9؀8V't =;lD 1|^:?ƺa\c|C8V0d-x+LFeLCc+CSv,?P_])͟3jɽLn:CG{zilt­zLOຑgU}%yp%*(oJPYB0_^.@Q"Tlp#NOa hLMO-͞]YZ&Vr# Ugم++ZZBC PR0( q]r.WG}$~.؞ nqwI襪dk?q0u4B@ LrA`R-4?r>[òytc6)b}|38kxI 췜BRFԓ [3sulk738= `Í7`ʎtHm0,QE^$3-9fHP:n f cI˥0\={bίե°q)nՓQ5 ݡ"|fnan>CӫKKƄlQ09 % a8u1={w_tME%Y 7zLN4Oj`iGV laQP{qTަsPśfxۣfcH=${pkg;i\K YfLI{4 iR+J7$(:>`flʙa/Z(D(ڔ"RiD$Ea(Qib(8e0&6(p7 BWs\ٺ#^z̲0 ֊%aP(z f+e7[\[U)v#<+:+p!FA9>w12Ck('IGwZ@uxUk|hH$[+S]#t[ֹO%)A}k'Q] @ oŝ(N@6GN+zKI tN?BaDwֈKޏbDxS[Ixv"`Ԍ!" ՈQP3 C'= c[<@ (%]pLGY <BI<A/MI IDATnP^ T.N5)IaV Y;37w^뜷R6Ed++puk.Ka#e50YWDA!/*٧ȴ ɲ![kBb>$IǺ(:2຅ S_m0H9 $?J^XORWj9sတV_c1-W~S./>-umGZi Dy]M0G >F"35 [! Ax,\XJm1q=cz DCb~xh|ͯVF&MI83h84?S.HeyyvvmyR%0AB:XW+\obz7" $@PM}Ȩ u}5 %1G:EZ].h9lڴڂ +Tn͸( 9vr\9߉{ޅ?[)|T9!utu33 DiFgmu{I\rN[/'z8 \=-!Ve !V29#P:Ш؂b(a$вRLʂl@"fZ-:"fA(/7<69wfA+Ư-|"x͇ix_suN[׫W͟b)ALy]QRh hS㜔?wͤ>"=NfNsmLk\ctWP9 57Gwvm4( x8xa5A]*A~0mn D;LKw`$~2wޫ " قĒefOIr*hDxiы /4ۘY0bc #N %*`o(ޓ9^aͻ!<iLk142V@mu٥e{?uBfxL.yEEk3<.\XEE,Y|L*Z7"]dFD(ߥlh4y`6J ڠP_-/л\_+|l:Vq]*Up%wRkmbw@8A,@ tRAbhrAJԒfy2=8Q2r# GS[iyk8\ur|ԩǗK|pvi#DWC+WqLمU\t&8&;uQ# YS=A"z&{T~Ka5<;[z.~HjvCJq`}XW~1sգhlÚg)VV;o!Z#RWKJ"i쉕LZR 1ͯtUrrϗ5c@0P_v+RJLmmĩsdmZZS vRB>w u8+I&;=ExBZ3y@p69ĵ0eRNV=چRT6~7߁۠'z6xr[\p AlxDaf ~y&ֱᘐ RJba$b̀U$ 7H Uҹ䶍&Pq9؃ Yqd@Ͱ `K<>V:yUŹReUB?4;V.+ў{K]]6=Yac Cz]I :BjsrEhKu*pkhbG۝\)'f>Nto5^)~-d}Ҩwߏ'|k}<ٮLHJ[QA.,EDДvM[}fADYk J(魱zuωl+kNji[I͊>Ar]:0A`V X !\;rtnvԂpqўR]uuW^~ (U0΃RB$ g1Y#ۖ\&6.tR3/iS!bQ 8saD=#x#8D\E=u52D;C.cȫJ%GG )BTlS $""BaM vï=!pFgFڵ2jz80nJk] S*޴d-`&[rV9uʪ_5Ǯbf' # 07$ܶ *#%2t&8VTYop( !P`foH`B9zK[ #}̋tLvNGסͦ(qRM(ٖ}6HV j`@>.ڴ[b8Ut] lU{zxC쳑}"尘}h6lEǁBUC7^022 7Ca @p.-.u.O"T L?>4s(aR)U3eh]ibǯ={ɳss?4<:bz.G9ˬ&wzӞ:{ LQ^/-I45K7m`,( $ y?:GЗgyqPf:lF{Q93z}jn Rv$p\لG U(6KFݶuӧFl57xyza Vx .>=gYW=e/-ZD/| k:/}iOzZhBf\Ң  u}3??62:'4 @s,###o}Cߠz綾F6Rldp6 P°rmĀCk0u+pKF [K!  No?C`JgR`Y;Ԗhx'pPvBO)@V4 ы~>v&;6 Ҫ](m 3Ң)ϝ:q̧ܡ{oW1kV/kT3AZC)^Ml@!(B4&N䌵vaq\PHpĦ-L)Ʋ 7/B}lpMufy*iMI|_ [:,!I?[789ZTVz'uQםKγ@HtCd驩 /5?T~`s?|EiMP޹k煗];s#nu=ӷ8s C;f~w_W>5r[ߺ;*Ԏpë_z%k D0666335k~Ǐkp+ /ו+58N}#VV߽o7ὟWL-E0C^Dռ%3/o'12{^߭J8_[Y=u?G⪻Wzg=3g/{9JK"{DŽ~{a.u9x:M寑i)C&y;3=>zJ&r}}'?ɰXXZ8rhnGo~/.y©ZOZkneƠu// 07o#2ڱjX>MʋF鳷s"z7%9'ъ?r'YgXGy]Qm0pcݻo>gx_~K{η PS9cHv }o[obK+7__/[_/N??<]g.nx]_X ddb#c& 4֞+:!y8ᵺ/F6 0%?l$-Hⷍ%vR*=FeqX )0#V~yᎫaڛ\AnJj ~햇mZpMC5wۏj(+~š+wy?~/ boGoDG<Og>b:ZR@kf]_G&'JRY0?7ۯx]__QvM ׾Okx;,vHU/Z0< տ?RSg篪/>~3ˇ>3?r9qs5;җ'󴙙ɕO/_vxyu9/?9?e]O[~'ZBqSUOw؊#T m;nڢ<(DA$U#!on'3r`Z SlF"D> 0P!}eڑ#;rɍAzʑ[_E_5)^;VJ/kwÖٕFFP0 s:?xjC}k߻/$S& ğ_|EK+>_{cf* `CfˇԂQ__}ы[vNuƧ>>.U7ٻocSPb&&!lR^zܥopVz3B⭏fOjƌON윑R pnhnnfBK˫񉩩O}|u/W/Wn>_K䆌T]z-GMINb_1^Aζ%`HR ]wAN5];{$` (rmQJFA'hnǀ}L|s[ "~笷t&3Kz3EV^!McgR cjtZO|66KkmMȪF;-7~sOs7kCwU~e/ V\rٓ/r-/x3_ŧ\{{+B'җ+ffzޣGΟ|^>?s&T+>-6)CK`D9& JDOæLEGH/4b: PQdR}ܱɧ;n(=Mice?GaGf+=ܝ Wn}- N2mkkpG} :9%]['ՖKoxۛnj7o>G~<*Կ~`WVRn2-_}_;zVcjt7~?t{w~CwNwwst~n W֋o|s jr?7{w8>C'gjro|wSw+[>[([u7<£w J/=|ǧ>'K `'կ<䥯s=/}k_g^ MÇw_?|}^w Օw!u4?_|%XWg~Y. APUSAiΩ!0m~j q s$5Be( `Y%. Q̫[ޠnqbZS0<0ŵ72uI$#s}7oF O?񎈈<}\) ]l=qdP=syG}+BJr(oT+cjĘF,--}*J(YQF O Mfm\G5-7=pl4bT韇1qMvf+{^7/BOC z~~R:@4c{z!JIRljȩmo֯5o{τ638$v"hh+h25HҟGLa-:TsX~k?gI8١m,"ǑÄFI(>'Jb kfi)6j]p `fuUSe6xCf\+pןBcj# p#o;lhɜmsFE4@Jq Sܨq$i[Y46.؎erP]GjjC,Y2a3ZT~=u"bU?(UkrE'9ԃ0 Ȣ\cbьRKg1 8>;MhY8qiS~cڵNZQV"AkU_U-1gA8}vꋖ{a+5mk&)G6tiߘ3}bp3 @P3paS rpsFLR9d :DͫV>nDi c @GTnkbɢO[}(kDۖ=LO$ a[Mݯzzչљ鱉Iurn+lIJ XAhC?j*0& ޛJeoB9^37EDUYY5PA FWnPK,X@,P+cĆ%BE Ģ1t̪ȌbzwsX?Ef~ es777;;TվPs2if\`vV]Q;:=WIj^?x5|+\7d("ŠE;uPD)uƚlY9nPЌw1/OQ+?ޯ?Ǐ<^{59,a_9x~Z?7/'o$fߚvܫkimښvnQ$L:0AJ!ZoQς_tH_&nB&+A<<k3=w;(xqrI'rSE̕ϧ9e꺊шǰ\TULXM-c+x\t=sTk.A?rVvA*Rx,kD"z=\kz@3 Rݠw˿/- 4uM9 5ZmBc%q^,/!^ġmXQe#Zz }bilx-V8bș 6Zj?C!0yfoX2tsX9_s+rˆIsr?WNf'Gю;IJdU)M'M3Nq>Q5iiӓGoyotcfm0ls)!ԖGP/&.r8#>\ y Fܩn~omR L *wѻA&5ٻ!- n$T *=;;cvȹK˛qM^W##qj&{4ǧ057sJ)OS*fR_>Ϗpcǯf]/nQm6w[ L>^aprw%Ĝ'XHQvv;]G+H몧̉4yyCxO& w.H}ԍGUU 쾱7?*>}[hhfG)i6=??/ f^leZ fNP64RU /? Qf/0k ;bxޏ2@\[{Sck3 جn݌ET@K J@ńE<pV>,Bn } 1r"v3Svr jm9LmN(J_ah(foxJzHhgcp ʋBe&!wG?O~*xdT&w''(?o/Wpxh4l"Q](R<:'6JW2qfnJ4:|/uEJNL(N`9LI$m5MuB&Hf2 ڲH'hYP M>q8A۲=Tn\tJuItBVUO9; |T7a %HVy'9yc'{ӣz7sf:~LHIS6wМNQ\sKn)ރ]pG`T4Mq P8ۿMU7|lrT`*-GD "zZu}G2wtw}c<=6 BfT@WLhv @W&y D$@ ;>p Ois1a{Mj$ʛ@ UKIC߻- ̼^Wqwg$%O>鍝'_t%UNrtMA%TQ څa*H15M)T@U>_?ɹ:S|榾4kS}rgn1cefk{Zf̆p8'>];hy)nF g.kzArU;SGv7|8cri]!ti;<`}Kg}ח.KfkF][F s;hn;6L>K#_q;./G!Ŀ曇oC56GǓ&qL8}cT2݋(%g3L4qTx|>jX*-*$8u?vġt2O[h4e޼8R{.df,2Hޗ;,=S? vM3d4ԁnr7Wĥ1 r,vKBl,CB/lG: >'0#`m|ApЯ)a9ga9ef,sXj'/cy9`֑fױCwͫF|9PY`O?} T`FU$H<%' uJq8#&f@ADV/tbp3c`MN1Hxg/pLӟLW њav*8Ĺ]dg[J"s`ev3sF](ΫX9uk }QY13Rg冟 A mHl6٘tp)8!CLCz]ۮQq{/3pkaAI Ӡ"{G;89!EE7Ovw#͊%(5bm$\ GI,`-ӎd |J$,4={}o`LԂE07<<-KjVl!>9zMe uH}-N6J6) ԫo8$ aɧvKĻDF?WFlLPZ[f_N)h2z6.k_ ap Yw G@eO/ӓb̑D!SP 192\JID5F㚪?~qpob?Z䉯ͿC:ؓf/f9lY9s-}p;ܻ/gئa< ;HKa6ZzG -R^oms@r9m3~F3Gk;v8[_2]cYst0) 붤 Nsn00b LF1}ã'~7U{;q5 Ɖ21LTfY8p8$Eu (ӜCJ`/^S]|gޫߟ7/1`+e)F<:1t*̏th+]:3Wg0z>WueާuK~[[c SEpmDZ@ RH>ofytNoԓsM =VybA.uyPZgJN?Gޭ_+poo[,&/91Mj+Dgl^PJ6;#`TS1 ;[w 6Ѣnvv6M "|p+-y؄_xJԺg}lMζ u5_tΜ,(12. s^Q,pF&?z:kW=zz|z:MThѢ DTKuOSnDP+AJ\4-)gRrx(0N}ߥg Y/Wh{+Jwe>\տ e¿}up~̂,Y<(/+Uf홡GKYΕ tUbJT}S0W+E@y@-ͰNNHFho_{/1'wSgs bi餎$B-"YS%1 Y,Zh4L×/LO^>4:~ª P#b_P=8=O g#ήKhyg.d hɚLjkೢg-S: 0ĵARm@+О;?8x%wJ0tnOTNS9@ze&x]X>+ fbÉUH8BB$pR\V*ŜwO%UTM&|hwwD'Oy8x|3dY!)I9KUb+ENy_ϽUI㰼ƚ_RgXܠ v]s lkٵ7wc"} 䋲72g[٬3+(TqԜqwoMNNh$b 5)D4,FB,NCGnAd*"|xA䮟S ᭷ߚ ]t^QF?ൾU\^"b[? ƙzkwLEOffv v\ȎԫKF B 3jVL /ɴLx~|x2L!g5;Қw@](>~PeMj:QQM%dR%ʃyv9!sEy3s{s^"sg|Gv6TïwRgBqr)B??$3k.Q\ 餾~]b{wMH2fi)fx8/s,B'trxtW d]SR WhQD -͍EYਦ6H*^RIDBG㝝ɉ?~{`f>: y7 u4֫Ͼk fֽUz9 &[^Rg nqy \h~qNo+Y-Eu}RS)ij4fŋǏ]ĀEAP3'riSRԊzSS+4OOvvDd22񣗟=?0n+r=:: !f( p;:+ yEb:xSSXܒ/E;]u)3'>lVJ!N sޭնnwώ%c) V%uMѦѵLަbR3*M*E\K;+NM.%hR~'?;/&y楽z!JRfD"#mFKvj31=-ZN)Wa29[iNjP>qN7Uu |YUtۏjꦽ.iw}uu:mR}@,yt۽ %~UCTs;\֥F98cVVv\ho>ma\PrVpm5WHũ)(i%NSHl2MoןÇܛ׀mQ{ X7p:_\g.n]gIyڞ3wsθMjyJóm/[rA?W6]=X {l >M0 R@i@I'jXVbiX.G?_R?o\1$0 bqphG8X%3ѪeMRr>U%JUf+"}߇x_krbTns->7gk!oWMK[x/̯>&`:(2(0\!ֵdP.`j IDATWš ܵ|ٳYY?<+yl~Ï/Ȟ[[L@1Ud-TRfl7Rœg?G{ "g`+3\E]'Al^77w@@DPG.Z %u3RPSdN)sNO<}Fq£/Nݯ~7s*V&bD`0CXB(m*+MRA 5-e:NFi< R9+fY;o:otjZ<~УYͧ*kcsy-QW$yf^?d\NmV@ v`UI.m˙V? MDgEL1DkKi0܊Z)jP/J99P,'5C~Çp_<~oǯ?-0G p;՗[r `L+_nbDjPϹL&OS IXy r3OʍR 9O42}\gk*"DNŠB=+nLCPP[.?0+K|j,YPR;l"8gC׈~+p#Jgmufar@3 35גv7cDΟٗ_{㟼77?_RCP!8xΉcLBLScKh\4-9ݝ)̑Pn)<%{I"ެ}5Nmcpu$YB]ظ/\t+sŷb_NX&[XG 'ξl츯V[A0pWɉJ2A@C/>x?_=uTo5>J]zxr2LYJHV&TDjn5*}GQ ܘ8W6jUUIi&ш$Vɱ 9SydRCDAӒ炗u6ǶVʭ4lyWk3fmkmN8#1xVaОpq0Ϙi .t?mڞ+-1K)Y㸲\T f4 %kє5kvkvAb#?ɏOȬ4Ѻ&,T, &U &xPq P nKv" [uiZbe2ƻQ(H45uY_*wx|6l-'wMlrHŗWm[:+P̯ 1({SE=W[=KK-I8w c얽:Њ9Jc -P-b TT墮k(8HB8 p8bFp I97(\1bt!wr"+ĽU k$@Db$A$U5hvT~ɏ?uPep29X}Gϰ.h:UܚYY&wOxY}dH{ytUug h֙F}"Tm\P#*=:,)Ɋȭd-0"nj~{[S>}y(% r25 q,"kOm#C" !Zn3DmOPF>0wSRfjVekMm@:zK|ǭvfi\*oNO^<!H1%8` #vZ\a,RURfBS \c 9z]󨪺&:Ե $4ٍR%uFjB `@qڱu/RRj*fv#mm2OLZ߽^=H  W]6Túel܄>xE[gam`y,eʲx5A}˂lr|+ Ȗ{ʆr 8" QY dϩ Ӝ \sULs6IYWN78Dh6wH蹨9tﻣO%58a! g4%uB$믘E}?C1U|nT!>붥_Nk^ w=q. ӣaL#`rwV=ki'ȅBdw "DF) ?0\WI͜%h+̈"DatkM0bٝ-<,#UF$QԺ1q!e%L'L⫯SJ?Ox0WQVYiy˼Щ% s[{Jw:Irg\gDw80#/ޚ-ϾTjADJVȮ(fJabP,.KN2*/oj얚 0YrF* D"`Z*`*DD4KB_!( 8c։ᆢ`ECiJfH_/.{o=n]B⋹n|]p]V<;`%pߛ}X AqG@|8pB6=}7H4M)q*pL`֦q(i3 $7޸W9Y+ned́ybnr. Z @d$u xVb8\{)jhsv8O{:w'$+<tY$-PA pwR%)KO?guIsotcݰڝ<.=:o 3Q2pR{J<nKºVC"œiitF!8  2q6嚺'R5ރz4& \FZRIYp!c" 5WtVGh\p'xVss5mOCbAgê9ԑMaV8Dd 2ָ*fl&zkGq=l,fJGrxΌXIK 8LuiZJm lAayt7fL_VRg&<ɋiIٲýd !$n n0afmKq+l " wC!m9*+ xQj( LJW+RΤjVԡ)gwOdm9R%!TmN @BsrՍѨA>Y5>؇C5ܿ.Tb`ÉA\|\a_Hػ*\wU+ff=E6soluu뱜si}牓^#LUb` \9e^{:0BݼϏ^ɥsN96h+N wUF3*tY]4==9*)khRFL;$!X!cw%XDT=\\S! (yYKNrTHPv"PCIϊy.-Qdl3<2PhAT"`D)Cˉ9 0D L6awLϾr}زMaXD\).yt.uaKNP &|qzrRNIi:ƚiNRT]AdPjp[۔;P, D5533/[5@ HB`p+(vԡP DD,<\B 6> T  `8Z5`x%Btl^R4izzg6/zK[P]E|lӪ́XM+bgٔ޽DސHdW5_5nDŽ?;=:T-i6Xɮ&MeFѦwrhq  )yy0*@vX$8 9e+YͽbnnnnZD*LD!sCL+ ^S[El6)0j1PqAR9 ӺE%F;7.@N>7N0) x5ի/ -vGʻ' FHFAnH*eRXڊN EgEx}Sژ N}6kY_P0TzAX xmcejp ܕyD|ݶP.Yhf:bBK* f6m:f2%!7E]Ji BQ`.SP?mbpCs01,-Du]*@R&1:{!Бܩ81P̽L6?mC( uDf.""UAjTTDUˏ jr@@[`BܤB7j:P '犒䬮EYyzc!r hQIi9'SaB)i %-`pw3Ldm611(Ơ EBxY n yo-ڲ߳y{)r|qXu@e8 [0cX(|֑)1J 'B" 3LXPF*U)QRCNzEVd[<$&ߊӕ'/K.Ȯ+^ jJU%%!+ՒaRQTs*tKd @puS%8:u`thy 0}|*  Pe&xq),hY.0shW!ufM ok=p(+ܳm04z§MC1-Wf'/ިRVCPYQQp9k".ewÝ[A0FNUUer 7[9Ps(w{ l L0d8̠ ;#*!DaXV&#UρлS3p6v\PZnNĮN`j$_&c,dwnZç- yܳK]s,;RO*wMP?gCsZ{h\Ш ^ 9UOTXk$#X-D!'5WXȻ$TF܄Ak[Z+'V퉋I2w J  v%uJox`u"P(̩Q2=:vsW2f{M Mt&i:f7v7ez,{|1Ȏ7?{o%I\+j4h,poy4zp3UU3_3*Z2t]fOP=0CXfDֳ aѲ1Y[;-k-_ ? BRJy-FI*#GU} Bf4ng0aJA E%6dJOkPt%D IDATTπ b1/ZEt(t9zJ —V2sˆֲF W^)?aN(;`_Vޞkc 10 ޢ4>`%͹iFX`]V؅YWjO'ն{̒9l܌:ITή-޽/ie"y׆QX=Ƒk";V؛kmȼ[ۧg?ƭCc#Y"(d=^^6zFvFc&[tNՑ׭vl] }Uz~>eɨT~NJ IRRq1-Uk }e~,B{I2s3ZoߞV@ ]yt aF  !J"fL tUj oo~O~_+ Ce n(B"T\سS޶X&P?Y%+{O\K}/; &|DB.+ S(EֈQW-H0XW08͒z-:_w+ˤ,?_hĎwhԒ/ʘAGvdUڸņdIi$N`B[w_ŷߎ5N\m)bЖRif x )YoHVU yOzCsJ$G5:TTZ3!"[ mi^yKYV 3QNvzg/03PbtS3@زOϊ/'vT"-/t}ȍeÏCM[˕K㣇J#U+vJPSmOx):DuQy},^.&eϒ*+kΌ:JAxt6x7Z?0vFg :+V{x;:D x^?'di/JoWpF֣E99rݣ (d)/o?|.vHd&m;7}5}]L2q]"RfQ@DٷIZB[lٰci3ūWBc" ~AwE0NO&[6\A?6n'YҶ}7 ^r^=׷A3O;Gm_`X/?4r}S9و=dAvh[v .O m@ ;ZV+ײ-Ƚ.)zCo34TvnC94vf]+G%n' `.՗]_Kvܧ?EXwDk;ghPYd@d*Ay~gE\%Ln #չgC܆4* DflP |juuG![@LXյņH+>-i> #& Xʷ-4G=R0ē`kbY}wӿ(mؐ3vWF&Α QA0 /9nlAv>c$( s$r]DBA>E [iBE8v'vqwH86t@zΥ֓>s |~Rљ(O?KGt>'CqP(sqSޟK$豞 )ңoh]Ai}IG%fE\ൔ?RYʀ 5 D>XL$M ] &yPa) ]DDZ-#{FY-TN.#\ PX)"JKGVzk72DVF>Im)䖙KX~O_g{7UGȡ#ŋOQ՘+.ŵ7/}_ ]#v※|=N`1T$pszo;^=?:aeZCREtYO~-I.z"vgι"B:b`AAKAtD$Ilߵ jjY2M`$֢k3fp;0D)K`3pԕ2"kPv&Ժ ELTbԇOt:iIy9~ +!pT)*[mo:: Ğ ʤ1$#sTU^#ww7$BOLOZ^_?'|(uDCvwm x^o-*a΀DыSck oo}0<umqã6Qi giL/?4g[O҇ҽO (xD믯D޽1-}xL.q MA@ -z^ҚK]@h L5V) PC*:H)̦ܦ@GWu@=aɁ*eL'XrOq4-C0^\V P rp&&O̔DL!z<}}ϐG.v cY+]lNR_W2`7TwQԠBo9 !~4 La5YM~4oܡ\Ea_~It<Ӽe|>"'<k9DCmQջ$u8ɍhh4o P̟j2sk붞_T#K)/C j wnVݷ(]̈DdGD ֣WL1 E)ZRjNR)ܜMIR2H"Fn 2P~ s~(.t0jv>w<ʇm=rD)]l1!Gе|$Aеn$n?gb{ّăHuH?,pRF0 %2h$a^6g$ooCø-Zbf`>/ɜ7:O |sW oeͳL5#Wie Vφѐ UY!(M 5{̶ikm1J=TA C a2d)D"I#Ek[ft)`tZNOϧ#\ hfc:ƭo (f jOP5D\-UDJ}-Rz]_UPFp~+lfo?6 O5fhp:89=5n=&<`ɘ$Kss to9X`=M8<}Lw QPwlO?p}m`7_O"n6~ΌOR{=:޳@HG:dpݥ:a (fKDnpYX(@Pܜ@kzZ `)dWX 5}>{A dlyz]–b-Z l}Ȟ1'$JOuy>=RZ4/ :G֡>Jn6>{ tG9Q4R8b(zk8\)>F_ïo} =4ܹai]sjW^w҃8aZry.~VQ_9}G7o` {x[X /޵t Ϻ pc$; ׋'f9~NM&=b|d"ռnC}OL>ᢈw,G3T~<߾o>"w(I#iyq0ѡ}n,E H=;@3hbշv ʑG@lBnyD8+>=BFD[t def""K6"]Z Xy:lE݊R 0rmm椘ˆwc#6BKL6rX}q5Zb̳D\M=z_|myU?0 .E{ 6K3#v ؠ7,i#{n97t>3R}b.?Bydm2= 4Da?Lo̬Kݎơmח|L<(ٝD܋yp|ZGfɌ]\_լ.կOD}DP : d3N2&xQYxZ>x92_&(!3|>_LoA:) @oֻ(xĈv>/J_RKuX:J9}] j!wRnE"\* 0Y޺螥vv5#y298nh,Dr1>:pP(U$IKJQ(ڀZ$*d_-4,p`mk=zVv1ڌ6$z4_ce@w`&TsV ^Tw+4yqdT)$r.Vل̶9xkmFT#*txWZ6Z^~oW?3(Ɲ3N4qHҢ ʄg@:3_V+'ڌ4BVᦫn@0f~Sd8Fx'G[{8{ (`7C4Fduz-B hR7r nPie ,*j"Z=xjY XZ¼x_>d=QU N@.SEDǶlE,32{|:y0,mo|:{LNbl\BqB"{wV)r8,@n/d.f-dCl4Od_$įE!9o@Kt\&$]`aEJ@78%ݕbPrB pGr%6v%'xYCߡ1z3dJ6Xlr;c* t,h,^#fBt őB8[;oB).92BG]QzZF&wHdHJjRH4߅b+H8ON Y /i" Vk8v5V H=:M"X@ \b5V"nqq&.\`c)&Xk_oWکn$t{îȃ`'|`x9n ]'I3j{_N€W_qC)4*5]T_{X2ǟAeiפwS}$^8}m]OK3=RKy*EwIh{i7 0hk_[*6d3I:PiJ3o㕯jg-ɞFٶY*c/Cd5Xn" XZesU91Af_b"_.!.8!S«_ŋMw-ZCpa 2CՍ)  j PV˵7?Xk֣!hmɌ+' 50WĤSVdC Q'cТmuɲm $4&rkۀpRmtTD*ٺև fEHK /#A+)&-ff6@cHGf' YaQ![64JS}6s> ̦d&%mR@_ȷ['#4m~tlcC,bTm8=,%5eЎ>CO`Fck ؤP=\ST7,k=C9p_pۮaa8rW}#/Oo)dyu|؅0ߟsurR2Q8$a: f߅ǻ$a=N)Y0)Hk``531Ӆab^xzsW>{ǁ}GB~xn/?)!H#"' &RN&ro<_~?\k{陱m 6bVR˲uD*ssuOd6X!2\Tso3-wI˲lZZRBBJEZjf^d* i:XNnujh/#ڝ2=vQ!2Z%$2D̑} Šxٲ9LEu0 pA*)Sz!8̹~_~vtjī#P|3jq _@$:rYx,}_zJޟ&ؔ6|<  FEG@ \ksݜz@ IDATx@g&o{`x#lz2Pi`񈻼~bfR˨a at(|_8siC幥jtA(Bؼ /P{H|(SQ 'qG*qyƝ~mc|ެL;JlW|Qz__%LZܖ(my##qJ5K g4GhS="^QȼCd_pu+?fHj;O<ͮp'@=JmX<oaA욐XC=!toQFefgS>}3SC @^0%3X |זFisnǾ;2[tQa8x9-'衃Zh mĽzD(2ZMבiL~"׶+ py^h4ߖ~)1s?Sv8k˃?޺vP?`}.q}=F{?dCº1%d<`HC)ppZjWC&: t'm&y\z~]v~GEH>0citq{ ~ 4z% i~/rp΍irh &?2kwTv4 9$pksQC.ca`֑]V$@{uCדF+ `saXx$+.ђw" "%B *?wCĊc5|ѸUfPm^"r{%FB _o7^~yhŋmm]<򴝷qV[n 6"]" DJu8Wa:D2܉$c 6_j*eiыyMF;- Fl`eͨVH.q&5*^G0Y(r@"Jl9=ZϾ,f ){ZUXҳQ [luՒKTYf*SMl5z,'jK]j^uH p=O 6޺/2ouWy 4+Eo 8wsA-,?7b%F0"Bj%1=U qqv!ooӵ5zMo}Q`()dzBCށf8P]2 +$9z07{fЄw|g8PKLY8 CzȼV4=3ԇcFhI*,D>Z%᷏ϣ1ZCPjJ>9y8Km]_u[nz>l)#޶u`.0&5%\>)deT&cp/B4k6"`%[(NRBa5^$j1A*HTD O>z܆]Q`;Z _kdPQ"#j6نv3^/*v9"DsTvr =C`뽶3Nrfġ c[A!yQc熆iJ G!z ߣ=`1>\)0L˙[¥_rtʧ@^qU$uaW3(u'tP]vaـ9eri SHSx`<|1lS@^kF:Vy{@-^ x2w/NΛTi.P1r>z>CͿn[׶۶v~ٶu}Y1zSYٔ Dt kߪ\Z}9M(>1Y2%3pr5)4gD(4 LhdD EvNz?퐙GD gf%ץv31wO>pi90]ׅvβL(v}jn%g|4oeޝ.=*Y]a;򲞷1;_Df!wz!JiP0в$#I (t^X۶n˫=ק_<=|Z2@Fzk FAPʴZY֐탕Jc)jWF]m$@N}K? g}Fv@vS ';|1o4@ֳ> `ĹR+ާ9XOt#uS 8Kb/;>s݄ cneYvwmpb~o^vriiMrsdIuPm&{F!  E\n,N53A+ow`Na ?1 @mٻ1ҧ# є%t0^_֭kvnu]^JI~]7ezߴpea2oJ#O. uhtӆ+kAkʉ/3F@#c8C`gÀYt+ ezwp2 bo40axȶAc&)( TL▉0Y9 m}׭mɿ믾>nhi(=GI-j8޻Wkk'iBO1/MI3sjpXq4܊_@G*'wUP͌QХNc1ks[h^k5g̘#7rL4@@N#8)#`=45Ey*G%I$x)`Y||#Nlqb^l8?$T>bD]~u%bc01v'q[c]jݭ{7kZ3y5;[7U=R`i#H \0-9/Nha 2HDLhI'w`< RL<ŀV"C-4KQ $G->70aa0YXG$ :(ŽIѭVkmi\?}vusɣBSj !.9Mg jmͧ)|?Zv熗r.mٗ^S>6ыdxU|4"@7nM=)U"`: @3 0:qhk).70,ڶp dTrr܊Y@s*pJ^B [?۰/&6ťS>Q$4A)eK@0\%99^"7N:.nejQ\de>B(S @!9?Xyu% ^q._E뵶úcmV[?x_{3 svֺλO$~{s91<Qև b8w(FĤڣuCss*TAꤓnQ"|oM QQ!!TᆐC*TbP#ؾ-h*md;s. ;Ar4aZHd D;߷V[;S}fZ2d4'gĦz`YA 7ajBDFw嚓8ͣ_$fÿO6q|x7)߶O@"%sco9+ Xb6U9 颟a-`(5ug0̰?+0z.%OyflcC?9.LiΏ58ٳaw؆!UhF7ڍ}~Bi AU@L|]?-̟GOc7L9|oc!~$G dVr }ny"ytR<* 6# 2N9oB 8" Pt:5T.w6f9r~/O/[G JR)s,z:˳D'k5R4QInmq"ڹXoT#.FA8,ęMMtZ"'ғ/Y?Z=CkY=yu[kkW*^)I*Ák 2 "p!7]0%bN8HV!3 f#(ðn:6 "M$9ew#4i\mO79I[!w@ Y 3hC\5̛/(4 &R-.'wwZ[_/{&ͥ] tQPs' > DYi̍Fg#{X3榯 |?ǰ\l/8oy3#_y~aj.g%A41hLcB92zA ֶ!z_ D@m"XK>҆艪~" сia°1]$*?U: qx 12a9ՀTt!E!J.%glgxo0//'~"uBlt;= IAtn=$T4|XDͣ(t v$.DqgȻx\DxN퀿$P[U" IDATSޒcMsA9a,[LvNսG2AN.o,#n};lDq@V~= ]|II) ᧆ7bMo{z]E 1sy>cVǶkݚZ{[ifBH J'{cWkU>d ^mn (d*$H@5;5`lPކ |&ȔaPYh  i (!.jH޽;Z C3ޥ9#%9cպ?շ4-s.l7@. f384JDPrry5oz@N^fwju )U٢qOtH!%)ܺfp#4{OZTTSy쳵'kYDMJMINO|U?]YP?YﺤDZ=$A i!h,1cnj趏x'1 IC<#of1ݰr A p:t?wϥq]z>% R>ͯ0; LoC4' ip}Lpއ/*pxcƮu+Pdv0¶Jvf4뽛YoUA'NJX8Ż;^<{ڭk\B¬ T:fŵxGgϏ"Uߨ?i󱨐xJ[vB\&&$)/+d`7Ϊ'StQ#vws;[779Zn.݌#ZI8f6#f͙w_nPaഃ!: +A &{IUu*Hc#ENgn7Kd (ܧcxަHH>*NS"J$tn_P*' HxJ5QeISWqgez*Y?v\d]zwWhS^5o)ɗǿ7?]= gnOGOYm+;lt,?4P ! 0$\ <D&L#8lA&[чPGƹ gN!0^I$o۠]84Id v1Sqqxh>{d |x_ҿ8V95!^ɥ" A=uϏ*AFp$EQn{Y&hCիew΋ZtYȺŔ]dpSfgz-Fg :Ni@'qf'1gwS+tt#{Oެu VF\d'D:L=VL[_okﮖhNw롁ѭ5 RnRN)s!C} L=Zn+ׯ>~9id ґvИcLop@;Ū30am={kk, f"D*߀RD"G]d`~L_)+O_详TK۔<)OOUUxp>oYD5e%yOڿwϿ)kʿ;} ,ּ&TRr;Lf"T8(DJ%e$nIrJa d)E RMGRD9' [ xwD)EE6SPf("X2"D&ATgth\ ΂S ,1dEq%[֣qc2ڶ] B"X%T!_B(.!ހsXeK5_5@D'yF{޻yC[׃ qmZݻљ<So6?] \nv;}♕’s7džWA$n$q2HHb8@Y㴋π R8Y %"[b$ሠ(hlhs)Nz5ލ6ba"dWIE .M?_gOrmb%Mҋ'Ϟyw1_(ooS;_ې,ߵu,o?w]pS*PXkDz7K`2UaK&9.I$"jZ&iDzT%-!*æGƒ9c5QQq)yw@2"' I8*)La$0$vR/ttJ7 Dmlr{2}om39ɬזA8>msSn55qp͙?=\CxOt%B6ZL J}K_mV5,Z`) 3ւ[wx"y~}}=-%/q "y3xYDD3S\\\UD:BIV# ~X M%s~ )w"ydd NvgX@s. b-e 2 w9c?76Mjc[搨n5Er~xß+5)VnsHN[˒enh%=$Z|=*3yb[D;Tmu^#C4`_pS)F2^<-` Fs !_YeY!ӫ"SiJ^hn [Q;kuFrq4pgjE|Wk+ثYTAn:B£WRS7;Ux} [ Uϼ? G Tp |̩O_|/Ϟ=&^.0~ N7M=Z$yo]pN]6_ڱ6[rGY I\JRDuQT,ǻc4Z|*R-) 64PY1tz>msխE֝޽޻3=,}`Jy^nr.S$C[s(iT h$M6DsFl$gLʋzJ,HB̬85 o /vG~x fnA2  Mq{H{tT(b'S~=jd+~wj"<ݿ|u'z%k=ZI5M AGuhF?4N|>C%#!A{rhAh9%n'@uYN ltox&YiК}Ÿ7;Z\}k7z8J|OϞ}Ve0Őz\͝׻} 쳏423 ITS )1R&:fKRFr;!e#u"GdH箔ᆤ-nf'NhaҼc$!VDs F[6bU[t_<-+CQzW@A&KTPXllf 0WW=ݡVh\#׻F&;tCc[5'[xAz ljufo~wD'D y\F: DةR| `@@;]z $m5bYcbꙓ)(MVVT$QDT mt* 4?)""[oxGoگ"/~{~~<--X{~Zz&k2)TrQeC?}ο+O_}Sh"dAc$"˼iݐ54TGh)Mn} UU!kXPsZV+4@߁]td0KH?qjS˕GCWWO$"{7 xBܭ/ b7Bh< fFeĺ+SeMWK;SDa)%z=ԁk$/7Snn)Ix{΃%)&P[YOG;˒5Q%ΐ IDATVHHGoL@Bdx*2n{v{֣\׫4+x(kJ IF -609Iga ꧜ُ-R\g̤ p3ז+5ktk+if"5FdZ5 ݧcOETa.TemnݦiIKrTW$k hk<$vu3$ biV{kx1QҬ]S&y\&^[ݽF4dܒ j^kϧf{WGabE'ȉ)U&h0J*cxՊs)"mo u=t2kEeN C{/^z,e)l$Bq?tTQ]<(˺>ӜYtp0uW*R |t2mEa@)lUWZ׶Zt?KaH3UbY^;u]oZNZfw3,͝pC=DwyKPp QM2QVY!ĩ85}"\#__vO}E߿}u]EJA)35S_~G9,"KI IR@|ʔSN"ӬI SjG?zVU( (4u6ZD淐 W6vRI@'^f0EgUv氻=gELSL n̻-DrC1-DJ*HSwA-y+P˝kkHYLLLѓL3ʓI "C )]-e )wˮDMȢ tmf$M4iYI KAjd!]PRFJ ݓDf$Yh@3S7)?ǿ}/{kȻO*tJ֩ȢIotgYHm#8>M%E[fVo[!H/?mu!RSR"\]hdtc!э|*i)pz2KҒŃj,zzR@zU -hOLNWݴW%z5kX[#I'95 @R"9eY5!Nu+#4by`o[CD6ĺl"$ء#%XSfy~ɺliʳ3ENT.[dk, l%3l_T81Ͳz($:Pc^vD/1G ?lV]$" P|q\Œ/[cg1YUkw&ձc[JL2 $w+n@" ! $N'Vnw^kU1n1/K%9R;<=]}i i1 ITɁaB(tj@yLPۭO/w<.kmKp*L H,Zx @z $=-:ϳ N}W(!!=weCQu,M h ᚙ6 -7|mOuf2CH(9_?S/S l] VRL^>wOޜ_Zш0f-鑮s?6_])D%f6,TKkNyv}c~% 1K xi$,/e,]uL=mĉ [`LDBnݑy\sZWp! Cjf+iP`ؓ >wFGa!!k@yv8{݆BAVUʡHB2D=sl]m~V/\i GRHj$X<u PN\0lTW.Zdh 4 BzO!YFVkm/ogKgBdEgxx_W?ëtk$M@g>  Zs MY==)oOj<-e횵eD'ΩGn:FV$.%S1s8$Ed@U~XxZj @gDчr9)2Ru&e#HR@Zks}H,4&3Hf9O%|%39Z2^Ԟ.}i9Ql GFc1#& n6ϩB2mrE 6?gYC^yiB]2Z@T>P+\DcbI]3L݃<cqR߉yL*rސDPCO[x< 3+l2au/Mq3o;N]VV9]|.{wBX2w cJwCidŵoKm6|HD8GVT 1"{)b U|dR {D NrweBOfFfaT[,_"tn)4 9(-ql׋HK12 ,Vy<#>4LMp*cӘWHfD$`p*@vH#{!d$Cڊ$#:" yc|)̙qwxvz>Ca$M t/}/} 7c_>e>pZ1wO|_?}}K/8A2#-A"ΗH2ËJdb$L bD*R&sY~^`uL9l7wFD0pB,:T! 朒AgCW7ḍ@fj$& =J J^#%pا{Vlo: 4i: C35j"FqRFsm ~5jMj5gO^, qiHđTJz2:E$$&RԽϡjiz s~p i(B7L5q; j*?XExWm@Z7qLTy4,4Lj|n"FMyUne(gOO~`}G_@6ƴ1|L&Nï??>amm]R3/Anۊ(ei}/ݻ͝HD@֚Nw>ՌG !WfA2L7HE]J1V{d1v HژKc(#[#X&:4QjHR $Lt +'`7B^K<݉uveB"AZvp á&xBPZ}*E}>&*,+AMJu=NQ͔4ù]jTK@1 Rj6wS8'`b ,Li̙)(o9D@@$ {Cp)/{G^~_ş7?y>_ ;ĺg«%M'p$.%\K+oNn3%1]B]iyAs fF 57vGn 1m9CZ>>"xz8eߥ_7?P3L,˜&a 9_TPx ҮIԶhjAӧRW#""P S7vX `˦\ BBLDS nˊ޷/}Oݕ=v:OqڇAO@@b j5pm:@DarBNdLuµq9ydߎ C ߭K-lxˆD2Ђ"*UF&p7#L؅މ*>޺ F@j h`xK}ywŦ@kN%y_ p@ LK% @Lлx@"&k?x?y?y1uӷo~? >/[ߦC8"7~[og?xwwq=׵ H[K+,XOC#Qb 79>|?[SxdK w~[z"mM72"؎gtKNDH)Xm& r$Rrʱ99!"/ |L0mPn*DI*02$>l!Jt+3';ҍ.fBŌj-tABe\L 2c#p꾫gMtA3x08mHk̰XD̴tL@$])iFbc2ffCb^׾_ϯ/]ǩ}mwǗ pY?M R8j:(Ti }p $bIvX bul9˰ҹ.S22ʛPm1cCnouYP۞Sg]v9Rċd: ̼v)CnjQݹjbz;}Ck^o]>ANG!:vR0‡Sw͕TC<)O's"E1nwO;sߞOǜ@\{fCt1fVDطOO̹_|z|qkB@aI_r ׽{[$"hmYͷC$$شoXj[錁p3Ҧsr(DF۞D?:^<.O˶McEj XXՋ2uYK"s13ߵ tTxfbbRVɜ$ Ej"Cxޤ "OYДBSHށwDѸo) i˭ct(P"oҏN>I I3s3'Ϟos)oJ&~__BOo?9iv̧~w>{ߟt> h^_7]x|u-k9 BVfZeYԉ棏0 -mZsWﷻی Z`0|1!#2#*,}; g#jA˂32Yl(;;4p7 Jh鴮.™AmK(u,P $RNB8,u؟t,%3ar[q` `Z> tsON@PijY0Pmnxh C(1Oc<<{&b)p.N @ L)0Y50܀rӉ(ε".ǂD]mAx Mb&zۜ2PL2;O[_/?;c_7xՇ3 uHsŊ@u."竉뜞h}/R@ )O(% kL$3nLӌLyF |z:1ױL}NȠ—t>D,"u9n"Oz'tŦʙ|n]әѯWsw3gNz{ݱ7ӦD^׆1"`*Z&}S&&1ue}tEdp\t .yt4C7_P"|T*R{Enmo@ 2@bp@׋7|ZWK^O˰ʘ43XmR#`^Bza'1$ E̡`$q_yO/c;z9ocYꌘa{880R5ֆ)]5c#CJSnkA@fF><\օ2"Bjf PBNDT ""s[i wOdvӞ2֤t@fx~*0fh<&Aw~uxxb0}  t1/?]סK_‚p|RH 1ǟZ/|8kY dd RÝƶ"ferP+‹Wz݀2R|x hXpm-$9=nܚ rd,, 1fF&POT^1;J+M%DƂ "Ga#p^&EV5@IG2`iLp}DԆGd!p/5&j%9WFQDs[$c!ÆB2",6 'ÒNEU;E؉ǘp@ 5Rjc9#ÙF2P"t/b@ oHIͿw6Y v =^|D򉇅o`q&SD`SǻV׏OCxl=T`~(ȭɑdMf,IoN5S DٖO{"nc},@ C22*j_a]v3lq>L|la`E aArܶUHr}`dDX}N%zeY SM܀(]ϩ6Aa'ys'oNԁn1KN IDATH,="Us*N謸b҂W2 z0VK~'̵yz*d:벮#w\#< +ѹ|~x}Lଈ:R4$/W?9>zsO2P S\G$CNm*BeY/kB^or n6M#|!xb+` KFZ)L$@(H Dt;ڋ$`]&̪ :N AZAd7$DEHSE !3k>Jdj""0awzc~5}_7W_r>$ 0:U#,÷_g~r04bڑrG}{/ $R,oߜN\%!K+-`vh\!|:lrk6j -.U), qsF"Df) bf-8ULX؝ரR)HmOSS* HD rGg/f @ IF0yKLJ$L%҈:B [(8@A[sۄH5PF>oR$X˺_w7rB9PBaaB)2 LaA)r  ;W QAA#b]ftZ%nIEhW*6 LdMe  JWɷ-bs{ci@OͶW/Λy b3.[R~\LcO}OO^KtCTGs@BGPws@ީ}k+.)T* f  xwzCz&@K&B@&FVA L+y<"5 ";l@BdƁÈn;L i`yK[|_r!$bDy*%Ͻx2|qRQ_fc)E|Ͽw?aPJk~/K-,bmrhTbVFhϱ2lñ,B2AG/tC[ 7X@NlK͐<4]^,Y<$!_2N0=j"~VCGBYFd/ +`I=B#p% 2GDFd! ߭s(w+/ӳ4a!Ȁr8AܻM!RHX[4;R.30X֥.O8TcDx8@@YUf@$=- eGd̖yc+K]N4* GLH ,Kݦ@/gޫmET8%͆Z #eaֹFRm䗾k `ehAXGcYPmD&*ے+ 91w @O֥n:niH9Is)ȾPlz(㪌Q0^}*lcA/CO͐e1"O{\Of{O.m3n")Dic]d">wXm>&iX"LS#1ǵk}Qr3(|;N%*%xtPXλY|c:ͩ%iD;zF&5 A?iw8PuoSu^!!tH9W }tnc47tŶ)1ov9G;Xg{B }#Dvf[ޣnp8,0tNi >- BH"7޼@[ 􏜌;+3IG:T(92 Ϻ&d"3JLMcfčF|bd}m9gxRETDƸQ>B|aat}j1fwo&k֩K9{Σ0{qm#S7X,SBhЄPzr_9#ϡ"fBSsG,`3 7NB5nLSz3 GPbi`6p/iwx,y:)vHQ "-vG$nVH!B46Y Y_Cr'H(Z!*YD;A#ɐH#rw0LH C![3,+D8< L"|$@Id@^V 3@-_|oyq7[~;]Հxq8Zi4}n;p-Tcw"jpjX(\e$r e3sܧ3qt#8ek-]sؾz@7LDM=Ct*$nƌtL狪:%cTpv;uu[$Dꚮө/́EC< ļ~fDp,Kaӝ3i}\%ѻ1g]n[m+>-Z:q$ $˸\{Ḵr}@ ΌHclAН@Gve֯ %lX{.̨զ#`CMm +<@jtJb]/;/t>^9ca>U!=1-00{/&F<6]."@ Bwwwww3 ܂^ AQ-Gp MLrI?yw]+Q f2r65  ( !ϊ=1(B`ƚج 0!'x<>>u۶]]2* 9`zDDΩPKWXOPɞ:R2 僇 IKP#E[$am\^_1\7CD$[7 iRt$ 1B9!pZmvMgwu >DHyLiIf&X|._f,c,CF3ܱK1&rO <,sZcx׋r)vӥ{!M9XqN1R}x3ӰbhnnKM}Ӏ7m~9yMu[ѶL6mO)k"<<졡`H% $RH"W޽ٝwDƃX08ΎXkXY\="̩w c΀9lW1ThNUf 1+5cm H̖9@~M2nǏ>??} QYrγ{JU3l_z3+!a OnB4IZgXqcLOB'5"+H w"n@bŇ76bdqI-P30vMg\` 5sobD4le-BilZ <%*RM)4NԄh[BTa ((+JTҶBt)NK2>FRW󹜠k"T ;mn *o;ALFf1mgVߙ,\ExSrcKߵfTbY9KaKek%Œi1-7mqt{~+n'*,^V5(!1%0{P?$t/\Gji QSU-\\D,sFcF9IccR-Lai p̑v΄Vf\3Gr^\Hsf#3GwwOL  Ep (G$Q,Lwhw?6{Q}3jHQ(1cJ˜ݽ)Oy" y}o$:I`2:&!O?|Ko?|{yx>vԌV8sSFK&Jrmofa=4 08 \Тg?ɲm$EEHT Jۭγ{cOauD]b#@Za TjZTO&g9 IJf`$0!UHBPMH1}am1+% `]))Lڟ,3=MZb w)3rR:->>VݻYNj3v*1GXgFB",Ki ċpi2#/]>qAVz/Z)U*'5ٝ~vw 9L&uN$(r8۱GoVEZ77˵ݝyy㚑eA(xlw(AyXkz9 H@蕳vDfQ)O'vRifFOLncNiD 6QEQ^uj'Y2Sq\/ܯa3oP1K_?<3uJOsAf1./mq@rݗrb2X[[N獘"d`})$a"3 3ihM$!I.@ @n 1"}Pa|%|0qR H&`B6 ILixfҍj7۟qd'K'rE)px bcLt\& x(K)Kc۲"!za?xy~dBqLp?F ݈ b]gGgJCGy#a4$0*I3uQfb+0gIT tALqè5G%30}p ˘$j a^#b92{q,>9h_BRUj Zq\DWRS"T38i[,2sMd^k"q_pF}I,uQpyrE)qZǏrquc |%e^^\B1-_ 섲j`PdaZ蕥P+JB1GAPj[t"^JPemK屶e 5ɠRRZ2+ Gm*2J)VTpNZ R*Vu?./WbeT<B,p @)mZֲMw,ozL ⵭K]"-x rni5݈#3oG A `6a-xnp "0z IK)nCON"$#'n SVa!n8$) IRc$!`'OP @oG ?!Hq1,wt]^y,˷G{iںED33L^/雙^fIYZ0V~,9-\'9SuMv%LBJ2 f(E(,ij'"ʔ3iopLL/I:SKT@ sIB>cZ#Q8|!(_"HeYK>f$<\b-La1nCjFR^U Ltf}9 IDATIlvjӝDLCqYNKeugՍf9()40Kg#KsZJ3 Kr@#rH[!2tVN$Sp$ruS7(3(fƷyU9`QR˘/'F\}nY,AwKZ< FRNO{U|*XpwW&.qzZtɔk-u=e[֦2fWV-Ekտ>tڇT_{:HKx9M^4R-~%Lb`[eV9[)eX.gKm7o޺imFW#ebP&5E Tdi"9r:5s>4'@˹պH?';ӟ?|~yޏ>c\㲬+g"D #=ܧHJW_~xyv=|\`-,yYPt&[UarDIp Baݚ] 0"WA bțM3z|[0$Iyk1PqžWpߴlpMc:w~Xn  IDD>_ 6 .at|RWw#9HQ rPM( fܯo?ȼg7 dxq[ns̜vcB$$!HpUUT=U2{S%҈-=3y䭑H2YUi2 %T ,(-q:>xuݮEre^&bRk%Z2ka0‚21G&~TfJ+#H8|*5UICY!~tPlېZ-wsƤ1}dB}l/;3O>ɲR~!EjYBjoVP5ͭGΗT۾鴍y@ykOZcnkMI\5rby=hTTVy-c˜."DpwRX 4x8sMR 7O"qy( $pq+ѫ7UedVNN=Kms>9['HG?ӿH}s:ϺVmT../~?GAQn=2u &G#beVPe.wVQ8D"Z[Md2 2 T%x?|[L3bP)"lΥ6g!(h3@ ")HN2AQ]w;Fߤ:Rẻ1崔,FP+%$V-Y.tR98b[ټuI,s"}yn$ɣֶPhB.H[2 L @J J%wH"R%Ƌbtf#r-M"Et/벭GBi]'ZkI霐0@J~ys&g8@ fH8s݄EbsJMS%xz{1.-oO5Iz>=~G9߭|)E~GZq03/UoM>w^KSd~E=4Rmw'w[Ǘ7OySI/׻ȾK#l bsoܩGM/uaJsݯL/^dH~1B0?1żq2v$4QܙIO+3%?{۾|[`Ԯ/vwydSN2_|~zC{*mZPG[8.Zt"sײUPk=d!Y?ׇ}}Dyis3P]={jDPRO2wI~ه&5T-ڿyx< IQ8##^Z]U U[)H!b"R!J2JdBZ|!o"@Vs槪8"FI0xD7WH8_KN6!qT&6GҭH&^!H , aÃ2S2,r88#Ei_Ozz5!\[Y֯/OqSXQ Ef&#!AD"*y+TIH(CdNbS*pu}̬U`8xDq*sQZ̔Lvp$B+LWJ"J1}X% ETz/w6&]Oڏk˷"J 0鴨pU"-[ 8lٖQKW)Ur*˱y#O" 02u)0Tʭa> V$3Cit%.{$pۈ0$nea VMH]R"U[2R~+J|[ӲjCDo%Yh޷M_~ȗw+"߇iߏxnkƯޯg!j-~ZIyDBpr*~޸~[g߲ږߝ:Fy{8-vvUF i͆CI}v>\V1~n9Zѫ1|wsTM$i /\ kSm0DUcH*Tb;_/tKe p"\zl|~ޯ#X7~\ys:mu\ƑIy>-f7z,OE~Y+؏{Lv3K:!$>F)Ņ[x@8uTgWY?6 ) iYMk*T)Z CDJ F-%bRJXx?/snOOe9T7&Hө#Q6o=s(t:x[qDd[.i:"B0'EӧW0?^*t$݅= dQAJZ|ڶHik%J Dw>_~?>/5_*^ɫzqno099&kmy~[miYG`&e bdx?pvrt^ϝ'͇g{xɴZlw밫#!|/Y S [#lw||Ϸ/it34-MygV H\P\Mam/߆STH KnLZ ke- aQe5@Qx|3qp@U艄1@:rR53U83E #&pd׎-v^>72Bk!njAs 'ܪ0O @dlLD&#K0Be= (&R`gK?^P~M@;-ة <ۻoemǵ"o|;Hhx<DcfflRa#ӧj aAcFy y[h;6/;Z eDXB/J Zeaee@JU)LLKwJ%:Fw!>/ņ ɧVG2IoCCzDdF=!9f(5e]Jd^/T\Kd΢Ť:ˀpUUV HE+5e:!9TUcm-4a$SP)9mEOEvbR|\Jc&-s]T4mDYz)u[!o*$*'΋^_zn}_|;>_s)OTk}unܻ(h^ =YKfz/zͻoy<7*LssY3^?vZ_,! bEe _ 3~p^lou#TA$ۻ297o@/.ߕ˾-UEm6Iz:q|~13}x|FwcN1k]zm ܣtD5b]o[D%+k)EiY499fEu+EIF\kI"dR( MUtSf6.*1,2 EǜU{8:}(ytۥzZ)!Lǣ+ }w'X[sG~*n@um ᗗK]gz8A1rV &gZk2G,ݽY 23 {]j{شT3iS.7jW"^ʻ?SoXx{xDUٝZ4ZZh ̌ $zAhqA h~}ZjH2VQ$UGe>} ?>mYTdOӌ;1 Ղo2KMUI F*p$eNT  ̖~*6`PDLxZ9cIdTjFmR>,cD>a{Dhh8ӼLT/GsHaUΧ"%ׇqstEc*SM)wRU^|Eh>E&BUJarH*"A1!n ;_Ggc 5(D ƂCH1=-#3f`pC'~LH h$e!"2(<~^v CN5FHt"p)/!Y!%[S1At;<xO A̓2E`J5PBE]2!c?(SbxDv?:(!s>п-Q37Ks\v*G@/S -0Us=b6T’pcR>H : f~MC#ez6J(}#T$@9K `Pfml$;saJJ$2pkLMyn9QHbgLJ% 8'Boƚ250({x  3[+4i2 5S|?\ nG]?2N3 k8vz>u~uF29ѸnȥmIh}i\LK}k}W~?cVTz?y˻S9sRyt|,n6٢\v]ٶNN!ZvvYX뷷<۾ioeNlݮXػO[oc^p|}mL˺#H&[V5ϿP]]f_4 onEGGK"2.1j!Ƭ!Cm e^ReLH\RJfb:+ b@Ֆ,[n nHLbpRTBlf"ݘ.z1"2D~hi}޷= +x1S(Ze"@"&D[{7GDLH$T̈`a(""ԄD4p?rA3 ܛge &<?9h33g@ Ò95>T4%Z֊u1|u^oRkBdȌaSnH*|m L{=N>"2TC2Qӏ{GD wKÐ$H؛@xsMiޏ*Hz$133 s!{/QAD{JI: b 㩨ߦ:"z>C_QNe'|*ȎB u<:|w*ŠB͠uoS? 9dDHGLSݶ[F&wѕ PAi>Z[OX~?(ZP"/7i0/ EG=ZL\f#_ XtQ t>=>i>r_`Nj IDATtۉugy},^^FFӌ3ӏ#чc8&(JኽTU}Ze9DC1ekm ,(*M THML@̓44*S]2p84ͳtNJlnɆ!@eЈ `f•ʈAߧ $B#_8 ${l2#!F@"+@ ɗPjqO~SBSEY#~@$JJ?>!CS RӇ?2- !4j>R5p(Խ? K{;F$a8[W L(8UP5) C 13MkݎgĔ0`.Æ;$! S e ֏GCtsԥ Z [-%xJo9!Qk "I>F83Ue1Kע԰ѩck"2u46&Z[х֣Kn>DĒpG+6%=@ 1wan8o*4)DH)#GΕo[zgOW HdGܶZEmc{}[ Dάݔz72s.#b^}FNJ_pʔOO~2SjBy 1M><.]n=aoǎtisՌ ZI>?y:?i \G)Zo3O_^4}8?x`QxlYF礜J*GVnC'24Ta#\(`;g Pe||@F}4kv嶍ӏiؐGl`^Q{ö}#]ULW-)<4"mݎmߺE:DQe̋U J͈) w"ɢ ~m7L ,ئcZJw0,[ f,DBE Yn`@DGp( PGw7 BS{{.KhW#=1qJcjB:"JDEH7=P2S"Y )!7=I H H  O?N,{rO蠬·ខ cW22E(Er`3펀ݤnp#*@9v dozfBΈ"W$.ݰ3 mx ##n @a)zJf#GZDFU26H#1ɑ3F0K&DbZJm2rHB2hJ`f9g@AVHlΒ* B0u L>³ípo~w눥|8˴VHk_^UVaCoYMæZzBzÏ *h0skS1ZOHEֆrDd?Sz1F0"&"r^)+0 Jv C>x{Z5Ӈu2篟?|bdG+92֝| nF~v\{'k楆ۻ~9vl L 6M0%ƆenG= Lfx>}g=GRmiYEO~\{kqZxqN= 2zt~n/q6\,1oh+dG609T,-*Uā2a8AQDt \i{"4֓xgQE( qw;݄&H3RX~(CfphX`"$HdG<  0d8iFfqO9c@2TU L`!` ju?'h#"}P Nc_vU&d@>awbTeZR>_۳|OB&GRF"X'īgf7@ >F#,l4U]Hj,,+;S.@2xx@[͌BE3Mvs:ak' ѽmVT'YBR m{*#~cXጊv8ܝ([1#2rbXqi֑ax?[mGcyo4]n̜@4OAE( 9K$MǞ?̌o\B2}„@,^LT$9ͫ-5s'Fwka@aͧ6z = 3vQtΠS-~mqjm ZN$T<Ѥ { qi]=Q} 9zяl]r`t6@tU2鴾]&-|^@.w<|؈ûg^0-Ab&M2~)3`w;nq ٌ5)$߿6 M(U'~j֜ [roȯ-o_v}1`_8 鱜GdcӉGT4GN˶Ly.ot]mb3Gy<֪ͅLHL}ou;971/xXҬ.R/݀&p; .'z*}y¢4ɤ؉=-*LT*7BDH"B"*B);(j $0B&DI)rg)~oD1)2%!=. ! bD Hw D`*Ҽ3%22ѯ@%9#L*1MY*@.Ї'f"2B1DxD%Nb $dr;>??W~lV~z S| QfIw==²<s kbn"d;"3 u} $H2)DfuocGD8u]GkӺ`[GcEH(e|y޿X$'Yf\=AG@Q cއvy!%"v>2#Q0WEI+ـ?}|Fx|.pc,"r fw*fcZ*n[HjCX$*O2~Z+ е8nƉt>)$IJMx8m@BNS1SiȌPwtn{;Z2CtѯH!ݬ*O2~d DHv3ARTx-2M~u&6^Fچl9qZ@Y8К˺p^vU0UbYo%PuI}tٲc3er:/E0w$stom^ r3c*%Uu?Um;3lo=ixvbTfCeOvda3j_w?tCC//<=l.x.Q,u~(?7z>i~([۞߮0P?~<=\W:L߿[XKck]+O/}p;Y-˔@-uYO7fAHDA\ BM0$΄RC.䝘3ʠI=rb?,BɈD?ڈlѧIiӒࢵK(D" ^RoE#$fAF@I.}#cEN$?")Y ,@V2MB1 j aޮm1"~.8`ՈtoNKQ,8"'&(scy$uqs{Ƶtå,p샑a%` ZB&VHH6,H &$ID@"4PPI"CX, , i<XEFrAL#$#_9|x#@=ҽ PAI>rxbdù #!!0Q!U" Aqhd\ AܬĽ# $JȅQp 9֟~:-O[s iu]uˇnmQ{F4n DN^m#AH` {-r1Fu-ȲGV1BsQapL{R Zۣ72:;=ns?y’"ڭC=f$NxOEPRe¬=|p/4i<M= ip>.e쑡K1< bXG3XiR(L.\K1&ȽL 204: d1e%*\1yv? ( HFMwEGiHi=NSlleւ@F"1 |];#\#f!$Gv,d;T"ǘ,`DE4LVIYdF 0@=N/ xo6KǓTHzm8jо,LrDEU,uF%mhގ&UL_EDLzJzo7HcӪJ%:1?Z;:IZ z9)Jo>i 裩,׭]oo0ȌvC Jx^G?5p, 3!'Dǧwq4)գDawO0I0:釺v^^:M#2)"U"q;H#&&M1m?X%Y1-m\tm[Wwx̨K|fv\o۫.x8rk ܶI-~Le_AT_^O/_n%9e,CN>p7\O3|xF(̵Q͌}?0<D)]pE1zc@}lH6r>G:lR\  H`~+pD~:ٯ778 O $E9,2v'ݝ6Z#ݑ"(3JeSN3v%p.mjo}0yoNC mL0?ca|urNLfɛa̓(.UX2-DaTNBDp7DNL1PH7$EK}A=ݕ7 <bD~?[;EG"e$z$`'@eqD4XNH`E@&:˝%hx׸f3eBaJDo Ihf 0W@"OHR:K!J(PԇE` d֔\AY}Q .0͘56AC]݉Z< O Vh[c6,DX}i;QeeF:[v 5n,|~ݻ߶T+u)*,GߋL1#FPU;#EDH&*HVdb>FHطp. H P'8 )MU{; I S\= =gr>Mgu gg\6*}#LR}e06!9io Lmp5LOdPHȤDE86sێud.Ӳ>V2q̧=FaTiբnT9cFoܙH"BwŬ h'^%|^w~Z=iF$(W;?dZkGs9`:6un#\Lx5Vn`"aÀ}6 X[;0Zt6*r`o{}kyuLCx?ƜQdo6a)YivXFЃӥG3pCy%,mM咃<.~4;IӺZjonڇ![#JhVsaQZgՒC$@J("9" wBIJHB&dF"!Y_&D)D wL"I1 IHi 0wCxa'W԰) L(=< cpU6PFڣ!"F83wBHsw61$F$"DT@Y0!܁@o6$ !vbaa7vb IDAT#Ec>ZFH͖Y,;݁;tuU-Ol N|@[qn{/ȩf͡wxtSDR8Osp,ScdC#=Hy-3|'zB잀.$<0HydcyτPSTͯL]0H__~\v3 lCUWz=ʄQ1liȯcc-j(D P--.WVK&獆1촺J@;-p=!M,J#pҖ$%0d_OVY|b]ץ}*wCʲ:aC^tL@RsN4cS&1.ߎv.#cR!d$tivDk mYFY }x^-LjsY z߯0;Tj8`s"Ba(D,!O+7L(t @f^ >Z׌u8:\VPs2fFx-vt7L2𒉄I6}_\4z?=B>18tFPbTOR9iZV9wx6A Ak_'n|Y׵Uv:ѻ0ԒK{yyVwmqZ1\Vp|( =;7ls:/X;}%#!!$f%ʂDM)W^iuuHgʺ^k Oz{υ4Ƹ\9AmP -ig[. & Mg(a\&A9,/gwa  .R1e-O0s4(E3_Լ қzbHP}xoO)HP;}|Y2Z{__=/O/_HR"}S U@$_# "Cf #|A&}`QFGhA$*hsfz:J"d, >8yb&;apM, iLL91fp DnEMu  6@Uh Mj220''Pp )Kk,#v@&$1 @ۖכ\.l:= B<\Uf%p9%CUS:LPGAObӦ'O5 cz#xNRljÃN?q*O_PT<H=u@f<,5bѣw̷[\Pm1s֚>byZ#iXkR(T<幺.\ǩ"k7ΰD> 9ͮtJisB;SKmNuF: }LƗCp!ڰbJc8! uP㲖>n=پSBq4,J^p ,a 4O,K W1"G Cs^k^/ufqZ}2P 阵Odܫ Ky^[ 6omiM@Y__/__ݣn+S\eebzz{i˺& sxoi߾ai+޹>tm VZsa'z;_; 8o84 tO/^FqɷTmq$ L;E>x.rӶ̚~~Y#B>J)[vĴv;<gYwwƕdZ31nu[]6ZI3S }}]?~>}_y_ڶR`{çema)[+-=Zk[WHwUaf%xA@$̄injG}HBGM+ G"8#PP 3 ! 4@xz@D#K@IA(8Dh)BD &Q2IGe6D ȌD*POD\$#Y!!{q:GLRxle$K(f:i PEY2 ɔn(21}E#Ƞ9cZ&M"uC'{&4zpHDGN\hD3Y< 4ޏcSMcǙ03 yLRtLpC5*Enƪڰ9-i`3#Uyst{.g7Ș}|_8-eGe :2!JlmRYC{rx;CӶ;ң ʊa0ceCv' G87؞OO6Xu^6"^>lRJKuӮ/C>mLT6>,8GN6_Ò]n7{x||-uA+2ּ4k|ΗЈ#).W7:J^"Fr}`Z#ppHR6(`F"%  Rq _n~uG5Cpd 40S "#]<2$!]0&j")uJ0N0p$tP 1k*aKKO}NP]d0BG< !#`eS *f61 I˘NKk#2QJNl 1&סi괊e#Gnf9vl\؂VJIZ}pFDM%#.uˎ d`6SLS ht{vcڶz9F̉d.zfLV+;"ǡ*BDaC 3ZdbGӵ6߇'R#Zĭn.1e>}ZaB4pN]9 pR\"GgEБ=)ycη2/0ňOzyV|B>u<DKQDp4<*~av r!~9@a?yJcGz"< ӟLc[̛}}6u<_c7|1'd|GŖ_^^>~nea ̂KŸ?ő &Kgom𼮋=2#wyϟ@\inϯLg #3' c)FSOb.mI><x!nmSeooǺzu3Dc2owvQW>)'eM, "M$*&<Y! #ĜtL!]٣)SP,*8@x'AeBDT}t\dғ؛`qA`7LOLf dc32AdLO|$xd@ٸHPA>.ITFxI"5ohaK[̽6{{X"0"e`fgfJ1V},z}zݪL4-U5Fe)=V=4ZWcjyk< )?\/\H$v^o_>~n]b @{WH #  u)$&C+a phApoC`,(A'bx E*dzڨȄ4"3xbH *Ğ?$أ}pZs75'@D~)9 <|O 't?9\H PT D") *a$B`L"JH*u/G r$i .FLJ`>ᮄ""eBN"$HR2(;81"'}A)e߽UJ%eZFDBj H(" O K-PnG75%N2r9gOsNKL>Y]q(2*Qv`NsE`. ~.2ΪӁ)@<#jxN騷Sckxy?0S.c:QY _v!9 CY8 Y2Ms*CMPaD`*˺qnn,T$EzaJE3Sr s.OwJmO۶C@7~oE];s}EM8/Ke{Zj8ߏc߿Sd9Ξs:@o.-#0˘r*|=吏^$"M׈P׵Rk1c>?H-ˆ#28q]ת1#.mZ61U|hW'/?QY*ʖiV1n\O{\ۛۉ@cƧϖHg{baZcl#e5§k,77b>Λ|ȟB9rꮶq;;df |?& ?Gjk@K9`*ԴYOTBՇA`ertF:ֵ'' 愀 ߇L>fH#SfKfS^?}=݇w`U~y&\׫H1݃,~8R}Dk2j@:z\e* E(`)H@ r5B>~YiQ#1C\n_=4UhtB$aӥ4\{ԧC>O9S}H&u)O1nvYXX).HL Q3?uc+n <9";UhƇmYRC?>oRpň^>}n_m^Sl1~<_j-BWF"c 1t hq;:p |{_hJaN [_JLgzݬ )D[8"ȓEoqϛ0~m>*?VRum>ֺ==#!e199=e%L ΰdRPze]< I]Z9ǨX6,p^j+>FTvP)!3N"DD4b 2 !! @1vLA88`! ?A3< 3 ѡI@i&03NVٸY$!?CNw"&䌐 dD>TM!!%$#cfc4 f.$a@ qʣw f}ٚOղJ< DtE6*UT!Yf-}]yʪHJ$g TuSLlm=Ns\[&Ǵ xh0< f fF">͙Bh:+՘st!c̺9z #(hFp >%J:MZO$}C$rytE2e֦izbOCSq!!r{}8DV ̌>J)v w SoXnxx2)ώ,-2!4'q app++L_1@A )Yc!O}8ֲOu 9cymmn3&C+@e~x^ז_:B6׶, jN`~Ӈz]Zy'ޅ IDATy= ~N^+Ve!>=#seLo?o_[b|H㲦Pٶ(\mO-Lćk~pX]͢&|c?˿|-^ttY/2|뺕Brãk~`d"KQ纮Yq= Q> /YɵO˗?_J=/|{{iо~ZΡ؈k nσnc1l4EA>T- sea&D1 dĐiQ𐨈 p̕; ̈́*nX yf$BD jzfHVP=?V0F,b B"}%P%"0@u0J"#GYMl"4%2BIIvnHYÝk%&u)>J OTl-2V@@vؖz?-&&&VʊTG -T$JtJ |g9 r_[##М*!Lp?fg9OӸH`cLLM4 1-G),cs!D,Ybtw@.4' DY"qN8Y U>wČ`TtLׅn~CcR٦aiQw;hvH0 8Pk}J\*9I`XjE `V4p` 6{W9ޏ'xu=υ!A\δ_wz]/_->ԟ.L t1ގ_wKMFuG@!2'$ѡHB$2qONnյ|!#]C- #oO~,K9T}7e4K.mُ",qւ9X/lmb! KH;RSyATLi[!o9z,]RcmЮu].[G[ﺔ<{42|_j痄tYCs?yRRxrzK^O_.6 %hMj5!Ϣ_V]yLoBsFx"G'@pEBfz|w o"tC Tbw+ p Ui"' U B v] f\DT->low]B}y۷ww( r|a1 ӆE@в,yoxzR{^I7hoEyHk]1 2))L4w3B䱟eNIJ㲖߿ݞ^spߡ^u_}ڹaC1>ގK#|Iqv)~'^n!S!CԷ۴Rt׉\8*<⻽s"̙~Z9XvVzhC48}X",25ӎa`{B78/˧MdYuVL zY$[O&#Y]=< @n_O&UgUWf2pa`bws9a$2Inڳ"$Zc^rA4}7UpeVG\Q%K_}5j vHX}׶j~R:\\6K,4&ZD;<đfn1݁ -LJV1~;v=Ɛ̈;3nc ;Lif>J1dd c%#9Iw љ(8qIp(ZA@8);@f w@0ǒd ~,(9)zM$_W"RS*aa1M"b<P@"< 2Si&AeʽcspaU'2eI$B09%DWsPf!)w5e8(@N4G&hy{h`ӸksmK::rڶ5 PAZS։*hLjG>cc*'"݌{mM6/ܚsmjAi5"[5בs͜Ss Pg6%y z IP09  PaoN@-躎e:o?.2Ox{]oPЇeLsI%3v{!Mޙ~˙f=zGXDD8O.}"G5][%c^uOOc|z~=vնtf&nޛq!9cK꽋 ~\w |nǾ4q YE~}lx]קԂliYЭ6t:)-0s>W7(Ogr6"[doMzV|z~k;n@`Ck /SyK ~yr,9'Zg.72AJ0[)ӗO JM@Pۻ͜na=@Aiɓ0"%b3s 7faZsY8Y{=@tdHQ]>tk "hHB` `+8Bwt!:8C@q`@?脐4<9&x=`! 1!B`"@`j5;@0D$HGE)~p@"pF Bf""80"T(Eěk$Č:tDK&JU"IIY $bA$<׃^) "3tWd.2FdBp'K@&`$n"C x#{W3AiN!pߛsBa$P֭# s!zoLsfSnF,YbGDsKlnA@4ZGA&S 3iƐkz\׽M%QJubBࡁfڵuwږfàka QlFhf }޻PsI#( L s7p(_ pMgN/SaC4k[o;.[ǽTy>ӧ֞n~/®^bY^^n1!t4F﹞Xc$0`-OK>(5?V ۺN7G~W#Cm8M wڻ:JߚcbuR%ԛbXư[WOc 1hۗv<kPs˗IA<=oFD w iN{[K9 < 0,=L(U` #Ѵ!9yƈcCL ebwW fڻBp::/5@r)cLYRjʹ@R#k'fah0bbvpts G5w 57,Fn T oy@)G1)C(L\$`nsLޖvF ў>izӶ{<{3ለ9mW {&1?JbڑƘ(:,@yCA>`ֽ]s#GxQ{LSHknm76ɕR~<ؾw$v&m]{>">/&r0u׮tѡg̳ {#R&PrBr"~0@`4ϔG taaNNS)rt Lk 4U5'BBKD!߆ۦ|~Fe@xZWH,6P/1{˜4OS1m(jWJv%RW]%ѷQnC8s0][Q$IMInoCfܶmSrFnZ+MZk-"1_5 F2`@!}t0'1",4 b4D3KЏ&p,,,@3ʰ !B݁#G(52 )D@N @$D8@D$$@@Yp`!֙rrnH"|(!HP: @n_(RoxAɣJKx7u]m$V *"\:'f0۲RҶTW撒; ` 2*qeW)(R9lh'f̙)a9B4ELs"`tk= Eqp"N$HR9s Abɩ캱1g80 9PD )G0Z " Rda )XN\]_;D6BhjsBM- 1!gBGn:Q@w(yݑ(l3!dbk<ƀa$뺺y1 =bh8M#?F'$ m s)yCc_COy לoݷ.\SyJFowtrs_|^~\4?ms96: R$R 猪*gAZ*2"KoM:8U^{7o8$Cs.NO_j׶i"0RxGʈLA۷K-MYRL)u)?\RAOn 1줫 DJؤra`ά`sh#dBBvuG22N`~:͂  nld 0H3 hLK;;(3! `<Q !hP*ё 0͐>FGG˂ h4I9܏`LxLhB4Qz38x6ڭB#@hO}<2s΀8r᠀M5jMZ{o,Ow0apbCH"D&ac>UNI1) I(LyۜppNBasFm攉ɣ̈r*E,H> ?NH<`X.5* }BZ뎜тDP]]0 @RWlN߇d LSݝ7uP#G"ԝ!,\}O_.њ>jڝs_Zoe-'|򮬠-FCw; v%޶\<-ߞ XLSq}$k’n4œK}{- aO 5xSČFy/>sҚsioYL Q7`|/K9QYϗtAnHEPcB0 @ӎ IMCh(%A@8.H# P ` @] ݂ LB݁Z@axO")#0 H c!q?D8RBN>sbU$A5 Dd¡L 2!`$HBLE_|F!mc)#oDU:'}>H .O%ToM4Mp0moLmmXN٬Iכ}1KYiuE浍@|mt9xGiD+%A,Rs7]jy>eێ蟞?sE*"2f]:l-[d"#&x0@p8lpр< `EA=<#uUDO+ +#;8G 8:qG$ ;!fQgġF14 2Q82:EP-:TNJAnGG"a  1"!!S$*V IDATD@co:}?S+Q.zYk{Vku%! -)̹q;Z}mScbud'?cn9' #D%Υd!ԎF"@9 s ݉1 TKn}Թ$`әXӊȒR8/͈ KB]-tQ!JNs9i3FΧSk= zc߅qiڳdȜx*u)Is}^r%1uJǭT~>.֣yHEJr9wCtVD̎6r: -&@F9 ᒸ{cw,)ZF[L9gfP̂(q!PdPȕu}m$OO<="$S76qݾ~?o [JiAú67yѮ3o~nۧ\h~Z>mۚDyzwl[cu,F tƮؘV0Z`!sd@͙XPN5P$D]z1TW@fSKTLY>[ p_[Ҷ$J宩e.KLVqe.a)4T %H$-u9KZD Sͪ+& DJ$)E)e;_';',XXVfH1 CdYbb9p<$hL.y"RSG,^o[B7\t90/ IdXGO9z{?|^.R?%'i>M?ͧ??z T1] ko_eT ),Ag{~ʿRІ=/$y̟`.mOoUdjl1y$hފzO'1V ]6: {PjM>}rľmή{I {W\{yp]|)\f"]zۑt$K[{cnꯞmOx*r#]݇lGZ>۵Ƕv RZ2MN^v[>M…#c'1-o޺!3=}916w&t@/Lb!ۀ#U}6L(f f '"q S@D &wECp(91;, ,ND)w0 C,@A F [@x%vi#~ s2Q" \%% B"AgOD)n_:&8BA# ',߯}&qPayr6OU}pp\r7ΕRh'YЈADrȎ X62zRe3pE Rш0Be*q\"I4KZ:I*;(HiJb`l<A{ 5\eF\2Ok)E0sڦ)^i)N!q=GʾHHfQk,,͵==/oDOw4-=O9K>\xHyf)jcO @dP'!2NsSxZ=|)u~Zx'#@ovdEڏ1+>cyDYmUi+jDE;_#J웏0%D)u]=Yߛv.mhR)߶fr׼1{Gfs|z\7L1`p| U\q[<OxpQj08p~L݈)#/]nj<@p cG|*!9tsK(|y3!3HaqĴ9#J!$LĊ݁P62|(g`c$n[bܶ2uqt$BCuxTPSH!\v 9c_G* lqӱ 9eZR39 )5y Ƙ'Tc%+D*d5џΓjVj.%lq\xUUZBJѻwOFKęq)Z|m{+ppSy\)/EI$`zIp$1%(qZ\r"T+QD4'j.TtsO.Kt~:<0Ӽocr%) Iƽ#urR\sO+6N=甄 ,1R.NS*5c26yynCG7vm]il=[vc9}-6n&I\ϼ>$%Od6T\1nv4,:ZۈETӶbq]C>":!ؾ{?Oڶ>?v:sy<&Q&:6*v_׮{>ȧe|]{چSSO_'p䗷u_o] 0ʫo ~mNSU7s7Vn=-[S׮cxp,VRsJ8hQqLG2{SU р b4t^.ݶ*0T2<6-̵@P)nmD2BFKN)A焺2iiJ9E+I$D< S}22DeRcݞ>M˗z%g l]ّ/u6O2̵H|,;-=>iɣk*( QGNhJ*#%tTeؓՒIY]AD?_R2}ZN* B0$NsNM/iYu%̈0O7qp*P4~$,4Mrr#UmLDm$I찧fYU3 `y㍿'@RHP v;]_fȪ]8TVU{{T)޷CNܳm[|{ZN[snfP|yYWy:ۗwt ookku]t.}3?Nkpzzr{:sq9k1Sf.jmCˮ6z߶[u<(0d:]olg >_ZO1[з̪=:oKV [+َk#Gz9__7z'کELEM8:@?_#G/bVH"GB@A:H-PcA }7bkRR -"HW-614P N~ԳC1+،Lj:~E\{kTPƲA⥚yD%W%@1fuE.ŕZ`&'D!Ur\LDbvkzw$kM)."n7V[۫(梪bТ[?VwMZT\LJ')K۪ܦ\ޢ.u0-0H&7ZܪmxzyRtV TiW DdYe t*Oo\D%Uh:raZr߯IMO'?_gd&ӆZ˹]EK-e>T̆t@RBt!VD=J&J ̴6eZf ު:uRLta,#\U:u@͡J5?,'qY()׌4\"pmO~:JeX)|=3χ}-NV+"jVQOdkOerhAR/ovݼ $3"exXrR;u|nok)e en߽< d_M/S_.ۗYYLȞ<my8,u7([G/[0{l{ժ˩xjm|WxYkzZq?o<-9c,]-cUo^WQ__|!|u[NK9_yokw7d[e>lZ~4LZJ0hO$bǧh 5SJ4"hf]8Ҿ a21;zKF#Jn}сM 1HddNgL G30Hx #aR!La#LJw\:j݆}~ 3 >=m8*2ժx@M>M3&t6ufw7} CbtiZ25 2yzTkYO/ᾮ"a:gNts|Pf?˗R4j[TBԒ}7sh(e]i*u&EVz n.XŝP.y_k)Z8岙{kQz)nEQCǪ4˛suy!J낌y|R [)<TJ2E=aa=Ud$(X$T:YwIZmd)N[c9{euHnnV5K]~-.ER'uIMӡlIu\/Ӷ>|xv۹?߶IlL=>|<{)ȬuUjE[,S^8=/"b">|" 3rKQ'{<=/.@Zf׷O/*-ZvlO?L"f/>=2eL0=}(rx|Zל,?}r6Բe;_)5͵GLft*Ls)WnZsĵkuooD?i)O?ñmޮ/'\Z9VZ)O2"[7^oՏt4#ynPn^$r^>McPy;çk)|5&e:$qyu]*Z&/;hkfJuaTe}C0ef $y4x&IUd&uZ3A+ {3F* Vځ}3Z @bt7@$!AHd-l6բ\nwpOŖgۂ[NS^0;Αx^oV*ǣ p8ٶuK)Z5-U{(>!$[ޗye0z_?r~ײEǗCV̧ M3{-MʶneUU ( r>Ӭ)ZԦ_Ħ2R2tA{dZPTW7aRu 4/>޺)H/ڋվLV$qHu*[Rl"n!JlSI+.ftt/Xj+sTk|O3^{upJy^7Ns|ߎP&^H-k\hc`uolyZ7~~;tdޚ t;0zF '/ ̸ JՔǓgb0vakRspy /)ǐ"2O֩ 보0keZTŖInVyRJlŭG[f|ђRk7k-n48e)&&\rP\M_N4UӨkA5?z =>kk"i:QKQ%4Sr[뽹6M l\[kpL|jfݐI9EdyL`5m8r=RS IDAT~?/H -Cm6SQecrݍ{:HLo"mˤ0DS?N2}x:޶f-P'7]v4je)*MpY5w T\Oե^&$Ԉl "`-U%*>ç-."(|bmOl*+AOV-Զi9:MV@nm&7U4zkp\2vXQАu]^"&@ֵ/a:+0_zq͊Ȍv륋h)YI؎%//k88v8$\ͧۺ_zoZnښ֐2]~2teKeQc{{yynou񃷵i 8W=FTn/5-~+]^>>]?vR3xK}i}(zI}_WOfa&TK9Uw_T$eO -^w7-ǧrL"aLw TU!^רL `Sat^F\O(w/hUܕ*t܄\Z&oFd"$v9F=X֫z0Uo0OC\ڼTZjVoMLzTUA T̸sxm?.G/;&=[Jx4M[Zu Pe۲V7S&əErKߞ/l}o*vSR^dϞM6)mk=wwOv2Mv_#fsIdm-UNzT\2:Ϳ^b,RL?)E;r^z]]$Z|wٺ BRAN;b+q9ε뙨Lܑ&8*"3MRZrYp:P,emPK|>{dg&2r^o-%_>v6[~+wVzrm۲)=G1v{|jf/&Dˏ鈘W*g_Ɠ 8P~c*Q#d":' P$>b$k(N`2*Y "u83&SRl\W6n[:Dzs .RIz]p1QU!bku: ,2wǕ%?>3* 00Aƭuj=IA`/ ؍2|:ǚ/1MaO\PL5>;r<` "CX#'22Ed,e͞wd|&aЦwz@h;®%G { WˀүL:4 { @VMs\]7%ֺj^c >n ( TTa0L$͵o^J]UaRUA@:>+SwdN$$ HcE&{5D"keٶ5k\>T5WTAN19(TTJ2P!0]JE-# 3cֈ}XBJ,[UvՖ$Q&aYDL2~4S+-DKGĽ!!HS`d9LJsib> 1KoH.O nU@|Q9nL" %ErS$D)P^dbW} !3(VAf y3cR\[T*2FRJ$Bv=);'_ $ADdzcrԊ;\pb9g'T%EI3G0vpw7"zzPDm,=ctJԌ8jd$ s'ɤDo^ 6M#cNd=bLfPTKl$zr<3HԔ,T¢SUU$w/!nnGx|PDrw>b &;x۟oY{67Q6C2ۏk'L^wk5PCQ|=~Kq+"hQcGdh(HDr9%TpE vH2qBTDXEoN Us|ݻ]#;+iFaEH!RLfܒi@(| H3G!#;HaG1aBT aYJmHBML5Ȍ!H'=Vir@Zq.yMFT""HP(" IqfJ|넞"FaK!Xqa[pP޷P!M,*<#B!|q#EHPc衊G! QH2Dnj䮦$DTERbg0atIh >Ak<+ 2@Dfb6BQ CJ&UTM=f K<;k!cDX H&CPQ0TGJ!sg-W_4eU`7gNI 0!ƌa%A :cFj0e4fFF《x|%nL1y&Ag4`)27 oy~ @Nw 54F=_ɣjah_ |=7ƒۍ$կ̝A"I"3ST2&EErqP l3Ý"0ĸ?D=jut8GމȔ51RDUMQWժZ`0Zò<%ZRZӼ6p\>㧗ӡX#ܢ< @ZjCWem+DD(jӬf2:H.;!"2/tfb$M]Lr 1LJDH7]7ܵAG6J0SU 2F$"o<.Z# 3A~ǃ#9ɍ;JԘi: 1,"Ҫd 0*RJkԁNQFlc9h$.sk5u`7vRewp$ANM i"_2ERM"6*32CD\j1lE@OӁ{WƁ7}U䛟/iuIv}#wH'NM0!@=`35/w/v@뱶Gz<) >{: 2F5.þ.S fc6\#- DP 1-Ly0 ofEzfr X";HZePd*R0LGXsb|qeD FF$)D""#LW0=P"PQgZɞLw!ܡl,PJ@.#BDDAyhEtlwRJ)[/w3P+wjak 痺mk{1\L$dk[vSdQT$\f&`p<ؒl-U%If=:\ȶd!#)(][hSW}FIL3wn,f 2c j&"SAtyb|LcWJ0P(dV RG<)[fwio& :kBH9XȋJLztWSU{7+I}@D<`)ʇhjLA.d)QYjSeKhC^E2fjL2R #>E3RGf#xF{{B}X0E~O{8*w:v/q<܇E6MM{||^G5!wm[9Ͻ:u_x@cy͞ :#峗)K[o"όm`T`CM4@`ܕ}GGB8jUcDpc[g #J)c/.?T~ѡ=f%s;5:#xlбXu1h~3=bmB2i=d{Ũ I $e8 j-19IR3SBP.a^0$x%H;R:ena*KuI,?]#ۚ}{=Up766 h-̀ !![BB <1`  1i!cZBB hdUuuydF>ߑBcGaE^jJb#u@cКvMFn#Gb<"L5֌EDF T,2Ơjn=U4D DTւ&43 SLQLf2 r3bXIH\'eDD;L5#3+h#pt0$`_Y0E(1:A d]!HATktE25E0R2V7s9h^ xEؖeB}ɳp~.3KR3 DI"3JRˎXch &W IDAT01"d#PW$#ԜUdrA Le]UUFLiF'WGz9dp&'B8kHf'g')pOJ{̞Z?c|:G`,+B_B=Op?#iOQ+>. ddK+^b&' &IWUQYt׾ UYI&TH&]9'UpBUdU$w9K}QEf 2Dz.QMԦ7dL5u*P,Gs7L3Qɥ-\,7rrD'\0ĕOjMr y-8Ȭfj[@&Rd-U$޽?7.n[<4>­XkK3ۖj G^zHiܬ`//vy@w/szJLd  p/$ ѳHQHe $@ h%1: ҡb#IJ1Ҽ(/4ѻ:cԨF&TT0:f f:z2cָCb60trcH`bQVyRɈh[.fQei0޻#暬k""0rYZ!tr&.?DD., SE*?id56A7dsHx@A6Q05ȤN'@#I&,S#b"(ʂ2Fo)̡124/<{U-$vC|ݖ'yV:+:W&L'yMml9tK|.N9,Z(JW}pHdDN1F$eukբ@TjUЩv w[3uM0ͬ9T5P՚\.&QH@2QZ YكԬe@l%Xຆ/[3MJ5Wr r&@dCFɜCĄ2:Y_P"ZݼtJUQ15R$kaUidd bՖȀ2B8Vd#U [dT3h1水4B RiM%%-iӲgrڲ[b'>mB]8P2R֦@!HTj>#1UݞL:R^RA~<.|q8W"Ͻ-Cr\V?w_m~a>q'?Q͗eS)%q^]3f1Dn:eY\$@/ضLPtL`V.f裴T"paiYPH15S5L4S La&T&ՁM1b8?G$)ޤ"•@n6Ffd 98c\}D+ID:09p=J"VH2 %$TwtHpȢ# wx_diDGvfrd{}# 6A(FFR$2u@W_vBQ[N75ThaJwA>2%|VcΟg8ZOvɴ*;@1S'8? eknxڷ\cvrdz|~BW{W}ԽpNF+H{=Aٮ'"!AmJij9kpBS^; 펚z`FTMl&:$!4á(%B#>%TUHM%DoB9@TF dΩ (9#4)2D6F0GD2 mrv%zmMT`m۬Yhͬky,^H3IEMX(T1VE>fJZ-mI/9O>[K?0|}~z0fd8Ʀ"MdjXO]N)+TR&)0h߶vXshtHH "ۅߚ8G*B^P&B5@ANWT0 ̈́1*!ZH̬ZL"cqMʖmVqVT[Hmid{yU5HaP#*-J|)PlQSdt7-i JF4YsYLQg*׬iy<!}J@EfD%2ӛ3m$5k]W>̄*Et7Pm!ova2׍sHĕO!o/o\/"򝟼u9._;+26gַ?݄ҏ:=1rt7\N͖cVA(6|ui~:EO@v̬ R$곬G UˮDǤSZ"&=, FYר0G]p#frCD|ƔL>]bnշ"4ZQ 0IzQQj"&QdiUF\ Y0h&Qz_aD@CS(&T&)ZB$@S#db&5Bo޽{wyCIJ['g3>ifb4@`|"*,4#&:S*7 lpY4&|L'B~Oy2f!$SD\\2G 9f8ELUn= <7! )V6q z@UG 5#A)3#咪sz6H. 9xA[QL+nzS v'%\H)(cBeq2`:Ff3 X/|'?X&?Yn^}Þ5:>tړޫ\cJ&=W|9WoTK}OνR=ȳ̖Gd@/3>q#[/)`ͶvOE"T,XE oo\2b8.B9 nR*LC+fEQ}L>Y Ta s7s<[Oi55sqo.lufV<,Zy @a  bdpp3]Ӽ[ǫ"Wyq\nZ{yĩw"tc5uxfPYʸ[,i E*âmm] % g02"Eὧz˶p rٚ"hS`ٖDz =rD5 ͗%ʡ(J~W(NFjaLDe9֔1(F(DXjt#0%(LY$nrX*&3"DM c NL7B}n[*%$\{V@2&E*(4жP(Y#_pk#"U5c쏜*LEly ]`U`FBҥbp0,MoaB@"aVSM^1O7oje@Lf+ePQ_('Ϛ_,H ]q}<'_0W-F@ ),HhtMKJqAe'ϟCh]9C98?P׈x8],Kφ2֔}4[9{ﱬ&*ck`.n9:2!zOSMHsaflmM #)sZ"0rHmLo6um%$JVwBUDӬg@Yi*SDsYtuE6s5r M镕T/sBc4ITiBGaətsٚWN1;o,*DDEj-l|DS6ܝC:xj~|y{/q9?<4 b8,Ӻ/ǿ90U;Oip\o޼ү^؇~)s8yTWBDK*L2P )EU!b(y(,A^*TwYw)ofMDNrIVʬiZ<(iuCꈑhAXcH1Sj ^K8181!\QZ^caVZif⊵juP!ݩeib1jJIa kEDz|NBd$yD۲}z/"yFڪ'z|֕ǶYϞ[R+yV3,nf]eJ11⊑9"oy"psFV)fr(;e1p/|7ި_GZSҖut/޾|fw:n#>?/?oo>_w n2.ۣ}Uz_݋Wmsn+kUȋw?F`} U322SȜ"!*2BM I%ꄉG87ǧpUU./eBPͅ%,BM)ÄE*L=a6ITwiQQ#uA*3"C9b-QVJKV7d5n U`Rdri-"f2@ YXrUրZJ &/n~k۶>(ۦ"l|x'dDS5Ő r v3"_ߺ߻?GW`"ýMKJCME1hx!Ӫz5Ѡh#\>O ̝M'{r'Og`.ICI +rQ?Yv-z}kݧIŽ{tq$뗅oͤN-ME"#jn"q $d]TץִC aP!˵"bk J.{iSETBM@fP" HB 2RE3}Lqzky)s\XbN̒4ՑOp'k IDAT--K[2Ǻ. Ӂd$M+T@f@ *`e F6Mgf,mCǵ wrs5a̍6!Ha" u1!x|c}l7їqi\7q>7P[[?_8]xw`k3*5㺼}{*U-Ǵ'&c%VMj}"*ϙYR~ICT"PPE c('SQk P2fbw-"yh*V2aU1ja*W{OU`9DEʴ"Rl8_మN&3iJ7$OZi0䗾9?{#<#?yW]X4HJ Y u2x"gh&{~'V pL(2y]թQ"fuM$GyͿs@\Eʥi|Z !cn}.OOQTm& {r6V{7A&Skȯ>(Gs(T#=#w7n2\Zj B^ORsEULG0B|if ՘L.!Dt( )u̅XYr*jUP鹶MO#vJuեlr!15eﮙ@)JѼffS/-jiBK"uYf43NUh#㲝?՛`_%2ҡ_gn+}~7Ư_9QS޽X?]!f /qzo1wY,S3 4{LD4oބY&b j볜0&G 5(s)b;\ʅvn1!k$TJ'TA){i"f̌@H!i5~V!pLHְ12UU@(M-s#PE f4Wd6#k̗q޽v 9 teQuQ3|?I[rjp %C>9Hd@R"Q3lP[?8LOK@RMTHJkE$Gfmkرk/O0G~@nvYLqc$d_ĄhVi+/pI^"q|l 5Ci\‰vJq79M!jHN_0BG`UfLj`faW0j0cA2"J({:1G.NDƲغr!DsY[Fk2)cn/qo#f9|s38/?O+_w>|/߽̌^9CŨַ!zB۶QHmB(_Y XW=@qӶbh q6.1ӭCffIVDM1pPa)&*DsˈBY\u#`P:l$"&3G`xƠ#I 瀮Sz3,IJpDI Sv ś{8E9QSq lQe1b*mo} $0Slj8OZHWZ mA=y?=G1Ͼo>O߃cL_m6Q$N:Qh cLG%R̩Fp31gp95Pr1{bLs_qj_ d+O\J6<8XWL^=5d}¸5~HlF|iJQRyۇN,VeCv$bbY6vδ Ӷm5˖n ޻hlc\T YD l+޽}{ysH7>F UxJ@8 m.'ۯԒPVf~mP6'dU~uМu#!h$O&`#2.ا6ZSkIR?&J;ծ@#3cJ[r*dzLBE"*8^}dNɌ0u0,f4hojp};ձ?sGa"XV۶LȋWHR F::Xkvc˽AGjO.yR۬[<_q謟~uѹ\a6N{o ,RJV/rp:&114>QͲ6i.YnYHM LwEM)`8L>camz޳([cXԬ;neAW.4H3},0S aFL֚ F ʌTe1fy]'Yuu1zz&H5%з<2,`lɥ.1ҽ)+aI2\޿|󙟽taf&*؟o77T˟o7G0oCkN`i\/ǻ8xy8wkt9{0Dl0I"]$e]>{; ^}9W5-X>O1]5;} {zߞ0ͤr= Djx%)NߞUQOy{8PڜIq!;wfr⾆NIT}SHF$YDE5-*Q%g+0(/.78! r2g>I -®Ns)?*a /oWoK˸9zܒ7?Yk7%Ǻ[߹{ɒB!p]Z#j ׋ɜ$']0猀g}M#b[pТ Yj/lf*Gw׈!©L!5f^.Ͱmp Sd} gh0'霥 9G[,/otm il q}\\ըu۩ן+`Ts-U<ƌ]@WsMbոĜGHF$՚D;k,i>>W1kw(N?{0/Ya`|䔗"_,HlԫJ%h@s +M2t~aj^66ErC(=PM7.k#̤DDYيHRְHVPU!.c­a v'=a:O>3Pl™Ys~EO,Q0"j.! UYК%9Z3WqA9y^3AՇF1DFLۂQ%@[Q$>:#jā XјuD&enwO[7Bb~>y{~տg?hk\.և}'[Ɩ#SGF8pJzߺdo_+G3懊/f!a`L9`MȈ$#`ME ZQ0V&Y^$#EfA58ubٓBZVi5FC⥃Skj&dqT<0#H;ZaۣW=vXx{ÂŹ4DfAEsښ-K[/ܗ y>ߞ3$IǨ0f2#II`d'{ן}%$˶nCL#oOHQ̉`Ɵ'O܏袺Ϻ~ί$+aem^)|nb;tְz%IXKR1=")^0fz)鯦ҽ]ߒP!]WUtfryR;tz f+3jy[o40f3[yyVN.:CI f*VɵS[VPiu`2S9+ke@@*zÅ7X[@s1S"pLuzq)!&n*8zWQ66bؽ$Ka$rMP-vsYY$[!u-ɲ鎲,&QTB`ms'|@>q!o~~w_ø\狈lNe=|> oTGEd֛8 _5sҧͬVRf`e{a!Bd)̸UDDEGue?u :_KDԼ4B0"Vig^%IC1UQ7?}l[m?_p,tKt&Yon4?ww<>7)Q;EAh;@tڞOA.#nvca,E[[*ͯh+S7#˕)gS~en*BRYmiɊeݓW'Yl=ZkխijqXlY 0 JPUCzԉ:)dݔ5g@{+1&(*Huki!F1ѵ)jqd2ދ͑oޘN҈j[έ3Iaz/e9LlS 6ífĭ~k?/_JYO$͛1,qٶ*&S8/(9fKdFY0 O^<_{:Aʰt/OIw-ڸ R޼W^ko1K~~x⯠Kɑ?+euo5N'I_}hicdTtr*ж Qk$J5iNS" QKb,AtYQje`M2@lApTkRH@YW=^U]5Rʗ$ Ksg҃RVʐTY e dDmHr)J~ۥ}{7VJ]"5(OX"ۧ'_knnWrEo>{=/?y۞2GR~7otPn0qD1BD(Sʚ !ִ03$bU)BZv:]\"6wkbbJ`YX\]íBe,Msi*֊P: C)Lb]-VHȼT&~h̀ X3DD uI41 uffѭDðz0ARp>)Rʤ/"Elˠڌ QN=)ޚU\qӖœЇVA6Ӿq۴ C _?$*20QdO!T3=kmB[ƈb!6`B! y&EMmJ &Drn3ʾoDW`0@r,2{_U/ܔmni)N|28+>,ELa)= lw-lc|T M~><A,]ES$X"fTf9Mkmoٳ)d$TE!TnC}B_94I*%+*#U$ OO7vaHPk>R7EޗHd"EQ YTabtM(펪DD}EeDɶXdBk鹮1F,Kq#]7J3#7+z#㗷,zo/o߽% n g~~}z<=\nomy_~_k_lۧ|Í-0ֶvF7LJ샤dfeH[lP1D>1TL{cZHf q>ŷhtGkR1қ &- 2h2hCۿn80,VD(c9j76's;*"3̪+LIpK&&b,X ij ,b@`T޹?@3UTLz zuar\Z^mQ3=m/f@nEƐ$:8"].u-A 2Bh 퓚H~1&kN&}k mMfnٻ71H`2"bUP첚RQ&8}) dڊNhi+耯wƮ ̡sx~UI֩xt]+wҟxxf«HTEyɭ )>ii&b8>ؐMm._4C.+|Ss1F3:83V˼@#412LQdtRtrYݽk\qxsAמmJ@^mT$r0[2`.EMvºIUc$Pe 3KtE{k-#+NlkXL۶J5Hq-bCMMG %v]&#ǥw<=\ڊ&=yV?O4ݷW;vHm֡M#Ã&'3][p+$O/:G E^EHbٚEx1d"Ifk-sy`sd?Y0ɥ - ö́tۦnusE3plBbEb@mFU82Iy; M1/݊-A#jbEyЕIo>ƐᡋSR>'AQp4xS}aVlLVQP@j"}P q^ܚ{`b,eN h \~c{Ȼv<.I.zXTDǻ"}m}*z8E^ EypcW1դg5(S-}*e\w9.ax] ±ׅ|IdQ;K~\_'Z[^ ɬE$sa|70W),Ы 3p&ε'`Z7+Z/*!;*'zsbciҜ:D3iJxUUFRξ:K 1c1rPCRGs HM<`G3Y}]i{j w 1T=+)(f"HVɹHH#T3)%d[n"!?&AR*4Of0EúFtmYzB"/^ fFy륟~:mY]}T532y:氾|,,o޴%ެ3\%4z m-A7s*o=.|>u4[U|>/q cxE[&>\2d,nSF1=ASd͉QBHsnB3EFSfҚD@jh^ B=Q)<=+YZ&~@u5׮ BofYRj9HQ.SܐZn (PA@&`#Pq P PD07QM!PHN^ z(N$pZBT$L5]E"JTQfy>"L1H&SiǰEAKnݢ_?}z^}mҙjjQMGYM B'd`W@P/WZW!*Ib?_ZjgPIԵUS%;yyނ4{ wǨ ]q//F`3{ģeb.mTYZQ$o "s]o֠KӛC#Gk("䴁/D,,I19IQc;cHX̔Q•m0pLb[2pmؐ#%4Ow##M+V+HTtsc7&8rCH YA5ln,c+V73H4Ӷ(Le,m%$R uI1!ZJ-ܝ1ÌKD"KH<>?w7o~q޿\l85i-JdOD?_x8o~{5Ewo<@%6OrOM~wLifJ@UbO! G"{uTcI{&T3:9S%qp3o]Y uXꪰ,)3S6wxɳ)hf{Mij:CNsP SuN S)A-GH3SMU[9le;sDAHB*@X/|^=ɼ t q9Zs s%br8. L^}lhKôqD,zc?r`NUn\߶L6]znn-hMJ[gZBռ!<.?0DToH\%(;esh;V#nb Z;?z.s_^cׇ/my"Su[få5c#G 8iE(qD,wvޠwoLcX3@QNхz8?]~ϔݿ:֚g,3sFLDfšs3IW'{jBFkETf$2 Ph y.HmE2u߄Q+a~vPzЫo7;e ^ r؜jZc@"A0#Ouq;XTw9:QBK!ش'GO˱{w;Sם (X\H#ܥ a7Oeif.J-`[eX;2R'7@[kM Mmq1N (sj N /Zmܮd"̝7? ߧ}kѹ9`ZO})Zh_7Ō=5\xͦQ9HW5w}b9c`FF$-#sFb&1_.ѷ694pL+ڵ͆x!waQ'(HFp"04v裭/6g_ٸ(QDOI.OW7߻a0z )ՕT M*1^KܼV0U!(H)Ƭ; i*Z"2Dhc+,cɉEI@_JZ]|"ߗdMk4m'V'Z'*l'Ry xNUZew2ŵ|w~~j#<Ƴ P5A- v)T>C[P!hLB ̶x&F'%2K}cLj̄<`fkjKRJѭ粘o涔~\KRt5A.n[&G&(.H@ڌ#骙ncHE$3{HNUbMRf9Nd̩bx2i="_bsĕqq3IZ[ E>cJmIDٶovM.L 7j|,vbD\?ݛM>}:y޷O~7Mլ=~<;bmymQUNq_s?nLJo@2pe,bb:Zhr<͏oFQ05"NѬAG"L3͵VIF% c„*& jDBS*uj&Jl:KTEqR 6k>̓G3E4jiP,Ž`gcq8"RܫHԃz3kGQ%1=|ט (^ 'KoQ)`V2C1Nl2%L/X`"WR<[/FvIOOTq$B HU.:.y9LHLLJ` y 0#Dc7I,vMNEm.b"221$L(4|Jv"BJ0끂Q&kՐ2U=D 4}24 t5rDK bD EbMj%Yxr!R4KQ@|YUmE"u7wLIȸQo7;ww˸_/~~{&L?@~zlq>?o\8n˰/?_2Oe{nv]}z.-׾!HJFɭČm.l73kfF5`YL@f!jnjJ^btS6,5Pa) {"K5{xβRjQLvqӧ9*~+* #[1Ȟcm|u ěؑM7Ͷ `T0\Ź̓q.D1Z ${MUu2feؚ!R?!'i t/%ca([}!1qļ@vQR8jL*7$& 8>Q$Pas0T2gaAdRB UE/TMEQu&!zUW23MH=AYV-w y4_mclMF?.=##B GAQ`Vj0Hr!∄xt,H1# RMQYBx]:diCBbzfA*j*G$ࢢ>"U-rTHd %}@I3#0*dRFfփkuɦHXyDZRM#:DLfy1&Xy:LA: sr;opݮ{mw7[~ջ؜hOղ>cߐO ˄/tW]J;yhZLR*ܷTu}) RM`Cs hBtoa^G$QU{T0isn2QZ!I PCc̚B@EW6vHƈMIR;397d$d'eN,IU##{f+9ϧ{?Fړ}o1ؖw˺<ٌv5o<.?by|^q{.=<1n_N}q?NW?5>DICEjݬ @31b2(X2tWחg(Tf`@eKr~*@k0煖W~@n0R25f\uNJ( z"Z IDAT'wTt!Fua+G* :L$%I)S"eBDE6NE/rnJ>۟>tOzWV; <+h_޺2SSH Q()@.9[LkPJY*`IRإeE!^' ͑[dٳ[ڢ?Ee,)DeC1K׀$ncNޤj~lrWPE"M^8+WKΩ}Acr ָskKᚉ./l}ȰeL$r8U|İ(9`- 왒S"ɤ2fn S<2b/M*=V]CcXeN'\QOᚪ&"#1")-)0dXӄ5I(֖=C{L(EF`Z>8B`rH:iD1($lYr 1)}SY$2Lɔ4dI"#3GQf9P}uYL+CAGd-a1m.o;ۧ 1\]o|v\u=X[c9ƻOiM/o8>6a[W]]Vr&lT-TD( )&6"[P7T9!~BDkQ˯:&TrUk^p'aY>KLjb8"w-Lw!#Z!  AP"ᒣ,40X BsbqYǺSq=^Z۶q</qxxfT4#߬_*(.Ogry#zfR*zA֞?Đ^γ5"d\y^Q s%.Z$QE*(>hapndKy1deHHswѨ0ePԧcIbK}.eMF9u@zb#L@nB.j٠^E>-!{jpǧDŘw.z=o|jC쏶7]۷ou]7?Op߭4ݛnↀd]\pS3a&[j,Ab*WD`ƑŞy [-@LJua9`jO}"9.oRKReد';0!@ LTk2!4/FB%*ˋ ѓ"Њ f ԒE%5u uv]5헿x2Bx>_zM Ŷa:ᛧ<o&}H[dSHt*41z=Xey@A1>\]0Mwo:0/HrHIVQm9G?z&u57 LD`D@Ƽ=BXL{T9@AE lÝe7_ou|~oxs_?~ =D3"%Hk**E"z^L,9*EDƽSܵc_gqmS z1վO< R+(/ڌj}m%aID2Lɩ>gQ7*9Ȍ&P' lh܄SpQ4@GD{t %?yz!Y`SSuT b¤Yu1ı`#3&3R͙}E)lUwE$1_lo)7aR+jmwwf1s E]K]@yȅJ-M3RmBN}MZyWgOk;3NR3$2=&uB{ʶJv&[4iTdXQJ/)q[DV4YeuP$~=W;w>yךf5qfgvJ/NWĪLe*xѮW]#38'q R mHZ5lX t&0Am2dD?M$N=Ha8b " X8Pm:O"$&9$p]D ]h+yM+4ɴad1u}TK5ω=vhfڣ:1>PjT*jU2gpW:]}8ftM^?=[9DX+HRUZ+bqc6J,,XB)ݡŬ=7f)kdeC5XMCu@`;kJG1SI#wTu%y4I)^'@nJ {ݑZ߰Ȗ/Xhoxݾ>sr?5t()8pB"4BʵQ(#E1M߁Gy@GXQ48R:Q A׎ꃉFj-U5cwgj̢a@LL!w":UFЅj\J ";gDWDXO,n>MN+i F[(1#QL=>jCޑ! g_Ws7gZmLY,ء]- Uj1er胂g뎢`KE]zb.7wsI(ꑥ 9]3 |c LfH$]ױ _~E߿K/~BX Y ._JC%9O^3O/ :}1G< ;ۧ^Z84/M)0ajHgtN'N7jM:L9(/#_䲵}o\\LFn@gB;[[&ڿ!lALpe$9'J%-'m\90KWTE >xսv킝3ϯէ\xp;5/ǭ3`\38Vc}lh[yMܵgK <LCBl`%JK'xCJJ 'd~DBK wucR $≈h$a:,s"RTHrڗQJBEIciZ8h ZվzUQ ,0P*ެZr1R0 jFnfjj.uB4\;{5vMNѵz]4oˠ#NI g^4^t]UE\f8]At27`Kt/`y^@<JfcOVC`nduQkq#˕,\լPs0Wsu!E%Q"uZERj.q, ǀvᄔ 28Z:UՔdhq`$dNI؈jPGS8X u1!ߘ:du9-X;/WWjP4"n,W @0eAD4zcU 9zO[>zH3ו?!^,J;w{UcpO6K #}:Ax}_YI-" }3GE8'.ZM继K:v&+&Zv%EWOlU謙:-pO0j6f'DdN[ Ӄa:0vX܁Zbw -a4 @I,Ӏ"p&1 dϙYXR}σlxr I<$&NooV)lEG9iG +Ta NN VP}P{QS$baš*琋?%Q3T"2 jn4͙y9yZ;YR Zەm:Mӷĝ{57PĊgi|H@;}mǍ ',$9IjݜvԿ{uzW>"G `N( s3{}!77sU}jt 7ZS܋kj;%<-)*h<aOi ƨ|`t,,&U1. ZCD5EE`*:toL",`1=zF@0NQ׌$?Dx0%/S%'`W-yǖVrjH0anCQWc6LU͍%ƈ?buwo9c?s)g\s ?:| _3˯x`g}cG/xM۸M;;[z/_;~я>#D!$!S#7a᪕(2v9Lھ$F{hJ^s}W@LA`땑6{ۢup,jRmVJމFﵯkLƑ4AUe:/l/ &T՛ǯ؞)̴8^vO5lDpW歓G7u%@{BvF7_Ƌa8!H[@b]=. x:osx@Ew9;˂Ҏa0wt:488-XKl%V)-})ZlLm,CL8 }Ab~>ӝ-;~j;?aQ06ۘ0C}臜JYDU)WnfLXUUdP|Vv^̤Nwnvn_q)^ pq ǁy].eILRx35DQڽpbD.(ocoB5:d<ݟtTkZhynEwf5D!   +7ZNة^O:\ mP"°֪ZlDaoB{R [NBg 0# SړsP3#%=0-Y.8!$fPc"";ZՅv-3JsjaYSir3g'_l"O%,Nxõf-ܤ1"rYCl6EafgN{{>oUkoWƛu}=v/^,`fkk'gwaߞa3, 1'QZ뢭+U,\S7ҥ&Uۮ[PF#AbQ}W{tUw](yzZKiQ3UsΪ%TH :;1j[ﶪ:]m}fܺտdDg}ho"( 2appf#r&2s ;3<r BQ Tsl!BPw(AP# q|`/ u:8lN:>˭gMְ݉MF{Np)3:p ܌Jכףst,Ԡx~^SK齯9q'wq.}.mL OBUt&#H͕${a, `|]pU~Q|2w;F;#)'- }vp]@!L SO 9OjM&3GomczjxCwr*;,p^h`g-iPw\8yӘiyENoϽ&JHh4[,b9̓$U" W03EQZ^gғ}kϝ>Mύ :^Q5᧾,x)sA$:RlO"1ybvP(DmDٮ9P:\6r9NT?s?zBi.kk)7RԶ31;ZNNBȍy;ViCXļxk؈)[=ץdQMØCkwd2S)k;?O-:bOsKpɥ{%hB-[NL<; ")YPE{4kJki?Kd4+PܒvEۮJ;/[gh4vZOmWVcɪsTڕQוTK6$ٺ ^qŚ>^'A؞ܕ3S1OMkKϼoMv0-P86;D*$ ZH5Nj -3f(Q2Y*"#V *7b"s3 /_֯ؾɮ]}}P]Cw.+(oxӋ\X딁( 5(TYM͗Vt$E÷|8BJD^eR r D6j%"5 bjv7j|ej(oÙQc'g:HRsUoD""/&Kv7y0N$uSCD5䎔r~C/.e=Xn:K3{U+_w~ywYƴE u`&N XԐ: t2wI9W}3@inY/o}a|qPxk$;P5Qef*FQ5G UHN7Fڙhm#9h?}c{˱u+T.VzWO48D VMG)24hc20&rd1U\+T%ɔrpL=TU}㒘58mj'޿rJU!nKN甚f]m(Yԋ S"UvfˉoҦ7YfUskAE#ҽ|5\׿o~=_]wO~Ck ._z^y͡CJz}c7>NVƠ B v5Kfj͝3wG ܷ2uJ\JvYowh8Դ]I;u+ v1Ƣ+-ZXJqJ%JJrx[_Ʋ3;}u_=zaSa~cvvܵgv:V.v*G+0(q Y+G 2GQUja,syc>, V 3#dN-C/Np"W?gIԩ?אw]>ݷ|mw8l^a6Xϸ 9nHRJkH(kLPVUy9rY-h52~(~1SL~'߹Kٖx5'v9NLflVDH9DgF)zMI١pf N?9W8H8 IDAT FDWx=g8xA_r$ HۏWr;d7zDw1~E U#s=>xŃfObX)ZK"T!]z9zP:usfY7z3XQwNyYҐXcݍGݦIK PX$ b.\jHBp1]$ $ s~5JlN+ 0ǵv?G]{ˑ[?6.dj,ӕdwgr[Դh&AfD \_N'hϖќ1s$\93W 'fwr׽U_~'>p|n Ӎ&7洲W.puzq`_~oS~d6ۯՏ|og;xԣG祗oٜdQy'"B`IiJ;XtV6-dwVۅf݁gUvmJܗZ)9瓷6w^\XsU[;7/lGڕvc߁yGu= :U+zϵGn#'%S-F kp[kN`3t=J]zz}y{=Tb:Q{\J8~RhԪ6>j2Ltw49YU[pO?nRt;[ױYj' Ͼr'YT0R[PSsJ4f$ sffϙS&|yx=O(6qaa^+!LjyO90=^W̿u ^zZ5`pO&iΛ-DpWu=֟f;e9FʽSOx,XQ8՚@W&{ s:(FFVR 2!S(~^7_Wګ}y)~0GQr#.^OBSNL5}GT(a[|;mDCJ|,z㯸o0W=[.W=w3dj2]IDdnm vIr0UEMJD hVKQCd,˹Yu<Uf bҒq,/x=JD? wְX>s4~~GR) x<;>()2[ CURf,";;mQ5Y)FSs_;}kbޖZLjW\F3ۻLM_u6U;Uޙu՜ I&7EܘX~`U}FCl=ݭC T|y|{=GWݵhѣvf4@NBܰX[|$`Sm27y2qLc{h895\mfo(uKV+=yp\c/U'5y;/b(nEM|HrFfd2x,UՋ-~]Pdsޏ+Oރ !G/|OU$P1!MBL*䪍[vLjEK|!oo?=;tUhs2& ]-'d<ɒi8Ir6#&va!Ft:߼u(moy ގWZ-yRO W+̓8Ρx8h8^U1_n~潺})F+=<oaX4ݼb1:%D!|M=R~Â7.\=|}V9- `NbS)'2&d݆=Auo8}nk,][HѫxtSP_+'Kkk+M8<|sûۻp$q@ F I7w&'JOY(4M}1Rh}udo V3'SԪ}/W_}7?Ow>W_uxֳ^=y}}67qe{cnGrnf``!.}tNK_=3z|kwSINsUU+]]dszhu-Gu{tH&hvjkf4{mD2Hf4B㦛BU5\*W_om'?0nnebݚv vTFF"N2"e4* bNM6o G[M#ei;PtSZNhI|/Gd^[;:*Jh?6 m1C썯;x A!`U7}+167kki:}}2M'y:N( Α?v}ʽxߩqz=A bWtqD2t> 7. pWX_r$Y۟*hODZ;6qI+3Mc mqLRe$ ׊%',8|,bxjeɨAUk""sgv"?g^[;^? I{ɷ9N aIaNNfF4ENPVuUiҸx_PyvΫ08 u9TSǁq7J`B'fZcR 8Zri8'yw6G!A a/.‹z,#۟k?ъ1bFSL(/OF!{.=cZ(tkOGh{;e,.^{/@r[VZIg4&K ;br^_5.{ղ3{m?M躝g}MMeofT'feiDR N0;Hk!EimIϾhLA r$lٟπjtẽŏdu$5pb+SDzmƬi%> {f՟{=dM/H]tH:HB~Nk&7?L9)jU%Zj3jj9 +"E @jB-BuFz)$p N@,G5)妑>|C^z~.>x?~яccc߿~'>#}g>G}V}߽ίߺ~9q Ij3#olljڛjqD}˴LF\;;k:AJ&hyvM'I'IYj259{n51D }Lݑ^ePw4ӱPY"()'Hb$ ç aeKfTk9`$.p&!k 3SR8^쮄5-;"*C6~ΊǾrt<-0x ΄=mM03N"5f↑W8%&.l]/>Ym jt̤Y'R{ྲྀwk,j1(C s؆[B$ 3K)0/^! i#r ± ȌٽJj$` 1S%Jlh~.6.M7P95;?_|o7g("R ﹽe fBqHH-Xi)QR n\zV;g?5GFG=7ˬ|=_Ki"3<~`><`y<aNkazw}[E_v,LP)|m0-i J&b,o?y;n4B* $F+~>gOszT DLv|-*]-#gx_CfbW'#z U۪Kȴ֧-˃o0_Fu=,Z#vQa/[K$1g _hoTs@_isK 8u,{?UG?q:9% KID”R| 3HxV/mAV Oѫ19I!٧nRԐD$Nj2bۺsVw E xZbaid׿yOy?P ׺CcQrbX-تU뺚Iהg§^y`}[/Pyyc)w{ItGVsY 5(Ca1L>{s9 \li~u{k= Z LHw aO q_; [N>]mNݮ"ed^BIΗ}DgDPx84w6JH& H697 [uW"bZ'f>_9-Ik|2-:U_߶x۬1.n^O. G g}6v784&!;Ob@u=&ʉ$}gC#ؠh䜶wsnS6BRfv s aQ؛Fۖ]aߜs9v%P/ BQHl 0aNHF{#$ F0 `cmX4P AIBBUSxռzm{9g~̵Ͻ% FΨQۜnfo~Q?qe_6=&8_bf"qRT$D`f]ε*,c 7#|K a3WfԊntx|OZ;Ѱ|<]&;^eͬ%_c.Ib5 'hR&@w_r/'+;R.n^?[{.e% $Œ9\ @mD(* \ܡ wy`nF Hf!Z&oF!Lbi$iwSI x&*E< q՚s,gi\/#0Hurs/eF8'Sy~q"9G*>[SБsn~ge/^֝V ͭRls#*,:5U0h/z 37;~ԃȭ٭1O/"-^-dWMu %izFW/n9]8% R_Kgv=ndINR8tzDwV!jU@ɍ75|/WW{^7ؼgލV-J)nu5u23+6r:$ta}Wx旼a.'l]Js FP{v~*Fٴji \"j,rݍj܉A _H\Ϧ6iH( D pCa\Ra*IhsfKXIV5հ MN=҆P– 톚5U/Y%W3$^ r`& #E߹U&Fq# Yv!.9' H2S35 3SmEjl9z .I܊A &o 3KTuL4çBn 0Iic`PnjmHzDUnOF4rInMw_9:~۝w_]_N7ӣr{)!J YncuZ"r3u3RrU7pSi=O&?j04~Y#7"bIN09\#d0 M$Z# ̻YF,?d=$ [;:ӕΛ33VTr.OPj&,۝ItpEwz;??:טhF+TPs[rXysO]qSnM"XFU;/mۡ-uzTf͛hcV'>BEG]8A<Շ.Qߧ0$/ eR ol|? _[)}XyCP b_IP=bj,ܲ͆>?yȥC̷8TU߂RЬC\ 0;1O&1X̞01b*BFpqfdVX21%Fw37SIݎHU3ir $wYo6aY2A;If2VX$I"LM@LM$.Sf͌ rbuڐۗ;+?=y?qCwisO"6.Xe!jnjbkGnL/?3/RnΪf(;Av̳R72"K{kӑmTKjL\kb/< m灐MUxfdڅO]87wZZ+WwɉȭȐTbC K4:ZIh%E̻݅9. fnG2Φ /a=+ƆzSޠt:.I^nf#[aa~xl2$fI7`}}%KJw;mX^Z~ͪ&kj!gUI]7O?s\쯖8Z.t0 c˯EbR.~dLEl6)fw̩tb{{ S: lMl{qkH2Tp*H_s7ޞ,2]UZ-ri*}XS9q.HE'I$@1O滩߫/|啰ڽ[Cog>ҽؽԇ~g(5K1 M% TSj3cIO3&< reX@-?D7o{s2m;֌H@`FFgXة pv) o3VMIҺ`;i mrWU'&Tbq(EĘL%c5a9d$GNIcMDS5Bs>zag*+uLCrKpx uDN 9B2WÓ;mpCp01 )1Hm· [(@ dMfV8G3{bŘcۜDI (,Ltj*j\tCN#{ NRDjvY ݛ_&n X0$J̽!vd3G);غ $-U4L; k'YԪI܁8ӮzI~E՜x=M6 ե{\֍nDdnaLT'K`TQ]L+ȴ=L1r}r~0'+8+i}I0[RӐshO9*\R) ,k;Z>OHNRը_vrNH BI)DBAqo0L=; 3c"YhơB&jpKw%eak0.[_We7?~ߔ>I&JD eyn.B@3SJn`o^#0EpEbD,<˔iBUkU5䡛5' 3VY4,KTIB' cST*(3b%yUY+)\dT^ ߾קPYY;N&zbaxOu~oGT_*wϭ8HZpD?{S܄&ගuu ]ߧq*F@BT͍]̊cvx53È,аE@2ļ$gS :3 !ƒL3LaD,u$@ŌX[̧ ,8qὬZ_@ Onrϗ~>H۫S `v$B/y!kh3w~ʹQ˧n|7[ͯa10DvN,8͵jH{XsywX7g\ tZhw6ph&͏ҿw_:ow'j , Zyq336S5Ij5 OC?E$٦ͽ?2~^pioϞI>sa!vDZXb}|lݧjeYŋ}3/[l7puJDO$2@*’a 'eTbNo-i\[[ox`{߂ bL_Ls}Q}|O8 c%8q)I &6kLdO)wLVDrj|}/?g&[K cwү福4lLn}팲@.3YVk"Qwe,!G%VՂlZy^&U6ȕdfJ"nJJ0U,1HRC&2u:.j&b\xkh811C"`خh>b{c)LR݀`?0~G.毆bdabQzREOa&"UU3s0N׉:x%%* '?s 8GwVt德ÿ2|Ïɋ26/HM 'W5ef5XQ͋9\c;3`Gynsp=⟑8்$e/5 (5&G hlb)U7i1k+nNb>6t6{) OI[, acp \kIPe$IMC:g71ώpD w;I. @b\n?}  ͗ߎJbH"LE[4#Ff P7ĮM'| SsZ^/7]r9t"ٞ<&v&]*R~D\jIP-3úɓLS'2bDǦM5 qdaIiG" ]UUC: iJi4x;ziFXȒ jS|m499Y9,ir;:Yr2ܡw JP?0ZOuowu wɍ݃ժ*Y:"o&%q׳y7UXn4N.yUJj-DhFjX{sttZoXuOQL֤D`. >@8 `P50̔3Bd]\ 'gvļRK"Ӑ+-(eIcP"%~$87?9Z)9>C(_LS&h2q-T^ kK/}Cys}w4y>-b3=rb`}hKTku@өKÃ!`z:,9gK`O7v}SFwa'B<q;hMX6* P?_ogOL߂@zLMϭ݄hJ1YoـjjieϏv'qr6w+KQ=㷢ڜHqgSaŌ9ĐBTmUY؂b[2K P@JQJBjz{0X@ \dOVj۾E|?¦hF&oH/$ &B.€Hȉzw! c@$c)MH[$',qzB`$q&JF9HYSV4w&Kvt:q5y,-1B3,wwAY{N+6d_=̍bL]422w0A;“n"k-zp@}G]TƊ.w7Ű6r睭5N'&֢I 59[אj0 151sj7b|d21 M9 $lZA,@3\%.LpEQtF0k 9E.re Xu?~2<7 1`ii%bk;Сc/u[ Gߖ?ߞhvpo7•~f159@F$ƜL]L'Tm28W. t ဠc?~\0ݳk$bnV%>"bYMT |{Fb Ŝ9DΏ>3# cnFD 3O9FD]'td13a}V̄*=F( MH&%s럑V]ݘk]"[)I,g>1wU3s$wEVM%0$qݢM{7JqϤ$0է[u~wVa!wF!'!v3[gА0Wg'kzY+7˾9򍔇|_0( Ɔ?q~Խ!ʼnv#CRJdpwIT3]51TעOZ\Ʃ-:hɚi5H/LEAtynmL],j9:<>rf׽NRӕ9YQ#W+$dԌܙݢ&7Wls9Dom{ s͝chs khijfL(RU9h`҈A8>mE@!Aڐ-%@.gF$kglA6!@*NV1X-̪4]=Vs]>;ρ$m~:xI;TL.Hr/O2t@Bxj?pSr׭gLs'v')${ͅ84ڋ}[ˮ46FN}%ώÇ7?FuaFDd`Zc RB{6Z=ds" ؅?l5.Hty&H| M&d?tzf/o9ܴ) EyAuH"ί&ֶAP?Nyip"Njab>=О0{ b* s';zI!@408Fom77_uS gVc @0ӈOm(ØLELwjJ w iQuU;SJEYO_tyfxaGd˃]Gf)'5#-{<;qҪ+ssRӘ.~՗9nexHZ>ď-KS^{odPP"Iw^]i57bNXI4%V`k´ɭEu{̬T!Lښ1 #aqzr);hҚPXo2uYjk7jt6FhbJc)a*9<>'wu>R-vtfՈysk p jaM!IΤM9>?e4&*V59)Q&;esp9GX\X" ,%C%vy jm&E-G쩏$?9onٍkKul8 8<ﯠ 5oo/=2| PB @^ٵo~5~I׈ןʢD) 3 J$Fx$ Q^gpNd㮣~Ǟ]{XXOK<@Bf3_~lt"f.V[F IDAT&gC$IJR͈ub8>I ~N#/FC_/{,5'y"Pb\=?]`N./;1I2A90RO_pp ZX6,s9/<3_>w9Kl68]=˿袃2 gLUZ=p`NZA5WJȪu/\1miVrmUb}O'vWK5I])y07C%,I͘js1ijmyCM{OO."%۾R]ԁRGy'xB{OO)'JI"Pp\ 9bkф{HBI4"ndQ۔=_z%V $1ub6Uo_Z?i#94*L+'ս;K6弖ԦSE}_+I~w;26xȃ$̜l2lbՍ("[{wPoG_OaHS-'4XXTx\kW[}k t1^*NMH[@I2m1fAOp8 ]؄KZf{ KZ'$&5Ϊ_ Lw,e(h_}^y8? yppMxplrĪZMѻԣaU5KZpNZ( `>|{^tm\-P f~n^xTs[?g'Ś%l'$!a&}`'gɚ&Ŏ\ mf 8՜ 8+rw*rF,-u?7 s.|;/LQ5P ͐;Y KINëo/u"7$aLJmhO=*gH\دwa*Q7i,fڥY.%Z-NiA3ܱ7V G秥ҭᗡb??|;՜@˺&31+6P8z'ȭ@[pwW]:޴m~76$?xñLsZj^k%[Pj|5`FG^|p~~)|~iCZ'qr ~(-Pď,⵲0(;HDL-t3vQ1M9q)S"-q y7 { 5DfjIlq;$p #Aj'wJ9Rk .3TX̊`=Us-eNlN'nz⳺q]%w3wnur6Mbo*X{p${^o]Vp9X.2" )qJqU`'C3ܴ E@')[A̝ z̀<ٖK0t *ھ ǍFSu3),=vtS:L{ϭ%7-3$KNN$)\Hsu!  W4j!mPvKL#&w" +xN{g{{^A <×>|륲pbIͽ"BLFr vAͥJ''!W~Jx5u?nN)Ks:sJȬ>zP-@04y$ss[ EC c_yGކ!r Vz&]P6x£;dы=,00 _p=w,ywvyoo[žSf"OYGVLϓ'p}?}]nO כ;aj0A(=h3 Yc.؅$2rf??Ƌ@돯~a2eNIRbfZ2gzY.C03AE('^؃I.F9c`Bދ~0}_7yg Fs42nSYynD >SgʝXD/ݞ^$.{u=x !3QjTf1s5SS9K :'9}]9pXn{{i۫AȬW?}I)04DM˵*q͍B(2;\xhnDܠ]g)5;vx0-7b ba4a-i &YږXJ l9K-" Sv9s"5$a,l iX*8ˠZ._޽qFBfBu\osGNxs-URV2n}31 x^rNCerSQ)bnPU".5|*"L0 wH_;<=ZibP)C>uBjP5bR@\ьg8 bY멩D`BG-T d5y(@;qbÈq[>vE^6⠬Rf!mR{^ꓫч>- msklQQJ fd"%)0'2{{?P;vwFHhiMolg|)ԉ$fړ0̙x1 eh ~4WYdO, ETK v^g 1TYmş$^Oy_0N"̈-v==wm\/\Kl,20;܍`+ԬQ44N*"\f|ZWU-`Ǐ_b[O⦦]t\e~Af ޖZZa,r ˶B Q+Kݼ_ݝK}Ml~f wKAf3urf7X 5isשQBJ2'.FN/2w5 @dj8*7~5m411wiX%uZvUup SQ3I 5@ '5K1"f gf-qKI' dy)%(D}N#`hv9%7cDӤԥ4֒( (nnDș'$uqNI7opАy:f*SӸG&C~WIҥrvwr6M!TEeٺ2 T4N.ܠPB%BV̓"7ԫZ<_y-y URTU?XMaQ a|94 IXgQ@Z(5WEJ40>~S#/<dz+ M]=p#=tꋄ!5#vW3@N$%"9$̕ ް#oXJ*_x'Lw.J7GQcawmL ,),bLCDV KK@BZ-,!;CȓǏۿ/-//w-t'3r͙fEhlk(x$CDa`pET/yg!<=eW3A ND"Y`6 _siB̞GG՛ڒeiBNs׸{DWde$()jJ$&H$$$$F Մ $T(JJRVI$޽^k} ֶQRw;l7k}orrվ8g7wϻ/e]m*N hS(DF¥c}2o Jz ,@!a$fcn'V8>a_8|wt(T6 u[8к;Xգ1eL9DX!zAsmQU|??㫝qv[!\ʿU뾰G2wR@pPz]ŒPjZ\\U@LssHC2 EȒ}|R\pD7n*2F/*@)3@81T$ex(p=,yS-5;^ARy7RJ8fO;P[ÇnjpyuA٦i7?˼̧ETIJX2;S-7™$Bf \P;kݜk)Bn"MUòQ {򿰺ۆE8Ha x9 ܳf#rrRJi3&pȢd-T8B(Dw淋7~0a0D@9%05+n\QLL UMU17.e;e!/ai:LBCF϶5:sGdePQ.,ID-,q&905RE9q4W`/>}%F8Q*mY"ǁlu!*ǺkѶZLNL\玔{hAz\"hI|Z*V%Js:TWeRU#FM0P1i'$`sg6JMED!bqoUs CX y-i9y7mkQ7x Y#f TRXS:_DBCK m>=]p؍L!n5D@ʾ3+XWAe|JfUh&qip~<񋛇{+30f0~_AUjIH+N/)so>k#"o?Z3IE#; $ٳ'H: L9\8=e)q72Ť˴=+|f #sf[;(AJA*{h~o޹#Nh:TTDIAd KG( vJGűH10*aWvLAi&)' m${QpиtYjԝbT{wC["0H+Xyoo8AEf( $yJ ؄ DM}SM/0i ,^ԀgRbKE"P)B\*F2S-*g4qSK'1E= ^2<̴.^aUUk)CuYΧibXxe^X*輶a('r}}n7x`p |24_(xuʪ9ȿFӥh-iuUA Hqs*(ixyRd.Ze%sI1k)Gc@'X,]4B7HI\b.i& < f.5b%p-R!N1 $< r$]rA:1f4;{CEZnDFނ"䭷:%hΝy7w@\#wSՄY\i%@=`}YߞA/vνQgw%["5}Wan b'0{X@~tv0B~_79M9+GPDP@U"+HRb 7W k>RTr99=1al({<;CUXeyQ #0UH8ZRs~'p)H&Q\aՒOX5UMcˋ&۫֒L{/TWcAH|p3ϖQ{5%G!>*#^`Ny+\{ ֲ$"-BD\zq"?~16ZGR2=2!H5ޜGE9%!(Ak"< r32[ hd݊h-,*$ZQX0 L%Zqs}e0JVz'&aNV8f8|fejKYzaY3(+HErEh̴-B9Z5߫0ת, 3q߽w3eėrR Hr#Q=RȺ)~c(EU_{sQHIyR^p;@ Ef?:gSKAUdq:LFpCD"m-7zvL?OăIPH#?mR8p8$"sU*fӄ"8?8=]%W)%HJa0 ݇9ٖ2.6e2Pe(^'x(R0p CϽmf*Y9խqdf&vft^ItƏ;}NN)%S PiQ(J WsaJa){7rf@9,,H0 [!Siwvf0QVs8iO K6E9Y#<3#HC-*}\x-rpU4@f.12! Bee[.EPx alR'eY pPH-+Ql [W:-˹ֺ0f؏+ ;ёk .|(S!^/k;y/Ni0G(lVw ϋ%MDPaJ)NPTl ȋSҎD (  }1d0\U9 84VN[D3zd T+DUt΄6nv] Ij2^"D"TJ\!ZG[W2sk-qDŽR@g-{7r?EyЋPUR  Ph+p6BD\0Z 0:Bh6;5"/Cvu*ޡ)L c& U6yw/E;]Ƹջ}q7~L90!(!?B 21*Za(=9I97ּ%90{YP6Mh 0ϋpZi1I.K~+$"*Zof\T[CZyPO"A֬hw.6O_7z;0RW f%0Ol-%6<4TȚ u>3"3vbhND:V mѹc- $v8{zs ϥIۜ pHE= 21RץkàAjxqxyu|9>%pKMHDU-BE8NyO;R0 Ϊb )fT|ݻ[is qwɊ5UD_-D*%F3K-L!¹t 0h-|͈VeԂd'(3o"9m `2yJP 7rD \k),HK k`DTW( 7ew@AyɕRHkф߉}0B(V(iKXđ`n:95̙UJ Vð+5 I5=2H9{@RwՒ" .KКJSGHFHJ1H̚f)b86=QP,L͖qXgRMyXۣjw<סL 2'G&$#W=.˺J!i\lfu&kr[330.D $5 K)Z#2 6UrI^j*z-_GZ@)Rxj$` sRT-VLF`8*` dvD ̑dyL̜X;Ha u6'+$9zH.1xiT~G"$E EaanJ˥rDjI'D&Wg&U-` 1 W0dѐ ErԄmQA"Ǟpa"VԃS3w +EA3 %!te%qDX#τli[]d7 E.Ik"*,`f3'"UD0,2^"k"B]"A=l(\U9DmOZ3RZs4 `7Qe`ye*ZET<֥INk/.#Z#r:?3Ee%1" v= | ARyr/ҬD!:I]e/%?qނ(ra;A^у MHа 4D4ҝydo@ԣTeM~%i*-J'9OD%KB(؟Clz^Em ;k]D݉HU]On/:"D4uR(p]O7Rd%В DlӶ\EYK+Dx3!Gi%) luE 3k8'ӕYrjE)ZeP YMjE@R0DAHLYfWE_{+$W)OFWW斧ذ:gXNɋvw#@9do{eL}gjѢJȱz?=$2e"0- &ب V kIuZ( z Rgv>.pN"JDD66KXR_T́(%#Z̑9'd_xI "fIHj[rDPKOqyRs7w1l&,93%Hg$jyp" sݓ2 I3B\L]0BHouwDkT yĨ5a^m2yQňUj3k{:̰ivOwaxjeY R @v%!c#VyKϢ)TX)bnȟz]/nh1-̱=AƔMKZ)YsDD8qsp]se& ͂ND SeK)`ο4YAz13n,mג2OHzڋ}8Mnm*cw",Y4n} M=Φ!3ΡkB)US@-ZJ@=$0qQ-2*3EQAEe32>u7|"yaJHXU2$8AhBIE*٫]%"BaR3`t^4rvL abgX,}cۍ‰tZj D0k*r^|elY!{MLL(^F!l};yw-?gDh)wSgR!$-"$٣lvsk.U^[ LAHKxSuI]I.Gt|,0Y,t d]@0{FWl9xS$T|ּ&D1 @,Q9B[KdلYR"U DRe^Z.U΋kuYͩs[%awXZ4#kA´FLf+A Ģekv[>f"BYDE6ikD9s$@i0M6-h-QkqG@"2ϽNBw?..jWQ=3Oh t8³-5(gZ- %b趛HGLJ,QL[IʛEeW"q˗#[ w>ln=2Rr|33 (W햩]ugH(@!Rd+¹3lJ:Jf:oU.*X02F-ެmה0qxT6 ٨eH*Ȑ o0V.dXRT <) rJQ-u/H N,^R,y"b-t- Bj-B+"_t^} Dj)Ei+RTR tFmf<"%"+Vlkܡ 6k@6!2!rcεy<B9v3DU;A楐S?JUQ6K7_Wc)!fE\RҧNyVIץCm ppk$2DLA&SH*#66h;]`:z38@y)g(eEI%;˚pzbͼE_[E–h+ ky&q:4Cn<\%&u5j-)E/ oyHܓ)E$[<(ݸãZ k{[ܼwEGNd~x D2אWWbhA"΋1)^,zJVy;YE& h_iɥu9h[Y~y"ǩ&ܼ$m'J.saMXX4"Y8"\y5kUk\DxYJI [(Z7z$ n^Og^X:SY榧Y3w.&֢ IJ4`^eY"Jfͽֺ,k*yK58 mUskk%a-YΆT5hCmoCZM IDAT0<45=BL$-Bj^UEjg+ aW&* 6kdeYܲJ@B$ǿ{\83-N ǩ5>x1 k+Z%֪u ,ND+)[c֓(zvRh˲2)|Z 2N;ҬGxY#,'lmV.swckg3} ng<kZE'&FÀooW_}߾ݼ~r-T"X.ǫo??>}nW?:ɸ{𱒔a|!n_~˫š8݇}xsq|5|z8\[u.v#(VLopuj~zF4[f0yYڲRj[CG-!~<|r~~~2MqwuEN+q݄%x7[ow0&N^on=xz<ʏ?ޏ=t%f<-V?^/_Zߜ~][)ezGwg~y>װ{q:xx~q~xWӟ/2S8ϱ>{6 4>=~qno>̞7_'pBe7~{a*tjo^Y>WUD[[s;=ܫq~Rݻ*xN4>>_]khxrzLJW/k[ϧ),\_0~|n!׻wo_}Njc&:p~~WN~| >{pva:/^]֧|X8.?~m}w1VۃN( w~W7?͗po#p=/|7Loݏ?~VIno}g=w?ٿ~o}Z@Uz4E,?op8Dݴ}}~z.C 4ND1M% D{|g޿}x|z>]o~Yyxw~:=~xqoXOw߼wwt??>?_LROoO÷_wjcՔ| _݈v^Nm:Lm]Upm!b??fD 0/y]\:b?T>|<`4]_* B!C-Exڼ.&p1q8Nϳ^q ~vG {8ixjx:7o'.2-V9e9UuZ|. 6Q7G.nWha>C'8w2m ,ԄⲰ4RB..7k4?iT=1v8ד"v WׯՁЮ_ ~>oh73^\z.Ym͛ix=\ POi:Cݕ<秡tk(0 q٧t=?}}:? _|zca=>y}XtZy\\Z?L7rP=yu9anoyeOvUĮr?<*;l]0L}vi2Q/qYߏwCȧov5ouTv;%Jq}axx"z<^~ F?9AfՅC⟼7ü.;=(2\ɓCU0C+[t~*4S[q8Lz'ُǛjr7"ˋ\qzZB޿ώww@//~{p=?Nfq狲|y37v˲_GZo_펗r&wͫ}n.wWף;uxp_;];\X ;s-Õ:+dqd^ˣގOͫ%Se&|0unŕV?yuQ|y9-pգBv]^_W2O'y\[<=/Wo=\̧ed}^ZOi=-VOOm<= 0@fledjL֐h=,.I4: 6ϛ^ͬ(i:_ <"IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot11.png0000644000175000017500000036566614620351225030430 0ustar00hanshansPNG  IHDR65fsBITO IDATxyU'zNrګT*j%ݶmlmˀa`af0=, |ٍݍ{UwխUJ33?ř̛VI-ޫ]͌8q"28x[ FD--刀.ǐk^HuuZjKXdp+d]'b# Hx!-z7:~ :C!B54 1žf4 LԌw[E0(2ll(xPB7$|ZwqWGdْ'BWu@DVP.8Eⶣ:wXZtOfDV |@܆q\ޱǿx}it{ O?x"wgO@ c$D o}?x׫_q?5m}7PtٞYi6,4-KC"̺EiSR6BrePz~j{3'NٯB\?{lQ9;^7./<~1Mם3F_ß{'/ LWё1|;vG^p/թTMN9t>/۝CI)O41cUZ([IQܬ (y3zzeIp相]`Jd㠷W_kx-U+sw~X.}7?R,Yux7_ ?aH[}3ȐiȴR_͗uRz27mx2@IG8α^觿F%|c^0ܻcn\9M{ϋm'| 4dr[!2Cx-@-=}OVUZ/O cL㞍蝄O(-($Yoegu$ߵٶDi$h1D>4Zǟdo/X!"'Ԫ@BC"ё?_" 169yه?巼]V@ $W;'wzv:<+tXYXio_Vi,jaգEj>o_[U}.Nd zf ԚbjqPW3 ,X_kձ^}o<zs=bV,~7/S{f:٩3}!c W O=o<~Y( ^׼-}A4\}ܶ+hHD?sܶ[#if(v<2T_\*4}yZϥ䟽пH ֹ%馌M+&Bg7TZ[?DtC=@wM{n>P5Nk cY?1]c57K'ǖ.&FȐյCcF]rBx5GP5="@2I$īΔ,ξ_26]അ8n]1q?_ԧ8xUcQ$C\puH&s^0 Fu"crBDCD$A4}d^Uh5grB̜JI!J-%C>hrI$r3̀&S@9̩7{Dk%B<@+˒Z,+_kxdpEsPrɢgd#  "!?CT"S$(@V@SBHM(xX[']gclñpxmrH$LBP$ĭ}rJ0bޜzE̜\u;oK[@a $&VJ}-C[syScob ]裔Kh<L0Dv n%v_uMY.)>t`a_MࡸN! [gCƴӠ fGP~FFWt'Q?rQ2N[!c!Px=–d7"%x T*it{lnqDdap49+.ءLYt9bdQKR ՓMo""f6ec9hER Vw,~g6t#J~ 7Ѳa*7A5M])֕0uG8aΩ+JzCnmςRVBMgOnVMIf#{"#<a-F] z]sȴBX62{"SnH)řf-V_WKb4:Vљ<'l6mӖ2>~R4???33B?~|||hh(zNDA:wEZgzN@G)KC͑]slj@;pO[ޱ^bv(j|w uFVd7͵Dw`?4 M/]pA˗/ Rnժc D7yǏu];vM~cǎ=s"6MVWWGGG`}}\.m!z: ^iS $~Z`ˮf%EFDW"5ۧ/\қu:[םf3?v?/諍3` ~Vɲ76mSjSN~BgMMMpo&ؑ#G`nnRLMM5 xGC\{t]GGG˗u]7Mǎ?Cvرc=6`SA9ljX.+jz@ꥮa*PT&Q`p,I 4!xpE٬:}}C Cng id+IPit ܦm*뮻z;S\.u4-BDC:mU\%ԩS/zы[m_?zÇ|I!Ğ={~a]>&k4RqRSx^P+_L1-Ŷ{HdClL_ {%$}ӿofp J}m=şNdžެce'5}M#χh3(,O_'ϗC{^M۴UsQT,Z\\uRD={n .LMM1 p-rsΎ,,, 0\nHӴR{n]{J(|ۑOtkwi}'>~'%(mȮ|n:MHl^+n`g'JxrNžH茶M۴jZ&'sK4Dd&WZn766v!ߵk8KKKϟ{9;w)֧?~D{)hHDZ>q9׳$hKZt P8 ?]M0r+hlS˗oxG{omKlܹ3bڵ :ÇQu]&y||/dcϻzhRk/P6t =B)4M\KLzdwZr"Cpݥ~s6m5&MܵSZ[7_=0ئfH:у/!FvJ96~_ԥ<)jϗAQ$#D"000,p'k 6EHm1'y75"_ HkH8iQcOn6m%C ;_CfNۮE *'<a_y2sm6mӠ\}Z(lk[v%_{0&P #?6m6]SBDO_7|;,h5#jiAHMY>u{&&Pg  |>֡Y(ͩ15yߵK?ۖWoj{uh0Bd++fd#+CiK}7]C "4wH!+fuTXc5Ĕ0Smw uLȞP&2[:_ Vѵs3*(eJ-(%\HDQDžT#UNNDf5-+*]כBJ!^(H c/޲<"{xĠU VshQGSuobP·RG DYg QF%)/Gʬ )Kq$vy6I\y@N hڼ/f.mC,U+fD?BNtް,JOJmJ__CW'?jCpYY TD`&reJZz 14"S(TAiA7)uS6$kLz%џ=FXЖOh+"/&MZ;9u3mQ%I%Oe.e7Tw1CaA0PJ籜1bV2aJq:QA&GΒٿ@[sr^u/'e tks#OHs# YT}"ׅ3)juW9 `ib $ яk ̝'SlgBs?0GDe@̽Z(݃ip"O2=?)~(IuK$u-Rd}Ҡ˸' ˔BD 'Vҽaɏ}DPl`P)n 4J9Q([\ӻ(8 Z~^"A9q jyf89fz spc͖Zo^lCM6նjfUGIdl;!n_fe)qJǜ߄WˋQĝр6G0rUU O,jl KMU_%%4ܞIpD(Q* )M=0tT>ܲ]hfȸ76\\?}qdNIP Q>B=||.$:g6gˏj|W< +'T?;b4֖"of'iݗ$)yM q@}"=]*-m'ǡ@6mJ8/zWNBm Uv;oK5/-4/].o86f hg&wTvMMud#z7OlM#gf)}"֓UdKQEGT1FQvaEa"V|JY3ٔ(ֆ:!VD~qq嘵%CS4-)oՆ*c/N{j_X۷ZWVg&4И]+d7ϹvM{'q7/>Ifkl!Hmrb=?Md=qyI\Ev;عD _j=|u C!<0s?øݜiml8=Ȋ?ZWЦk FCPd\K=Zɑ}o|YuVhLc9B. ]7|f»O}}Sh c1O g9)pMJTWOVo>0ٗ;V*gR1m9'yWHLF) P~58<ޠ9wzlكj%_{!!SbB_rFn9/43ҚVOz.ߣX Z"'Y XHj :tjNOhCl;sh_Dr l6=#A>nAjGWT8Uyq Kqv`wF3^f6Dl"iO=7£%}>̊sfY<пteKCfobq#[<>ce``[QIYĔoe/'g.5:*ڶĝ!ɩXa2cVs [69X3wo?sZdw#u#,?q_5-w ߰?px4y7rXYL^ .#)% P"'M5 tKK$B$ggGt\Ӗr&3>*MkP=ɱo3^t!" k D"BL 7AM2?d;7wƟfR1"(RZ^s!0C|^'0>$9p JW_sRFR O!rYeNMz{ܓ{ dLz +TO$aa@s}W6p\(%SӠ9ۙ) Y0U.n噅CMT)ONw!h4 ț-p>@?BCQ/z5"VM AAxzBlXH9U CxV*m}?L{lFEܘ@U hD%wʘ\`hm EJݦ'WA%nDd )2̨}BH("~G@7!ӍH\5H9 Bwُn索Y+,;2X{'pL~Q)=矪nEږ(h1bDL܍X⨊;F c֜tzc塸4"18(vrcQ7:ӗŻ}9\=4cY}!tZN8;E<}iw #UJ% VRRk@qt#Wmcl5Q @ V4v+Gc n spr SDrQ{BȮ&6''yd4"gJƄRNi^f)ׇ'{H%r_yz'Ԯz+Or^xt7̈)2$'p_@F hK1`3q`#0/Ow{y0]x;ȶ4ۚ}\FZB^_PIdbg:} Gylѯ .m{ C{${̩s3o LK|EdT\iQc*s[/=҃'p=k!̑˹]o%6v?`NBr^Pb&XYQ؄:="#_w毉CYt^?q>V2 P bRw"A'@|*#P|~2 W{?T/3X> +0]I?z 3-v.mIa~zMuV/헵r<@ysް~n?H[@]ktBlݜJnѽ(Rl2aB< }VorZݛp}r|j>R:FZќã7>}NXvx.k B6ʘrB-uY &j&;qe)T=BoFk3ѩ}OaFf{6 ű?1v˫LW\;7-e5k>Z Qr\p`8xx .&-SE")3d,8 s@gٺy=R G^rm7Tf&gєmC7흸Ƨ@ JSp-/w,X693 胎|܌5d T,\z~ۻS<'s !qCFEH Ǭ,{?Jg7L Z&MC6SMwn^2dQA*,g뭅/=ThDvc͋W"Ck9gjw%Fw)PDwU 2 c ` * ]DTw.@ gs!AN5-@FB ,R$u&G@R(rA5fFIH_m 4y^G[U 44qܗhZv':`ЖY'_r+3J?ݽZ\C4Ә#żƵl?A|Qx&:v0R';RCQbAE&L-wD L'b]`< ͧD1]W<'Ic! y0KU,#qU=Ε=RcYG^16` }ғN2@% <#Fm'4"V'AL1fz U#L0*%JUbc%sw>/P? PTX`N*)]8UHRqR'$a)^?Y_2P})gZ/4b:1_L"rwĮ^)tcCWTfr fhwܲ5W2C_0y6S6%ATC%6#ؔHUpƥ9Oe$(N^l<\2K8$I6 @V˪b2Im/D><#cHg_=(gaXpL"o#儶Y+C&=#Fo9ˏ>j6Z<ڿg"lg7smoDԻk[nv>\T[g pRXHsqN$%3An$T CA:WC&\0?zIl+S]_LZ ٧%3>POԟqƎ`כ%__s~V_Az/;O_֛)&-=y8:Tf-êJ%!.b O@BoTTB [yEYˎ,(0G&@`hù8z`=2t!Cƈ;RmaY9D Jq,kMes?AdHdAsˊKuiBirtLO_1Op,uG~WЫz=\V~nK:kػG-t\ ߢPD*% 8KϝOtDXhN3z)&-4(%#  {ΞL^dwx|W4NGA)ǻJ}t m9yD+C>JJ !;3*!c"i?O[nysUL=;T+!0vww̨_A-痁`ОGOio*_hJ]%Qhi6EFQME6@|q;DtᄑI]=8 ~ P)I>J})>%-l'&禐U>253/E1.H'WMk)5zv1"!ʻ=쿂a9v;nzG>gBl.,WvNzh]f&i~RGQyQybQBx QL{I,gx)… +%û>wc,Ǿ| qnM p٨xnFj%QD uՓJtHRCWdFi%>$k>9LȬ*6ަIA )G>|"DQF{} nȮ>;`ťRRO-=O.a 8w/|~G"T]B@FRxr'S{łlͽwż yKRZowN0h^\0 -nvv -lD1SO[RwG w7$瑔D´b)lR0.FOI !J^xù׿R5<29S6_6_덹70CCDAVY@q؍$Ay`BoU$B#H5v2 mb݂="O9߂Q߳:=r tU3A IvbDM4F0k앝/S/L䴻N׾8u)m f@Xr@J rT$ 20ԝ;A3+BQ/g ;9s\6͙ӂ ]*]!A^@^V>0>VbbSzO5mx\>YaGDJV!: T*\yzQ+]~-RIH:f8q6 {uJ??—CC- Q׍jɨ3C7ȧ+:u7*Knٔ_t)e)r㥅CĤ"@#JѽHP|FO8 )IdT=BM8.4XXW3 K@S̡H`J'gQVQu[!)Xb̻gQ7.-,|^+GX z30@uو&D=woG6u9d8Qb\иm,/ SJ4rLqZ7!T\;%fSiFࢦ;D"v=X'"/8.BT xz"qnIL0T39L bce. dYiqjE5Q؎}K^03s8͵f gE樬Ȭi_ۥzxJ= q8o (ɽ'e䍫P DNMѶBD@N2Ȼ@]"UUHm* BhւdLr/$tCRnɃ֋$P3譵eWLrcee$V@mB6ua;5ke~g CK/ʽ9{/2XD޵~yh4~h$RmtTe!j>:Q):78KgAH A,<(?ܲ"1($RTÓB3/)K,g7c,"?0Eu|H*JyXxya ANy=!8$5(w_V(QR1a%!!;87brYSܗ*ҼrD*f$_ȕ8(TueOR"bPC)rz!nܶawu1ۣ0'uzS0r<zXX{~J;[sKG˽z {". &_Z JS닼 \h1 <( ?d $ 2NPz8cR%ub^ًe &(ǰ%q cSz!:8VؐF ɛUpOH $sۆ៾@Z_ Xʞ@dYϒa<Tj^nP*1hr)yx9Re~v6& 9$))BДK lU;c>L l#{9c`@+1 M^aG@?A'+ȍ!x+kыnK[ ľ#qqnuSδaiґۘ/? Ȣ B!+MYi9TȅTB&]oMw $K#_UP[+~ -C,)RW[A*nߔDGLyO&<1BqK2IFQ #C/e[l{kPαIq)'룖M}Q"vM/c\>8!R30Rd~jϞk;JՓJz5DİVT9HX?zX+*aLⷦ4HȥPcH{0^ @_%w2Ȭ Pg~J/|J ^Q"xnepIm \2pd1K虱ӂ<2PZqHr F[JҊEԴ8D ??3p~qVzM_(I!QgOE ތ}lqE-qAH/]S+'2]>K*H*hr 1.ze W1C9XK xEJ&GͨLc †5S$IH0ظ#$Kէ6@n]]d m\ PQ@C7< tAAʦ|!Z=xW>#^HR hHs(66pG`'4=],qJud[b@V4W[:  BuJJH(bH_]( N"pJn4e8@â3@ 0c|ƛܠ g6H:ذ??!RwQc<>rCN&90xvKgh,og^tdE?A{7PAe,u@ƀ8Kp]0zߞ(F؋c f BA&RE<$ (LS IDAT;2OGl`@z3pљ.`^AEo`еC\ 57mG1N` ʎ "uhzٹ\v4 M7 Cf=\6wNF۶GtླZ(Wx4\hN@t;i1F:.QC FƄwtF\ضC3@(h9Lq8rAkwmIT3cR̉*cKD@!k$6j #P H~"?gEu1764 L.M-M8ם1%4 XoY'f۶m"%/Ttвװ6nTX añQGbH\mr(DcclPIf6V"1ẆFAM +%\o #s*KZwlgGuT8˺;[ mtT,qYmSdc$ܽC@D:HjIYP8w$%BA3kidr*DXjdO/J 8ϟ_Z[XM\]{n8Xx7/ԛ5KQ.sa#kf6u+\ulP*UV76r\u۶jjRn[V;Fڹ>͋ kFS!>R0FK3‚f4Cu&&FfM;;iȅÓgWC|1ؑ('BZBΘ?-:CB!@p_Dj < D 5ܣ+ɍ#2dQ[ilTfOζGfť7unsI: G ;/Ut{oLYjڕ˟l=ASCpۀ!cS5$S נ{n}ơCWcEh\歽ZS-Ww%qC\/:l}rz6w[)vMOZi ]cw51WG Z)x+ 3:l5}l#E˪{ ~#7i|;.h OBhNt{D]XtBDDՉDYW9NȂZBb@`K+VX3xm$1 V4>@HJ{R3GJЌL xnvm L YP,hHD7;77dDCCq!8i qVIƫJYs,G&x=#efw:.9+vV4Mʌ nB0墩#@LWn2V5F>3Z)FRF./ uڮID9 &!; BpF _A{# ;@ D( {X  #C!c ̩z\{lh?tHeSh{mj}4L&:g[!CC}Pĝ{&n1KƁ=C;KfyD6{ũ8XY`-2Ef+-gvVֻW֑s&t.Qz (W{r<|zczRT "෌SO<ژkӌk Rj0 TȲg2v7e"@a&*Lnp@3jbI,+F U哨g2//usL4:fK*W+CbT*덎|qeuZ8;weu5C7  9u֮g*/,έn:2mЍBHms)̉Zqj$N˲mR-ֻ`rwiq`]ɑuv &rJӴ.]Y,hձrj- Hѱyq, ߕ ەHBM(5 ʄxs"2f5 &t B$Uۗ&5^{thsg:D&1֬_2EV&*pi YKE*MX^\Y-GKݕҁSϬ -wxlfx|{G뭍'Ҝ}py.ݥklj3K{wh}DgA@F%"[ %q\n̪N^˅+&1%Gw3q .y!ZS:L "Fg !`d ;UE6@^TJҽ+ +^nT݈x]\bKbA̻%GD+ yS|2kI7Fs)|qz~\*Wk]BwYE0L/Lb4 CK"U4n˹S4 ܕpqb 9,hf)G~&Zo֩FZv;ݨmۜw:6Ro r̹m!rN;m;͍y KV0.M!d &:S^=o{S9Gc0 Bo"1_Pt5@ՑʬSlhKcP קqC6UE֭Tӝ+mXZ.9k;viiyiG:2ŵK[]mسmUu6& 3J8^wN2ݵݡb}tǎF[k7Zy+CbY S}@p}= p$ nhǞ~}i!2BB ?,cccss)! ꊣI Lya a-Hn$fdBe eA|EZe_]%GCp~:AE #qIb1H Ι%DcK: A0  # ! h4fFkf}+ c GuNdZv7^3nbm8 4 &]`NLXި\cFUEv d9Ͷhw:wA*K+덥+˗vL޷w#5, pD.%vl' Y1,X1 !, ݧ2/~ e<~-|wկ,kX( `BIB顙ەzsMph?8xQfΡZkj6>٘ԆFأOz }ŠenY.r|nYZwh-.\[i])`-FrErK]c+8iRӱz/.2xs3'iGE0ho*]3]3sܮEBML cVv{4rdUcivԠhl"< Dvs=u, ",TkYX:D#V3s<KmJPаQPQ\Bጞ()_o, 博bi9MnZcY, \8ftlٵZL,b+F˾6w \!: *XY aby-ږfe]׸mwFYo[7U5^بw9:hYq,7۝nqn1Yzsy^ovZ}7.`r:]ȳon_zɷ(@}bFO r$ "\C]D 2e<_74رWZvpZwmFvS*65'fg}͚dI3s|-V]zn @`FhLA@L&ӳ^%KOzLeAэ۷no9z̪̪ /9c᫲qxO׾&u'/·w7V63¬m(>+QT*z-7xe= C:"n=y:_PoYdZFUed_7ߥr/ 7>ɵeOD>ݍ!0w:NOmU /E][^z$}:RC/a}wLInQs5=p&u}Wd--8Di SKwKSk_nv ZsԈBP9apUAF"RnwVWRb4U'Q@ qP0 "B@OBUjzi(q"A sS'XF0   )P`YXڋ,)ukwґֱ)2DЂqE@\A``p΄ d[PJ4s3<4"yo;\) F6`޸>>܊~7ߕ 09xVqa }v㭝*sg\}8Q&{՝R^ؓGPĖCEyY{X7:]'Ftt\dgI? "dgwvq|g{Ȳ) NPN}t[ 6_v⽾l8] fYt,ƲDq.|.7a ^<B x3;c9s7(NypqB\GrQKfl1sr)o58yv/7e.myiA^vQ@3WܺiKve7Z+M0]aYrI<8tM[V@a G0F30&W "4 DB0@ LYY6.K9`kkV#iɸo<4[-IB!P Qf0@Dk P6Q^VJq^'!#"k'Z慔I# C͞,yOg7z;,$3j!~\oEͦ\YoRĝv7Og; Rp0LV0uD{GOXwZۑAn6qll`znxՌGU*^J18n+61K0WJ;͑项 :L* \cݹ \9ʪGO N 0Y4_W?1hMNa_Jy%ٟ3e?R٫p0aBbہ/-NDXxc-uz!Nm ~v xqł^mxgݴ]^ϥR̠ZS{GFb'0 $R24hLRJ*yW$Ӎv,~A. Zvv?8DTU%"RYUF#zь:ZR,s^==v:T(%X[N h)LUV;|UY D -8uii-`&9~@t.+{2J3y"uY{||쮯b;qRwI=(+g|cTbnjW j݋;[]郿?mg3 JE#GO&k:Ras﬈!j׃2zWdQ@Vpw/'G-fKtVA>pyOxgv=Zw?z_}A~6:Zi_ Yb"Dv]R Z߾;G1ș!l 7kn^ML_au̸Wva%ǹD%݉7Z93,tP,aܥHN2x1Cb sj6Cx((0P`@(jIMI!*Gڲ2 _-W6tAmEĈ0 Cây )tV@Zkd1@JUيA$9Bxs0˦5{rҁs4@YMڈ #Ҳ @/5 (PLgALXOwxN4^m51[_'x~UbkqNj7hA/&tz,QaVxO>y`m*8?TX ?q:#h`W;0TV;<7{[y9Jw}w'٧x w\a|f~pﵭovk/FJ^V@3a-BDm5:zU ʝev/,[0]@nꪭJŞPdB$EDB-R+m IDATs#y@g)]LDczOx r@ND$y}~2q٣Grc-vąMg,_=-t!+o$~\ƟheAJf0 /F }J\xND$:]'sUDn:(ǟAGTTVЬ-XHٿ]i7$ӑhBD I l8AR:&Cڮ/j Uorɖ į:0/FXձxԂ\pI ~"=OgD7sxj ~al;g1DZ(B!N87\xFYZ_ ^ ~Dk5Wr2۩g)ܻߌSVrt)y8, H`bRE7kJsyo4ٚt0 vA/g%Ron~6 b-Yw BJ'BRVJAӧd޶SE8PJS-ق 2R| 9"-a 7k.Xlu(.~M ^ba\Ʌ\|.FJv:A/Z QBmovȔڱ>(QTEe< (Lݦ>iiY r6С3$HZJH)5Q { BH`'""VZ0qZ4d֕E3Ei⠒22TZ+qJP(B Uh@ɴ($h4+Y#b60m|/eE иsqqX;'=ͫJ޶n ON>?j/F'2_ybt˞a j0+v OڮdD2D% X& egc 奊pn#nmO.J QK%'i76O=)Wwu5$eM'%6ݵ !M@b$g;A,.]μ{2! hW y-3$eYHDuH@m8T6C\ߤ7߅S_y6˜pNd)h@WWk!̰֓w+oް1͖ჯrS_N0}5y;N5Y3j6)i>j)9<~w=TilFRGֺ ?ёPwrm1*GpvTzVhPݻsGGdoqQ=otr;VG n!@ZHk]YZ"Ui6 TPX’b >jzwIfC  Yb_zt.)4~I]*p>~U 4|0zȠՉmn|e͕ޖYUYo֢-tRE+0I 0 b$Gh*PH'Rp OBL okk7-1z0_RqQK_ùW-k- .-.u , ff] +((2&Q KNݯiEw~# T T̠.KB Pκ@K)3N8RUU !jIȃ'DT`$k@n(ڍ&UUVYβQJAh=q뫝,g$jc6דfU׭ akc$;ogy-ZYtFmpQ7T'P"1#YG H?MƳҹxٷxs4,S8;t2`dTprn$w;:۽7vNV*a]},&5fpFUq|QUys}ov9lEx^uׂHh&A XZT3S$Y㭱RjuPYGB8̝Zo=*o)"]eT=ڮmݬt;fܡi&z>j X]r=>tju%wBNRk+&wzX9)mT-h Bp\x f{,ƫ.ÒPf_&ܨo5: "ϕ:h",;Ox[ Ӕ,rk!JO^P[T`r`4g@) THXS!RF(j!K Rɨq6sg@v^, Jt(a ;?.M'@`ZOFilweYaQIc YOf+ ާ?w6J_{~7VRfGI#j+{ѷW%muMg3U$!.-k xFxleޯFk}٭ԬOb2nWO6~{={a|~ɢ WeTka'EӪHW:ds5XA>(+mն_םnc;ͪy%0:8K}hAuYNXiLUJB i;+BrLYE Ba%" K(58Iu~F߯}5^q>vKкC|~9^(xm)\q /^VN7崨WTZ+'+S.ЭE{In4e*Zoًiʧͻ-MvC!- l8k7wy}6;;S'E?E&?L"qZn& AZRޤl^Vq0Dv=%Ubr4)xN'B\4w:q#'fƃ(Q{㝷t^^v@`cѯ?I~Ecpmưqe$kGPGO?cNyy@GwLj8ӱ+{#yp?v OGE Xinx2.k%mjT lYPx2L*z{ѻLJ VVdхG@8d 89VJȡ)|$4մC!U ua,UA"(f- F_vl~Y~8 9\?Dv~D$|ih}YZCc^3% >_ ׏q1-(s57<* ҲuDqDۯ; y[ӨlҢݮlvwqҺVQH D#I^״[8 ⲻp,jIJC% 3M r$OOtm J)g"/'eoCfAڌ㟽Q4ho~#"T+;<ʐ0 Vڬ1#iK 2md +QAɲ%0F*7O(XQixpj P).,XC!: IDAT8GNǝP5jQ>XgJF<%+ϖа(Hˇy+'jwWj&,ݵGz]~ Fԭ-DW/E.wԂ֫9^GE; ÚCO'UcƩct5)lyMܽ{/Y 1Frʃe!@ !pHgWw.u5+Zs~h$kJAh$/i%XuZj5dQ CP_}3DEcD+kzCCay%R.V)2cš3 RYk4.ELP*PBJgKBe,%?΄R*2.ɻAѵrS~U?EN"Փ+"/Ir<k3[:2@#Ы䵻ۛka#Feu|QnJ0 zzQOܻժP*AWW7?|br(Lo 8{`AT#|mMA؄$rK7/oN\'$I )B ^|kCo:z~R_)WūILnlD}{9M2UXpEQ .V l-W(2*Q(Ip<V1 y]&CY,JQ+ +}i& kޕ%HMlz$T!XGj,3Up5YQ(q>`L]Pxw2[rVA7AuAjZ芲^F⦅nqmu^!$)J0Lyb[>^ΐ{ihg\rVjSswwѣ0PȤv΃`x]壣vff\ը#rQB QjɤD[񃵠VɺJ7No ;Vq=´kjRp5fĉA&zK x0.{FA%q}gQ]ܻ ݝioHUxݯd[o>{QEfQEvvww: 4/ҵf uks*<ljj߷SoKs-F ^סC ~0 0A7l͕vˣgֿV[92g? -RfdjfVR&7> OΫzgW t-%yHdT͚ɧsT`qvzD-# M`}H ".yfDž i8 B]K)@ p@» cI!(x<N~;h4LoD/ɯ2۞[j 㖶| 0WH7FmoP\oSP-Y[7ήlHEQ1S$ 쮯՛*Ioh3Sz7IpfswX"wNK(z{|:oU]mEֽuVC N꜓y(Q(bD!"EȄ(ű5:KuߚzA9v!x7vFzpQKX]熯`[Y˾EP; ';đs=:>}O&vNK'!"BUhsڼqR7swo8LM'ʶݪ}@\YjɢʮYy3Q" +ZG^mmySm_t:U{s}i)U d:[mRHVFw:n37UCƺ'(5jcc]po\ۼ~{IF7?RcԉyׅB`e43EB g3>ob$cԫk_487nq{!p2퍟|g#_IJ•3w A3>1w۷o]ɖƺ{~f2HvtJFO|o ;agykekK$*9|76xDɡʺK}5>= eFJmuh#|;!弍:IQ&T#+9Jk/h! $KRGmPJH3&u'JvƏ&TyhO4kggLJG⍦0yKMѫ/ov׻{p,ɶԼquPb^6|w8vq!e <жNxXKM^Gi)$* {)NgGmӾԹ"d"]p_QZWF/˸?_YOfʃd>mkK3 F,W_} x}ϫpk,ċD樴gPVWWΛ]%k.c@ҵѕ/7?+MwgxkIj@ "0Gܲj Y+ tsopW#]]mh}O|ݾE_>`d71̊GyeAfANRQ̮ᔤEim Lc e[,kuPR( \BlR7s6pg42Etd" A$8 I QIŮt07`dKDx^t7Ef[lS hE=|x ܰ:ǻ3y+mQCMn-?Uqc&UKJ2'S{R?uMz2|6L$_I3{M5غM9v~?cz'k=qZ[N!4gPO=? }= LD\ӧMgzs _ۯ^YMB1-^ȃAo++Zp֨yi7]gt|4oֲKd GR'&aFe݆غ8+T덥Q~`2$ƪi-5zl7¤j(pkmkk)r*":zcRU"޽[YmIvu{ɟ).=e*$رeN!#RʯQTy7v؆Y ip\Ծj{w>M%/;_]'Mw8H B8V0%&%G=|gWV~otzl~_im`Y\h;/mvlqRTmmJStZ˻)m63;:`('M %*(:$R!shtCD&$j" )4-7^ D-= -bdKF/DBHD.q/z3tЛqS(z\qZl˘|qgo/@aĥ013~g0G'/9|1$]g{$(nuDFb1XBsra]rlމ~;_Gu:y|u2.8\΋p)Kux3<| ,b"i!DwzWj꥕tZ?|2&A7"R65!OlJgkui2G[[+~tc-ZhgWNE߷c310;GpWumNNԩK8 u>RZd=ܭʲ)Kl=n[WvG#DITTiBmYڄ=HuUw:1ァXipUe,;KTR+ 1)mTJ@$$uN0&mҾ1F2rDA "F`A,&DYTD r$@zD:: x\2_NXQwI `N`m1Qť kZԋ%N yL19̋N}94̀ hm,w1MX$ӊ?^ n89Puo^zWJ)fDđ@ؖ\ .Q&L~peI_+߽Y=9Z&Fj\z!(Lؠ ş}#!>ܼzƍ++`w?zKRoc$6<QA۫W__BGfF@yI +audɭ)@$^&\7p:7i׿Ʒw'w?{_/gx+6:xWo:Eۘ#Jܹg?=x~vgoÆ"2YR3XGLYR.H>}ۯl.-i{Mz n'PGZik)JGn{݇=l^I $rO{M8 L1oTiD4nټs纂3%~g-)6Tvpܮ5~O+7J<|l` O'KtC0y V'Ҍ&/̒ kTA+`#c3ykiw`)CI$bGo:Li# o aKU=44˺EX<$Mjt ]$ U&Gc \VdP!GP 3?]H|^IԈ'Wu $`g М 1L*O D =,\j 0dgFIJ IDAT'|3{^H!9gsLgztX_[XqhI=OIG5uˈ(ql Bi@l\_{kX? L1F40 {$Ie Upm-[hp-zԵ7ݽa;rDO5h- M [YM4f6zzTO)A5_"7 AVR`:jrHR﨎aOż?WH&\Ei_O?M[ Va`X[yj_wIK>Ϊ'w`?lu^qp[WW^Qy|;|D)5#GCGWj}ˬAVc!x0=8Jf/0S1IrvXtaD)aj±)C.ݒDZȊ;Mey9I;D(fM b'´eAdpNAd Q8 BZ!)p>rr;K_ј3b@@ 1f>cĸpxf?^tD Q /T 'oҽȜxN@Θ+"⣮.m0y^sB$l Rn7P֦(2lY |ýaOCl#fm7v|Ѕ" "2ɴum4h "F:&1rvNzngޮdkWKͯ(wgQ飃xswkci{<'")"֚! LΧ~m? Gt$P>SLZ NBȵ-0D{!  rF??|wzuwz2o;^d4LPڵ냿>Hz/,~:o?}2n5n8пͯW67ǿ9g].,JmϒaD4; I}0n'qM+cձ}H3om$B`cCQDB9B!6d04#W )3r}$f(urp#ԙyOy5H @)I,t Xq"т):5v k(HbP5"x!b/Υ Ƶ.P4) sBh!\@yG9tZ#rc%'D .\J!Q ^vFQf&pV/WBk5Q-Cg `ǬgBee7)2%B!)B543M]ݽڿ6{0;lfr?=ZX%𣏷OenvBhmd&V4Kl8iݛ͚(42JkB͵b%|lA !Q :>> EQ7:,֒CPUcدvheV҆}rA܀dfebǖN8RYV+:(I߅t"8NZ'rC=7'd"Ewk^ZMڪ 26$"*%FBa>#f !D7mFiS#@zp۶DV5qFr ~_rN|: R'S p ׽Hܺ"S0sFZ8QXx=v[\ɩs^p m2EE &k"YfNO:MDcm) g@طXwuڠh2$FȮWVy*yb]kp{oןφw&xp7ߙU˵uҘT^/k L)7 +wfuyRFiy(&Z%\GX)U[lu:m!@aS,!k+ۙ\[v&a3PYbv7 g`&l_wvS-&Ivj+Tdh63|u8>Hi~߂ REf <؃I$bWJٜa tb$!Q7b>l,̾-劑]b!fy|;y5*+ZүlH|_ $ՀLxD^CJ(H+#cL$$D:)x/Pl5Fwm}$TUB֍mAJ !"B!ׄL:׽|IS1<@/ 1rZv2u0> CgL[|b~'C,k^{a92~zZv=Y |X9F8 :y,s+ˆC\MrSNjR@" Be ZpYfEGJ. $fzo7޺d\(ʼ"T~'Kޖ*1:9m5y D>7{߾y脘cT%$R+TR(ˋ,~i9LY+tE|c}dْWV;hj:F}@kYKt/I* qr#u'I?{trwq)TUf @TRRH3ql^ 4>i-CӶoapNH)^ed~W` եipMVq-D8LepF3Q Dub/Cee\Jp 1sBٴdHLD;Guō@1RJ)Uמ88QtL Z[Ng"虐Ei4z $5o<h۝畾 ^Lp5\4.f}zJi/SdL[))!/˰Us?}12-og~g)B|&݃YI?X/~^(pWV>ܙT ]@3/L$r"`H*B+3#4)͸O'Oof*z꠷=h]B$кce=3|˶1IQP`p>DJJea䬝bnoFj(MH"w5ișTGmTYwMU5Js+ٿ4*-e1nifMIBL۶ñ0zENBFRBlR#E5 FDOqf N/TL2J]pc& bk)0(K8#q ت!cUyU`ʵŽL~dq ]k$oʖWcEJ s2*-#*@R P`R$%WxHRHˋ<8H D1IeRo N7QB-%n3F$y(|!822Fg$3C]_J-D*@=gػv).d`:73* _ &z&|EN |I^<?:$MY\dF![eI1.{^naIJ)rKy#4Zn=*:?LW|hvOc{@x8yƺد~iD*Y3άE +ݹ>y_ZbI #Dmn(ܩYM -֬`N5umsv%e2-u9sYMnL?cZ2h) qxXphYԹ:> KV?][]$etd4NfoW;R+ Ĉ,tk\B|/@1ad!E mZ !H k-RC%hY\Z8gF! `#aʹFTR*8lґ(xEj'vG]kѻd2BC6I##1cd@= P!ID0֍'hp>/GL[GDLVuyhZx_Z.n ZZ |A}.zIӪ1 Ρidy.Btv@ʳ܂9mQ?="3.ILPl_494/|D䕍Jgl#Wzy=BHh2Ӭ;.v:ZV|>$Ovg[Ku:Vq?od$"wf<=<ԎݯyT󿠕9LU'FFZ[/ݽ{o]݊:?8<Mu;M2m`bʕtSEky]Zv G1!ub,U5v~OI|gdjF$5T! TTB\`c>3rr,BsJ+I%Ǹ%Ns.mF2dY$]Z mY3F@HJS(1AumxP6ql{ <0(rJ_7շ޸nS4;޾q"QPD5DI= ҉i"2R>6(8-$ȋ@yޓyוA $ NDwDOBJN䅞O,lCCFDY$3 9˳4(Nn|(o^_vJ;U^Uţ?-z=n=?pgX]~(qNa"i) [zsKy84i"$(Ki5lvRRΫj<-oҫw>z<4}yegU@LRHD }]־q~/nܺ`8QrM7ɬo/3z}eyyy-~~b/yyǻdriWnGOGUm7;퓪ٿ^ye?X."?׿)@ZM]/ @!9)e5+ mYOyZ7OϪfF}s]̼ DPNbp"I/-Yp5%CEQ?;HT7IȪmEV@RL9<ehtX̦ɡ~^]J6j^=tZuBZg;<2y煐Y`<01+7PJOƖeDio)s]o(1Shv-[*Tu4Iж?$F&Fju*ey1I-8/# +\OMGDq/Vh'#0܍Lh tN]dlUJWi mM7,\8Y)Uχ3{s{I7O^꿙I P5F]-Jg#1K8)`>y7fyLv:(,>;1n߾uu3rͅ@Bj奜}3ODOi`n_cڕ~ ϻ"~Ο׮\XZ^J;$H6|ș=�|ޔlUच|'qy3(հj]=;Nÿw<EֺM|wtTyRkZ*`|yRThmVQ'"&c;:"料"PF ZaCPRՍgM'#1A%YEAnXUVnyaR1UEc"bMGfKJJDqU-Bh {Ϥ|暏~=]H + D/S?჋-x<\ʨ_v'fgvw(x]$F7,O e:sók,t;_ sWrwWm IDAT_^\Y2K` S,,z/R!hzBJ|[{I>|<j}uYIF7)1 !Fb:™J9lAlҋ֭K];# };<.\T3/c"`r1Ѥ>KJ1/gV_{ 76~7]M]B}2;wRΟ[tƹȴ`ٙw$ƾAy/x0J0!dOGw.3W.ڽk&4@L}06-;'`ye!e^;u2tz4Ω媤[_\X~f@en쌇k?~,j"dDrjь&z6(Hsu孛 Bd8[YρBr}U:Z0 ȭ7attH7SkyHSB!/d"6{EMw"(ΜOR%sΉreELSB& w˥k4{ŧ͔]_UhiT)ˮkuu@YIjbJp!)a0i15] Oxﳜ!1:I۳?fm3B91x_ǖ?Y wGj8x8GIt>quN%n' }֘)%)( H꺯.&ƗM?oX3Gݝ{VI%[cᣅ9h,!CsJlkP]慎 3)Ɣr9ښP+ђ`2)wx_r7$]?_֥2W>e)]|phsR !xC>jr}}v,kq Ee1f/5W^]ۗ/+չ|2RJ ܹ8?5~׉{Ⅻۗzq ?q$,Uͳ4i%(&pE39 pIRP !QۧBՅ Jp΂us_uMhc5 YS^ CѨ1/ 'nXptRMkmb azcM<ا`9Gº.LbBunPhBԚV!JI `?em3B"Q6%)HӞ5Oc֎'@3(ugIOa;?{ *lt20IїR:J]{K+yB p6[z$u G }ObG(GFkRA9WQOHbJvJRdm)fGr, u+ 8%J0.)r9C Ag٬G{#H)? PNyA(Ø⯼݃هӽKVV&+\[}w"ޛgˮͅJ0޷51=|0^y+_̳[v?<74ɢo.!ѮJ5٦P|ɰǻ2 xvp2w;O_ CUQHPBbWՠUY(K5Q<LpNJ.%=!q)+^*$R BJl TKUꥵ[BӾG5ɲ@y^ Gw\LE$GS^SyT9wNɃ"8%w|?<'OTqȱ('zc1S?ΙuvX*W")Զ_|ts[+e`PXheRP?fn>o_RE#ZkuS|M<+!F2":5Js).K7s]X]<4 еuLm&2Bz1MvTAVݦkF2ɘ J!8'&O`pz@SI]{LQG1,yt01(Ff'bwh'}nHL!CGP@θ>/Wy D@q<,5f I|{s7kmhw9µÒOF`R=FYYz $UYdY{?3{xXJcy&\j3c!TiPV$9(M)ƔLx绮+(8lpLSY]ꤱv\N6XUՕ/\>wLVd{{ׯ݂ L4rh?Խ~.siv0sCi.tm;66lƣ,S/6D38GƸw%q˩@ 1C^d]!1Uv >L(7.8z].L7ib JjcMZ1<+8&+7>꿷l`z{pBeE2-͎|u))"@M kLJu=C}0>P(-Ј\p TGL<L"wq!ٴkv^뛚F*6UJ%O@!o;[8'3gޜ?0ۇ5)tnjTs(rθ 6;e6{eŴhlL>DB[QR0ֹ2|pD-T:O$D(6,`}ͻ&.ri_N25=0zNLƓjp b^,)--q 'ԋPTecR٢K10)A.4|ْmeeJr$DB+0}ˀRQGiݤ#@LyUM5><#nكTa y>"=9p1'ENK)B>YQu,y%S-=}L)< X_!y,Oǯ!ȹ3k06kUٴnkt>#|inJ+Zf_ta5,=~w$DR !Z5L ѴmA$B@YHRo1FqSd9:!,F:UeugTJ))tW9c̸xtlY6՛?k|̹[߮|SXϿHe܇D>(8Ѹ]N߷z0ZܛχŚ cq %3yp޷ޕoq_M&Ձ{(@[,DZd9=+T|n4X_d{9.%# .ELV'5mydPC˅s :/^V*3Kڭr^N@EB:Y1 |B&BkNYA*>DCF9%`j^%@SYV˶(AϹS!<π!D4*ƠnzCw[ku*cz%!I zࣜjOgUDt ɡ'1w? 8'sNqgc >9yFOk4;quy1p]}|R ۷ Q[WίWUlE= F_Nx[ 1"0o1IIΌOq)%C¨94U"@.BH}PK!%$1DJ)yfFNpN) #C]X-ZwBfjfU ˊ,Ӭʸ..fXƷ}ԂW^ϝ__wrz5͕+g\=s0scCKQqx[u.SJ1yF(StyY?6R$L@XL5a¾3s)X^|ûk8;[&vU7\ߛ!FBbsB韝;ov3-4$6 zQ{;u]Ǯ)A^,ifG lG@!i(c)aS]V}oDb$ƄkyS a)TpFetJF2Fy2DFcLbe# ! AUZ r$Aj91V'af}tY"l6 OSqq<-HBT Ϣ,I)eަe_tkϝh8(R(a5nHBҶ錭CoT ,BǕ d˜;{Ͳ;zo,1,69_&zEH@4HkbWSoW_Kwp|9-[R/FY$!;  Rd|jy0tTIk)2ϏCMHaLŷ|2\8kr]1,<cӴAe])$S3Bpb e@ ;d%NeheY'$5%w"Aߡu.dm(hftgƃѴ,ʶ5>$  :%5,ʂ2NiB :WigUQ: M?aq2i18~ZϊVGOD3v W괢';41EB4. "` BC")!7wJ }xo@gc-IkLNhy$ι*g9BXt__Ϯl 9<"'|16&իg"! 0B!玲B*f mյ5!]tH!ֳ"yvx\L*B(HqlV…F<]̋앋n&+L )2I=j8,];wl75$nR1gϯ/ԣ_sìmCA 0JqR3&({h8.~C^9ۭLB  ~}mmJ%(WѢ;Qo-RV`c0!H' %N!ϲ몢$4b"f\3ƻmQƇ,k)(,WQ-M.!!1&F]s$Pvwk!$|}]BBc^骨zk} xs-A#"#s183OB> =}?)dEOu?+{VG>e =|$&OE9);9B(m;].卷e^ JkwAeKy@ep:އB pDpjƥƔ5ޙ@Er狮 9g $\L{-6/^15S \)NY+43SRp֤r~̅RZ* )wb1BT2qSuR(kRh?0^X?Ah"XEQr9!QFxdmMn<<:UBy6oyg}0cRo(J^:ƁD`J1>hw.vfS.xHK n߫ƅՋΜ8e5y^qowî"0ֶm[oLARP8$Fbi΅i{rJDGΙ٬ t<&vPA ))"S\qH( eYk{Y*bX IDATcRCy>t6ڮ6wiz+, {j+|┉Lyf$;mq姽x ?E|˻ؙ֏B:-TFDPNMs?WLvn-eLVE a0ݚ$Y}~sC_/6mKF(ܛK)Д"QSBB>۳y ѽe & ]ʨ,xmiL"5#"s2wm+_9 66G6[{˃鏿7x*xYyGB^[o^ZyDͿ{~uLe_UkB%P.<_ Jx3*(|/a"|@H[,+W?^\D^>llH+J<-"$\kȂKpew?xh߷ aR]X_Q謟ˍ7^}i],5/̿|il@A+.c!SJ1k\ VRCXU KR F<=@9k]rJU)n0J7۶E "σŢN1>ӷsA*մ1nB )1s3'aii[tZɾG ??T%KOq !P0pRt\+€뀂imccdkuHڮ=ڙ&zRfֆj7چ "A !(7vͥͪƘ|\{uRJ.y4 !F"0ywB^8 !ކ /2m+|19!Ư|}0Z/{v? {wɼ,?ʻwvxvh~#9n*QR͌툋)$Tg $}~Z+ֶdxf}Yk<)ƦY'K2U"Z]_aE=83%m9琈Tژ̕"8\&$xLSTIUnoyIptՇu~!Qvk/l3M)]%r /W_|\^Oo-l\0DY̚$Yҙv!4)AD;י+kƀ$+2(H)kPj͢IH)0 OmoBhcB$c3)d[6f3:cMdJx{ya?Y{2x~}BKrg1gca Ps;8yqBwZ}D;=?.q?[+!($$bY9[) oQRJ!),(v>;~IvAݟ^UYrʚX礐k,umR+JR5Ȏ}kFXJr-y.EŔuL1e\" !%TC-;*,[kc)"!1*$P@HoQݮ \zD2WRJūbTqQJ$3ۘR`Xw4[;DȔ\?]?}筗_]Fv6ï}nF5h;s1b6H8N}CDH(ָ{ZJ{0σ?Jwnw;75\rVXhM1eR1H4xGRP?ˌv?$[_yK/o~j;,tȄ!o}+W&g Znzg02nz'az0q8  vRPlVE{J|X4B Q뻲̳,3&!sm;x2ABH"_מ<Q )$BTBPF(eY.7eFQJAk|xe= 9;M><"$aגRLvѧ") @+ S;c*lӫ=caG w'}H1scJ Jɲ鬏>j뱳ں)ueƵ`-c@>Ȥbku@b26uAʘ>D p~m6#]Ubqc4\:7V߹7}@} -2"Az*suv:y1R"ThL A 1* l n<- @ n~׿sk#Y_k^^YA&5b"FtԖݝyEdB&n<ō) 6 =4t~0,Ξ29)2F$%Bh Q cq/k3gG8\T˲~ko|Fa\mi-'8ȍA&w>4HBD@$p:*B3#0 @Y&ֹCFsHr2 ]躀D6m+)9Xcxjxkd*"HJ:YNTAcO)|(}JoSQGj'nJ~|2ɡ?Fa6˺^$T&Xwvmieb)yeǥmnlOvn0އ7, %cA Y/Ąde+3k0SKΧDRu5@ m=yT=[6͗J1/8,wzū0ʋDRk|gCJ)uW/z0&\oT}K|0ԄzgY>drS8ԓ|*֝az~Ƞ;8UDžQ.]#PʜJQw}or 1Lؙu5`DS\0D"89nq>8znJ$d쨡@!J<&׵ȄԪutm<('->;GAiB! JRF11DdXye8!& 7yH"~W&H4gF*5CtX.1F.n`ӛUE?oͥxpʣ/;]c2:g 6]S*o~\FxG H).e3ȍ? SX]ƣqYL&+c;ek"GG{?-g_~kW/?~G˭5=*;w^p}WWn?f,B )`5H'2dkT,F>SB:Szm'Ra"\ΗUp[*>Q 1_b<=q#ǐicog x4 ӭO |\,|fj?F1[{<'I0w?|gs4Xtkýy{\OU2aOuRժ:R%dMo7/[2I2\ֻqx%WR(Fb쌭[Zxo`Ȅu]\\(I>`HPH25\3*$ŨRloFɢ\R)HYDt{c1%T+A)/bY3l"XB"ЃޝkORC/A[FiH01 +hB{}HI#mݙ덍UbW^w0A,ÅU1΄Eo=a غ.M]2\4B^~nu8j{MRp >¼3:wwJ>cѴvϖ @ȾW&!:b*WRH.mgV OڛʒeakCLy;TխjvMR R$ӐAl7 ld,~l˴ ΤnM6{ꪮ;!3cZ~;V{nĎ=Ű{=́T{Fdf;;e$AEc S9ueEkբi(գ's(E|KW\sѣӔٙcJ:ќ3]ŝg8nkgnnM~uތkt|n+hW07^dxW7D"k[!us_/KzKzE^[ѓ@Q95 d~jMŲ*wgQuy03{3RbH 1 !(Ɣyd(r:,48f4H%+ #<8=^Lm#v/{{QU.^h.9TUm /jU\B !yDR$Dl,3bQW77CEEsc0)cLL1Ɯ պ]=Ds:MŪ[RJ~~z~駏gÜbgÜag""0 f;fŔa;g&⼱q~hxwC[U8 1z{;o{wªzӾl,o揟=;y2\1 Z@)%&1W˚P ioq*)Xm]k OWsd C 2j!TBih}3N,m}|VMXyꇱl=iɖ0r|jLs7K I[v>7 ^^r0-鯤 |a9[;-[xt/ڥ]|vB:)s)kj|s\eWuA^k\m<8^nw/T2&ƻ0$e) J!BPuUi~[Q S<=k_۪HI19k-B-ص]]8S< } aǺB)]e/Sf{VJAp1#!DX˜gWKqm1m-9o?M')7|}|ggI`;̀0R}k]8§?ӓSU0H+wδMm1t|xԡH%hf }~hm>yzƢmΩlC KW{uޚY{)k 1$9!/`RBO!2 ")h.%̀ƺ3sfñ}>{o?v_Q򆰮㔋˒J%CVk"BBd$$P1d%kJ@C6ͷzl-W(HNFu*8=9;[ @19ISnUEFЛrx7>wX\ o__:_ݾN~cxyeFu_w/Vf:OBE7!)Z_2b[voEg-s4(7 r:hCMݲf"zU§|L/*;u^JI9{EDu($UR|;a{7;~O2IG)RD2)"TJʂb ܂ZbNsxgod7hQ+Bo?{_iPrV`+"̵X RJqF]]9֌?~ @#Ӯ1rfO Qy4Ukj,YUGsvT9ޏ!=#Dm3+/oɴ?LJ,>4lm ǟ|_]=jLqn;nS{M 4E9("`!BFRACsL߉dmJKM@)hknd8Di yX-TrRSR[ɾ하ِnWP捴ە#Z[_dXJ7 MV.] b㿰(3Nϼ{3sSJ<+1[8֝}EssX-,֙\j13ΐ4!ĆIrNbcZJfwW5WդlJ޾|r[tQԺ$W9gqΊ 1rDf6rAe?~qPq׾RhoHI9̪ZDA5[Y3m_nK]W2%H_9_P1"f36Bu+dQ4~\TEAopmaqaBD4u]FIyև1_ů;wbCtmmeB7qy/}-VZ>I%)f<Řڦ-Z,8Fin)86uLX쟯7@)r''뺡SJ]0"f9e&#E0`\ZΚJֺnb|ދk?Tۗz/@d^47W[ ]} h){Œ_ܐZnn7c =~ژM?-0+RV89,ڙeGcy\|ɓz^ 14qkGY%/KYAٶ賂PSR ψs9Ǧ,%w8GDZ4OVzS9P;m IDAT?ڷ}X"HA@JV ~ĠМSTİQQ_~vsVvʽ{ί݇S{t-*BD9i [o Z^sv}bX7X~nY8t9VۦMˬh(%9Yog)B94<ޝ;{SY(*rYK9߹s65A>~+w_<"w~koo>l)mȆ׿|_WeEϬ00lu$;^01%筪A2~0AfL0h)dg!lr.㔭Ðs"$I]6_lUijVu+n?1sPCHErZ& 0KR9r/J5;WЋjNQWx8W|+]>^_%z\a^^6LSF.YAa\΂<s,搞UlwNȶmbc0e*2#C1U+I_̜DU@̌Z^<"hUZilږ/"Yl-;kr.qA0d)3ٶm HaLSl!r`RH1Zk vth/~g $ʚ6YE/l q0zwx.s? 0)X$0U߭m)Wua߾qӰ]5h~#1ם~SU7pށlIɛO?-) sԜ{>Yda9 U>ݶEK)9YgX[Uy߶ B64ޔUyG[,f6ENO֛qNR))~ S~H}?3Lfc8&l_W\A ۅsjgVه.BL8k-y bz6z{;רJ` cW:ܽ(" %?9vLaT£4I$"@Z$Zoes la;"P.@r!FӐSvL"!fA@h@K)@P DMs͢*MD3mJ9sIZæ$)9R 1Wb@0)BiKr|OzUuTHmubJ4gsKPpmL9Os@+$JEi:[X߫Ҵ$N-&ârtm]?w&)?;9ΓT5{i,[0޹ 4 ;h!ZjmJȔ~~_Ow?.6);1OsT~|t\NVdPȹwv; 0[-SfXw *E«!nTpvp%%/ .+O7&C*tB7o6n RBo/Z E&)sEHy|r WfVSdL?N1e R.zQBI)amFDQ]J[JLEEq:iȣv\.i)"-0R$$((dΆi\h]MǴTH)'a"@l$"1P1TR"M-EA@V-Rj F8?[GOOĄ$fl NMm^ŷNŔ{5j4Ќv93EsBL9o߾wg~muMȔ0Ϟ&ǽӼ@?>>@uNcx_AsΥ!"al]|7~rӶh\螞;:.lXcMm -<]FP=SMoT7\[Ϟ/vI/:^}޴酿Ð #F@_/֟kۏ%y*^ .?7tp+ⱨZkKKQ 1"*?4d1231!q)c̛a-˽1Hì MӜmR4=;$`C_jI,smbg sp#U"6X -xclDʻ a]W9gRrsL"B!EC)Zc"$dbdb"2eEk H%}Lc l (Tgf%EuUS991 OW].sP5Mـ Yc]Κr汀Yԧrə SV'5"gqңaX>yzH8 ϼgFKٞ1 g6)ϨlO:MUY.~"rje՝l)Uzvk Đ6*&p(Zr rx\9#j\,{_jew,1) Ma^}?67aG~~X. ǜc\#H1b)U[[kLKr<5U= !S8ヽeJA3gNeS:O 1;UO֫MfF"Yђ1 Cg&6PDP@vJkHB "b"fbⲛl p,rpDe}v.]׉6L0+qƶ )ŔPj}36mSDl4'B~Pa+U$ПK{mF5O$?z U%׃veqC\44b 5N'UuhMcGE;amX8ce}St:;b甥.*!Huy6Zhkw\a ,0sɅQvKY#d$"DTSQ1d뒢!alTZڦ\&iٗ7pSz.9!i|^wON@ha~Lu]ʏt6ѪY4M}}rrVȄ'^ؒL)S1ت}py5JbG3gm9 Ugˌ9W|XVC%8g!8W6L!h%y60tγtu1j)eۏNS-['O(^kWeߦ ]tUnv΍z]S!oKUɗμKxMAfh7y7uHJQ"~1sfE19\~82fBRy1LdN:8LƘ('|3Z&YumۘJLTR`8朶M]HaB5޹=9Dkhs{eDxTEJΩv&Blꆈb{c\!6\咽rNH9@sr:3%P2lK9璒^L,J]ŚK"Uc)3gwc"ZU#p[LGO]x|䬉c”x_;5=|v6Mb }! f)Nd[,BE)`jhls,Y`>OcL[CVZĨŴ-!0<H!NȜKi8 @3M-<9?TPa B󆜗PK_@UHHwq5{{}.s )1ˁe9n0 sΊ֥mRyAUUbi>ltպhN2z<1JmY_Cр 88Ɣ}gOp=*JUUY*!y?ϳ00Ls#q^tӼzQ#S2e釡vG޲O4F)_jc.nacU^K s(V6rF(0@)14 +x׫~[G{G}c&5?y6k)ƒo+;ȸ _  ]ZFBɗ_iw7nwPȿv%/ʫ5^7F5Ž}p7h7q x xx/X m(p\E4Y9oiPUw06kZ$  B }Syg 5 *;T 2O\Y \U)g1{ZR`Bgxc|r6$)j5lĐTD98\4 %(v-PrꚆ٨d"P@bRDTȪm^r"(& ĐJ*R\e 11#n nim%4RJəT5/> )5\J!")s(s A2D< cPĕsoO7~ȒJvTwzCĖ%!,+ 1')!ŜxCќ qbnc6Ꮼf@!FD %fCDQ-lM9 Lh]ux'2xјYD@]W}W[vÊb^.*8M-]7TWw%PWƻ:1Zv>P|=Yom-uU.ܛ6z}-5U\uܿ~xiQv!.aӛ{r .xՑk\UGnJ}(@I1K.)DBșC(TeOFek+Kd8L*9'|zYTrJ*CJa |,<~pwӹHEtCS_>XB~sA:||bI,QIH2+*Z/eOO-=<> ,QK #WƐ*c(i.EbG  kMAB)@E(H3!b.*|`k_ZEDel79 )5߿׿9P[aK.dui:ǙC@8)O1?YopXo'PiE9ǹI?;3tݪun IDATmfחowT9妭l*-}uv}Wn6]]/CΞjdLQRT"MyBiVAo4l﷑ (L9C؎)@a纪QPrLf1f769>Z Q5qFs l/ oL"P:KK johZ W'.WDRʥ7V{K[jk-ƫלr!xZc_wMVUL%T)1FkmV()3*,ڶ@[N4+L9 4s/idâ6UYswZ ƚ$ytRy1)IH?;>8m E@aJ€{8D Ie9f 8oTehjߘ/}wv I'c>Y .Ƒ jH6Y@0i,cJH[2,) lبf* e\f}ZJS7:="6sB{ 4+*ְjOnjUE*MݐkwS]?r?xRW QM$Eas8g}V?+(\a-R!AR1S\*1&M37g9?;oW6KI1}àaq R9-=R]7v1ֶhJ5vY YX&r^ӷ 7ڋ%Fw['o־tm oq-tMZ66 K{ٗWc۵Rs!vk 3!0 +fDtgA~ʘRB Z5 sݘ" *%ggvڬg50"sؘ1GgÎ1[UM)SI egOl'Up73AU9lq669<eBLp]{o\TDeJݍa@R@5," "HdֺB@)HH%PP%3"uYLZt9#mkWi"ךꃧOS6;Ծj릶,^p~|/!pu8C]Wyz)wIߺs8[ e[gg㌝"mޤDzmI24Dwo^v2+3TT1`# ~?AbˆA"A!@PL)!^fv9Y1Ǜj+g~ofl1>RKBk /_T˝2ʵ:`3b*H`XK|SY/Em/Q60^O΄~rp9QCvRio~\ zOS?:o(~O{ޥw)׏eOn',U|d2<>uh'ރǠ@O7r̹(2T*pqƊ4} XWm[Gm("5TK-U5۵.xݰ$b1}[K5,1/NVMDL]Y ( +lAQU R*,8棾ݞv lBkPSIMEkPU5c-0W!B2fWBD@(ZRJ^@H,Cgfڶi.ˮ R37u3XG֚\*RWGeFҮ s!Xv/{+8 M0}Ph'mv|3eC>boyv8Mic4٬RjmB(Z0]3דmu7)Mq%vo yM<==>>=fmxm:Oe8D֛"d>ɳ$X] &2[PS쑰>4C|F}Žqw{I!|=<-f>"xWnG=byQ>0hɂ"DKqy@seh@q]cH `aP @Kn 15Yk-Y ) +("2hJEFʉsZ \X$gYDQEPE\A/ߞh7?:K`Q-5U`HȢޒ1 *הK-e)κ9US)%9'{ZJQ%@MJ"+TJ'_+fէyfe؍qWn}qU$㻶RRfUϷGGۣuM_'yQ ??j(V>8ڷ^DcXo M,׻bzTIKxwU-9s:y"k3H$g15DuZ܋UR#twѾs"ߍoxUDP/~wszƮvI^@ȞjXDƽf_Cyb5/}zf78]w3{ Í/[K,{ )gVxa9EB1vI]JYc VPa֒2L#];*چR ` 'O-BX&V y¦!n;Y;3T DJ!"0ж@U2 *xs!Bk"ZR-}=6nh|e9h Zp$WJND$D_ZE]j;kHAXc3 "ܞT **3W$vo2ǒ-AfJ."LͿo\~ze_f_k;W:gEI*כ?W1_C$R קǿWEt)ӓ*םsԩdgwDOkhӼzݾ{w}ٸ<[ ,ǧG߿:Y5G׿?fUKx`R:> v*݅PU ?;Xw{XaGc }HҞ!pzWaȵ2kK9K Z Sdð?:CĹ~hyT3Bs$c}˵F[fϪ xw/p  "tm0ƔR J@ њe mRw:oD4ݤ@R(w?x{H,I+2oDDB)UjX~5VX( QE~1!iIE@}ިu]府ğRཪ &8DDAɑZ$+R|}5dhɖ%C#2D_b{.obC|ymC` ԁRp3I,O_LjlzZf&4Dཛ rʪ/ULQi;'Z#˾I%55YX9vXrRW͛#ռ=9)mN>t؁B99/.wQUm}X__U޿XSyugb+,<%s@I!4'}y?{=`d-^(d sqSz6ҧb?d4儸hC 5"9#"j[\dɒm}hsU30N zgtl7\oYzqDHg;:sSi823=}9 |K/OL?ne.\pm.PJr圛030]nٮAa7 1edVadgZ3T Vg}+scK֒ͩ>xwisߔo_^^/HW7{06gCgU5owJVMnƑh+m))Xs@Ru9xCDZwEYޞiDt lHT2 heHJ9B#"z*KPvDIivC{QD?a6lNե*+қ125!RyxݞRr]JS4[s `qP&}{O=<R#qc1QU*p9X6 jبXtDmBIk Lq8v U%R* Ihh*4iZ[opޝ 1Wm~#RXT(1]](t^ 9RQuyqrb^ӻۯN)/)-o $thDZ afU0}L /f2!1@R ̲_a^^*HSօOR *csLZoaccrUq%2!k}hERxߝl]j/ߪI^]]-dQ\w#:fMn\AZrεVc 6l +1\mxsUu}<ݬ"iH֫ZnmE<~Jqx>:usDל~fgb9TnyF~/'m?I>  }vw/G=?OA 37x]!▼y5a_9WBt֙;BPu-3N1\fLr7G}Ӓ7a?C$cfؽ8>2"xCdYgj RbOU F`φ9;w6mdj]N`AػŋUu?1rM)Ucǭۧ rNJ7-" @D2dXZH0(Jd5%+IzV]0 \iDs.yJS)z~׿ھ1es bg5T7sΚom^hRs.N_ڍÑ1'~_AQ0`0Xd/㒝olJ,JU Unx_ĔV"U2cQ*'nRisi.i5ca&raAh߾r㬟|M'WRW?XOWZʓ.~<_ Sw'>ӡPzF'{>>cOW׃Gzfiǫ3*"?q[% y!>xJR?4fگ\ "z$\k)%oOșUj-AўZtAc׍.n^uu+\QĈHWtGvRyw,(A8~b@1s>TnO6!"2W64M{7o5n.|C¬b7jq xrRwAΡ!uVYj1%b @P1ڦC,;eU8ZB $f8]5_ɦ_U*;!5 5:w.PJ/jpN$K%eNi9f+5n7*r2 ׬S!w=;}ӆG픦oܜy^BhR>h0`iSEXR&))3(Ns,֒(,RaPQ-η BOlU/F=G"n?Jj~=,ԇ O,:0z5Յ{!DUGfY>Q}B¤>;}ֻʃ6RP*)(,ZJa<"">8"ޱ~'a]B2XS ;؞|vd@Q1;uR\bQw֚"PEk.G$")& p!'?G0ミƴX2gU:9s6q)eeZ˒yFRE9',h+#"b1:GJ{A")[Ej>xo (^/|>Dv΋R2} ,{L? Gm]4CyS3#?7Gsy X޹Mpܪ5-%"ለd44p}%ցud'Tɥ_M5˛%Nʹ6Ոg2 bJ9gdjNxI;o8::{#"xr&XQ `!.;(Wֿ|u}. E+U^4;,`03ׅ͉Ha iZ摙 X8TYEFT,·gUMނ]Mdgb ʥE9WP@ۦ+"!O #\[R7m'5ݔ0Dk1*3[z9};3BN:**ԢAL.#ݸ|qvOqƶql8~؏/^H*5WҴG1NZb7̩m\\ߕs]l6ַ}L)Ԇ|w sl;,;< H} "h IDAT>}H>M,p,VP''orQ,Ԟf\{d**@3BX}g?}NϿbW;9R[t֫$,u,u9^\EpLg.bkO1 qRsMNzKbe> TyZ p0,DZ " HefP,rm۵mrpnqVsck*a)z"b!Ș~{iڦi)(E2PTAPX@JEvlUQ%Up*9kPAφnޮBf?ǣWM 1%Z1 Cq9:o-"PZG eW^c)>!YrnG(zfN_6Λ"0'n67¢ !4nlMc6KA8l]˗U agKԒ{t\_U"8F[mD9 +C4>o3r@P~ w{XG~|S'?sRR!V&6|^D|f yx3FeI:*mcOAlV=3)TYA E d*UM5)ffRJ\n!jPEkPR3(x6JnPJͥ,\.x6 Y"c&cպ5ƹ"AVQ!RƐf 7Dd"kT@E@}a.D$,ZUK-qMuJr=a>ωQCd,0S)dE$~q6Vq 5a+۝ؼ𽨜lp`lIi`o./14u߅`(Uzzw] vZ2NklY\Z 뫩yV%K̥TGRKp]S@oÒ'x7@no-OyP { Jz/%֩nIųȨi]t1*,:RE?rGm}t|bsNY|ӟ\N_ gxUSfICu廟3C021GfV c !'[bEvC$lAK!"Yk`xIs",ʼ9v5REJh@,5%ϲZj[jT%XpY4h r%kIJa+f BΈH. g̋I)zwr},~lETVdDdIZSEseJ VuYT(`R{OD•I~e2s ڹ;кrk ҉~{4Z @n~ǨP@iEj*$bX5 S׮ ,gII.x,z5pPu]uJxT+;B[Ln S)ġ sZc&BjrZd3 s8>cg9:zu2MڑKy(y>=Ŏf>ah?ѫlf_^tEaDBPn ǐχM}sFВ ,@Mwknؓ҄ 9G9R!V //7N!85fSY,8Mΐ b-jQCS+x9\bB* P,TA֌@ɠJ%j@Rh䍒͚9mKGp}ll TC~J*u9Ruƨ1HH",̢ b}X¡*3Yɉ3ƄZkN AUڴ 2:p4iBQɃ}Jqq> `-Y8qց 1EfޗݰkBoH]kAaH&l")ɥ<c. !&zz|ut[ (YY70GNsX:!VU~AYfMB;#8ǹ?B4Ʉε6y[rM'D~s'''109 Q߸ܶ5vITD5beZK4N YLX J*fŌ{Dzo Q>*c(5EͺGȶhH5%vcxC0CDP5)q:*E5!YUbE5VU $PZ1Jec,d@FCee^n?ϩ̕7Fwü6p)J1V"{d$v,е@(Zˡ=GLJGK}=ĩ\!:=FOlBM7\i>o(zL~E$[ ED@֮7qe.\~.o *uK!0Xb^(qd@žr* nٚV]v%ƜݔcW#1ZRjz3o^B\jWR/Up15:9הʪoqV* Io}٬79Bێ` s>د<H|RNʹXn@,BӐJɚ"TS&ZoAgId}ڳχ|a?$<|frVU%oy7pk.UӞ1RGT=l,n}`܃ ?6/yt.3+mWSӄ_x27sat^՝ 7oލulx۵?2> 03*hAl׆֢hIo7] ǛSۇh1M><`uK6H#udbιe'!cǒ'$Z< QEKR1{j--edκ(&T.zUjp.{OGzWMef?mE:#2샙Z2n2GW7ut~uޭ<͡3HqZXM?͜r!n6[2^>׻+9j* m?MӮu>x9i~DJTVU44Ϝk%5q'ҼEuT3Aej(QX],n 6AYCWGQ 4GY>eLG째>z߿pq7!y^7s7>Ŀ7uWg}ebϮSSc=Գ~GsJ[$ɨ$H{t<[j2R%@цͩkߢ1:uK6PTkB]0ѲTX2qz*<ʍbMEH۶8bO[o1BcRr%ۛ^a,~9f 1$d4MxkL܄ՒZހ dzUTD5msuuqSc#WؤZ6u`W;Ynƭ@Ag1N4 ym ǁ 7+|phm,vPDp?9XK&~U[s~vu-KZ{o,:1f:خœWq{^T^~cbĂֺح>UUe|RU*Xwz  }I/"_xۿX_q>w÷Buv/‹םm?FƛHM]Zk"u6Ekqcu߶ wL\m|-ޖd~zyǂ1$AOfQ\@4OSd& SzP*Ou:р xdGPZ uƟ~/<>8MU]g_ 5_yӦw~<û…_?wᱼFAΏh;"&kz0 ѹXQ֖+yvpd w][OP }_Յ@}ߔXN,CmC]BFpOuYJf4SKSP$c#G;^:j ZfGK%3HE0tqЉ}!p+Lߩꐂ Y̸#Xk g LȈ >L(A V ^I+&x'q`DI >--O8Ts(LQr|9;GAo0R-)芊,4ܟ%_ß/|*wñQ>/}RO\ +-΢u#7z9w[Y9UKǀЇt͹uz-啮x:ԂRhxynR݋?|oq*4PxaIw+PHh,X=DϠ DI) ^5S ~,J]o=\ֱxgh{;GwpДtmEi:%VIlcqldmB$EM4P(!(읿\. P%VOνX~} wzĠuq<Xrh)@3tdzavHԀAGDN[ji9\12=jq&gbqzubT$!،q5 &MLAbIkS9]()j/ĚУ0WaD68gJS䩪t8I)}1t,@WWp/ڼ^og,_WgVCӝKx8iU)VRiqn>d !xj˪=w?|9zm%"ȧ/OD 0/*tϗ v ^<9O䁈9W6gm7:=w=m@=J)kp~}6xY:F^NΟ:?$/:zTݚC{Lm; źE=\A8n,e<5UtϏEҦi>~^9RZ ޹Azm>0}~QEru[]/__׆}\//BHDy|p,JF׋ij8|J=EQUU]o$D%5O{wxwnJ||h>|l i}1()+h N@a lq\`imBtq景 )Dˎ|fE;C{MGo=s,yguysO`ۂ=gM7up0zȢBd@@!9{SRZi|u܉ө8˭ROO Mp%{֥S=D/P FM}6e@_TFCry~ B_/~R/Lu~`t]w/m '$L}szstI-nz >軻xv, -t)Vu_=-$Wi% IDATr}ypGQ7ah3e!+h}wwdY 3S ^?p_a d SW(4ȑQJcYs48 8yҾ1LOMrpހ9-TsQA1ܒ-Na[Ry0I\\".,a–Q&6W `9cִ}DB q1QOm؎!4[ ZTW`x>Ox>=YI׻Si৿zTaPvp:RQwF"mw:VvʘBCp$`Cp^_Z'g4xyxw`GBP(>LJj( ENPpaWF]3F*;:xBbYՕ }p}ap4 u !QXQҗϺ L(V{wQZȦa(+xGa< ?zPG ¢UYhHhLw`^h0Eo ZEy L_^(8(k9lnLRY!e__~ ΢0C Dk[;0aHUm ,7zi!0 I)sӉs]{놮.E !+S ]k}QdJ0U ;NWp(|xLxR%3Ei՞'}g0xe)!^kƤ#AdŸjN uxXc֌qccܡ4{ƵI9Ӎ)l\O1%Uq:  pa":JԵ`ڈ6uS,[DziU1x]*@?|zUI x`f !0X cMIݺ훺yyH)ORr{t=}}9!x|zޕL蜵ε]/ wCeUeF"P@4FBDtX(x:z)e|B~SvȪm2.<UUvRJC`mD!d}º,ͩeg,Pf)C`X&ix71K qtgqG8+Ł[q:}8n2#3]Zn U )栵jwxJ,zKux]4")[w.2;Tf|UWV4`M@Iq%{uYswXk(?vJdP PLi>84Gp_^^.2 Fe`hړwח2Zeaq^^ʾ!e?t~g8 Mmp}qZt.ԇcYp]7mg͡TZKcj`ٗ'WZC`@CX|d?EykC;=p l_h QsvP8;}8TJZS㽑 )B{RΑRJ)9֦,0ؾy Dipv`Vڛ"`koݭ`!03bk-JTárkD;ނ)O/cQR:ԖM$E2JjK;I3د&13 g[\1]'b'm(p[%821fFmFq="Yx*:B^ ސ%I S`sws݄Eg-4;r.B*CM є婩 B #zB`ҵi+=x^.vD^ȝύ1RJ:wh\ RH%@ >a| daԈ9g^/}\iޒMOΟ>ILTUPe-9|>P!V֒T*˫T im{*U`?uݭDٽTTG`R m;h g FKmDYdyt ~@[pn`ovwnM!+wFB32}|/ . (w#P|:(uB!(TBn\ڠ)RHD!pYPh#m{ Bps(D=!ܮCۥ;w{z · Z۵O\ھ6&DՇ0ޢ}\C_/eYEf>xSo,'(D%'#~ו8Sl+UDaƊr$@3stG+ 2Gm3MMxΗǖl(ƹ4,]l3Z'q:q3naiJFf!eCB~( ]]ei c43Ԯe xBBjϡsí^/~ZDVJ uS s3R|p(Ⰼk޹X0+ZJ䡩JRRBӔυ %> T,@[%HrEQR )2 ϧc4ގ绪*rR@n(SuЗZgJE\PB(f(LyBU DH ڞxlyf<m{| ӹ*@p*4_H 7ԚJaQI6Jj-š9uE!4MSFMU@uq:6u t!,(O DKC]|5M%׶}[\&ܺy:?8uíuqٗ׶A\ۡwznaB^_#4#oGinMfyQ{ʠ?W9H23l7;d(6OY|WlY`%q8q}| R(6.3Bp^xwbbٜۮ;ž?~hVȠ4B_oPL!NiYA@(jSmoLP2b! 39?( v(0$OBj z;uB` P cQg?=WPC_UT5{;2RhtCKx|.F#/VHb%P$[;tC}|x8\_A)u^o+oT>xr|8B6 %{ڮ̠PѶ|v!NE@ZR Rj A5Uh+uz@\h;@)ޒ*F 1nC ຩT8໡L@J*UQB?|`֑GܵVJlPCeBtH x|pwV*iL@ޘeYH`_Cv7Q?~x-+#]۶7FyoDtھ$P:O(<)ֿ>Z]݊q.ӹZ:oTTR @iǝŤ'd ҹAt[bF (..tsPC_M]ZhJXqpJ|P 1 8ޝ@1.UHvBQ w߽s2`)|s۶UUihe_B)ޖE(qAyGu}de*m$R:K۶R\;w:{G>s=޹l`8b @9>Ke"qLXA%af^L&ZE*xЊA8.y&EP5W'la\%ܦctB0xԵ@-ON7sgNs'S(e^"9Ί~Dl,F'JH7cښGoqZ?~ь M58+Ss\/^iQmMx]et@wBp| Rh9X+P[]oyB 䇇{"Rb\Cu4";Veݶע,n @>~l (mV*zf0yΔ4|YuR*"v.ƌε=?=8m7^BT_^tQx~~A>s' ZW%[H8޿?4*{}lʲEYTUpTnV}zWݻhݠ$ Pޒ6@R}n(8ֽ}d۹BʌBVEU,JR\YBHp>_??/a م|o췋o1h^3)XΉ2!@c#Y1p|莁}ы7M'S1aaAbfQi̟W6rL!=cO@ (-r2:y(iKM7q`Ly EYTKPdj) %p%Kş)(2ź`=u>X2 Pξ<;)e˚/ ;t(ҭj*a% XXBBbJtz<䂷'~@l ]˓'o]o˜Ϭ`Ђ%By}==޿ݵH68SK}-jyi?_FvCOLBVҺ HS?2VT?>Nj sKziIR %>|p~(*vs5W:"tJ邷vz 6 㭰cqB;#0h>IIP(^?ET "ecྒྷRBEɭ:[UP4}-?Ļ(,`MQs(WJ*-D`hMP#jB#N) H<Ac+?\YjւY/ʛQnj^V.3U7~c*|>4GҗǢxݡU6 'l~oH{#yۚ'iaF[p:R!FCF2h/q:f LP=oWLA  }ILj(OD`BwO[a`FF""D/2X#ޱ'qYjB8#a6M*\r(pᇧcYcKN$M: |) R (pT)1txqaKy`ٶ0!#QuK3I}1M\3&ӅqbŬQdF4a*Yϋ'vp~؄Q;O[ ,1x!agpƎ+G-iKZȌqkJo{s^#؊p+lu('+)F$rUF8L=] 87Ƶu28Ǹ4̠yff d<(X\FKq1q.ٹ*z rY!}MGƅ4fLg<%D b6(0]8icԖEH4&aaqBD $3CKyK/iD DK?#e9M#o8ލsqeCOT6RVJF]@#[{7$)ǘ>mZ%='EJ1 @)(IK,Uz|#fgOJFȲ)Yh30 e P8M_+>mOY(q~SXToK% /: xK'[ajy'EvIM6׍6 ۯLocQrXZ&kjwQ:HHeŤ2묦{<‰#$Uܑw@) :1D0GOa}qL ,-L[%9M˄ٓz>N]hQ[n߼ :JuaVXFqr,%!K"BOȵl?ď$'\T"f5f|N?3 G2d2lH僻i͛3=bb)э0+e-REm>GI!0gvK5ĸXF&tgiJXJ%6 {1;8X"ft(LђF.e`{:ý IDAT.T%B';\|ƭ`$CaZ-'a"wLlCdF5ܩ_3SHl ^KE]`=s4(.HLwu6F(eh^o)æ_:~O3&<(vD,W&OZ-2QAN:4X͜s".6o(o0Kp?Wq%U$o83k tP"oƍSW*m*&Z:40'}$zNFv[~ǃD)K[iI:`q_ocN{LU`Da 5z{މ7:|"JA 䘩m@g9d!MPZQTyBa(5V|X^i,yfIҙ((j Op^ݛ\EKS{]# cDә~eZMkc L!A.75:~L=~y;/7vtV>-_#H!$(^ xSoujzRaI|tց\#ۣ4dLp#ܤ?8b.'cjf-T :R3@ikW 7lLIM( [QBY!*CWf3ўTmW;"#nx0 %]LdUxS+xRB7ܥ||U7Mh[]A:g`;T{$ ߪ02xbpkyZT$V1"p,L>6zdtbE.yd槱O^ QY\{JvDͧ\~_/ `N(΅~z6?^]1S]g"5Ջ7Eax?%IS?qz4l#=ZRd%˶|0ZHL>o* oC?la?^Yg#DN[R 9G-aEDE1PheǍKpx1@)D{0ڽ4;D[;8vr  diz]c=eިJ5O`,ȧbb=.c a͑bDoɞq2fAti%6<rL)I6ǜ$v)ynrN@?-`dLnfWUc,m,53s^V Eyva S (omiA-Sqm߀DN7 B"/yc7ʶ?|o7KXO<wRu4+s`>x{/w 2aPh/ p%8 RRo\ȭF?K){LJJUŦ:KV3kZ+k+B|_ ql.p0^X[yN䍣U ,i& WY%B>U vEݜ1f 4%k]JN|6T6h7}[a ']۵`g_ȝ?;nH)df?ず?*ÝI\%YsՈ|fJ=޷fBiR!LE'Z"ElKayZpWyc߬>YCsȈnoضIv-Ij6%'PZ2L+m TT7&ґbV ./_!gl@x(?Ba&xb qij[Ƅ9r,[X`|K`3LqmmlƳy۔&ji|=t'3/|1L/-%U&i'=XA{=rdPf/nكt3Y{=x95L["Xkt"1"~HZ!-6C}Sf8$o Ֆ!37Vu lqݰOf֙GH-F2zk@T+?]n1`Pbx}?_^]nVy|e@ XE5?Sd- gW+c|p%7|۬g)®ۧMv7#;hڞ-f 7N|bߘpK5ߩBH|iHU(~HTYL<0l8J4 -;9{N @q\qD%^RèXG,h5 ѤLR1\K{ioDBP2Bĝ99H)pNͨ߅lb |TS^wӓo22Ct񋖺[NFKexx'Cc=e-,j\#3FPXDҩ(Қ$DzS02Q-־p2 1gٓ&l F<w||$F NGDʉoc^?MMOFNQu>Y\= '*cNs$X 'bTн~-{i?šޢE8BtH#Q|`UpM UEm~vڔy,p 35LG!ĊhK]Jx s: Ա`}pDq}S)H:?tYb˦b5s5",h18^J[{H. 1fY+k I8+aF7eੵ;SW|2r(fn*yxsώ"zb}/{vpSoο_B?0,9!4m(M|5fL)_,/uFaeg:TX{^WV-O*m쳁 m[.El`ވ ODse+VPb)G#610"e>q#^ v^K1U7, K=uXH9zpig;/EX<$tXOQW)RK6F^ Mf~7U[{}dāD6ϱ3?{F$0WW?cu(įO sl3WJfH4Ԫ`ݤ0lg2)m4S@y&q|R,I4xO\fq)9Mrǥ')qDr&&1\Xj^>Ӎ[uڭ)qb`?7qx<ͩ'?ֿw,D<Ѭg(b}1^G:mvOu02]͇'fi8W,`S|0+6񜅕و4c; |Um5k[\6f6B0Y$~@wTxx9N]1 ˛CՐjDnӑXUR`]3b܁%^ʴToޤ>5|~-d7_\7K@__mK<1[PNڄjTl|k(w$c.urIY]v+[$p=Ipts#"y= 'vd>Pq<ێe1RB$7Ry6͆%iDӼ0:M]-Y3b*Y G  _z8AGEGoz*&T<8&^HrÉP <͗#K-e,P_@Qb nel<*,:3ݭoW1|fd؆yeۆhKiB J O Ӷ]4ܥ&ڣÖ{3[\v0a\xؘlA"G4_K<59xQJ̶X F׌=|KUWvqB$dȊ!Eit,c,339qKŧDD4 yw9{\J \9EV𓜋D.۲w_T޼<,pwoVQcv֗}~6m}7f5}~"vŭsG}Bv'} jbM:).'$,?.v#tbB5$:V7W|"? )ᨗT*=37GW9.yX ؙ#W\G$,EfcIL5$CK^sws>ɕ$ߜ$>^0=aVo1ۆQyr<9@!QWDdcܸu(67ZXlёK OI22ƌi: J&vbh[2 %8? t8*Z'z0,[ .ÐLYx A8M(0/;eqMOnu_W>w 5f8ZC$W6{mt>1ycC)|>wq6l[8X7zu8?v–L fW厜fLY &*oUK_ Pn%xKEgx5%7"b} ĩ TKV;qȸri#LYr C-f+6 X~t p~\]ˀ$gl0Wt!PM8oL$Eu6vYsG2-պlf(gm8i<Ȑh)cd=3!+\E/i68م|noGA9O+{f ]?/ifH-ΰpۉ!Nif= 15`\M)a|fF<'5)?P_@\? ' sG4Cf-hO64X6e+1/508zAv&%[dOҨA~Wy7k3sϝr3HH"&2* ADT@dv=QL>O|8!HdF$ C $$!̧Zk]9TWWڿ[5欟i?$[!S6Pi,nO%S;\6sE ujK;<7s;tS^6OIh{TxA%TD‚_7 ^Fgu:bǗlW 7VX rn%[wt1!1z0d>>WJs%ngaoΔ#>Y{h7܌zB=6{[4 Ӳދ"d&Z+#y3_SXOWv÷Njo=zthrrRsf-i\|)Q}۾~GhF*P Ӫ'JKE'C;;EM k,d5dwhljJ #=L:ԐH6ADp֍j{Sq:4}՗76-X|JjA4)׮A]Yva~uD爥qAX|s6ZrیLiõ~G=sN]ڹ;7}fW(g;}mIՔ ,@QfPvk' @<#nCh&b“(J? jy~N G;{:O&2 jIbw|pE̡!Y;'-Y"]m#އ; d]JQ֘z BwMdaXO oS)}O|qu<d{s ,E:{̉EY=QG>8ػ@\*mWTR S= qĸŸul\\7룥~@$O eAd'ǻㅃK~݋λn8G!賞/]ͣ~^h"aƌAU; }iz"BHB T#G7bԟ,_.DNkv{Q'tj[OY e}I*,{ݍﭬ.%ˊ@mrlUiqC2h$WN;7גWVT,b!-xMv[JY)|Py8Q,vr$ͭ(A"XJxv^xbӟr,S1&TlJUD]W8;֎Pם~hff?=h",:vj֜Tr N&w{/̐lIzwWaxP5 1{4bgXFIDVTy~3&5z4 zwc߻=T''sb"?Mr`u=8.Xy#gHԂ{n~~ HRҙyw^Izǿak7P#x(V>%ޝ)[Z)2y1IDSN(`m^WO[9t9qx!~ 7]tϋRblTV椉hS꟧mєRnbq%j8ErpZ:NӤs@HzO5@#Е@1U'{JoCIz3P3>yLPG>V0.{mP~[I o.+=o5ՁRz<J`XBBp IDAT]k7ϻa&I#xL,9ƛ'?x`n4:m /-//?~|~~~eeųD]0PZmѥ074{ҔX8IJ,YKJXKF|\i!4a3mFhԌx4u1vD[HIVZR'c4 MB0jF''%'e,R"cF\Mshee'_zJhj_ھxoV*}{xgSM$  4H"vI^@x2G=>5/_+ 2^]w&J UA wǜī`!b!f&fDHp"fJ$m[#I9z5Gg̷m33_W꓾μoDTCQ#h?@A#iD#‰'FZh- l[s1wZ)xF̬6H{+ؿ$אڷrM0OC o|zGAp4JBl2kḒ}ysξut]77{lmm5!,ƠO$gF+ at.ɞb)PA2i)"B]VeoH! t+VRq(U3aǣ$u8NL寬H-, .KO|(,YZ\[n}hks2~?0?W4Q풦*疽] ^5O3t=~]uYkС9?cG6enD6ƻ;ul՟^ {uo[ۂI8 N,"~Q/}0ԳN}3}Y6C^N|g_6 8q(=h iLE$A~ܗy^#gJPK 5e Om`F짿O!UV6 c{k3&qW5!4ىD22A)N,9y=˗!O#?~|!,Huvw/>'H~)lgӜhej!v]_Y36%BH+k??3;۟n߱ybԌ-H3aWZ1rݒt;Q^Lnm3/-,c{\wώrh9Хf~?XA.2#g ;m8' FUbSnNȻܼޫS|nٔ|O㯙ƉމmgsDD!H$,չ,T, a~q>_)GϿxx8=?@=r6s+;̬IPkz \?S5Hi0uMXI/پ9fгen>nN}ʡn(ˠ&BJq n8-v7'q?vǽ҂zC~;wL/"%Vz pwN˟)/S6Ms5Jë=I.mZ\+ĺY{a_1  o.AGr q=|}\rQĀƜn#H8L  ̕81'pAn^Z^םuΙDyԃ@\7󕝿gNgS@ULViK Pp3LQk򱋋W\됴&~ew!}Q߿sS=AR';qTv#?\DQJ(*@:ֹ:u-ۧ~X0t4 č^vE}=$ۖP\QTϮ; LT ߼wo~ |ӨVܯv+9؟Yco{}3B`?FviQn ;`UennO==.6 Bi: SW[ ʟ:n/KOy^̕Ģ!KJu;c+ӘHD" DADup?ƺo?qc+3SV.-D xԜcm>Ý#3?Gē7<{ o/xȺ) 9sZIi05U?~M w; {@Dn)U܉uIeW%Lc|}ސ-98# qfܻciv,E}[$uBP a.}gn7&O?suǶRiZ!r [w)'YBrC@vP`[{;N{gv2 d{? {~cI `'~uǏoe"lI]U^Őq ^jJg8-Oֆ<7&,ݕK,"Q1Z@v6\aAo'Z[-gu p͇^O?E``}~n{h-&ƛ@Uȩ$LBȦ!ݣXukbwʁs+X:w47/{샚7{;~.=z{9vvco_5{: K1v=<o%2U|{O g1 QޫE'ۿyy]*lzӄXl}m5NsY#nv*=+94 ;76C\[G~h?OZꪉzisEɎVq5}JڬB:jGŶӌ M{h.{FhpAv s1  jzvcbqWB&ܽ)c`= cFM:8xv&X%^z/ou.W!U7Hq.豃kn߀ qAA$ЌP l]ɑ&IBET'^-|xquq4[_Zw}On{237uWb4u{^q ׫/ MKc7/!qѨNیnOt:)N +Ⴓᦵ_56Y(!=y~MYˏQv{ole֛fW5^1[4.{MQ)m˕c<~O==[g\t%$ٗG_v߹qvv6[pEI=}Sɔf(q=nF4waX){[MBRV[( 3yF!&(Qb)(v/6K[LלƔK>'E H|UUzh405r'PN:ujV?5=fg+/Wᱏya\||ǰHfu@-{CXc >Y(HBu6z:23?ߟUSG>Ït4+x&j|~u$okfaŪ4Sp=j zTxDyD>Z*mwX;$L  q>_ zG;ڹ0!{dé2]V*\z A6wͫJW;.MX'R縜/s&o}څסsv?}6>{'^";n'N8p@=VfJq w՟ S.ϷqQ;oa$ 1O'ў/JL+Idpq#~Ed@E}j #@4S.~j6!D %%2O`0 iJP+'$XЮc_s[0՜Q4wpxt{c||3EqDY-O#uZ>kKk7r#BPΪ<B  e^24?3:m]Z~w{S# n_߭G&{P0ߟ zUa36:1ff%&Vf̄:|sszR21'cj j=۽!hP s3ՠ_>Rt7s8pNI(hkY{0{KP_# [םy7^" 05~MMȠ}d?[r s=Nhk a8"UTMNu g }$@VfvdhR݁+w^woݯw@@QP5$= 1uv#qf7Ȥn᥂*Dl6-%ac42;;; & BJw:E" `;2nSoG[^FifXGI!E H͍֘oD4}yy腒, N3SwcK8mLi%q>! UF+n2#$ѥظ[_uj_2dvxG)1$BHIvW qafq~0ȜO0Kǽo}ueܚFcBHAי d󏐌v} zUU]Έ`<ÅŅfPӻZ}b ݯ{qńtDDf/yss9li>;o__<\r4Ej !0 ҕ1DT0I/T^jDpVF h p+ؒ&t G ?Hblmmo:L5UL~*C PHI6sw-m^ЌUz4ĩ;wRw~"nۇ>p͍pUUcL)H^lBϯ^gW{ZU)\S]G:5"諪ȅ?S;Pse[- D]H|\ޛad,jdgbNa8$ 䕕w"'UiMSdk@1P@1ӉQlPBV!@]MzuhD2zCHX|Oj~官дF&p~k/|ҵë6d/eEX$[يΏ,lB0~bXׅҋVW_\Z st.`fHb(B`+N)@ؙ(PJ)YZ D~YHD"#! <+a@bX$XórB!D jP^ UUB!8mP_;HJ_נѕ/6ɑ_U^4AҹH>JOWLﻗӛ8\CEtMq$nXhpmvL+-b͝o  H(' aSʔ>:p# pso{_{ޕ޾ja4-=oaYy3d ;Mmkx9 ۛ,J695DSD$)\lzp^|ﳊ@H͚x%+k"`n ZiF;bR@ņMO4JA?eFUI:)5b)IJ7DS%۶4q 89lkL>$959CLɊIYk;sjRTrl}/jhدK'IHVjID;Ǜ}х %Ga+ lWG!p݌RJj* 4HcU ; DT35\8q#0KI4633NQ | fda(C^fd*B9}&h~O={ 0ŧȲi=p+|k0@Egu+h,eK䶸lhC,?1;[wn43H%k+a6Mk!2͞U<톅K=Qf>=Uyz)$XFLX ˙PB1@8qINf1안610UPFMԳ(8R  č%%V̜8Teccgq@qᕖDdPSt̩ (U=yX!*7' ?dl\-  $`Cޏ!&y" <=JRY71@BP]!űR;_QzO$hagq $yN~dKLPQ+$zӠLݺ6y5c$B^/Fhg}SscNTeo)u/ORf? q,RJ 2ZɃ'GbFFT!*QE$1" @ @!&(:69PPsjG}73+CPyRs҄?̪-lG%H8)ħH$ #|}(`dtDP7^P%.Zq/Q mmJ/c1M@l+L?DR!L p:3:9c%e+wp[ U2H9^hr^G Yl:)1] T$!_XBU|6ٮN1Y՞1Pi\F%ɩkSywcgJs.ͭBLpN>zu0E$̽^ijH(ף*V9VU=5af y%f!4 9PhRBш HdbbIDAIV@` DYL$T>1_ʮGhP0{| D>(Uf@TlY:dj %U*1;,jTA@M!0O\Xu,tlPku=\4KQX83220jJaE4|5gq0ѩG6@-R)\;QQ{fL:j%h'j{3g XUע˼ѶM'v~gqi^U\ QS%P 310sReҒ}ޖVH'H:nB0)ca\Lm(95/;YS/V\mbUUKD(PJ*z?"DƹLli|Jk`A߁3d f.ig" (pSp&UHsE o2(JI-H(L} rAC%0۰,>4 (y6OӜ2‘d&M+و\ _8H!CBcDXSi_f1[N=k*#vnE} k8 ݷu=r~Sgćf|mr)R^mo2PZ;jԒLSnBimUP[˭<ٖ(UAKv !X|MgjcJјQCB(Q0(fis1BiD$Ę[kc - Dڵ:!# Yp@Pfn'v[dq݊\HƑ EC*Q̼E"P&# &G!#4)@JM eF+,ubM|IfnGrS5G6DOnl1C%, ERjx[3M0˳ J7- hge)dVJ.;"A:%mK2''P:5cKۃS\KK-Y./A 1̧ #yRg'-GU$d{2TKiWa{AomCYMjD dY^ }]MŞ R~tY DA#pplەC6> EW[N6)4BȆ 6ǜ> y ;V`|"RK*Mf~jk+Jפh'>wuOӣ8%!hõ^ #T<&c:-B C .>Q'SB٘%~˦If*r3̎qy4S]!ul^"Yl!! 0:ͅ=6,{Xf9l7"DZG-~bKH(-R1#BԀ8pҀiXRQڨ;bݘ;t!6M-UTQ.9`y{$?Ȍ}oJVJ6]حM,?=_[Pо $HUQ8&q-;DAvj%SaNXr/ S [{ }b/?w+$h 04uaBqdoQ |K3QbKPނg|dA<:H^ n9@lE s֫מZBYwP,(1ܚL4.T Em:d/L ڞQ+hY$R3gjIC9LԬ<32ɪv63 GU"JpKb'R+(Q(Ԍʙfoh)P0P`Ҕ.^@,)RÁb f/ AiC[ԗD),I$X0ܜQy 3O00ʐ[.ƺ,1wtrM*x$P#`RrJj#8Oh|:6{G:w8*e{KCAmܒ?Nθɖ&ܹ@ i5{,NuqY's\,LpF; rwdt4bz.1S;]m|kFI5#N $x%UƁ'͘9@}' 4*HKs9'*eq.hqi?eMf/[Tv&|-a)-åۋQj&5_`MeW%>6U%G,êeKp꽬cSTѽ!\ 韐M& 牘lwad9)s\!FkWR >1[j4I7k!2Y*=^@h+\oU= HbQ:]#?([(_vQp|پpߍdD\Z<_MHmNn !w֓Zg}]MImAۜ lP%#i&3"`>˼ÊD'9,x7 `&ip;'33ki WIm-H'3uʓ{1 FʌŽ8RWB_NL9Yﳑ&QLI80׽H?O3(_#KҔD[F,yIc,I] /ObFLA KviMAdi; Ժbq y6ć 򂾁KEM\Ee$ĺpN"V[3vJ@DrWsit'ۮV)WcnZ+2jČjI=K,^&b:͏K!F-# W'Y^9-4:@@ԣ*b+FńJi'HKs(˔+ZCG3d*,ȕi=?Q\᷌/+T8{P{U):LZ8+>H!J >ħ:^)~~@$,d}Vkh 2"270tAr2ЦEѳPn>wE+@+5SH= Ԋ~|7!B ,\jL9:E֖UpDXGõm"8L(vN3W 瘀+Ɯ9C-DWr TC65ۼ& ,I3Ž#`;6$EgB$Đ [(b;"՚C4| h5,j#.*^ů#[mNgs bo6[uy8CȿQ Ez@-ݰ+t^5 R1ָzlZ}g җq|`˒jXr>%5KR_fg'zc) nY!'蘰( #J#DTGfݼ) s(X3 wۘCmI*v"J]ƒ^؆-em` %(̚^Y6]ִs;":Ym ,լG~B[m䭔%\YL$$Ⱦ[C;D,$t̬U$e+f;ڣ _+Mi5%6-];JXhӲVk, [}{Jp$AP˅v:*bcUg߹+e]7:0R&*53ߥ |2d׵N͖[B 7>=҂ gpIyJԳg)us<1O䂵sS&.WS )$kVlmH_gNmU \2&Dl_4 -T>?CaS[@Y2Tb Gl=׷s-jc >0A(:UJd-8r(jƊv =g~GX]jmB0/mV,8IQdhynI6}=R*+d뮭] "kR`-wR:[GPTNU*mHin#C(cBy侧 Dj572Tc8j :J0ַvј՝P|[R=K 1# exCZ@JhswFu_Y8Բ¢<*VE5웉eS#A{<hldQ7,~:Wg#+Ue ҦQQ8;``j =|,QU)Hcm݊-(me zձN%1]ji< [nvGh A'Nh]lVɘQvj" ,- ~\9X4/y/o5 O? e' !0F}Sw6@LCj9%d1iͽktn7;O?.g~Xb 5ʎZ"B CZQTR] Op6+% ;z~֦&K?}V UfVJ RKi(#F4ɦṮ nP6]1iUQkǸ&^%פbq˒Yȶy-],n 9۪4*ȭSK)Eu˒tgU.E5J^3GK-a"˶uy.(> L&@""t\6na :oXCE,$7>҇͗[]|eiY9D9!@E Xݭ.@Q̨̎Vou_$Og?wӡS?x_s5\x]>x7Uee$hMJ=$9ϘrfQRdu \ڕGxSAn:t }3=)֮gx8/9qH3"MH B^QM_1ŭR|Y ~&:]2).ν≵V[ [p;%TF|De]M6XELڼ֫|aƜD2 BuNNg4JkSvM;gozt9^rgüQlf pn5Eֆ7"?SKJm R|֍['y?;xpFE8L A;TD+4\m<&V][[sї]rFOحv([~>n\<ِylSTK帔qCJ-gPמ̓XPdQpAst$zl KwŞmxdBh&4)5"f3:bj5_#{xM/eqaey7W~4.E)e9y8*bSM^ veM^Z *FW4(M2[ad#@?3'dYMTj_&@GAtQghYp+.) \} '/+r?x X\Y}"m[}*oX%T Xz%m$*R:"Mɲi1C4) 9%1{УSOwđ w6($>A5h"n2 tNIOM1aNى@ĬfxK!qR*"q}.AaU[dġ7FIwo~ׁ# 2,[64̊y''NN9]|v<$ ך-xRG]]M+R9#Go; ѣgqk8>"?.:}Y7-'rކChoL:=u贲G237lX7O|-yE 8p]lh^iFh;-dVq F8CO塴JR㪣] )9Oo{[yGÍmLjmx`ų7m/qhe@MiXhO+`pm7x#s2hR6IRr?k5^B˄'&3{U'f! ŷ 7r/}yr(IADb}(ft"fsh A+$6k#-WW]\Qps'??ӯ `En~gPd,&ZMy冐Y/.Nu1mndY IDAT\$̔,)RDɌhR#2P¬}!w}o)1Zg{Ӡ(ж“N|<&ǵ~TGڣٓ$t6YMomzS9,B[6r0%'-\=L KFPj8tI¨^U8h*g!wM[kkdr6{t6y`# HR_lC;v#'<)/ͷ H#4rx\]PJ[(Xz$O Qۏ}#W\q啟njm`+?+8zêC@E-HNkY٤CMqm(p/;%< ;HB8tAƹ RB!>1C-Oymk t3Nf_dM)Q^v@_,9ъQC5wnؒ#6YsZ)~%"l'e1hi,@@+9hÅƞ<f16[GXDlt eSxVd2@ھ"@n-Y)G ݄r+i옙GŦS>қ[~l/ϖ7GyK^_B{bUx R*t3LoY}H.$2 mS򓻻3wkaxh8cSnD$t9ibQ7w~?>Aiww~'NTUW繀O;](vyC*Do A-y}=VIׯ>/^:<_ؕJRp[`6Nh$_ !s{evAꬬ\kfE3̄AmW:!I z#1* 5DbYWJ,at6ɒ;{dY0· T~K(bMڳyqY"ܮa5Q0C6{}4)sPUm]Ga~iO^?^N+!WS Q=a+$UҍD+p~~x^1ݗUgSG\i Yy]RWKk{6J~߱n*z¸kyS%5UL>kp-F\:a(]b"MSCp6TL7Dᩩ‘`9`w9_5zUHv(C&B{^( uz8R<Tf֑G͸ E']O$lJLH[U\MygΙټVuowvCVz#s5Niamvr h)Ptd&ق= 5JH#@j. Kb@l>GVm臄+ pQ gw#":l<WRA^V'3Ltk Q~e–LjWEG9j Ա[A*Y9i6}*Æܚ;*X9c+qLe+2y54ٱAF4HS1bdk~.'cNNBd']3z 3˪2nק1#}.ZE'0cG0񧒺XòGv̾!NĀ]a0#A  .TN1.%o .'ޭ?x CŠ +2l-QYz}`^g}#ۚu\A'[ϻPW[!X'xAv%x%EU}8FהL ~DyB@J_٬{3UEqgD? d9^y3HSvnÛ׹*ľ r씁3 Ez8AQ)Ж֡unLM9;^$\P ?R^)L94;مd/9 IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot13.png0000644000175000017500000020315214620351225030407 0ustar00hanshansPNG  IHDR65fsBITO IDATxyewy}Ruk}QVB@91!ENx'qb?!㉗؎xl,`&# Ivng-qnWwuW#VO9}O}ϻ_ÀP_4ċ~P x99p Om< yK(ZmC@7ÿ g6`R} =P w91x0~۲0݄+5 `W̯)N}.3oOv@ S?Q GP2]nkvg00<[$Ǘ%0~Kx@%?<8 и'V'k"ϡ ?y ޾H'?`%!c\1wN߀dgf0/;F|Wx [_" كLu_!\6߅q-&E-mWkat|I+<9}ec\z*{M84~{&F\nփoSGa` EoŽYTPxJcnػQȅȿX<3:΃B) 8 2`Vx=!UjMH !љǟO (:u:KUvrb 8_H2+ed+MD':׃:A& 0EtI>?`/5x g$5`]0`ˍ 0@ rck 8K^ݕ]09sEůVu7Iϛ| 5 0!~_ c'oY>M{)"@a-f?ގ/YK[ Ak4Ձ _Jyǽ7x#mbW?F3Ot;e8| *Ym$wĽs?饍?i- soq6~EXŧ~0_vuF(@BPϫz $Ϳ^KaQP݁AH~^|2w<WtT}B]_'HZ(Z@ |"ww&.79 z ?nzC8% [_k߉_*G8]o>)uW.osҌyrwoi~<rWWѱ@gpW5]/_3k!gl=I 5^O24BRc+pO ^|?:f<___-wۯPs߷zi7;Xs4}/FuU ÷H$׫h%?ކα3ϙ4h~y >y.~Qt4ڳ~F\H+r- Q xho-p:Am͌q%z&~PZ}#Bj"$k cs}18/E6`󆈔p\y 9YUk o0`]0`ˍ5!3t 0|̺&PJ !0TJMOO?#B D9< !&''?ϷZ'~ow ,|J)LJh~xÇ~W{"ޟqu)׿kV} _ 7q_=>>Z[jy_&q7 GJpkyr\s8ɞash5vR|3{y{}(IPZ{4M'&&sqW:55>r6&mDK)ŏ~R\xȑ#/㫟8޽{7ѱcǦ_;44m6!bf\ԏfV;v wΠkq{_nᆯ|+ιcp]&''7qպ1wя~Z{w||;aUOGD>苶 /s<#/~\pRxC-[o|p^ lR^?y^p(}v,ܲe#!xU~9WFu^L㑙ayGaz84}Q~.qΝ29W|nsw~iyW]u>nK.y[r7M<7c_$JRT՞Ҡ)k}JGZVh޽zkoUދDtZ622r;\GV;w CjT _wLKOFkXQ@8Ǟ3BRˋv~v߳*I%ȳ\0ƙFUEvLҪAvKKmDDR 3aA x IIs\V#yeNb-KtIyfwzﯼ8^#UydddttsW{Nιꫯ0 fWHWL[TU@)u뮻.˕R{+\K䔢Yfz<RVV6Z1RJ g01qᤀ8o cY'TH-6+1$M$VL;߶yX@;vD^I3 1w$ssPұN*I9gJ@TpW+_ Thf Bp[XIN¸zoj.m&smUfZ,ᙅig9Գz֭nDRH!NLէf۩ZiW ϦmvQX&{i>A<ϳ "c|Bcӥs^8sܟByo>բENb5KdoSR8 l9X.7863f&.N^}uЈkaJR= ,XHPHL^R(\ i,L6Z@gVJ܅BNou 60=::ph8ԼG݅E EV3m.w#aH͎R^ihM @ =\-R -..$ׯ&D4??g-zRzkqjo߾xӈNZiJ)<>;ٱxg O0޳sIMYgp8*6UoH!utp\ sfp7$]kɾG/ض*W}۶O IvBhbZsfR4c*ss[%%qFjqtqADf7tWc(,9Ϧΐv%ϥq54'hتpKzau{v:x^R՘HA xA,{9G-4D3?rm۶^9r݄###ڵkW py~ff)^kc u-2܈HJvhz|pZ}*Wgt,B & )e(ZK)D7V+C_i$JR&@,/<YT6գHIU㫮lb|wN16*-[ҁ4M:N4LTMxX&*v0<hv+div7oav)FGB;]==fnyiӪZ z,WOqKRT=g. !Tv;\~8NvD~kR )dWOHD`+*E+5 "0@` XfC0D ίp$PVe2gnn3>>^t:d+7βp'kjVRqnk7(vrr2$I><22̖aU@_^ d-v*tuZiL:o[@VřVq..NSާ&6;HƷnB?裮`]qIU.l 0 C!8`4MGDEQAp~,jsoܻws,BT*j}wn޼,={%j'V tH'f4D\ )04ݥ(P tFATUi&Qe͜;xH^쟙uʼnxՕ=z$p߾'/ rֶĬ(+rKPg ԋmD$ ErT:n1:IIK9 J4j<3W#x;sQ@'a C==55::42:֝m óWRw΍,˂ Z㬅=p s c$CJ$xK33`+7 F+2»R =hiREܬy~[z衇߿m6)\eH/l_.UJJJRZRy{80??СTғe(ιٽ{v:\V+{}-˲%Y9rdqq{_ˣ`%if--7j9c{8! ΌsClf\3xM7;hayGi"H%_]q%Z2?4\g N #q$,鐦H|llH3:'$B|{aK/sd5^ YXtLzGX/t(v橛_ʜ%JZ}מۯgNa-1RR0 HPT:Oܗ'Z_h1' opa Cbx 8*}̕MV} DzRdAdPOq/c%R^gff~D cJK)OT@=!9 X8MLL 'ʏ"pDZm+2EDϨ~n APV(?]VeToefޱcrbbG*爔2*snƍfرc˹xUW9JY1kh+ṅJ)kZn6" BЁ@ psK kj"ѐ5J xW "TpX~fY_Ԩ&߷@:l6yAiWI:DRr.G h[PTKf' (aư P")Eȥٴlu`%-6yZK@4<)ZڈdcfYEYK]uR#GUѱciKYD$VCK   H1 Q[Ә2Ffe”Eġf=@}A$I6n8<<\~SSSJC۝sNJYKϴEQhUW]uVTVJ^'C9Fa~~\*|СCd'|R)l6n:55UH믹 IDATuseBrcαsvn᜝jԂkQ5R{h&}&*՚^<<3}aLl6z/H3#*˜qFFxi"o՚T Vf۞}XQn%nfH2rEF|n  *Qv YXXdeFL ISSzZҎwdAXH}B֌K|+]g%@J|cXv@,c<@J!=z~[m10JE &* 4d̉Q -(B ,[ɲܩv. ^5 !~unrrRQJK3 Ace,^vsR,$HHk:4뵼(z[:11qVU9j}׮]f6|8x}ݷۿ>.ݢ Fa9:vVB\ RXATv2_-r饗vo_h4nik_}ջw޽{wX)޾} 7P3i2Ȉrxx䱔'{nRhh/v=<<bzz4_<}Sa94<{vca!7.Di{dBz %n*$$2\Дõ@J-uVhT5NL 0׬V"WRFA%εB /")+I"BiqMZ( AȌӂ% ǒ`6so0졃YJԘA^\(uJ7TZYg\RBaM~: !5)Fcdd䬬Tz^6 ڃ!p?^J"ʆabfUZ|@L$ 2`o~saÆ 6A霻W~WkvԬ2x\P|4j:22R{^BoXn3333<aYV^va~_}eг"+ez_]~e.h$IR([#:Kt:Jb׾v2sZgffZV$F00B0 J2\IPz53;g`dmu}au{)H UJRВ Y! y^xv8GOz])i10.-|Ե|k<:?L:iǩq4gpNt^< *\)J]キAI͜Ҕ@jU)gHh`는/ TJ(x8N$˲"BVXғNݲeX+b˖-vAcrc\٬j)ceGK۱cݻK||P*'$RJ %36ynD+t4­jN88BH i*$N+k $2-F"/bdxjIGjYB8=cAX")Ta8Թ):;$@§!cЧ+'8]z+&A99Rh @kvoR1{evF !ʍU @5,5Dn%'[i%֑wX\lJ42hvaB¤,$Y+`~6TnX"1T^ vSc5 嘍1a<9^8|v!Ɠjhn ea"`tLGAH"7H1N];,2%j'H2?pe{0@c{CC4Ͱ];6 aW-{ c0{[>fݱcǦM}ZO]D߾_z?rrjunnnllljj )Cl%Ƙ$I.lrr򩧞曇VEQh RKB+mSZQTRnw|.5q,JҌbH)$gdYZ@Y[DiRc @Ttk)r: 3 @q{.Ƴcr3{_ʽ x*p Egemju[Jf'_KFƏ͛7?ofzJQGfÞiu4ve\p{ާY$!rM޳ 9еs;D' Ըmfǔ#/8 zRfY )ll y8}̼aÆRżJK.YebzQUNZ'MӲзne_%_[eĭY9klyGBJ)IrkqLƆ.1C Qȃ@i)2 W:e0ijlT1iL$B{&C =1 O֙8g IS@mf$S@KIhR!,2H^w0G.YSVXj&&&tlٺen~>R ":ժ)ZiΖ7))Oa#h\c+I-J _}q DgZ^@^t<_USOOKY>`,sS:ZxY旟߱cG9?,z__ \my'{Sޯ&tHO>Rv9;;;99IDCCCjhֵOzܓU y1WZ04:B=Z5]V#m3Z I"" ᘄ TJugwy"3HazP$Ht2"*" ñ1:= U!u[. xg,;`>;7::Vtq8焔³TƚZVIo"{%j$ȚKλjRM;[Vg:7^<0,`|lЕQoӄQʷ͛sl/Q?M ʪsiSYu?|ι{;9$EђH[H^"c ~[y by q"C?0$˶lْe\ː3{uU{nw9dI goWݭ=A( ˃P)Nڋ08D!32K5{AˁDE)$Dc ;.E!0Rn]aAVRjgJfQhJc1| DB93CJ穝:tv6 mL%MM Zb]u-C^LoYތ.$8uϺ&B} tia@ZI`9CB8{!`Rc] V$>u./@;$KMLn nzeW-ۃ8 8Qǽ#BJg-i=_! \*ueJ2;[ peuea90Hc;|PΝ;3u.k>MѶ3]q֭]ZgȾójH"z0PP"H8T:ϰS^Yi2`A{  [h#[P*:Ǝl?JFDޭח,xggffs~?˲MQQd.ߍ[.E:'d ΍s^I\bBMTFR),ita 'b\R'Q:@0.w@EEds!\ X%"@`˃ 6\laUD@J*EP:5b(jy IDATFSGׯ_;t@ǝno;`cReRիZa脛ȑ#`mn#n DwD@TATv¥8 k)l]R~ݮRӟtZIKFD>+J"Nz/Ao_5 ݜ`TH ! B_!h4 Hh!A,nŒ z_/aznkIin z7R/#g[-Ap[cecOs 9gHxp9DJuDa$YALE8X% lnRlQQ9Ṅ-), Z3;)X,0:BrAV**&㠰n* ; # bȃYRl PJgYN*Ja,(`k05eq) ," ȨPY /R" cg%&\HߐarFٴTȆc+O>~l1ɩo_%nlIOkOx;0µD(F v+rv"YF }G9S耇7^&⓰ܛ q0Aqm~6˶+בIƯo&;D;$'`Hf˳.faEʛ <"A:DAyRĎ0 ,1$QsQ`Ddz|Y]X aHkv\X *Ms{VZ7Wo48"*"<Ϣ0Vţ-7F NJ'Z?_sxGΜ9k_#s8p[˗޷o߾}~WG?zd k]ztU3H4e0 d[Q -mVgѫ]V/ur+LƜ-" ;$,!"Hg7a%QFi~an{N2\IKVCk8[ CH ύH(ZP -Y&‚H:k9 ,DJ(ˬW&( RPV(4lP.L ƺq\\N} 8$AĹJf}߿>ѣGKC߿|ȑ*]8BjaFOS(883Pa)]YquAB 0tu*jd0lfRMmU'Y1#mcj-vcmn%Q!"!Z'aLI-/7j f+ɠȚlK$0P@,Ya#cahBǔM+&dP W@%I,) `00Mm)(ey> YHV#ټ V6҉K=kJ7VOɋ|~zr3D[,Y5A"ٴf:qkhLLaHwRxӕ* c9qia Ũ0*'ID\k>|k;yơsV~:3;K[ m^̩j`FƘz?w΍ DQ +3;vbvwBʯ@`Uʑ\V-#ShR1S"MzY[qzݐEc.j7ިq \ 3:6ٍI֯c8?vfgta$MQI` c!uX**AiZˆ(sjAX`0^[ʁKAEQnj51:ZCEqWYlV3nd$d "(SXheYIZ7q3C 'BX7p:kJnNO( R"Yf'ƕGM,B̎~k|Kvgdܕl:pøN65@ehf9cfΑ1V c(h~ˤZp!vz驀 i^&N˰(VSSQdn#J\zlT E/_($YB J,yKGDsDXc2S6iD zoKQ;?n؆Qu#.o\$`' "@R tP:F8H1a{tJB}g1r98$tcDXd0=<,!T+oCLEH ",-&ZڡDFn8Auk"RMMGk2t/bݣZ [|wi6^ojX^=Jۋ+]9-  Rðh&6>]ȍ>/ ( Vc`]N!DFO2؊ig)@XXĚBJC"ZO9& Dt@n6jȚ]MTw`õ[Ay TrZu2؛ pn,A3>?ggock=q1 `0N~bnpq[&cnL݊r0ƞvphHӟtToֺ($IUx+t(b0 2s*Jc7ڻׯ_T*z!#}ck]?^0 {r={|]kHw{w5wgDpiU׻wPyNktM);s=7.ˌ1:?72x}b3^04]=7qau91RdYQm:y8 ι:_=BQFc]xs~ݽz:w9C`//O?ÿۿ} _xꩧvywD\[[qRJ2L`wN?y/SDV<%Cuw7&v1G˯kM9‚/ nRΝ}z//^8\ /l6_>N>g?Y:w\+8Ϳ[J^xnoJ(j:mƽiNw`& ׿7pqͲjz=Dr i:s|q1gy3d;wQ휧( Cz\v… gϞ"zȳ>[VwG?=؋/h9s̕+W\g?}O~jK_G?x󳳳Dt a.--54Mv9;D+THxsn0snOOOoCFkkkZme^]\\wқ*JR tŋ8}῰Q:thnn~,y?/rEZ(^r!"vZƘ0 }˗/=333ۏWDQNs'J|_~9ik`0h6=Ѕ DĉjZͲv۳'O^zi|n{̙g}v~~> ãG?ĉoδv:k+ beGY^^>u?_;NZ'Nzjۭ^[\\j~0iZũS$I~"~PT Ν+Jz}nnܹsGy8 gffvy6o{>y{fStrpqqZ^z+W^3#\./]/?-رc^x_|7n\x\.?;tmG@DO:S'Nf… GݥYmLx ;&wLѸqƸ٥Kpo8f>~Bպ~zfQΝ{;nO:5??n8nZv.,,9rdzzv; /I<ϛfV~xoCD+++j^|9//0 Xȑ#^^Y5J vv3f}^Z׽n$'Oĉ>#Gxfi޿b:u^7￿ɓSSSEQ|xGh0sRYZZii8pVWWժwc|Zh.]:r `̲luu՟ p;j'4zSSS^4><|qrKeIj2L&'o0ûW??3߹5 W\)Jju~~~Dx}џ'qگիW~ׯGQt$I5gΜZ?íVj=CW\9~xV{;Y.O:tڵ~^l }ۋe 𩧞 $(v?|t$>[^^x2"rι sQ)FٜYYYi6 DT*07֕JeqqQDhjjϟׯ_j^PJήe_~[)V&IRզ6doܸE:`zwunnZOY?(JVxa9j=j$5"FQtj7 ωA _89ryGZE\j^f,JI0svǏG$Iݮ jϗJ%/;V0==9yQهRL^>d⨈QD}6toV߳u5C0:OZ7y7y&PZ$ɓO>Y*`Rϟ_XXmpۀ7j MSǑ[mM&w~>[*~{dm&AD캪 v;cxx,:5~n~܇O/\pԩ!osl+菜݌ws&)/Mw:?M똄H>7jnko6vgQa{۰G=mأk{6ѵ=aw {tm{݆6]unlV ( wx9x_xأko bѨT**JƘZh4(V"REwΕ4M} 3nt[mZιz>("y> b,Jޯ\.(zh40A^ZT)?-onZmUɲN/%ƘYkggg8T*~uJ4Mggg}; ̌/x(6j~|hV9I4Mgffy{r>*z=cL>w@ɳ| "͵Z-D p]8=Cvh,//7(1ׯ__YYIDnfz>qeeezzo>g 6I嵵,ˬwx ck-"cTkkkz=v|&"^[[ 6͹h4ﯭ-//Zk&".FDsssf6u]7x G8H:y IDAT%Ih4j3E1Lduu5 C$I߁R>\o߾~(zXV`ٵ\.߸q#~$I$˞ uDiz^@)5??EQT*noMUL0Zz֎7 NJR)6}+=CDvV)_reox~8Rimm- Cmacg94k_˲, Ï~kwZ-OMM-//+LQyOMM>{nnnݭqmmsvɈ;Dt*&r{;NyۈM~/:U4~???…'>կ~u3BD/^|+.\xꩧ|B!cZEim?9Xȭ[ŋ4u ,Ї>TV_}W^yK_}Z??|_/}KsssRiii'' uy/b]?^;蚈DQZ_ٳg`-oqO|kOxiJI uہN(]ʡ̃|%PJDw12o "`0]oa>s=?G4Mկ"q=`Uեu9w]L׵7)~K#o ʷSo"?ȰxB)5ﺏvΗ 41gg0̭j'2NZsfI|S<&ձoijx~O}ӝ^u6R@oHQ_ >eu}˞u^6ILטyaaa;f{{uC@Eʼn&e-"c [m={RI $Dh ] %(Z1h`QH"r 1 " X@"DP@1`nfA Т L@ Xsoأk{!3 Za&$AB%R% TJSw_Q@k"P)`$Bpˆ1;ъX"BAL*b%P")0h$ 쉜g! h@Hqctm熾pO ((4|j@ctLrẻ:31 ep+zu / '~(B A/ 49oȳtH̖5&L׼w /pƍGy"P ޮGîE?EeJk֘  \J@" ̎ XY4 0{fn;Ywk}xG~__2$SI=,x;:ŎtuTNP HʿIٍWΞ}G[c×8ԁZZjbGyԪs9&yRo >,B G ȰL2p/7.8#xVeA!\P42g2 m2ffHvQp)8 )V+P1gbJcM< ؙ"OGETD,Y"\8) p Vā09g@%"@ &D" Z# mH)FZ4P8$x 8phDFαcVDZo}) _9kRJQT "Hagu5oztg1u[ '|raa᳟__>}?teC=|NӾ믾w_RlS"q%(* +kJ&(TADDcr9GKNH Q9P)ְqM(ŁrXlDTCۘd8< ⨙DF4o;+pi3Da`PH4@H! (@@@BQ8VDy9p`Jz ihH 0  r2 56!:eDa¸̠p6p6ǒ\;G’򳬑DPL^pB˗nA q0`eWD(l9f"&! p.rqz  jLDQ+CEH#BZ) D$BB$rRuଏDNkʋB%q<|X M\"DT&;/;k0ֽ^oy4m6EQ\tGZl6wߗ??wЇ>/~qffɓСCڎ @P zCʐG@Ad  ^;(0LWN@v&}гN73  fDÃaƜg {2dpĪ!0FNA`q^.k/eQ[ (P1˭$(dhܳ(;<ŕn&&AD@E:F!4l B &<] N^>eb@+" (Tj$v;]fP@H"&ydDt`2=y>,쉠F:ϯ8 SJEύJv#gqx"fZAHQQkHȎ!j=]SJ}߾rӧ'xMV}E<ϝsn]vѣǏ\r̙n/a}韈|#2{YJDӺPAM’#, dYfUZs``S{Ax=L<~x"#8`P2@b ㆠFro_1^ / hx1DwVΓDD!xÛQ!P D,nlr&F  H|p`Ms.gFc'iꦓ\D9BЁhְ؜A- (~ޜe:/zL4u"F&Fpv|!24FP7g2`r~Fwf0diE8>Y@Za8@Dhq w,"a (Z :‚7U[Qxb0[`;f>++q3oo9vժVt7Ɯ={'~泊>|\pnax~\rE)555K;t d7`,3Ȩ6[}< u 9"R 05{[  njL[F}@p~ (B̵4s+ZZt  @H)kYc FD@) a$_9*C&ĚZm]EGf0(8(TM3"P%D X`$5"19/0 <üpBkE(s2:GHEa$ 0JEӕ~D12J.]zdO?P1sq5Y+ ¤}S*xT_kbƏxL{h!"R0-(c?&_MG}(.1kmW֙,@# )0DDZ Dd$1JRE Ʋkg9^.;I!( MOaHe, C %"dvj7+4L>2ԢWs{&9A$d%% H'%.CZ ]\ U"5S@*$EB *r#@BPYP!KE0I{`X![WHҹYr%* Cp < #"z͋7L0|@7" TF bdA??]-^?UDyJu k "DTЊ I%Q.ZsNJ q@f`Lz3 31 FIL` x<$@(*& V>'UAfw _|.ԺMk?k]g܏~OYiUsUǜU,]P^ސ5+C9ddZVkh,ѝ]X: @ Uƭlg4CT(vľfcuD؃&/6?ϒ1O[\8ڿOr:L\dr٢QO51T 3nݽ1b8UFB<0ԑJp5*ݳ{SóR L0S#G`!dqi ׹h!S jDETv;ߚHܧ'§Ol 8d3Vc"I)_YΚ! * |ѭR5ppBIDY$dKDD.Hn$L9y%=&F ?G0P}pFjJLL[: )D!Ll3MsWh Jʧ_9 GHR)x 9+ &s{3ks76S>PX,"x 6Bb Tld\\O#V1T0;zK scxt;Nnۯ7"fE Of]?#2\ 4@'={!6u onO^7<8H1c%`ץ!ۢ-uKP7P.o`~}ewP8_iDk[]ǧC`U?l* V("A8 i1 #fY)N1U)?T56} Yr%}G'MGGYMUSNH|9#.- S ͬ(gWerbJV{Rf ̍]B`)P,FnJT\3U"!̛ca^dL+Ve?$RrD́8Ԇ!Xy=O2W*lytx:),CivM[6=Xh0X"X^s DR𜟹zi^WoߝD 1'~7g&b8 Ðy*f0Ռ4唵Tl>o)oaTKj vâF n*wf#hu1tK9pkN쳛0Bq<=P"s<&Sin`'s2in"咍;{VKDONp3f(1uO~E.նټQI=;p%CBEdjbӟ϶Mt2ar{:Qz`ږDj5+B]ѱ3avw 481X$;n@@9ccAmDO7o,gRNdPV'BVncu n@,1tMSfs& UD)A5u7zwNA5VLAd1K]MBNZv IDATݬCq$` cQn/$4-pHpo |`3흨 Lo'e^0NEvd/8m`C^UAD:XV$S%bH7:/$S".Cs0D 7rw5ZNyOkEQdbD"`$ !wskt$@ꆾP_YO4X뚭]R C:0Rdŗaszrt3bBLSITs8 Nq;L#oB/Q)wRb1$pGJgf}|AYfy7nkr65&bv͎KfDzSJ77u]=_!ob S&|٤c.a Lz8L cK5t؋7"c ggaq@︹4;vm j^%=+f6w&v! 1?S{ԑ-ЗT^ F/BdDow+it[,fϜ=ƚݻkC8OvUU'G'Y\sNn(as/Ԃ.myZv#fD`$X3YSJ'&g&2~{0<wATSY#wB+%l৮_:)K3}{- :UMUJ9z A]̷C:v0m!= I  s'Mm?2#=ܛOT*Fh`+Ðۤ2BS{![|&`C+WT׋q>#cSaǬwCr04i[wdTוaPc" Xvu]}6>S@ȖMǒ}7x%s"8$Dzͼ16#p0-`˫WYefLs:X]/ǡONNW"XQ U]imo;"M9]pj.""\Ũ9Wu5'rYI<;W/fHD0+!,%Iْ$45n#a*Djc09f)ew`[4MUf1S";DX@nX J@>굧{fu: ޶݊9gUsra'ղ0FQsh& ]y-jm)bO]4b4uRl}ow\S2͡L՟~`]*闎/ļlBy٬O8э߻ynPX F h<*[#'ZpLc+0u'oh"aul5ͩ:k<ج f]͉E"-Exm7MC^X7v:Y}v1bIp.@1D:'ԛR%4erg!Yf+0Z ?X,jN*e'0TRh\D/Lw:ZeScUj'il RJU%W,B4Pl6#aOv[zg߸{37HfH$}A$nrѭ['#52Uq"3&/ד;mjT$f4*)9֛OUa1^]B!!i?`I2 1|TqSq1i3 )Dcp{vv=7LYmvR72pW g][_;k١@V {aS:Xxҿ^:\D7<(fu9z>0D(s6Ǻ:K "r* :ȬjOY:4[G6 0tm- "!\ gRCȋ[]]Ϝ'@#FBb|#i?NĻn 0L c#gx U̚i]Eۮ뺃@e:T b׮Sa{B@f(b>ڶ4m:ctOzސ#TGu*[qXjɘܬqw@obe\ځ(jŒsODcBZH. ?mR$1?Yb\GΪjP 确UdWU\pqDٝKMi$Ȥ?Y3@"{J9]fl>吟PzPC5R#IfffNqDDiyc!P ,Isi䌺jmnSXC(#C͖L/mdl4b&fUZIXΥ6ͼŋWi,Lm?{ZUUqmwڸ!㳣b1lu4(<01G]BKC"fMC3mח{=1j !UAI!nZuQ @DkNЧo]6,LtRޯVσ^6BF4A-3!ל nj0լ]d 9SrA<053)(4 rx,ÝQD *Dwjjz^a apvS@N;>WY5Xf*ы`.MCJ6!G4fԻp0B\3B.$\hxl[͖6mNξQ*qGLTl}OD!v!/l.OkS<Ʈ+} =NA,Ð4[YƾyevvvO ]2b!EeH9Ѯ'ӡ~| 0Aj?=kqٺ Uf׷q<4X]ս5:?r7C>Ua^rS5 fMh-BgイĒZ`ND|$B`v X7zk'd&C瞹zimX:L31Ъ"! E!k"R*9xPW@ji2G!P!c$S2ns:=!OQ&ͻaK76\~X+W6&sTAܘ\ܭĴT <{کn˽B,.57MK9N QWyLԋMnovstaFC T\3@[ /}L2& NNmw髫;8Pj !Ql< Fe:ƪ"ٴ^0{TM'~6"lwl4t=\>t+Oݸkd*y%&GٍyƘ;>|R4 qpq@&#4 ,ǦcskcF<]_^VnwA:]kbs B}kgy2e1 # L4P(R* e 3fb.c;~ɺ-\ZL9rc*Нve1ck{^n {_d.{\\1( 3;u)|vMnOܾ<\vw{٤V`)B8Mۧ/?kWN!'~{k~c2svXɣ=J!!W/˘+"bV7gM}ߺrfG80kYN7gv6;8-RաBpd u61*W9H NI߽=_1jc,"39=yv49 g.7WW7^x͛+̱h">csLf>!1l$L57&Phf"D"TƂRTNC^6&@;u jy|`3g5gWs֤,0Ӣ\0sI, h(#BߍHJ/ B }??L(„>ȵȼ @Nzw9ހAs:x,S{V888;zI LfJn;!*XG캌qo_[,wAU64Q8Ʀ+|35*O<,;Ll#{NSO[2wgb^/}YhU\,|uD=[ 6_|c%gf}9fO6˚BUP mܠ88_l<p^J~m7i1Gr(21yqMڛ3as׬ɱ63U#GU8[6O͛h{$3&33\4U+B5}yĊPG6{fI/ N*¿Cqly<:ڳҺT]>aD}*M! -ٿ/5"zWW~WK.pvv/AXZQ& "rKkD@"+x"An`d԰Rр3:<.X&sNLUuR& %)R8c>I;OK}&gv3.pbBs+G] w+)|4QbB0HeK#)c3SelO^&+XNQQ@1 .m V3暓W16MӻXqFVKe#j|ޝ7Sq<:[/1UV M`c{fqĔ~W8% N, UYnWڭd̚ŢbkMsJY10Ä́í=^| _/}KW<g>/׿7o+gggG?ɟI۶1'7v/| 9O}S72mMÐsVсvsׇ4kOo_/Z9׷~9.XkW0vK8<EEj5;9!ȼVslcL(Py vPj%ӷwb0 *H5'f b2:iBgRD,y|}KRWzwvi[w6pCJVD7 yë1M2%OC~U7:_k|sszեGe3MYpko׈˿,񺮻zիW?m893ٟ7x__^xᅿ`O;]M;5/Qpl`9 )g阣 8eRa`Y26m[}<)*i~YH{}C>psd~Д}Hj˹ f; 5hH)X-=­m7oݾwn\lg-t}C}6_W^ydCЭ[>OSO=4Wl"訤*ϮVO|??9Us˸Ann3Z5v)HEs{3=Bnj2w5BܞE5@DtzPڀmYgN$hf?Ga y^LlnsD(VaZ܋!5Eܢ5TT\!fefoi$L( Qe֠)DT*q1t:jHfSRx8 nɪXl]kWNaEهR)晕1.(2d:j$Xs}};8\M\o߾)B>2 {dL~De$#&C^RxĶʈ[b3Iլkwf&/T tƍӓa,#X8r#C(~k^z饏}cg6>ܸq˽OO?}C//~K_zwݳ>;ϙ=y_uu?>>b忯 w+C! sv96+ _|`5/C*5[`42ޙO IDATVBk^ yٕeT#|;YiGᕰ=WQH$t "SN80% FIaS |/.}Lu9 M VUۮ_͛21)J0#W"!ps!I)G*._}?{W)i7A]ЍBeW2s8XJI@\$(oxw3o/\RT뇇0RCfa٠J6uy,g<8xFf݅1]Ws3c~(s I :BUXaNFbH)OD(D`J]q dUzD2 RJKs}|W_e/>Uw饗ʞϛ>/~mگrMwU4$7.Yۃ={&0KsUC8sr`9z{`}xFD q'w #̜Y MlkS@lMO:ۭ鼮`8%Eq Y+.H5MoDxʅXjd,@,["g/x^r泬6(a3fT7NYA>a/oOnWo^4iYȵ]n(\tgb#>m(j"rZa;9=TUٲ9B@<\/]O}!GO4TW9U՗-rγ2X->hZ)𬖍T$XuY5&4C=k_J4jHm !y{y}{?྿Y>L6/7ww2*륎k%0ܴyXYUNtG!o%\a4d@bfހP0a˧9H)[v]AN;y`0 A Čy-iIDMKɠfUyZwwg9' Q4gב_P>͝Հ!½̧k$HjUZ%b8u)Ī2uE澡gݻyHm{ b6zp2{A523aPfc[w:sK?Զݝ^sN{_h]o_[Rs k\kljYl7O˘bvn}Zzqa(g2j7 <܄xL&MC*VMmdHGicr ѻʦN1;"13E_p8 !i4/[ QU#, 1;' قqJx0{fdɶ|r>;̼K>haX =<">G 1Lt3P$nUɡ)RQb&2n:3d"5W"l",Բ8*]@:-Yun48Gw9[Aȳc_V 7qv",$jD؜,/L37g{Nnv؝YMDv0Sux rwc~vncx%C5L.il>,[)@NL e5w2!Z <tfo뇜ԺdǤ>{£z_^Y =^oOqG.Lx05Ϝn?݅W \ jQ(-M|W!!_okz=x'Al2Apз)%?wK'Rer80){ggV˧aD>P 7WX,s櫢<1܉m3 AG$ |ўvㅞyWN;zswOvAk[4Q~G/_YsVc?;B }?}g*8E?OĘGmO;o>Á9wl*n'Ѕ*yz`/ۓr^OZK (qȥ$f@:j11`U1fU"1X8(Nѩ2'”] &;Sa*hxя.p%fmch.v]lauj׬/EzO~HӘ=NwަKbط[[M[[[ewQtH}SҊMRݫeC@^iW4y 5`T 3 :b@L0Q\Oyȑ&ҧ-Qab} ,puDrwb_ͽŶzzOE()Nq|# Wx~b}#_/ه|M=eKa8!nw2PD0ݽHHVg6rY8LNE.22;Yv0%8$3cԟ@d@ElQip.,AuMJBb\DL* {Oў\TB3kCz5%rY̗d" rW2("iuz$#8< %e!1'99>q9bra+xؕ}a/f #س P}ڻ'0c e,( )0AD9FLg!#)c)`wKQ (iV`%Pd6%"R528[sNr@ 1+9tۻC6"yO~NV?@y qW`?LaQ?n69w`Y{|ۿ۳٬A]۶!a/l6,cfvvvV Z8o^,wwy|Q:fC2:n}e_O?1yy7l ߝ7.|wHmw;kG_6[nxԍ1~wi?O|haȭ. P^baQ34ߵ]kk}{׾"|?ӦirJnKD}{k[=qη7o,.Vo/Gj/aJ* ǶmKDt޽ŏ}7sggg??o޼y/0|KsA[G?Z1i/gYu]37|ooSJ/>_yf13t}s>>>`f.u]y/֔T1Ff?{odq {Df^)QьEr욑26zdOIzу 4;Jw A F7z>TU1dqyr%jnٳ(\/ˋ/ n޼[o]tioo֭[D={Vev*E1{rs,_J^7mV5?_|~<_rG?wG_?Ǐ~looZ?O^*I&I_:MNz\+MP>\|www}}=z>ʲ7M;,{ie=pj<גCoVt[!n߾ڊ.aՌƘϟ۪뭬\vٳgVd*_޻wxkA"{Fic<_YYl8v${Vtd2w^竫ZW\QYüBa]@l#>,>>wXQOdr vҥK~ggG766`:޻wG?9ӟTG oV7^7n߾{@ML˗/WVS42ߟ$vε]":>>y?fٝ;wL;w|'0wvv[[[[>[nmooO&˗/߼y>޾pl^k"o~ᇭVׯ_OÇeYz666ykkK+gccO?7nlnn2]]]Pŋꪂȅ $uVF_YU[]];֡=|pmmMy»Xk777{'|BDoh4z۷>}{}/ffj}לs?üV\zzʲtΩrW ~{Zk]Jzիjt:=::t:{{{nƍ,m~ڵkq VGCj9+ n8mllT"D2t޽%t˗Ed2zҥf3+3[o>V`ZYY)͛^… zccV`}!dYDFacs׮]SSNÂ0-H<]AFF~Vys͟Ϳ'6sS-l~$Y__Bt|PݮVYդewvvWMrV{V~A{-&[| mmmV@'9IblիM**:"9~;w={97A{{{ӎeu3 t:՘4;ZJluIl  BfSi{_=_iirWcxUhѣ,G}dywO5V""V_6H/u&_VTɿv{)KyRjX,t:O>]__װlVl6v]SDyk*KHDd0&I$Fp8P;wt:'׉ eז3߾}{޽{jv"*eC7xc<k&"&IojR^,qm)HΚeƘM L8}⼊Gm)|i26[ K\[RjYY$yA$хu| ^Szo*'cOvK\"t]ǽ^/(677,,4EQL&\۝L&+++Dg,4*/Iv{!<ϧޞ1 N㽟fڲ'IQ{{{IdY6ZsլJt:88jO[[[+b:}pvיNV5N5"L Bt~9q/GGG,z5)"Yi{^YY[[[Z-Zg=b~cDD:FeYZMd2!"nBDGGG:Ydbꆳloooggg(,?{^qiz^Hsh%lv||tsh4:Мv:`{$ZZfF{kVǣHgj<̬ Nvvvvwws:g~oo^d2Az0\|y4T<A)"˲ uO+#MMtmW}{#MpvfxS93+/^8theƨJ^sh~i׫ޫJMӴAMz,o2ņ34M5j)/HU-)D(nk9Yf3-vVMD<~bheeEz5y>K ":<<,R0ΎƔLgwwf:ΟuL ηWHl6f"i.\Y!j)k*(AѼ'Ot:=݊@퉈..xggGQ[)*3'IsM}<5>ysSW%+EDx4MWVV%k7`P˗u!.U2t"28/yt:g/.2g Mj48Tlsœ'|rL\pW2/-~i@pb&rZyiwd0/ G_\yl|괗y)7G] 6+~Wsk ux߳-qEUդV "SnQzJf<jDŧZ _2\H|uN_kmZ\KjZ1.Kɲ,˲h*mZm[&UNon, YDDٯ@{W/55My>RA,&K\[Rm}EW i,:[i M_M^g'/q휅z{jL=:nj_Hօtf}nݺ{cD%Wnx/޳$Dy'(i19DaS.bK &fr:Bq`chw9ĵsDݻwO7~_oܽ{W=}g}vyno޼~_T߼{wW8/'DAAĒ JΝ Ϲq}18fY@`\[SN ݰ oeY8{kH\PUïxĿݒ$IYet: F $,"B@N Y ,LLJ嬔I)EKga`V>$( >!s*J|RPEYK\;g[m"eY:/w_|LB&IJ8~e>`("yj@FHtRbyM^SEM"x @MA%(9fn8Y9-tφ:Y. IDAT~hjp'r-TY$o=_S|%$Y e^ 3mM 00~&F?&'ůʀq*TLֹ,^Vv"" X XNK˜i3,GŤ``HXht!'gX8!rֹg}% "6a;VW:ǣ<XLsY f\&1BS Ry!UXtȆ?RHPsF+|Trےy" ݓxgT ""`P*D=5K!,CzPwVN%ݔF؂Mp0' `M 9Z@-H j' Y%my-EDDPŠ5 m>Ti<滥M 0f T†,GZ&SHFҼ_l@XC%}=ċ' ϭE@dtD NHs\ sKh$0 uAGUd16@T_Cuxݳ)jb6 5d穔31$T {$00b!B2Cc"QH 3y!b")CŲXKlG GFQeRs_+.qXCl,]]fe7?H)F]  ypR*ZDjB8 yaxbI@Er1;; xQ&aGd|^b0nUn6g eX`6n,s00"# <C`enW;P)\q~9YtpWR\O~~49Kpb$V J^wb ;13.'9EZiiA;v?{uaŋm)vU\hX g9Pù+B8w ¿"':`PNw1djG 0:@KEƧ!FyjOx]C8M& 0 TwqT ˂ y:(| lXrJudp[ψA3SR*=RHX wngh|¸ xʜKMR^iq v{ǻo\C,V ˄ A ɠ 9B Ođ Z$K:ɄIPPH̊|<%d5z2] ͪѭ0&M\ߚ(Γ<Ś1z T(`6=b 0Сn\mQ/kPBZ Ri (@37jefm̭!3`5;SKceHA3PxlPM( w^n:~/I2"  ZF@0ۃq'HT8!DD"gߦRV@=YFBY9 /.x4tR4 2"8xf2 ΐ C"`бaFD2D80TG6. ō@byhWTK+$aFc؉#* KQC@BEHvhzd-[(5j k K@|ff_$a92UD,$rΖ.*7,폊gφtR1( ]<|7mB W/f >"X/D f&2+[߅ U]Bda_In<-;i&X"!( EȋZ./쑄sr-E{%]Çyj3FeY=bƨ:e @=v^D8#̭!/T3R!Y(,nv B"J}-u_Rvr4vZg: Npy p03f$0otpoOg+ LxG( Єn!֔).ּ'q cǍ<+&9UϯbuJCMD"Qke>s&Hj8 `h EM/i:hf!.]WJBѫF]xDfV"!C*4wG :fb$s3׻0_N A^zY`c8;WtZD\T E~A^d1ƫu*e[OKkӑ0"}Aݜ4tsqVun[!VT Xиon͛cQ+j:@JZxYVMMrޜñȡR 2TS;Fb|O! $U:i<%@m/(͋ksN"ܡl>ژ9eP}cK$mY$Pٔ r,qE W.],/NK,Ɉ5we.8F9>% YpoBeM4"e uF j xReb :U\=IvDմpdsOjm+s7`FŗFN`Iթ^[G5P"nkKa4Hq*W+ս~9S]^DZ&/J-h-g!.GE ݣNZ,I-mvi;BlmxREZEL'=?>z( $"(T[Q; 4<_ K\;gt[q&14.19IDg]H&l:d JB X9ا q`l$#@Ȥ `(8F&RO9582YATM5Lf^"rNlNeW8 ň%~ D{\QT/KPG'2ʬ(vȿ+5Yr*/V Rt hJBC fdRQ"dꯏ"nt|4$1<0v#($/{cL=tdd' 0o $sOhA5 \?34Ѵ3)g~a"$ s.giM [N}x-+`-甙%DbU$7̩5j7V&U}Ojsn yR"[.j4ԗXqW\ -\pimGĊ`}tue2ZVb1d/Sײl}D%Ӂ5?tJil^P' YἿϋYPrA3jIC`&`D_Xc$bh B ^EE=Ru{ jXxV1'ZwCzY<8umPfE6] 6kUΪ"VUFLE&vwPĠɺ`$ Z1Jtmֳ) 7K$|Y@lEH /p}w-@Yb2JHIRUO1HRXÁW+!D΋a`}QM5I VL3O%Z?l¡X[CQ3ŹYΥ3IvڦcSf20+}ڝxvr8ɓZ3@Y`P,/۪s#ϱ&DUCƯ5 |f)Ѡ+۳VU" U%n)u16sDB vHd`= gfU8u$"26{;U:kqΜ+!hAśNNx  :R<B"JzvL  G.C*@R2qJ1ai, N&5ķ"HRO *BVo~utI  ^^WnFqlaDD( ӪYɟ0yṘߨ Ekiz!΢'@Ţ_9Kކ5ek/dh<^te36hn% BB'iH:a5# D& 9xϨ2Q\gdOHU^ц?u= ۙ4=kox2N&,DI u9uu8)8X J @.d )X+` eIj!!te)HTΦ-M 41Yb My4K GKiQi*2Q`v -fw=I oN@G+WĤrky*SZ.1sG"ER錯Oʂ[-a`@PQ@=u;PҎIV K"@A LN"=T=HEQd1]+M\+|2YZ"wyYWzE^ RLڶ8{8XSe7ѕvnĐ$xtˆ7פzFN'=hM VM 'F#ae IDAT'VQzT>Jt9*"A] A'擼&$k@$ɒrV"JLbYnd:zngӜ=["S%cn% ̥+)YB/fL'SD1l`(3}i4%׍6Y!%M;%B.0(dTBf_]CmU$PUk ADz]Ww4i$!^t28&ޭ˗{" AtW_H<E30"!Zd.P#<@[HH%W@ZM[c> 8/vF.e=-,~;\lY=WF!a&f%}}A  B@ ! @fpF:Bh"D8uAH!D1+ɰH;sv1eHB`dvf-ҳ@$8Z k,LsP{$$"ֈ80tי:ZBQOGŗ`Q,(ȎZ?qمO/,PíԮY|f֔B ,5 C k P^|3G:]W[l+K<Ųĵ>Ƴ#_޻sJ{l<3Ib0!l Z4d"5v[˃2Hi>OswBF /W V/+GhP0 cK+̪9a%Iw!m5$ %{S˝~0v"B$2tIY Ɋ`PC48<5e$(p:,DއX$К"/PA&Iޗ0kX2qsG#(=_|MІ!ڐzn@q{Cz$ID9@,*9$R\ @KlK8vo?y&h:*ciTZ"p.酲ĵnJKi3\cI;揸=yE1dz?e?"95pcmbw\>Kdp<$ )BAQ8%06@\L2-(9.~xƉ0x'J:}6ڊ" H@d! S+LȈ;-8iN$,mL .ά&΃a;k{Pr5}J^:[cY%f.R1 fVX$Baa  5otBU,~:]Ps-Ueh= v_6oKO~3;c)(ypYpٓݹzヒe:MC%LC!h"%ek/A>\[I컉5D`%I*u3#bA:mpbH& Nv6A 'S~f\;uBM%x! 0#XcD Iq@ f)<"SeG@9ʡVJ?$)ԈXrۺoҹD~ JiBֳyU *٨x^K{CvMCkeD}L' "!Rt̒CJX5{&jtLjΏNIy+jx!M,(,,DD<I İ vjv,<P D I 1{أs1K(U jM/.gi5ʜSYDIUea2QiwD.d"c]Cl)W4 zStҴI.P5!CDA!5lVB&A"a <~" Ze'OE4_=%ᴲfALf~xk(ij Vx59$$CUSb:dm,!adcyl"@h1d@Lt%AJ߸"E@v1:5Öxm:Kt!`zcH f+xaqpraX_'o^gktMP3ZwU%_Zv(Fg%E&wmk>ZUO(HM 4wa Cp7fT6дkZ6.:E&-qEp0q)x/ dKd,(Ea5Z ѐ!C, ', &D؃G` WNQa,mozgrT@=Ѥ YJ@iQ^v9%}D (TEQIn3ΕE9gdaO ` 2 1h 2C$¸@) І  F2aUZ"@$@P͵U&KV0 c ` D0M(CRPNljx?0 >%UtnZiֶFGlo1SAsU7B`+Wd7R PP <%qk.V;|V(JL*vWUWշTz[pd[dbU #''qk֏,`o,(a!С]#k7N"bzCBjժ7(TA%)(!\i^4LP, 1jՇ!(F_ZA>U?};?qݳ=\bqx*^z };?~qS‘f I-bTQ RS)*} F43WQ<=B.0&12)g:qlcٶeQL(!E'(aL8a;49Bs9BH&[ԏAO4b@%9WC~ځGZS0RWwou@;t0ƌ~$'-n^.4M4@,0 j5UU5M+˯h# ~k6vB 0M qݮVgj۽ n!_|0ǏAF388XѐeYųp'&&*ݻwm~,˓v۶rBc˲ TeB&eYFBaeeJ&Itss޽{{{{D"NXu cBkkk6Vh4nX B`qzgٯjUEQCPu}yyL& MOOl7вEښ(B9UU ! tZu˲&''4paaX,ýK@vГn㨪Z* 4-uM|8&ضr((yy׻w̝2o=9GA>3MwDQf$ /eYi @)MRf &qܹ8N&iO#+B1+Y\\\ZZT*SSSW+ )'cpAx&I$xRJm4+++m/..Jj(V+ϋhvә]YYic=-*Ãu(-rm۶L&gggz>111ۓ$ɶmABr]A8<<$1fz]J455D&'' !f!tz~eP3`x쨪zVgڶ],@s ژBiϋƆ Bannn2jڹ16778SA圃T2+ljbZ͓|~qqRz,p}.wi"l/iCˁ1bx14mvW3cssspUU!$LfUIܹCEQa"p1v!0~k-"5MV0rEzQι(t:ͮ#!:tN.FuJf;ɲ >q$IZZZZ__,--3BOӈEIFCPVaǧ|uu^D"RYHd`(xZEX_DQJB(JJ%]a r5;YS!4RNMӼsh`IeR)GQA@}e9_m7ba3p0 (ؒ`9 rq$i6rynn.b,+ LOOooozD"IPj^1SPu3ЖNR#ϷH$L&bݞ4-JI9OR;;;n7wb10|& pV EbH$a:Ò$ERt4!;:/pqyA7<厙p8_t JRV B,jf}﫯fz^GQ䇜'\/Jz$(nab2!4777=ztjcX,NOOV c0k?QM8//|cf\ry1I[4j:trrrggÇpO<]plx#˲J s h4z2.7kc&?D" `M$渆alllTn+= cZf2 rm5;$Hѭ$D">WR"O= k}1prj{r-"tFXݻ1x c|f`9[T`ဎ=2C5R\Xk3Ba~~ޯ{By4 ÈbWHHU\ussgM*J&iB |7?ӛ Ȉ?!\QC`kZ.D"B<`UUV*FPUUaJzZ5  嗰{Rr !dkk+mnnwtd[i4R RxheYVjiVV!0Ǝ<{ >_mcnX,G>cݮ8SSS|&ܝiܾi\z!3u]u= 0^(V"%k,vRIQrH$(<\m#stpPJݻ+IRi6(BaF/L$;;;m7 ەJøj4Fh4^xJ^|)ΣG{ :QEQn2 BtIfffFwr퍆1~/IDATn ÙLil6!&c nX,L,CJtk\ݼ1wz^*5333j5JUU,˙Ln[eL&#H*i&p8ŪժiZpEnwGn\C'ko.055f:VT@~A%>`չO>}ӧOXK㷿ȿw}w\ 8@_w}ѓ'OEw.~Q?#G}$[o5Z]Hdq'\v/˸+rIlR8XTR7@hVVV~ӟ>}?!i՟~O?t,4po4jwO~?{P(Fl~'Of9ފ]BH&я~ !1 \T?"?믷?qWg?{<~_lF3F@@@@@@@@@@@@@@@@@@@@@@@@@J9Ė>IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot14.png0000644000175000017500000041767714620351225030433 0ustar00hanshansPNG  IHDR6OsBIT|d IDATxy]G}խVKɖdHXcm<;@}\ r!d{WnLn.C fq0lIq,YBww7Bpwrm=g |߿n ۶T*|g f /]zQ1::J?JPذa[n%6mu]$w q򖷼˗ST}t:>vŭʏg]}+V|h}{}(x[ʖ-[j]veضMl۶ {yq hkkCk͓O>l RJž={Xv-Jd.RJRqLEDQD'u{xͮ7255O<xBBBB W_M.?)mmm3P.K+%7t}}}A0_ZkL=yB8n``}Cٳyiիg?˗e?8q3>>>OnJիWsW;Qa,C)jR}k իiii!y 7g>CTⓟ$k֬0I.C|zh^z'A;.BnRgxǏ~#ynvV^\}!sNFGGٶml+VpGZ]0.x<ʕ+gg(,[d2>Op]w{nz(Jhioo'~>uR3WJ?y/7M!lK|`.m˹K, ۶gOHHHHHx!뮻8se||s9m۶SO͆ԧ>_L ƣ&_΅^Rj=xtM!شis{.\s Geҥ[ OO}Sر.h^z'ٸq#z .qN + 4riqm۔J%30gF\n6o_r1],ٲe ZyzpUW-B*hW8;HӤR)R{.]whoogddd^z'p0x[UW]5R[ou33>zW5%c۶m? PBBBBB ;;u~C"ERJ 0 RlyGTbŊJ%rG?(7t=> 'wWUޱcs]t7|3?+]s5\|ų,}o3<+իGJIEr̵T*N=,uQ*( Tn^5RJv xBBBBBB‹skI/'Ö̴L'✐c!cZ>`pKOHHHHHHxq1c`Ӧx'$$$$$X9F2Q/$$$$$$I/"#!eoFpYBBBBB).GowDbϑ;(+Jo *G}"߃f:gb*N!Y:gf "ZB_b˄bK ~B chiYW׼ovw/bZVT ԹoG?鉸Ƞ\ }C0t܅t ֈiC ا @v#~/MN z΂3[}=~=0h~YNX^xsj5 /u?;0s-o@q+y0}d~Ѓ߻Ttv=E;S#Yp۾}nRvsۦ wpRBu Ʀ.!p·`%*ci[sYa=X4E=YUp(Kς >đ@yJ?˶7ݸ8t;4 /"Ɵ zP4??Rhl|a8#ɢ:xۼȮonMQO,󄄄G|+1j`: pu[Ywo"\3w#?Z]?{ Y\Hjf,~/Cϫ.'aDS ON$P77CЀ_K^ xWkл*KMоG{|~v]" gn:>;G8ֽߊ(C蟙*[.V]F!fy'|u|,~ V[_Z?mXX_\vXNxW//?v=Bp\_ :.$F^qf.th>Ǿ! ӂ\<L@X~6w>x),YOMY'!  zP5p)"r~cw~ 1u5q1"8t/b|Mݽ*EGC7;-gP8[Ԡxvw0ǹ3xWয়37\4pA?eW7߇<o| xs3_CqNr>|>Q hȸÐC Tss(Ye=մ2Ǘ%0[N=BߝJ_̼G ߜDtcWO-IDuNBo;ib HfWxxY,#$)/t‹t$$X`j}z%ktӽ>AAǸ{qI*JE(R(1 gJ򢋸馛Hm7C>_X8>񖷼믿Dܲ,oL&9L8S:+hvc?NKgZw}i%rW Bh4կ~8JXTV03CAR;\\%,&^zRJ&'';)W ɻn8}?iۙ$r *c16@}8ZPwvYa\X nǮs➛v<@65l`A<TJ(.Qq4ȌE"yu5\|8,|ܣ S6gHx8Ӳ5Մ,}sı|4I}q<+kTR9' Us~Z`L>期9f18s?  @s ΦuC] V]Ĭʰ|ZA-LDn)ގp#]m\C=rq Q2ld/sY8 ]tZl>g-[MFt&˾#U~t ʂL("BX)3aHJiLCb)S'~ "Q86-xn؀% U˗g(O4 \|a?[p@Э!C#SC3G9+ RH#B!#C,)0:Q#2XEٮc2ɤh-JzmN,+A5f%cHWY=0K|r/ mP86->eIOc2<H,h\!Xѿ+LT D^v8oFG}Oٶ ad(vE>R*)HSٱS5Z 5CĨoY'^B}bK4u|*&+2˖Skt$]¿=1RTMG5 Bq}e CFY ڲ3T,1rYetv-Gq ­n Ѡ!3Z M!NјH9) r KZdR=:L1(Ul?ʡ)6#uns| +/?ǏCvP&(S|~04-"_]'m#R)TJ)T&MpY׃r_=: TJSЍ!Ҷ)Ҙ1L !>mPG4fX^ 9c1f7L$@4Rj6Q } 9uӑi}̿o%H1yMpfI޽I4"1?)Y3]I9g.`hG4/f %=}g@3YQėJQ Bun/.G#"4܀RFRgj*h2#U*RɱUjL>-}E6 ]Lqxx_`[?C>?f tlE9*UmdRaCwq'tdrTV\T)㹓ll7e݊6FSj"6(+f54 P86|v};ѷZCcbs bطBKg-% Oy986{0GGL M+U8RNEtd~| S^m-@$@)J#ܿ}?GbI6t"aClذ0 ($*1- !!KPL=D!DdhB2,N,28tt2й}b꣭lHI& F|}`7?w>p2j#eL4q,p$e`*I[>OkC +Li NF]Ͼh b$ #v;Ba283:V!(2APo44b&*!L!,;GJZ$Fst|òF / n8~ BGD@r:槹/ű:{1?)1RՈc m"ytʃ8g,B,ǛǷf\m=q  ~,B9HΔL+t^3qF՜M?.3lK*8̆:V&7v[>9 Xqp ;51ʵ2&jH+%CضM)|'Y$c0X&^Wo|bЮѻ!BiNŁWamFH}$hDzmӠ5ԋ-F% VHtg# ^/?}0Ҵ3QDr}t5 "Nm\ؾ4=}D%ӕ~U2l31Wq%;yjo}acU_^ZX%V$#>a,Xiz՝揰 IDAT] M`Ms/  dZ6@,AJIP:BV}ɡ&:NV,'NYD~&RxQcXӢx8yшqd öLrvX޿ےE*C8pZ:H;uJB7-M<+_}9՝1ʻ_w[6߻Q4ȃC`Xi(򱤉m($ dYA(ќaJx1)iR(;dxlUQz{ɶ\v=mu<niܘJC m)Lib:Ps[ҬTԴ&^Y=":Ab6Ә_ftxv/TH RXE̴x*F A,y4#-I-RyAK1CAfЎmK[j.^CRSOfcl ~k?Ǫugqpr|ۼq^86xIt1g2X+9+&%d-=qkX Eja9 j#WҵD02:FڂZ5dnrEB[?Vn0=zbF#T 3Wl GxbFd0vv$=+;~!{N1T]cO\vqcC>`:492`GSH!&cS_a.&SF<ps1#SuDJ X"Q,be,| +[قsD-x1 V CONꍀdSi^}Ui1u՟[A~a~# nƴ vdX5a胈eSd3i ilpNWZ!sDFcRD"Gشv)j`[lZvk P9L2E2! ћLLN" ׋pGGXabq-㪴$;Bǟx9ino<׌?}ܦcmStYgoٝg?#5OKfypi ֚L:mrEjrZͥ<5=jW+Xfӥidi܆ztvuނC(2m|? Zr((B!%e:h-`‘&I.~7[uŅ^4$exp <ǐ&t 1 Qhbc KI;)D,HZU,AO;!)5nJhR9Qke[QXHLB#ylƅ$FJItuvE'j)?rPQRQXiV}"c"* Xb-0m]!k69=p,Bi ?pu/Ŷjq$%p啬]M_dEOc.m# wV8BZ'_ Xl)}\7V0SUBl:O/28Qbҷl 'ގ&`^hx!=}],>HYؖi84}}K/m3plP~a.|ZMO)&0ЄxxQjndCu ])01yv;4؆%Zqqx`n']4B#{5m=M"~rmw݇:9̫V$tZXm62 bE*c Z E9{5_M4Nig2cb9):&%AWwܳ^*FLJ+RL*J18JJ %YK#k(MKBt3ǩ1tSqgvɴ"mC%6mXA´8C hI9iVZYV=ؤYT!e(۠27Z3]Escs!2Da7]% ZzI8=d:bTJ!ݫh_;ѽZx0{&"^~2mж&ӑd!#Mt53i 7A1Aײ~1u}=<0]mS bjD6)[e0s-cR4~Ã!l-JHݴ M##F@6J7]JE͕H#61m 64J>AGu2&ٴ PU^L-C|/Dc7$a# zkHla*JkE%P. ]@z)՚#u@2Q+|K\֭DGBK URVҧ_W 6aeSY46y>MW!W#M&퀊,Oq\l(R(@0ql'"I a[&}** kS(PHcI5lbS24Q %V726.mg3CX>QA a fUW)2+B Dl`zd:TgvNd &*+;H,F +͗S*GbaV `!n%nqD`O?{QJg-m:=O_ όQ0LYe" hE5߫ Rh(&@Y)a$w(8`-S>]l;o;0u2^$H084i YQ$#pCrH[pxx(2QK}` dwUgo{޾b>c۔رV |,ˢޜ* Duu˖QȤ bP;hW]z6~;huw\Ids1mxX6|'̓,9nozfgA$EQd1*rd9)٦"%U\D+XiK%.6 HFl3 ~9㾁U9o_۾ː8 0 %͇X%pJehr A 0(+aV ,pZ`cIŹ ts걿bSR.b}gF!YѬ7Rc]\u*Wz#Dy1(d4IrS쐬xӥBIMs|()E-zG[mA();.ZsP בQ졳,)X?KAzማ>x9:{CVGJgv$gQhr!8DbAdA3>a ֠/k)FĘN!(VF[LZb F<`pb<ެUY J%3p}EjqW.{D2ݚƒS&CʮRq+93O, +T>dP ԌJRYe{W/~h4|g$7C=Vf[{tcV]˸&Lr(gtC) '4o]Ikn8'V)Z@0d~Jܪ`fEZeڭPq%F@R$9U=x&p]^}fvw]k 66ߡє|ɢLZ̓(Ey/p0wX6UxDN+p*O!%B[ ֶ f'&Bi~sAڡ^Q!˳Mˀ~j(9o]{j_3K:| mYi㚜暜Lz*IܤYBJc-رt[QP[-&b!28:xA0[M21'O48y)0 \afJŗ&29v1[gw0Kopua21t8#nMtYRjg|,8(54;vwߋ_C@Xt"a4ԃ8dQ!s=n\_xT8\ÿ??p*l87ŗ{[ؒv6ĝ/eP9ma4L"q@rs,C`%ª>>#;R)"Vht]ɲ;1/ 9/vܦ6!yɄCV}ģ^1Ðnac~>OT ȹ^h?qu3?}W^}51ltE]ʞC~7K=h k{SjǞHw2cfyb>mv}CTepF{sw5T.#c{]&j FL4Ӭol_K5+tCgZܼ'߅0"K$O%ǎ7qCjX 9ѳ\hiVR=F}ATg~1ه9Õk[N8\^fk{) Pwaajpk8 yKkr䄴f*Lϵ4* 0i(UX5I$PVgrvi}޹WqYMWxWOoxU^?s=Ud.z͇pk օDs}v x_\itRɋO6ղ$t88W8ͭ]l\Cd |68L0YAP z}iRSg^'/!_(Qw P˨17b%^NY8QNIec+)(QE%MBRkG+堍bllROY^pHցc K쳷azʼn bR6) & {,w$;a\Z}|[|ɋ M7*Gu=+-O},(J?xyz|^wwy71nU*w^`d>#lJhV;%q&j1Wo3Lt{;Y7}dU'\(dn2gA +[]xYeO)7\QЋ50x촇,YZ62޺̯ܣ|\JI@"T*VEzwJ9&/aQNy8=loLlmХ ^Z3x,J w mR{ȫs稷O=;QYhU9|\ev%_5~0:V<lfunM )lX&8#OSXEH?I?Μ3(CN!=,3x^EdΑ&N4k.~Ǎ 7Ĥ%6MFh mr9z9o*x+Bp*@n~5'WG 17Y"u%%Wq,D+^aHgDf o\k|ŭ=6W:m,*"3EJUTB 7yZ2_ۿ'o._ygko|Vǧo>kv]$/t"L8jFx@MC^">j6C{}{:˗7` Fe$J@m4* ~ɐgzu\n^x(f{gOҜlo9򌋧Xr|^K7d20WR,6,Ofyy#F%}ROfEXv};@ Seغ1bp=趥{$qqѣ ap#tB2[$!_g.2>;_/"԰Yg6H+ıa$aD)|#4{=ΡEpd8hjHPJ%RJ6%n>+'X]y,i5\>yRN@Q-+[ƙ9,$;:%Vp2OٌSfNT̞ bp8 {18s 3q]wcӜ???繱ʍuyL3L'i"I?f H򈙩I\^LL󔧞y^.QDVo1BqyFi)Y>QH0X"B ƀke<6\(ޏKpsQKlHiX\\w,Ʊ&G!Mz`^?\<_I/52騂-hObe!)Z e\TȐ]\Yu j5@۴@KCQ0B4#ђ0߱2'Il,)[iy_yM>FŊ>yE~#咳Aܖc_!+MkœQÊ51!!A+TV8nb-ƺEo.S.FHa ;=!dҪ%d q˲7/^t-fw;ۊz(4eZd]$ G9=${@ o+nlrĄqNVtlO} cnmouS!;Tڝǁrťߏ s(O)/y2C8{9={Z{5!+Y];BjNq{,LJQ?F[iҍ2W*8h s t>WMBDxq툣%3f5[6TRDN/-qCVY^^FBń"^z'>b=䕫7wTQiYXz&!GC2㰼DTehF0]Yq]+4$B`3L ’}v׷0B#q]qP*(X,FgQDZX 6(!"!m4@`eF8,i!P1S5--@;YURiZT%09I):˰VJR sZj£ dnF{{(7hNNӬ͐I$( \ySuz9ˇ$3HiQݸ#cnB; YY ץC.VVtxᇁׯwcjL{,:_ ;0nmo簾!hU q1Ls6K809=}@n'L_$fQWȱ0!?هNSɎxS _ xs\~T5fsAC>* y|KC9t⒌|@̖K̔86V~H?yyz,_o醜>YF?+\ڸTȍF"\$R 1HG Z1?;a爵(y.yRE̎GާÎ qa  $/,ψ!_w"{\|ׯB^_HD iM3ﲹru\{@k'O Kd$QBœZAR敷WIcqH?>aG)y>[/|GzԦL,p" #t7't9~b qPY|;rSu\*?Ewc?yfy"^L0:Xf&kͿy+$pD8-6a9a.lGZfjne>H)s끅pDV*FHj{WmzMkff"0 h4X!i3p}%C.z<nGZu|4DO-c5g9L*qV%퐛⅊268d*浵kwwyǙUm~};Ӝ]PoaZhR5yIk! s5?\h1ynHFsKMN-rb~vFgdFVS*9亐Mmza}/ OE UVs8H k޾* R ]XCTNc:$=m9'wx:?5rpÕ[GP-0n;2= #T\WR:j8Rćp-nKǨO:Sr$3#4%RO-ɻ&liՈ:9F-\lJ&>V }z#V{-?DzuB QFq?癝=Cs&6kot<5E>2p~8q͓?89r=r,OQF " @rQK>5FW8<8 B$y H EfZ1EW^\l ژBt- ٙH9롍ϕkf{Ɂ4bvNڛ kŽ32B9_%&k1خma/⻗)%iH.,ʑ|-ӳȒ7&ז7֍5;<=<Ĥ~w0kFka8 9&wΝ9S'?~?Oר9VU~nE%PFRqD20McR0µeЕ7n^ 2e\g 4~YձdBE1 i6ACl4K b2G^5@w8{f| zb?s7z^ PTI>S-7qE5Z玅RI>p\Q-pmz.avvsx!-JAœM\LʌOɅ$g9,I6B.@193L5;L7ʐG8ҨoSX?Xx-tZ.q"zئRriSNr6&lbI/}^<ůinsn=$Ʀ:yVM 6PBʞOqv9u2ab(?}35E'Nea5MTc$brxo챲4Ej lya|lm3p <(w6ނb={f^Z@bu`-`]2<JJXB}I zT(M7's8?@((,E=qTl83kњk/"ZT8̪҅߂j<))dZ/A>(4)ј4E)(!39Ɉ5rŌAs]V`-2>aHd6ph@)ҭ.LO ujbvͲP(WbrT$SS(%92EZ5<\@Y;ɿz$n) ۘSJ(Eks꒩AZQd0O@ TVj;D#l%˼CYʒ{Q]eI˜Z͈sZB$Ks5Cc6'(aSKYZ>pqH(/,^ %lxLiy|He# #*粽K?  H1< cskqy-E" 9(biE81\aIX" IDATb=5qsu+%Slo0<̓C=^Clc!75["1@ ۘ{%;B?( Qe2^Dߥ\.Ӿo\ opmmDY{z2IR[Q>=b ?/ׯ񥧟gf"qgv(R@=Zk [!8Hւ60Ve "ӖQf p" " `A1\[ʥʸh*ie(%C!ct `v*!z`Ȇ=m)|Rz m!ÄpD$Ԃ +)ʕz^KsHteF$M-I볱M\!SIDV=bb+2;s+"#L+C9_:"uǿ(:gbu G`qH}ˑN+=9F؎j@Q-AϏ3~V։SWrEh)$YCg6q 7Guxp{N܇5Cŏ &=%wR?x=4:Q%:cǹqZcN4\Y7%r![`$*b76%4EJI$'q\\)D?uB_KB#Bes(ϒ'I2tF#/Pk4q]p}ZH!y,ad\vWoX%|UsH Y 3SD0{}[Y!bnZp3Ch^1ьT,F_9y؀ȭy_Vqa0"9Hb(!6Td,h? 3vpgFs˔!sVR;L+"+8x ?lI#ܲǔp)ĹAgFT|jeXzGX~$uN LrȠ\(x%AuV憣^tZ:Neq~ cS&b-Zkg>wj&$ND٤(%Hb<8 L2 dY%E"űI\|{=א}y.Sa >ddhaQ!@bB0"e>d,kvcrVQ8kl.q:KQcm4w`^ڒs7NE"5^Qs1 g zm"걻sP1ڃv{ ?R/10/,]ylZW@[s F\?C/\.ƎXZ۽ȳ8Ƥësv{ln}ffs|_3)H(()Z4aÇQ8orP%&o={4@>;s6j$4:IQ=Ǻ63)Γx"$H-24V:qR-m)[]e9|x "þ͐5Ʒ~wڛ|rg(=D*xȠm-h,U :/WѺȳE[R%U J %HR-nڡq\l:S * âs:TXvhz8 WPAUeh4`GSN`KZPU9e6vNȺz(QiMAdK˒/}7^C$MZܿw _)7ńt6gu30YAh!=8=|YQNB'aE1Nxv}h8diI<3H/,ʫ̞3[B4_h%v8;b{yIC֖%秿ʵklYSِػ6apen^}D 0f^G#LY2YNʦ4z͟tEE+&"y>%R-$409>|qFASzm>|µNHX< BZG'GTcXcZt=Nk␪*C VSR&)66(g9hd>IG4{]%xܶ.j 1h,ݵ%VU@+cqfLc]^gtC@e`{MW>,"xdBǯaFG>FhД>BSƔVgYVxB:y Ȑt& αcap\쐂TZ~i ^m!\dfc'FVJu s5_\|jepPWo+ˊ*Ѻ"s -6[~_ҕKRc$i|y)7|x@Q;K͐IT+k}tiI4/_g>fy2zgϮnqy8~֙mZZLHC;w8ߎ.^|mWn'fy!"1 ijfH˜ ,r=<Փg~~c>/q:#f` B("z Xb%RXS҉=z<&;G S<0O)*V;9Ra{Gʺ ek mtٓ;(O9~{RZsɈ h. /nFXmsr%B/%PB( ўJMSg9ͦ=OxvE/lZ<8:tFUU\<{^+Ə@٤QТوkd뉢 מAΞ{B0C@ HB'UaFQ̕zlNΐB"s=+yNnasr\!R\ivNؽwVG3JU RpooѐϽwOup{5N9EfVEJ\嘌 /g&_4\֥Djrt< ey<g*.k-nJVm)ht%FCs:-sfsWF"ް#QVK\tebAJ9b>=/b k z< A,=No'9.<&_>7}rm&'#zҔ+=Ȋ1e0-oRܿǙ-e*+l!u. `XKҼ`2$FzN^t;' ƫ(WI-bS>dyĢҊjpu`5 QŔ<$^]-U9T3AȒ5u)Ȳ&p3''YA1$`eel>`))&tKR!UT!YTUTufs)^k;K4Vg#x=d< ϝҹK ^?ʅ |tp ;fEZY' V 0(x um-hDX Qk搥ЗGA!в!(@z {=R?-=4Ͱ)A,h%M3G)Y(LƔ!qr{/lBn*4r܈:w!L>7ݣ > utY,dLlt6?p2 G'44s7xBOk*@iIـݠHOhH8݄ _Y䭻eiy%kFf}KQXp~He,H?IM(-YYr: d3'-`3uj#egXsurWV*)(FڜL4Xt'|?կ6i6x499b敫wXmIA{c~vb'sJ _ 9?A,r-QdĿΣ# FV.H ]jըu5^Y<'+'s³ -fD<|ˁEbZB5҈Ƨ/DAyV+.)&k!-44puŢ~jx`sgWw$QT> 77XY[g>?f!oxjMM '% qwKVELj$ǸUm⥧VXi'l[t;ٔ"Jh \ s@s f ,B14ip:'!3lQrrP7< ؤYx6_PRVC) DI05_ VBs]s 6W"tpd#K. r!ib\4HYoVp dsr|1As:23fy>ƕ`aXzc@7߼F\cr1leMױ~4gUQʢ)խ^!GUy5 ^E3P:P㶐^C#3 {~_{ 3,q5b?6aY0gk! P)6qRMbpz|64QOpa9W\AF8g#NNOƛ4?" Д!>S 3\Y^(Xe0ص)N•!B)\ēXYY Nrڂ5.Pγ{|!"qtOp!>fHk)\tN&ХAy:%H$1'jT8>dT1_{!- 3f#'G#fs~h4pIZ&+K='9H>'#f݃!͸Esp뀥6v9W,UvJ- IBdy1s }f&O8* dp0抓)N!7iLg9~Ҧ2@IrI?;'%lz A.[H’WRI p%e"- 8 ogu96+̫ck? f,yk~\YF)SJK}o{N122tPv!oܿ wp OxO8OIE&40+B*Ö玨^3O9RT$R :3!9l)ߢq%N_e5˩czqj, RkTdy덩/#5٭iiB\}&(#XئB(vEs]Q64}yM{YQr-] .~dqeF5˰"b:M,,M\y$ek{ոIYZ=5TFz%V{_VI(APt㘸ѣhW_7o*#paI fw_vlQwg&IH`>Or^?pXinw>Be8*gMY]8^P$R(ѥsk\@Cٻ~$HgB#JJ uԹ^LшYqcM?o4:RU<Ɇ3kǔ@I,BCW%F̌4M&ۤ*On#Kg(!(^~/cvȃ}:II-1a8+isg^ڠIWI|Km S͝iQ!K[!<O dwxgt0`c-…M^x1M 慦UYJBV$KҰP0e+KxOQR?K, ͲAψ6/޹GgC f83)/n)1},lZv([gҖQ[>sR'4[ehZYYs&q!<ܙ3=Et^bh|>Ǖ.<"-HE hP}a+3ڭ ޘ<˸{VI@̧};$=ӄ$N`DrgܺAR"ǖrB12g=jmhnD$9/3V/A4d:#--* )M]nswd<X-|FSiԣKI1Qk(P$b01y=e 3eՓ XVQ@]$08!e1Wq08&l$a{')'#[!ILqcnE~׿^xfU e(ƌ'yNϬ2Ϫ:ha2+x}.q:2V6W) Q("(cN8Q[DSLRңlwٽ}Wf߫K~"qE%v#rsǤn%n6(Ӓ b3K<&,u>su4<}׸7⒑2߽zHLL>Y%>x6V(FZ~9aCaAsu<BH$6tz MS z2zr{ CHA|¤A~|V'č.Uh}N1oɘ9YaQDǵ{א%t|^3K:N&Cs IH5 L®NF,` Af SZaҳbNO +lnxB#]7`(&^t#uLpdrr:CW^L9JDs.r2g_3kFF#c<8wg9Lj$))ZEZ0(-&htp'k/q5"!EhH!tю Jx4b=0[vx!r6$h&tqR>ٜt4@e!^[?O^B#Nk-ɔkhKX$T V], T,aJKt[ܻg%?yMIO^-/_ ~/5cV;ll,{?ns 6q6ENCB)iO&s C!b~gnq! 3jyFFJ+ #󿔪NCr;]=#zAaĂ\ G:U.3t>A#lw:0FTyJa9 bq\ltKLf#r]{X$ '3udO9a!H.WV.yd`Bi.raC3 M9- CU̬`^Z>iUR)ȴ`^Y(U/H Yhtբ,|-^}pL{|S}'B tINo@昪+EaBwi $ex5ar:8AG` t:8K74J =f4p@s۴)T`{̧s<kꂬɻ^s~UmXP;jXfo.T{wh4bځdF2Jyh{ф()R)cߤ3x{U&s4"/]LF#^|2'=Ie*px$Ŵ,ny9J3{n^.Z*BT .JXj5dW]9N (k 8+7 RbB}9?Ofb?BYEYŜ(IsMŤyVVP2V}8g7Z\r7p|! Zi F=6 >NL8=FV/S'3V&( / R8Ңb.I]ۺVVea'PNr֢7n31P0 IO$ U6hp. X+8tk|b% i9hF&RkҬ}_yiMp EH5u*O glpKKX3F4ܺzc8JvZܼCA F@UC-nJ8P4.<^<ϟmGPJ;e!qHYŢ)\ږJ .LBvDA%bRT/l&1/ ^|Y޾KK ~xu7?^q|6J)vw,<ƨ76 Nؽ;)a ^/ wnr;[g;<ޠ-"j (/\&Z~7ݡd<7hI3O;* lR0 X^YRˊ(QRar˸șL'~J _+q |8- [oÍ|O[5 5=nW>קomZ-kMTΙxM|U$tYy i6ڍܽshJ J86~+GgD ?a$q*8:R9N!>H2w6pcpwHPГ=6A|od2>l, wG &՛בc`"~*)(r+ M1ӖTZPZRafaP 5zɋ=~=CVOb\LuL F9Is28!n14Se9k[4?9FW>@JA%iIZr*0B[,0דCoMU$^}&G%ou^pvs/tKμ3qRB >xpʣBUiU2 EYKciU>ZLQ\0`(UG,߻аÙ,."#- $Z'_`8rugf×٬|2>a3d27XK~^;8L=E1ܸ~.;Cϴ.+ 9*?dn;^G(N$>$~=8{)" Eovx43*4v|y[UOJwFRe.Ȼwd$,ER-3'.vZH"ڐf3ZO q~"[Yq8;(yp\]|i_b0"$K?±HZۣӚt)$޾~8m1?R)QXrcnO驜b B~P+mЧ3?ƫo3wuM9R4i 2`8<˘M,7bVZdyd6e2>i6% (mWՒ QEA f̙-f474|3i]gjPU ԙ"s(;U7kkq#`]5BD~ϭ.`8j(+vSMƛo2Vx^א윖q,x=R8@p>y8"N=sa#s9#$CwA\G\NQfɴC mږGԤ2!BatE C;(Ҍ0 |zenkw~w"H?Ҏ<2#aDSCSYJ`zXL^ЎYIDɝ9`*K 1)<JjFS%P^ L1a<\h34-!J/1FSpB0hhDЋfcD^! yvUJDIrL)ݶ>K.FB%+k>wx>9ʫƢ SGMzQ~vB:)JC\ZL^8*,w$Ľyi^yͻ9{==Y`a I" d[v# Y YRX;s\=QWVV?ެrDDTTvdvVU}ߏ类zqtzwT5ey_CPkoyՉi~t귎䪗+no(P#}?{^uj7oLǎsmK)&}#kSt lƗ&` |Zl'-,p%̓9&ƀ%Zu?{D Mʉ& Dzr\OҬič6xiem`62a+(B02ZbynGq(G2EWpqC8;d6V:5c,Ɖ"ɬ֖ yeqbZu(+Ğ4i"&>jqJ2fÈ$Kin``sE3UHj,BBQD^1N@Vp%s}saO9^[R 9Tr0R6ʠ*up-1N)]H(ɵp8c 1I CgꂛvKM;N IUweLB3|Aw9^ev8~l 2pr}wMoӻv[kr0r ĝ s5e!N!c7!+f0!Fؓ?Px!eg98CnBf >a-N8m&1f f@F$Vi@g3|HHÐ٤ns|elvI 띘_{}lBLƖkd);vR &Hi9er&pOYy dNfiU*ٔ"d+J#dv8 oj1Q'4,4%j<*\jVOܸG;,B#ş/c-#_j>_m̑^%otw`iuO~_mWŸ|5r1EM t@J(X=ɌYwy兯'In1Mƴ|GVL± hVIaJ1 A^č&I^xV) ]ɌDNd $̲Y6GTEygN[ս=VV#djhSUtF WL8̽NoYgܚMX68ija uD 5|⻞$.ڥ暃Y #fHhDO(r+D% ጽ!}wOnC-m_q|H4޼=O/giNVh =ՌȲ(+հPN QۄeYzT`E9q;Lf+$AXZ^l63a{՝!NQ~k)Xoޙxd+Dv Bb(/W6W_x>_w=qW_:08DG IDAT0bn t+6QpxExkPLp|˻my X33Oɳ.k6IgBd^[;fGΝ޸@Le'ɲ92:Ku%âKUB` R ;ZB5p*67Q 66xX]mq uvlfۻ%50Tr8R/΍āfuAWiHuʃMspxG2;Īf Q贤jw.zv:NK^C Wٱ׋ՋSǗ/xe?s $B%J> 4pvX1@ q(fVZRisF:"8U}:BH+bXPJbi{;YH d>'B vA+deW((8s:-(,i3Ƅe5RV<(!VHZDTZL&ݕv:F&!d!- .F8х $$2m+њ,t`FNdDh>c'Cb sz1_>F = rͤ FiAfl18Pf%q>.ںոB= 9O48Cn#bӎ=j=?S%z23L(!vIHΜ9S_ 8jQb%0xK)Zc&|c,EZP\xOY.NC~I:Zz]{ KM|/P][S爚J8) ^9yX }X5d P(*1()0]\*9GI'p!ᑇss][\pe ).Rє.EDZ'ymc\~ Xy '0t8gYf^{ ?$Af%KqoHm:'v,->7ajJ͌}Yݪ1EǷOvvpm{7N8UGd XyD%H!7((V zw-ý ՂK̟ lT;ڏT@ŁV>Pb.:Kwi `dQCaٜFsrs2-5(!,2z|D1IsxxEJkh8 uRzSp2`V(O0R&R"E[#Bd5sV5+EQK|^P:h2[u _^ĝ6qdTI{C1;iNL>pUhcqa4yE޼JnNϼr~[cзS"z>V _!Q3\G[h4ێdxAfT|ϣ^ӭ6B!q(PbE-K< Q౴Z0e`2J]\6&S[lo\|-@dP斣KzT'R)ӷ1t2)A8t^nӈ0x'GCamYm/ZNz ]jIU@*9,4eoū{hr4,V+~~޼|.ٹ&y1AHFJg#|߹P_m?&xcOuQ"3g_{";xOOֈ 1'4J㘏LZf+++(O|i~.,ڑr1yBN+2E5*!·*fX6@(*P[TEWA/J ׌1n)*t }|:yb>c&Ƿ66rom5y}^Ka-y3\Qt?4o^xSNsǚX}e 4"LlfICm0o!&cڐ޽1onYα}<䥁!Xߟq8ܔ:s?"H٨ Mr?:UҵXXMT"EnQ5t&&:uveB|/4#+e "r4~8'(˜"9G{B^ǯ$Cj^R>f~D- Y638&aNDVNcj5-UHȚ"KiVZuP82kAiYZ`y UǏ>IPgdYA$ 7m9wdڡ]AYVbˤ!)cD9v(0KfL)_"2؟v.\"s91H&ױِP\m*C\ Y䈃>:ЋR'9,tw|\d:0Q%'?R'(}.Tpo,wl.VNf8ءۮswo 3'c1I@W~ OZO(rl\7 PRf)JwYm#ac#m,Iz;h[㏑ٜC^M\k>%?C%6ܐdl)')?=8֯1ϦnӂdFz0=YmC97ݠDa[ES'y?~[.S H3a(Qã( Y2YIOH<)UI{c4fUJsi(Qn[VK})VVƛXc)c8p0'(۾y_E^yqBޠ,!7ן qFጚ>6BZ[:@a+Ks!Ja=p!\VaA:Qo\MKVJ(2UeX*  q ށ !IVpqdxJ )S/J℠,-ΕL#Z:2g(rb},ɈOڭ{<.]1MǙNX,_jQp'MS EuU=GpmzEqH 46 L&҂Rpg)NTvc*d`k mHs,·4;9&9QI4z@4ؾC:I2/) )5l 1XW.ߠDRi9K1+ʂǞYhl)1ge3*no>KX5O0+Me > K&fPH)diN8yt;K4֏s=*p@ը/!Kjl[g졋[ =qD+%a *H#}E cX&lt,$9y`>Yg ﻋK/0=KyMnH++ҧZzFʊV?d'ʎ ʢ:3;j%0 (p4 ߻4Z@"et"<>o2MY>fq";c29I6^gyh?q?Fx x[ &훞靃.S&%՛ܸ6dyiR#% :gJ믲s<y>e~~؇\&W^q^ i,QhqLe-5ݐ7g&2K΅cr%Rxuݻ›/~=8{2f$5TI)~RC8X!Nf8/9x؄R/ vR f$.һyᅌ\4$p1 QWYnM%J`u 4S]F*X鑕U>86G}IjAWb8$ |m k1I}ЂYʱ&]6k4 [Ht\k\|QXֈg%+h] . Lgsq8ij>51'dE_%En81"gssuRd z\o0 qA}s\zf'3PGi3O: _.Qf'WI8qN ;pD;c>ٚkгZZ0UYjb8Ly詏ȹ'I&{`\҈8kw1x!b114x=[K$PJ<RZpBJB/"-;lؠ3Ҥe%*Jntx6% 4CIK|}4|g~:*ԥxbtHe%PȿVJ0"(Jlba]k\ >(DF!HSܖUa+}hnMGU¢UzcI=X^A1BUUFW*IK^|G [K)t:]+wHCxO~dӿr|B{ΜajN6.WǼxilN)<45y. ,Cs4EG$RAg"K<t[M|Ybz΄H(˜/˜>~~n\M6KVA?mNh-xUamIR2ʭKR yV}k`8F`)˒ՕzLwiLbluƒ's޺IXkCy2N & ya7815Byf JQ-$c\38kCE|N3K `K|fA]k0&GwB3:+ fern]˰$ "npfe(2 Ydi˥+89ϨjBzP=T(Lۄ>*teiZ` hx+;pX8&IAPusO-֏t( ڐkxV&dimxڜ߼ʒHxcȔGN?W<(rf#+-g}jQiU@d64wyl6eB2$2`-FxU~Ezoūt~/Q[¦#تT XTAlFahԘMRS:q!.@UhnAQmyCցau]~T͓]Pl8 g z7vD9ҕ(SBFIɡ#lXÉNWo@XyOkC2K/*-KK-atTQQF8O &Bb>3RGY:!>K lIxSS+xDc [,|ژ]V~ga.8f/$/8R: Z(rkgOrlx8$(,+g)GP)N^OH'"nlslmf-G6ԑ3P ;~8u$iiG1FwPiQҌ6;=D!1ڑsdyU,ޥ(c4[MQoL)sDrpاխQfDl9a2LQ~LYGOfDAi9iR"."e2+"DJMM甅a&K ^!T,<-BZ8=b^I}σ7r'{и¡sp^iNGNx}tZ yc5ǘCJ9(*W(0%h\spuH| n~ݕ.j3#g 8H45 4Oy`MU!- Sxs+PF$gooWFgJ4=^+ ҡ4k~*~[7FeJ[\:ƳPs1E^%)1WTzǾ/"7n-iQ$wHOE>e(#؄Mh=I«/1:cXw?mgKG~.=v^LX+༏mYf$|vJC;|,e 4}x3k7x˯"L ʤk6xwFY Jc}xϣY1eh@%԰Du $!M&,{'5oгogx?2 عp h:8[KqJ-GezQ;>:G/$eU7XXm,ȓ/j!. VAQ8FB[(^FH[=@d!4Sc$fw`87Q8<,Ą+<'M~jQ!Y$L356 /$*2D6yaOi 5$P AtWb"s#=6R`NaF~`4e j,㮸CΎ>pNoΟ`2铛\@ F)[?ǿ?c8Mq:JPHIu1/81xyW(ågY?5X^W Cf;mC]laY[]>$'贤H |c]DbCzZIڞ Cx X]_K6Pz>A~#t?7o1aKY`-~_WJ|B/$|gk`ܑ\934wH%J(crfN LJVT($g>ه)?ѳ\}<6ajHmQ n@[~6!#VM?c<.m<ʋ_qE?csv; :Ԋ.6@h#ML{4bsm:c%afh'|tTnV  @UV,z*]֝gN$p$tJR FO@Ѥ,&- S`1@Jf"i:+%jܽ›7{6,YℤR5ϻdiϽ,gZͫ_ϋ(R5+ >gsCW{ٯ^+άdwT-qcO}sݡωWP:I|V '<ƮsWje]"Ge[cȭdڲƉN=``fL 04dI7Gmx,G-˲dGeZkX9}U$%ږIj$ v=ww@cG?ÑQ&x~ߧXTVA*U56XJs6n}n ˍi$X.RhTi$Q k,,SNw#m[ig33!0IX* cV+ec;.JTo?WIȘ,.1ʈZ8FlFblуP5@tɀQVo$Ɉ 6LBCE!JC~0124VgǾVjZJEbmuDaNa5>wܼ0qGS+P ;JI!-r"ض\*!ksX’DzSPQ &1H--HIÐ4qFmR"%,iQ(0H̴GrN1ѣ3w֩:?d*H"ҁ&d`&㣛AxWK7 MB>B!]JCǶm "5.1x]Na8l1 i75&aC%sH$-pbOwhU'OhjRq0IrЍ-TH`+aoJz brw;*RԂe+`P:v6BdTĨ,%2LZ)ov* Am ƲKb\egnan~d: )L],kBhQ5qsecH -r9bI^-%eACsikhwKafPSmfg-eX X8e_iL__%>QNn].X[> $[1&^ZDcmc<"r@QB&i(E8?/WY;Je&1m4QXʅ2c2KG7)-zƥF:&ÎEiywܩ+("Rh°#-zbI,F'D4aN Ht=e4X%Z8\IѤqLZ9/۹8vrHeAYKj1$*ӶFYP)J0:c3K@R)'[cH)|U0>R.|Pn,;YwK #,4V z!IOE4Mds-)y6avh+琯ٹs'O2'o/V0),u,/hŘ ST< FbHyRHuk&MP)mȢ6t:ғ̀X_$I:șν. Hudﻝ۷oo?ˉeqBl͖RdžBB=Kdd=񰤋mkIkD-=JZa[,cTaˎ]mzYrƈNZ N3eWb.N-0g۔MJd$[BRyʹVlnC-aζltc$LyE^8sPU953T2;w[Qd й!|1U"TS/Wѥ*Ad(n"MZx&A),MJSAH!oez UfoD.,RBxYNF~,Q8-kS+DK1'ODNp9LP(x]Kϱ6_ro/HKOs+)'3=R[Q+OM3-I~w?Cq/3< H(Ck?8qCTRi!)0qPm:pm456Kʳ0{LgG@e :$rLoc[jNrJMko`$_B;;ҢJZZ,R*W t^|M[ 2,wz$aQ-q]_ǭw܎z Z + ^|?uiӧpf><أiFҢyҰ5䜔"<5t~f 3W,io]pe_1Uz/W!dźvK#QxUƆTFZb"$V/:hp[n؇1VJ--[HeI]q)X`ےf'1 6c%/ϕ}b"Jةi~آ VB)_ י=Lc9E[ Yh6"+(o-mN<ЍTktR~>U˜_SMQx  cj9M 8Q^-S䘚3R+`EuiDⷉ;v]Sڠ; S,%1dFk5`r]])!eg3nE m+ {!O5H7A%\pr~| G)r+u8]MYQfIlD~..Jԇ8 -HCX! U+kP̓I֞"3 h֩kEf,SvFۘl)dܗz x+A]d2_x˒$βL6L&ƲEL \ch̦0, "z-xtl]^^Zd@*l;h@F:ŷ $b+ͺgr(M" +-T?+4tt̵7|ĹܰΈhEV@CCUV[Hr'06ZgX<( ML9#z=@ht,AhJm43/0Jjԛ IDATﭰe033MY !ª8,7RyKĔ.ա!:69WS+g@igKZ$%4N-F,GsCwN"~grʷyHdhuVX^j3\.3emO]X&Q $XLql0Sr<O̳}Vx=̜cGS)B~@|ĺ"QzqELX@wTya(8zN[ʁVsU7O H/WI+lPƐj##k K`|z~_1=L3Mq 5,MXKx`hأ9Dg8|s((,Fe^@u|Ρ\xyC'MlZ, #QJ:V^dx ߖD'Z4͢f]hI$1RƺBCE4$Gtuʑ-D!K: {}gz|&0DRUmOߔ ~??jy p5+f?9/e; /i6f ~¨,'d ¬&QX\2,%xjڈ(lpCltI%_k#Բ.lQK o5d MS<# F&́ߥ#=XB&gKe/,-iP&% cl#RHeij39QKDQME̯mfVIضo;N RO;߶IbHp+n۷YGG$ءޱ ϓOciڱ |4w޹-J(HS"faysP/x߁8rdl* kkݐrc4)1ťkD-FGbc!EZ˜ZDW%l=$(`ykJ˻\ݭx ̢R&8\rJ9oChMs:FkhQBe)\'C 㦽uA˞F;#s\Igchz ):t+Ң0J tVL%oS)%\(P1JF(bt LQplML ̋H!1:FLS0J#`&(1ml fMTErCrn?06l+aܵ䠩6\h/LEJ݅L\傷7k.i̹hNdxmyqkHlv~^ПFw|uxk W1ꀺ_X7^zh\k]Hvq"=% "jôR4m Z)^fc ZVz1 fۡX.(M4;m Dv{`Yh%ma{1'X/p+ Wo1cV斩H@t:![BѮˋA{'[8KԱ0:K1Y_ٱ:gYml?'=QǦt@A:΂c{˂v0Ro>~Ņ>CC%AN5g+)nq;fN*ny@hE U@ b7Ick7!.k-?ey-SM(0A Ohc!Q`4vRp% F@X@8us]*ňyS`DpmO/~vo5O[5nڳǵCuDmpLo˙Gx/ c~*##b4mee!bh>MH2cIf)aSݲ2=FfaYO,E&̸( )yjt0fl%_HےJUEFjܫ}ͧm/tG5~?UoӼNW5.8MWiu%^JuWݻY:G)-D(mXY3PSgKh\[9N#|`lirt]lʌX^i!s%wSPH7S֋yWٱcK+ZLݣ #}IH JH8948<ĎݴZMj"C?h *ryl+EbQhQ5mۢPa1 E9_]Az)I!X[ VB/}\>-7YY;k,=ñ%%BZe0n0fS>ž*8{q$1` Pi%], U)QCڵuC#$[($`t H-FarBƨR)i N@'}Z~e"[wO DJ!^<6sUu1فo=IR\r.0N1l4 VQrRe? k݀NmzNCV'U)&=nA)렌"_0DȦr;vr5\3X؜m KU&EwUM!'h4RBG!':(HT=E.1=҉EXF.B&zH7IJ$}|;N,NͰuZRILRҴH:P C2aq*G7ga ㄱ]%bp*Zbk"RyQz6T\'h9BsgF-\$.q ݰK/ Xi9’WGG, 9apeա>Ad !"FZ6ƨ,LJ$AuƐR uJ^+gAGMa8p4[]A&6فoGE$qk84.؞jOdIZY ~@dH4MH. 78BCUN/xo0H魥ABO)Da&XQLql\ёWYjdCJL9b*[<$t|81qi9ߏi-a$*}(!4|z8YTB?js.b J┓s]S|p-ᘔ2%qԇE<[cbƤhT cP*AiOI۬p]>7G츣ւ\jnSG'-& 3:VS.ba[.;?1>}N~F Gsli W DTDH[a!b<+%  RWDZKZ.32TjRE;JMTJREvYZEiMl7qY\Ff wb@RI_պ8. 2 D+8θvU p(Bлt_tpXX78 $ ! #.PYąI$)~ ش] X2D mT2im`:Fk%eJ41d  1i gX]W.A5foa6B80%/򽧿Mߢn{AJ2J/o@ j j#2G-4Z)(@q,ҵT9M7P.gڨRK`u9࿜LO/s6' "µKȧ(I`R2 nqϹ#/>Qj + { !- /) 7JBs:DAM*3u/)I)H$# AWH~1_4 i8/p]Rp{/,Maeqqk '2 ^ bzI ¼&uASFv@T)Ҍ#c`$rbQa/"ǚ @F1uce@Xڠڂ\ͅoD_`K7`fqm_~1S׸=ps(D,-t~♗,fgo< }?r)kx7:7,D74.ߔbKAqZsQ%ef\Le?!^Z?Qza, ^ 7˼0/Q\; A^#M\#\xvjy6qquZkyq] k 5j5 (@[ Zk&''4oެ Rݻ;4M9pp&|+h4Wmr|5VghQ(Q6q-)NCP ]ÒmZ!czUDžBQ6q-!_q_U=MkÄ5ŵ:~jFX9l[עϳYo=\3B\1Zmb&6+wMlb&({6'O"odll'O/R)%gΜajjj,3gΰm6fff8wPVY^^P(1m󶷽^xV+&Vٳ^x4Md߾}hv|[ߢVw)%#uW}Fw̞1 g޴ѻ(hZLNN^]~gEz)ލG}̶mfggö7}Fdattc RM)z377GT~xǹ.{hy'1ưeiqg֭sJ)i4KH)ٿ?ccc?rez> xG.{_deeZm݆R'|?׵jiiz~ rrSO)wu6rot:TLc ۶mchh mWi]C=;wooBկ~{}vJǎg}/> J?yx≍y}k\wu߿{255ŭʋ/(]wv{nk.=Jx㍜:u/~awG&˲c m7"RJAq8K6\7ؽ{7|Ml,ٟƠme q4MRn |Dz,1DQD/{F(,kcr@rqpc`x5LJI -1 7P.ٳg)ulY<7x#\??u]e^Ǒ#G9|0O=k\8)%ϟxֿeY+cسgӯyU)EE)%A\V)Bfϻ=.WZ7Zkjw~\औ|_禛n"MSx}Iz=,²,_e$٘H;$%YuVnV1/n3.noϽduOkZkFFFعs3pc ^}aY=qQJQ,) ~a<+++l۶f{GGP(m6nx <ȑ#|_2m)'yGhwc=O`6Zkz!Y\\d׮]vM~rIr"Gk7 B&ڵMy|$I}Q>o~ӧO.;vhFFFlٲ~ϭ׿uwvIu]ayy~|@0155N`aa]v199G?Rיc_җ4M>cn?ߏ֚~qXXX[naii5>O.> jz΋/= {(BY]]e8sm+uP(0>>8Ht׾*Bn㎍zy,/y "~i4?8BNn4b!c&###$I8<3:u c ÄaH/Z')>|᷄y:{\\遗+m/"̟ɟwqt:>}/^Nyan#MSsa>V믿~c$>(뮻//?֭[71RJxFGG)|$VVVX]] gWJ|_j)rkb3x%RLX}{ǎԩS|#O?4'_o|__gaxx~8/̮]_5nʳ>*w}7;áCBR;}C Μ91k?w?w?KH:gvv/~ӟ4xlj'߿q>_Wy衇W­<|#.qS,G?J.öm:N#G022q_>g>|I>s 7p9~y뭷xEի\t&nj8x s<ݻZ'|??all,; ]Nݻ9pV{ӧON_\7"֚]v/}vMP`jj~zQz-ٻw/gff??ԆA$IT*8z(:uSNq &&&6|azOQݑR^xop!y|bH&ck׮U}ٷoa> IDAT ;8uRR[_̙3\tz( 1w}3N0 3|ǎ,,,o}T*x ( Î;زe Bj>,agg\x1 Klڴ Zz){9/'\|СCܹ3sS?O裏2995 mCCCY2TXkٲe Rf>9~p~~-cFj[neuu5ׯ_g|| v[kٺu+KD|_ezz4VY>ǃ>SO=6SBJNl:3"ٷoccc|_k}n͛ c;688$_שK;v6mt֏1~G\#aV׮]˘ |+_[ѣ=zl8jʋ/Dˌ((a&i5.X,fRD?ccc,//s![lj$I6 SkiX^^l277Bۚ1V?k!X\\dzz>,< W_g'nl6Ue>  5s-g?Kh8N@ZgvQuV*CCCgI:.SSSYܺRpeY1f;EYYYa``/pرlϳw:^yL0c~U8V133CLNNn{^CcA@__$I eǎxQٿ?_W2fi|'.<_Z333RvMZ͒/^fMc>jRJ(\.#Om6$,O3334M3<88˗iۜ;wa&fu=]q%Y>}Z//~T*w4Gς~bAsNy^u~Q:_טWWټy3.\//g> poIccccC9ѣGh>X)y9|0W\aT*PJ#>* l06<Yɓ'y7xꩧh49㡇"IRJFGGBk..^dɓ'# Coߎ֚Be |3a||~(J޽"Rfw``r|C{f4Y3O<{oY;::7M޽;S^yN<ə3gMt/2?0۶mɓ'y ÐZ?ɓ'& C$ᥗ^&"~i6oK/ٳgyؾ}{6?pP(d0bO|zÇJZQTUq^{5^x>Ocpߴ%ɓ[l޼9NC$Lm i*o6O?4PuﰰsO&"CCC'?믿֭[j5* .oFf]ve/pEVWW3~ꍰ۷cP(P*8)* j52>pȑ#;vm۶BdXݔ!s֢βKfA'}9gc|/(h2+oƭGϜ9ý[|2.|IY''?4χMϏOyzbѻݟy>яm۶5Zw>ݻ]i7dqE7v+3~<Ϝ91_~~ݻ7w~ݟ~=s`Wq<<32?._̷-~73w3yݟy&i!ҥKLOOg7:W$]?Ƙ5ĉH)?LY8y^M~׀_y~~>}cǎf2&NBJٳg|WniwCd'E!XXX\.O~oqv1>>~Ǚ!Geǎj;?'?fff8{lYhth6 |7䕖'|\nEO^?< 9^)Wp8tib~Zl, #'=mFὢh-i~Rond=C=DY=C=ѳ{衇z=;_;z衇zsC={= z衇ރ0u#J?4`YC;ڴ+ ϑtv;򍰾*y阧y^'yn4 de+Lވ>߈V7P?y#$ ny{:}? sl6ّ#G{fqg]KE nqgzz .P*سgǎj1>>R3gP(x7F'Ona}C(xG9z({Y/8pQR޽>w7… \rZΝ;9zhFfɅ T*<YEΜ9՗?믿Ě>—T*ΝCA__J)* /^d۶mY ~;ki&'ĉY󍩩)6mĶm۸z*s׮]GɓZ-:;v`rr-[dU6/sNRr5Μ9Cǜ={6g.\Y3 \.3550KKKݻ~)efffX^^hm7of۶m\r{wk׮#pQ&[lV177f&˻dΝ;Ƕm8<\ze9w\6Q[2={ dyyAя~PH\.ST8}4ǏT*055Ŗ-[عsgVbT*Q(2Z`FFFfjjΜ9Î;8~8\pEd׮]:uꎶY!?O$c\|0<<5V)j5>$R$IXZZbӦMw},//# Crƀo' fIբpE9rٳβ… سgǏ#mȻA2Jzɓ'y׳.j"F>\jf.h "Ape&&&8vɓLOO4wAdtt~LMMelR(>ȅBYjZرc|zy>9Ο?+_BJAd ]JIرc<裙l5nH={h4~:AP2R|`{>ę3gxǹ|2;p,dl6T*$Ifff<9}4?0an&$I8t<Bz;ߟ>(F|iӟ4ȱcDz.fZyG,,,pߟuTFajK)3\,޼Z RJ >>qI8x K/eBYZWtF'!Iv /;vmΎ?*N'si왹l|Ѭ5oa"̾; 3pjZ^CkϥKxȑ#<Ӝ>}L)R/SV9|0;v7@Jp{y9lvhyz,?VwyD"DQz~GwGףO_{Ӎ,c_'{~y57qwz݃^;?d;~6D{ޫC=p_{Ip8݅n7r IK==[ |VM'Y6^OXk{4~Pノ}߿xoz衇!zz衇ރ z衇zx'{衇z=[FA)^otqz]*Rr5F^*o; !XYY7:pw|nNE'N)jw|INߒf!LNN 6o|sR={+W]5۷og7SVRi}ٛh w[bAp1>oQ-h! q7Æ_l6oA~;aGGLLLdM~Zܴڝis7X$_`5VH3*=羲2:?eaKZm#г^lT۞wFѦ^*o]V#<ͬ6}? O{cݥ6?%o 7C8W'FFFbie@)4Mq͔EVW4MWTTeRHM"Fq[k,Z[lsƤZC&Zk X:FdppNk0bqNf.ݻgʔwLo4,ߘWK<LMMݲ~\*Eu=Ll:ٽ?o&;}DHdS@JZRP`Ezݓ q1kWՉE0 Bx { X:-C:Ϥ~m ? t摞g}Z+Jl<ŋ0FÂ&IK È R o /qu277*bOkk]ir{ owhݹ16[-y+p_u{3b}f=geO6QؼOYւ-CH5d6"ZeP*I_(k1B"(!` 1V,//#ZcVZZ! vM XB"Vs)@혿gE7޾16VB(HRTPB".3M #j, mB !qna1̿cDW Ίw~ܸwrsdJ)0DX"jrqeumB1`E汒B-sZְDpΣxVusɌ_KyIv_kJ-Z}o,u0Ʀ=RlHϢɎsC57E Λ&P[b wR:Â@`fn ziLMM$ m…c)eWr $JEV@ 9ߒ:ߛܘ{X7׼2j9wZx3k]k)ԓc &U4X녵!3‰ݍ-[mdDX Blb#q"N& M0.s^MAZ+ FN) U$aD_mc~*'JPAp? tHuJaDm-6FaDvs}nG$IH9^!j4I[$G(mDSYf& Q@6ԆHPHD4Lɝ[I hk*]r}R?Y)G@5? ߤX,@I$*0x;b3%MK*NvRBir(0BR B %p1V)Ң\XP+& n=(2Z*3hN+]sya4H똾06Y&s?L0kSj612TcbrSv -xJ3֚^{Z֭[vQ ÐNӍfRg@&dߡ)Y.gxFc0,d¯kѳFP"AJjjA@X>b0B AbbH$d&'$RzM'**ZcSFrwwB-wD `ZuŝkiE-5D fF($E*J6m0KZj`j4)S.9/N'.2iF;k_b5LXEhHi@A9*i4Э[l3bEh*zv+,-h̢ ()!J@T`m-X鄶H@Y*52Džp[pq2Z; n$ֱxxg[; #A%B|a q> TE +h00Xݎxe0*I!R)B8AP2SnXM+AR UPZYHzzY?,ͿH;N ĉs- ':q>)U0 Rb0x IDATc5&p޽{wchhv o/t%.\:C̸'pTvk' !|Xywwvz4A`PJj5$خnghZqKhs14B}|VNqCwFxIop/@w!fgJ]Vֻ,v~.T &1PʀZCF}_q?X\"Dhh/Jĝd&+H 殷XYظ5Nc7VFӴE$6@`ѩ<7GX).8N6Nhtd-Fᘉe!t[OZ? ^}/t7IR #l8f䫾iAD`$ƀv Ù',6(,5YT~:TBT.))$JJgC2~4ej+!1|0D(Hi T`=2b'y"zwf.UgY*%mb%J.@ &}I)Ģe|&Xz5:I\(CP ">###E(B)E+̓$I*`v:Nۍ Q>^ rMX^_"NNtd9Msz᮵fvv-[EAFЁ:R vz_{Ʒ-ͯEGO)RH)Il8YYY!^H)$id)<ZX?F%R2L݀tųb.ǖҸ2 JID@[e$6l$ /D§WZX@;YYZّ6"@"Z`,CAhMdڌ !ؠ ;2aT*TL;&%vR-%0CTqX2DΊHpBHVgBpk؜hBЂSTd=n33@ǠNBd00֐ NT2[+_}{GyDAx5l? Z6BJbㄋ.sqД&PyX0BM`d U O}wiA>-lPX'% sr i<_D-;צGZk4 fBJæd$2EXͻ}fvY 5 [ņZnYEpi~ܵZku:1y&#P(Ess sssXi$ ּ@JE}Zf Qוo5u&ѷJPΝ;RfyjC T xE6 |P߻Y,~ eF>Qwn) n8 ګ | UYXn%06qDZ2xIB"%AAV м@0D5, %FBBP"ҹKBcw}NZUGX#l$: BK{@51*}ij+P$0@C"@r.+7o8^t.VN-)X? kw+Z~ r΍g|9,J,l?N]Tf\[b=!1U2}~v1^:_ֻ#ӷ&'6Nv'1-6]rRD'ke6A "fGO?O_g{XjROGx*J9Z26UFL(P*`HLiYkT(# DȀNo*QH"BȹͳSJenXZ=M=}]+ᣀ3%MH/zBfk | &9rJn.u#`zcx L Cvr<, C2IjuBImTڵ)HPr.$%ZAZ5\k"}}}ٵQ 'Oĵ$I0YaeϠ& C(rs"w1_65 O~,e7[HbD"/(-0X+ ZQ!*LdLЦڦN8'R\ niE.]硭*2Wۖ׾)*/0vc@LoTh0"NL:kuVM=Ů{v Eڦ6p4e (a(\P(` "JcQض!lB;i 5F*T7+Hk@lq |!I%o}bXkeF|z옕)S\q-/lzF9[ ˇ H3]aʄzwrhE<.Fu`o7t=0bAdkc޹ <:u!^RJʕr摾\PihCKK^'tX[T(Ra*AVvh,& .fuYvK8;e&i0arg)e@TbTo#`f%x#1sGl_Y~ RʥS ue%F -B  4H mQ(T4  eڒճ[1V(+D r#+Ha X%)hE b>DY*VEņRVaa4+,)o,Ox.SBlwwK󞅵-FB6d I,̚YSH"'2eK~ӭ{tѺg0^K06J(aa2뾛j={>=dޣa X2}cvcQHZ" #TWRQBJBڝvC'NHLHb5v TK%)WJJ"Z+e7y7G>L4B8'%ц N$(ltBQ(a/\c~i ;CVDň r*Ds3rwoOsmnY*"r Ʌ wʪ"E ak2~/ų,;0N{ ȹU ˗/3>>:OC*qg_(2OD'=¦K¹ӝ)X^n`-DQ!_]~,q76gټ'*ID pd26 s}v>h &VJc&-$sE7"BkW)XrCl<7cuP%Yy \Zt!A*.n68;y@ Xڠ$f)J$_ox:R9b\hXBHDbtd':Dǡ ,.0_6T $sgORc YYe`'26ROTXቾ[wz뫔e@H C$,b(h$pL?h%$icW& &)[@+LR TV`Z̝;]Z䉱{ܴ3נВ,]Juxt\oev'_tH50iS?LBGXrsHt/'LzL=\;b>ޙc-[@L>dԵ:G7@!~Olk?ۯIn㘭S4Xl6Kn!bA_!b޽|{}{r)XtP*0rWwl-#$Pn3 $шTERT#&!&_^}{TAHǨ@D2cҬv| zhZKkP5“AY[t-G! ]IQϪO]MC$^̙s4- DaDElڴ#G|$KrB}}*H2 4tn tO9x%MV:ݡngnޅN/--144)kasb'h4@IrX3wThc۝JHـ=k:qj|[6 $$IΏ' ա9Ld$Q0q=4αB'-޸]@Hj([lP C*"p:+miѡ ډK*{>ΜH0Qv:-dĘN)@29-ô槉EgiwP)D+q/~O|9^: f\ $J& !# ҆H$3cCLucc Ic$$F’B/4 K"%DQp$Y6*,]]D]XD_XB- p)e] Jp|oS9 4;oM:%b,+E-~!]RH2;Gy˾nL=4Fϕ;w%Wp֮ɼ'"Lt#R+E|1@߈DEk rzi+jct'FkM$IMX'be@Xa:g%&"A:uccnnP̔@v҅l$PE&jKt {Q>L*˥z кX'*xKK'_ sۑZZMپ]5cl_[I,F7-2>>o% C>Ì133RDX&ֆbރMJN,--PP*ZvGkV$m###[e 8,/-i Y$rJLB!W萶:[&.+++o6O?4?oЩk9oAO[R"-m# j0 %TpctcbCT5/Ł*}U:KMVuBqd~ \:vw5rtqe]~oLTƧn} Ԫ kGFHdM#*gނ[ԟιY/^e!ҸWvTIax?^! i !$"T()a@ds.u%}-Dв><~ÄQN[S*FXx2z?7Sk"e jV,Nt B#l2N+捣xͷxx}ԥD'i"VLs`<*u-{Ȅs:^7sZ>w;N_v@Qߏz w0n;uzrk2ťU>BX]N__5K  …m!Nb´J襄N.?kU5Y ut5ߧOдYBe[RAOZLjX^^Vsk:xxx.^dyi t|,y\9!I7MdIh&''9qĚ$|nχ>gYYYfdd-JYJDP>Ӥ(#He jb ik褓JۄVТ_7Oӹ0`PWg@Z<O>* e2+,&L@_CӗhLL(z("(`mL`%>F xL,-;uNؤ/c2PE] q!t@{],˪ Љ+b c ȄrTGS3?C-[[^-ѼH$Cr%rwa _(2]Axy.i&&s&zk6c+ǻ1)ԃ.kxVOpIO%]7u>qxܪ땒?Vd*׎#.4DsTHeކ N@JWB<,֟)U@r"XX#*ؾL_$@GduuZKX .@ VQ)Z8tgNxzMǑ7OB"K++ K@RX5nE(62׳^3/;|J\7d*\9J X/W\4VՅYV}_BQyZ+ [)8YXeaxx3*BZR)$&+!&Tڭ0P#,1V`aaf^|tM9p ~闾=Ξ=z9 Q,QJ1sssi 4n9|2fҢ)lC8?bwwŗ˥|i>^uc111j/No^4ư}mE;X ZUY2T<ؒsz۷7;`  "Hti+#1*[YJQ"ۊdWĨT.ɢ$aR$!$ bߛ7o{^9{RU3rW 0޽}v}oHˆ(EH58B Vk6 B9U>ݜ|iF c AJO 6K4P 9 ^5fcwgRϴHmF<&dá1@Ŀ7^Bl#ԡ(5 Fc=Ƈ-Qk ;ӤsPh "ӂxXiBM 0'G1uLa"ntsC$ ,ʆ %e^fw*Bou`ܧ B ,j *˱{fiKWUKVۺxpd/5+pc8ߔr&q_XAꡋwV!jIETP:UNVU[Ӷ5yɱ}u^Q&b_UI IDATVaNҬ "%Abg*L'Q Dlre5k3|(!D B W}~hDQ3jM ~ [WHNԀ ڍ?2B!k˫=|.vn !-B}}I4}7qISG[Uz@! ffWCo0$͠A&2^xvU=݃+Sqz>Bos-p& k2 [F81F+TF @Z)34䝜ao@k,hHI׮9\xmedea%N-4 3fffQE>bC1Ac]mc-ݍg?c?Ƴ}?^>_l,>aF YK@B@(sFjC ẻeD` F?VRӂPJJhŦ=N12'|P5-Ǯ1btՖ f+ʊT x&&Ս& n&}s%|^ :XV=kfו1M})j5):bRd [WBtAԃyU_9};;^|CxSF{YSE/g9Ea8{,/MWR>{kk` 6pf)<_q$J^~Ja% $VZx >O,Kvwwi/׬@AwK?`<Ȳ1so- Y~e.It|yQ0$e) Mh6bѤAƥf €P U -KQI 4W/$!_lbJhK#DJXdfa>~f-?',NIJLrߙcQ -$hw^ouΥ30TR*&뒽xvm Ge~~:@dLH'2M4TB?&Zk%U $$X!{(I^F)QbKZŠ !`xYk Sgy`AxqVW99>vy'8y$/Ml8G^<eAQhΐJCk{SωC2nM'Tt67*J*33u]K^{uVWWm;ֽN~wvPJՌw]SO=ŕ+W>@$ORfQԭ(j_fdj ˜]wrCHlB茑2*7JqGICƐ DXy^hhe(ь-_8O,:KsX;J?\FĂA~m@6Т ni$~,4"Bw(}0.QLwH8GjADeNKeF6 3ffCV%$ 3)QlG QnVlot([1ah' = ȥF8 7Jw\ul uum>Lf§*lDYjw?M`7 ScWOU&VXQJ> SɗTsFY|kh4kDe6v vx+hn67q[/Β}\DxѲW/WCY\\$MG"8K39Igw^yg濇.p0G:+zZrCn8pb)F)sq\A4숹 jKl2I(cЂH[9z7n3w'mLڦd_Wq2O3Q. PC̀Ri8$^Y>;a ʇ,J )RY`c.Ѣ11(bԌ̈XEKT$A,mCf7(B 4t+K\ocxJXª*w7+'#=~[ﲮ0e]?8`kej*Em |ռu+)^ QD OK,1D}%-U&rwEu"~'o:rPkPࡻҙ԰Zc'"#\]字_’Gݡوۣn:{^:0T\SlY'Q*jQ"ih$ 98?1l;x8^N K=$,nVɔ~Z?Q0uqƼsLI]`yyWy%Fđ3h-$0>A*Ԛ;+Ͻ//*Ԑ$Qzw5e8Nի Cq%uDb|:&ʺTp8d4Eb>)˒M<ǔ%[s_ ?;>:D'~};0 __enn,n:z dF#6re655 qbMljd@TZ̲ ^B7YdAhB)hcMaJl mƛ7Ҋۗ8~ h*>~1,f|oeEeN^a%>Ar|SDqsƽGwp LkiLX@!!NF.##cX&+V`/b:HD~Q^2%%)re,zKsFk0Oawi^$mH,JId$$b=p"UkgRTX#!Q=QUY ?એXUr҃;IH ?}E] T\Vք+jXX}ӞW0uB]cMJK0:΁RuZ\]ã0VV W'S8Ƴ><d眾4aQdgոw%gs`KTHbG X$3g/^ͷϱ\= @hoRmoK2nޝ:U{ʠN0l]ba~/_r6a@6J.ŭ'}s}!IreGnsUF)P7UǏʕk}tHy3h5 *ئr4ޑ^b5֞L~7?ɟp ll\c0ޏ!/s_e{1N:Žˍ 8 TP w^,,,h4z*֞S>B.No^O>8ws(=#e7X(°I*3"6FF"Ős(5 DJVa@7֋_fu~Y@<-A?׿Ƿ~LVh (2#JҜ#Q4aMAvG|Wm.;!/JL2䆠XOZRQSL:$BYQMD5>rྒྷF 3@;&5qa9Q`A]:WwQ$T ]fm#lBIMbsΓ)@RƮ:t7bxLվ!*S}l 蒈B9mx04nϕ%+[ɣپ xSjj/Aƫ`D$o! uk7z&זu/vv]Ix{.˿>${,;xf[m{]j7-5*ZO=p!6tfО_#L}}+ M9nJu8,UBgj_uѕCj. $32. "yF(D\hd{O&w#G Ào_k LQutϽww gn߆(ӭ!)lКcWg0sxLC3 DX,V%n49R~h6[8uؼ峟7h(Kg:IgD66P$s+dBd]r:sj=d6_71Fp?'^1avexiACМ!B:4(1"[0Oa%~$Fx%k1؆ׇiFSw@٘! ( ]VULs^UU(+ kQfh:BXv4+WPwNW-A R PA qB!URL)O?u,f3KXپZcެ1ju5f<뭉 CpMW>GrZw)*YNւ4(d9fZW8`oaO8t2֠uA)$ ѥ@kpWZrsK47h5Zs,/18x)cJ2~*$hei0ғdP#7ZKtI WƸg1ZRP.)Yz^KQj /\I)ulnle%o:__<>~A5}τwmq eZK"1c|dҏZ{>uЫ޳#S[[}Q͓Kơ8Zx{hu>zwLjU^G8s}|UoZ(Z6%U%F!v$6K+MbZR6n:Ph(B^a52j[Wk'ݹι pa"Ï=[ނ+eߧH1*Iу+7?=HkVK|}xv;o.a_B.*HغÁc|ڗ^k@9>`GGhd@ZqRc$fv~"rJl8F h{>V l7XQpVEscyehszKW)z{Opc|iDK"1RI )02.Nۭ m|s_]wR%e1mN88XIni:F0to~|?|S?ӧi._L\zgrE?;ސŵ:T cTL=!yEY:)'`ЫZG^4@G乫(ݰʿv8tk "ʲt:Bx)XY#?$z0$ϋZNUПQ=(J~>ȇ>A ]ȥK}7}u=+wHoA 8~VqwHYBo첿Aʐ(<+)qΕx;\ʫWh1IF9K0KX[\kg^@(H3ZsgrG>Hؤ,%hnJfiuxh33n7 ,@Ń,2 /wwxAk+G hiGJ0;7G?QcA<Ӭ,SOMZ#9!>ѧкDkϿ,/~|b!:cc..헿 /|N6quVVV鬪P"CHꛓ( ]t*SJ1?ⓟ)Aeuu"/oY},ZfRr0A~I n IDAT k[7r"#z>-G7K1̹zi”,.>/b5}yσ[-vvvy]*DS@bM,Gfٹmp=YP姿;0m 1:vH T k{׽k4=:}7c+mNfue;dՠd]7 ]d.KmO Q Id+ˈKW-x5H)1\gTϱ[݄p+HGb?!ꂊeY. U ju׻bpx'F +sO*=t/Ð޺ȯ~s?s<4M8… [O0 y缐IF TΥK%<` "%ty*ͦ+jlH( a@"I0*]1ڥ\p8ȇϟ_$cшQ"c,/r1ffn9s~_b<SzK\ H^ϕ+W_PXh,RXE,,@Pbs a eV`V{[\AF^8I{9*1"F^FVdoEZHfc.߹?"| JaҰwcwM.r(x^֏0ˌF#af,s >>(}|g~U^yRl!盅ghltYPEQR%eQpvRȪq6( $IbဢSs+J{ҙw}TcyKUGa $ke'nBP%߮j6K`|6P 9}|?Ovzj'.m ( _Uu`jI:UBERq0\% ȋΜah#6/]eդniK95?- "6=fmI5Q)99Ր.(ʂѫ B7A~MXvv )ij5J6M g5*IӔ#i~o`eΤEU}jU/cW}$ ӧOc inr>WXZZ(ryGYZZ ڈ,P.RxNAUݖm:ё}d!hJIdrȠS]0 @;h3)tv+,8 0a4:!SG1@) -Xo`l-tf(JŘk GW :UWbmun(S);.ED,q'h#wZZgxs֞GG׿ƺh2H␼3rYV*pfR ~*UVB(ڌ ssmtQ@ag<d3RO*|EeV )+rB&&Q讵JLe5R#~K`^o@*ϾBp4z>q@Qhd)ao HuoYNl1˲ࡇ'?\63{\Ps흊]%~dmmWe mEN!i$Ŵ 59Q: "9w{$i$ ˗ɲ1eYwrj^I =Fa  \;@́[TB BIeCst쿍˛px;o?׿"if= `Ԏpvn+ ,u7 A[(s S/0)%EɝG{2)y0M {ζ8~d`,s#?$3Kuy?L5K wQ]zΞ b֠Kw,=dh>TҠ(J1N9) - r"RzKK՚(*qLI[z?t_"9OO u+s0}-&g-gYi,ePO*PIYJףg&N\ĔT E#ts#DXS?,> 5[_|V THosbi68v8jxϡh(lvhgRqcQJ(y>Wȓcq~V;% ff EN.^s^{ɐ(BeNz0EԞGec!w+㔰! ]ȗQJݠDayqVk ʯ”T c,L2L9Y{t:0@>8NgwgFh&TFBǘ8ic 'OⅫH255feyxL;b4*N<'vJ >~! Oj5ȉTnWrP ׾ʃ>{?<'hΗ'੧>M$OXw݈,s" ;ww`ii;+}PҹsuVqP(Jtׯ Ibb\F P^w_9mTng lll13;OhArSt}{A e\6ۤ\JxU87# S2t"оRV+@(){OTŸ7|&K.qqms'􃄦4׆<$3wN\ nGd =)e;@vrJP`K!ȅ :%5u_8}TKsw(EЭǻCfS65(?8U.+kӒFs81\ì,r(ں[[ :XCŢ6BmZxmv1NoIv*ܾ*_e*zԨaN~FHw]b4$#$l.B!FlgOf֏C!<[,/N.YB82=M{9v/,K8s{%X$`U罊7:r(.\1|Agk4!;6 K8#u3.T4s>v;s_ӿɱcǨ)ܱ_|g[ ^eq"/hZ8q i6>pmUrJqX]qhcF;U9N޵H:p?{W4#E, BZ6Ɖi(E8l yFeDBdY2^cH1XA4i-.Ӕ"yṗ]^/^}$au0?trOTX1 p2r ƂDRjf8wZw BvX|&֠AySy<$l9.|WSP&* Wq?PzK>Ut0NVWV}R;2Wdww,/IIC.vDg?~j51I΋JZ}}6&?_ʹ#3Tu뛵! VJSYk6YFK5qL0I#$|4BɘǏ2!y )MI5v=w{G!+%QJ$$*P-ʼ #FR{IEAƄQVI:~| DAE^P#hyF vvv4[MfFD}Z&hT8Ľ( .cf R'I J)u:ƙhS>8#-rAg)(0$PN]O_{?}vq6^fffɱK~aI [Wu e邙6=?E>bl[I 4.X][%3]`~~4Md8KUjo]nx̙3ThUuxk8+S wg-|O{H@,-VVV8~ 8I6..]$ǜ={voﰽ}õ1K`@Q:a‚D?<5oyE:h MB"iE!J}Qg9:%9#K\9̯84z] k cKaH;S ˔#-眛_~3:PmYVJlYG%T0K<ȮUg$Y %$CiD @t7:7TMЬ)p>{o}_ܗ@}tZm_&;zFM!4aav[;N8xZ,--ac6/! sNQ(2Vؼ ϕ f-Vfؗv:g-8!J1uiUJ[ʔoh nxa4Z c)"7bjInqx JDW.ymM^H ,I"q$J^Xh? ka] ᏸyM1$ٽA!$BJ&!ksѠ7=5d8{EXNW3(X]ZB)I'ȧ>|z:ceEf8q3/<Rt㠵!*iMi]P%E4m]0)sNto`xD,/-!SR y i8m=PNuF;Cʪ$y=NQZ1Lt,,,а;.;!uQ$C4s \٦h܀dAo [[IptB%[Ui8d`K˫_};1oϑ"js]wO(!>NHRd1H!c2!EAUch4 6Ņ fcs3??h4d +W.jPUu]F)^BZgygii*P*e4su- B!y.^D&\z%V *"EJU(1* $o/sFrW\{$|BoZhY B!CS9ԥ-}:ǛF{nO)[ZЦ6A N1֖P9`6ASlon"TGut, Ewn j0EMOG v}($5[,/Pymnqޏ\Q9:9y]wp!BJZ*'=>C̵[(J&I8cZLhwR8 JK-Lpdv2-DIYdCȒY!3816ҧR+NVj*aa6,xfUQ*NPMlO W.3s5~)>#K8EUÇɨ538!C/@ 胟U&G릕ݤcil.iGan;ߣL|J+c7`na|:JY$ss&^p ȧt:]vt;m,Z(N-imLRg*)i b$JIV U]UkCeB i%4c4=d}s c ssN[ZdNd15^k:7z+7nyY\\`0ף+sI>W.]bssNy!pIH2z$NZ+dgg4*DY"N jS֙odeeVg_p)wt\lRὋ܁ =֋HIK3V X,օbk Y2 7A^%>\ǟ'Ǟۙ4>z ꄛI H;:ak&Зk--GHB2,I@k:IFe4/W9W 3-TpFcTM k+kVj+ڄRK-MJQHϵhBNjjE9If~yWx$hBk\/e"-T膩1aEUGDԔeɴʱuEh c-K"F@ѤbOn0a<"2wZ! F1ш((*W[le6'J2߰, jo+-m(D+4a7ֹ+ p%Cu1ې 1%؍7/*?d- "_[{̺V7xxP&tpα]CɄ9=, OUEfc{V Nr3n=Ƙo= V›z~7 w2gš5^~G]lo0 ǘ[n!I5$*2%Xp"B`rtyΩHcm3L١۟Ce)_?y3~֦=,MJ*:vǎkU]8m&eQ+WZ1Kcqg??āEj%YuF;#$ͧy]oĘn /ܳo>?[n=ŧ>)[6Nzj‡B9R _P)b2'uߣ*tCU._OLPZ1ڙb( 670֠T(ϹsY__c<ְ=w:2Ԧ(U#wnvGv﫦G;eS@QdYp/VQJLKߥI"MSzR$7tmo #_JU NNa[eD<}~ةIKX!Mt%^2B0O(x3$єƢ.&PLl[4I/ N3Ʉw>y<ӥU.rb_{ ۚ(ވdq KRCHcF@eeǤ^^٧^?^cde  m<_ts P4!]HfTmPa ]7%~y{K<ϙN'CIH)::/$-vܥo0ޢJO`<R*СWI=ƹ`= J Ȑ2pT2 _{[,#J7drcH(&u j -$%"+S2l͛ZEd1rR:%B c:Iq9 HYdƓ4!6A:4I3`IVhjclu(ʒ(ٹΤogu M'nk_25:Wt [;_U(Hiw8HUU\z,HYUsdx&%4&IFiGyHH1l]/;Og0dYJo~^x%q* Ѻ®Htvn:6Vgx}9<~У?omqpuN@)X-YB$NԄyϝڵ,/p-aИv;N8?q'nHONa"Zm4TC SJqEsyVs0A?{]$s2hQ:a8!$Ya"/;yT@{衇P* |Iip8>p8˜#7[On=cĿ="O>8R >p5{HGfqqk {-&(%IFediy$ m7;nBfm`G 3KK7/Wڋd[1O_*@67 'O!T(BPQk%^(/()J&T``JeXP1HITa@0%@xq vQNq$ar~돞?{nnա׮M?1v΢l;RFPa9M(f1-Cwޓ)Z *Ge|CXJHN$T›9me|c^^̌Hk23 ^bi3ɧm4 {F1/g8MeV@ 鞷}gn.J`nɴ`ya[NB]HjhE,[cl dQs54a4ڡ보DQO9s ;!y3.+dk .V$'Nۚ^A AUN˫`k$M:L@\[gkkǏ37??O>P/. ㍵ iieO>_gbJ+HuLnqi'7=|O= EQJp9}Q~~'OZ3xsΟ?g?{/7=cvA$MS,ckko-rdϲZ$ŧ>I~$? ސ(-D/ EpZđxok`cfT~3#ğyt0Sr>@RMFi,nVA%,SzK "Bkɾյv4XǗMn[HM\]ZF8$ScJtA`B0E{K˚g?ǒy]?{n'~N?C&u6HLQzI{' e .L9҇xnn.n@*@07)DIH8 OG1Jx_"QA u2Т.tD"3T !5ViT *XG+*k)S 3%MzZ/v5K2M{V@-t` ϩMEUH8PYTZcxOphQJty"Bi" V4դiBLH,)T&&a[UR!i Bp pBvvv$KpN̳ϲ٫8|d}}$˸UFKK8iՇbq(& B0QIFF9M #ڰIJ+ p8dnn#uTYK;mt3Ou(2iE^@ꊖnEARvʲr,c^^pĠףeTeHp2ag2bПc7SOqExye~4ɸp{5BPU5`ʖ}?U4Iu!(s8u}|;Zk<-,<Ϲ;OƜ},J'LS&)Y>LݙDvcu@4ͨx"u^/?n>2{?U L&cE)Jqί%i2Lx׻[TUAJQt?30 @&c<طWZ^%(MF9AK K_üyUu3&o\\DdEO:+Gga.D0:aqixB5i7C YI]x7;p]~-/ojò,9t-Zt %-VnwdY/|3KW1: pJ=p6nq1ߦt#U᪪f4 "r@C Nbù'u hvb M)̘.UʐB#fu-;TCrą,1f(L1JfX"@*,x_ZacҦWA'^9u*x'W[tp@]2QˊxR`⥠NLM Wvi? ndg$BaLhv!Nq3!BUJxxN(Ssx|28r&: &#*S=̡Co桷*i)E4wz=}ibJCI5xx2f4iwXY[e8UNHJy\[۬_'4x m!%PE7{B,'Id2{~闢Ba;њ~~{" +pO*x-ٷzZ0BbMdDThP^Bh-ӽ-)8D$^&PcEReѬˑVut= ra6v,1`Jn%?OQtgt>wxϑuzrYjk#uYO%#AMD*ރi**<^%Ez1&e _uT%JȐPN!c% k}YRHO)t?;iIM/T\iEXfoN`ƒ 39W#MXv DasL4.K"DM69u^m׽C\8wck.]}kX]]c83ͧ\tzGfnKϠW<qe & )dmOc ;_U=JKHRɵ(ob}c7u>[WZl]5nD,8ʁ5<Ǻ bʚv 틺N iQ2j%AB{V]<~GЯHӔ2llnRV%ssuɥ˗1!bs8f8t!^x>wً/N6LG6ohh&\pO?bmmcp?f8N#=Ni*~%ZkRf1I8ZGlmmNYKjM@)FT/_2T8yN <|+_ z3 6!j{?>u]LnBB8N=Y__[nS5B&#1ޓZ`!.z5#>H7dd5G矩?쟂1sT_ DŽea@yOs-q-_}Ȱyi:ƎFq~55޴}]:|t@%}\ RdQ6-2J!UX Y aX`XAIGEnM@LXcƟ| be>cg< HAG[h =5A׊+vH}X*UIU2A+ B!tX3 Of@Ŷ۴IDŨu&J1":wXmF'Tu*iѫG$"!Րml^ce'` k8<4$'"Pe8##&*.3"7{&\ t>L=y9bGRؿBcaWz ^E$;[[;CZZf4D$Rx]n$\D"F!>ıC)&CI":iMt!IӄVs^8fv.Yyų|տg1HC5utA N4YP(AKv׵L6ltRZk,/c#$0%4s ԕ?ߞKYBw|n48qӼ`F:LIaVϾO T*)~ ox>U)˚,^ [9oJ=|iH岳J~F|cc~>́l͐ va,p:fWryPJ톙ok-:lL3E3=z~;vlki /<LJ>!&'OwōoHJHݦ4-\pX<{fۼߍ2Ȕ*dOp ͦ 0.a~fvBRZTy,MxP$vd} IgmtFepi/٠YXЦDRlq^Yb.dX zEZ9je8N}M4:QUt oɔP!Lf}aC^Hw&2= Gm}j" jCNSh4ȶ(˒<ٞ%Wg~(p4ٗ_n:ܖm8qg9{N?񻒘ȼ:6*EyG;ṵݸ9}0 ymnF hτ;` '|{^zR^Fb-}m4't .^:Ǹզt-#ɓIS+*zO/B"ulDGP5崤Xh%+!:Tnw>&bZ`)<{usn*%Md "E хG@o@idf{E2F68[-~0~x߻P&" &7Q~Ϝ?7~R9u:2bE5jrޓCvvv$TU4B0sힻ J-0?qiLm(i8焤=kfgXJkd 5콈zOJwϯYYeux!YƱGOڌeN"k%TG8(4n@k[u2ܛO={^31ճ6(&$fly=3 >$,6b^b{ChǗ^G>zL4IyN<V4QZ\Xu]GWx'>A^ּ'OGtCS9_z}kIћvx((W|v Lqjl6*1#5Ff\\wT0ˬ`$H`a86PYI h!DTHB O$ ႟/ZT)T9ʱZ %X- xsqӴaoI'B(4%kB>04 `s~V0?ݫ"(F43aSHeIRO][QpilUlrU2lz /Vx\XP C2kJWZ(Z"ġt8#f˒,Ш`Dl=QbDj lkld[B]:UsvE$x3bUt#0-+sc77(rVIEA%tݠ5>7hC*ʪ;Ϲͧ$ џ[$ }jo! 7:>KUE>P97xd̑7ν~2 *&ѐgF(I A)C16ƻfBHT!RqLVHtf1HZyt*gXlml KRvCN0J铵0$X/a߱PmW8"kw}wpa{c.&5EY'!+n|Xnt‘+P%uX G# 0BP%:F)R)+ggk1dZ-sf)*5YUd*CG4[ ғ(ajK*0K=*8~D!9e !q;RM(!auFN" p&x*F8cIDdPBLN!I1VITAOILUx~auNB%Rۚh Ypʑ@BDglڕ.@@5k9$븱9 0"4 <7=<(i$?7ρÇ9u]ђ(˒pI·qV`?i8?):>B£~7{o;v4oOWO@|5KF,1õ3 >./pAKD(:BdD3i;8>sn;1lnnR%J)>O} 5.]F{x?3۬ll2x>67~!Ykuz@T/[qIo/so>GU BY3"b|6Ȩ!. 7t;s,c!9ZiZ-%ψlҁF{O]UԮ@T^R ADUmjHB" '%#_TO!*QA8Fje7X/Z4It42T(|| u !6G'i!oèćcohF3U.j4$u C)paCTJ͈κ.H5xx]iT`{CC_^.+<{}ڇ!"(ȶJwT&u'ke112Xc'9[[LS^d:͹շ㩸p8N; !ѨDr5,W29LL˞'ItC{~~ X6VZ)p'-XGUWd8Ru$#zof &9>H >)$lYV㸩y=? (RCW)"h(ւ\ýÍW_?| cSh)`}}??֜>}{yǏg:yo#qAB0ޝPhaHuם{m$wY$ɴX$Q,+,YA'HDJA^$yssnH'v2m+*-YV^).)Il]r{^O˥%Kxs~w~#J`Ю|!# v5m={qr`H`;,I8Ș$`̃0B!6mڄ,5FQ%ծdqnV%D 4I ,^r* C )jk!d3WXHY_yB@@,:eD f0D%\lfN,DDδd'R0L/4;4T@-TYFAD,̢IX㹮: ȈMeYDt$Q')v2D4ͰBQ-ٵDQb51pv$,BɩdC&(dIV뺁ޞ%Y3ډ=ղl/u KCEҴ_If٦2|>t{Ǥ%L֎w~FXBP|0E50 vx[:%vl4*333MC"ytѶEP !ȄM]-xy3W:NiŶ*Zw~_%z{{hiiarbY9%Ks8sn09uMyaGQ=ʿ˿P(ةe۶]* ͢89UE\XeZ[t?d*, C8*j>EQ*(ck2 f8sO-dNy S3TZEܵj[B׍kBw.Ljt}vv*P(L$L*C!K;EI'*4ŤRɮ!Th$p,dv`&i% 1DтM T(4-L;S+U XAmܶ}'|ޮˣk-.ڡ(] *0 i(I4$25;IҔ+J/G+2FH8^.X* i;XΤWt0M Dɲ%;n -; Hj,,,KB7 VKlp*rČƕ9>  XJS*ڞP? SpE[g8ZA˵J(j)+l7d?Z-9% vųozq(Jjf膀($\0|eV~ @>g69eAbUb1b(ssYq2,P&Znጋ͠z#P`0zzض|&GS~NT.T4Z @<' VeFD O:T*!sss *Fgg'zɵ\.311A,# z\.x?),A۱iy (DIAuZZ1F3?7ON(*O! bM (IYVmL|YX,{ ZZD?l?KWEFpìHlMX}1L  {vQ2 rː'2bqt­[naweLh$_[gOA30L4ViϮ/XuJ*tvvp}kEX,5L`[]05/e0.F˜cIbxh#o<`D5ege9b`yB5⸬Ett(W E}}T6K>edGRaxtM7 ɩIDQs]7-mmdSiQUDC#zQԩX۹@^-\l^]'0R)^ۑK#/ vAQ+*bWTU~(dY zz6 Ir\:k;<" D#hZG0"uuQ/;O>4}}} ;eaj"n'~nw'lٌeA:`k_-xekL.4ͫh}Lc1g kslŽ+heǫV)5a'(V4B>[E|H_ءH*/[mYR(4 $;װϐJe/ %`9jRT%25n{TUUQU?@X$ʚ5M'QdJBL6Bt@fE) ST@8n &ǣU\eM P-]W֍㠧rQ0X~M(J$\*YH.09;A,c"mvTZVءDdvx9ԀIP~vld8N?eX T8*V 3gNq[YBT2 a;@bEUgn~;n#c&ѺˤP;j['+ (nH |(Y4.·'urEt]gCΎNZ6$!B=,7M[I fJ*@q>s9J:X.ױ[H|}>OG.Bܔ k4QdXXTU[].Zl S,.;+vP` IDAT1]B0z!TUE4DT$D´4oy|0 di1@uv:˲|*fwo!A&baaM7<տiͱ`!b? Lh0>U!P*!Pټ~oHʥ pcaxGQ"Tm0LJ劭REk&rD¾=2ZA?k::P7H=?l1QM62vEIV[}Y* 14IEP$q~38U0W;4EAUed ,JdHja-$E&  Ecb1B$d'8a;nS NKyJ$ЕB"cXK~_M%k/n¨>Xi`ciK/'y#x[}c+0̋FX;BY\5z61==CSc#r5DBA6[ZMGTd djj` A `.cf!Kn(|gD W(fQJ \>OsS3"# "sA(3$Iˢ.# +s؇4iǧX䨿#6!)m>II&Sy ]g.eLMMek.dGX>ih;og~~y~?χ^x) F FT!^G<(ljbQCRIDQbdo,f,B>hukRAE&ۍDS UvN`/4R(Q8i۴LS]A KDɮ.'>RáMLt=47Q.~ j[@4lS#133Apy, Py/.]slr#44r P*Ub~~P(H8X(tQP @gGjX׻l|sڽH$B IQ%-l:&&΅);nŐa9At]' 4b( hI9YEl Wv 8">EC hg/%YFQT,LTg1|i˴%KpdX&R;v}Ύʥ"9 -pd"0?S9}n޷m۶oNShc- Ϟm1%&1ls ,zݻGRa[ '*'Y,>ǾIRܽm+:lXC@,VJB똺N bǮ}l٪PTƎ^{h8<S.,o즐1:>_T1(̱@^Q YYhڪT4h#e Wk,T:ÑcǑ%/, "1&1Ad'lB:iqe"} {EӼc _]ۍi[^rXV(ILOr❷ohCNffH44&DGc'n'X%M;jY&S6 Ό289E(BhYtsYtT`ئn 2$*rbHTsyr 4 [aL#s)ҩ4= 456q0 sضNdmZ>}lk%8d*MReMdKVcEpt,$`9{l:z g=-!ִLZ[شygrvtDR,9q`NO.:5 K!ʒ*fYPȱے(ALð(R?{M8VYo|-[6Q*P;[^VEdUDo$ݨ`Zfݾl&C(sg2Ԭ;p3D)d9 ٳVXnsa,.K WٲhZUx0J秣@@JI PI2B{X [HE+2(ю磱 l"3::BCX]5MK%L]gPDI&T4T&k ,0`%$IƴE50dD,ʍUA4T@5:::%1,kqH]O6/ Gt'YƲSN:*&5 ^fluݜS\Lx%uk,I}{'Oo7FDz,f'(KLN+oPNj_:[mbY&]lذP(a9T@x<&HtӅ=VnrEQsSpBJm&qqV*A{D>C/S+v霩aa$ IosIWs,zYlSbU{tΙ(]# bz& D!0`\F,ykS߹(RM,ɤ0LP H"w]H*yf'hNPBwl,nI˚"dR \هO,ٴK*y]ǧ&T4 ]( IrKvi\5*Z[ՏSRl(lffCtJ%[*Ü*H蕲]}QC]pC ضB,V͍NVݨ̆P(^%E;9=Cɤ uRJ$l}n޽+3w+Gp"\.ʒuVZ&xEG9)$-6c:뻻v.sʋpȒ#IJs$Dt"ˉ7$?_,;rsQ*wk8Es#s/K*0e"'pAT78~% ҞH :U,cZvIN.۵> N!,(Tma~gȲ3;0&SgY*s@{_%h-~`ƥ'na>UϾ+1J rJ~9q jǁqn6_:^Ip5xbqג뇵Zޠzm.j_TOy\p4y O:t3 \Wq;7xj7Kh4YD3>En'GeyJl5 vs4Őg>+U}r鰵_6_#D?j?[Ug/,~ߥr2tI>9wչR+>/o/,>ېn/cyֲ?Ng y5+=k6?V]_ҩ^'~uvs۱M(VZ>,p ͈+cr|%I׋i/"7onzVj\.{e[D"ԻVBH$*s ؾ};`pzWj  hT:,}RލM[&JQ#$-)Y՚cYk!)t]d"+˹QL LJ]}_#5P ˴k$O͔J%4$qinA'd||_|!N>ͫ###K;v%[nRz)OJT?9T{q]]xAN>$Ik$I8 ,sa˲puF _gXչZg,ֳqA㭷bnnRĶmrۋ|󟧽X, w~w;inn^T*ttt0==͹s != yGB]]]^}bYFT*aY|+_a޽?Mxwۯ(Հ(LNN[oeZ3fu]-o6bJU@$9x a\1-˺}5\Mf-~9e, >jMK ò,֯_0䮻\.c&?>NTcǎ166vޫOz/)/y1MnvE &\$o+p{9OQJ׸SvfڱRgۖ+T3+Ѣ(rLӤ]v!UcOAPUuicġC& y>uN"x%ihh@Ο?O4e``'NDPUAΟ?$wom\LrBC4WTLE:ģ>ʶm8z( dY=JP H0228'O }}}EZ[[ghhJ#IDTcǎy4sss8qIbzy&&& p$mmmLLL011 BD"dY7䗿%<5mqjJEt0H.H灲,200@kk+=jxx3g *'OOL&MCCGellX,F8Mؿ?===LOOs:,x|apqO<GEE^z%Ν;;COOO>$R Q)J|ߤǏs֭[s=G&'X,H$x'$SNĭw%}}}KOÆt]6|Aڨ4M]w1l`6  Fukb[lg͚5b1֮]1MK5t]gӦM( i|;su[IHi!NSWWCu:;;F$NEǏ{Q9uǎرc?8w {c=F?rs:|ikkq8@X?k׮ɓ|H3d|A^|E&&&ذaΝcaaǏcB;3׳}vR---Y;vp!ضm:TA쒾ɲq'N pwr1$h4ǏGu/4MvͺuX~={/]]]tvv@cc#;wdȲ=wulRtckYuuutww{@*=8M㖹t &igTkqn~;vVr"W}eYK~7ӳ_,D"qJ{n۶!2CCCtuuy5eY܃矧\.sYRi266D{}˭wN*0 vMWW[ő#G8rHD6]ٟZZZf\A`bbg?f׮]swrIr455|;v "cccp1A`vvnC `Ϟ=tttm6nOs633EfffczzQy!HP(Eټy3===۷vH={az{{&͒f9,6Qͱl \}V ܹN%i{{;>,ŚX IDAToMoo/[n\.C֝哢i7o&oik׮e޽477S.u[iYn7n`ӦM|{9s ۷og޽{O94M7]׽XRDcc#/ݻw_'檈{{{Yy@IxW@$:::;s?KyGd[믿ѣGٱcsss4~zݫ=0EOd(˼ ~k~xL$HH$+_yWW]uUU4 UUٺu+_җ(J|>y=\&ՐR~>N[[5Aĉ9(:n,ށ,I.\  T]u4D"2a055Ewww >}gy 6?X\155EGGm`Y`}?d͚5 >}][Ą׿:ug_ٿ?֭cddݻws 7ÇihhX\~$qTUɓXnu͜yZAfK Lg9s/| Ez)Jtuu[oq2 {@%Fy饗<rEV0 {9֬YC6eݺuٟ`|AdY{5wfY ]XXXA$0L&qmiGb:DQZMwJy5r9~wXE.쪰adX,qn،w*"؃Wpʷm{1 /9HEYEE9u[lmE.EQ." ,o~G}EQxټy3@ڵ<333CWWx_[n{}kB!J1ᚙtUU]Qj o),{{X&L&㞤Wͼ(KTz{Z(riؽ{Z]W%Nqux9DsG5]בet:M0\T +d2KNv3z6EQرD"A$Yrʲή%$Iرcβo߾uf,˗=ǫ]j_ U.pxwu^\]jn2 -y^!h&hg/sF$OTՒ LӤP(D(f\.{E.\f<477S(8{,4g2==<|K.~&''y{)ˌyioogddl6kƽ54Yv-x;D\Q(o^THj]]%]޾磹UU/TeMkkBЧH7׆[-hiV:;ab&`pp9mT J X6/εa6 /Q׭VCI7~7-|>GK/ĩS0 I`qu9k[Ԯ4:>Yi>dY<8]/ qJGGpCe5'J5W={nG,|>5s`(TXq/Wk׮%vkc| i,rӻ\zRAQHyg?㮻СC_o&ez{{9|Ftvv.!pM,&3==ͭJoo<ى$Iל&nwY hRGz$+zd>OcW^õմުMMM^8X*b͚5;wIlB"`nn>hhhɓyLLLD&ыIu?B!yϛs^2QIR^үZ6= kհMI%JT:1q7{K{Vʖeb۶m^d~Fo~͍҉ժCaM:.R\ʋ}y^j 5^u ˲Yl 5Pkjj,\6.kj r{u.K]K] ,oJ9`1OϽ7KB:c_K]wڨe%_5.g1sqe%:j|9Ծc=ǫ&gY27DQ$ˑL&uX nZ…DQ0 FFFqJӌx###kcccLMM0>>,f]ljEd2I.0 4sssvȈ7d%E]Oy*.\;L&$.\p˲,RbQ\pȷ|O(pírfffĞ?ޫ|yFGGcaaMP( 20Md2y>WcwNNNz=]4˲d2yDQP(po&''D$Jϟ=ld2J%릦s }97,V"pccctvvR.fȲL> =nv$w>CƮcxxp8̙3gBLMMdBؖe4M#077煇mbڵWjԠuM?==MR\. H&J:8O0GQNǁ J%>Lcc#ap)E`0 ps-( b49y$~A8{,L& py|>CCC~&&&hmm4M[91;vX,ٳg"x*D<'B@X)CKMoGG&p9 hF>ghhx<ٳgihhiW>wbbϓH$'044kCCf+[N>eYq y)RUUKj W466r 0^t:i9wD@ @\R`YW455y{{rrn>x7p^CUU>$I={H$B2ٳXʼn'ظqM]i9ܴtttilldddfEOR"6mF&''|~֯_Iݴd2.~> gΜS,9z(>'OaÆnRH$B.# АWdttP(D8fݺu @P`vvv* R(tww300@$P(P.QFjpY=1HP`llQRG'''YXX L266F$eDQ$3;;ڵkiii!z ax56n< 022! 199ɭJKK uuuLLL`&011AKKU!.av5@o( G% 2< ~jȲL `aa5kڊgvvOxqH233eY222BOOL&ټy3:4ud2q G˾zzzhnnfƍKrwA6nH XG_רg*tttx 4W8cUU)Jqm8FUUOJ_.\M(͑Yf p6m"xFٸqM~s{ss39rēF]ƥZC}v~m6lpQñ\.H$JO`4VJ$ׯkײe;===K͆RūX,Fדww(HWMUUN8AooEjGZkii:6nܸwcc#7oL(73ŵ]s娫#HxfǨSNى(LLL܌aȲ̑#Gغu@6VI:t]lyizE>:Іa0lW̙3HD>b( 133C>P(x,DAԩSuzzS^-UkՑd0 cI~jM$pIx1Ml6K,c``;W JU% |S3~W4M|>Mk/[ bP(D.p8D", = (OF$X,Ninn^R[ySqw~RD X,zX] ˲pS ɹ9ObrsUBfoyBG ]?\.GKKg{{oNV*U~rLX,(J(JEQ}3,rL  N{EQRJ& `zzD"eYA">MȪY`wQݞ|޽{^8{OFDX\\\9Nc7abB|an}278:6M]l|>[˛2q%so[sO_Wzi\9:go=ex-r_hPwoo=|c|G>z/~A/VʸxząbJ}u2G^h^7 ./[|gLRc|.67/6_W\_кؘ^ &roVScRǚ1SA3W/vr(~k b/_Uۥ፥]k) _؉1neQւЌf|_\u4hРAoРA A4A 4STJ3W/vbьFI\\"hĝ8CD6%nEQȡ(o$yg_y6dv"2> ՇGKKmW{90 ]O` \.<}{+rYc$ > gv;,/]9>o:9g?Y/Vr<>ԧЇ>A%kK_Ҷ*mpe1o00 xwU vG1kCj?#ٳgjU'>o8L}B)55*A :Dɋ6QVQe_Xٺ\X Xkw&U cv&?ux:!iDA-("&3 a(M hc8U)!2(P30OU(+Q 2DAx|U @-CՎBD+Q'A)cc![Q÷DJaxt (X,T&ڊ30b`PHa'[`Qq0#VYmw1*KN//%-zB<CP^ I7P{{н]w2|Y!HD,qx`Pncw:&:X-w=~?~Uo[;,{D y)2(, %n`C AP(p%!-a%=oM%)P"Pbv{2#Z#.,`FKJiez4hp~lBOӔ^7>^r 1ոt̾6Q˨LJJSAT px֎N(VQX`atI!UxW&O0ܗ"kE& ͵a5P(uBL,cTBK[5:TAHjo#N(c%HlcIELPKMq`$2!j%)dnHub1R-YUT F)&Z!(c R)ъ [ѝ:"ދQ[@own8@aiclO,ˬoqVpn0v,ib(C*t2GЉ1vT h_RZ0QPBGchbKŚeZ_TL˱WZ^ZYkVhc ,="0ge68LxZaYж-F(5!6.D (9"`@Jq2ٔأ5*贘6R^ip#,o= IFv%* g<;T`RJ޺C|N_pQ9 jJB!P f8`u4;7Ǟ BΈB1.`{iB(ɒn >?r;Y_z$xl(8x\S13冡M9eJ'1x%'9-NXxzC!ÜG8]XR 5}ž2!x 2''x9 <=n6) "_mcRld2N: WV/R!Ah̦$6zĠb,@) ZuDW_Hn!3-!y]E^࡜fjA.Zݘr/Jl;qdV)㌠XZenԌmݗvFSƍ1Q1%Tjc7$cAAcCcAAKI}YjUr`\HVGd W]TZeT7`kx "uEU!C; ǺNo7ti.tzڐ /rvr%W$ŏR6r:KJe0oC C i\a[ j 1l $hY6NSy\aMHg)/8F`i#dcK_]@`RNzφZAFNI<=]! Jf/G=yVhG￝QZr/O=}Qn&Ct÷n`g7,:O/37ѝ}[zU99Lc眯B»qT鐭}{A#jLQv*i+ia A U3 SqT9u;&AMM5r:Zlz?~![ۡXWYo1R|g U4TiVG(x5[ߧ5&%Z!(bO@ "}Nvb'xx q`W9ڟ\qbbDMTjU횐qxT.Qwة!\mGRӚU ̈́~ά2ˋU'e-FenG!Y'tQ|c Ldb:iB ae4 0(ϞXHđf\zONZ-r&Kh >ܾ|Vc`dx^Ivje}o"d=ZIbljuh!XA@1p GrOAs-"PkLT3TDՂ(PqK#j9u1ot۶4 c23\}(1Y٠&ZAm$w5(j͆2DaNQHs҄:h[7?XlbUc ZApcv׏{Lo늂{ҞhIǠDu}L7Y9cG+B3!jv3NΓQJ)U Ai9xCfkr.!ytt],=e`JևD t2OQqn:wkS5 pˁx >8%%e}y{T<.Y -rEXupfAgYhQC(W Jka;>A溝1%\VpWg`tgzϽH$)A?*M&4e4oOr~]yCvA~SbMkRCBS[_[ViTmT%բכ%sFEZ1?>`ui?gLe`7XKjQN>>CE c`e8p.+zA*3FasC xA\\WC1]1y Dzc4ƫo(N$b!Hx djU+?ӔK]s_S *3+B3)P!R_ Bab`[4g !`lT¸# * 'XGq{ U7%CU ]|M,CPݴ kyqWA < #1ZbaB+_PR>ȯQufT*E0T ޚY܁ByaYZ^%i}/)"M:]NN|-tY[_BLp4$ -etqiؽo?gϾL?OҝwQB0C[8xV?Y YiG 6Z}tb2c #KiRF'#.@[X.=MclC .A9f%on{tWC mќ"3~vwg686Yc`uG//wK?}+dJ$ s.,DF|tBlCZx OYc{ J]~U pc Vg][VBA yftW LVVzrL[R'˨Щ T'\" h]mj^ 5/VmɟWV蘚Oz36*52|F4!HoWjXXJLa+j<cEl:_HpT |qQTނP&Gp ެS*x4(jM5W6/qlT4%*811H-kM_B}صbPSԾ0 *6Ȉ0v#0PG'IQ^>~AkkC"|UVFz(# 9mC^i/s˭{y{׏{K5-WX>Į ss d2$Bn%)NR CIOdkUڜ!0oc_.BsK'k a#I:Fy]>M,# "~p >s})'dPRrLab%(%[81R H3HrŪTϤ1.UeNQ1b0__/dY:Y~#/)uI#q>gʗٽά((s@g$IB$ttZmbDzV6-~ER^gm bqk.Ic1Ԁ#r-:TIaꘪtR%gXu&qTdTmm틘j%0.x^M4m3HS im6NzlmIX$.޻bp %-zT4 Q 2%MԶ1`!C|L$V{ʺh0(-\3RGNB|q^QW#zخҗ]P1+jōϪzzVEj>D2qKPVV[%X,ƭhT}}m pY(r|n}],K'sň4MxU,fqZEH`@!<2|/~K>iFڙl ) zl˜La1Be82,!3!CkԢL Detǝ&c,Ib< 8UK ^8WOҗAN2fN. :Wɭǫ%O `0{oǹ@`mt2;8̡bL$ 0J](&QNvY' JY(Jjcuj>Mч9⌐&67o=Y1y2-+wGys 3a>7_ oP(O'iSP#h)BJ"Q)A$R=7FڿzfTM`&$kN<ӜY[gqW7pAMx~M(g"'OL1gqÎ`˒ ]aB`TxhQ0 G8N1.m7ڎ~سos'Ycuu}c]/Ɔ;KDLUҙDǭLQ[ ENujQ,m5QklW 4{ȁQUITzѰ[$IHN"&0j}k_FiKiQ=#T[ƚC̢-j%`Pe\àZPVƽ>< 3rۧPVPiႊR(? &PBRbZP,_%i'=HR!%ZlDZkiw:@ ]]ǾYkH/<]^i3ZiBjh]E K3uhȠ(%Śik >[YY^p.^j2hw{d}7pIfI ^m9"g|':eBц)mR-8qlvݹDY5d"aa8X 9̞xAoԣlRfx Lk?}NM_gw+CL'&"c`KHGwv:̴:$;]Rf8WC%l.%:z8f2b,rsmw@&5 7ֹcǐ|^Iz*,e9!`PQ燴or:2Y@,FZD;H4 UfCѐ%ؿGɟ'~n&'?{rc]BgF7کevsϽ7)A!IL؄a8"277^~꧶-_3KMo} [Y)!ʿLu+0.߿{g,d2(?U8R7:}<ڼ%nz^TR꾩NuhD$-F+eqkæ Ձ:CNmblp܆?ILkR5 ђ05n;1 зۊ>A cb̷VRE".#O⢛A%LtEt7ҙӜy8s('E(h :c#e.3nc!p % L@[3gYl7VNj2cKS9I(H!0,zY["a/9F#R>ypb_Y!|Zz΋@"|G iňRVҏ3e@(R"Nȃ0%(Xc0K_U 乜3?jE/}d#+;~@ď'|_zZi2xw-PN :CxIg^\vw}7( z)/|gӵoy[Qn6$ѣ|_Ge4Nwp-oy+4U;3w]kѴ //r=LxqF#yנnf>Ogy{1~9r'NWW?9w]q)).Ϟ=<}LJ?a~7~J6A1xcؿbr}sGG+ʫ۷O}S> > Hk8ھyꩧ.&Ueaax%ޠkF7xM*Nz?PO0F5;ZK/\{/G.Qj`Ш ^S9s|'^oor+Բ xVtcSJUoԩS|ӟ՞E-3\V1Xߛj{??̳>{%ՠy Y^^]wM7ݴiUU,;`vvvmI|US$Iڷ033ýKex}o$I`ccJ7A1x[ߺʲ駟?8wyo-vq N<}wɿQUx+ت .fY 4hp bkРA A4A 4 4hD#4hРAkoРA A4A 4'-CIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot16.png0000644000175000017500000064255714620351225030432 0ustar00hanshansPNG  IHDR6WsBITO IDATxkoU[>3H @IK`b,$0% I#HBp%L&Cb*N\vW8q?{^ݽz{5pRNI9)'夜rRNIyˇ~U5(<'夜rRnſz;[{ww?6Hyȏտ?{o'/vws7}?xμz߼ ꤜrR+}{ַ^t??wyww _%Ph/'d{Gtp3ys\7|^}~^jtRNI9)*o^^c/~;ў?o~?<=ť A?)'夜??{{{w}?˗/R&) Hwp;7_~w槟|^{~̫_wwU9⤜rRN p7nvޯڃkW_|pO|g y'~4/>|n?7n/w}OO;۾矿;<#_u_wow~闾뻾#[֯x? wuG}~뷾{Gu}]r;;'OZ9Oʟ2Mә3gGyoƿWCGy_K.}SR|~_O?;wןx;%_y{^W~x'˗~i}G}~~ҥK㞏rRVJY(';ߟk~޽w~W}CO>G՗^x[wׯXNMЛ:oo[e/O?k3?=s?j=='';?~PDTG[m{ Ri\T$Z0Th 7.hA@3t ҾخoA.>4pn(4XAo*0\&X V'jy xZ<2H^Z|{?C,_/|Ͼ5}W_~C_UM_|w|ӟx{?SW~~u_{^?}Ճ_׼Kww~7Sxu_?Gʇ _#~3Ӄoҿ[ֹf@neDZUb,,Um#B3}1*фsK;`\>UgѠ}(Lڦw@ͮb_UmNJ ;\GIRF]:q"$܇:6OO"VP##IP #A۞DfdB#""؁R"eg$zH~k w)*G^V[Uǟ}H*tr} C[ ejEo]'pv_g?W}_8u _q+m?/yK/\__o_75yorWj>~׽ _EN_G~Ǜ>'^O='| wݝk@fߐk8%|]ͣ :HgPI 7I}*}Ϋ־ۺSC*z  A2.}V6$ظ >A*jBy>Ҫg@J/VRm$VSo%MDZkۯOITT@!QuGBI5UJ}+tB)" +܈9H Os(II.-l+g/ "I&,?mD'Ӳ 趜֭HbLږb9#wb]MUjZk)BMYJγ5 MuELSUk-$RoVU)e*Zkuv\ ?/|CnM*Rz#* ULV)+E6Ē(*U)+7Fܪm60([+4H5xufUQ(^<rNYt**TURLY֙}Z?'`hnHsU%N][vV I b!\և!Taᾈ,Ǧ6HB!]3h*S*Õ.U@*1Td :Oңذz=dۖ;pl 6, W™ufob|ږ5W2t"FC@*"ѹs(0MS6ĈUYDDyvօBb̆P>i IkB%G:!gz%E1χ\tYRPg靂6 A2?`aݰ)?%[}ֵQ$U\P.\ҖuUkWZV]uaOK_C׃.60oh Y+LP Qqkq`MH#S<NPD%!^"`DQ\ID+Rd]ڷhNãtɪ@%S5Fhj XNވ[*֊HD{e+U4-*:ȑtЖFO!\63yo N ʻ4[eGY!Fxf٘J2C!Z#anYBTN(N\;M ca+W)$It!^m**R&J*:aP$Ab3) "vKTDىٝ7$`Nn{4gWfQy[}ǧiAŹ u!R  nId17agL(fqyAhgR/2iY i2} vsJ1wEF@ȑ:RdBطÝu!FtӤH-z$Ǡ-G͔Dle?ϘHye$It\D3Cx-欷%ZttY o2+P}`Do\#m/C^Sڊ[$@['[$Y]Y!*I..P7=xK d05Lh&ogk.ʦ%El+p3-,  fGNgUcDz 0-ŜSS$R\j U 4Jp6ֶAG *XRb䥉 u IU ::DfFJUËr RI4C }_He{WT |V Rc ?!7m u=pS %QGLb2#FLPhj2o$@2D3G0ߚѪ7SkT@,jl+[J:Uj_ڨjx7+wǝgv~S՚r/KMfH ݉币!ɳ&}}[}JUy|8KOP 6};^ mBZ$U* f=\ێp-$ni-.p/cxJ0Xuz, 5j W_sK*)btGTU1F$q[CN;0q*cK7;%FR}P$ FOHl)00fVk)Z>g tFrLgdgv+*dkwhQ`! apK.PtOLO;d/WU6ܺeגkO@&ل(j"R׾*N v™i}0IUbҩaԀ8ٮ+5e AD[Ywp(QA]yXS5X6mA;[Dg0j- a1X\$HWH",*C4/JVEbXJL)BL܉rҟh8!S>; 'ч4PqxIIZ셯ZAV>VpgN2\19mFhDŃ.T' ?`s.if*w,b]iۋda)NIGS3$9*3T+$64#Z8A5AsAFla~`Dʱ襄<t<_dBoT{,Aݑ+"}L/5ցV_h\ FH%3tk0;XBD@ mH+,w΂ߓSdE'4hR\6 l`Jz0c̓SMTi(}ͣ``=͢sͻoZ1Zv=>W. ѳej jBw8M0t P?w<~ ꙪU`#9s'd-n>>|YT4ҜL{dY$ 6Bn=zQ\ś+fL r__lA*Jfvu mrr}'=B]ש $HolI{mʫxD>R&ZXѢ6Ss܎o(Z=s8 .V kO?E1+ږkx: A$OH:VT Bi0"aRCVo%;X#Jy &zd\e mQd]h: fAd-ˣETIvK?T9@~ sNxݑ 2Ihfy^Ag)8ATeS2%QMp>KI,tRG DzR=)Y%#k? h=@hF(hHGc,fdYxcO3ǡO3ta>-hC;myY;N?iv*aqc*wu2s@Qx*Bh!dS*/9uܲ(3Lօc Y;]NLsh:U?WaGR$>IEP[BgDs _eQ)=}峉cHu%RBU<%qP'0!Ӭ3[۠,mO6$eU]t}4v%'v̦F6QO'.ʒ۟Wf+"miڂ#Gdq|ǽPY ziY'MƷ䡦 ])5/rmf>V$=M9ʴC[q~I}rRʰN6 RQnmDfۜlñ HZuf#aDmHxY/c܊49|EaɌ0?ܘ@bbWtDgK߄p啫dMZCE/c󪊂~е":G\!OV7ls怄m/WlJ⧵z܈\e|lHd xTOIC8:BWi@ω%ZOy;)3ЌwАՔ~tR4Lxѻح}fp俢m.~EXd(Jm,Iaյ3&Oŀl&48'4J:閙xq78+bB[6\:{wV`Jۥ`9PCQ6O#1M^eKy)V"d|ꭸ-" Pd3,bR-1IUZ!TE֤uuQ??[gǖsT]l1}p}M j-V;-fĈ쬥`#hRb9TkOdI;`IX nƛ`PqW?id"G]${C}0\ Ȕ̀0B,VxBp]YRXaIlAOK\V).!:Ni|V3L |n~ m,8oPJRO{Q&bx3azA$7>9Pd4KqҪѡx 8_ ȗt(tIc͵jS޳O`"3ѱوI<}Xݷv[ֱ혐jALΠj:Kr)Rtd 90E#j(}eہdu51&t|G&ѐwPl2џJ;5:l5yv"'>0'CY66..c 9d<5}נ$͓rH+/Ԕ{lbj^#8&$ijgb2nVDz~O֋FU8&py2V3-18%%DIixH[AT,Nf3t Ou2{< `3ba?Fx GRqvhu I`|ˊ[(ɽVP-e VOŝ6CV-2uBNe..^UDJq+ԕ(dslV!-($/k[ -P'_(V9xKȣQ[Vx-ڲcI>OS\_<Џ#m]eoH$`Կ-LEV@L\2't< Q9~D"Ejf, 5m/>Y>Fr:H"]ɒ>9\B&W o=Ry/Vr0N|FL?z*SYi*K$=iȾrzYi G0phb@f_|h2BGloU2I' )ڬTR˥LM$2,Sm#CF⪟?o9J:I~+ S+b[nhVOHҽM߷ӄ۱;>)qc' SHg,E6J_qn:[.ĵN0kl{%nŰ[pڛYqYB߫1vY ׍nu~e6tY9@-,;ǽR}0])9kz 7@N"fw_*TR;.={/)H-}SW5oETuRwFN)J9ZN(p|SH1kMOIIIJ1%cn46*2:agSH~l >rʼnzq3jԪ,ϾtwC޲mm/i[Qvd8ֺigݮk|x ' Io.SulT'PQyB YɒDSssš4HJElo#EED-A؜ UdLʳFTwP?[-if'C.Z&ZQ Ď]Tq<`ajP mYWa:-݆Ķu V=(ZK$%VܞWƤF)IkN=C^+,(tGޠ|]`ѠȫrMR393[mQZfQ?4vMd,@E)-`F " #cjHr]Op8@}{CK"2JծkgK u9.uAk ƃ^$ h]63t6RG  ҁ83Jm9-_u1/5gRt!eA@8tl밎3JD|Ր'u"z "O7y2`%`yZD ZY}4JQCT]#:aR'2r&MlXO{Ͳ+ #`P f*%j '1Ή"l;;+~_'m-)SWgPE)\2Ff(=c~( ^l}.eRPLV DO4*fA%D6ucВ$|݆. OzGWt OR nm5-K.6>em,cVoKtm cRHcGt@F;hyPAndgZWWhΈPQ84,E RDuWbZۆ7} :B-Ypvߒ}[8z:(1ZQߺnSI" T o-|RT^RY ʤ5a%п[4p 1I~8M J8NroU Dp. <ҞWv"Mi,l94hⲏOX&SǎBr2fc^Fy6Su\#1*g"aªd&xvkm :Gpi#MNO2  9c0M^-%N1[V`%!Ϸ~˱5P+lIʄ4B7k'Nnd''> Sw څ˟he .mKJ$)&Y\KaFlƄ ga3A ,旴)xW_s֯/?ɒtL> zd M!;vߵ3RH`%?؟DXMhС ["t;i/U1ڔ-v%-s9"Ƥ tAf_,զ#) >JM5y 6I2|<'EhXiL-}6?> <ҒM9gGdL_`6u'tjH2U֍6);8qs"Ylp"D-muۖFϡq*A!JjLYr1iIW 25LtO|pB6FF: ~I "1FEq@rZǀMOBw\o@eћt!KgSggoa*qr!MqptҊ*,[~]029̟S&u8P,l$?'m9m,B!D)WF!f[1!P[ԿRdT]Q%6b}Q]W]jmJIx-ȒͫO4AXL"OjeG]Q Ƽ11)ݮ9ס}u% D8,sKZr- 9ޭB@N3F Z )"vbC](>rL0'w6Qa$DE3px[b4N87n'"g0Hl*&&c0zKgW4Xk#뒈!U~OMXRdP*ֆKC.M&Dt >VumDB}P3/wQ.)űffGl9gKQj|2Q5 Ks'S'*꾑E%# !DUVD2o@6Lbp|]\$~!5mza]|"X/))*^zr<@&(U,H;JBaWR.>^4O;qO#Xo}U ."H$RH_-`-Sq!sefTKQφQ(R L 0ZQI7IRtBCK)- />UF)j5T=u#18u9i?Nvi?#Ky:pARzU]^p3}sϋI&i'I0I_[nmzfk.|;jSEtҁF0sYN7ztDY=M2\LxGE]*)KUaXqĦŖ Gr]6ԦE h!1q)>)QuS''#6Fhq[Æh]Ǖ'v&>"̍4. а6|]%ʞuX/cPjE (&Pɯ@ծFIm*0&p`bUV!= -Sj|fjJ)90B=JU`ؐՓ.5Rr+Q@%qSodLv ],R\D|xzݐO4xxNɷ2҄l-d}Ig-Dž#. -PN\KY,`=dh=l֏*tYqis}Iw#isMU\\`ʽ`9`X㓧2&gڎGxO =/VU̒%10++&z \-_tiJjZQU'Gq F*j 1;r@F(cK- `&ETdV˧"͢NBn+1 v[A`9dsܟ&p!R*+N\f1:kGi w):G7^|)}La 5{ひHik"xTM8F%0 HR8hE>_0FQ<ʔFnsH;ml) 2A/`ēZ3fu1ݦaKR23ǚ'9"HFC.JQJ+ֆIrج(\b8x+݅OCCI n6%#?Ds ^x21p3OzȀ,g vN$ޗ :]` fD}".!4\xEVE|i'6{甐I]P|5(^0n&A9/?6υ<,"PE44ik N}x#J%P0drV+L#AB]KGA {<> v-EQ!s8.E?.;Q3tJUDwNפIsC\tTfmy9ә, yu(ukɶygtDH` I`Hn^k/t?Í|W{1w8ѐ(眒0[P7 5*nq ]FFń5auWu\A)žo1`d'T-@d}f$ 9[]J`[n^rleWSaOT;Sǐ>h?T_0B2ߦ4'dfY7= cJa1%^i2ιɩ9˖37޶{?X_xk*=*(б_ ,ԚY\!fUY$HE"͛$E*Q8X a^,spY3Y5a=шϐ%\VL6ҭ-6"͵?v1"VįnoЦvV K@PiSB5Ì1΃:|FKNȟ- 9GӷᬍU[GF׵K[m=j8~솗mNUO2}I#j :aVC`KRHלa$s#[uY4%mʖRG)cT,$uvJ Wʑ:7Q#1Т2  =]h8Y#j!d#Q݀~2\H$K*POH|d>oxE4]6:+R:=2V:ms DGB 3ֆʨ{(牔~]R.v7Bɦlc~<2y !\Ū;AVOhV#ȟS&6nմ96G 2dL%[mjxbbȿҸef1s+[DgvՎIĽ =~EZH`y%uQhUlO'2S&DŽdi*Q }Ԋ$7fFw|Z~ n&PnI;^V 6aIܬ5D6wbfhXdr oa¢JswQRHgEX2rV8>C8N ۽BI,ۅ@6S\#Yvp4@nFZ[,CM˗BBݻ DĜ 3Ak 5#(Oi ʁipm]qx cK"TMXW;)tex(ڸbu9`ܣyq.6<(U;&&^a r&nwxݔbf^S_ IDATMEHhLB*ZM:$K?n(e5!}Son H_p -JJaQRPPԆ'"*SӸ7 )~a#ޝ&n1aO|t iA'꧐+Ylbb#aeUU%|Ő8lt γqd:K^=e1(JwFw XsnAL+MLxK߅WTpoh삃X }dR%I%) (S u6#q0a. k*댲Hy^.V-<ހ~e)rkhޏ0c#F1&}e ߂5 ILX>l>qO"eHY\711 K e&)l~/{-KNT_H*Ɣ}k2#W?Qt `0㠵{X&\8FA(Ԍ[ cmTiR kK:Ɨ=x՟lItcr=7Cucmo|7Rϴq?O*B8P$F9ҽ-^6uY-2nsM3*5XNÆi8"Y*%Ds­uvafh[Xv`늎?5: f{([dsqCfE{莪!Kg܇9"qoE t*.#Lv`<*.I(k!n!!5ؚTЏzQպ`r!Jf)4R\ Zs]J%")MjI<-wڞEцC' %Z+, lBb0VD@*o`^vCHx$ y`8vbe2u毊M"lvXܤF߈otmڹJ:Hq=E׎F|veEJK.@a驰2HT+=C+ƕɔD*$J z9rUI?$~F՛8PTctsno4+٩,&cWI⨅kqĬUJDV5kKې {6 5WDD(#3Wqڗe;zpbYg=쓞VV I4(R;K#-=N0m$he 9(*T5jf=BCRdFl<%d Sp )pr64r$C0:\l`U 5+"J)th%BK-?Uxtٚ%j+.X)[نVSDpJ7XB sbĶp*b*ٳ:>X/62lm0! "`^+CbZ $zs aif! aְDܴl %%;`ڨl*0#Nx.[PAr' X0ApR-Hi$vaV.U)pRPBd$0$Z!8:a$BSzKSBK6,чu?tp$}cՁqmj m]ADc,nH8 p7ZM˺Jk+E D-})3AfHlu(@dAVW!H{-aE&Ol"7ԈA1aKP{SmpJgXNb"D'f7'ܮdmn?8>7iZ.K(TKU ?>0M &w/)Sq ! hGtr׀CO1BS SR&2CnO;ĝG3C.S}  cuevc9½lQ R7lg 6Kk6KJlWz[~lA|8 m-rVORvnjn-/$k7.gts~A{ī G"5:S? ')}ai۶DR\T 3)"l/g׷FZnTBml*fU|B/Օ\:٢"B~X;g^;VXxʵu &1L\S#] >w2F~)4(QQMI IhZ>{Ԁ:s%ٸ MP2b$:%ױFaˮj̅?{rR| j`Ɔg1WS{"I[ F hR2=PqJ藁[sż<[0 *Cx߉˨3FF E tqaae-@˾Pv&R!)t0 <jqlr}:e;9>&KܼJЖŷ=/q ֚p)sעxϠ F"yv=F: N2kO %'ٱِ{Ǖjm1 ajd*wNp }) $K~cpx=ۡ@=pd $KlXsg;|QvJ'rDx3j| w9vީ9eX%/'\茮AI| 8ϲA0 R֐x/&'^.in͘Bq! l(&6!l]BcPr2qCBi3Q 8 u놈j teb9ֹY>0Ctr.Fz<%r/4HԊt:˱t2Pk];ltg} &Uq®O#"!Vͺ3v IBr) ?,aZH^U=:mXEaؕ ĀgY?'_Em&Fbޭ,yIGFeh­ ˒< CltntCsU8srUՇBtC9%dYJea &DT/duږ0l Aw74MB֢E&#Ikj&x!b;Fͻ*i U&H#FoK/l͋!i驤zQ|t`7>6ArJRcf+ lo|.ʰV6r.V.)vHxv٦E*+ 6zJjZ5,(~8ͮU8=Il秤ILb,SuWDV6VܜuVM45. :MWI0 ZE悢ZF;W)M$MS_ή.xmI1 +}[EjMg:Zk;"?QDmKXI}r8[4vvְ~oS |ӱvT7Yڱ…{ʥ3U!EbL1Rz䘖)}N*iehƺqԽ$L@cjbGD4ca_R#ȩGW^9I+NM2WZQ *&L!P+&EQL*""󁩢M8uJLp>ӗ{cn:wܬwjw]wo=[w?4ՃK.v;p٫_s禳Q׹:R'%yP1)[mshGl0XUL0yw5ܪWxY'<2{>Hϓ•97E",ሪ1Q˿q^q?_pᎻ."7 iW p"b}EB:pd$.lfjz4ǓuH36FBwf1Tсt2P5U6c17ة:)mUa~NzyWZuUWvD֝d/ԏ[Rf{Og_[y9‡9^gd]Lw$k38Aa0hd~i [ be3bڈmH<)j(?a]zh>zW堾+n\7}:Ϸo]+^q񥗮\~n\!2]|֕NΜ9sγ锖˗[\vի{;\xwq;r|g>u驔soܘgrw?g_v ʙ3gϜ><{nWN9P3_ w{\;:WVJU-ҲjP~C7aZx?#rZ5%7^'5>_<l dbrC m`bA* Qou+t:zK>Wc=>^x}T7n^pZ_2vwuqWv/]Zn8{=wSo>3wp{zpkW~~ܙ3vLީgNv{j}o=яvrZwgϜ}?w}97n^|=tś/\2s=p^ox_/_bWʁʬd" Wsl,9Fѻ|&]Yh8\#dK>_ ;lƯ7lcGWj.tɻcYk%sA W$sV>(pҖ_wKW\yy"Ξ|nWJ9P˗/߼qީ7鍗/_ׯ]~kUTܼy2[șgOΝ?O3go^yw_I!r칻ׯ_En޸'o|?Wʝ."?=S/xKk/^ҍSN]BWRUQkx`s{/_UzŻ_qŻ_pλ.\^އ3R 4X$uS4]^zGUdnthǟ. A6NPȴ]rMB^xG>OܸqSk4qQ޴/9oN[/+!ZkUOyݟdif Cc-p<N5ڮY UUJ)ΥwD Dx<6J5 k샻wȹYӔ04V_|K 13hU^<ϧUS[kǣч}\Sܾϟfl1 )cl7 38 ?zd8xgIUx>*Kde$iZkjƱrzq$0ɲ?{`'gf<qZu}GEmXܻkUꪾ}xK[7Giqպ{Xvy%'Y>{ (+K Hb^$(ʓ,B 2xUnc$ΪmTκXF6# d(A&sa/Icq~Yjko|Py3KCdKSr'Fk'm_tٛn = Om9'7 gW+,5@<$^7 V%qק*!{Avu&&S1 Яݰp{__7ۢoc{q.޻~HU۩Ҫ{HqqxU1zm?'dmu'|\Ƕvc}B_t}o7k~|tS 1(/o БDs _-WOf.ֽ,͓8(fw曋r]Wgx9Ξ'|^1=Pj6ç?ZV"_׿;gwPk6<br6dƝ_¶r зl 3[^E.>4r{Cɡym @b9[CpjC@|`!!{p\yDUU1ˢH҄sI(ozo<=JDZ)ֿTKctۊf,n [kz(Nz馘k o5Z~5&]~>}T޿pL^^C^Pְ П f32y#c ۶SETbY/f7Z$Aۖq(^48U'M>/U1 AS)߶x3_'E3I/yK(s CTZujٙI uΧsmE gCv\rƩ+utyhf: 88w3nrUVZN[~W2><701#(C9{ee~QXiSѴXg )0eF`ff Zf>msZ!/M?{|fҘ[G $0qFҶ9& B[w><< P9䜇rUuh{g TH1͍uYjUR2iD, qR]ݵ]_ _ڗ^}Ai(K|8hk,OѦ:\ 2!Ѓ<14J!$ oMTYM^>{w{9u||'l]%$%Y$)ª)b DRp!;g[]WzڮeD 齟eY'k5q;Zc୯|νJc@h  6^kL 0X1 _okx}$[逾-N/d>,}6m}?WI/|t@ֵɏ~8q.D_{fj ¨r4ΦqrT3w ˜q4iYy=R E}D r^1c%G;gzRiSqy(;50?.W9j`D I k}YƣɈz ,><}{4>:]T yZ[0+)"ai8PFֽ$3TƆqU 3b)0 wLUF)[KA#Cuy$P:皺P9@Hq2M,Yt1B q;k,ۙ7y XDD6K{ijE1@FXßOӟjcIC1Q5U^q̘v:;gȤ185u]0I4˺ 1keU%I(|]WłsYе흝!eUazgk2fGUlc@{?U#!c ^7š~i/w$=ХE«# F[Ķͷo2EiSK Hs^Ou]-fUYzcq{+ɓ'HE]FaQ3_"r2dtI|}dy;d'kperU@ PX/^g~`n8NbZp6JYq# 29^1\V2NC'v^qpFwm)F9mmM!uH9DQfb]C2C·ǷNt1+{aF=΋<˵3OǕ#i0T`;dqEd0:)RMPI?R@mQ(^˲'``P*5spuljU{8JBAycx쑭k휐W Ģj^>qҴeEIYlHaI-  =>9]az"yEN[w PUAZa50y;wܹ+j7_>zxj#dPUl:/h4dz.!wZm"6u=6\!9oj:EsisZO`hBI:d"8"~׭:^I*nȈ8!ɳI׿ŷyEߔl#ƘspzܦZg;. ]r-( ]FcVnc΃"ϐ .5 ;@b.mܫBRp6XY\HxYtYT J#yʈfyb>gUtW]LlD<ceɽ֊1$ro qby˲U]G@rrX/fk^ @xF(Ya8FI (RP1&LK! $X+349c0P~oPd42OsVkA 4MGIESsi Bzi쬝OBtUTeYw.cƴ{K+ۺY:Hauw~Yjմ]u21 <@:`Opww2h%iHf\hAv4u,Ӭ?9o?}#M{j"ڙ?JҔ;;Go_z{>;A/'ǿ4 έ󀸑vwqY|3O/Io4^0^Fq#w"(@D7>Y,]]q;~{{GN ɥ]W`Z^YBũuN0I*۷ˢ[ VkM,Kݻy ZgV 2K,^YZ h07{덵RRpTJu- UQ5t&e8[ B J"E*!c0ln4Ty.8Z)yBeؿ?ozLV<.W猭*Al^-NqX-z_r˝˜Yt8M&֋UmSwy2[5a,eLyl" G/{l&Ɛ?tRFԑ0h&BVeST QaȄoxB!0 1s`IK9M"l*7g!Gpŧ!;6UO D@K`<@PF;ÉBr⬟5MӖ2&jln9ɘk^`cVgӎXq@ޠ'10t#G䜜GQMFoVeFui]ׇnyƟ>yvϞJ[d޺}E~Zu3mh2ʭ^{i}0N?,j<GQDJ7mk506mwݙHm-+4:꺪9?L$LdXLQ7UidY^EUWl'&qEU-vQlzr~"9"eq# I$I8F[HD5FyX.|FT#O򌈾կ}N٣G ؙ~kg?y[w! aRT:&.9{ 2s6neK2R=Zo=1fLK2$p?g_0|A-l(0 j5sƘAWrȓ'sΓ!֫"Frd:k4Z1*K;X\L(|<(,֩},W&y l@wđ!c¥k 9; AoZ8t@B.#Bhm$tcmךXP$KcF9]IpN/Ϊ팽󜧽~šL4J;7w~k_380Rxz@$W&x=Z?n,tsȥ =?OǣdYEQve8ʖK?G򽟾k dC!h`sZ,KZU <ϛk8 ],z1ayu(8'<6[===VC+Zu#VJk퉼I;aej(Ck p޾ŬPk_u1̟gat2 mZc"s!*YƸY=8QJꚕ4 NO{j%Y%AH}[.sw4# d]vб~̀<8Y {$.y<ȣXåqkg*i⵭Tчn)(<L?zVrhx8*" 2\JţAF$iׁ.N+!y i](\gMk^H)l1 ([/CŬi;OdZ bj&!O7O/wI,`ovO)c 9d!ds=s <I8Z[m:QyF\/WBଶ'IQDTeg@p4w6_,jZf}]9g?R``Zy8zqik].M !Sy]FHF=y4tm;mG0Vu2 g5Waݽ`TR+w9e!#OOwww׫ݴMgNp16]U8q ĀAz괞f8#rB@QY\po{aZ>y/qK!2(@(c8x S)9@2S۶4I;"HSd)8D|2jVu6Mo9ʃopH{> V˧!"UV׺AdqQcϻMӘY,?9?J+]Qj9׭Bw DN6'T"7Q@JݶI'a)g6JcyAHQ(**:%y6g$F[G:X۵ { Q3ֺPrġjD ɸ0lUQhtC){IҴ]g')Miy #krEmэm <@0~Ѵ2)ccA"w 8|s2@OI3y m A"ߤ !P B'GV4t7p!ڶk%Q۶%rkC$,e qZYc+;g Vye0ЃAG=SP[3BϞ_7_lW,;_Z~ɮ,6U&-A+|'A/,"A0IŪʬ.q)P<ČlSo>\Ca:=9}{X.NN8cw8na QKEIey7&hDpu/Ͷ1`iVtZcBAٵJPnWUM{pf 0Jk: r6s_?1 "ΒxXei;ϟq IT+}ws[?\u,Bq UUi,}cAƃ0fYv I`\̾~snvw1Gyc,d<}J)Vu(_|Ͷ,<{}+9֨?, Y*c֛mEUU\<}~T t)o/(|b|4>]+Yo֫h8N'U&?w0 jib0 J+j2 n8Dl /m4Iֻ-x ]K( uLܩ7FTs!7C# 4 @P,w؁lFѣ =`?[r5'L, <}O#ڶn!&ZiexJjhh:% F) F֌PoL/F0AgQ'l^0"7V]_;:(%HPtzX NڮIBK9 Dٺld߅"x\)v99f[׽V:؁9[pxxzBdF"`j!ݮM'G>|j=||Q?_=4pj<} :p-8iݾ|d&w@@@yo:iޓ& \p mF$ U#D;98310mTJkmr Iш0BEiגyI AґPYdXM^T}vvG`/aXjy@燓PgO_\]- @ZBziDXF:S96w. #Bx!"Zw%<#f 3)R#v78m#ze:<@PT5q*9]%(K"!d2 IHfWj\QޙB~v4"EL"O00KVx2I۬MfX)}ƞ`#7g6˲*k0("Lhxk_{qx[5iGi&og(x֚þ<9ㄭ[lߵwy&uMLCBYevYcK``2=̲,"Mn,l:FJVc 2\jn7 i,j$rۚ#ByR@hbLMyt~S.s& #D9g3ZkS3[gIa8=<8{(嵱iˈ5~/1O *!=F`4~omYSսQyG0ւ i{>b,bm{O1(k,P0J ͒jW%yj#` )#a/W8K۾O2F`]'5U8(()uM$"Gzf6/x0 BYBy&ZGЀmzդȐm1wP, mTO @x>a{<(Q"!=AKSJ)Pdϋ4T5"gݯft28IYԻ0 a Hjl(q (eq8VJu#J3@cavB{yD\utv6eCa#eںAQFI`AWsG(I͢ڵGiR(ڮD0̜&+ C@Xz8L^w , U(+AxDQ'p>.#1B9 E;罳MSQ!!hZ'y= IvWGad۵9UU0H(uי0ϟ}h4vyiE}bT|xw?rF#9ze R0BFi:gwRUq0&x%{aB1`&<# ֺl |( EjkA>_,w(IǧgI.u+F 'Jj1aSJsO#>GZG`WB!$,Kն1.Zdu.+riZiYoqJ#<Q (Ɯf%SFGAu\1jq-r4ZkmA\0]X^/_|{usMйv!<Y\Wt9&y:nx5޾__eq,+ۺٕc Mnל|dTxģ4xqt8}qE!4R1*gIU#=`nfqeIzuy:$a1A+cN Ww N0N: * ,MKV[@$ DĢoE¹,.>md(3oսeQ 88ƃXqt뺶MX9D #yqo?8!=B( ¾rzpQbp:|7~[Uu߫kb][Dl^+iGӃ]ٮkh{OԵpX82RʶNOS:5I)oDrFuFK?ќ"G4>AE n*l4T!(f4I]"1Qu}D.!/&GJfJzFf >8#0 A+r^Fqھ8'T[׃р1f0?Gsk´0qβݶ`mfQwM)^1 ]!c<`RrV2I Fo7ޅۺ >fYEn LTp }8'a1I8~:Ʌ3Wn;%onl) AwV|B:'G˲'d`~ʴRbQgϟi:>\YZdW4a! Lmy(9Y.vM0Vr!pzw/nnnafuO˺<ރs)eaAQRlc$diTBR7Jcrq AiI2"ݻw{Q bxYZLh_5  7>>?cGonj5ُ 9k-x<8 @m@ s@)6aY*m}rx4]@p#ӷ(i-7" ^_]*Y|ӣ"6ǓqvҲX,.L<_.Bp8;Lq~Zʓ8 D$& f~]7]JPE@yDM̮WM/WUYu@<"/׻,`;X%n|nt8 8??\H V"F߽ g_u]YL)Qre)Zaduq{ QƳ,mc1adږ!V;jSyPZ8㐥{'HH#u˫fq?6=DhIg<&5#dP^P,lcer5E$γD+BkѪmֻ2պ2 #iT'(/ro]+9N1wo_`mw@ AT/(m{q[6h:[k=zp!ܔ'f? R`J|dz͇u F0ȓ,Z;ZM&sejGfA05FhNriV{Ŀ}ON>?o/S6% ap)m[0i%`hkwƂQN>GaN4uU}7Isږ lwb*38@ţ(Ӭz˴A~prb: /zg c[90%zK8?e!MYnq9ˮ6öVwZ!$0c~å10(*ƣwwS&6u1&}YHmyzWޯ`ʒnU,HO4|x(x e[6}++q03h.@giAP6 Oh8 ݻAr#Nw^0<8y]GGclkx?YVs`ڵpz`]^JL߷A|`d~x3MheY18U)kqfѣf3̊JlRս$9)_ ` J*@}.>k,Bc8 ~$Bk"ΘQT,˳⇫Il>g LG;mnʍt:]5R!ctQ;ЈAqFo+&ӼnO=ZśwWqQUa1ȳAHMخn*ii"0bv]+œSJuX&yw$I10fjeg-9뽽rY_~^izy?z%t#;1#x{}$;@ُK73bq{ p:/ÃlolO,7v(,Mݮd6[qgPhL\Nju+(BL<ײC4!V`,{n2֭|b\ J0d\1FQ-v;I&ബv* @Akq#HoF #Qoۓ6ixp#azN#4K|B2JSb0  Iw}NĦ+EQxW7US5SFt4Ay3˶Pm7"Y'E_KfXyFQWz\ץ 8`he뿿0 jZgZA%g#aZ{ vc[1 PNJP#M14y2Mւ0B׿z4gO]6U]߀&rF"lwx<]׍>FpaJh>"lֶ=4  ~|Xq6TQ `od _/a ؿ!;#z#;zoF|"b&Pm[gGՋ4 7]7k:zΓ< C l€m4Y3Ƹ$5mʭ@@3l۔Oڮ=@c Zqu= B1 a,p2+1> =B}2+48`9:-1uiB\}+?(a]EE:EJK}yL ?9:Ԫ\B곇ogwY1l"B |nvǘ3J :'#,P&躖X VnD N#B1c%FSl:"_ߦQT,`"wij¸nq]ՁO{ya07;qy;?<Gwg?[,NXX,8UU'Jڮ޼QIC3oծM8 `"˵odm{@CGXkd:-V r 3dͪW}}s{;9=Rx~e<0 >~B(!@]ʶ_ktGHOMiSD9.|\7?|<\a^w͖⸖1!?No$t˿ݦow%Uo,__^ 1!ȩ4/~O"##P0'߿,"Ñ _A10r'mo c^h4"`޻MY-0cBfLJGrdUVL;?緷3= ĮmNt߿ywyP@. (!$RUm?$%&|:^RdPOjyyy8 C&a%ٿÇ0wzZMզZ,]e{tSzUU%"D 1c"0UU-UU$GQ$e 2pigcƍރ7bL9KU qUW Hj(;m:!Z(ŒN]YA {w߼|=~:Ͳژ=MR%+a84zISoѽEYVR"uA6ů~~X ׻_}1 8I~j%pÇ,'+7e\.֛y%MPJ_|Y S+1PM]/@0ZUU]^^ߵM4A, ju;ph2źzyzyb<99&Źdvmڶ9==,{nw;|2a{^YVU]C"OҴ:C7Q˫!>9>V%n0.^Џ4]GaD}to-B̦xlv۵L4m.n6]tt4*␤[: ]Bxq67/iDgmv{?O~Z,Va*L}xlwž u8,IVO)Rt:|=,::W*Jp ji:B1͵*󦉫3vL-f2nR0@(98]}Kvf**m(B5iYMBDBI )#=wuuG2-3현8&t4%mG 1}Eta$UQۣcAqd膮Eu+Y՝8!m0軮JLRSӪ& hɦ3)b2>r';Ĕ@7v v6?O8,m:ðn0)۶>dI8_[6FeQ\]W@pMۜTi~/G77i<|pROOGdRVUi <ϹP3 5me]wu]gN6o//tM[V( E~+)ё)$dٵ=9Y\{^&B(+2 z˫`5gOʢt=WpHvdDRP{[2 Ju]21?;9u]7&Mҧgb,x6MUם &AM;@Џu]xg:&>VMRڦ1$`>go#qEZ:y:NHߛs4gGk)UL5pBqj) Bxl;!e@*Fi !{A8\>9 }h1 ,]t@$1Q@AALDQ0EmReYqS׻k\&\a:U]yS60c&fuA;&!l.$׫麢wm*յRjгǣM@ 8@\]]>zP*o|Çyq!Lm[u:BL$eӌ4DU:RXabFi+ۭ2Mm%e4ovCV$O~||rByִ\Hkf:dE5]-!EYa/Ҵ(C׷!\W:eڌwW\ʨct{اeG^KM~p~ľ+✕ESvpyS7ߟ'4*Q&eKYQϫ)- HRJ8F#޷J s4z)B(W~hއ$0}|^Uu2׵ϦS0%B~zL0 Ӷ"/<pdp g׿?.<}ٶmYV)M`!g9ò,#H7-$˛[ c!$@H400\o6b<<,˺ApdYO·77I::`QiߩZ `;y 4zhzE0B[Ltt`2>yQ)7=kZuUWuUtfǗtu !`:at]%\ :~wu.@@4Nby>4vۃ^QE.9dWl8&/JJXwȯuK" B MAɺ=DLK:&4Lb¦:BnmLa5@-aM+huS(H|Ϸ,Jyٸ?iF\igyAtlnjS-Ӳ b2M]yQ|Gͦ l: ysyEеf`%]�]rB(A l:v`۫>:?9?4_Wl֔ Z!PF!cM?>:RAJ@|z49:&f'_{ɸ0mw00 |s}Xsy۹Cq4K0Ii!:B0n bBBC>ū7^8JmpyK??ks{wYg0B$Ii1zs8d `0eyEU])|cBSueeYTv4YAkfr ˶Lg~7a4!`eI ݰ -kZYUFcm5nT02;l)+}Msy~SuÐy'%8~o Ώs)~[,:}݇}h6"xf1v`t2t]Wםe9eΚv<ܭVᰩkƶl۪78yz 0eYٖ;ۯ4B4MOxz`@#fًok|eѐ"^*Bh`6e΋+@)54= M笩VH԰Kqg.J]#߲-Yoph,S?߿z}UIJ.mzxvjfK ӦʏgmCDFa3햗ޤ?~_yiF*iZPPe`\M3^pH*!Dm+f !y&&d؏|ǡà"Ekp K7&g0ECoHGLaM)A$Ȗ!O!!D UQzi2ۮۤ"q$~HtFxsW,PoN}6MٱŚ+8G)}^˖"kmBhv4.Jl 4Ӻۤa'>\r꺌t8ԥw+%x-{b@X#t~N-bMSVBcQYeY4mSc]3.L~<i9h:.]ԏ$"%m+N$h[K Ldf"Y03 3zaسfK@lrXUu>!8 C@Ixrg~_(dXPr8 €qw[]Ӈa&i 4k+:N$ʊr,McviYfRJu]]riA n߾ny13Hq @߲lq`cqikz߳ mGtvMi<%n-g_Qā|h0ʒzm Gt/|'-eu' ] `sR2)fj]Ͱ[aY(t2q\Pu#wqҪS?.oi$s\KX4lww[HǏN&4IH!}񗚮Iۯ(IctDܫoQ_Ӵ,nP΢~۷Ƕc~@DnAM}m[!Z!XQa|w<~!BHd(d9]}K˴lmS2QUb>s7\Af #AY^M=%qҦʋd4a)&kNNX9 w4e5{}ƴC(,pLavR;p4bh+߄Ӷ.kEױ۴Ɇ+ f]g±m&Xua荢b* Z.#yiX0NLClw~xrz!./$>@ᬕ he"?n?$6`ntpлzw h4}xe]?/Z4]#qz)/ٓgGWWWRw߼} M&]nnoR@)uo:6R!|4 )ijLp$GGR +TRO9Kf3iS՜wEU:ccL#N2IYn /~䃏axvz"8 AXM&C_M۬7Q5x0<=OHH0΅h<(mZ!TJ2VeɼI:&Gsuq/`,6U)D^mf'~UմUS2(RxC$넊44@hG@Rht| |ŕ`FPUwY^B]^~6@,C4g-mco'v&mln;;Fp\s ,R!DJ)w# _èNY 9(gʴriAYa醺 ps[HY] ${ck\Q4πSzAxZ9ׯ.ku7g~x-77ܿYu@]nOgct 1V9#5~︘~ɋtWU繻:?!K%U~4XgBb \d3 FÁo^j8ᇏn֋~0˚/Z+; pv:?x$x77wa?:PtBf؜? ZNSΰat,Rv}s PӴhx{XoV#S: q!E^ԋ϶za@ m;0-Bue.mec^7 W23E0޼xsBFa"~<8y~w:D! ˤ;>> )nE0&afc C!W4"ϒ898˺hvJ3tq~zrZ.P^VkmWbD0w~ms(NOGyu]GڎS&ihUweSYEQ4q!x۴i"(<y^,KYUUEQfgi\%BX*q07OO ]rER)i6Xl,)2y>Mh"^VeYf3=C\׷L˰LX]B]۶u@W^6ϦP~8q]Ww0 G!I_|Kwdgfr `y{ԯo/,z Ƹ,APW￿Gɠ][ڶ`~Wb[#DZ<8'H1[ކa\Mχ"$Y,jQ2~w{Z,@\"[' j9zIxֶvuYJZ3@0:3 ]0Mt8c)>=H#Ắq۶R<#2Mg$\rڮVd˷ܱk$~)( ؖ}t4u7wG咵ovd41:ֶyQĻiZ)yGiEQm(jʋ>$< &^S'1˪=Iq4NN$R6_l;t-dDh6{ys ruW C1MW7q?}o>kDTw55 Ctt4 W5-h풏N䗷w@'AA77_q]<a `4"n7Ar\=!iWySJ |SU6]WVi~fh4Kpۻtl7[!%C >Bh;8'ƣ(/뎉$-onWYx dv]0ć=P&c۶ EQo0YPjr_ 5ʋ>|ܵ]u !bKdrLGgi Gw߿v_s\p }]Wo߽=tq ͛\ɢ*٣Ǐ4/zyG#S?~~uja[YuuU̧eYE M.eg6A8=_1攕uC@Ȅ0-4uI@vYoc ɀ(ʺ]۾~iYMnt|߳,{0<qբ*hc+{vY}mɛww0ӟO ,׿4O!*GǗn.0RcI$>`q-_nm,Eb4|dm;>FHpQ7 =϶4۵(z|6gq0Xk[ڶi͹#!Yci:/!F?L*ڵQn-s {1T-ҶiӺ=@A4oִ000 òi0nYiZ!@Qƪu(M)OI5$i25zieoۙkyїotb=ONM]Þfhi% _*)40?lݮ֎LFc2;ƾ}x~7howqV Z{c,bUU{sr4]8}M$BYUTn୓sQV_q]PݵoM G\N Cl /^|fQdb7f7?3@b);9>KY ǹ}~}{uOGh <[,i&|ǣi Wh%I2臺 8UuE? Ç/ aqPatKaXT%6 BB i4"~}l2=/^|{qvq׵QzZˊ|2mk۶kgϞN ĆUUSqX{x2zA>~_u'?R*2P! R*KQ%oo!AO.?x? tꪪilm[8 EYmvzGiM#_>$腇8/~-0štJpnuz!N\Ǩ:a0`hW׷YIږb()ǝnE9%p4 zeϞM{1u- }FDpI0@QBvH lwq nUT=T@*x (y?An[vzC m:4[.׾,qp: Ye{x~#Ң[d80ѠW6q:FiQ;Vų>LkyY^\7=.j<:objiEAYW8/j*/ k6ۧyx9!Ƈ>Ň& /+K#M֍'`47jxף!f6 ծ qe-//\ASrIq"}V*]hZuPEi]R |j9n$fqBit+)'0r,!D5Qq-l~z~}V`tTsܦ}w})@y#OtwF0w"O?~!zws9>#P;p8XV8UTmA8_l:R]\.V[ mYkPLfCʚtN(#iR*IcD0`3p6~b:y )Y&훯bDS?}Ns6.>y4wF/ < #s! n3 +5ۭ"O |ńmYYQٓgOn7߿B:<xzz$qS 8jV}nw˾k8&/~k;^TI،$é9NK4?O1 Ā H)몪ڶY%秎7* |(mϢy7W7yݹ1BY&xBM<\ۭ:$tl߽ #ضBcZ]f|28kbQR5צMcе q#lױvQjFp"Lv}WoYVi:>\g1ƤyY2,Dd+)nHSwb~9!Jhl w(!]c{yȪGY`{

}zJb^{T*BH$TG>'?|>b$TkItRBvܙH$6l5;;֯_ĉGy$N m۶϶홙SNJ2??z;wnׅR47kw,BQfןKW[R6@󖍫>ƣfE}(WGT*2 ~ԵMM/J*~T塇8}t6 !|ɩS֯_&]Wu \:%xP?~nYE, th/}߼y !dRuZ¶m<9/---X,-* lkk{wڥ8Bh4`kk䀈ѣG !\.-k֬9tqι*~zӦMmmm=֭[ZJ Sf9rh%T*J/z6O.+J\.W,IUa"bWlSg3g.8%7]\ b}ڙ3g&''/Ӿ;x DTAh[J}u]MP(!zzz|+;V,/s1U*g)|T*U} !bSU岲9g2E{ +J.S$Z.Kw4M۲eu||<*믿N)]~}$q չ488yޚ5kx≡vDT*N85Mknnu=oݺn{Xkkk$b:"RÇ={3MSJFMrΝkmmKR[[m'O\XXرcٳg暛 ÈpC)eYz.&SJy睩޶_[[[K__oܸq`[\\O&&&*ӧ7oެ 1Z^^11H\ I$JsU +ax7窺6ՏT%.TM~eO {+u466LYUBW"bR@inn>|0"y睽ӪMΞ=ёH$zzz[ZZԴ\_sն7/&kvѾX,l߾~} !JG}tk|Me`zzĉMMM}`wwbWW /P(p*bVJdZUKV.]l1nRRf15[P ¾}z)C ![Br&2;V >jPMdb !+033nݺTFMTመf;/9;vP(d}{a899iv2OQzDjZ*PSMԿj…fWMkPC]0R{3C/~qqbx<~}裏8qe˖'ONMMٳ?}w5::z'|2LLL?~< o}[ǎ޶mCCC֭B??✿K;vwoۻvT*CCC>O~={$Iqvv;יּ:TRo: PR{wS[[P*aR"ľz$t&AFuLaؕҤNervGZBHTU ]Muttd2tI%xf2͛7+jǡZL&3 !d޽w})s=LfxxxݺuB_JfmmmJު:|ن 6!٬m?aÆk& P>G4ܹse}333÷v[kki[nT*b?~8x\v٨c ."C5R\JrgZkAĵREo'ι{1 ]J=66vȑkNOO_ݴi,..Z6mtT*~]v*- ۶mKRʞy恁;w;?%mٲuxxxhhh~6ݴi3UX.|5B {7V/}?mI}ڵsssR'xbvv7H$r!eWbcBuxT*BL&O8100p[|Æ ˥Ν;޽D5%8cvOO3>~u],k``7P7O۷ɓtW_U/^z%ejF}zӦM*$߿jj+_Jcc//}Ed6=qD___OOO__ ! m+-l蚦SSSry֭jR:uL&ݻWLGFF~ae߲eӧ{o/=s9qy䑚@144f͚˴?0u7xgyהQ|MFJEcDbbbliik֬QiYO~ꩧ~ߴi6==w+ b\ڸqcGJeajTͬ5qU5K+ 94m>(Tm3 t!;L\]ՆZsmWXVQ6jfETK)<#$/5WdԈ8::t=sU:cȑ#gϞbn߾}߾}]]]sssX̙3O=kvڙ;w.,,Xuo|/R$raZݝJVnG}ުm{ٳB.0~ ;贚#0YxDQNj4բԦZkK`yYo~PJk~^7=Ԡ~Tr 1^R{キzzz8J ;xwǏyQS7 1F5M FR{drݿb~JBzzzD]%K?f}߷m?y4t+9Wb|(ҿϜ9S*kUL$LDZq>~eRJe.fkh9=Yjo.3qAc)#MMMZU6O=]z8;\Aٻwox[J˜ /+~.Scyֶv7xc͚5es]m6m444(+||q?H\L+=J^IgNjY2`U9^TROjhbhԶJcCax񎎎ǏONN!444?77788r}mڴqǎ>!bkjb[[[o'<3+W"b۰aCggiiiڎ;N>vaqqQ+}ddyvvvbb"LNLL h4G)EXyH$U"L"P(DWѨgϞdmY]׍D"-,,444 X,600JNMMAPT&&&+J YibnhhϢ*J-~ԳAXV1vY۶Ksu%a*Y$j-EBuը~*F4 mP(R)Uj[ MOOGaUfSYaŠB,R]B9;;kY1 rY H'''Ux:.Jdrrr٬B0>>de(s'ͅaf͚&dfͣD"133D2뺍|>L !V-J)3L"8s‚H$bf\.tZ}ttt~~>ɨnjD)]VwcL+ m/,,$rJT=5*kKәLFt]_W*)* P553788X,޲^ai(JbQtyfful6!*h4Z(TW-RJFGG B$q]W)q[-TL&2778*$RTiHT*MOOwuu+ypppzzP(3,acur[ZZr4d2-˪owww&1 upp0n۶Mfsο ]U!q "fYU|vvP(BTer᜗JT*8 UXW*&WԖ !3̺uUmU^CcS%;UUV 0 q 6+nݺ Jٖ̌JT <644,..r9qԱqeIԤ-z9N>H$:::fffS*|)aJU'\>onnV]*2mrg@5ZuFCs뺮늵Ѷ6u555)XMn/J]]]r9+m1v%8.RRTYiQaaبpnX,NN(ب(jEy3== ZD"ǎS33#Pt ٶU)5]Z5>>^_os@uMeT({8 P\FMW|3gpU"J)3uttT*|>D4M!7b-c5Y}5ڲnyP ;vL)Ԫx|ddDP^(TqSN)%0LTVQ :JvJuu]TvO< DBIm[)!ֈVYi]nuhuB+X,zvl6ޞdXWBt:=77̛dsL&x6-mmmx'*iJ\izum٪j۪nǕaET2%)].C@a)AJYmAÐ]xD Ԡ&5R)AMU>T}`r8te>Rsx5@-ԪhR?YD/nVv%Cu5JǡssP è/{Rs"eյJBǡ -,4_ J܄ 7V-- [ nn&ěAUY59G}]r=G},4 E ʝߨP>TF|~YȍbU ʱRڶ{uzmFZB) 7|ȇ?U/@\G"g('rwp= d2lvffzZ//d2|^ طo_Xd2JwwϞ=2ww{yUbY7/\.gpŶ#TK4@"H@@Xū_=D9GâL %`*rH/!a )@ 0ol& 1Wtb1; )* .!1* @$!D}$ MAcD$ P*෶iii3QR  gH2.矔WI}^j , TJ.DYRi̸%?PmڇB0H)o5Cggg}"w"f5ynzP^(Uw Bm ) EjRJ!e1RBQFYBZKۭJ  YJP)P jL "uv4yy$JǕ$G`S@Hb6$!AIJD\'T 1 9WS-_'eB"D!԰u}fV_3CvaM'FJnS^ȂA 87۹Icėҧ! D"d؎nK0.Pb@bpW^{Hm7EHf5'PXWNDD ~)rՄ A$RT ]" NTsA@GXZIt!y_M١H#f\D.T2bGfZ)e%׹mֶD"Pb4??_SɆBP,ۑiV*$655 !&&&|!tM7ux4ZT@$RH F5MRX;T*V$s<ϩ8b!HDcR8NK) \<2Nf@0HGgR܆DP8JĴ)c\H˨'u]kmi'#ǩEr%y;'`@n÷I7$ MW |w28}00wAtsjnMѧy4x,"! 4&lvs0tCN)C&ϥ]Ѥ ΅Oy'NO|ȍ0wL?.L'MzW]F/ T/DVY+)Rn@ J"z*AD8+TY(AJSH$PEj#D}rkoB!0b۱D:e䚎vt~aN&t8~v0,Id>[Y@X,^*yaXL5Fi!ur)H`IHf\>e%42 ˕B.kQ)x(+P<ѐH`4>{[zwkJi$z Rt Fnk(/ (@HdQ($LrORAtF3:8t>޺cFN5/$EHj@ee;9_ L5NBwLctd @(J݉d?>~f:\H$ssc{HB`Y\b~#HH\bBי p-|v}ecZ!#|kH&#ƙ'b@{D堦_܇>"NfBj]>]p0W @F$ ?LJy6 OdL@10x{ywMvo & 9rJH%"Rr^x dW.BPLW/~~Kxԉ{ERٍqJB@S8z$kL3JC@( <ǰ@`hHH [oF-3Y˰t*J) @@OJNJ%(M*iT E;سirrj66[7?&-> (nI% TR yƅJiY4=S}ݿmK[ZeP +,CYkL2tPrXƨeRdPF 1\ $D XE]\[3$H@Rױ&eA槧tî/LQ1yJ(Y>[, MC_;Ѩr%5`5g5*K:!X:MG2VUHq-$JA(޶fM,TzwԷz$ڞ?|1#U ۬TJʷ[f YN`!JbHbNCQf) t(P ]טFE 40t6Ǣ-jRBF4J -jG>9vĆEjqӰ$BT nasN VnkdU3 !# 004 })@0 8QT%ŐYֵ61g'&}eedcT$)X O\ r(@$KR( 8_=/?)wЭsg|_q-ؔDӨsP&M.NbYȻ>4t4*\TQJR$P$ 2lpT$ m뮻w֐-K 0 B }ߩpRbrp6I )eR PX~1KxPJa:$Ke)y(ED V*bD5 1&E4$}"TCcN < wN t(B@a %!Vvť%$0 uQbX yxlCzw5/ eM7gg1Q&G)g#HJ8dC<w ӯrXfFcӼ'ml6[(;H E<* sTELBx(̨|Xl7ǿ;?|t~z>|xo}˴e ]iē 2:=1TʍMi .(Br? P\C Iߋ5e6ēl(9 "M'a aʸNS t\@䘤k3}'ܒAl.fugw]Xj9eZ_y|˗O͵ZH Cj\@40a{BfhRrᡐ ED 5F" )'DS$/SliPH aH %H 'h0 مlE.S''\aAfę~g?9*'b-ͮη橫fI(1Dّd) 8yK Mb˲MɊPKfBH3 E֝3ӞVέ :^÷ E#x,o\QjݲSD:/?۞k.-4ҬZo^GvLVO.OXXm=Gx3k <Ǒ*B I?ʡfr0{! 3}^)98[~THڣQ7?q /O/>itݾo~nX  iB+- Y3$|gw,<ΕʹǞ< pP7f*u`dq,8sRD!&)  V+J5?ttFfh%BHj輑@JC`i׾tvʙqt;'pՍ{?65y *6Lb)},m ̒H(T1%pQi BI, iww;*˲n5<:J(w6L@Uiӑ1dbّ@㼐IjB6~EQUm$Epg IE1@DDeݱ3p IDATu8~[.H)#$'O ˋ”E5-Ň:s󅩣FkRTi&(2MLH>xcۍGS_ڟn޼y[/_ݵ;`k(fdyk nPP( N h&_UvF;+s}okAN(ZHx΍C+DԈR,VGT4S cbpFf^eNB ¦=ь>>kQ $BT%}^8G/|-mbhD Ǚ pa68$} MoK Cs]G$ dH!/F^|:!JDL$ BF ="蠕Ա&Kᑁ/ al`+o+gn_򱧞c }γHkD\p2q]A S{olCHGǙPHRHZn{{r4:̲)iE"5z+0@\ِ[*S%KBXc7FYF,)#"&Yj8ifgO߸rfEaX)D*k6f{iiIH'napggoh~a`x'T۰4Tmu(!D~ic!gD ˓ɸO\qԩQ]BIhKnO81](0Sl; L74C‡ϹdŒch$xSplAZ@}~`M*zIIRiՈ]CTS4 t8X[[8#-lGso\ˑE^ҍ*mə76w+=|F#A@S HDRKᤂ`:س^[{%.{^k2XqILGC!4*ڻ$MΞߥ 1 *[v4vZc_L kC &pd2Yn +$jckͫ'ab3CV޾?4&jP1Zl Ij*g5(^]{!S.ny>nθo _ڣϵys6̻[A@-B]W<7J6l$}++woސJյu?|E" 'Pryq?O}ITMo>ctJebIef\ʔhPkiuҙ '_k5L&f1Μ:Ѕׯߺp[U]+O?H*JqmM-kćr 3" >zN;vXyWUdG~h:e+0pĬ1mƛۇO+s{q")?aIĹs7ַ!0Cig` >P/{d" xlxC&y%BR]Dク;z!V b 4ƒ?dqJGـac`ˢKSʋO~ǽ!rB(rŪl6'I>T:t4{VMP)џkhO!GK&>?&n ͸ZiH(P "Im=Mg14:x7n|\(r͟c_v2>lxsb[ߺ4(N}[_{sW^xZًyg( y7?9lܽs'v۷nf*/9t/|n*Jhf;k6Oqp_]Yُ߱7:sı@@%a>rZH-~HIA('Hگ'7H=3/da~[\`Pȭ3|J%I>6:H o"P<YQ:`We.nT;tͤv&F9F-%eC+)m78S 'BHR1 c\YԮJ[T # b XT} {jy'Yҁw!!8mtk]=@R): x@DJkL#p}sw ޕY#`s 9@F9  Q :)X f[I;٢sx"ĬԀ蜛LB(Ĉh< gQIA0N7q^hu~$ s/,(!{fzv#^ۍ!5Ey퍫̏MMUL&/;8d!#} 8RO>՝ϫh0PDvww$WU1cZCE1%5hƵW2RIz!(Z ! HR,˜u]'iI1}x `@($qmis86v6+M@v#ukǤn;TeX*'HxkwΝhIPm\jn@? X5tqpgaM@c]'yMUKYy3^7Fo<;Q9Rfos Fs~[yaϜ[}_~777gq#KoGi(ll׿}koGV+8qEHӲQG.c[{eJMEYŃ/{}h5/蟬mOQsˋѤ^F͝3N&c! 8k-g?Jpf? xlxa]S睩g S{_=|n߻z#8M.u"9pX ^^j A f9F@~W?9wa<94U~w7wko+>߾-s"S١{Y4 2uQOG_id'yI(֚IA Q9"D33ѯpVBJfkMĕRNk^8V: "d/%O!"lC @HGi`{v{{n3YUx4*Zi휛1-f"s}$RQTWyUN:f\5zX`/I;,<. rγ AIZH*i (; Dts x?>Dd9y\<KIcjc"z09!iEZ߹KԳSdYR(UUlokc!]zrI_hBfd:-#I(qQv'ӝoݸKo1RjcGY w'E$ X)0 {[$AC5Y`h&$fv\$O;L`襪g,}J>s+W+K_sϖCY`pnؙ*4n/\.uamU sVe᤯:R%A SWVȅ[oKT $UnV]>pCXJ fK; 0{q;8VXH(Y(l>#z}3w$!ǮJIpO-HvwNDzpX%@%X:_|{ߛڟc2+(ԅHj"B!u#K 8$ΦYL(Lmwҿ6 IK$t!10!#`B`Y6)Q` UKlj\YZbpZWO޵ߗ~/eCpp)Ns X)i 4DD%+}fSVh?|3&qV;/gO6}޳p}2R _Kw'@;P{ntP2[7.U"[Q PO-  0Jl !888Toٞs{ϾG++ׯ|ݻ>nG*V+VR}Y tlAXͥ/JGq1#:Zp4\X_huql~ 6V:mRVY5+WAI&)CNF1UYXS|S 3])lk(?!x=B$M(0 yBiY&B\:u( DwXk9,CD1׫X$èVn.`d+uhF7?5d{oFNjǼc yf~#~zٙK)ې#N*(IHO?c/9O49.4q;}'+W!A,et筛ozL986QN)E2߿s|йq?(sg둋GĐQ@H>|("#R>(fE A6+г@A Ҋ[˿p=_:R7Rv?S5,뷜Pg@ prF`-A1XBuV|(|9;n d$|盫["2 :u׿DjB|3TyӚ 145J&A(Qe2$FH{$dm]ۺ(˺z'/ǼCBljZ1"+ xk Nc(l]W[Ik (ʤ`^ 71 U5I6FjDz_T]0!L~NZcDk!l-h62Y;62Kx̺(@PK:D9(=VeT^靃?̸=k3ॖUY<"cGGۮH(Ipr Gs{;[K ;ueWVc~as^Z%1֦ldh8K+ˋΩ_zsxYk^yڛo,/,SSVWfWV\Gw`og2AD)eEQqpGxgwהuEf#75뽇A0SZ A3Ir IDAT1g3?QIU(vk ``x^zo>ɷă$"Gݵh4tA+Nuc]-t!HÝ7^}%Bmu]㼫bK?!.lXsSO$1"ӔhO7޺ 9F޺H*D1-~yC{Y$"Uڝ4Io\{Z8~$( $cp|"} zfj(ܥGN_7w^L|[0_=<*'P r 9: hfRf=ǬXփ|#Bf^wDoie\Ulu/4'GJSgò*`oUm;pk^?Uh6VWUs[irF 1%u Hw΅$:ڹܚ4/z<-&I]NϞZ]Yś!H)wZBVVIHZGJ DIHH33Eg2Ke]e%cĖ=*tu-jFlzb1f8zXf #Tu5ΙD~ʒ(t9+$"% %I R2 J㤑i &S9j{=Tk>(ֹ0q@y7cqYkR pu}>$IBBzP+kl`>ܻ{,N2o:u;+ ֹ]RRH u}ݛn՗b4>}dl{_48gҤl&IҥKʲx 㺮66HcZY̙'NnegELC@(MY7nD&D+T>pA "6Jѣ|< fTKVy5>퍕ۃ:[MC/7ӮTzB]K5 L-[m ?!fj#VP^\F/ 7Z8kz$Ff9\Y?=p2{;'s=v'KҲ8שֽf]߾y<(DZ ،RX˼LXY:5?>2wkS?7% Ѕa_{FڅP1zdw߾uǟ2z {Vii,qzZ 7;6ɴrj}m/?w >Қ_=+#f (0`f 8$/ ֳ bSUQ""1Ό[U, _ʆ4&̧ui1pfN:/~ǚqm hs09(Gcw mLl+dXW)P2üc%!ږiZ1Rd:ͧȳ4;U|!!GJZ2$&qJ`IbJCIep< [xW%K@ZJ' ΒV3;NCપy<20,Z礐EYH&dl7RIDH: ^ iA^+PוBKIQTWR ƹYeg+("vF@%{@"$A Ã5߃g, 3><DI]UV`wnZcÑ{ΟɺAQ=Fr`<2omO#$jzq>)l]x}I==:}.IGJHF3x3N6֏ZHh7"f(R;=k;ݹ#֜IB2$r A$!%9d􁽗{JƵׯ\8V6@ڪ}h.UuzS7g&>"ᨲ[ MjgudU,} E,^ Ǜg_z :f(M)ruOW׎ wNBpm n=<: A|Ӧ4MwmkVzZY#A LTS/bIM&$U3rI[[Wfc >y.rއN_{᧞:O7*z>knܻ70:W>cHT;7- <"?pvLӧǎHh 5|p"(Ir0s?h7j|_wӑ+ʄ}w٩ G>n^X'̌0̏c`5H20H9[cz`$e}FO-Gu%U>gVq; sFEv{hBjd, չA9njG/t5Vɴ"Y0Qn; @ckKgOʲֵEΦuݸ64AI@±pVHDB PfLx|\848bmkj 0|?J6F}5A"hGh{$LHbǍ4"R#Y5ݻ*$pY2RRyYY5R<;uDu4('Q) }!l6[F[cX,K"`߳EYJ EX3<\)RW$otۓhڼ"AՓoiomQ#Cx0áV5^7trԹN'z+@4Mqv#6x~nq<_3N\Kh5,#J,k!Hg(Jy :R:E- `mo*9Q"= ŀ!˽kkI(YGTqhͱwkA}˄!!L']vP,i! RV y["WiR&H[)4&UQ+J{F\(w3W^V_=plN`ʲ(*C`"?:𞕔QLR !$ Pҍ(jf֣^߼y.rk98Nq5e dHɲֺ( S0$MefэC BP^ AK(8̇Bx8/-hh SGqUE ,rkcG 545O>ħ^t<><3w4u!0??:+BJDβ$c"ǻ;>/fTC! :ϋ~5y_@v*Q(~֭"F8@UyԑRQ%0*g- PBS"@0gYpL&i]~'F߹pQSa\G=*y va3*[ &." w4t}㜺/ywhɣ+ݲ :ikfAf}_fVUU{OφB . -*De~~_ GaCdrH $%A f,=VWwwdV7ӔSUܪ{ɓ<Vw&XfD鉏0u+{,fOxgc8 ]LDkٞM,@ Z b߄^x(BkFT²N&xx6LA ",]spbAX6S1??7W:C`ah'e5Η?y/~}F)1*@D" - Y'g 3y .GʪGͩp, ]sE/ D("02pЈ5&vvIYǠA0Y 0(, D׀ȧ9LwMF.UK7LuƵ|l~~kܥks82ES%5.|4h;GݟÅ ,3ϚU DB.0oM/?;AYV%{'ǧcW^ $ICD{̰H5hR[2Fb(y2%t癙}|Mɰ8<}V L w] ¤~YS$5ׯ^K׮-K8{r4POE[uZLV)8I+ P!5 RO>=6K²̻֊D FY5F?m:/2YEn U8Ԙr0 O(YNNffޅmA!ŝi&_7~3t_>xɸ77y߹{I]S(x1V+<::XڕX/ރly^Ď-#vӏ޻}-OzDfƈJ B05)LHf7FCjU+38ZhB΅[Mqnį2EQzNSK*˃e6_~{' ÏVU9V+okv}/GNJ #Ҧ~Xv vѺn}PFkSѨof̓ڮkfNjq:LruHy"|txmҭ\[vH"'?`ͤI~'{}ͳ1F3 zӗ*/+_,ADfiRLm W_y{wn޺5':l?~o|B Fò^`I,oGGG.+ө4R״_x*j%YZСQh++N=@'B@ADGk.ΖVM}X栕Y,\9n&єaS o&'^oO"ٟ$})]պ_Z/ xe(/r+GY*m"N$&6?SNG/ԶhTc]y8=>}ӂz3/KI%iCX̫˶]xZ;չO{h4,h8^t]Ҳbv5omY>xАάC' 9Vw"HU  Dۖ7&Gi>pZ2 z1ºvqFGD K@m-:#Fk$\gtq!@<ڸ_}ݪf}Qj&&f;@k 3r^ YtbSR+B  MWuKԔUztzx2=/ Ԃ[Vj|b|։UATɼevUНԮc(TB`?WoܾwE_3>;qz0kG7ϝKDZKUYV<˭(DVm8:]6̻ VM??^mLw8״\֌lj]E%F>(st:CQ@$]9m50R<7}x~2ΝީgY66RPDcn !jU@e֘`0[d7gGdz9)z:?+7Q#[/U;I/gMhOzɽpgww~t"j0=>6 G8"廞c@DB| a1VqSZ]֩NHU}ZY1:sܸA)P*9UfH@ʦI{; |1$Jm߷VG/Ngo}oS&hNA~j\ˆ b5.U/;f*C\[/U&FfX|r+Z}jxow-@A1Y3g9Hg`5)- @E>)O9@iҍjrZ7/ngymv9޹pircrG?vBϖꣽ P;oX4gދ1v"jL`2!1vP6Klzj*bt҅.wGLBm͖pف->r<lt qɓ m_ k1zk e"y}שКm\4=oDCj12)s:AĪp@ ߽wgsk'3&7ʲyw?@Ḡ (ƈHI"n3XDBsY~|޹ݻo}JÿjuwijܚޱzW**$\A WUVUSZp vs#eEN6ZTLHD ( 0 Yj"(g :y3Q@U.z6-;Fn]ôovPm>ytgBV(6= 4&"jRڦ,2OA\`导ti{\bTyZ[/w>8w97$ݬɬw̔7,+I;gxSGǏNT 'c:oI$%њ $ET >* $b97dyDߵopgsXVFUy !!$ !Mѻ>Fi2@ՍDFG׺{{IK mZ9X S]$M{P&VUS{r5U}5kE"2 6I1D&/fNi$~ wK)\uW]nn֛DcQl(sGⱁW̛]nk9J&W&:S.O}5O·^G2I s5_k!dѴأmNX [@ѹ$˚*xZyqm#s# 0iep2v뻞Ό%c'{~[N" i]>~P;;煥:@!kM}1,=NRwHd e\r{q59[&Zy ƚӓJ5*`Dژ|2k<h8ɉYη-2 PE۬,jWKHueM4 4 Golo{pNʡN4#u4/m^ry֥K*6J 7& 0NQaY <Bl@Cϧh(h\Yik њM1Ԧ`ةƳ/~7 `cs'xkk9_(x)'Tf^)0koLbFb $&;Kܾ?nc~j%4GL| Aa6]DwTM)Q μ+:yOku %k3 B$kA)M P ţ p憊d"tc:ׯz1 2*PDOge2gInUU !2a`os (I5\kv\9{D@m9Wa1gsVy!(*aq} u|S}}g UF7&`\ksVض)FMx:Emֻ:! "ƅv&L矛 ZO5IJe?{~hF5rA bjMˤ<@ Z C$= -BGUBp^~җ擛7bBl_xG?wQq_l7]3T WWǺѨ̴|NCA!,^<3M[$6m`&e\Q8Vke\hIlfXDiwr1m[MqYQJlqrZE!̸nh9 !((휷$!8E "]gMRf +T'eHyf & @F)%ǧkpn2ir~|xﺶj2LO}]MA8 6&KzخVYQjXbf@nΦb+W?M7߿5Pe61I5<{Ab._d+.{`/[5iYeIMX, V]p#sJx},yb⹁6E L0RZ ,LTRzTbnU*}P/xޕGys1bXۦЁY<3).Vu"SmO< }MJ3X")DPl%T]}tشl6|p|1C'w7HwՀ$?qw}cY-[g.{&8DbbY? =('U6z?=ۅV`\}?m\Ԉ YcP8ʊ*B!}@ퟴz27'i&Cm@Yb E'EZ;k00iUVu!"@9n͌YƖg8;a#ˠVu6͠,?=>QXȲ4( $O=֫,ϊQUϖ^y'GJoǿ;˺gP.tUU键h4Z|eyW>/>{0_-;c0Β,/Ǔ Lgn9"iR2Niab%q?១-B@PNb5X!o*C (sF`s(EQ7ɥBhWOof| U'>XNW;TJnD~K ڸo\JGܵl\+'ݠ+Uo<ޗtQD OxFaCfd2`ùiD %G}̫)lSS,Ti^x룽?{Uхe~~|ZDd3/QAk{uމi0GAQ۳P"1OIiT'U,h{3 ^f_HT|ݸedA ܷ5KM`CtFUPG) ULx뵝7NH'{{=$wcR FVW}ʊ2`vS ZdzrhFԵ!|R^%[RV`sb'&ty۳}@삵v6_$ư|fѣO6:C3ƚc29"Aژ;1pH"♭5JN%dx0_X6dV4o]r9>31ZF[+Yf%$wUzAn<{W/|/͛ {w˟[vwܻ{}8eY*GΊk/"k;?>G! Gq5OQ^Ȳ<}5B0Xu0dKWV?DU@&H|m%v %`T[*M+3>m߃p`EDT bnfA҂E(E P@Qʫ}(r޺|mKD5ud`<YE?[,U^._||Vn#]oP,ΒXq$"1YI&%cx0I|Nh}l=q 3D\ 6V^<`ch\gDm?5vʚT ,+*3'9rj@PB<#<GY7QX#" Q@"?o21z3&Q@VMc$D!BPn>=&$YYsIjcyP5A*zzb۳ͦ颮u9g*k񩜁=U)#yeYMٳѦ aVta]h|͋.;w 3o>>"`8\ߝĊp}DCbth#J_6=9hƅڦ^M퍉kH]rpi4'@YYe>>yIL,t(EQ->:Q KT%zRvZkλH4As x&ZzC "P$ʼnң<=wCկݫuػw?; (FGvi<7.O^ox[ܽsEn_dv_Ȭ̃Jpuf׸͒wkzq;3ҽV8s O&%Y×Lک:.wIN0~t+uXHD"RJY5Qs(m9eb2m8N'ܯoׅ^!K6zE{$΅mUU!BР}DhdK`_,ɕj4v@+ Y9Ȍ=]oN&MɅKM_eoҞ^3Y%FKic\חaz~gη/n1ꥃ : DЛ2ݞW0k<r-QN=ֱ;²J@zȢ"!'$IdB!J:CTB#6e??{3:Ivvw\&}Mi{VC* F0!F D#q<ݞ|bdkSmçw,6pOݟ>p LAID)Vǧ_J!DNjfث{@W$!͹M; p`>D^lKEY[g:?F!`h<ˮuNPi:"I,DAs]??\/U.Xv^A}Ӷ'e#5'M*KHpOx+#Eqrx0wݵmj3e !Gc ֦(|]$SIMW+'<gk0!覞yG0:HiM욺@^H"$!Ja!Mn{|>;Nn|h{ IRt\._\׫l4],fC߇Q'QEU]F4GQ:QEkԊ6(FBڮs?}L5c,WH]v%FǾCĘ|KwoܸQVG}(~_ zwɛo$ϊ*׿+?G끝,)ܺa1)b{{"b.7MD껮kGxz7/@ySfgaa8Y 6Qf`  A1@/Piz7 8Mlk"k hJ2Z+O,"hQl #2P3w.B ,>D@D\ly:rV~:&1" GFAm"Ơҷbo (Mx8* 6S&m#'Ro>9=yc^O=DBg6"\o/LP֢R ̬1jӿPwC,@LY0xZ7_v)y>jMɱ/OLBQ%ob8Lʒ Ǘw+Ϊ qH IDATdc\npwں;QgDӵ!2%6諪/]eŀCH )M Ez x4zcz-#rz[(Lʰ:$Jpj~?,7^W_ևʋ/;wݽo_?2if@BJػ!C̠Z)6zQV 50?97J71GfpЭڃ:EU~b9ϖe#7ݾZ/\^7;7kGE^lnl__o={cUU;;w6٘L^|E$IEOˬ,4ˊ M:sٻwo$MMuR #D@FYBzU/-sБx`jt4K`2AF"B<" M~ΧܹcK &LW]۬ZڝXޝ[N\#Fߓ>w F1j::Ri^:Aݹ}c͂:t RErDQ8snxb# ;O~r~g ;^4h $(pw?TrPȉ><Ω̬/Lߋp1*CA((  泠x;P-G#W8vGDAl1aA@\p!.+2RT T`ՂYT0G- 6lPBc@n$a4#nvW6|Ec4ṶVRMGbdz~4T :' @v6re{Qň1" N8ɆbY`/ `2AFxyQ>MЁp-mvmwa83EJ_` بϴՈf %p әZ([n鯴m2ﵫE3#&Y6 ӱcfEQ.n;VCcCГKc_kSg_tbteO" 3+*MyXCZG";㔷hOi;ES2>a8,@a\W8[7k߮3'O5X,Z|DZh?&6 ۧ*EQjFF2Mp#+Tw}q#Ez56MFiw:3j)*F)qJu˰mDfǧTfyy2 l._ʍ޼&F0H*jX;߿ZOXo}ssz,')e "1 MӔz\r:N,`@1XSD( T"Q&l۫TʜQEwI-_8 -:hAx'@;mBU P#jtϱùöhVq +p@1N_XYĔ11bLIEO~-KOH>c&@Ƶ_"I3햪O@5@p1^8}ڿ?`=2e!P`cbrks"6׀w;eLK+B  8T1 BPXTpTj9ǂ+uMW J6 E@SLB .,-DS6VTBx :,.]qTհb FBH"#ƸSD ]"Bx;~"@ #a$8 cHݪ rtu0*hW۾&N[k7ufQjٌV[6!F8WFD:Ёsy5ZH.T{3e\&@@B0Ze(b8"„8,WI0Fz`u sR ^-le[jTzr#PbNH RTFDR85Y̊DA%Ek @pkb;gPr``֒mO$ +ĊE83_(D OV ``}Pn5SU58c)zU֓//ߺy'^_y_({.x/"֨m( HfR PuAYEHD-F W4m%J9"+$vťh4yn,h5-4ETJ=<9Fj4Z"x21=ujŒiueE,MU򛛍zc3s6"H`F+++_Ո9<08:28qW*`) QezoX&&XAU;x:XVQciw0 @KRwM=>M޼ƒٌMϧr@s("AY>,M'VU|sĨapƨO- ѱ*հNg[D{}5۾DS f{RqSjEq-SQ@JfȹsJQqRDoyL#ˇ}Jƺ,9ǘ؇ y7IV4%18<Kgg}< 8L%410pZj4[U+1&MaEU!ζa) 1!R@D"| .E!cPB1pA H)#h? \&Kdi:WJb&2 SǝcölY;1A1(s*+\̊&wb0OGWv@;I߆ZrLe.v`2 ]L (Dab) ^-.OG1F2߰\SˎE^i23n3gzbp#ޮu[vw?x7~lB%$M/mVVj-a9\Q!U"4k1bb"ՉBN'GR}{~~|`%A|/R/51TF'WD10kHGTbs\*WJ"(0&=_ӉTp@ $=?McwLi6 wlmw@`*A1Mbদ}[Uئ*r<ΨӀ#!H<`L4M덖ykq$iZvEd!iS\ZKeﺆe+=eX)MMO!ebۭN>g8LIéXVۨ5I&Qi8ʯכ-Sҩ$QhF9Ģ1Bh[먚(VO?Ct)@TUӴf(!N~}7NTSGusV!q0iLb%rnU!|iL-:袁7げƂr|>h&4ҿIzMjb`"xvƍ>k c #g_`+S2ܨhg#+ ƹ \,ԪIm@ca&OrÜ ZkkJmd7m@3XTr  0f94x@5B @D`೎ <vnd۶9\#yA0G|""u~ލk޽*< nEM(iJ&Y5Qh{zD:3ݬ S7/r_*D8s!8_ 1( .f\se)1t(P4Em+DE8ec@*B(vpd.,WUB`$ aߓFsʵ p.\ L3N"aBS8Tu`Ęh;R!Yo !}wXzn9c[ x `,W{ p+ՊKT;=DR$<8Oe\VkЀ<x\NkN#EcrY8?xdU(lkՀd:7s.'8Hf4]щVXηm &Dt(f+:tbtKFhFED2Z^ZLg3p(0wjf:<˫ӎFcHiD!cΘ㺪**!`}rsЁX걨CW`Tb"`ʎjY!AS0.^O3abY#$ۗfi''<>^;H!$Uo`qªzQU0 Ќ|됱V" 0W\ s\SI GE; [4l6=C PJBQho@pY)I"݂ӀwQGx_;SGv h6 ~8ږn "Ů ! X~0ޓ[Y`0xE;z[f|2a :N5=RRDSO_q-9H<52Q`:PrN!. +mO yOv ӱd` S? t1'eTQLfHR=EC :m&#=q 3U?gjo>:o'׈jÉ2[ᄦԏA iQaP!CV'51[I|m#Էqۉ"t.K dYbW1hOv ٮۏsH{~{M@,pIDq:Ө jB(P_Qp؅XКGuij=QMY Npzhr׾'8,(6me+B0B\HT\*دdx0tmm$fOx$b C@ABH&b2 B y:Aԝ* @c7B H6B#h.`vwV8ڳ$"igPwVW.O!Ii;/K{=!{z /c;yQZnF^kĩSK+aAx$b14TE1Mj4|[ŢBTB @XD%h,pLH:bv햢jx(JT:5|PTQeܲz-S 5Gu4Ư7Q'7#H0HUճx Γ%UX(_uZ=FM0ѿgr(Ox*IRUzc@Dǧ!h7QU?r݇>M{'̾7aL|ƕYhtmm<#$0  HιHO]6!K)FR׹nC}4ơA܊o+:o! qQǓ۳y1`0FD^=eS,Eg.!R՛7_VWKN*e 2iWJ .X:0Bl#V]z [zShdYu+J2jVj|>Sa2k*RBQ?0 6U+ORzgF' yVՂm>akrjNg並(wVۿjZ/*Ad2A5Mya) !t],Klf2!"i溮8_^@,aP+FZ2jI:D"UU}i! B(}~:#b/DKt:)i_^#8v{ۚ"!54DžDBVb?3%y\.]ۊ/%Qاɗ)`/;uwMHwI1cK/ruq>#zDkJOBH>zy }1;v,CRZ;ņ^}Hmaߋz-t}J@\B{7G ! {Gd D"F#JZ-Md䭻/ܿ/Bdj:::*Y$\B !EyPk!yDJDE"us!wBj?|= sd2cH$L%5!BϴB J)<ɔ]=j5 F nnvL49_!._jnݺoH@RPU\e77˗/ˀLht+(" -z2qN1VG׿n6Vbv!mۜV*X#WFMOO_vR:==]V)ιmۄBd>UUڶjm+j4ɷfSUչ)4 !g"<@q'ロJ~G<$p]Z]]_~n !!#{NV`GqOMMI%Zpw.%ڵk몪pOӗB,cgq]N~q}{xܶ핕t:9Z\\, w;v8s0,zgff?n 3MS2k&ObX,6???99i3<o=z4뺞d$SZ}m_%]$hVkhhW^m6ʥK4M}'>~>s>66ioݺhRzҥ b8fT*8q?i<'X8K/7;;2ƞ~镕C}2{c|'Of2Rteu/^x)BUU#iRҋ"4zh4^|Eqz{{jX|_uy4뺳2?[֧~HQء?{EnB,,,Ȅ駟O:rP6u}yyY/' HwyW~_EQ4KR8|st"f7nH 'OfڵkBztt:VWW_~^xann###Gw+u{{!m">$=~f ƸRlll<.KwgՇ\M^|ʼn|>(J(y0;wiZZMӹ\W_}նmu !l!8::zIUU-!D|xzw}z~鉉O`vp椰<#ElW^1MݻNs.? __|c\V17N>mѣG_}RJ m:t^ǎg=z5,+liiad5ݻw''' !ӔRNNN*"S.agm }g~D7t!!į~L&sѩ)Xպ~'<ϣJODѵᕕx<{KEzE:|@9}3<e}JyÏ=ثiܲ'O<77d FBakkkdd/¾u~Au:?׮]k}gMjq{dۻf 8sj6ra'ƸX,~׮]o_·Z믿.E {l?99xwpy*kTCcғ`YO?|cJeyy _xqbbbxxRR,2cLQJ2;;{) !Jx<)݆r΃ Nbm۟l+3?Rn&9x/8:: L&뺇:uwFl~ir )RT*ϟ?-"c_etW\ېكZU׷n߾}eygR:Zz4NAшD"j\.[[~\xBe'(wi:Bh```vv1v…d2j+ʙ3gz{{R&cǎI͛dO<חfDX @JNWGQq.Flȑ#333l6 \NollǏRL& r͛73 IuwYa𮉗^,7xd^d2nkyhRj50nܸ100y^\bfsccΝ;'N(1Jmx\dz!D*84Bjm۾yɓ'cXPp'VH$|t]QT*J"x,˒f\nZGǏo6D"+W;vRd_\iu:0sH$H$ BF,;tP*,, +៚- !t<DL&366j Boo/!$zH$92==jj4RzzzFFF~rcccBaxxxzz駟 6yE2Ee@!wޝ׿D~_?7\YY9pUMhtnn^3 ?y,[ZZoO>Ç !.\_Bo~CBRz#GDp 8aaP$ 6x ^,tqQ薫WH#E w YsNLnBȾ2f577w̙2J ].?7|3L|>>>n۶iW\rdݻ###sss'|ƍ_WJ:k+++9Y !+++VԩSݬ%#Zt~߽+++r9>o:ujeee``@n<22iZ\6 _,/_NRl7?7nd,X,~TUΝ;wճgϮ9sfvvVn\=v؍7Н;wRDeȋB-KS'7 ]NfE{A6AԅŒK(O0R;mȸnh4ڽRE K]Bqk;w싔Af9R ?܀...8q"EIs)|||_]&HO>5M,+LzwكovٔϞ?G9vx\T*[&IJR]04 ۶TiBT;Q=!Pn=x:Й.%S=z1dؽj:~.Î"WMUU/\0<<\*&&&Ν;:8ϷmMlxb&~ꩧz{{z)E9{K/tʕwyDzw,5W<H!PiaױJΜ9sv-;KKKgϞ߱1',Kd\.KHBH9===ΝpႮkkk/^|>99yر$F!oVeyyyzz:4Dٗ"H.AꯙB"nF;;vlo0/xR$U=iކ/W)AApX,&o+AR) nݔOTUM&3_*r|>z. cldd$JMLL$IJ;saɲryeba|>}222kw(~۷oKdVXn6c¹VKyݖ,ftZyz]"* HTRit|U,;N:+ MӶVWW%&˥R'NJVUդ}ցCq|;h4F>ty*X|%?ȑ#aErJݾ}$BHǤv0ƾj5(Eٶ-crwK)UU$0 chh9ÅBh|_fj'xɓSSSÇG"w>d錏L&cX"u}ff&9s&ngG)rnG֖mۣ499n>_]]ؐͭՕk׮ [2d{ڵ7o޺uP(,--E"K.˗/'ɇ0ƥRw9x`%H$$8q4d2dѨ_p!JR3g-eY> ,+IlNZ\XXn(kn#xkk+8p```,4ٳgE1MSJSOEh4J1MVE"G*#(-dzzz9,Krc.NÇKy0nl}}r\({7|뭷?44tեh4zՉK.V;vX,?m4W\iZNu]]%zɓo?ItRjC'͝={R{V155y}/~ [>~3777_^,]o`` ˈRݧi$Uw,nJMB0\"8u:ɥs )5xBWfw=}$c̶{R4MEQfffo?k۾?At]{'Nd2?xg$KΜ9rBPҨ?rr u]œ\}gb!Yt``@BwG+#GEQϮ"J!T;44$?[!B޲\.9GFFd`iddD뚦69rL~2/N]۾ ]{h4(O?8gϞ;h4cNLL,..Vs?~|vvѣ20~W^yecccyyʕ+g BG~ ]P賳êdÇߺu+\YƆ^w688(3gϗQu?G JB(~(,'_^D9p@^\٤?Rh4rw7fSĦ%RΝ;wΝ#G<ӑHDz'`*zLA|>/`_Ν,Fcqͻ&] H ^?ؘĺL^"4.8sw_‹a—r=>B/y([o3q}zMB|I<"]xlJtf<ohڵkaDѷzKnݺl'dE</˹\lz׷[.>r!/..r'Nj5t钮?;<^fxп\>͚AxD}x-wjCȿ/uS ;?)=R=ByD}D=/ c]ib' q\0!$3t”bI[Űr%O!˲0tK_lvw^tm C*LqB/zwˏ;IջRI7^ENzf7SϸxyWgaaz0xor0 ln;ftsBwK|PS$N!P5ʉ~{ơ177'1?ӬK{P(,..H$rZH$Em{aaa~~^Q9]ם }߅C[[[@(fiyuuݫW$&4%ݲIYߎn;DnmmɌ]8t])SSSr9,U!HV!ToܸQ,5MoZYk!h4*z4T*===b'I]IQU1v͐% sj2Mƍm{9T*kkkHDZ4T*LfkkT*e2.)TUUQYsDظL~FANi<;R:33juqq1$RfJarpfffq|z$M!ju~~ݻ\Xy_x͛7{{{,˚-aHdXvaqqQ4ɮ+++dR2I,m:VZ^"pRP(t:]ii'a=ϋbdZ&3%.+;?%1"txxjI"DD&''$c&->iOjL&yr|f8`l4vm۔ҁnIDAT۶eUEqt:m۶L]\]]B:t(7zǑ0 isjO*f$: X,&accC{'RT8XL*.e5GGG?Y~](JA>|XeKwUU]__?t萪===ccclX|^އe9@Y9/}}}htcc#X|Сpэ3zzz 8r䈬:zyto?155뺴nC!PBe, ǧR)5BUU%[166fyeYccc>Q - 쮎+f|VJ}/nϥ*|.K|s,ZnejAh4:::ST Èb LLLB&&&I$s \5b,C- HRH[[/gnK>=]3A7Z_,KJLRΰrXdJ2Xjy/$v[芢lll,G4%UD|*<cemllȥE722R,e?GFF|ߗGdb(H$벖^lY%4-2LTEn^SJ5Ʋ:>sﭪ[]U鞙yc&bM'q@EA((1aG,@$GN@J" 3JX`~w>c?NW$":us{Y{=q#}cȷPCTiB jo;L.3gΨj$7qXsѡSW6 /"jgiJۭ7c/_nҍmshZٳg?~yy&tz^ڵk8<"=zfYքЙʕ+M2Ԧb3ɝsMhFcj^@ki(dkq3sss!N}N>}ر2WnBJ[]]-ryy[z퍬=7(z-o=#;}C!vlyW=Ƿo{:m孆cݰvN[;`{MO<:v^[ X4omr:[A:U<40Nz/nˁ<1;;=Eϴ{h<[n>g #LoÔ7Ξ[$ݪ3ݱZ{4Wݷ<׽`Ƞ[yGg5azbv:>h ZgTscfު jءgzs{!L]-vgs{7{=N께}ƌ3f|rO(,3f̘q/03f̘q03f̘qpt Ƈ9n<]&:9]5EJt֝nȌ:⋗.]ezO}Ʒ矿#ayO^xÇ{t{@쨾*Qm>q! @  [ ] wƛ)0 (ARh.4p@"(I-~Ȼ)ܸg.0};%䡔߹xzD(&q]6=&2ֿw+!anX(78u:4J.ʔav.՚EUY% (4QTR +*%/̓^O}˿$ȥΒϝ˔4 FkN{N/ K#EBDPP@@l rDPloL;݌3>)zt% > {= bd``frQ0UB#"4 dw/~> ~_ٿߕU8M8W8ę=M:/+_u#:dSf"tcP*z{T&WٞΘGa@?td0d<&,!>"iad6M *H *AՊQYr;,*KTch¼!vCGm'C ˝k ƣss,q+xIG˺\ jcYICgܩU#I0m5PH<>gNwo:t?8m*'=pW5 J4 WMKx, ;Uꒁ+! ȞTuIWO8򾍍9sn4WX=NBd}IB%Bf9kF ibTO7cEWQAQUUIۭ/B>/\/>SL?_o_xjIL kWze≠ISI bRN"p,+w-`QGL|9  aB DUpI8rMY^oVb({"Q)C%ӲƠA /(Hals<ձ o*QE$8\fƽϯx#;qcp|k\"Κ&ƸP-vϸwI3äա̩P01UE8Y jP*74>CiA`1??Qvٻ/s^sɮ<|`0YG?]S9k!hRb@Hf^`WZ}+zP`MTAx# nL NDy_Zyx%T@O8䉣o㰿V*{ceEJ:2$Sb'_8X7&V%VWRU&D K"Vq<(x`|Y,ZzâY3VSq\ #]YK?cG5U"j#">8}_+6:+ַGĦb[`U ľc ϸ!pgaN>DNs"b $@DCXm(*mw)F?r >շ\xI`C*e1^ٷx+͍}Np4XY\8D4 Xw:,[czUِ:61 alakC@ 1N@SI\q z=~_3/,LB6 "T"}G~oW r`ƌ`$ZY M|?yt󁽃6~djV’:;m)rIنFtFJE %foUzR>4u&m2Zh)[QW~g\1b_ dYzS栝QO}qhFQ)c L2ah&gC1諨Bn<)\^IvACbAT4((ֲ QkW._B풂m8Zâ9,6j-sZ8|`q㏠RIM%9PC.IX\lbc(FFKB༕#x-:{3kUB^2[r {G=z⁥nqA0p]W^ׇ Idhu_5G{k{k`dm`/bE0:Cu<$1w]Ϡ}h 5f jЖ^0L4f&7 4Oboqi^q5, B5x(.OchA|Q"A7G/VUcK^rli>(=[ꕣ}UbdZ" KuXRϸIly0kk@Rj2jmWEQJK&"Ahb$eGv:kk5֥/GĖ8bdLa^?(?|G{­ST"yB"ilƘPWZUUF#5*D"EpWiܹYMVyiZ.`ҹX%)%F* ~ issQ5OŸd咵}KG LZBjkRZ =P %sq9~-rTVĩ^}V*ebV^s*몊wD1"JXDQ]!bĆ9Ak= IB%^0u)kW7xd?1ID E@\x@?'_Jh8^M &Zb3{ˌ{CIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot5.png0000644000175000017500000040465214620351225030340 0ustar00hanshansPNG  IHDR'65P)sBITO IDATxw]u?קrӓL&Z(;"`.ݵ+kE]a?Q]Wu]EQH' !LϽsicfR' $C >`ryO;0 x"(}wHPa˞:aNJd02g,p^ГV @^eoV{9:܋Ǡ㟨N~6ݏ)3 Kv[HP۸0Jl lߝz7}o+38̅?\S ?%V,5c#7_*༼bρ*q5t C ͨpEx?aH;p\ > ѐs/qLz=8곸Cx{ﵡBw`R֖ w!}߽ݳ2a;_2}|ӮU w{Ka-li5 x" ۱/a1rFX( MPh9y,f\]*0omeC̼oNL zz#퐅!0b|6Gdg;íb j']7+g Ѐw.{4,@ ȵ>7kr7Dўz)(DSf3;[0 o\:uH #}) Tv_%3?I:v1 ?4.$g× Z<7}4s?Â^+??&R1g;9-d@)"^™F4P7aqs\'=,( o {xi^3 !5 9nx96;X1?K32!n(# !0 8uuPg k(tc+|pAB>@'NmKq፠}x /UY`EB`9}/dK WSOx <6 nDێo ⲯ4e^Ēp 㰝IЙ\m"". 4LۚaXވ:P#+h ߁ucW~q\\^O.pϿbxƖ|(o`h-)|Nj璽ǰ-p ()Nǜd|)l|W]1Dx^ѡm"Br}M2Oߢġ̒a/W`/w c4m@Ac7?8}_ZgMO"ր%bx[՞ny=ڗ8F< s"`k(x4eyFi`O܉x#:Kq 1ލ?}&<+q.7`iX$ŵ;!p/0zE&|OǗNC sj0 NljV ZXN/YoCl>]Ķ';5Rn^-4-Ň~ q{=cvJ@4{k&}0;F`t|5#50}U4::p5_mD%aG,=sB%2x}-ӉLtK]1L.`=8ۡ3Qg-l>,gNTjO)@/W%ab*caa~|aR(! aKLH8aqd"/lL aF30 Ø>&aD0 ccaLu 0ca1}L1 &L9wx1aGȓ1M:a @LlDP'|X"BD/QLw x9OW R7][ƞH6 )~Bʳ?*Oz )_N=`]՗: aIB3$Ϲ^ϓo~ zr:.w#7^-Qfl֩cߡ}i1tD^c0Ը}N}|prrN9L~jg/*/<4P+o#+` Qr sIi!o׀xÝzѫ[Izy, Еa}=($ȥMa+B  ./ ~΃Juƿ?> {p΃ t,wu 3n\=6IW&)ѭ!]O;gG ۅM7a*O(v_ϓlg"~wȯ }n>@A=.7PKko'[~bA@V5wANCw*|`9S|um'ZL_H>G]R8̅{Ne\p-FvqtfS1Cł [iaݲH-xr裎,`v5ݱT^|=: dB}5Q.p;pwc%u8Ǧvvyg=ZNPQoDv>ة2|yU4D;qCˌ'7Ӏ۩ EZ[!;g /X;_>1c'{Km͋t|Rbn@y~p(8{ӧx x367 ah\FZ@\w'} &,/T*ʆaY:Z"LC4g\|p>@܎!/ <ѝ_C}_|M#ǒ!Ŏֵ;b`y 8C0.@@Xtv&|3ah^ @Wa2ĥ_OMÒ+Ѻ=~z%05ØH=ݔw x۞P +1kR'gvHݠ٪S׺ԩ 'N@Td[U-$ n}pndJQ@t0#$m1Yqu8.B4N}"S tN| \G?=|:s-wqS ԍRǿ>%R߭<3!%YwAn !q ][ڥ%ճNQǽm{4iV 4oIOers-~ (dQXV8ܠ>k}ȝ}+B`h r30(#U H;~ ]uvPȶ؟>LMHy닭0Ձaw1{˸sES#z?͡;"݁G~[(P+aF4 1@>΂fHw3*݌O02# ݏ'خ}:r  U2KCAzWc %/56>NV8}ŶCd9 }+VPSma{#ZcK߯PTۇ[_| p@\~-aP xǸxխXu;N{?J[ѽ *}h?  q knaM^MХ瞭=JkNAs%8d/qghV'~>e؀ v@B^oal aq24?yԙʽ "䫦vmC6޿ Mye!|8FUl f? Yp܈?ðxs*DG~G?u?ˇ8lOU 3EغruQڽ hn~W|#7O1O:0 cEг_%k0a|xC=*qx/j X.' tրբ9#vE@lDϔ`tXa,Ļyy.@5y[l E O}m`{~K2VCc˅-9h:cY#w6 =I @#wwXaDxBv "/'z|pz0Q0Ρn:g<0 Ø>&aD0 ccaLu 0ca1}L1 0?̟ujaRdzypa!V?g>O~j=q"!n~8pa/t=6mbl;Z+:::c]]]Eh_0 eh?5ɤ,Js~{;8q)d0 8RPJ L}Ud>K ;_\2a`MҮ@MnT&U._' P2% ! ;W}to'@ǒ&`)ߟO)!58>2f ʽݾ[vxʝ((W@NSDFG< <̑1}-lGjmfm_z#hW^hRd?)B|my]TjC] P{yGruwSP{;RzjMg q9H{tC  *^v#5?]K2]V'(w.kt#15Ki=;~;V6޽ FK`2^،j,lȉH0Wv;w/v0 w_M޽dp;WѝOG+; RD R#iLmHIh̤TJJJ,8SJA5g^$ jΥkHܲǎd䅁ET8SJ3B,FRRT|H9̢R )%QTJ(*TeYB)#Ji$q,@eɄFtyC,qvD_48R jlh֣qPHRZAK=rDiAV,3JRiM!y.H%b6㌲HDJDrfSQ~(TxLASJGp:Ɣ)5Îr)=ϽV#W{ﲄL~#Zik `#8^C]9~P۶j׳G7Z'b@ۖki#EL^ ݘn{ޯff>yɶ[lQb{_OcvuBQ?R+r;$2!jJ1)Z) BVZʪ&Ts8cRR#EVDqF0Ki "t¶\@6A"q馕Ϯgo+'2_0q:e\k\s Q ƶxUjQTWئN8[ ,KAm^aㆶPe+V654$loj#+h,:@+.BRtQ_v?rsZP=oT -I 4J3*֒c6KDa ܎|ޗ"s9ou{YVukiiZ\Y )f;] ul[H&(Qj^TX- qᒘ*)"Hq1̳z-VPM!3 ]9#BQ)I2M%*#Kr> jŝ(cvΥ37=paYq nkq6|q;vƹ˶GZu"lAl*V2HZPC x* ,!ac;J+3ʨ&DX3RrƂr8w^~{5gNjIKu[zV;tXTܺ惲ܐ/tұ{EUĢGΦ_\7NeDh$RE @H#m(бZWJ]PRR%L)"(4!Dk7f^:q#jֆü*PanH3.ൂ-1#yKSn" (ל^XrLv9- zpM0)W RM U"`dx  mISSS<#%ܶ0еjmd(A({tͤ$⮈'ZFQ*u)4dtD{AZ?cKP)Ue&bٙ)QI5훇0wph!ݘ#7 qnX9I\Q8+u!@]k WJRrPue Pi(-Ak1-*a*T#hE!")VZ %Pu?mM׼d:6gI*#Bo̖#f_eDƴ#9:зŋ~,RgsaFkFZ-V¢8q\;YH]^Z֙3;$rON:fIl3bg^cT=wJ\{^M1%[ny8AX||K:r2d2৻K>𚎙Jrggzf{u[JT<ܻ󻆆kocn6fJjE0q&szvٖZr9JQVEE jnIƆ>g);ʯ妬 V؛EɦM 3EDG`ڊ)BRj0qMTR4RyvMq9N_ǨXonsgWA]i(i9i>T=usoeKV>SN<[?־ |e[v+J 6eACK%5%rFA l+ Bct!JI"jM sгg[tg<Ù]*/$@[֝DcӆWPB!/5Mc Mcq#G $1ia_5]LُM؝y pχ: RR)"%RDRBP%!-BBЏRP802kn100\PpGѨ~$P),oD3%|qm[wa!r96)U+~ؔܞ+ YΟ17YOhp¨E)Y羦YD991m JumNTU±z{OsZQyd, Q@ P94G*?jgRqU5tLgvT*LQ0-kR5ѐR=/H#J9$w~=ҘM%f4u˒+ޚeِ#1:VyuPKƣHJ30Jڃ ]C[6gm߿K;M'jϬєk۲(AhjhH4VfRض&V !-@KQpJ@{j:rl PTBȿ<_e0k!1є5%ɤWWNgPFJ1@CʒX,h%sV ^7L8xh2r&s! 6SNT"@\xFTip&4aPJ5$$Q@C0p͉vܸ!/TՐKe;g56Ͽ3P)K~6}~wƨ}3zyT{9. ym3/k.[|D?ݚmvd|a򞌼D1J3V.Y$V H *w{ ?)V,tR2g~9&Hܞjjl4("LvV*ẵ[:ۇe(HX "J6 ߑnX?-W,}+ԞZ:$#ս 2,eR*W~>"Z,V[ZpҒ&݁X;2"UMD1bEܑD،TX,_,l8zQ N:9cq▫g6Z:#鸓Ԥ_HyLR7,F%R.-ИVDu`wXT[f:=-nv2Zs۟uRnc`eG`A] 5^aպO:80G7-]r,;K~|SI#64'J:./{ԚShFRӸk%E]~H ( 4)!"J _XwКፖ4\-[0DQɊ'[\wbq)á9zk%$k/tN߀:7d"5սQUZ jdt"lDZm^NLT#'X BHtfmڋ_ӊŝM$4WAX-F`/ "ڛ-J$; TPu֡JrmJK-T}j[gXw+WOڬ)q]d?n;[{VEsRִݷ5ߑerqDQ&&;Xиv D8ӄћ]:㸾 -&҉kV]Z+C1A/]rm\gek7[ d(`&{񍭳:. s/5+-< jUJBMH RYQV|B^R:&hGFM±])^k0FI@9:Re S Z[zc\S]9ZInt6588϶ʈv2딪Tbppā )c)>|o4E8և?pu*E*T+^0WUjQB[sN ֌l6O8|~x؉12RJBVZ>*H:#"-PH$Z q:=[R 8RWAR+Dd8pqժj(Q~k_r+OZR͙Jj-D)qsR-(q %h @NAhF4UBkJQ%LH)*&RMh;a1ljkBz Z T*%"eRRk P.Y&V$B0ةD2/Gm-MO TgVkE9 V\t.{kyҬo˦O?g»zAJR)r3Z2]'?XJݗDETk¨ I+%(R0:v_O =6K!e٣hgM-ˮLw9+*KU%$PT Xtja˜pܓ4tc;# iE#˖hJB5Y97Owg7Kv!(:so=g׷}RPŞ' oJ|}g'9}}c/c7nl55!IgyvН(uf,LRvk5|]N?sc٥0,7iE&E2h hE"I"PqEg֚x|p k$Yb+Bfg[cJd( la #vF[mrmiY 8DD0bmSP&+'^F![𰟃 w~^wto֜uaYu3U I!G"b ɰ#d"EkdS&RvX2*K˂c27RֈM& IFk],k-Xv<!90C2/ ;fn>DfUui (M:Ȳ\օ.JPJT$EÉ@R TP ю=vnnvwtj ]1Ǘ/\sYo;v?hiZ[7 QUB'j=d`Zoڊ9Y_4 x\Ea `їU8 3 ӢH)<Ymx<͎G _UJei$VߴtOYIF$K ܕ˩W"ONKpVZ4%V: ρP"'@TC*ks9~8zd+#T9X F&0R5lhu:IlHH: [G=d%XgIIoOܸz냧~?Wj t+xqun鯸OG~u7~䀘R8Ģ,9B[(; !sZfhAsn  @RmfpO#}{Ue4.`[H(T8Fv2D'"<ɲ"M7+y 0#f"Tֲ16ˋDֹsA٤q |Jt9wP+JIk6%0ZNJ (=?eBHUJ)u.@P朱nfqMEnWZS'N?CE~L;iq "SGkw ]n1E?qq:9ҩvYvhnmcX^dlF.GnoWgceB ~eŋDeZ|+/ƼBeY $l#)jT3 ; J.h\ +@+Ijn4`gg O+Xi-x%ӓ$d'@;&g%J)!c0vQm&MmJa֥GN<;ӧo: U/Azi۝qb(qOJ[^QZвVJ kw7F3;+dB,З_+2o_][ۨޑٗn/]-^2c+\ԲwLkPX /KmQ9-df&BZ<&y +3$^/Ԛ@! ja&V`qVPrvA{'D1iqU [@yڱCiC阁$01M@tEλl3 )@(s[x,;t BJY|Ij4$|Gs"!{`bЉ fc=N׋҂_eiє V+bEup^P'JBw.1@f PӲ(Ш kcgH(%}Xk`&~MS̀1:,Uxmoܰ,,̊{=NPQdK3HJ)A~QPld$iz3Fwb 7 ;L"XT|OΔAAYSDrc[1V k-"2[ØV5fz=הWK,ZjKJn](/ _#*njc?l^+8lO?0YꑲM߉N}kF"2ntg+չ۷ot\ˆC=QQO.wDmgfwtm9˗<\cHY!EE-jnV֟#OP k4ťUJn}gyuSD^vaj<Mۗz;[)/|e˒; _=(_9=[4Fp^d Ĉ15 ̝c0B :_8wp4iB{}HUl=;?ZVH"||ƜMj;l/Fa4")ݍJ633Z|ٞ:p͕:y폔mo?e9T.EkWY`Re{zW:-,37-+z- r(̰N#")Cs8$."P@(>I'C#x1=i;ZϳA3?r|Lc4JV U (ΡѪ wphY8t16,-RcԩqH@Ɣe)'^q+-!Espti8YOP:cJD*?O?[':hHqa@[kk误H %)/+o<%/j +Z51ooX[:aBf!PւٙƬ?3k <=שyV/Xd]yn^tJN"+*FZԔe~R]j?z6XiE5p2hqvqkXZclmG.ғĽ"P@@m-dYIpPE揇ewt<ɓnW=)2ɒ 5a-7vΟɵ|R?ٻp y9K<2󲼺Zkݛ[pd']C TgQVQ*c $Ua@RH)zY cW 8]T KKCSP^6dȮZQԡ2IiA(7iu8b1:78 BR bd}E,ؕJ I$7Ӭȏŗ^?!~I(I!5B =i=R})vjυ޼%ޕGpΰ ??iS_?qNAϬy/t>;%ie Z$Ԁ=C$)-P8({ b * T@F HJ˴p` Kv֕E6v m"Z8 p FWփɵ$ڮѹq<[dyU-THF]62IlY?9y(3 j,ߓtwarxk@`o歽j!mgګ}1|xO9{uxlٳ/_glٙ[X߼wwg_S -H(԰}};VM`a@rNUo΄ w<՝q }l)w(å~vF9 ˋ:&AsQ(PlXב| qʚIeet!0.*F% JuyY , KΌ(8~˗} f*(FAxǪv;+ : r7Z8a Uw$wlx`(%WZY $_y߉MX)ƭfz+K@gng/n5aI׶{2d8~S"bH@W "v!Lt SW8R))uZ(v.$iHXQ)ӵԫW:iՊ2ISVY&t yZ](˼p "6"RI_ *@{Sa͹8q;+ɧ~o9MH$g R Q՚,:Ĺ5F[+Y 3!xCӹc '۫~ .??quGmo|b5:ݸ[Ԗ*@"{Ng !kc) /X D@1].A;)$EIDc! Z(Kv; (A7%> iw [fĺȫݹ~rhA:p|3`g@..̥ 4j-^UUse x~[3v_r)P*Ww չ8褕OƦجLԓ]t?/O~`Ь…fU*YZ|;ssвKJeZ  w uY6a`F(,,gnU]/8_fkw{`""W3_=kW @,Wˆz0h5ĒsWz+Vmn֗ޜļO߹HhѣG?~E%K ґYŽOE.8=;szn4fPYp=NmrSXsΝӉ +ɅKG?_~zKLDȖ $'* +T>č (CO:c⑌*RqQ8ٙi\2Q`ۻ|Sh`=k-8tfN7^^96kj#FEYyWO;rt.jqbq5k`UTQS}ϊ8QO0EEzRz{JJ" "QP:$$4})ŗ_xɗW" pe(<_[V0(9puir@ )hw2;b[J=68rm^ j+l~O:S~dě岏 ء `;aF0奸)u'( :2@"-[b PPhgE `c`&c k 5)ay}99v`NdˍjO}"J@˝fݯǎ6g$ wGgW^Q{:ēGc=?NVuv,J=~jMLC}۹үҕW}w/"fàw+wGOz F?ʯٸfz#-ɬf?1;sxt먯G7gҬ6 G`Wս8 n*8`3;[Ʈݞ(VOlT[ 1PF\kn[@aXvQMJWG~ґP!#pDLB([^xzVXII7==AMj+ L uS%Pf}( Dd,pƺJa9h I^< O,xHFۻ=O9_ 5(V.|q/7a1 0qlOzFnkAPtLѠ]TH#;a7R?($Ƶ:;F(( # Ĺ#0ey;oa[PĐSQ KKC sC猳Y ,XD$,GROGPhZ%Š ^ԛnM.6>=fHa/jz?cq&\hUiwT",1`2YߓQdbZ'*lbpg}_GfA5Tfo U(APA2)@,ϾWwwXKۙ՗/=wHpsA%(Oq)*Q&TBʋ 53ZGBa)A&Ź~lFoaX/ |yQJ}Td,733 5!\Ymo{1מnXG;=X&yj{l{֊zcV\|i&Pq39g껿}_?o5[ܭkX^Bsq՗7 %;k;A)(*PՌJZ|_yvnH3 &rƷKn6oz#la<`gѨAdb|$"DFFRҸd]?$M5Zؤ5+Z22Ps [zg.(yU!x=UF9 mn_X+?6JŚ_ߋSQtdڤ[Yg/#OHİ&?_m}۟?S,xR]Y{T"ĬBɚ.'|Ckkm]t 윝?^97/zm{l^Fn~; k-s:@bAZ4"S@>Ecy4)bE~QYQ0T%)]"se|B$PCfk C!%РmKSGZuF,,U]o0U|z9X[-mnc];2#hֈl`{9l@> =DTd3"QXxA*xZu2looY6.ب g,"^Y4/4ϒȭ%;meY&1:9xY=ֲU+Bk*y"L YQ Vg}`TyP*p+_|⩧}y{/=q/|&iVa.ӌ9+AK!GATIf#`cy5EJHAkcD .̖B$3wk}2>,{EݴxӑД̔qLc<u(k cIP8t r>P X0AUd] 訁è]OwA n'D}=7zhpZpzS4I^JA80氭.Ө~89 {ҝdZso^n7s; |wIV҉VgMJ*W21e^3ը}OBP0qG0Gqsxks; J͏ùfY8Mn]|z8;rqA,)$Xc58 'gEP W~-Wjpbf3:d\_V(z( 83xIQ򨰎 B\׫A+w;{CWx':5d,kRbK ~2*ʃI1v@##V<|lf>Ȕ(`3'|g 1̅jl\;oYQ`xkx.;(D BskS3'sVHS\j NΟ>qW;|o|泿=e9t PG"k%&t,.bk)P!@ABcvL׺qap L9B08Κ͆edcIʯ(Y݌T3 Ij-簷x>q~Lf[7<_{CsC(vԚV$N;3$Xʚ%#cnKݳ8. 0Ĝ_82  Hu [$z0 Z=~YM$̘9"Wy=gIOՠ4V뱦ao>߼ݘ_7YT^sӺj><-2N<'C[ݸn.YEzz(=c-5B*Z7%ΐ kفS"d)ltX.AHf$F""bkiGƺ C):GĈVfgu'THY|t8U ݏ.N'{hvYTKK2/O߱qͪ"lH#sKVO^X=ҩKGf0HxIT$҉$$ bĩ8ˣj鴤2Kƃd0%XBI2i~w`LU080R;c1jkI$;gE>~Nm,'drdrjY[n#Ds@L͘j `h!/q`c V\I5 M5֦-iC$54X PR1`@t &ڻfȘͭWZү9@%'[jZt^^l =58Մq[lw,-8Gh-ڕ6T~oxO?/>?Mr֢_Y:qn{`kspk;fW "us{N_Uq:-ТPZժ9 r8^J72H61DƏJ$#,&74ι۷gV^,$% 2!ʖ,e!Cŀa[%Y-H!MLrP3][VeU.~]CTlɀQC<$~_=,/*0@#cI2CF$IĨ[Ͼ1 !wT RO ;*mK+턏XXP2n R0S9 c BZ؍Ϣ_0.!+L!226$ؒTfZi^G 4(0y3q_A {c3CQ@Q!TKߠU"9UDSX⠋~|xb8F {&QK%5ujTOx< M+drNCɹ@RIC` AIF)p+P h ]zm3"R7Ub1=g q޵k̗M*{gM~spt꯼ˆ~P;lfJJ="b6?!0 !$tq ")(v%LDZ'ZGi;&G+9W (DPc!AF5ȋS?ro=x8p ( "y)1i.Al܎c1¦>a.8~W'&N&FP Q 8d+ۓ~5PxA. B](`zxgN;k,Mh^M TVp|PAн׏=g謚4 AjA_k@0Aݹwoc{Ť*HejN#lp#?ZgOeOo^YރPc'K:zQ7[pJ2#<{T=>;ܞgiyIB+;Ա#uNw޾|Ķa`%JڅD?wSj3n^?s hG,JvȥB+0FHN(Nei"ș A0dxٔVd:%'#(d =,*a  $F(ut|ago\8+:;g[jG&TNs|x̋d2߽[_ZCuiH!ч2/Yމ\`$ MEYUSVM%n:qk#TdLu)Us[9լZQ"ȇeqfҞN8:kLLZC J!2{k+diF7޸<_o;|BP6aC`cP@h7ތ?[33!uQl A"@XjyZ $@ &b?(2pcg(lh<^fC@ڥ4BLfˈ>$dR`M՘(mrsW!)VI:V!뚝`(dnj.=^9IDo~g3.yxP-H!jԏ(KfM;"]]_޹tl.VJZ):VY-J. ;1R,fJ`2kgpew6(NsZv/wS*)Dexx `20a&)yd*کٺryr&φ;Cǔ:b6t/d۳{BoyKc:Yqh%o۝+[݃a}`|e6O|_SZԉ𤒏ޝ՝dzSjddNg:e=>|8>;MB+)uz:=yx]?P 6phR,M*z%9$FYI Z,sQ@WJpP$QJȺʇ&4J  Y!B002!BP+%VQOfE4Yq!<>>D'>LO|'>o'%#Vq{ۻ1|=y<:3%}Ơ˪ .#@8E(8]l]eYt~Օ @Z)hx JEQ{ xJ*B x7~7nu~gFe|w׹w%:BI"Y:qޣqPi={oTQ8R 67a~R|5eBl2#0eX )@AdZV:j y%B|@(%cmCǨ\޾uǹK5F]`XEXE;Z3[(M/g #YAlbw U 烬+',l-h F+i [YƽGt]U,JE1) |ǶlyTVFŤl:]|tMdPd`TZ@ yzxőM ཟj2_w"fLZ8o^uƋSYooLSjk~>5Mk߸ V$J E'4\~vm[€&;h ؍NGIu<_0`)K }5B P*D#MA>~f$dvՍuŬG O~V''N]SkƓ5X7޾K:k7.ǻi*p$:{|f6|Jh U*v #B5!43rRe{x=n[-֪ *Q`JAIi΋mi -(?~5qV''o`e4KJ>9w E/n'a xdBw!$5,1y~zzj]uZ v$P 'bN[-&fG@d>:=ƻo=b?ů^o_xv6O|xpuy V94rq IDATRx}lVU6Um"`#O'0MQPDpX8 !b3 b !R`B~@o(%l|lLW矊B|:%JG^keXȔe72Vd `Ƀ4)̅ple` aH@iԱ1ŨF"K[K,^$雺\K[Z+]bv2xKw6wjʢΪ%*(bEN`g7H9?ow4 X? bRG1b2@Omtz{1 :*n@k\j'b6t;3@~?W($^ / IB@D,Q Ysi%2vu-(t7!'yk1N#rJ7W|W}XRa/ϖtt;ےݹw7nuQEYĭ h &"͍4ծC!lliMHexZ 2!hPJ(NVu_Y !PHGxF|b0"DJ!VμZMr06`.HaUqdN&)ʹ RQߴa{6)GG`ŇY밠 [B!PֺqgȗYd*mudH(#Dt#T%HGBKs"z啗\:2>`6Mgo~:͖>`TEweEЌ@ESgOq1SFFF A@ F@ ߟ{#AքNؕ! j @!(@INVBH@~i+*棏>;]TqڳibiK̲dzzwcckBI'y9.X岱e$%ZiS@jA@^˺Sׯ9.;| F- 3[lH.w~`x<67}#ߺ}ӝ [7njzb01JxL("6 cmSJ0)"/P"(jE5uqD g3jXͲH.TY‘4a#X zS$bw.rVg||ž]Պx@r h$ H2 ypS6׺y7H"I'77\of~rR.nݿnn7_v+5^dcʧz8ND@4F Uֹ4uQՋj㞖Zx)ۣK \UtiP ZKD80@Y̖R4K\m(J Z5u>KD3Q<[WޘmC؃Ӎ@˼q?|&6vUY5s\2'ѰlQ,ͲV֎ JD󼬛r@D"j׷̟}PMU 4NwصaOSMgN%[:q; Ϗ6yŦ #E  q'u#N@,0sáj DC,RBH)V>2BhdUrևZgQ;PiaGv$ɑ3 sv|vY0o=^. V!1E]k%{dVRfGb ޽;EW{b6\pmv kc6.D Pyµ֚z/+w|0:=ﵸӎM"Av^il_~;<>?$L|sauʝߜH[Wwzuƣi=ܟnuRCEw^y}snO~gLƈGh}#'IA>0 B:I=ZA=G~߽J\L8 &IE$P@Kj90 fA}@ED98ƨ--$nlz^hROFÍ[|m-능U>PPYs}Cm_jYkn\<:Lk{G BtNI./I Ȣv w4phלfzޥ~!0)t~ccKyx^BjXxGqT, w[r>>;y4/_"7΁"-|q/ߧ Q Y NR,4, !P^ kW'' BT7hrAHMfuE U!>Omn3@on+߽VG%Yr~>έ;|[\3,9ߊ,^Z?yHGn]vZ%:Nln5ٺ MQX24NjodmlgVh,' @(i* A bFZBD˿3PpJ?5&:P_s۹pʕ(^'޾+o=vLN顉:z[˶0bÇ_gxj: dГ {2uk&4@13G@b\iHX dlD*@ AiS2|@ $/ekBJ8ZIB六: $LGgg=8;k!yQkeT rkG {vD ҫC5;_^6|.#7T9_ySHMYͫ孍A⎏O`k/t!N20r}ͫׄp V[;J$dIΪN*n/Fz ZӓQ9(ʅL;]G'G]{vvfQJu+!L;=YڲB)6ԎZNF֛bDirʻq!H E @00Q`ur8>:4( 'Z%>|Xpi(W/2~/S2ZyTQ7ä]c<vEZB8w0AG[+/<_? կF O'uYJ(TS9xԝ$5fk++RC`@o #!`0 ADH?@V_s)uQBLֺ,KuWNRUBuѹ?rF/Z|\J& ibk(s߇Mu8?abvM;D DA UeUJԆ.C][Qhn|Y7Rv;M] D2.]ua _C]AHI%(IFGOJ:_˯?xp-eXt6v6,\BIv'ΏƑg be)ı_{d6ġ%2YĈP<>ђ3D)$tEfe"_- c̨β1ZwKe־.BQGBH2kdڤv/m ~s"4@bw=+-1xR @yVǭz/\w[MdygU&l5s.+v8t2]` nk9;fB57[Ib"Nr%ʲa 2)GHUUU[Euz|>=QϞOgQl犦)&%k]Sɼpue.WucHiIe[dTRX*YEyt6T$HAl^Y+*R*ROp?LG§_Q|J?U&! Y0;ŝ^|7鼴Ťu]FXkd$po2O?C]Usې J 12V )4Md49&jg`VbeCJF!(003a=* !Bfu$QEu] iŬ޽u(o\@䲶Zr]W&hqnB}Ƴ:lƒwP:Rh)b2JiYXҩ~yonmq,k:Nf"t;MYN u# Y, ai @}sY~t΃ן9QMYTioi6ý_YIO]ߺE 0'&B$ KFD d$>Сp%jz8$:uI;X<)S:_^gߚU(hGmE$=:S[ww[OjABMsa,c@ ; Vm^t X2f|BX13Pz|`k(:*U^r X הy\gnfM#fMdS-uZIY,ʲZJ!֑!12bҪ%&k%r0[Mʪ"||+wv*jvw狩w4s|sЯse&d65Hr]ݙ {{^fQi<4)E^ñ|Z <:ZKR/*'qoQ]5E܏?_[etpx6Lcˍݝ*I;O);brׁ4e$,_RwfFI!pE`)@ ZF +&bLoڹv}^EC.\J"!8Ǿo}7?yw>1ʪpe [pycš}||W}od(VR-ѣo^y/__/ Hie"UdTE FRh j7LdžښoI$͋& dMTMI@%KgcqFxۃ/'q4]dL P-׾zw]/,!I(ꀠՁz[^)rfbBk8/gQϭ:4ͯu/^ /(|eM"46<֖`QeSBr`> >|Sח 5| BE`dsm}׮jgm)$l2+SlwRͅC"]BJ֢AZ d!I 睖z7y]@#AM,4o|;Z M):ۻtf˿-Sv9{>%uUơbYE;ۛғ*f[^u3Ց7_{ݿ7o?dYfb* Z3H:Nnj{<:͖:RL Bbl`6]΅(dNk{퉻V1 T =7P/q3jUT3^&ggear^G :nűGѼ;?zoB\|}t69=NbE@eL,5ĘXlX,''JkO,sU\7~k8 |,޹wqs! K'cWpgtzR\7եpztm [GNqSM j2(!'@O67<6}# + 3"A;!H)=0&f"` 7@@8D@S bdjhei`}vvڊ@HTp>/˲i|xj\/'|RX Wlcso`f y<: ~o9Z61Q8>^~=zy)"q~jQ̔)o[$hk/%[%T䁗ŋW.վb-pz~%lYZ#h5L>ԵC)@Ad;lFӥ^*i'L-e&K W4tQvzn<$$;3!*NAM*L %*BgD*AB @*._h"%pais杇vkw( oŲʗKrl[? IDATzyUճy~2ee*\S0uY?gz׎f_otx2FeI&eqEie%k$۸E0BJH`sV@ҫ&4ڸVBpޅ" @Fu;|a^Te;9;m%I,N[N\gylX&vw{/:?|^`[-NbX_kxtw4) nu(2F-Ԡ|]<[],.ޚ Ng7^.vnZe+T?\jʚrhʻR+3.DEkס=WX] ڛ<1yšnoۻ[ͭw卑֙0;Ch~ssc^Vul< nZ ׷2KG0uh&C  3 2J!Xb6wn?yD$t0ۨ{v~mx:{xksHfg_NYDquc}(/(,CӪ?W{gT޸_Wjy((Pl88($ւҺU=b"W@{5"AD"``̓1 @d{3ClKNzvg) M󫻻oBE]}X A9pC*`Zlp/\Bt֢"m$qDZI]{#`xbqP4b8CQbDCšQu'Ɗ@"#o AÇ zJAs/,AP騩ݽwƵ^u]+W '!+ϴϋvV"bk/Ǧ{{Y7~c/XFҊӌ|9޼=fX>Ne0R5!xKa!4i4v^-)J/ SP{ϑ+}D cD'gkL_tZId)}v1Z.8nt8B&΋[t_[(+@ z?!y^y}Eu\ݰ_||/uE;&5Yk_:KݎV-+t{;zu+ׯ=ׇehXb"pyAD9 ^ʪH-åi|2\g?&|EPюM,tY&Yf|^ XC( " ª($A!Rǣm\D9Q h\,JC]F7ytkU9[eE?T'=(mjg]HcEKWryqr*CzYMFe @hP F,?seMI.t~<e~qgF1{;M]=};/aeӗf?W8n{¸iy偝h =:IA W`ǬaFQ`HŮv1@fD"AfyBva ȀaQ4K3 bYREQ$Zښ #ΫZ>MNF<3~ߺ3/* %z0q&@`@ U3n.2%9LN{ ;g Ά_y?*[wnSkȇ^__4ؾ$΋>0wq*5.]Ua[W8)gv;|`)D{Nb3,~ۯnuX_]鍀Tԍs766ҭ~8>?fioVMF~1,?wi+E2.P8-RQ?%BaRޖkG|^::uv+~ϟ^{rш*]ҹ}w8]jq񣧮]><8ώ>jDkGڐ ZHEyy{cLpVt>:z٨^vY宭%ޤmd7n=`4ڹ`|#Tr1c< xi C*b*>@!6@ފ `}0` b0s` s`8ikBPV5SJQ 2e0²Cֺw^|8%!s@CeCpK C"%OJFlYRyQk >bYjW/fW6;'7?׷EGgXT4Z,KZjLTŲ.d ؉R$D\nm9̗KlXQU73K @I!}t*$Txd\{|Zt7.cʲ|9/*f\W,sP͂m*\EVE!wYG# ҴI.P@,h(4E_M|PF@Qש"x8k%ZEgŲͫC(6Q4i=92Ji|Pʌ6<:&q+rt2*;?'W|W]j"H  2xL$XH̞+("VjŜ ?1zBZXĘ.Rj%QD(ȃY[YukZäHϿpZ5MXLe{WI /=~h,˪g-tG0I"gK$yB˴Td9_cpǏw7 =x<;[wh"M& W虵Iuϧ5U!y'Y9<ߋ;]`zmaa t<*ngnepm"$ "#CkBGK%h jlm,2 f!X<߀W~|t HΒVQL^'t6ud1X+ڲuڝV"ôo|'/- !IEh"ZQJC\Rċ;CALG0.4%Da MvŬV DNo7|sxt+{{W~~^/[u]J`*b)n44ҭVn}:k\j|:@&IEg]QW"FR2[.*'^OO^qs{4ܽsrv>⼲q=&AU;wƖ~t<>>,Ӿl\]9۾AS7a:QIX"N/bM.f;_G=A"d.'JH5 K\V쭍-SȫA+\ʬ06 hS=ٹ4ޥm|1)Q]iE*$NTk)ډvB[n, .K;/D)[_-"quPEQ;F[9qXŽ4?~k_ՐwDU{A&uݔr!IXA@E'hER1wZ'ŷN&uLtR F'E{PNKD8AD㏏S$`0/|Ƶx9.+\(B}0v[O_'t(*wGW~n/J|je_ʯQƯ}O߸՚B:#ӭ~ڌ/o]uάj"Iyw:(\0iԳo r!>oUkQa `;'en?{l("SD!m$u3(QTyuXj?W.dY D"% " il \[Vl=ux2۽lme j:_RD/?o_X W{i4*`&<-2pZk ֺfAρ B&֝|ۛ?o8Q=\"ESB!&%yh<:lwsc]?/'X袄NGB{,lc4\ډEo[B$ AŔ=h2ME0Uq7M+"fΗ<3PGr87cp(_j`I|D- &6O7N (5$I[,D`1(gt:s!tyI(NMҪ`YoUli &B3_c4" I>\c`H@ D"4q~PiAT3d>`G6NNg}qlb# +՟xrF1ȭ,ٽ{7yjxvX\rZ[K .MUd+/w'sH# #8V;::x~1ί| zO_?Z_vsm7S?M5ys IDAT<aS.$uqZy\L a Zb:U$]y.}>n/:lGRG꽇yQuy$b~mvG1wz] 1Ajs@ɧ#X?PA}}w44}y0My,M=HD*h $ 0[!,I@Dw9djegg-R4KŢҵEQdIς (Em՟xʝlQ@;NpQ3(j94ySUlyxt ! 8&[Iυ,6-օ,X4XR "8Y-HHϋHi6]p h=Bcˢv2;FhklkE=:>ZZ'^̚Aw ΃G!"Z[yׇ:N(ɎSL295y9UC, [Qr~d"O<B'2VOF `$+>#?~jKõ^>X'iy?=ع~q~&,1Yng*ӕؚ\@'Dz8QD@(I%QGQ+Vyz6uTPF>F89( 6~:=L3zxƍO͵o|_zG~ _D~;mZ'(-rx1[[v|lɨan ARF~Aցtt;_l7Or*HW3yrAVz"VBOjy[_S2ל,_8nnfsM%ڐ21ـY|`YuVn, >0@XV jeZa4q&4Km.6EaOHDL$f(A{x(ŢlZ:1T̗f u]yh?<֤]\r'|6'cל5 ƒ$Ry4>xOmk܊T+&DR7?AA@ PJ-pu+e a&_S2\Cn2c ;_Q<5y*~@]H8xVC"N V ؇(Tއ@f D&e1kBd;wl(Nz^v[o|H֢h"lL>]?Q<uX_eVBFgBTԥfI|i+/3ZV[ZG'Vuo.B2b 6R{СjXX87Dl F:,גɡ<Iuk[;:}à E/ƓgS5]ͼcxO uEC6P|C DE1 L;:OYah\FA~ZI4]_GJxP,#`A;#/8Py+8(Jwwv;fc꫿ 78yr߽կ ?CϔoNW6|Gɢ>/#?;qL[j .畒v2,+!laa7D"tHtWzNA4?v\Ռ3GK?&hO¢b`FA  @@ @D'խgxŅDED/xk:Wiq`@PKAc&BW[!Yyf(8/ZY.g"JsݬZAS9.B u?t3:5u[Vf4g)fZ51Ō {aɜllV<8˧45:3n`pz^45+"Yq2Q^.k"4ZI3f'kkMYK཯k=te C wR̥R}p۝N2h:U]{=+Ѹ;XLMYmnnnR4N*2b KWsȘh4.rE&y'FeIH>Xnll,"EHhjK':rZUebejmykۻ? ?4 uQVpsVJFCĕR*""l y)"#,ޖuQXD=UvcaDu]#rDZ?|~\(fZn\$@} vo7quZ۰o拟>__J0?S \MinQܽ3jT'VhFEauy5¼p3QAz8zss>|soߜ^4dU|Vt޿_[,OsBB q`-02!bQWՔ |AH D]~` )&~z(q,j~BZUaX9!2F\V>:"pVxi{ ӊiVEP*2s$om`MʻNAe1\;:4Ұ˺,UvZ&FE9[ MTjJd@d~ MY5E4gyz|EmQ&@m},FDJ+5X-lpkk]Dܿ}0Xp\_~:/Llclޟ#&IEԾ8ncֱB0i"E3/Se~<=<<8]{*#45NR=< o ZڌX Kxx?hIֆCP~G {A|sDh8 ^,dGw~r:*2~Dt<\_kן'z7ONw;ZS9E0iY9޽zhiOvc9[W_;hSW ?>Sh}'?O nWSN'F9# 8A~K֘ŀ OdeDbo8|-դօ̙HQV~ʎ+u uJVXšۮWaV"lVҊZ?>J⃓:v7 ʢO\ĂJV(pR!DZMR fV[ZELӤnm$QixAD2=Xlm,M]gN g[.iU9&&q ug~ 66eyff͂5ˮ:tosʼ9\YJ$4YI ZfCGt?@MKmV#IU%BUTp|=.?|" 鋼'ύgeleݾun6.*7n#,JQE|m'@iuZNz{{é-\ vluiܖg vR ~!O]H;m3UNE<.v 5oݾ H bl2cT{dռ d1 o^,jZG皲k;N(6 U,?7okXSNý[oo6;fRv<-郏=4 4!%" $gg1b^Dij*XӴn\\pi@Cv:K,Lyt2w ,`#xSO?/0` ⾢1q@Gk9!i4 ԉ͍,nӹv6R9{1ـqΝs $X9}UBK3y^9j8L|KX uER:OO|^zm#rwg{fSWOA#J`!.YyYcAmԣ7<|FIY/-Vɮ [vNޭK;{yݽ'~i,(O671jj)ӆB,!N l9sN2 dmIa'#_ 5>z|7-ePhyG;#'?8 ! pO`y ȵ!cV3?innoZ-Ӕu !x#Bp T$Hr@z92%;7v,8ZkIQ K<N4RJ( GcEY`^r &pk[/uh32G3:  <ԍs{nӲyp#J~i?Jpgwul%}ۦ,;;(R8>$IUVkϏz LLE8*VH|ZWz+{ ۹:RvJ.MýR{wTr6ƚ~'y]ab]vz8)51b Qg~80TtOߚ]<`4R滿ߌdA$q;Z=$ƁLP@)xE NTe8G PMhk>+^ziӹ׈; I??C!|r\  .5ޚp!nM w !W<@( !xB%ldw;]@>XʺCSPkW{~0+$L/>d3mmhu?7}[_z,9||uV̿ݷ6>@ օ&@|4k˺'./}%4ݷ4Z,3~ΫoVNݚ{7l|}s7^z{t2`A IKk9"F"@8j! p Q@X8@C8 >MaÞi̥\[a9=N9! 8Q zJ`W m@o<2Rrc)e9,BXUYN+#ΐ0(1!V Yje( 4͢$x͋:I%$bcmmggT'V:ΗW,4Jz~ iB>6YZk1quuNjwv68HQdV.-/I,y$Pu 85nvU04m_/|c̺ @>ZRe @JӸx>>t2D{ʊCuSt׍FB};c~gNn\x7k_>"2z?y~Wz_?:yK]NnؼKo~Co@zp1y/缬kkC]íCj:RdVg"iAL$Am<RJlEa5XYY:YWl2+&9ZkRQ^|CF;[ȄB ED+=kA&g~uc09hz0MA(MY>XU)]:xɨn8R\0 ͋X%0v"0[wX\)lLҪ%y`jȽ B$l ~pg"\vLr2ju?qMz h5XYohҍ=$7ս{qB禮%fT:5 o2MYfQY5UCTjP76/zj38d>(w9 W:[+?~m: ٢+2Ԋ-1 L5vsR,1E<cQ2FGq0gxM]44Ѵ,b#PI⼶%['7{Z~ׇzgw?g?[k;ʷ⟖f $2HH@@DQ,uKT#Ƶ$R1 wmu]> XRXF,MeKYy5``H44})nɶ;7zytsN^}.6H"F GP[T^cZ>VmD~8馬1D@Ѿi4 h*B6˶(| d2.u7%`ĢrdP*Z[p&K3 >gH 'îJte<  Z $f,搏`B`US<\zyL̑5onH(@(&leO CV_ӗ4ֺikRZ`YIS+?nWmpEU8cwȚZ"d cYJ|gt=kC;ݪ{6oy3K7nHN1 mͦݘ7&TBdz8Ya jh[JkK!)]م9@"Xjm`^i{0zcMoSJ $2e<<.1< B ` Z["hcE` 9"@ r9 B=c{Oчџ eXG\h&x$X#ǘH0u4yP7u,mßCY1zgh4"!֦~@8iAYkx I{ۚǔױb'c`:,0N"V3yエ>p.[QU;_ m7x-aOx'QbNrA!0<ԍFs]aUV۽3Ot/',|ݏg; AN ,`uN q:c\&M]3$d,mmQuڝ၈8 &Pyl#6e|k{g42|i@-ĵa@n[K=5Fp$dx>fcJ9U])m4L0Vux/?h'lnR`j&V-n?ĝ~rR`wbaeMvS?y߅7L"Mep<-!x!CAqD$s`9ͩ(Τkmބɬc=s;FТqd*EYV Vk\SUI8cn,zc-y@Ν=sC@? Υ@9G2@2$_^_?' 1X 3Sއ' ,E»=ikZ( 0=yΤ`^aipQB:t^"z7~U]ǒq#g!G>Tr $v!S]pZh Ν{VWh)G|tݗF@%[gȀA)a5mw>WaZnfUWxu|(ۀp6x*j˴ }[w}z{[_z x=qϹd9E` 'T1C-dM]Ljg|2o\އ*Mԧז$Q)Q &CBX:DȐj [H_Ux@ *]ؽ1\ZRRRu^7ArWJ,@8ni7u1K$BdIRvuvG1QΆkÐE8.놋gtlpm_# q֘@~{^Nb@RdJ<ʪM/I}؉Օ)j-y:4ntι:VZ>~E]#/t}Nb*Qwb/<_㨽0$ΚY W*>峂+.8>|O< )M_NJ^]S_i@uXh_ۙ9|3YՕʝЇ&Qs)y *۝@Rmcr.b4dz Qwe9ģPri9" x82ΙYQb"fDRTdLp`8\1~HI~Q crP;Z]o#BCӠ="g<s&B`Z.p뜓R2^J:76S>xa?!|?EQ|7wxMwqF@#_$(!{YXĘ8 J\H3{/|ƭV/kgduL yЦFH&.)+CDz1Ayr:9gSQTYaI+rM9 Rfwn+Ӽlϊ=i]?9 RY?g3ORiYٲHü-f׫۝dQ4V:iAY) `慕^ΥFdG6W, =\8G$PP9Vxtm2%ch]ؼs1iQTs!DSwvnF+%5JN8M*Pw lQœA (5{ ,O?vm+鼚:r[1+i"Ւ [il➻_0O,A>iO8]yѬzt>Z2Nyɵh~|57-ݺ|dr gшD!P"gXˑ1DƘ=!(0 g̓ !ΧxP~>o\"6 Aeq3C ,5Bн[91rh<1VH$oz|g>s]wݾ}sŋz|G>3yMӍ^ySZpTp Eږ^Ngc{g$uM.Ozu*<|ᏞZd4rm:@ֹ^^i 6@${噭 s g<-3BBeq8sf*"#@ѹ qcA-g˃~W_O}Sʯ||3ϟKZu*8c>8,vjjm.)ΫX nl/~~fE1~+_zWY.ę9\@OB͍2IɋC"iӵȇ H1*ӥpz ` 54X1ֲYSkz{c드@W76 :=ع3~+8 d'$ȝseҹ1)kjZWꉅ=wx/jj;SSKmNq0 ML.H.t6Ɔ6vTT5 ڎft `%D䝷` M7 xc! e<'˝e[EǷ{7gk˺q_zj7IB).z-C=&q\pai[^U)ľWVZ#n7OKzw~҉άlVnjjmK"bR6M@)bDo|l{>7Wo]xKY+3>Z?}AݯGGLu֩ʐm [swmUȅ76?t6͆uH[3/ɤ#)`Ō &:8J"gVitgӃN]znK+QʈGsF\W֝%DpvdT3 @Q(\0T^ʺ-{uѠuW$jg PyҔ_26F;@l<ߡ@ BR6ژ,KhpHŝ"@#c 3 TFcn7MH7O}رc'~?//#ŷz-wQ2! 4yw$Zq<{zd4ړO?LN)cr=:8~b婯tVzluX[` @ &uR0%6f*jGX^i*"X ye|6UHI+);[XzmBٸܸN"3^EN_ӇeŐ Q"Ōuy(A0U)r_Um59H|6i- 7^*}*R}8NZF;M/N"KWfGY1lKһrWgoTV~Q*op[<#OLbh1So{|ls=["5+muW” dVwsHp;LF$no;Q4z^'oe)QId1P{u}kȱc|w BڹaԆ6DL$BF1q )@p1:+1w˝{l>u?ȄQ׹}F|D%Y;UUqc>'^He'ZzT$8 "r΀I ^gB0$3 HV)IJ{bp&F|7b=q疳wKZVذqE2Nw]xBT*A7[dt8kqm6HD<㦞+k` (/cТ˛ި5[ :>}w&a:,ͼdg)Bسꨩo>rrK)AhJnvFN=P.?{ }Z;Ѳ~TE.8#_XdEi@B] Ze^x oQRx 1$"l@R.^p@H U+@ӿ@\j V@ br />c7֖{KҠ2{Fki8G޹v+reE@R\ja0Xi{ GLVK-XOmov[D*MY#R>_NVcd%zA1.XB9އ>p),HO#_Y^tW[`˺n2x?Oŗ}_'?\rjy+NOpHۿ$V?U;{E^p.=zƹFZuqƮxcNs'wN˺CbF IDATeImuq.nҭJG`]JW@rK{<ebF)NXCNxG@ A0EaqgӺ[>ܫ 6/Ra$Ӎ5v_Eusg;mwNG|-[\//3 i5t(#{{lDLCqw]^Z?>vWo7zNM n 5&j39Fӆd0?v>9Rr"O8,<$,!,5SS&"QڊW"J^Q{..4߼6twlqPʓ1ldV߸3Zh*mRsO&>8g[6z?u|׉y]N!R5&ئO&NcꥳL"RrPӃ<M) GXRw{Gl!$+Zi!"Y> +^ wiڑau'B̋ٳDo~/SNŗ?{[^>s,H._Htp[O]n0/?b&___0>:{"<u,eu&" 06O]UZ w+dr}4iJDl,Xp4LƳewL}뽣ý֙U`g]$hTu8D;I@@Щ?yqS@X`rN89i. Xu-4p=.K$ Xi#HX 3asj)DTͥkvΤ ёL @X#J$3TUD"Vimcomj͑cB5JUIukjqhmHl\1P](&b\'`Q;TXR@nOMBĭnjpST7"[5xk>ivٶJ *,3w75Umk Z\ͥyTJ'b4xbk.6-CD9[sY{n|F 䊶. `n쌷CM+JM=RX`Y\̌DvwDga@E`u4-N-aLZi.ԒְíͲ=k2n"ԎN+ *W:ZɶI(V]n? U'G'a'DSJ(EX4ED2)UEQ]V/ x2ɘ6 B)HṮk䀹m!nӚQgT%RD8΁BNp8@ 9`堩Q[!erąaxLح kDo&ؽ{7Bh„ !=Z&>tn'N8wK"O//.=ϥ_{E;؃}/jQh),H4ls۶^^۸ikՀ DPq{ Cj"cfR#(8kH2e6XA H$3mg2Q&q]Fz1c}/YWm4SbOCx K+U3lARF|PAPmˆBJ 7V̫=vNԦ6$*1uj{bѵՉMʆmMqvJ0lT[#3C+DIBSUҌ LyL-.P(U /-3gZ'LkgXP VO pR'hR륚70* , V4}h4M3NEUy4Ud(5BS3mð zl*iA9 S7f`#cj VU٦v+e)]s+Dg.=ۇ0!DÀu=˧t#ut)f-#JvnTϨԔ-#t(H DEaL8 N>o,Dq.w:@ $:@lN`[&XT!8#* ٖj:Fض @C@ ۶]-.ti9lMة IfvC_uދ3gμ;l̙l;tn'88 !`(U! qzܲޭeԴbD~E,klRPo=持.+#BTΌ@-8P|> mܼD 8X@dУe87=#=^4HW /3tk{, ښɤ1 e\ R5`\S1BWUAQHִ bn34ɨec?(*.KX v4??X:L[}&^b R ]̣ܺa&JC%Ef&A0WRlRY0sS[ D"qp :bM/н>͍)ma"X᜺]ZQaព$&@B^`0ckS )e@UQ1 64UQBfr7W%4 $l*YJE$%4l *+$1׿̙裏qLs}UWWۖA0!`KT\t*, E#Dc!&q0,JV}cꪂh-faj8L ٬A9pd66iK˘d D́BP6 LDMDVmFbK mPf[4F&)H\fZhoX*PIY+5*&I @pmS2UPP}[rE>Q=qUYˢs+>_וX,12 b~I1pqcS, GeRuLQڈ80Ո6G&U 4XWFO!Y@4p*-xHtXtOS|ͶEQ64[s(e#Au*|.@@A48`t¶ 2MSpd4 F4c+iPyڂu;e[+.]Q?^d4ȨA|>ݭ ؆!RT^Rگ5jSyu`ne9g1\,,D&7/E׍ _ $EDHDB y#A:z1 R11aY#ۭcY1DZ\VOccz~F_Ssxׯ馛K qoXVFAbۯ,ڦz)=2LB[%eҴ% _TLG2 nŶl;5i9QrZY(ň#WL&,B qpAm BP(ugňq1入v\;RmM$J+ڸ`EmxC}adۚo舑*7nuWc$LPn a)'inA΅M8KL+  !K08w)B`l:ɀ+fJ3PYKRsûih*`FmE0K逇X܎EHU2dV*u[[Pux$ !@@t:f  T6mQiTFbCH(gSL" ۶  qRZ0 0(`%m2˨GV#qFH4ױW_}uEEٳG9ߺu[oLl`f"&tw Ol\(„qH3Ӵ s.8ٖ\3D̠2[N2{c (G"Ʉ@Sjk[MnߣjĶ(pdK:\/TNcFfQNڭi<9㖂Ҙ#m)%PlPu{ MMNTq*DS¼ !AffUjE!L@k]L08`[? 7١ Ď-ی@p+9n@s4,ܑ04QJG;JLG{-bۜ@*!^{=Rl69 8myAH!)yn,bTh6UxI/5$",3P'X{$QXE3cƵe ,6M8&XU0p02; Pl=MQD׃PyMU äGS}HE`Hsaxb1BABQnх86`! $@ceH $8hGg(F<ՊC.h*#ϰcX8^ڞHjJ#mlIWnNc܇lغ7p eun((wHJBn@p& , Cmȷ'JTGP6AHp |bHG7|N @:WB[/h}& ڹrBBSW>p=v$Aw=&a>:8x.30qhXqȟ{/Vxyzuq|$ fpLH뱮{BZv%Q2t# IDAT/#&`6ߍ^ޖS-z`Νv{D=mUUU=d<ѣGnzݷ>d9g<)EG>uBa<Ӷm4_b˖-=ii^s5cƌYbŒ%KB-UU}Ǯڢܝ{n? s^SS!rovm<.9:tyW.r9*yX,fY__QQ:EY~}}}^z\eP~7уuK.rVYO}{.X}O?W\Q\\GO ;(Ayꩧ"b7UU}gΝ[RRrj("bĈm q . ֑ƍ1Ɓ@ng/BiZ{H5 (I³:kÆ eaEyWn}].r>ӊ(*ip˘} ɉrΜ97p޽{vH$2`Ylv׮]ӦMu>H$w_0|)wﮮ馛{}ѷz븶'Bc۶m5lBDB .`˖-#G Ë-bӦMSeٲet?qqq~kqΧNz饗۷o4??kjjxe˖qί3u}/ow Dc !~a0$i{f̘[|W^)ge˖QJ9Ǐr.|9眏7.3f ,\o+&OsϪ*++ gfFss!CzgRe3g0`oQFQJ_xw}r 7\uU>;^xo#<_u_vet:`3W^7!{H]]{#رc7oz455ROqUW/Q{YpK/ m`[ZZ"x׮]6[e?1xojkkNtҢ}{p_-"#~hYҥK:Xj|Jp&_ϟ?qD/~1lذܸF_V袋d4iBs}vXx}裏˖-;߽`N$k֬8qG}4`9{s=lP(OرrnѣG'_+8a+m8筭eeeEEE'ldW(++|PCqw<=ɓ,Y/Mwxl{7`ʕ3f0MS>R@ p@=``-Zt}xέJ)1boҧze%>}\ߝuY&Mb744رc~?clڴi6mB<C!|>$^ K,;vlqqq2fBK/TؠAN+--mii!u]okޞH$pw}wy_:c !tW^ڢ0 o^OcX~;L2s:B>B{n4]b9 09yBڰɩ6 `(Ci˖-555B@qqq>SSXIז-[1hv@ 0snrHN8q\V4555ÇY 7.{`SL+Q/p ,BBC%K|[ߒk>׾tR8ppBVQ.9peiVz`O~l6'N|d+T*֖bǗ۷ŋP(4vXWzǏ}Ν{wpoF[n„ g}ɓ_]FS)sIkN~T*zA͛78HP(iZaaabwӟT'92DҬC^m z뭥7nj>UW]UVV3w5`_(>lqqԩS&uׯ_z?n;ʉ!mƍdJKK{\]:,l4-i0vX!رc\֓|"74:bꫯΛ7/d@fB7onjjBwU s>u!,_~n;7֤c˲Fώ1⢋.:&6lp8xVЁ H{{{rA:|Yj՘1cjjj,Y"7 rdٳg?lZ>3B|44Ҥ cկ~_v\?x42\ܺ,sΝrz˟|n9sWqyyyaaao>Oz.\xwW.Ϛ+gQ]] ֭[(ʶm. /|kM8QHɧ2[+.zy'g؍(m۶;|ywoow[UU즄PқSva5І b BH*ڱc bX*@ `xƍ#FH3UUyt:m)Sx )ʟ~+++khh755E" 7/\wH!W9=z~;(09?weGwuF-\s|^n#Fy睆as=ѣ9EEE#F+@ =;<_ҜZ^VVccj֬Y۶g̘_ɓ'1⡇u] 0 @j˯ܑ#=x8Ae^.s%Ku}xC猪&zG?mEQ*++*/~z>Ǥs'|***\rɓO>ywK~b?τ .~P^^^ZZ:vXwWy /8Rگ_kޚ={܇_R~@`Μ9{oѯ_4URR\G?ZB ҆m=ّE%ҰWdƘ+9swA7tOG^6$/+77u{ !xKx;;wfL&8tY&wn$=͵<`_Ct{qRT4u,_q!m0xǎBNOPGڰ%IBcx.9r^Ӵ 8)Dn9;6NN,rBC9H{0+1c\SSذ9\qt @tM?l9 [ee3$s*, yԀCG^ǁ>p8=8\ǁzq8pރu8pA:8pp"!үb# !AWP܅ s14VΥx1!*sz"cK `? WEOm#TU rvg!)ݫ~S'7ڵkW\o|Cf]9OG!˛^P&YzuCC{c 0nܸ-[lݺ 6jԨ 6e2;X65|M9Tjkko>-L03Xzu{{{<>} z5'Y-NO4) ٙH$jkkǍs#M@_~ڵӧOׯc{aaa87oioFqqq&KE ].׹瞛s(@F8p?P(ӦMK,_җއtwtRYE]|kM6`7o޼{T*u~?-[&Mtr!ѱj*UUO+WFDbʔ)|iHdڴi?9XlΜ92\`G}$8_s5---s|󎪪x|Μ9 9a+۶ʆ*פx<矇L&n:gذan;Gu֥S0lv„ :w9slڴ ֬Y3wܹs~'nݺK/tܹ˗/7M3J)J͙3gƌ^xaee 1s.Ls3f̝;?<&d˲fΜyW.[DvڵuV!Ķm۶o.> 24D"iӦSru ҢQFYEYvg} 4aݺu\pE]TRRԴrK.dH$477K项f֬Y3fF?c錱T*'̜9sƌ io̙#2t 2̏ s饗~k_[t)!$nٲo߾uV6leYDb֭w>)H2 frQ1cƌ+bz_ve˖-K$ӧO2>FRiii|gϞ9sgYSS.K.dʕiƍ~nNU0ڿ9Z0ƻw~***O>X¶˗o޼|ѢEPw (** m_~R۶ XVVV[[[___YYI)R5MBho !z-%+V8qb֬Yh4ZVVNe\!dƌ"੧r\ihtӦMTj͚5LׯߦMNpA0`،cfioo/,,ܸqc4moo/))I$G`f7onkkm/ \傞i&_?OrzT*nݺl6jժl6 /رs>`rI~Q^^M6 >\Rs^XXJBK,d2 7V9rMgqFkkk~83Kn8WpΧLRRRrg=xDBvw5iҤ2c扫qEYhԩS l߾}۶m`0? x>s̑Y"24ҥK9Kf~ ,wޑU߿䘔9'O.--noo?UXI=m}>D"۶m'2/^(ٲe{E:묜"\Q˗3c\XXX[[iٳsas?s0\.֬Y #G8pa_YY9rH8qbYYIDn|I_2[|dEEşy(mmmPH!b؎;?$OGn|ˑCt &k׮/xڴiv4Ͳ|eYK~LYnL1^hѬYE"Xǰ= !-={\i@񒸧OxBHkkۿG}4{>{ܸq7ovr2Nbu[!4!PUuÆ n{СYj~/4mذaҚ &{R!: IDAT4sa(^z8p`sGݟ',B護ޚ3g9s.˗~˲dv3MSۖ$V7n@e-^x޼yBgX?ypN.c,w!{|+  !Rٳ1{Yz 裏ϟxbJ)xC UTTR={躞JZZZ>Cƣ(,"L644~QsD$ܨO:+_yGѪUVE"5k֔TWW/[,-Zh̙.k͊^z„ rWnժUuuuTjqkk'8٪[i.Z(/Hí]vu6REQ{\nu8 I/?JQW_}uРAXcƍEEEeee6m }ȑ#_/BbcL !?qҤI{iii(riZ2u]h4d H$@@*R z'l!ܜf@4mƍB1c=Ouuu44vR)p\DB GGnE􄔧s3rݚFtE7vr|Bpv*=v{$t|Ni|2HTB(Ձ4CMޓuE,+gOAZ$%!IJ,-ZO-EQ qZlb\8W/<h{  IC|dE:C赻=tí[ ͵L8`By޽9$g]ѥ2>Ł蚺1!,BgVla5"!B`h爐޻Yr]k3O=ݭnud=lɖ_|%6w.\L<=aGzyamԛ EU1ȩưh`P @/孡f&N=~{D*DV tBhUAP UJGz0wxG~Gya*P4M~߿[O|bvvk G2ڔ'z*ʰ ,ISրw{k:?* XU\pg?x_wW02EX՜?Z"J1S7T~K]D }*uQ4cLAJe`hWuUTHV\;լΣ|0!8ś+!|Kꦌ!*H>MǭNhNX0V8 tL-ްcBHa,ƍ҈9R0hDư0"Z$@{ o@yUJRЖ.U@X@*|7M ~oovmyk1zQjLDNc wn, >WeҏW4_+hw³wʯת_s{ P(eVľ `A1@^ j@(\)e HDX&@/E@V kF[͛n>ߞaNXɠT0@BD1ڈu$ 1c.T3| |:sӭF/ D6*KVyc(8;@*d#!l$ IU0 "(SK( X`#VX Q}x ^{{ND}zo:)Nhj6CAe^Y#לjvZ&0!eʳ EEPqB i톊2" JD Ν<;+LtQnl7:Y HƆ )"(֎XU@sgy0ZU4(ªWvO!;4W[ eȨ@XQY:ϑy(sg a8f;=u^UDrڠw1dWQ:АL6^~k]G-xe?HJ4 9E&LDi!(0߹h˦(aiOTQ`dC@DB%$!Vv?ЏڷkjH3 $fvͬK9ː c06fe5l(\[_ٿo Ew/t̙b+1YrȎjPYC4B;j$ -a%@ @ JhbTU@9vލ X<n)l_VM+V:R+Cn;U@ -}:jZŎXW*N;*+(WjcN}ΓNȻSϙlۯa._Z$o6_zg~~Ͽ<+|<~w՛gz!Nk?1lt_W?ow&1npccjj[[xnYmSNIq\SOpEw/~öVڙK;o7:dm0`noo}{=ШǣHh8&W/\zozw"!~~wVt8޺~-7yaۤ^Z0&5"Bd}*⼊σpx |%wߊ?#?c?Go8c#.~OG.xcì35ݘBRe_QP(Aǝuc4R JDDJJ*:!?^$"-AU)B^+c}˷wp3Ȩ?6szccjgCWZI DƢE3oabyJb5hMo8b 3MÍ7{fw;u1bРT **Q5h%2AXR$DlPjҐc;Ӂ̪p@P‘"*r`DP {T3?IB`acT  F嫅YTi T8*BcˊmCcڒ.c+n>Eu8oˉciRc})ϔ9R8a J̠"VvԲqCTr-z׻~~Ph z#fn{ɣHo,6 Qkˆm_[cʂj6Z\YYˆSq 2u'v\< !ʑc|K+/]wM6xϽՅ̽o>7]Rәir?Y1ԛ$rcFͬ?T4 s&HP{ψSc"G^3,́YE|9IBD{Kyl0 * 0TPZ4&c^o dxm}mm6aesXDYeкvM,)5U4 (J>x0&2ZQڠ*()"г;&Vy sh>s~/?+(>ػ">7#r/ߺE *FE$M$ޛҪ%xtq#jN5B ?I"܌4[i}sOm5p<XH!R0d8[MHdwjj׾ݪJBHךAA"ļAڔ^pU(,T_M-{RRBбMV"5DD,Ydz JX$W4P&\N0Ј"D(3N?2]ݛԩTu!e7 DQw^p‡>£=03lPWW!$bl@cHkLS\?<ڽ^{X[z[tКA]Rⶃ` ZKFٸ=ww?_y+^V< ́|9sځ{KmqцH8u[v}eK!T=@Č,yqhCȐ(PQZ.QRX+JeiDH$\}/O+2"HٳbRjr@AS@p-BUad1FB-B`Eħ 4 F8y&,ɿJƫr9۟7R-,?Dow|{󞗿<___?k^gm Gno[Qqꕭ1s/8[޺OsșsӳC/=)wn;vt<cldZZ.#B6Oys_ζF`gw= ӻפiq `nxpZ|C=+%XeQj*!ed%5 ACiCI|0>c56p0&R2h@" "4R"`%9=D]N n#wszl=[ȁD> h,Re= R",8hE Y[RKqĔhv0(M;B@%X1fXtm{j.GO5aV-޽k$ /M`F辆hͫ0OQăoONOƖ66{ߴɂT;W%YRUPnQ?Ƞ"{`A*YBh<_}]]??ַ{__:`}6 ǹrrlr6%OZ/}қ[Wl6^w=Jb~iϡiǢ>N9ts IDAT/FSOfrUXT?nW;'N>sN9}S?zvxv>;7~o(l;=01 T3;a4,!KD$6u̵Z#1Kd,@ DVTDC:ۿ/vannmK  Ԃ6\j'?$~/ }Ko4*h]{2vIdƦpy 9~bijY_:ԞFqk xm'>oßbgoW~=wvA~r3qL bE!C""!!p (|B0Qd8EQ{g:AAuBBFf)Z8k1TziVH375pD&yDԀUBk r,oMZ\0d噯՚ͫk!PQ@s!kWd;UV3jG]@R -'4lvn}=wcGQOoCjo6 BBmĤ`0L_?go])MJlԨq\K,i+(]ߢXpӯ5g{ig2b Hj@ i-Qp0d Hq`Tb#23Z)Ikh5ZPAP1 Pz6k{cH}z/A[*&愅-q"sR%QD0DB夿PJ6Qjn61m[&è ZKe_ɃJT'@dB6#,Qb2W`&GLxN;z(8NYH-!nY4"E ??w7>w'OFz%Zo W7܌Of\UUDA$b;L?3paW |!ݽz֣Efjzz͵)sjGv{0ۍh!ĝv5C_k7 ?83X8QS_|t+o9܅uu+4  .YAf@VA4Ơc"Dԍsy!D8=y ; }i'ȁUQ8G`xЁū\Gkq #E1Žf-/o!Oue' ")@FcNxD$xUR!1DA@!΁V1"ZKby<`ҝkghЈAԘ jX߽;nkfkbOdL$@-tLP/]NSFӲ޶ f;20@.VJO bi(Nƒ) 'PBա; gO=x77rO>YC:vÉ(1Ә:r'cq#9u©/?я<^u6ѰITQTM XD}H$ȊhEz,54Ms0ƌcDfޫb,1`8>̂(d.̮vZU՚c޽{#(~b5kXcs^ TTYP`fAk-$&R?N{k[è֪^pi|ۿf?Zm0x=]45p 0y5b0A)φWDyE a{v=o/vQrTNDڍq6F1~[/y-:()G1CȪBdE^EPVM&vVb- Bhv…׷,cO-D |uΡpR+A$ c{)r(P(CE`PE;U&2Sq(d|~+)]] RD=&Iv4Qۨ-ܶw#PV1klC! BgiV iPXyq˥**P%-~VYE9DTz.Ӈoxg~g~~(`5z>60 <{[{g.n)kx"b'jy66]\xnB0|0 .<{rEx|G-$>F;}-?[q^?b^-r˭AG>{&|Kn޲& 'Jp?v[ Z8wmx DUA Ҡ`[uFAYA&$bA}FGGG'ZVYs$J*dhl:;z葳٥ѨTy}ݲAMŁ G'L"ĎQQĶΏM(Ƭ86RbcJA5I⩙iMb$}N?1՘k3kF/U5H^cbU0T#k0uT&Ԉ$ (bi*vF&!X: )ɫUPErJ `~DO$%gP0e>-l(,ԶR++7 dXP@2¶^:X.sHJR*]Q*{\%Hk,K˼NeA[rX#)˙v6w 4~<^XD\$Xyi`?敷5:{Nmeh)4nLn3 2jp91OX 2dN,b31aR/KfJ L)9Fg!7}/?ٮnhqKUaE@ EjX @ȯ{$DHUvZ̴Z+b_A XXJm >:HL PVV\!uB` ,m%r'c \Vm` *%(8*8*R@X{HKV*)uB0g+s\֖_Ҹȁ6״e^E-&,K0XCL8n;i$@:j |Wt[ϟ9p;37[5ϯȥՕKWΟج5rp(J_~ s{$./oJmL3_h <䓻H r6cO@0EXU JT~~yfɺ&54MkMd#HU<FPT!U$6#{vߝ9:8r3Ĩe,8g" -bl_e˛f> CF"8؁pg~㩺Bns"T ڒ (aB\ LxB t\U$uX\Zԇ AFSxZegU"R%Xtr(me)24Uǜ\3UF27T w,Z@^UZx*Y nrgnKWT m/^G<my:PMW Ik,*^8g/q6Z\#)Y%x66\Z;|=klG|˿Zh5z+4F#zp֑٩`GYOԿt~%""_/{ Տ||+t6;]o}͗zxW EÊ$ªS栂d]wߓ22/5^BrB!sG)XHk5 \{OӼӈl|,B47jSY8T@V3FME@DB,LZHB< nuM-?~0b-0DE 1heBcH2G%FA0[2i<6=?Xj. !H1 Gz;%A>6$hf^~ß7L >[_ϝz;_\V[d.Zqzd V= 3 h@AH-rz#6#C>!1A>ӎZ 69b\Th ŢnAU.9(%`Q-i*\bQ_U ^l-3 8Hh *ZUԀJdl!PRO>ATޱGVUN X:!8=VI-LR5Eki@LթiՑ 艫f`A&zC6?'o%&xC!!xr^m`d[yu҈Sn6ڪffQvƆ841`b8O;x.]Yd#k d}}5;{ر맦C3RםkԒ['БÇ;5t9k3i$[Vn$%DV)±,GgQ8QUfmZ<(#c-kxx%`X$cQVYAP^ص%/@Z?Z9/o (pD8#Dd`PC O Ld )Hր]}J'(`e3[ѹ+^Z[4240Z߲:Ҝ$Hnxdz LݵgǦ:PUNcW#yoկx~ )6iV:fӨ ϩb5~9 F;͖~sLj96#H-f"aTijLLr5fն.^4oVR ,;2 RDKFI9WR+=@ ]?B]'}xpI(a)m=2&yKY)3 Ȫ|dv $E8*`]bv ˫ l]bsQl57Q #HU EFQȘ;w~ks ln֌ BD,`ܙ Qc{۲N Wn5Lì;90Yت)pe>0&Ls:ҡp5^9=hRuDX/ޱ b؊ZjYV9㵂´0XJ٥YgVH2zo5`3GD~K763RlV xvEn='voX]8vʥkK{CvWZ[MCJH`TK+N?@92x{{(;V8N:ݡ;[~S%ۯv6kiiwib*_v(NyŃKo bI`tOa'%pH" Rk]QnHS̊(NUmǥHza H%(Qt&X:хFJ%bg@NꝐ7m %QWbDDޢ!c(3Ԙ!75Asbh"7K6h6&iUU[ZEtyNjลv(R"HD 0lدmvr7#\oub`!QQLp۝%Z9=)aLnyh`s 56^5A`=(\(GƓKKkwϟҗ_3?7W6' Õե\xUD~:qZ贗űW+cx{gaaL[xj&nV(rOvrQ3gq[i`1VVXŃ8 {/ (EZgju+E=zQDXXUb`QX)kS:gI)MN8fNY~`}@g GtnLm܏zU3ŽXp4x*xv8D{RvM*CHK6aRs-"sgw_z==EiTaUiK"#w3a/ݘLw͟^JmIgV:r3~Wknne~*t} s+sd#ĘFt=WN2Zd5D()DbE͝4+\IGA^/JT"UgVTm9Qr`)nYyJ+XlԄʿ%aF@PsOiq6 ^yRFdՌR6ԐUB@,Jn!: P'T;j'+D`':A@@BhZ5hVcN6B MRMqTZII!>s13wU؃ `+̹W^{(Ny&;Bf62DX<0H3id#P:UlPN(}S?ʭW/_O>@ׯ~OOufN;}wgSâ(>Oi(?'[P_q`S8ϔu+5 A1Z몪ăNfƀDEXgl7u a$wI):w5Xk"̂ǩ1UC{ EgG(7c-vpVgRz r TQYC,,NqZǑ! :g1gl7o_W~.\۽ Ͻ}q,' ro:Cc^L}fɩ)+CMG:[X9̩F{F;xc/$rl vbuE\/@tOftP78ҨʢwDLi ii:BϪ1Sc؍N9riZ@2%I}j(U|W3(+Eb F* QoaBD #`R ilo`5Sϝ?spJc@c8-P@5 E¡V)DjM KQhf< Q[Ve7,hDTgW[x4SaIk1-##{UǵFh<>tG:Ai9@ύe7./E!zOkzVDg(KFj⻾ǿg .:?9TQ3ϭ ;)TΑ콈w`p{ΚJϼ;W`{OO}6Y( 26#tD۪d ]mXpλ_AO={_&f{f`/iy"|jIHǀ@HH$L.ǺBJYVJkG(,8O,7b)Xʃ_Ζ{Z)T+ˇJ,2⤫8Vqmv{vO Rp1 )IQ쁷hruU]4F3i|~_]=^z:#Sj<>@*Ң}ǶOtx*LJ[/]kxzs/ȃw/|u׋N [C/"oH+}`PW]i5-4!3JKH"{B#xzy;lSWn`:swu[w,AEʐ>mm(8&[V1d yURQ &TEb!RJ%:""+";c? Qh&谥[ʾm0|JG ob$ͱ !iVpLGVoE6 ƖsB/> U 4Vqf6uN9ZQs{IWz1O11auzkǕB"RDwY+\틲@g zQ+Y[uml1eY`l)c,ieU&0:ɓOc<"7aDZ[k8xrW8P aV)J~{?ɒ8GG~~w~{Ʒefn65pNkzCI1R+/weܚ7+.G>"<{BLpצNαus71u=C$k-`.J{]Y7wXk1Xt:)3hRq8PžtVV޵׮rPV)20CG :Dk9!DYeiflw~v^ֳj4uͼLfY'}7лc?tϏV?鿲@TYRē?iEiKf6wѳo:e ?ۙ% :ʍIO U ʨ=#FҺjyMʩT^{!Rlj4>{NmEO$"{_'N9@9ݿWzmy9^L{eu]lpx(M]NӚkgBYg ۍ[^XW+'YtʃgD Km.BMmCklԉR-^ \7R"H & 9E^("{:*KN? f (ܲ"p'+pEQW:$~\ĀY$K[k} BH׷fMKOE[^/Y~Ҥ|{tg߸>'w_/_dpgP AK 0tJ)ͳ~F&la9j6= v:tfk5JNst6wN)nޛ|`P|5ke?ɤì3LkO[Wo/vw=~^N+" >(ow6dvTFiEy:eYCS:l09nT)*'{ɏ_"kiZX׵s Ii V9fQJ` yd 4{`P{B B?]'Niu"F$HukP 96c¼zi i Ÿ-r״&-69%EQp-na}2o2c I(J`(p`g6H;:;acP0ӭ/4Z,Ic0tOΡB"wx;u_RV!x^2.jR_?gז{iϲђ$5\u=RÀD3{V $wQuPx k4E\H:4g.Aʋ&Ze?#jV}?gղnkWuN#vN)͞Zq[;=.Xsͳ'T >I @-gfPUAgׯ_;}jڵ2 N)5D&f񞅃39Hб"?foZqu}GT]yyȻ34K7WKWhwoo\t7no~+_uy܋嵕4nv^|ʚR<3.,.~+_|nӏ4l==Z=pr9EH6E'ɻ%h0azw`Ics4b ZrDq6.829iۏyi?CC"v 8]js`{=n2k""MYjqjӯvY^Z!4 H(vh@~P9]LlI7-߼C~zŋ/7ʢ^_-vG XUvqi{|[۶VN?q[{ V"&ޑ>џR4HWn7k=,drxskƕiny*Yy!DJ^\])'{Nuzډި!pOfl#D sNr:, =9 F`p>RH'Fmgh{Tf5/0# ̑PWilATt~|cӯ~k/._=q+slж#kNU!&*G't ^-ߴ#j>mM6@JۄCK$64[m?o+DQ"2d[8hN0̥ &OPO'_zNEF?JY.~=YN'z Hy>""I(@9wm_Q6)lŖ(BM:\|1ٗjv0y*s/[Qʛ(J[ϽC*Br֦h;  U~z0H$EltR EF`wnnwo3(NR] IDATw~w;uqX^Zy.8vfA%]Q |E#JQ̆{`X[Yzo.]xʇg_?x޻Ai$Eng.B3 knYw(CR fǤTR 8S./ F*J3#Bv8uDĘ% ;}AVb :l5/Dd Q SMsDcK^ QX!!+T&+Enނ/Wz&Q,⎹yѴ_ 2 $rG'^󏛻4JYL? *9PMc!C$1Յo[y'Ȏ}J@AfD%h,!Dc' o؟`6sk[\XIҪHUY$S*1u""q)<*f}#ɡe**bD!H\9NZ'N[d/|rZ}w߇ZދKZ-TYtׁGDfv΅;(*g*cq3ZAZ338Ͽx 7u7qBXx:_~J c/(&n!{-6Ek/׿𻕕;$ʫF˟{0w[, c,IC4<krO--3ooo p4c~TeM[׭1"$IӍ>wL^̨nfkk^( *Rq `=AVbv)g..oL6T|/=Ь8(w'HTf=<8ظҫ/{yꩧx$[` 2cgo$CNءx Hk3*~R3,vE7[*Nc?,QYt꼡;nYuDc:v"-G܄ǚ`B Mi!3hǑ&c@2s$9:n<;/NZڜenffY "զ pLlB8",XBN.i;gmmsZW9묱={! {FQc+(γBEHQG*q(ґt%qCIBCu:k"儔T[xf _׺q7*S+҃0jL(I D ":g1?w7&^]]? ~{?k_szky}'M=ޛ {s_8<;[IIpWD9$RIxl o cH֚ZVJEq Ν 5*̤^ 4o7Vޖw"EUN$X V=)tv\̺8bRHPbҫĹ8Cn7᪪l;?+rz[[W$+ dr:C@tEY?jM{Ӽ '̰]]#𹅁EqQ&A,BPǘv̡=] UWRbSk],>H FQ|ʟ~G}W\옲C[t"k*8yl0y.Ζ\gb1(URުj/OujaVVpP*aYc>2(oBm]9ǡZ3Qi՞ At@({~}sakV㲯,^9aĘ.̫*˜uHEҚT i EYL]{$RQԦͦ55%T $J!gB LG{L8WTFj Y^Qq}MZk,HsVr?^ 7vmQ)^^^=XSݓ$/fQ.?G<ĵM[Y㙭\|,.B@Ʃ9a}<ǑaEJPbb ET}tȍXZ&=0Ӫ4ACe@aKʷ\$0f(9<=gcL" # 8B}M!e1a`SJ ǘ$[Ah`@`˷:^ 7sلBݙ3ib@9 SC\Unݸz#HFBM D,)٢H(]s-c kA6Jų|s)[>=/ZP>0s/\[_]T:'ro=zadKVJ)2!_;kk"Q޲2e/(F9 )p`P yi6V* gwZRfIv흍ⵛOɲ,$vwwwo=pcv5+>n_VDx$$ޖS%,UYCP,(iP(DD*\ Qٓ{ɴ]uLD#wtT5KD.H½qdiyeڒz:%U`otҤbTƅuj+Az> ?$?0/=(M  CF6 "JR4B@B@RHE,قx+" "ue!XVꉕ^{=?e{ٝ۱NYS#?+Ő|w?zz1QCjGn5DDEIͺg"Y8,(CߐUÐ9>BS 5) 8hs[P#̱J϶8F@3! B7nD<9ZUnoE`=%ݝdH _W @벀1l@T6T8hxD9O; %,?ο5A! IwQD@Iv4= j3?qSuݙՍ0UR?§|:~ ĠQ9DE\혜D x^}c֠0d I9WeBO&EY`wڬ(o\z2K'y@e}^o;Oj&+*9波VXwtyyx^sމ3@,u8L&HJk-![9D;jD['PTsς2O@8M˛{4Y{yx/[;{`8֨:q::u{>c/W:H# 4kVFBDD :DB * ž6'DiefYaeMEťSi(p~ _t_joq-iEap/̽H""BJ! za ,N F+N; V( " CO (o5ƲqcnifD9h(䜆OCCHw~R38!:pu_OfF]ӸBbgͽk=c$ "7"2 /APѱ᡹6p$6'G[9%(@pSoxӡpmex;{{6X AbuJ')S/|'g\>xe$^KvЃ8m928=C2Xׯl{C_lJd,8XC5TGUŬ.48bfV.%mQL;_)S%K ƻ<;vzCIEA6sւں^O+U접m4@fnl^E!wӋ ΟrkxAD?qxӧ?4ܙ}?*eQÙxv=0? *bOBRa9Afv@L 7BtyUt{N6X#(0ST<̊)yy7Q'xks8\ :8%;BZ^XHҨ(+H!gY[pf߲"Ex$$7ndToi[r im6BE )}+ h]h&Zurfx$ ,21= d̹&o~togfoYTcƏXvi~iW4Zb #H06i~bEaDA_NM K3# rFЖC޳( ^"Rigґjqqq#rfmYf.sH#4a00(b'Fdӵ/ze'3q'li _y{{F/64˲,I,sk,qZ1Ni6;vKÍ_)eV@,KPqvt=Zk}qqA{KD9VM!(70ցY<;yB|[[nLw\4;EvX(fbb9,r%/^XE4x& O>)ݥHIU}gNX8E{[Ue^U]u=$YoeCE2˲vniyUDvv7b8 SYF Tؒ"1H/uìƋKybHdaaygZGq6+|Dx9ˣp+M0tbUu&2}];A{ˎc:i6N "v"!M)lF#Ye^FBT0W㰗R/mbKo6Es~:_j8"ȂN·åvqu_I=lW 2$=f֬v)#8֎i Mo}KA 8&ۚtO-^7 `!9Z9GAm0X[t fSmn`ӊ2 ;cSP׮sSjUV h4i5mnޜl!f^]4'^P:`H>qulgi9aM5w9~w`00 $QK*ʉX.џ(UTq9?(\ĎbVJ K) 0r>;d0U.r`fܹs>+e>Ą8u\JLHTUe*t6VZJ۶Imm~~wj ٜKe~ڕѢU2ڨ^WX3$ȝ*zjFjʈy3fjiV#'{UCBݍǪ޵77U'WĢb& _pι߻Q}+0Uqf \DT7&6;J&㺞AQ`yT43mݰw=-bSO͍w /yBǾkPwE{;ˢLWwNqYL)alILChE-/VE3Mhфw?9sɓT"Ǵ=@T m!W<ĘwI0F#f@rgd찰̗58LHS<;#/)]wnes-u A'd9HRL4 b"{g6 -+ ,er !/l9^c|xL YnV.Ԏ|tFF 4Y/ B8% F4o h=wu ![S|I,޾$~Jh^{{ o|ʻ=T0Q9{_{V[Aj+h\ |єjS\ FjU!rޠ:)$FSbbis/#ݽqǚ7jFOȍeQ$Ib eXT@0GdVS;"$5QRT | ,5CSw !Q>rQP*_ƥK?/_z`bdGthRwD$6 68,+^(CJ0}hnuEqɵýK%\᥈H \ye79% GG5#z>WD[U  Jo!e1YH{z}'_ziw>xxAEE2*<1"d@3t92!$iaC`ؑ័ : dJ]&!P0 (Cv`-Vcӄf>|^4i$BDVѶmBhi+ό+?|j>F+B;Dq]T"(:zn2@d53n3D;Z:VI f:m 9/G Լ q )*vو`HhQCfV. Pq>uH(4O=f osTw#0W;?ٗge,'w7Fwmm[ΟCĀ} 3Râ1R]yrL1F3U3rf@ȭ ׯ({8B;?B d΃ۿO?SFAa kNڄ"-+qҐUTAю, ^PfQI jJ)[7s%QzD1" O;"D.V''k~IѾ#RB7fF`?uN`Ms&r1;fʗ 9ӰGTRjwoQVjZEC\CŔQ'^AA IDAT͛>k7\6uG|$ ^S_r#4bQe1 A5SǙiVsz߻q'~O}iqT8'E B # *d2n@eFa!hWƻhd-Q^,|фEh- W/Ԕ*[I< a&i`<b:{e$a݄n4VC @0Ysx165,W,ܓZ(; -uZeD%y fK%%Yx恺iI:0+2YKTd6ɺd!sү/:*fa.bȇI ;hS!%RWtmKڙ֋kGyxHGG_1?$ \V Cۇ|=Uk׌/]8 RHc_!S*Z-k;3ih&!ԋy !(L䘝S3JhB+]3Rt{yU2@ cX*4L1&0AP;` @H 8mD sAheZA;2{naCPE>)BΪd";A=x7_?Ƚ_Ug T ++'9;@N9#k%#_V!3J1e&9RF(SXvpe:nllH^wG_#[~uo\)LtƁQ4eAͨtZQLNvn"jN?o|^}w}$3g 422~;")₀:@>P3}"6`$ŢIIi:M'L3;e"ׄ@O !bGeo еNChn޼y;#M1yX2z8 R#QmBl-"hr"Yf%KT0¥2؝"V3F, !!+Mʹ FȚ7\ʒ-Dr\2i:ꤚH{-ߙ;Bl)k~Z`Es%;3,k^,$ W9Ҥu4Rn}_ӛSb Zyo_%8qs|H>,$mufbG+{mw6ƳzVh>nF޹g}!t- Ĭ1^R[1$5dUR2>F@MՔGԁ)"YIDDuvȪ*O vK mC &-R׿m%HjfT HCgn`( }QATUU3 I!@#" $#?> +Vom ̈/機|7^ݽNZOɩC2U``j #XiBvB`*8k›(c_B%'H C%4 y CT@dDX7^H[+wiL=AA4G,U`i Ŭh(x7M&V3EwcG $ bQ"U*cIT @=7I s|SNh ,T/e n,Gd8@G @6N]( 3;KBb(CmFQf&&+#3AL=f\%f^ *avo 1$C壠hOIGyouimek2ܿiOeo^ Uʨ{bg;NO?C_yNfhp{ϔnm %Hix?뿲s4z d0.BjmRZVԏƯ՝T)5fӄg{9K)tv奇- A}g"IQ˝=̭%U#<&l]5tD-dy04L W{&y%غ *嫼\A u e=?SDCzE3kfDn<}jJ"VyK/=񜝾FGYxrT@Ebuk/>3)J,h``F`Ԃ t0+x㜀.J9go1"PyU43f„ɁB 4A`)(x!,!G`t)8f CHΐq]x"1F'j^~:!:@$#FQaTQ&ivlM!1EGCQb03@Q,#e5L5dy9@mq6ŢiH~O}GWn~KO;So{N>ƈ5i""Wz'?_1ĺY&Gt/bՕ&v~$dV/ GP.޻}hܙ2ij"Թ)hf`*Y$*"JbY߭ѦmET 83X&†* r`3Ĝdz)Uc 2$ )ju@ u!vp|5wqlpE0L g.-ڦ?trV{h|2 0y=3Ї>3=iJ +.Drls d'Yc|7?='_zqT W^Ylh,jfؓS~Uy$Sg!@DR|U 38Ua 2 QLwC ,;{,Ea@!9DFp{67L@3$v(DY0oX;?ߩCzB(R]'>x_R j1E"o4cbm1 *jĠSuĦ˺U0D@"S-ʕ+9ʢp3ϔxr} VE! IUAA! a>M ܿuE\xDdRcfFȤ][buc [zTTY8bwTnqXT~U^osub9|͇VGpB-Ex6.#*"%5HHlTT7xEr"ChI 2>GHӈ%FAsdDjp PEaUmH+BANĖѭ{.2'Zpg?r)>c55=ݰO%Ij%qLj@ޛHN$!LH̄18~)g٘S!wd 4:@^T=tm0oVz:40+d>L:dҸ1G$tQC*a̦O'iu yIvī=pi=]o]k{'w{}3v>O) Hoa <ɏ/$Փ$i1cӶY|>iS/b*i6GwKp?kΜ9y<~桋ׯzb`dC#4z`ɕU Tg1e(sXf# `* JTDC4]6ǩYR;Zu{m$Qtc2x_=nĬQHe?*וlĺ4M߅a4`RDC3CGs\9qLMD WРt>\UBӮG+mm?T0SE= w1uzr^YED͵M鰉L/ iѶmG, y;|sj0+ٷ_5}Y Mqq4a6ΧżmgfQ64mjж1$I `o_Ef?7w_y3NWucu=Kzpggɓ^ԷZ6IB\xt{ }{FW.¼^S F]A^rU A !2#]xO˯ߜńBK@бβ1[ܲ K,S1Y.{!hFUwmJDLv薣:b>VVϟ>ڥץ xbcgTWw^O,<'CwoUEs-]y bNQ}.WV3Ubt ,bX00`rٲ^/41hZZI gUYyVVc .ri,3AfŠK51t  g6ˣ* *L"L$S0U360@'/~R+Crm Qr`ysG?pk綑EVU,jD\([ LoeY-rn(Y>z+gyʧHF) -2]KE/N j`ܖzX1&\O*!cj8WeE;n"LoX6jc(2Xf$"s$ ߾޸Nͤ>g{N|hk,8u`5Xx_v8wƦ͢x-G)uDc)4)JAC_)~7x.^peqptqeZAU66K룻Οy?ߙ꯬}'~߾ ?؟.&#$`@fdVz5"T5$=^vgғ}v:HD Divӭe `x-ݺ]"o>b:^@-;v;.n['f@EۜކТ[NT[zꟽ]'N>}|sZL+ׯOANWWz̍|ϽJ^TysXX2ֆcZ=gN_׸3P ɕ ^%w=uv֕cD@3V)酪 pܠrvdY*"ݟh@\9P(وXՒd@ (fLs(yl6ïɮ?1L!El҂ayX~_W.|z&f\UsDJHH3:,`[;LrqH!C3Rs SZr:.d~Ȳo6?j9z@r>A񙁱ZJvrE&`$'lqA](1|X4JBAQMf;ܜ')looArBB:0 h ^//[٘lxo=^/Nqr]QM^{Zt$&64h<M"1iJiPЦ( *mh-p7Gdz7_}[*%`>׿{Os>~7n4u{_.\/> W}bԫm͗'p=`){Q-wS+~_zyCF`Z]a.?Ĭn?Y 9@Ms2. iڱR.AʡX)eԲu148\~x: d6Zׯ޹'o]B;b;'$z䜹;~@b,p݉O(w?%0G(j^$#3 &5A?P;Nj^m6̀ͅmhzv^I%\NsRw]A.&yr@&F$MIID34sIEF4, EQm9%FRT*CMr`;?{wNJ`v$ J*y Y@qA4W74$KI-L2.c-[95o!ځa i9/ѮًѬ8;yX0U1[q9?A\ beX~Uj.1P_ѸnbgnS*l&Bsxy&03#50P _0u{_yo?}l_ħ~?M7⍕Ν+Bae14EScE,,;8GLZ4*zjgL?:(bfIELt!*2%;O%B"@J$9kگ<#gxd**&RGq-e/V!u~@\{accʐ$4 @9&,`BD|A3! e&\s 9gT 1M1Qy0Sf*JT& <.̞H  BdQQ;F`d xf;]0`D{vR"S̘nH$*s;QF88sXD L?㮃u"JA4%  K7OwkiDhm}D5?iH Q%XتԆWnɬ\Z׾/XPQ n0I`lx52I5IJA3UsĠ ,b"\4^={}^ys;ttrU[L1|>m~G??SϾW>OloxpNãz:T&K%BAi7 IfJɹb4ԔX!3ۙß ]f|);r+Jڝ]Zdom *њew7k dv'bHa^{Rh\QdR02ƢK9 I6+e7p;k;Ft^r0ćx]_{}FqFmh Qϕhs܍1y̘Sx%aL"q_$SE Z3_F T?vL;'1Kwؕ!+鋟~:_~S`{+:+Y۴QLэwAJj wEἨ$"ֶ E]Z?--sLrqПzp)nw}[Ⱥ/i<>$2@4kԥ 9'3#+=v%{v8k'LTUQ(s!:&&G jPme0 <aV%3Pɗ$iFΧkDUf>UۘY3M!X43`fD@Đ)842%]6! "Q*!xiD$%1‚ D1uay^r=gV@,.UTdZc$v\29Em yH1(9 $fo*wI QLMM0""pίBjT-ryb mo ZJLT1*.fѢAH}L4b7=( "`u u7hu 67OM{!zA ij:]`}^q|#9E* o02hD(76wh8'Yh7)$9r ~R)˲F:qᑝE#& (9LE1FR2JL (Q+ l`jha tmW|JZ-&7Rb#M ʆc$ER""sوU=U-R6v5Лu>,ҭAf,ʱTwK̃ݧc5 "$4PGGG;;1e$o6Rj(z>wHjGs̤a#"3*WձT!?b oyw(m8Z] . JjB1AMIQc.aٗ۔SQ`iB4:XQWpYۛ[t>޻2"3@)Df{_* #ރcE=AKMhN}Ӂo4BYT}sB])%\YeY糩3zyB,=X 0ϸ$ Рmä^ uL+?UUY[iw!װs^TԒl 9b_õ. YxD 3cSL!yb"GdЄf*`A!jL NIiRgd Ё!!fJS(I H-Hjs uReBJʖmI4)?EI*L{ aI8UM*fٓ*C^$J0b 9]f1@PhI?b5is4@p!W5|l `څGoo5'v7M!M1[LTԒd"1b؃w?!޸vf1w~w]6xA'EJfwI^o!1 HΓw39Ϯ`=)DEDD4ĠH]"M 4A$ (<ښ}]oG6ᴞKF[ןܳo/{&jb)0v=X!i̼ hm uIn秹Cv&dDjFE((y`@j9%b!),'͖ Y{v5MNƖa^V;QS,T nyPRjIr2$VNŽL- WߞeK"gwe*  d8<>]߹pnc]=w~wswoοqOpofưvш0AGECN;!0r2SD%Rnպ%vT;KIٔ\şB9s ޡ;fyr:lN6Y-e67ٛfyW^yt~8;zᅗya[{`6sfT&Y(wN 0_d]r<_&+f(j=ѳrVVp8ݬKيixKTSWjye϶t'|>LJp3cr?d'w0GweF/IJ+LU (z]7OY.RYaBIX y [%,* sc<]_4mg(AsA:f[[[Gq5A_Q 8v66<{n@5u]M !fsg;}<ݭ .']~oroׯϒ╗gO7ikiX""P#bV FCRjI(8$BVlv8lu5!iYRd6Q,l RJ92*Waȩֵ>M)*6+3,h>ܘLG1r!.?4P%q5LW5VkGtZodK^ٻ;z0<6Y_tq4'k ΚLGGG=Xץ.(2dwg0ҥ<7ˣbhKDFjpw^xO_v!GY`M۶={]X( oy8[kwn{=TNIb WD n 2ln@L 1fT8['N'*xDR6riT1H! 3Q!b5 "aP!Rmdwh%Tu}V}0p=NwSeΗ[B<-:sN۬ZڔjV5Ez"g{ޘr1p sb~.s[;&͈ܴ'y}mgp l7|KէӫO=lb<:<\ټi,n"fvқ-")4_|ozmm2[4丳誺ߓ `0b .ώħZ5ybBER+`ROX*ޠ&vV? ȞEDEƈ-[vEf U L Q(2 L0#g@>+c)l)03yF!gw EA* frM;0S 0{bi$ D ĥȳVК!s1-l'badN\|J$b0v 5?OW|WѼt]znݫ._<k Ukƍ{CU#Myo xۦ T Km-g|aYpkskN5b,}a k<K/7ōdypuA LꍔzibU!e[4RW:E.,LD?tΖSgB1ƪ"rK)%"AM ALYՌy%NGrs)pvm3p=EeSn\ Ad+3lnnVa@UU!]`|t8sw,*䘶rK1`8*a"TUsQN47S1A:Pm}4Yͻ&cdf薢xəTWڎt۷n փ`6 vCn]6fRcBRwM!F"0ᨊRvXCg"ܜ-*4{LꥪPb0[1ƄŔw2f"gAzKbTZxYKcr+ (Ċ&EnFssoO˅7Ƞ߇iDp3gи(p+@AO3X}Ո6i.RᜩM}qo~ؑ'_n7^c{oCƭ){3X'0 PqRջt2Re9/RJ 1DBUכ06iʹi iPױblw?=?3[|֧>/_gp˛ N9k㦰.Rp8rFz;x8qaL7sk. ti:8J13*7&(@-Q_=tc//wFY^qccgmu5ԍsOWeVL-f0fMjb*ڎ^IBp':Or8u'z@,kԭX.ox/߻{7Ɓ)ܳX47cs0_{?~W?6@IDATi/V'|CO|ǔ >)`j]!5Q]p0a$'/u:_|$sS=NlPm „) s#wRjKnp.[oƽ<?ͭۃÙ`8狣Fc꽄uwXiKK#RbYMרgK`̄B?r2mFU']i@a bqw5fz8'x4;c1_/K3L&.z=!@t*Yc'?'+ꗞ}bXON&k?nb2 :_,ڔ_zŭMmԃG'x?/uD{{{߾;(kgsS>~ʕ'oߺ٥_}|cf^O`}YY)N!7#fv Vvvˣy6Km uX V )3Qvkز0wX 4_,f)$Wfa潽ckHDʑ|R,gY,ND]>paj{~_umZ[SO]y7oAR֤*q ׾/ϟ|O{h ELd!||+I]m߿3_,86m/^ڟ/Va\c(snޘpf^1W raUsId͛esY/)^0\l)1sUUtfKeU"Xepf1F@zTQ9FY|b,邈޼_+J%,LF_sd.7mwppvM62ڥKF_{'kuU]L5̏.>x8oTzځg羸lgۇQ r ,y;-  Z4mqB}ߝ nm|@8C̛e܃]z9f]˶S 1H:B*!3-ZwT.yGΙpuV"+:"Z9ҞY|,ũCz47ٮ}7o _x lqt8V4ARȕD{G7dR@Vq5![wnOƓ/[o ʕBm53uX$&JJ7޺qxx4OBżMG`I$9NI,:RdLM - 0d]_wjR$eY*JJh*̅ QB1&%S˩sbf6Sn\>t p,%βY6^l fn4?`ccc07w7wo5SO۶R- f$=ӡ߮d6766~^6kV1:Pp853xS4꺸"-Ky$IF΍~V&xi֑*G1;#[L9v-TBو ܣb "j{;8SH >3;wk9 4elHUU1BDbi lLDdf"FԝeY9_hR jyT *g8;KW(H]*m0 E$,s׶V!Hcesz7c׭1̘8BJ0&c`Ae?_Ժ}9;"j Ke罽i gv2:ϋ}Y.`3]VROШЄPVjkgisMi8QWߓA{bg`)ӻSN.mGq}۪(8O 6Mi"V9 mG!p{}DM*$wYŧ(βY| Z ГL:"8-'?4ytV* ?ܻ0UdA'kG|3ݰ:ԉxwCΒY|J,G 7K6* #yZ;ىtxo>rT+l_7>jv2<򂏦wx$glH1(G9r̊C=V?8ꨣJR\ظqGy$}+Vl޼]TOӏ=e]MeժUgFq뭷j5.\X,?o}[7p9㷾'pB@9ȑ#3w=q}ѫW^t 7|K/mjժ].C{W^׿lٲ+bÆ 78vto ছnw_W愞#GpϞ]w]Z;oݻw?_#kڵp׺V\Y׷lNIo\zzz#QSry;qW^T*y;w־u;ㆆ/_H?OEdҥr䄞#G?/-^>"X-_Rp^&&&V^=>>^Vƚip ===7x~ׯ]X,~~eٟwW^s5coh/B9r*R*|Wn$1Tkm7|V`sȑk;! ~z9r@k9rAN9rAN9rȑ#G9rȑ#G9rȑ#G9rȑ#G9rȑ#G9rȑ#G9rȑ#G9rȑ#G9rȑ#G9rȑ#G[0WWJYkGFFUozӛ1u’%K[k^իWoݺu?YO)/G_\+a?-^1z뭛7ov__'tmftN;+V(1###_vڱdɒZ,9眓$Rj۶m]]]"RV?SFFF~s;1Ƭ^Ν$mN;쳵Dm۶[n38裟x9ȷ}aMoz3n;s?'_!.kq]vپN{Ǿ`ۿ[O.\oFD"f͚;NDFFFfnݺ 6z===IG)vZćW4\r%o~ED3|ɇz;2gΜ:c={r!/2-SO姞zk_ڥK"iW>묳.:/޹s+_}r<xVp뭷z뭯~z'?b "ꪫ.ґ{/}{Gʕ+?-Z( ÎeO^ϝRn={֮]C]~哓gy5\swi|T*۷oG_W ޽{կs97te]Ν;͛O|ׯ?s*믺*ð^xwyI'Oc>c7W}{ڵk>#< .+>`D?e˖k?э7x7Ο?ݺuvXw~Iq|SN}S?Ac̿ۿmذaݺu֭;nF+-[y޻~Dh4>}]dIGG|p$_~>x38cܹ^z]`۶mg/_~'^y啮_W7? _vip5,X K.7_W-wyٲewޥ|M7}_\nݗ}{G3dzB!Ù'tҪU暁m{.Rtw{r+_W_}'*|/˿o=܅ "7==c?Ͽ_p^zg}.\>099r Oԧ>qgFQ|栃Zbw}yŋAb ?|w|_>bŊjphS(PJ~`…r "߰aG]*z{{<̫=kfdd3׿'Y9J)tww_uU^{~.xy=ٸq+1U#8o|c__UW]5>>~7o~[䧢(bowunٲ_bEWv<~'Zke9Q*cݱ{ZA4 N.Yλ b bIرǃ hײ$xy38P(N8?qVs&IBD??7|?N8y.[nӟhoK~c[ome˖޽{]aϟ>;]+GDDt^xYge…DN( DxGV*oq׭K 5k/}yQGYku]wˉ3~ W_Nڕ Wy'|VzmZk J摥KNNN>裝GgϞ˿z;Q*]?O}}}7nLKYk׮}^~˗>z[c9y#ro?3կo}͚o~k_{_'t=hhhh{VnٸqzYTw,YX,{RڳgϮ]FFFժST&!n߾}ttthhhT*z~)Jgxr<00 "[n[o^bX.cm7͛700֭;S? a$||||ll=y)""A寸袋򖷬^o}wE)ڟ/7 ]w]wl{99Ea#o۶裏qvڴiS[l衇صkף>:00000e˖;wFQ~?CCCs>vqǕ}sCCC۷o߾}qƍJ+W{Gk}a5twoݺ?;gΜe˖}ݼy5khѢb{87mڴy|pӦMQmذapp𨣎/޽{7l0>>C=m۶U{ pf$Iu;vDQÏ͛7m444Cmp_|LXo~sGye766ʓ$ 7ܰdɒuw}[l9xo|;w\fMwlZrYgugy]]]7nܶm֭[]ƘcǎիW+w>cw=99#0-[6mڴs RZ)JկvOz!f^reGGGwwg9ȑOgq׾?.ȟ.;9rxA`.J/G9rȑ#G9rȑ#G9rȑ#G9rȑ#G9rȑ#G9rȑ# _/hnut x EU3ßәZ1(ymgx'Dz)bam==CZl3xLϸH^î,cZ$u`_[I8';e{~F-L{d^_{xyӢM?3ul*\[1Y͑IzZ-wYȊϩgS<>O=r¬x~ءOY=2v]j7M} d\dz|;P!9(<18cpL;;"V) S IDbٶXi= -i gsgl%a8(f-"pYJV8H$!B@ p)% )#aE#PFw 1a8R"H%$:H@IDHHDmT-J{miV׫a-$Rav!,h$q QR{~$3<, `5Sw"VA=\*+"=_{J( @Ψ` 57-f M=gFkS42$3>qr 2㜙 χLmb`J=*Km%:$U쁢 `FX|/{&IlM\ RagwufM^=) /7gGG'ŀR`Ӧ>DHTҞwwVʥ7k9"WbQ`9 #d`Je ѠtpF f7/iP`2LSϓVE2 IDATQSY־v/:'c HDk%1eBuF {kP/ if "A7(B(E]2@V*I&RDȝ̖luvRA"GJ)&) DԀHRlC I:g֘$}Cљ. 7́1K+͛mWz/)t:,}Ђ^{vLp_"soYjIH,KXAMQ@k"I-T.0 É ύJEaŻG%:po]#ŽIoo(߳yŠ_ OֈYO Rl|HA,&ܞV8S:`j111YlZø&5qbDiLPDHik0!T6BܒyڅMJwa_"y~Q(yDAiOG&&AnaNUV3E w(VW1&A&CNDORZi[dNXtqrɠ؄@)<$ ( Bd,bI1S6jYE[/2c90 U 0nv^ InI'3d@TC@ab%*bC1+dډX CVט2"ZB&$w-)zj- OAҰ ,8Bo~eK#Cqmbr|\)PH1؎Jyr9aq@91A NY(k5ĞcR("RXpiww;m1H~*审;w_Padb@/~ݻ?V&Im(ZQ4qtbڨwwudu:wBDkdurZGq {fY0;%%F@t|[4/Xwn%*rx!VZ`D~V$AWn2z"nO4#%'ĀQ Xh͈.*Z#ZsBR .(s>XaN"IuESE݌y*'IOHۺU 4Oy>A;iЋ mȇX&TQh 66̞<#liokꆭ0 lFOyLO]fZ +?HfV̚5'".O9@Zb9K'%(ъ_MIXiIj,2[c (g[kE\ 30caY؇N{ *qHM)DJ 4|I;:Z֜'31"FTKL-Nq ~iDȾzNDAN%f9s Ocu*%K=+j\ZPLAT(J[W|"R_aP,PV .x"MZ<`0rWHQOHALٻљbprŅmC{FI Jdl#+'_0 ?&k` !aN ZTsa (َ8RayNAjHhAA!|Y+}۾ 5]Ow+ DaN]whszIl'Z2$JR)!PQŨtZ1..Lo{τM!lvh{ f^B@snfȺlIeBZNBT+,]dxbd}-cl@LNV%NbD|_qGI D~{S&$iC$Cf6x ҚT]VnBc z]ꉣp'vCݦ}`uܾZ9y~T|OZ|/]QYB'OܱS5bXЦ;vUFRJbi!;TRBw0*Ւ_YZk KX@y}.T*JbP  IO۷-]>Nv QQd&$#ЭltA4E\bɭo""dڴk.iF4vD,%[iJ0Aqt x }=dtaaM6i"CKP E%Ynb(7X^I!`E HBQb 0cpVt~2,NW'Sy.kx?`ZfӻZTlV=4ے }?;.l4~wC۞\v+Wh<$2a4FjTǠ: Q b 6e8㴹vm׊#dAR :]pH)*EF /&q8;찱ñuc $s{o{t=jo1o^5/>]Wbb8nJ 0H2f’8R;mѾV\;G9ݚHD)Qnw.&qВ%ӁxU(.Z&̘n+#‚d}OZ)MCQ)BTN%Aa"("b\$C8FܭrcWb)r>9W̅0P2Ch9]M>-ψHJ)XMaڧ2)%К)1Xk,28S?$}/"2<5ݙݻw_HQM eЄ0@ A/ll0DBR,ؖ. y_ݝytyTUf?dVݧgg^JT1}NUfUVVd/"~aMӜM~C'''^_Nl_m, GhW?}Q!dz;qTx_ UU9R. bD Pi LMZÊWݧ 1BHZX4x66u]7u!xcc}0Lgg&!Dxm4.kxa=?7޿w ^1jQѨr-H(բZ y2]]Wϝ9׺LHN@ s`,(}uΥ`}T "K-%M%1`_B!#.%$ Qwnt I IDAT2 Mb-BqIbC|4p1x۽^O\Oe e >JI.w>SÓϖ1:a[ 8 f2gM HH SDI1!w m$RS)Y03ES5K¼MۘH& @!q!0Yi/Uylg5ʹ[A,A3- \nc!Ͻ 5z+ɶu.kYl$O5-ѓÝW=V /=sT] mɥl=q\V݂a3WE7˿oW#ƪ"\`oov ٹAXm g$ ʲnP`B s(4Χڦir (_ :OWnm9[g+W?;<82U'zއۿy;7?7_ჿ:sgr,BljrM[ӶmB~%33&*"-eSI4Х;QJD6."EQDr)$2P3і/?5U5*aYBH}85$ϒ5̔uZ@f9i%1X&ѳ}6MӶm۶fhۀN̫HUcTxfҹ@g;*R+_Eu.~si_K$U]lBSHi4 f&;aNqI(gZc}Ps"#/00k|^VP+J;f!&e*9 >S^?FdT&}"8[<_epy _`5&o En^/ZsNQy**MWkHcGMSSFiuYmYf0EcEՙY@Ypf_i/<82^ZtGiu 5o{r5Nu4)[NM;ҺbHϻs^IX NG['+˗7jj8.+cr enLS\S4~4cd]Y)^%'D#`r} {3bB1"Id5F)1IhU#u6+u-O!miJυ-ڙct0{q*)F$W\舝9ᓇB]nt6e  I`KBM B:x1s)1y."⻨be)t"@洅sѳ[<4Ȉ :*84ԂcLcd(g]%D;z^a5P HX:[= k-M3C8d̢B۶1,;=v6VɗO!zmy{chh .fIui i!+_VNDzL7h_ghOfn|cc??Je(R$DG@&@ &"(hv:R:RaGG JcV&AG+^Ï۽^k@̗6{6cH^<rp[7nWo_tmtk t19 d9Q;'Od0rP:3'`"V]ٿzx8e m!  | &E$b~糋:fygҨ}U1~G*l\҆89e3|lU։j&3?D823#!IȮzVy7#[ŽX銙1BP&((D5Jz ֹEWms>2N?KtHҔ|ix[?+aus`t"BN?sZCOyw^}ݻkSX6P 5]$^# W ˒,*BNZL<϶A)<ȧP^',"LgmRWy8J7_K?~W֊&ͪ=|hcB&]U=6@7~Y3_ ˠ"vz{].j;gc̈ _~c<Ű*XL/S ["sl :NJaYj 3q{c$4CW# NVhf )")V;^3eTm&m+t;-r?V?-JecǞ}N}g+Hu,`+Ċ{7?>u.7󟠃GIW_?[_{Om\ã?j'S8AQ/ bd"T M4m]1jz>8sLH-Dy[@cD\l!W$f!rFO[n b2t-nwllp-rt L6=>?|<:9K}gJ4l쪯lO=sgW`PVaUbƤ+J Q"/)=o  m$$BքT81$1\.o$t<f)1%yeʑ0$UC'63[COYb'ati|L}'K32p<%bvb%7`ĆjG2K'w(w_`g~WԨܴ6SQ8S%yD,¢LuDBgMp]}%e9Tc:#4݂QFnæN l@猞[]Nɚ*4/m';iIW\-iT ,=3sΙW_|y;'$,EȓB dͨG{Z3 83!,.(*`M!)1٢ɒ=4AE6K%9cB;?:w=rV@O/⢝9gZ/־Hv-䢮Mյ#-}1QW/YMARΎCw⣣[ ׷vDCw?zC8)fTm!3"G!MHр],l,t>jĤ9ǎLm]d~Λ7n,j: ._?A'uD a o>K>zt_ڗ{嶙@S]G& `q)H;qȔ5u*3kDifd EG,ƨ1ZTfv9yk\LU/e1TeYpVH 1szRG sHK~JJ^DH!jL.1eYtzuo"O˵vo%+/lIvqy,sc]<2o2lvY=`}lE0+`.~]1P}~{w&4}񛯼z>.Z Œj CXAy 8F-0ۙsU\.0X,FJ1zĶ!RhS3nW3Q˗/iZWb m '˿W^6|ruk U!0ϘO0=2)o#Cj #מB:SwvrsmT,ڪzaF%/ VhL &)j/Y)u  Td;8>%.j@'55=23Kj\>8RQȻuuη:!;{O,;fQW9SB2^93H9; ml5/E8.X챫N Z)ғS -}w p' 1ϷOl˓~q,$'uF g=<7/omo=sO^1Bc^@"9oGbD1Fl6Րm+S"=,UH)o²ECmW򼳷OET0dkscH)T&u;6'}ڃGFؽ~uA *[*(uFS(Ĩ(E(9f9q(jP5Eἴ6wwDS01 F5Nŋskei$Vtz~n-'I`.K@Ӕ gV%f$BC_ٖ֙E)}ݧˇ}z<+ E1\ rΉ40/+X*BH3)A@|>vE"@W.V$ U"< _z%G''`p2u5FИ F E(k1lmo]{{ [ 0TV1UuDB16Mt("I"Q:L Su5,I9BdЅ'_WKDV^U9YӉ%JKuFr։| K8j`E^|wxs$H3o-yҒ\KƑuu@2 FlYX?LH!D +t*`pJθ0aYd`!s-=mP>yZ%L{%}mǬs4Ĵ&}LI0Jr\3Z&Ls,DL=Cf,ڂ!5&\0[-W>䵷yt2./_ޏ~"%m%,KIAi6wNw{T#)(+G>ݽwoz|U ̌ȉ`ȷ!w^\цg>ҳ?ĵU9/mümm{gٿ>Q47tňerέ/llm=[齻o_WW߅ "ް$r,4=#&5WNJJw7VUS0¥w9 4eeJV#Msӆټu[CA fQAڂ%;o'YS GByUpFo1ERWS!"(c`vG9\:NbKf8/nI&)غx,j Rt|Χ([`LLd~" P#"JsY 31ZS/){H 32KD4uv&bTL&)zG،,ZL?Yz,K7j,v̋>f S=B?94ES<݂']8hb ɘKI/M0a)enBJ_wF&Ŕe$fՊ?d3IŹ(!Քj/_٘M}_|Kޭ÷'LJf s`~`Zha<2pЮ}!&r08냪)F<g]Z3O&SfRDi0 իO /Gb6Lޘ+W\ylv0&qP.K39z[߹uw/+| - 28Y>`a)@6d!*ZѤ+ٚNqcVl,LUDFj4i=u]71Ƣ\(ؑ`LB$?8KoEqT%锖bv5<SO' xz]QeXǞqBQ+kqyrY~AJ-@w=u"i!ŏ],n=>_Y8vLĉs".Rk=]c8_ Ͽ])moMP}\Ob, #ͪM*S_dK ĠO]߿2Ϳ޹uW_a5_T ;99!4kgjlM1k*'Ê=vA5^ݏoL&Na-rKV KLVf)ej۶k@!\!9NՂ#ym]GbJ.q5wx`FõjX?_hs4ѱ'0bi [wr&hZD31VTʲ(;*|ቋ(@):MstSNe:tBEAFbKLqBbJId„Nm]plՇvjy@*H(D)jycH9cĜ9]Vfvag/`=:ɶVhIJG1udybq9ΘZRi+LUG}&0T\ɟXX]`λWn̆k8P^]ܖQ^r_a*JKebL ]a^@-'!6)(]$Ȟ ̖l<|[_;w|_+|w~ݞO=MBsb8O H5ԳB UHNY=ӄ/m'.#mPo'h pN;bv#M'1DCNi<n|p<5 IDAT ׷܀CfdTm JrɋJ~[[{xΥ̓܉ mh%$_zj5df$G9F!3h( jTtMDfλĢ1pBP^$M'd24Ǽqԕܑh.Þg! c*SVF8bisZzI,Z{ 2ysa_|FMt 狄  qFVX5RB%:Z3(΁"vgJ%@Lif8]7);S}\fCTwBL=Q%]=I$BC[ I3ғs\ڇ`VXݯ,zTENUhήvfk[V;*[)v2K(dnc; !XwUYȖrAm'8rRVa43 8Іqi[𗛶EɥkѾkS ! )tüF5'@`dE˲rJüq ЈPe3R25Lg DΌ]' 8kb3e@c ҨM&hUbmcs^{ :99hD[NE{U $Dmw>k,, e w|ݽ+ROPXZ$Uɔlڶ͒AY lhZBazqL\hhffF4#"fu=h&ē,jfV541Nx:6`4Wd2~4&diEjǜ=tuhט삟S0OfJ?!ifɴDۓFOA̅+r= ջK:= m 2l{0ZN+BV 4NPNg/ % zFE' 0/">u|VSݍ>!ɞr7n кEEt[Ys.)P׵jة"T*CY9[US+96=Eo}h"Јƭ:QrŝYsRМ̢2Dh) >哨Q@"%=Ruם]+Lu]s+FYpMكVbPPb]̥YDDuӘ&vzP*n=JafGvt w[аV:҂)J;t.d֢8|l6M kRk,a* qv \035"tBYAዪД]H6<Ux?{GUzxhү}p׿`!{k[09K (đAh6m66F UI!DIQ!ADD"ڕf;ifcgiUwE1lV׍"f'lk}zkd((ES Izi%۳O]^ܺ{iEdEDuG"=3*H)`f!Yb݊Q d&53%OV&EqSԺ-"F`-_\mզE uK-|bjnI]ң D'9Ηe1,[F~@sdX}m~RM=Os͒{ڶ+NCbwSl Ő 0ͪGf̸maEu:Lɓ-B`K/g׀s j X8|ttaQ 77+?_c4U"A3a&.b<43mlEJ_ ^PEAg550S2 4甥pNDpm4~}w<mm̃Wm?|t/09^x/~Yt4F[t;. /{=kg_֥{3/< p"'v^ibN ;{"yvi_5LՒ;WX iP^lfl69rmT][,4~JӰ6ZWG5Dւq-WxfX'h}=[tC4S|Pω8:J4'dG? >z1_/ov'|X/`r"JRsyXV- Lոm q[6LI3m?,p _y<]pkg3;_ĶƢK£krevwUE:wgw$9,A{n{N%9/n6ҧ̥i:'+EÇ>|wvyz2ytp̼N!/ 7L&b,ʊꗥLDHAstRӹdC!õj<2*p8 xoX:_hszG#䄎6[7v/67߻A8ƨo+Z_DEYs4^4OJN樺0m!o, 4M*s{cDsMJq2@Ӫ}47'X_؄ZY>d+D'hퟠ-FMx/ڗH@R59v5A@PĀAt~ABsNdYQTH h0y/jbTk.h1ZY(.mhC!&FRm5QeFfVUU]׉#Vld,}Eygm%tGRB\;G֒SeIfK(Bɶ(C-Ů\b=χK]~NCAH>DZ./X<n/|D:QpW _nÓT=9yAk SD:c1u7I`dK,y&mS0 ^8 !V66*LB&dٹV~o___Q1o_{{ň6/ovt4)\BpPDңf㇈J'ޕUXlv8DB PLd2RAD)4S׿X ۾deY7.ᣇ;k#":ܹw;o|~Rտ~n?xc>*֖eak}}G XU54*'&YQ `8:Kl$LXhYEQ8)}T5i' Y]ʪ֙2fc_QM 3f:3K A~_TC?y"R8nPNq+*XD_Eɍߍe*ÚT',H$6@}|.Y_S:4ED&"3 wsqNz $S>;I i3) pz ?7ܑQ,̃S9ߓFS5CϑmIITV`cccWnu? tbgUHyoOa$z~P)ZE:*9L[,BͭWjǣxR Why]߼oGK3aG|/)h8<~TUx:9?r›;WN:>>>9~xmچt46F.>|,Nې- :Y͕(׈,L s.fO2NRQ811ȋzIkD4 D,Z!PQ)UcҘ{ӭEYt0 lbȂ5`122j?9V' :/-Xƽ[SNIO7h2ѩ)[*]`F[Y7 ƹa%_^O/>i`9|)u;_.ř“lq%muK9虢 G6Q+o~xZ,(hTkI~v! 4Oykln_?f X+9n8|/VȣAV `Bl~fu,ޠdR@/E+8l5d2''߿^o_/WC?qz1ۛΎ|X䕍Quٳ+|"jt, ACsPMd$QbF2򥔷W8 !J> !dRmZD+WteZ @dDu]ybdHM]qTLf`gix#LX)6ϵ B VmM%:hd%&HQC Μ2qj4lF9qyD){){3Db;C h$K~XKjF|e=1(*de.9/O{Z /uܛ]E>u;(=`GN~o鄷=n~%]G.;? 0|.fjOSS0 PϜH԰7ڼvTbдmqP ֘sv]4, 3ea,%Jп[gF鶝>~IٶSsα٠Xf5q LD(ڶ-5Se&Ǣ2Lҹ-jt 9aKoKL\eY:( f\i{X[ @(#$YFnԩS>㐰eD"i%cLwͯkK \FDI@fus]ih7 Lz0bv&ePڕ0(c76vMoZ@0b#h`$hNשKx@FӨM=pmR"Gqdd?ԟHB0BhWM&`:Uqda'>hHն^9tx-q7x6"N^n'^[q @"sH PX>G='CƎNa6 1XHs`-:d0*"J1bN1 V!aLT;"D$ǎ<!u1US &|dTV`bXtέ hw$*#^}mo?9rZ0.;ohtރ9>u.-/-'6PϬ,Y2ܙe8<cR#-m!` Nfk?Ld+6.h !J aAV< 0bjf}`jwuS Fn?I" 'EF!$=k3[ 1Jj2F̩T`ŀ<Rm'6PhFB)R,R/ֹ xbhA9&kDCBRBvY*3K-!#:BVgD  +`Rn#1VU:yK@#@TUD# FP@ l5 N1 &W-ʅN P%iNi,&6#lBzAq+-7|70.UAIX1 O)mHd4!Ҽ} X쏫DCM\V55=}t S]00g~`8b@jj"()HS( Q<â\yʸ<Zٝ;wʲ@$3rx 7kaκ? z dԙזVc~<W `0ٽݽ`T˯K>;szy!2ޙLoox>Ź_xKx]=X0ED+N=}K330Pj\nsy}Q~J!ѧHM ̬"SQ91+v-dUPCMB0S|B0{\3s+WVq)!DkإD[[ Ko~" IrBW^?On\J3,{6q}p;oݿ~7h$"U(vD NK(8ȝ$ebݝ(dI\icOtiTaac~].o/w\xU~`ow~qqaRe¤ 1abEh`!`ya6N`NʲS6bR MCB#)`ANq)(8Z)(XmYYd)8IA.kjƈ7!F$&jlF߼^F!$Kflf"M'M$GHi Irxb-I>hLIM&K= Ly";NLMT!hoӱMr'%L70 Q SJ`[XaO5Z? 4y1}E0e& 3_ˀۻ7ߝb7VB`j`*RxT6tWx8(C3rѐ|¤j<8FF,w.˲,N1@ ®(I`XU*U_=$޺w1EED,A=$Dzp}H&*SpZc)sytu {Fs8'm\x. 5-פWVN|6*!DU DypMGJBj6.I(^dX㾪VR=M`i]1;vg#vss+ՠDwy;֝==@# >}f8έ[EB(PTA*E a,P J&K # K"rڸuYB&0 OM=f]ҤZ6Wc4bS5uy5TAPREhhɺ(Cj=Rkg.qWxnd=`uel\TՐ̐껨$ F T5E3={  ЏcvFehlTӐ۴M  u*Nz[77 QrlhFszl6ae=ftqĕD 2@ jh.=q2lzMOkBA-1@8v $*1h(R+6H}YVU%Q\*:|~4ij9ԛ5DDBjn'FfAAUl(j@(*B4T3n0cf*<`BB 17i nMh0-#hT!ԦS`%f5ɧW`* i׊/ 0(=1Mg>v`gw49+KSƀ"kO͈('8gFGLwɉjF =`Gyi3?Sk+&?GOkT 'CBK%E e9*Je̱Ffy׻u֫[o7{{{{wۙ A½w[G}Nkfg;[ݫWv|X4bh.,0nQ ~jc EQ*w~7 Fqr[͛ XOk,kSTLDVg]`x sKkO 3U1`3 oCX"[\`;yNN;Na&BR*E5uLb *VHgQf0^d'7 NdfS*I@1 c-S_xYC)Ͼ?{H\g|S}HHUc% !FU1 %}qmmg{fl}i2pC@;}ͥ/Ů>rƝN5(` i< <{liii}}ckg[Lr0l)2^DyX4QYh0vl?7)Ơ;׮:aiwʍ |ןY%cVȮq;;[9{N>V}~QI )1e(bdf]*"By׎:Dy"ZHqfV $tL[AI˔倚ۙH,kH ^3!#Պ4 omz,I5sj`CFGze&Ok̘d;LNcix%n}{}vnz)`S_LǬtS턠_MR1rDj酝pv&1q2pUIּQOaSN "Sjcdg3? +V)Z{?6"J*V U D  `& "<㯼ʭ[I1n}{Goܹs{ ݵՕdrڍS?pf[/]/ɩ=:L:KL$F g.@: Ne+ s7o?O޵kW]ʢ, BpoӱCDkȖ͌K-9HzY?u&v;vxqyݷ^+ntW疲N;z 7u|_]Zܼo{3 -ӭ6ND.:{fnf Ѩh'o2v.Xz(zVSj$(T[cJ6&Y$hqlTG%iTT,ojHDjH;g)w2 Ę3չ,H,K)+WM>!iأvF1Y).Y1rdΒT j\oA]e(:#G6Μ?8C2[7W"TŹ gώ]^~ڭ:}ԹseUY--.x|ouqT߾s7\Z8{vi|bg8ěΝ?szƍGN>}[oMcfZtIfz7urO^1ƨ55H !Y,郵fh)%e$2#US !L+PdZ !"YKIhCD̈ҟQ1:攷%24y\ M`E=1H! * \G hP]E?<!̓4Q攉15gLfkFVRyR.]-EK~231ɘQj[[c )f3N3TÍtk}4 d;֠trlfxHDRW 6BF`@ jFSk`3կ~OsX &;S;<쐨*Bj&iUXXX̰ww{g3 IDATspt:p;}Sy_~xᕏ={ޙgu]v纽~w`FmO[;z}ks \~jaayʣNK™~'/^Xg|S"~Q E rjwm1bIX )iLv\YhFhV#FfO( >db+;fNIjeED S]d.[8ʤƊ QN5!]B" -LY<#_z4Zs il|sYR9SbvOAmv-i"|zmmqiL#Z%`=DVUH, D avT[[kkk+++{{h{0Πtswn݋MQg3`R;WzZjNgyuuuy*ä<{tnqѧdv wz(p7Q4;V?e.rHNWC@3h$YuL"۷^~`SWO=sWN,={"_ϟ/Ϝ;uc9-^qhA* q3yw{se 1DdqY\ggT4gS ]N4='LTEBPJ51LDDDvZs]#EQ 8X9-0]wy3"HCgnX-ʐW0s#FL@c.%tAN 1iRc bZS+ydR #&=)a?PDMԢh:)f՚[y0kx3oMZUO$M @ L9}3$L7FJ0C81!;&)bd\qQbj $lj]A:#y=#H$NjfF.j{]e0K>Yu3QCT՚VSFPz7Qj (˜ᨌ14uBDl`TihW]ǣ`B S&E9v{챍+WCc,`4_rn&b1̡qFNq1*#iPf8Nlm"TePu|2Bl:uoxa7}"wN-I;g*t{}Nn?a(Ft#4P'ío/}G]60D"޹w|/Cux߽g{/<"MIcw* E LSa2޿}Zk߾qǟzP V&j4)@ #xDi6PQUa5C`DvE5%M↍?DX1hJhJI]Ԅ s Hir3v97v%=1XՈ9'*K)9`Etu˴$\d5! Xf)Z0 fb)2"]_XBccE5!)QZDa<)U50aTca' czfl Fb(JH FTy&H , h4`fo@31gdB`IGE@ Zm7{\*m1cTJN2I1V5;베իgB0< ZĶ暨AJ[0lv')ȓ?/%pI= D$2A}dsMV0TDTK<;<bOE_Z9hR_HT,\gnn.gf Y[ߺ`x_ӿ~_DsRʡ?'ʙѕ*Cer$ eE%hwwgoo0dْjpPl^`[wܾko]zʍ+W.9q:ƈABYUUY/8s.3rY&mE3gh{`4w/wswx~PyW? X8}_U #v.&%9nN~s[w?{ 1u;U'ИIJG 8:ɉz:R :() PB*L@6QB c3՘]C$1Cr)wH#cSj!Y͛#r$ÕO"-aCcb09vUeEtd!e42004TպơB$;2k<L- ET$XIA9i6dQA9n䡗u55*iM*j*6bȦ6XnhQBtH{e5aYTS?D-}qᏧEJ bna:;VߔP1 5% %S${{Bo`}n@ Pz=UU5BtEY@L4˗yxumm~~~O|'|*xbc0%I4X (D=SUaB (˫;E9 e%1t x^(&fpK!J?WL7nҭ@,ǥ,(Ͳή @"_aTXr}32zAcw{Ɵ<f ك?Is:tzxYR& +z孽փwz*hBDAAq޾z2z7nx_{{x/<}έ~ψ~-R,NFRgm 2O` 5R2MuF 45cRKV+hT3O@\@" E%H%> 9\fM[koxC_37 (a̜wr ApFi\5H _s5z[/:1,%j6%>]Կ)'XY?a4]"t5&i ѻAg_AL` ˅b66pH3>S P͡L-`( dIy6Ej]Su|F1dBҩߠ 1s)tpgUMi^FUHAԈU{/{4E#ίܾ֕+.:y⋏os$)җ5f׺>:ݾVckkׯ> CRD2$_7룃$LYBk=};|ݷ|.^z[i5&ByU 2&eCd0%F2565Z:v ؙJs9Nh3:صd7(hE縊f䡦E! xBd'Tk> 0T*GZO!TUUeRrWIA3(ctbuE(3e6YĄ,7`j2*"@E$!TEU(ܪ)Zĺսo論.&3vL\A U7%f)]{BID ]G+b]NPD[ ԌSa*2P1DbHNiikIV`u鴞D&(X-i6띫wGOU_ @P@N&oL|/>f~ȥGzOO__~~oاG?Pg? ,ff1t!/}|'|?[e+JQ<_^Z;QǁI%D4 D@\~j5; dtΗe`8sn@weQ33d{Q`<p`wބ q;Q`&5Se1β;7,#Ǯߥj-,L윴|_%KW\~@]`VA...{QTrog?oOOMƃ7oaukۺDPTS~o}m<7`z=zf&^]Z~'.}셨{bwZr۳Z0*f@a=NI33Aܤw\+!)+֍}d=h;Ϟ9RVDCٹΡ`D"SZ1Y#i ]S`&1!0N=(ȡ1(Q j1tkN}ޓZc Sf/uБK'%F r+[71 WgD05m.@>Q1 01ϐI RV_?X `0Do!p-"@xD(uFyѬi2H u̸d]hX n2''o\_k1Yв,ꗯ*Kړ?own [_`C`Ud|N2}>奥'|n޼O''o#HqpqcôSh+L"HwN;qh⹳{ݭuͲrT"y,Ve99fN7f@DY}˕Q1N`d1JYEU,/4E*v}n8rP}ͽhii ѪX\/G+ H5/Vy'TVgŹDg {<_r~>?/;y4 :O}򕕅?xw?KΩdOtfٳvwB鈫f*:I=Z/6 ±gt5D1Ar L՘ 12"y1AD U*<3)G:Uc`68-K_UEUKO~ִY{Ea%$_u;f>3<30}[$Oa(`juMT}9 !U~&=9)1S}C|L2'tHM1m7_"83O;{~[;{#Z =/^zgy+W;ssk/p»;Kyҧ~4~_{~^/߹u{4F\՝;OWWW~G~GWor2ܔ m KD-LE^ッRpiaA&ۂ%a<&]e Ae! #f1@O}8󫄲D&8U%eCqT=KZ\XF2ǎϘhR8Gb TF {|on8nlUY%jwNW&1u}_8{ ɒL#ޝg]}3s$0x$\$V-ĕlw+Id#d+QFI?$ӮZ++FHEf蹧ﮮ̪<ee=3ܘ/]y&7>tչx@ܹ3Z~?sZmk׮lo8x⌵v2FCXWZW|'5iAT@F_F=]钤4"dv P)pikC l_3_ |FJAzR:v  }U#sN)-Z{z3sUU*"f ~D\5VD*Bexrh p[G8^ˮS#NA4KDBVJ+kĈd(먔Xei0°,%gN28H<'( d<rs H,ČN*N'0-gFշ:ͦ-f{ƛ6@9K(_/._&Bq=~g~B+!Z)#|z͍VΟhk{pՕrU Ž x5ٟ3$PCkv03o7lZ.2'R}Br(B_-D0@]032WH }r ")&bh*9 Jsګ9\~2y=or9Nd"3JDr-7r:uVc_v(}+Հ);YԨFc|oRPHX7ݲ $6(W_),R#OW]a9?*Yƹ4@"=۷9J(N*g$kŃ++D\\,E;@9//];_}ɤ+~n5%$sلݟ+T5B߇<φA)t,u7.ه=DZ MB ~j7;aak1ƛr}·1&F;ͅA, vXƒa!=8 l]ޏ`3y> ?to?>z!Gkw8 4ya; @ S @JԉI)¨%:RՕ n]>w|evo"juuV־(Og>_wկ=wfqV6/95Ik9POMP~_(,BU18k=!U)EJ Ǡ޸^EU׋wߤP=L{c&V8&D`x^#ٝsLH~?'Q2 `JA`NsS@xo}ԊBZ IDAT]Z[;A޻W`z P, _}g?߽)l$eƋ/?s?dw[b< GtXȂ !@hT=fXJX9(f{M+k'D(2а3kKDAK;UUi'eL! 0j ,= &A1 i/ UNSO="Io?N.^zg>g{9w,mN0%nYZH0 X᠀i[í~'mʚmcF@!#J3,), Dx~u\ p/--Gf;$d6Qk 2#VUe ;D)b2 o ]z$0jftuEQTƘ䝻wϟ?oyQ` dƕeΊjjA.=_̦n{{ζD T@k']W~'Jnp0ihklȸT '%fZ$!DcO{Z jsH 3 !2So D ,"StҾD{`NVLшs:WU=)Qs(DbA"v̾K4=k(S+%붑{=!4ϝgQ>,X3f:|756Fw8/mǯ2}!=l(m2XCF|Bht2s]N< bӴ~k9l0$ ֓|f.^X8Ze2rQFpeaVIa EQdhEqDwg(p9 8qk8s@,lZ0IZQƤT>sMDi ar<Z[#7Vi2HZqjwW4ܺwvv{_yʫp1qTSy  F\>EminF%-F) N7 ((,ȋ0{=!a TCEAaUG>ؓCc$Y@њQ}ЀG ˛:oE] ',c`7CIy`}X|``d4v`na#/׶O!r7Á >lD瘈jM.5TFMGt\}~>WOk b~12O[/mj@#V>;OB7 Q~ob YʢDk4a;Lvʓ(߼}7i73PITbX s;.p6vn?[?ҙvYGzq7@( Nsl, v 0sW/\N0N&tPO6H90*McBfO\ ,2A;ټ%auӉa0 ʡk16ʢ<W{NQ;A a$QƸ8I!ii 8olrs`Lqb]y"]Յ ---W NT%ܸRrF3 (p"l*@)JЁ$*0l˪p++HQ @o"Z-|-pٳ^8C)IʒbqG-0-XI(DRf{!19$I z6 C-R1x^M2\^xXjD4"w=H,jPp Rh!"DUTr45yMNbns^)nRz:Sa'S rd[:K,s"̑bDg$^5̋>;:WL͙AT;rASNT[Y|hAdpJqUe! b#@ /VjM"A@ :@T*hn5L~A.U`Q! HJ)0W2Uhd1|;0a?(/8 bj6${Gyc{J3! D)H!&|c-xWAXSU1+/ǞbB#v_\RӟܧӥR &(ti;~߬"Kd'O/ctR?t>ϟآ4scK˪9Be9zH/[ۺzU*MZcS"FFr Gu4M#r ʩvVadW3릷F5ulûRR- 1ƣYQMjƖBu:]_Pnw)T: 4!A4cn%H1[o+U34i-㨿d" )޻yuOqy RR: ]cc 9F-HI:Q@} YY i,RqowkvNeNdkqo㍬~ډޙV:\NVUFb"JvWk6.i㬔RA&ZCd Y {?] Cf)Y L>K"TbTkbk]h2gDd`E(M%"\?/~3{·?MM+_>r:Dsk>M!K"Ήcz}<zm@}=^߸&2ɷ/]7s>uT?ES eliu~3' Ui0Ne0vO`Ɲ;{mJǗ޽5?,K Ja;&@xaN W:<<[ B =* #csff ГHQEEQXDc Hmv67[Ry^r(0W% ^[V#'O^Z^ImРvD*˲,.?eރr t-JCSqi\'qKhw:ٞ#:q48:Zd!-]Ea( C BZ1z3cdm, f[7o֍ϯ. V;eYvJu*@6L+ (^IA՛б (H}jL~tTl.8~j#2`shZ ֓ge1R߯t`u'P[1ߑ|x oqC8Ej|,o9՜/JN$ަ+ۿm߶xQWM߷H4h9wPwZ% .z^v\PI@K 2PӒ55pr?8s|?GNjQА\!MBk\/~;Ŀҟ /o~߻q>7|ɵ^8<'Ye{SТ?I6YfeYK_z3ׯje,ke'~mO?}凗τsyūԎo޺ẓ|'^_lo=/F*8vM0XgH'$)˲g,RDkE\YޑR.U׷d*G!=05V `{.?~*(`B̋2$MZ$`JDd-J_\n qvuc ZY1B*cYsֶluZ&2NQ)[AQhG蜅Μ>u°ɋp;yփfoi(ԉ/)ҲpA;ϖu<0hEr M/سc CjѫвO-C@s>p,Ɗus7S +L ֐"G(sN$A^ @s.idG<ĩuYws`! Zpn+t.(BGȍ|M&A0Iq5N^W?3ަ;v ..C(B#"iCYkhc(X^TU}F@Z~g+*{% ;"]8u0EHlyߚ>vt?w/$`7'o.,!9x:p5{8v[șg_ܕV6q/|ݾwꪈ-Н+/|񕕵t ݻ4={\sqI1S13khZ7;G?gʉ>^r€X~Ǯe/UVZ,fYJV[㬙êa+fEKY"iiһ[;+*Fxh jwKg2UUQ ګy^\8qfPAe b)5EZ<)@$|< $H QT*8 jTDajs0`%HgN:1f:*l_YESjV}_Kݥ'>pW/_xG=v:a eUc " +։ l<55d[\|"b Q1P 4Ljuѣ\x1L|Gl'x3]S)|WK\t"بb- ٰs`,|ۆfC.`gl u{\DΞ:=3Hpϒ7Y'?iVtS Uw ~׮czg[ĹqUݸq#p$Y+-v^|qccޯe kkkϜsU6M6Gmnm](˛7o+c?|嗀]*j*s+Vz ;QܝNg1E>ˋ, C8tU3zwm-f9$a l:s֙ øqiιVUU @E珟81-ˢ$ҡ'fɲ򱓣XZqUUB$Meivsyv,/ =q~@t, 8&cf,Iv-FA-3v6ׯ*ꈜ+_8VZ_zEgߌ^w+W.߽{mNv[k8LٹO2g/Უ4] I-F>|Gpppnj0i1 ;FD. ' _AejeϽQa@š6pKh|1)AzuYW BxBeE 9|5QkUziPMUoq\CD4"KqaaԘvK.0ЁRb!Q,/=Y,ΞpդKp,: ~|鬕Lˆa>/Gw}Ϟ45Sڮ 4)Ⅻ?|e2߼u`j#x:߸%fk0Ԋo |VNkn߾O??#@7u; yȡVinlmKǏ|w$⺰~̙sUU&I$HxC1ZTeYfit,] 4V[*J;mYvv7f.A1 *SM* lY KYe}6DQza'uPHjSE{ֵ7^+iFiOtvE4:qhc=ޝh-Q--o و1V'MZݼԅOLwHst[,7_-ݫWE^fYA9N?I:Vu9n 6ApHXw8k$ȏع^\Uj?'WeOTl45f! P5[o:<PFHf,lM eA;n'#bN)߁ȓXPy/D+auv&'6+8)A >\r+qܴ, ׮3ׇ5`q2RP*)Bn0y\:(P71ZS)P<af[91#uc ;㈑}[dχ&Rrͩy׎ff@RBQ$^!`$FUeRTx@30\}+嚮i)X5bdYiHD{vV}̶Ai'l 37|fS oG^+WL4_5Tn)[j5'O]z}[UdAtyٴ̽.ʰ]]gYxwŋ:wkVw+1aZVA;-%%P:(aDeY"43( n\증mۺ@(T% 1nZKnr:ܤc+-3 UTլ7o\ 80 dwZ@_ \;DZ5MڬP@V4Uoi anma\ HH: 6B+*Pyl?!E>o|ދ$V9z@kCӀkZ7 f-@@ i|I_Ƕ;[ĻDݯ* ;Ca+EXjqX8}X;;_3=2c{`s S/@MR,Φ&wE|5C(JTbuzE}!,;_|jl8W2DT Y [@"E>40)8X~Y9"*qBV3'Ω kν`Z7ݹűr4vn Yu<Xaej W@e\1寿/|͛jN?vt~.99yLRYi< \|~{v|\MֺrU\l\䠕X)A y t7΍77+ H=zdF67Adww0Kv6[#v1L|tPzK]|ZCGuʈڝLwFpYVoooY5Rn>%"b鵔D&q*P9GDI+YY LDbȝ4QP'Y H9Ἠhk|2k'E&o1ANo]? # V:4M-W)\ѷ+k q9q {dV޸qkg<()G3qvn:u̚(,0Le>+Sd ¸#ƽʋ|pɹw>ĥv7oooGQ}ȓge(jkskyy3w_J[W8WUa;NHΆq JAYZV|駟x/\vK/O66ͷ_7on߾{ͻ8ϝE[}a"MЙ4IYg/Eq D;|58DPw~/ʪB^'"A "3/fi[DHؖU@0HԺrT3\zILDgKյ4p.}tƂtZրn $"㜩 tʪa,"N!GUU7ozvۻ{FA/o|'C+DDKÀƦa2:WZ똽@- pM 2 ; 9;AkhN C$]!_E5f|=Y =\;JYkpAm68"% ;}p4-u 0$DdvRJ">̦?᩵C Z6"2J#&i<榗34IEѣGέ; @@V#*믊Cu ZHNM: v 9CgTL`c,ziiۗ|W PG, ϋ,,9:4Fijeɶ @Lnt0ؚmU-K O|/S}ʕ Шb8҇}׎{gΝH?[Ub:ucmӌ@Hcric'.=vG{M/h%)7onF*`K/m?@z\Hq>OwvvSI 7qB%UYRTq%[vU AS@ A+@ck (+E4kd6-²w.;ޝsv'Tj)g8qU+7A' vD@5]z>+/8@L>RYitq1F3F ZS_[C}&"@<7/l{G+hk\)ippX}pa-Q25]aO+/zNp m0ct#34M¶9FC@W,X8 spe'\o!Dv G=.t}aE5PV.}55!$眗UDT&iE!N8S?OoZ8C9xf_U$(H 6߸yrO@^zck}C)":$DF Pk=,a`:wݛ&w!ƃqpY"&N-jPPV.c'׎/\9}͍=$cg}O,{{qݪ,LeIjgy>r!Gsb*j2dYf2Z8I0\YW@,-(P9 ,tATr4Ð[_lueYx6N' ôݭmZXʪǻi1t܎ׯv-B9sLz]\P ,Ɛ˜w`cou$Ru@h"4-܉{Cw8X,Xo><>9!+drRCGa&LQPw B[do֪^aE$5;~%^~d2.菼'׿W #7 9 =P{"HĮRlfU+u~dsMZ=I5q$iJUUNgV᠜f2n p|uEH<7aWO|8dA00Dzˑ!'t$p-uLfܾu''.^8w [4 @P`cckccg{ͫW*R{I$ֺr榮* ⺓)(ŢޯO<vWY+sfY`E嬵 T(5"vY>X$;N+ 1/QJ1EYEa2%Apjhc$V+?3ژNW߶Ƭ_Β7^9ڙ,fSv3 EżZDVe%I&qWSgK/w:VuرCޣv2Z).wBd"r6Ȟ^ $i1$15kxA}uaF`{V,0 qvgV▢(LnmkݥcY#:Aɲn^\J_wګ߸H[[G}VM5z[^=s̉_6.>v3>y]z`ovnB۔(:$ W1(?rpQG~ívo}}5=vQxW6!J0:%q2p{lQHK>;U,nu)q^ɑ @6 @HlhSg0R´Z"Q/];detX1xm`6Eƒb uFtaiGK޹ss2.R؍{(MM&͛;FIaBeAvhE$vz>(DMܽn4v>3T_G:{HJ+RuF6O|Q .d[O$k ]j:/loXW3oǽ_ !8GXo:"@X 4Hμp/%%iwa Hf^M@8rqX[; }T@"H@ m:֮', u+&{J,`C87 108nj"wNP>b@_:XD)E5,D-6jdVDb`b hU squ? ||i2 T_uQSz!D2pK'.LF|`F;;Yv:Q_EQNlUtzv'Wa=rΝ{i|0 g YW+ʍ;ׯq 'N[]nݺOC'}òC`p>4߾`;gԙNu=fX[<ر+/^{e-8ƉNjic˝^Ey^ܹw;F@pɽ{P(  AHZU50 @k 脒.O<`4M~O3vbx:M& #Cu4$I@0"tHIC(Xl*"JӔqQiAAPEҳh')Tj:;s/ҴkaE$M ޿ƛߺ 6hu#J)TaŠulJk(Jc'OFijWuq-iґX ggww*kk skfO{9 ؠG?wWr4bpw ^ t~h6R! f_2wQ`iZ hzRO|͛7al: C/\;ve_3-zJD @`g[Zr[+_X^];y…;aWז$//'G;ZG.N6ܹ=_/ ۫x(oW>hí;_X;.<,q\,k'zv~Y>ә)O:2:. 4mmomm޹3 ]yta)E`@A5%i6YU5hIMwWHi-2]Zz^RC:ćeN'(H)jhLqkYWj`JwF7k,9="vrںnhhVRq8Cq=$=phI@zуL&d2HQP#Ā @/%*3+w?KD!νy䱶[w9k*}#(H`fUWUY)4uڭc9wOOn&$k^b\6~{d2nFBzLzv`E*/F?wOi |ciI˒txE$4Ozbii3[ Khv^:(YZEΒ 7 ŧ aC+K/:!PPo9W!cꜱ"W7\UsMx2Y^y+XW|+)2F+ B5ĐF Ϋ wg 7y v P,,  _MNP7ݪ/D@-^h/2v7:OE Ga*޳\fHݻs<3YqՊ^I>u]OkGCBZNFd2w~UQtEce&A=2F++H?0Ig|ŃBH<Uw;3DZ D9-/OSs,qlL0+ְq`"6g^P)zEAi}'94b3{,=+ a?8Eǧ,K;+N.moK|^xv}"k/b=AIMnl\~>}s&\S>[e*P-rZz;Kcd4(NҢ.&փC 0T Wn[,ݸvw<|zGގprR"Ohrrr];|ʕ+kk$t:HQCY*cb`q΅6VYbQXw: 3彷QKrJv5x(LeYG>m=RHm+}&-!D"={%\Kx҅o4XdJ`D$;}]U S,X4R,vKԌ-0h!.1A7,ƍqGRAօ)\&J)ޖH!ak -f]HʈIo_z'ޚPJY:붮ng3D(qȅͭ͝4N9ܾ٧8`M!EHSb"X{>';<nm$h PŔxE"`Q"-y*Yq@ {p8 _(@m\N[܅ o+(:T7ߺ?|vdqEƓ+xq"ݗ_~O>ä>9="􆍢Tyn[!b 6>:[u]1[g]#V""*k]UU *ŗ/(RJk&qeVx`hqӶ2cm=SuyLD"Rx?͜,'m 3{Yo߾[Y!*XsCc~oLH@"#3 jK$"\RE J-:2О%0 )P]-  IPΚ+ҹ'p xn@eyB̖ )ȡxr#3؊w"$siX/LD! P\` ܦS4Pv%Ҥz4Yo381e`yD Mk B<+ba}X_zopVD ց$B#` @AiV՘I!x/( H= 0h5ȡ`L8X;H7o\R{byR NB92By+ViV b9xk;^qര(F)Q,@ri Ͼ>?}xI2[Oй0 &YY!" T&4:9O2t8'  $ݶxLaq{E{,Do5?Aq2\^{{ X>k<:~gkm|{/U7 ׯ^tE;.,nfUU" nxZ|Q)yx2,*I“*,KMgƢ!bw;NKSe"-˲~Wߛsp8LrVӵ$IY1H'ރ=2vϤV&YݻW]c@J`4BN $~iK84covڴ2^H8&+O ׮}!h=ϙv2/2DφHSJkF`0ZVVzlgb% @*;id%2B:`KUe]żjg`fʳ58{C IDATA ֹZo2H7ˁX@ը=iJ|E =7TnEJk: HI3 3~+ I}gBks繲:<e_;+"ɔY1 jxV=\B%qżm]MV!o;7'lw 6hp@^ph<=1Pnga]Up +U'ݻ0g֕صo? m^yc?3i1 imc ̋Aos(dѱژHiIYZuUUUQeYj<':y;4IPŮ~2wm tRg2GoVLJ3;-ZEq||B.:ݞ1jc<1@դA5E' "Z߿n/l] ]W*rLEMxE:y,Y4]DD_Tc^ |AEΚH)BD/LHJ4"cLOTe.h4>:>"D+AiC%2b9jmtzEE?" BgDud0I-3' @/믿vONNiJ)XkM}w&"k&!a,,Ǔ Y_s`DH""HUY(߻~eɭ5$q-8*犨w]YNۻ{I]+ 0X__{h(0ֺݮ'{ u,c[|dʣ!Dm,ݼr~W>dtOn?=nj!`b@My0 <"Wf&,*8F#w+wֵ ڊK>bPQ,˲,C׎~0J)/n9ӋUDjP+ P+s 0L&޻4*_|vJ$$J5txt G&qeh$AcdZV,3{y/a@hHP`' lskϰ_{i(iZ0y!RY;+ e" 5(`mygڕejD@*`BUQ#TBPdkCrY~# L$4(z+*"ݱTe=g+o3qyϡSˀN@ieqCQ[q^HPJ˲kx2%AW wdߐ$':D\eV+ISv RJ8q 9cD,Rk% 0XkvF0YȭT0;=i@w^x/GL7v6 qۿ['K/ܗ>۷?L]ջi gvq"X`~ `*qu󡏻EQǣiybtok,"g*K2"9$IZY+c+묯˚(G&䖝]e!$03 =ϫV5 nzU鸵s$\:h>6: _: uNDTiGR6/O"X .rV -+XXB_2)\@E6,H?әB0"#Q5eq)\7s3ɒ%M5 & J"O{ǜsֽ4\e^$i("bz4&nE-oye"D$qtIEQUU;UY"bd"dRN =.`(MPZ Jh8%HV"p>toWHqgo<5gK> {;$(" od:-{rֵ1 'pxz:kk7iYƇQܼy߿wOvQȯ0y 3Y|$3ކV*Ml;~ҏ~ݏ~C"1 ^~/n}rZyE󣃐uSwswO~2`[~:)/}WO=zݿ `h(ZJ[R` SqU*NNm|}cVu期L&P,tڳWJiYdVRJS(RuYUEd&ȵ&keZk@iʲlpz"b|9Ϻ',IJӎޣD) 2dߊt4^eyy,EЬW{{qrA㼞3z@ceS axvυk*"Fkg}U" ֎y<ٺܼL3f? <״/??XШZE _$4ф{Z'/9e?[C՜WBp5`:>?jEEQyn"Xo0"c t>,C*x"D FAPݛRarhTW@!q I7nxvH75'R"຦#Ǿ ^=1HڤJP%n?z`AuR,ش K>MS[YGFJN  BP&I-llHz1dE$#]9sD$auAW;&`4\6Z׾/?9yίn^lxQF$w^<Wr+GUҋ/ڝO{*6~i.Whu6o˯*N. DAള,D9ON+dxnqi;*꺶l<'^{4u( N$AǾ)1U]J"=;@A@˕1٤]O[K$"EQ`2Y(evN à v> $l] 뺶ⴠpuE1 AaV @@ Z ( `i HΚ`-+e(O9nfńd,xwrjqQܯrX:xso,J&hB^{tm:ml{؋ .Y+B@@LDJ+TDJAsKY8!!V\⇚HR1+?V̪*?_ŮFaE"mgr.+*7(!F5vފ"xflD ~5ND{BJ( z`lbc"D| z"5s!9  NEyf1< ehks3[ϐ&`'G'"mY#ɳL {Av =։SeHTE%`xTʋ1KWJYWq5|bPj6z:Ng+iv-BBo*ϗ_ Ɩi=zp~!Mݿ:]9@zA?)n\&b:@9W];.fw.< \**2N|;I[?zӡ=Mvd@_޺t7{ݵ~7I x2V'q(2Zx\Pg(ʲbIFҤ$1'<81Ϙ&2@l6+( 2-\iILGvhMA*yE9DAPh"џsu b53[b=iԨ^[#``>E3h9l!r#P9R)D$sXVᙙTCr:_Wu]וVYY~%0j@H @U:^-ܷe"BTxf(J(*6Ir0C1̎'GV bB)H)J- /q1*MST#F`Ե 8B\+ؒb3VM!" ieHBCLjEilizkk//)"E{{{XUUNAK(%eUyKҹ|u/xRVژMEw^U=>yEqlr{@ti' 4IzU Q;ֵֺykgoڻkתW^bC@N#u o+W^Ϳ{ V1N$,+3!w~~g8&ڟɷ2F|ᚎZW}TcwƍNҞT W~w?8؅D`һ} n Ie8l\~񝯾s`w$am/Hyt:q%@`{^zf-:1:^i۝|6Koi,%I(nHY̆'IwNϲPX^ <ښҮ"GgO暀*>Lַ~꯭%quUx2"HxfC`!A>ZpB /)x$Nؿ.M-\.HhZ\_s̢Zyh|4\A{fϔ rt<٦-SZF&)(44C6J렎3sዳ\ 7 *{PA֓WmX)( }ZK!Tŕ6=buFDrvU#`DЂ KXaw\|ʛoiz2BG㒲p;HcOg3P<d2j6/8m%qŭYYj%qE_[l]֕RdJQFʍ't+/ڱPn`0 Țh<=iO|G???+\Yz@̞(Y1B ]:kyo})t<(,C@$BH;{/׾jE ,{Tzl,:JhΕWxc>VQ#¦O~'VZU*˵D?lv:lYEV[tRXY7Qx>_@ZyVUU]U iJd2?<<Nt4SHD B@X%DB IDAT$ۨQd1l_~_s0|6y~ճM v&!mR@:IV`(-;؃m;.soO9ۿAFp ?"-4FUӽ0yxko?_^OG{~=F(/^{7+V{Ou;>m3FʒRe5n]BTxY DnkTosM4M"0x|z[-g>}t#l(ON嶔V#<PJ$58p֏Ien{ܗT++*ZExraUN[iڹTEbIE\ӁdۏzѭVF٬ yJf (b (R&ֶ)Yr0ƭ6}jj8:8Itޔʳf$Gݍ^!kkUVUuw<8Brs"g˞-B.=O{]yiJ[ghG~K;ίo}?SQY[.FN=}to_;o_Y+_zկ~k__UQW/M ?:<>޽{h(+,2kaQstTeUW_7Z1pfvٶ0'A|+޺tdFV_[UUo>A!h/!ԫ糺y;oeYߘlRf`t![0B{}ś1y;s@s[fo"cl8Ng7| ٺw^QSH}]XV\ԲRFHm1s˺ ` (lyQxG~Pje6z88zevޞr^/8)*͢+ҊAA5@kcOu,-% X.+<x(Z 9眵YVLx$*ZE8(JrAIY1zQF_ P)$plpM# hUP`3!Go lGtJѬU)l Qdv&[7(2.>o{ΥI"k;3HfEn&ʱx@j7O@MȨ.@iēgoYɃBD֑xAD,`è @$JMoܸv>6EUwTY7wNEuP{^3'B8;9}Fx2Ywn}} ê,kW5s6e'$Qd'֭.ᠲnr: x_{-2@p4ն+Wђe?OڛH]wb^[WWdhDclð1 c`` cCcDQEJJ&6{^k[ËȬnR-PȈx{͟?/b1y;Vrw^_~"*{_ƽF'_K{z\z=ڪiV9x\~Ye\* Na o|j|xxn|=}뫿P5F!ͺ[(pW =`ׁ$5goO \ET ,ۺGdASEQJ&)EU" ú,8MS=VZ u7%0'[7ya6_<<;b*L&٢(Ha%|;i6==;}xrw~~ф r`o~K5xoJ)VD!4"У6 9wB؞Waf`Ϭ)|?ATCF<1yC \Yږ˪E4"'/[vv`&ǫ,{`{v Mݭk# >)h{[u3&1 Z ۇ):0F鰰h*B`RI#@&$텗B!JJ%%rCEu F$-/[0xSwnÞ<@>ٸjz;mE\,sOtmvPȦP> ʏҭE * ,n{砱 ,X'00@ˀF*Ia-W6lɚIIB(*pέtFV\y]VXhWh4N٬*ӉG"ժPJ@U5*0(aLc,|d"߂e܋T=wwvAfVY N 0[O`o`re*˺nD7~G?F.!I)sU֕j~=@ _v_&| ~\WhO op0/On?>z'n,*Ľ~E͆)Dԡw( QnᲨ(xO5M==9.&("vĚkRht@oeEc-R@Nʂ'lʱ%IAEZkk- (oӬ2muE=<%Rb׉;w]x!{g2.{OJ*ʶ+%d9)<2 }A/ Î/Oi%о?0>4Cm^\;bd \SdјJI%H}7(e0pcwHJ)Ѳh%E ѐaQuuBR#wh8@5 s)]{ư]2Qߟk"0q*E|E~jy+R9b:$7!zfA AZ* h*Ӎ1%qôᝮs^5eOJUI18MA, lVᝳx{{',˪ʓK! (QPښL`䆋T/e QEQVUcP2z6{_8p{{;^y.n|qoyѐ)*U>mK*DZU0au*6NZ{wٿ ?/ǣ|/|_vvv?'ÕtƺӋZFU~vW`;){'Pee>ܿ R -X6XV7^y4@o]ruog{}s%Z=/`sBXkEM@8Zڲ|vEb:\rA^JGQ`5橧泩G{Ysk~E9N(<t;i2/L]Rk%U 7R(l%gY˗Ҧk-qP)MGc6M4gޓ-`$2 tw8toj]#~G:}hQqapyl榱u] w3ucOQ @zd쐁@mG9"etG)f͸[kRnu@R4;kBc`D6!jcX*Di\*'+t2Xb 2QĄ$Az3h-YcȽF\P*-0X_%Db;\ݳ|W$T`rmF U"_c83sXvϝ;vY_H`ɭ.뺼{.޽)ĩ0qaC4+jJ1PN@깯+Jn^j)•,?QOU6JL'2uZRJճ[^T~[o!aX V+<{&%no>6 3BQ#bPQr2#b[U~{G|SO?sr2 ٚƓp =/*O(k;_ڟگh"V΁`P/s{]=:}_[4W~{?WPkY*^~9^r Y!u~;:_la-4\7nXv;@QR+7$[9;Xk\DAa, _\ G\5=  @@U2e,Xܔa**"$W=GUU<!<ʼn1x'Fo2[.(&*Q(ԡfv l$ r\m J^@%}кh|L%ddUp2]c/rZL !> 3D!ڂ6^7Eѿ:8h ]+XTG}2߾Vqɷbn#k ]BƟo/5w95gٚ@R"x4HYw/`t2tyo/6104Tt<9>38rw )?wL4FW!-`3Z\ί?a*+-N:>~U#PDBpin7=;9J׉}@Y`);. Q AgY!]ϿO>Z.2sע\&ư#'^nן\n~qjĦ4ԁLN%Z[2ks Ƒg8)V1-RQw;]-w X.nEU ,3޻{A_l:y>qY`m. `d_CN>nC+tT#ԇX, jf |x7k 0!֚ )%#_Bm \cB+xiYh8Bjt [!?gu-XjX~&֮빶8QMFdYn6/ Z[)f/ht~Y} : IDAT%";)Fml,luwϭ"GsASlnș̼ʲ0 1Uu\b򞶷%ZK)RtMPskkIzιin><999=~ ZV񈘗ˬu+~|ŗ^8|7O@V^w܈yV $|^>x؋!`X88 uܸx4kה/W_{Q?bQ51 ;FݻwX|S{yx獿:, +Uk B))2ZOj!+T-kG(5ܼXgTdn}i%ҵ6B\[ߊѵ.;3Sl'":"5Mmmk0UTU^ m(g YH@'_}zZog*=p!QhYiX`^ PQgU qJeI3 w@US J5VCGGui@yވv]K0z^eVJ 6í0!|8n{:y郥|>+SW;w6ˢj֍s(Tfj؞;D 0u];[7֖EXeO7n<5VUe`4}/t\-{(N9,??_HLeUWj !4ל&Lz|d9:։ih˴U+ېzo_gw͟{e?7D 1tH"4VR,!w''?NO3qs*sãA_ܽ{P(CS͋wa`$JX(*˴A`~>́t{Qfq<>xvbQ;ua`$IYj< ȖvjEƨ(V|ítr7U\W#~r26X@ xEfB(J1& Zd[[`p$2(T-HɬVG)3 ),TJ5mU"PkBRW9mt[F g=PCРhx{_puKn(Y2D%{hs_/\1SM52nPq!ԦFN&Rq訬c/UA腃K,=31g, o'舗[u:ŢyunÉ7KKy$nBܹ{'ԃl\zqֶP4M;N4i<(b.Rv:J)$Te=oѥqnT ʋ ru 'zd[gA+ǝ8̣nks*J)eƧyQ+Ia,E\,W\:6F t{qZ%^E6LJmF'="):g&Nܻs|8<PͳD .u u LZ0!z&Vdu1Pa  ,D[OEIb~czth*dLlt|e,Uq޽{Ԭj5RX0n:/,`+mT&ngdNvm4(VZM3 )y[iVÅ@P"L_&vdLmVnYȯ2]_R/n̈$KR9h![gkh!AZQ)zY'@jRZ9&l$ ZJ" fII}lA V2BJh+d!Y(鉍2Bx 0[vXf˄={O8UV TF:8mBu@F1N5HB, ".(\+ = @DIϘXlwpriv؃%\ٰ0ȄRIHM~EKdZ [lpBǀ;Z-PpVEMeӏi9- ,ϳb9?>o<i9Wt;sN1.R@CM8N_a2_(s|%=߾b9~u@{Qb2u\UNgv:ިbc`_э 3[{hr@K p lr){SFnZeZdX;gٯrthI@% :ݽ_|iow=|9bx)G?=;[3~}͂qԁ:-oT2H.1盼k@E ,:DA<1s\-y8ӄui<" *L`H?op?̛֤O{f>xkٔ7ݏ %[G[' .Nds*̎Y RRGg DךFDΣ@`+tH hCmARfh`E`4z9R*)(6iB%!"1@,"KE1ֈM$c"E}QȐMS7eUSu[y"k;P)(BHL.'Gn鹙mXyNil-E'u(ԾV*$B:rmQRj<۳ie | 0i%%U=h XMs/O5h A7UUβM\,NNd+];'H)u/ Paޡanwgg»ZK=Z<@iS% P:nI;&I_ycju*E'[[/'/tI(8={8OTbs5x$M snS+ p1~nm VI2>o>o|}k3L(R,DUCͳ_r'Q>1{@ؗ k?=;ɤY@GLoCݶwKU4jl`P!ll YN&vP {ʲ2y;AIvwhk`p'0^-i' _ż4IvE1WJ`B%FDRF[& oktxNg(Q4 -l\>$:7exjA,0<˥V1z.01füHmBke[ 1 ;E?x}#^^lF;>rK3RrH Yi0Z˖UJb 또YVvС:b1FI&ԚIDbD!$ơ/) CmcZCP떘Rp @RB+QH`HkCO齳Zp{s9kj[Tr3I뙱fyI°"\i8^c]Ż {Eyh a=0 т`,i=-\EC8®6\2vM;1 1 DMQe+t'u&Z2uUM0## *nװ+WH)u`B9k^?(Z1{]U6@D\$AI)˥:" ^E^/ ~'unݺve zXkwڵowENO~W ]PxX޵|ڂAĉ]-@g@+K{ۃ.:Auv^Waze\Nxǿ{+o4RycY0o=J]Zt" 7<@(EEƉN:jt 3wF[HLD6;Ja` {<E*ˢ/r!e^,5hBH@y"!BI:N'aIl칪WABQleZy!N.Kh<0 " XG'U]Ӵt<@q.RK?lIGJ2۪NQX+Fa(r>Lӕ,6hkkKkoWIu _kc9b?rujXpgNZTo]Xv! PJB8&|żhCs,U( h-RuHR8t [AMazZ+Jif2^'PJȸVDbk@(m* M@_/z&&QQ;ID(K4I:jXHFbom^(JE7R-6hN4j+ןw6&~޽12^' c8?Tn($aXGI]7@9U ,l0pjz>H9S 1UUApuw_yEsXVE\20Uu'JJK"H>C(W;iQx 8pBBDvN옫i NEl @W%-.EDQEUz;q2].bn泳̖TI'qdm3E˟TiD(%3]nӄw5c\.-^I7nxƓ cO,Ϧ^wH))Q1úr5`݈Ih:޽\ofoZ0 %Ԓ,`,i3N 0\ ؊:?Jx @eE/;^ϋx\ ̻}Oԛo_~6K,jZNw  :w)h6:ZH .lx[KDM XThl *"z@>?SA,5M 0TRR*\'VZO޻p:Wzٺ*EUI ɧOʪMs~~JJI|""/.ЇPG?0(>Vm!&:1DmHPeZ ;/OW( d{ODT(*+i׿!xh>B nE{#jqԣ a&$}m 0-T K@("Z㱵E:,,uN&{{[{:0QH= '^~??{8O˟|q>Z6Nd k0_[ _}xzN|+Jt1 IDAT(0A0Q-ʲl4u!$|8p9. LҎԪ( jl-ڧiߋx:9-(HQ+@̳̳tzxxkJd(mipS,K"bcI_ٞ)Q@AAA  0 HPMŮ.]ν_fu79H$̺;bŊ/04XRJiп |H1#2 ~@ bA@9(x"P`'(HXcDDd]{RBRR%Ad<L:@!cC @5JfBxxRDc$I3>"KD:tj0<;4iR0$b1o)RJeɬ08@ bL>r 8M8Eϙ2 fN!r ,}JRþS;DȂZl"i"B}DžUFK}Ab P$iGTQEZdsީl;6@-_OwͺQlxOfK9>[1|,z1,O LHM&}s.|~)ʗg˔hui!Wwq4_ܿ|m*<# ]wu)( 0|(6́8IBDRt6뛫g3Z.~uJS g>zvu]]|rDOOO>?~_߮^||/ 0k\<=?,ʢ僇Ajzd_/3tX`nvŋ/ P19yjYS[嬠Q2x!)"k̒rF~,/Q8BɣGOc> ы>?ݭkvCR?,gέ2u $JQtfo5H $پ"4I߁ ^ۃsPfvjnf_pr^uyox WU]JqLv {yf|6M'F+m4hkQcQEXDx=~KP!aJ0ulBFRDJLFP b6.&MA1Ō[hRZF"$2*r$c  wʪ41D]hI(C @ 3 x~pҊBB >Hf2 H,{XKD`J+" EQPo"eYJqZ< jJ%L=!6! vItS44>&UPgoBRDmuLHZ%K^~)Y6$i&b`KenˀL<] ?pຯ&ŭV4aE}J1Dnڦi1~* Nf!vu|T6d\3~Jm]áfLsWv[oonj^^nvcI=@t[wꫯo޼Z'_\\kƵS&!1pbXC (TBXH<-f)ɣCiyzZ˟][OS,g/}S_~ɧC_~v:{,DfW:!>FRi;3ޝLytzƪbٓuҏ$?UV6INI}4 .'#hգIUIFhUKVZcT{rS7ڶYo)E"cgF=bns13^.p<E}Ń8J+L&DF{cZׯ_u "}muuh4ʋ<˲tuSU}yUfUݴ={ֶ$! S"%1(  Y{2! `,UeU:j2ybZMOꝵFzy~FJsRz=~1N?#dn/^mvrT'?|b:կ>ozE}nZ j|?KBP܏^)\.~òB5Z̍1~OZh3$ oV]Ao[G#Uo޼itq*I xuy/>֙>}͛+QBf/[ݭo"5@BfY5Uc`1=fjW:@/^@g$!b"2EXD9OЊQV01(fC>\;<a{L)e"H!1 BTNR y(/DP<@8_fΥ2Rqba("s˨~D2wyޏM3EGbU }p34F` z*1iRz[o#@J%R"g6<Ii.R[,lvzvcnZLggggDS$"ctJ~_wwwDz7l6kv;"'''g77NXn}/MdYNaY\ dtg铧M]?}>fs}ӟM1vUegݭ~_1Nefh]}~GAR&%H&Eٴ[$bٵm^kϠUJ D:.A0,xYi]o?on/X] ˳Gv[ŦƔezMD}lC؁*wTr< y"い. wp|[cB.Awc)EEFY!!PP$r)Y6&eA+cb;]ߵ] !C !v{k-!E (!I!iP2EO(QX(í25(-ID繁@ ):0CBR3 P+2hFuP4%$f`6 PDis2]z5"+P9xs;HCJ. g35b"HJ #k2 *,m1G= mI2YυUE(ƘG KYְ# hهur#n׫˗N_o׊Pe97͆993|ObWpk kTG$[]~?݃Ǐ=~8/飧Ͼ~R/^?ˌޗz2~ѣg/_7`ƀRd@}ɕ_gEbsv`]1j`"<_W S1&@"L"\<\?7 B_ڼJuu*nTѓ|'/%d̕ M<|Xm"eHbf3NҚ1VMFz}>ģ Q1%(;-\V臙B@$Pݸ涢kvz{ QfYEY _ݮNKRY($$RDJ! 0'NiGb&f^;t6Xihw}7h5<#xJ!VJ'Q$X)1&ATK0rnRcO)y#@L$ ! 3#(*<, CI̜ʙRbƔ0 ;𛢚fCGDcLeKF=5F);Mt 804QQRF[BQm@眱&ONEŃXmFkIkAa ba-qDAvn1umٹEɋ2sfF}`PC 1+)xTmOLvu}D6ݝiw]߃@&25>}l?g˗/nk&D"6Zc]Ӵ}߷m;1λ~B"֋"2Dx͋jLG}}LAy5 /t.|>]|~|?Wn 5*g=xxz+d%Vu@]t]CBӏ@()܌U4՞1F@Jq/1p LCt";¥@'Dj{Cw^5 Uj )JZkL1޼;\IǮ7>͛WFd3=<|Xs5"{2/bLCb.e iaNE1?^hx ~CM̂eBJRm1ܖ$Sc Ġ(ҒUh`6BRe'΢Oi" b )0XGCk"f zR01["HZk":ZmC(q|I%t h0qJϳN l>j]/NC<)2bG'rE8pVhPőCD @H *$(P"fh\;/[N ԔE2Pgc@Jg}@{þZgYn5Xk?z$)]\]FERFpOgZl>N,"c )R >(R){YB kQDF}j`9BDXW^W5̦eU뻓9a4  *)w^w!HowOEu݉ +﫺@r;^1v-GK\-@^]py_mW=#|&XkreI)`7o H3&QZ',@i-c),"jfEibnno///Gy GOѣxyX1rJi~5 #p|b`1tB1CdPeGe}lӸlOcR&ovzű몕PR >ry{<)Rr"pC\w^+ @HHe21RH 1ZN EA^.̷>2O]Atl cH61@j@y wiz*/Q$D>$ uڟ;!%*YLFZq\3>8F։TR4 HJ3 0, (%U 5$}Nyƪ=M\>R(dNu#)8[G~WN7致д#L3NkmmvvHR[zWQ5M٬EIɤwa`~<*D`2>.EQ65W nW>:!7oxPAgTׯ:MFr>*%ԦLNd cLӴrb(V$ @&,@+Ud6} Ŭ,2vn`8o{!A]xg>g?{왱yUSw=럿k,LVn_]A$uwwcBs׵GOȦO+${fĻM.lrxw<=_N'iw<2ַfOO=z ? W@z=[vi9/{[ }D@0, ڽi҅oz YP "ZLl<^Fc)E:jm=g@8)1k"HAgNMMYŴna`R9`7)eRAq2 FBP sԁ!@҇aHX8bi(TE:'ѩ vغ.!}PG  bL$m뒲еMb}9/, "D>cRy_\!nw۲֫>̇;78vu$(̻0c[(x坟ΦoQuMaCn4M׺&Iy>Mna:-sR7F/zx\Xlc RL!QY(?%ɨ|Ç_~uړӳ>xgn7FyY&1`xg mtDtAMW1%h O}6C$fm հ*Fx'ԓ\Dێu5, `0fOEIER=clQks()?}7_@%=/ ߵ~A4<()7a*@ At3=OO΍ݦijWo^H4̚B%Ba5NZ IDAT{@CIii3~m &hs^BĄ4qHLiC: A= !Fg%(ƌJBR2kmjd&HJ)1ޥRZz$ RZm5RJDBo":@N[[Ba&!ttXi9r RJ"C8x op(= +Z563Ejև$x  )|`P923$QAIPZS"'J)꼤0>, =3 =D>1sQ@:B( ޏ@ R6[:Yh\&j}˛U!Tڹ@TZ~MǎLNs(2kGՋ 9X9|`|p$z՛b>16xȋ\dsB ](otK x2%Ddw&9GaEKuVv7o2k C[Wo8rGb4b]PSށ.@ @C'!TU] jL# I)zwm(a3sD$LR pp÷6t4##I,b9$2J0!O1VPb@0ae CX)R=ṓo ȁ9ۀ!EC{ %ۛrD Sh!*AR1lPxBt^gU 8¯j7QYey>O5NHcثGa P.I @H\[7A]d*)nQr0BK ?M4כڭ1 sR,6D&l i1/DdTUγ{CYVEѻ>}7HI1tqzzwh2ML0!꺾\F2k67DR 1heET&1ӳ6:rmzfWmD Պ`2$϶OO_fUW~>}?'JQ%؅ε5aB847P.{W/_|lGϊPO(RPvBYg?c|7ggk(G|Qz_XbBccTA/ AIbL] (8 "%v ~}YH I%@D/}KH CDz?vZLo!H, U>26ψ(B;M˓ӓQYvMs}}[x`FP*(Kp{glQz}fu[WWds7K?99)bӍYY })Ym=7; @6F5A@Ї# Rpꪚι;vMhC@Ʀw!=`HGF2( ǰ?L GH[=NR zwA[$t9%D@ޚ>DZ򌖢@#*2;N:y:"ZyݫAbJ "! xo+K]]BAtGpRSO.弌~W uM]̖yU} hg&Fc*8.~rj>xDe1x@km~Gʊx<:dYMGj[p"  >`H ܧ;<Z?iA#u0߮os\@t^;Rl6EC=[I/eKchm2k2s QD%fY bJhTPwm"03DTQd%)FM}smifncYcLHs H5EIRJ)彯jw>Pr\ {Շ~^߮Rr:zQ3Oѹ>Cmu(xh4zn˲M1h_gybGRfNۻ̦(Q#I(`%)8{kN~n۪nnoogx1[Z5=+0t4w]۬LXdq2Myܢu$L@?`Ъ-Gjժ/;W7{9^)5q!mYH5E`FscmRnxJY6!āۮuAD1$P(JerI) DQ9f@#$ xX{tU:p@d: -:cuuv^CA:oaj^-[ j1Z@ҳ3Q5xA6VBUaO!R%Gҥ)%XCYHn|<εdEz{UwꝩltPhۛ7:vJ fÖLN棪VUf{/"@TzיIq#GqMկ^~ >|Q8y/'ehPIwN[t7kჇOӋWϿ}Wo{Mx0.@vwu)mL6~$Ii bz>Vhls{AwG ~-(dUDoAT B\@L.RHrTNЌ|] Q"\dNllrKcQY36v-Ow*PomAA Ѐ0Cdv6nپzvppHrPAXCXYqLQ)aHDz~:ӅB RBȚl4>X5snuwwrreRöYv[рFԛz cܶm۶] wGM=8  ax! bMFsTZ7op~C D$LZRP12m9 cBpJ$&@|=)!M4tpSa8'q@XJb0"a)q>bbTXbwP8 &}w}>1Ґ'RJB4FҊ$(T@gA5eY}TbҘY0KJBI6!8f3H +0>^IUX߹=t]k:Z4 )@CNn.eYR]onw] Oo?o_Vuu5${83g46H{-?i#h `4#P f7)9w3<"{ .=ws>jSe-9m;7R< zfuT͎ӑWQ5MIVJDpqpWN5tu}hS՗_}KFSzYs8ĊW!LW6F J'Vnw3=mgL,~"P.Q̉)N' 4,fp< :@]`~ڌތIn:ъeng5c.bFKn8R㏟ꯉ/Z[ǔ Ł=+V"]0*ϗO>aUD݅mM|8͇hua̲MSU{3ڿx3G$D,Ӭ)Pky,oEqwnaSΉܦ]1ͣSSi_嫯ۯ?1Ł$rtBժwgWVAkjzѳLp2RlBRvwĔ[[}fQYJd܅Z(Ś3,x)Ԉ*2-ܡR njeX^iH) ~tn^JR\gIi,prhqf"Ua껶7(Q)SZ, o\Ȧba1Z bum6n$^D~UZcq1ch%lL ҹ̝+sBf!$ּˊGW9@sǟ4|EǗϿ9! 3O4jVQ]D3uSRl^YմZ=+@{ !F1kR-wc鮧 A<'a;}Ds:82w/_bL{Rץ2]7ȋ#["~G}th=޽?ן|O>ry#r<7o|^|9r8:"m'O8/T3W=zhiJ>3,Ax8m>HK7 r:ϥ%AW2RK~2e IDAT'}/9%g?Ȳ6١WAOQ&: WO>󿹽N1T3*9Ft9 <T}77(wy#i{[U*z %NcaܙRJ ^A 85z`.!Dg$L^0i-g}ͫ.v6mwE]7(vQf`Pus"i~<4N4U391qp CrJMa#b>eyvp{w:d.!Ԗ79 r8t!ܿ=e}B͒t8NX#a9Ix2fD 50/O'u>$)z:M^+%YUko?z w_}4U8:Hsq2qp6,nPA YqhP,u Yw&ErbND\O7l]b<~DR:Nhpi8U8~y?p2!5sr,M C:"0*o|>Ǐv]z݋xyx|rTm<3qdm݄/}GnTתj)u0s%s4i i$r滻@K̍<ڻXiqaW},)(21xϴ{ V/Op'7 +l08x5!쾌]:8v6gKDK;EÛrJ77w͋_ v]NnF;Ss#"&d`r 8j DF 5N""sD[5W-fجfAYԭ Ѱ.0[s1tn9ebRSN$YNC;y6U8mBD1$" ^ݬ[  1K-.Z$-V'D@j)3̅ܩV7/y"z/t h+Il  uw)jBrOR&b%KEXMǽ8"S2뗨qJwC F~!E튗 s0A@v^^u-xffF ¹뺔S4:7!u )ܣ9a.yy98*?|q᦬|~S ƹY>ow۟W?sЂ;̛$NE01;R"aǠPa3R5D)tLi:~X173v[aBؖUw"n+xb a(biKHF 4 )1}N3%:.N^8:ٙyѓz*Ғ=Ab(ӓQ=$-rU&'fU 6d}J)6jnݱ4H"?_miu;մ2;G -`,Vpקgÿ~+$NhL~iErKJ5eT  6'6P9%qSQUk@#N%TnOˉ1#?'bLġulaFK gaAċiGQzeB:gDr= CgD p6"8@b&W_Xx48؍Yj  QhJH_#8(Kvxe9mnsGp3Թ拘)#!%|*,, h78\< _%%Q+IXTUE"tros^}緷?˟ ! !$EX[熋Ʒ>RnWҤ-^9l͖d5=%uc^Z*7iYUCW\ XS )]f(E'`CltN{u(Vk]iq=|@u,7@s #ƋoW}@L@m7PӔ33 nzjW[n)2!y"ŵVsZ%Q\"q/xIsݕS@|J2O̔j[C֪j{Q8+sU&bf}3q)sī6!DF=TȊ,/$4 )"n~1.jIQ;suyuAW/,̺~t]yLknrkTTRLbF|H\B1- (HA R 8$ģ=\"-C4ӼwA,uC⪍S5D'Ek  5IV%ҤYP=Qh? 9eֈ;"UUWo_MF3f6aj;%g*SK|KlCQ *F`R#3jp!3o6vvGŭK T%xqFSDvZ.K@o|L`5gbwk8y83!';.6.Y@ٳ6 q]/솴]wֶQcD# "︿~iq.U6?f!2i,}W(p[h.?c-Vj~/cKFl0"\o6,d`abZkՔ".p.5W͝%a)%3?N6ZiQ}$2P s!Jw@ ` a@}= K&܌`r ]k);NyvmͿ̍@" r&F"9EVo*F76o=9ͅ ]rmplPJn_A,k0Ə?g7OOg_|x(stO#ӁUhrR)0-}__lueC~lv)ebN]$IIy#t("F{\ӕKHu9XN[Dšz.̀#3ToZ~6vKj?_ V"P7@FkaK(k$Kqp- IRqpisyF+sӞ Xܛ!ss/kDxG"0w+/Z| 9QJhq$mj3lY :V$"$e2Yb m qpXc6azbV#R,wWִ*+6ȸ1)Hoo컹ñæw{!bwXs2n ;^hUaEՇHDƝ|GavG"$ y%o$bfԾ9Ox at歹QJOL[ZXheb%Z81a]ӯ?g<(XIhhfaNapV k .rj Ik|<&EQ6/ ꌀwEin>ҘԄK5-xT40zCyIITAiVsE F-9 s"c˹Z IZ%Vt(;EM{/F%^4O^Ժ?TJ")% 6orj5<ݿҷ/iY,T3DjH1߹"cirׅhd.o6nKrelrQtx8O"^|~h7X 2S$9kT0DjtvC]P3 *w~#cۀ_k;t]GLc6NL"AMm-`q%Le*HhX00Z}N-ICu93KUe|{7Nn$Ǜp(2a*Sj #] *D pPS+v4o^8C3K&NHI`f BȨ[픻kX?5{T" ~ w]y.E≥/_벗o,X͢a@;9NJf7Wsu_!0fZ|pf!1RG96[Vݨ-:*LBnDZMQX0FQDRwaf|)<$]RՍS궻f{:Ϫ߼|>ºn?ۗ_Śsk%@Ra#y:PFm s͐S0au9]۫ S6)%UeaBn\/>kceBq$]\Ž4C,<| hKN?||hi VAXYSZE1N@q]^M_)+ooYz@-6]Jz?/xCL*fK6HzY'7fI&%r:j6v7loq̩KRAw9S5_ Km[>Q#'$$mfZ[~ 7I,d(x}yq% ӗ厨ƯƋ,2\> 3js;yc$IĒL\|I0#25OΫ=<' w3fK&[E(s])mZ9X(Ek7jlǔ4bT'o*s!m߾{W/ͫog'bIy۹ZkZֶ*, ]EDXzP%HDrʩ ðiЊ$/s)oY:^q'6#_Vlc53 pN~j,-c&QGd~LT.J+HX|:ęW$8+ E(jtV'&։ɘM5-]iV?яs OI{J @haI g워 ,I*6Ud̳Y-E+˴8yXTq)- L!JcF<`0I^죫+<EXuQ碊RH93A|"VHu~:f9R X}kժ5H^d^ H_0Kl*tpv IDAT$ p U<p#5#"W8y4+&bF2q@D" µpYVs gtA3S}TJQu8eI(*ȩTuwd4P?{Gͫ^*n; WWW?b2:M㩆I~eu $u䒇!$~DR)b9z<3o۔1_#̏zKCv_|?[-6/K‰m63dd~N.b;7șE*aSn™NH ң]ڋr@8ss~ف?|gw%ߑ $wHNDNA7bngCDd:ɝܺ!vT.umxrRJ0,0&7uC,V#>K K44*du.qw Mo|f5'9p94-Q7xmǔ3| M*Vi7_>-!)qRbyV7c.2I_5`ŨIJю\o3Q`3y]cM;؇VLJqq >:9re86 !% LD9甹!v67qV钛GӖ "e >4 KaWYX#ڂHsCVV'9=""bƹz?i:u#Г=y N|=oq-xp,mY$zRie/b>ZM{ʻ]&.:I~Ya>w1%ID!'39t+vRӧ*9dڸ>LFr~ ]pyZP[.yEZop"_WbG4};06?v*+lkUdca9srLTk=SmhƈH@0! wcUZs%C$)+}qRnr,U֢Mwo,4&~VΡTF/ʡ0ԋe Y@N*AP<-[jU.j3SCrk/I|311Zk5x D- a]AhE~\ "DS)7~`"1oxgo+.ނ] IL8-^>H/ׯo}0 o7Mh9ar]|Ѱ T;~JKqה7$r. x ~C?i^I,`tcXiXswNMD"^tJs mpi"dC3oq<76}]y@ H0r,߇tr8E #bAOΓ.$/r*wvo}~>=?ş4@At)ej-5\6mަk`n R4BbGx 'w&% _&M$Mq,|eXRzU2ښ qwfXL`4lz8Z.Rˢ[җPBڡA=`Fb=2/C-U96 b˞Ir/Cy=`N:usG1$SNA#q^0A^W шˀinm;U3E\5NS ~}#w:M۷?'_sɦ(ofлytV+isy3cC7ZKt&s9K@$%S"v_֦ aҒVxr(o& i^q"z,:erxJ>~#_$g8]L` I`3Qm۹}1 `{rs\k}^Iˤ||&ssN]/˚%謵V͜…%K LU3vRfaK5sw@+lrP黾ˉ+ƎXĒRJ"0tDjj1=YK)s~ 䁆=Ǿ8UgZRՊRϢv7o W?vTӴQ5;rzwss4qu5d.jգ%'"2 [[7ĸ%wu.$fyk hP7hdgMgw2s6w4[O YVI$g߲KPpF U![Ò 󶽷 6&k{.BL4@M NBN^G`c$vݿi䯏AW+nj";Hf5Z wY%!)0Ý%hJ}QSM""(JFrZٜU &)u93j6Mvy^k.r@qu;9Ԥ0BHjg2uUyBՋ!9 "Q㲂D`h%H2E]lv7pLshkz1W,1Z 3="KpRD DĦܯ8ޟJ\ڵFIi͐$Z"7S7r mDB+m6xrpEk ͂Z7!`[nD*W&$1ᑀ!,͓q<wog' ,HO>;dZG70s-)aK6'usRwwɊv*!%QJeRN0VU$dI2 ;?! S^|9;7}ߧw;SQD@;9ގk1pp(I8XM)Ǒ;Me3BT\IoK,z+55 c.Jf %b!f0V= ́.pGu]>Ut{6}TEjUn'GU=+Ejy4ԪԜ6t0V'm׆vEՃֽެrʢB ڦrZbD}?8svc=/6MFY"Tșkibp{t2?J?yfsDF|z{d%R-BNjX$GE?-x>}?~!O!]%g0 !188jJJ"I!ejqF:c{>Ԝe (YDNۭgsɌB`PSzR>],'''P^v.Fbs^$@M7)=<Q4S<0$"2nTK Ii}tx۬|S3H|~ӧ!PrM⬔Al#[5L"9Ovi}0&Qm@>)D?1YQ[ZxT6; ufD0f}Y[ZYOZZ ;b,Wbv:""5es%iHDRjBJ׆ap}iDI$;gUB";$gĉAEFfm9W;$Px&7mB!R23Jy_p=#Zĝձ#==\0쪙7.ȴ-Z=Po4A`vlSJ8H^a> 1"x*5 1y_Ӗ{Q!86<:0f^ĭ g>HLªL4[VSV'M) @rg rP"3 Я'G) MjC 6}>`fqegD4zو irɃ۟ya5a4sh;:};%!,%PUCߨyĩ7dx~? w)ŦqMaoY H1x%UӔr!19!0ąvTRa^zaC>0dWg]ѧuzQrT4*~>>tSWef^ XGY/~r9+C.:V81&-ӠsAscKB/c2gRb%3)k&J+s7i Ȕo=_.f6*q9-dTk,׵z?u!B &)- &tL̋Bn $Ȣb&AfaC쳏][WK!01Eo" g' wI}C\LjRJCJ;0^JCl4ST}3suqY"??m*'LzmQ?Ln0PPI9s+ ThLK=ˌǚ1"Led"=`˃n!lY4=[(T8C ؠJS*~q# !4kfrdm[oZHl6buCC8W~URUeFD4W6zTtΠ- ~3%X荝\ 5jlܥ%0SbbJSb!g137MK9d<ˢ !`JDޱ^<ř[ߌz1[uTS"Nw&\˹R_Aѣ1QU51Ǧ;3 Li( qt;FA͒)ؐRa%`w߹{7s<ɊAx&R:la/ jGYP `{qoڙ,5 /QL'55|/V!(8/8:3?`È 6a M䮉.,:n[4^S>G7.Aybq0Ŋ{OH&e"#F Ч@]۵mBYŠb0͉C4SFSB̤ LY%ݲi:ɉdFHܞ %:Zv + ā9 4!NrnfR2bQSs֮ubwwN9eMFEdN6vXFHDI$->R U=*ߩ,YSj*OȭJq#2cdxT*jػKFN%.K95] 4h=I1r:+cයA# E҉(A ޒ:fNpfgZ{H)@f@U,`",;:> ic:AD)@laJ:cU=\ׯ[OKa9OWW D$98c6p@)h#&cצ:JyT QU>?g~T~iMƺyshضM׶]6c<^L\RRˉJm `"9/TKsfjyHC5 )%"2XJiDh-ؒoc9%f.dqfrҫ >l3s7#=)̻>bY(ܢ^ѶmmAkBΙc1cC۵V&jbTeMʔBLDv:HrIryc-ॵи[H PuG;6+ePVr`[?Ҙe%!p+ eDl8D&VsP}tsLʊSӀf@YŌYI&gY,[fS7gI?HԤ ܵR΄1gb9+ a!UY\P"1dm٠ήu>U:?|(4Ί@< ]?0`)RQ*83 023l\f3eQ*3RmrA:}KVqLHeLD6kuDԬ/o]YuU .ˮ֫X?m>d qly>gnȚ%#ndFU"6c HMhmwt"k; 7VG~~>٘AM!ɳW2=Bz#HK3Pi [27eoyt?^g|7}>v~iѧ}~o]>f^j6:T/xeSyrM=&En/&{hNlmۦM xQKa(d6!`/0ЖISaH!l"IȼweV FP$s^i3 IDATДBub{OyT 3c0ޔ$0k8Sb'08>bI:r51,4"ފLa0ol: CuSA%þfj*40[C5tg a T3z "I1]UHx((qm=: 3%i=z99;QXF)tZ`qϵ!4nGBrx15sQ,`dVsn W@5TE`d"jQ с(y|ة]2mO~plį|񎯿}o' ~]zWGTaF&`fS"3aȒ7O{N\pc(ّe~IR~@9! 9Ad(aejP2#UR#SO||Sr ᯾UE՗q;WDŽYA4 sxß恕m}`:nʌn-wr7<v|$ *v 6EwgguY "C e<%ڠ&*"Y%4T^ q`985VNjӜ0®Q!rZʝΉhfZ&֚EdJ$UWsJuS:lHOwb4xlR GarF |;b`3h(:0R7s 1JEiu&nR8X2-$3+J%kou| X gf.qM۵ݢk[YE˫Q?KK7;_VuH"wh3zUfnܞٖuZ$}wgy|'N^qUz}ٗ?_{w`Z21W<BY6p i:wp^> }Z69EN3$#eM80=`O,϶ yJ>Qck/d<\ɇ'7qc 0y H a^/忩>|[c˥c!Dsd%ݟQ_s\LrY)ǀ *Iv`RL)El",2Fb@@sR`1FLv RNi)6!g0~UE)k0&^.a*lDD^\3 9g !g"Z ]+rN ^eULjb YQkt]"M#bmdPlǸ|Ҍ9 PjM@`U Bٗ˦g`0+MRMfC5 (iD٬+41TϰLg*)FpyDfKu|w LHF?kB6I tpxS>mo}7w>?~Z׵=b?#ۡ2Fopao'^w+W\tiggqg?߽"vzI[ n8DާaS<` & \CLyQU\maFf?H|ѫ~p kL¼}Luٸs%DΧkZ;cɏsٶ+}-<b&XG3ll|͹1w1Cp 'bwyY,Ml֫u1ղy gx_+=eV=>)QA0PV͓f3R*KN Dsss"5DJy58Ӏ:s3^ui2 {&3yFb#9Y퓚fS"oTǚ*4H6PRD(9{* VL_ETkg3 1hyqYmvH8Y4&"vvvB''k3qsfx%僢J0ZQS5l&w yc>W]ֳ@ 4m~7bpwr5ؕ+/ۻ#<^] R'pFJkBh 6}۶i4gg36lwTQG 8o|9XCOߡ/y.#7<~53NsWb|daڇ6oZ"5`X0X4^GfVJ9Ux#4cmFf|WcmUiH4,*DZ,!Vcs8FfggWkOCyŘj"dq|ԩwJ5mBKjs]:*m$ -L>V|O+<6ź B|[ p'˛*n!AFج[92ȧӝZo֮fٸL\Q%bl8p ؖc>zZ#&u5y£7o={k^@5sH1(d(OM/=Rh }Z[sB 1ꂝ&o?K{oz>+{'^#|c}?[4%*W=>zՇy:$>߸~'>p6Xb9s#SM 䋑C DXͦu/* NMt\?J]P'S0Y1ڬ5)M{׸90yV`YWSvիW/\jΒsrMEfvD)ɚ&2_CUqaIl?H2sȌr}ߟl6D0lc#`9[:a kk Db-;m'}YNUSJC`fQ)!b)gq SUfԎ. n4-ʅ(763o|ѲMm%ԯm˩1攻"&(yФ$9X 1.OF/a/f _``:*[79+tC `vmۆ H*I2v\!E9y~uO7 "] e <>m4v]#w۸"D~*z:+ފ35)ж椮GO 0RTK 2eZ{T|&fČ. (ddcV΂KiRd"BuB?$ue׵b臞AcaIrR{AhP0"-N^N0!9>D4#` Dir}NP&1'- (ʂ{#6kU?<䙑F7S$%L.`0ۆ!"RZfALT%x 1;แyfVK̭mVp|"a%*ibb{&; *lY 3%tv#.} 7; aR=\̤jpc5u"cpӎ{R&"!PlH(!JzBH"ŲmvXm6sdrnl9;ȴc%<"2)vCPQ/13rVWGw߼x*c 0wf_@Dvy3wT-Cr*u]tT829ɶ,, O\;bǸ+ͬK&/o43sĠ0>^}m83PbM눦&bDNZ=LDd?H>̩L<Is :fs>,a^7m !b8f-Pjm&fb; 7y1F"Y3MdHD_9 Պ4,C4n1wO_N(:a>{Oظ1(*hƌDUYY ]h8 3fVdZ<҅^ Rg&/"x$63ͭ1Th ;Vs`]!0q0C,M IȔrbQmCUt,2wm"R!=,۾y[/桷m,bfY^T3 g }!bص% O{<!V9D1LM*?514]!#aC%0cs.8Dw)GTcg=O\ӧJ R%PEx %pe,WQAL.*Eәz\qqhRe.peW+'O,PYD*Tg ڬ.L$FFcmu-v.u{._qC0Y#o/OI۷,a=>a#|<=^3F?[7*;DK_37tuTh"\ĥu=={XlgmQʮ803bp)vdTOO8/&n4,YӶq6~ـh/3xp̹xY+ݮW3R,fI;x0 C16љYFODG"L-]QMa,fuϪI9K*O)|ݛpq~2P%@_566Jɚ Dcﳂd11T2w3qӅ8catPL|R2A96|{N.vVo [8\+F_hN/26E{42$Kh˼u7sWJKͫ4'3mE2n&Xv2QIc9KPbsB[qӷ<㽛-$ *ž@#,7< ˋKW/^ܽ Gn}#yņf}o-]\.σ\Ʊ8f{ŇxE'Qд"l4g9w5fycg?K!;ku~CcTW]4Vz놂V<oUI2%DpȦS:"{5%KQUڇO_'֯mV'6rYx9}_q xIQ1ph`ӓPxU71m8 C)f&"u F:m&}"9K<;_񱏦 !4D}PՃ2/m N·hg s5mNFD(| a7Q?9a=4ټuBWɗ>U2k& >r_Xӧ{F Ѻf9n ':Q)y!f;>"G| sW拭zdǾP"R;~>.^] f^RWϟ].AթכU9'%E-6Z,m}Zo-=aH"J|oƷnEpX&!|f֣pR B!1SjmRhL%K5LVPҔ`5k߄or;dVLI(nֺl1"".76;ݢz0oBO[|ރu|h^B+|[ [4X*U[kDbѬa*YqC8ZYPO7z+Po2R6V%TUcdž|C;N'WCeZIjcHZG*yVٵD|XIũVQ9"_>Nx~M5VG.w4bHE L@ı].wBpdxNVтA@%YUNVM?dQUMYRfRN)aH9;%!Iڨk%MT~ B}"H(L !2~-> DDdxt}n鑋:$qpLDqc4 6;Pujl^[ͱz %p@֊66T$ϗ][{W,wҐuP(,_^z'!y]? $$ԶB43k:m{Q4ɝ4}NoP/![vl ިVo|Yw?33ѷ}=Mw|+7>|”]#4J4)%@mqCUf]q1iSun>r'YށWoZ"Ko!?IYri<ӡi۝ݽƜo)"1PJ,Y_ kN)sNwݫ Ty}cHR=,]|rrcTZ\L1|CQdaV;u m(tFtAq|Z [3ћ_fIo|q `_2yqZt &"È1&+C6loֿIOB%Իfqr]"~zіҿ)H 5kk^AVtz Vm-I""7o/|c){"NvC*K>:z]=xOz^' vz njVoA2Nd?pQէR@u|Uc &5\Zn~1[C T'+128eq Z@fNdtOԤV3P}~qo_+ʆШ$-[%$fBH)3cX6]8Yd,CCa-6 I%(mF;;jɞLOqaq:\FM9ۓyZMm=}sDTB\3)ܗk+ß߽mh.>^˗_' ~#4_  _mob-oiQS z>*\U7xvo.ݽ{g9Y! ]|+? of5~X=H5}lbw+}'4߿̷oM6׿p)@CA}bpV@1 #%20Њy¨iT s' GՔ4qI' {л{uz1< (./~?u#n뺑~qlb4XJLиRHyȒ4{1*1 lil$r !,S^wo~SUĬK|M/L0,uz;3(;LR vnl/yM{xo>\?kz̓/C [F7]-*s/"(1-d9>nC`εoz 4,~ /_yPT-CSa2hJynDr۶n!9KY#zP"R6~&V\"Vg%LmXPG/I]ŵ[wbLisdbڶ!.e&}ڱL5@] V&^WХD:.}ZwԃXz2HgC )3 /n M6/^yco" K8 .ZN0kb+3![J ݍ" V J'23*}dnD fhvߛ&frѦ~u퓃;{wd(քQD7_{dQs33]$$vX$ %(eD&!Uq㤊"$Į8Ev\e;QY$` PZiЮVyϽGw{c^YΝ{^}5:l['g4"ME4sk jT+۽ Dp+{1;tlQvv]STG$\p4g8+WRkE"]_:AOdǤ8Q<~ΪmWJ6f;)4]Мj61@ztk-b8u!]I$>\J+xlN*>8#i>}+gFJQii#}”Q]w+8DCELC!ߟ6A8ַnߚ闦oto?/~-TgǟF{(I=M; Ggw9Y wwA) Q,Iʍ}{',t67Df DU-AD\{"GLjlyBnYs[ 9$Da"h/vE@̊8άwýr $jlӸ4+ڍ4k8*4ظmǪ]:UQt}SJ9weZ[xQ!zz Գ<Rz?MoC(ZmKv3sohh!V+03rS !vq67d!'pb51x?@i~3*H?xX C Yҳ`%=|EB Mlj5R1ss p &<9R`"#HXkbz+ph'9UըBXHv*\kfϦ jX`/ӿ|eov&PLZ=A.3yªgNi*Z[!Ċ4c"ٛ#Zr$&/ck44Ku'4ת .Q\2a0aV*= ͕%.5A)I1Y{%@5)˷9$0aӟ7]<]X"$$,y"u=ba(!Gw\@? eF̀<5WV 1+g lMcĪNAs45bd6FGǷFZN;N4GS% fVx}ɅY͵i(N̼aW3 #PwonyDX2)ŕޙ1Tش~!1Ep4gnlMw<5&^@i3mS2O$@"{B&ByQku-!qITEAw W0DÑ4ۺ]hOv|z a-NKRJWVt'¬ֈsʏ)+}h]Ka{c/)fBԜ ߚSAhL2tvR笱ȋ!s~CHìW^۫YUYb(/|tfP-^y!8Q[__xptwhaW+K 2덜Wg£WR.Ex/5//fNlolt@tB "1ua@˕Wev䃾1 %fvBn%2kђ8l4(#i̘c葉ز}ܑ䉗Ttlil6Yh5 `\k焒 F@V8Q[zW!][pa\=Jӫ= MS pRCJ3Eȉ#"񾆡[ɔ`/%=/|{H^)&ppNM.&##8#"ҙS#<;N|W&9:b.jQPU/W q5=b+_i*qr|t^cSiS a_=s4зgb,um7Ta̢6Տ]8JtLjWr\j{2]ӻ^̀4-7281u!uUC&Oc磽[Bc 0wea" pO <3@(ґȘC*m4Js% I TS |ɦln7om^>1uvYNdltE1u|cʯr*V9c^kEu s#A_% 9CX|Hq?~&w|Q[]9S!(lH\"qF88r)z+[$0Ir>4ίh'g)fBVi#?9h?%x±[]HNOQk94Ml+-kAU|[7$I|LP| ( p^)F42l`$Σ_?iaN̑/?%-XbsO@' IwSj*$?IG$\Uά/EPi@"ODNr@܊ǟ?^MXG{!N=h}?Uw?]U2^smj-y^?ZBg]$rYUlbG70ˍ@k$NJXY;u!!lqЋ5Zv&F-F{q063u:XX{H_oU $tRM#*U܄`r<NFYgvGHs`(#_@ 叾KU\Y)'~-<=ڂ(рbi<+jTwuEQkIڶ1CRxÑ+bw.NRZiA*U "S?ҲE=:Y'oESw)5GYaA=N,a*8f"w=ᠬX8k w~8_bUZs D)QG׸,V㨶7ྃ_ug-0Dy9Se|dϴ"Jt8ȷ?N`A3@vӓA^nC#xtsE {h9u\]gĆ"gb]V<7b97, 5ԚB=Ա֦Mhkqa!˲v#Nt(WC[!;@>YIL]j砤UuHkbEJ33bR33{źX#xEaZ-~k_<uMיB>l i}k4c qP )|P⬈[AUB0WdWB!쬴R< 7*.Qcȡm# 1/}O_Ti EݾP5c Sya1 _x&8kė}P<wwobf*93%չ0LNgm[ 2mЃ{I SsoC3T ֚qvN.WvP]yVᚋ{qD |onq" XtXS/?Tuז'N×<]5-mSPv~J?n+17q/ 5UZ!f0]#A1AУ/IDAThPE+TK˴sk:'6F3Mzty8Fsd9bcKG&'̜TYb*4%hܬp !w܍?$j T[*.njD tY]:av&w>5{Y91Z9sARL9kD\8c8Xx|Ԩx%71ݟax6 ~wɪ3$XQ;t{VUޖ< ;Bc)^3FH1phoޓ ]*Ti=\U-r@OqehOw"m\O]dPZafbtwPNƷtvaSX |B-k5Kh8ltw38N]ni QX^^smGZoxr6hOhᶺ8U pV$iHb²ry**DO_:"|rg ט7lOF6^~>-@X\XlyQwwȝ8&X'&Y)_|+ %f!8 yE<"ECL ;yo;UnM= J$M1&ﴋbM}yrTrU p&1_snЉ#"0ؓoNIЗ9t8JR\s9?1/OBJ;]穒Q;U%-M\25 F˂)) C|i\k+2`Ni#m^ZPk5Zq\84R:ɍmgs&6_87p'N/܀Ee:oϷ`龴])~kJ kGbmWRW+'wpթfUѲT{u¶f\V<j׊Rt qc-D0 i# .T NLڝNA1)Z<7rS_keoDf$"l`?׎r{cd͗I6.[BO!HEDBLy*uGD1J'zq<1q L/{g @qz)t`#S-AʪݬB(zpf-s`o$ @a`y)2qh[xBsljRI3_hML9gμ)W ׷I:(l.gy=G\&f+l͆&1O&ڊDwXOƊ Yy VSʖ1l>G!]waB`=Ap 0Q3mi6b  [U$Ď5J :r֙mN[ $lR43PM)*%' M`jip4 'qQ鄰Js+;Y{ k]pR00xz1 k`w)"%?EC¥'M8PYZs@YJ. ɈVMF2H}Vˌ .OOd# aDiNlfH(:++k'MAW e*$v5%=wxN )$*;tKX.(gSYI<s0eUK@B (Ĉ뮇5+re ~޼C8 ~6A,v?W5nAΰJ8+0Y7:B7^BW$Z"eP?S 9=3{Trw]q"ƈw k<a)2_T)%p…- c"` u6<8y}0i*MwY?,̦ }qXB8uAd_D+qҾtU=d6SHܒ@] :^^›ʐO˷kZU.AIcke3[X%N%`߿V񸐓Lw4y-b@?TH|X|XLs ^.2\t6ʪpVY|؆5N;ؼC"B>h9 +{~ӂ=j gP [FsġղKw^s>a+UkWVy1W>3O LG5 e $Ųz>Wnj[Ïz5jm,Mp8yU\` ZKIM6ZM֊ 5x0jŅR) ?WߣuOk1ԯvU.ykrUq<hWU.'$<:9Zq1q. "4j~q^8Bw\u6L/jE5`ǎm;vZٳ'MӥNя|#_W ơ [l+w]mr~x͛7w[$I:GD7z[ ˠ&5O~-r뭷߿@܏;wu|;o5pye؝-)LOO\nӟ4DTuŢ{~ /c6=za~p寻ꫫ-N_=qر}]wu绉h߾}'N8 [+&'';,..P/:v[ '(j朢d$:q_cQc(}٘siFΚ:_c=Q5jxv[QF5jԨQF5jԨQF5B;־IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot8.png0000644000175000017500000022742314620351225030342 0ustar00hanshansPNG  IHDR65fsBITO IDATx{mWY/}cε$! HK1E%4(47j*ReQ^ M \e(".]4hٝ hTQ[ CBr{5?1k}vIN99ך1ǜ7L2$~h˩z0ww>N2$4,{?\vc]vA>He}uʯJy]]8$L2Ї>O@^{{{Gґ#Gboog? :Զ_Ox'Nwٟ/[f~~pw>vm5|}f;.T^|ӟKsmvСg?{{/~p}s??0\$L(<rs_~??/|a\~__}p뺝?>}5|+_kHbI&!/k~eccOc~x^;?1]u?_?W]uU|2/?pW8q-oy ɮww7O2~:3L?x!97 P~z{|۷}ooK|kI&xI&dGL6$\l2$LrɄkL2&M2$L6$\l2$LrɄkL2&M2$t{'Mwwx_;;^-_o{۞??|׾r3o}.w/pUWկ[/7U^7Mn? 77__cy뮻mo{}p-<ֳg>n鑞~^$__o??O|}CO$G~G/o~Ӟoy[~n馛xg?>z+_Jozӛn xyիn?꫿~}^ڌ/˯yӛ׿w~wu{=?ﯿ8O|zPnnIOz/}+^}GGϤNrɄkFy^k;g= oE/zW\'<;yc}^'>$_ꪫ>O}3|~f[n_g^q>|򓟼馛[୷O{Ӿ_:rSO~hQ80pO}Rg?<2 |M$Lhx_~%o\{|;777_Ww}ߘs^,_c^nllloo}Mɓ'wvv;`>kovw}ooq]wsx[z˷|sb/yK5y͗;7^uUOzғ>?w_,}㯺+}#ԧ> {=;Ʌ%~OC|;y;;$69&ۻ~~gl'gWvew}#=  ε7I& pms MrNeµI&bo0$\l2$LrɄkL2&M2$L6$\l2$LrɄkL2&M2$L6$\l2$LrɄkL2&Sߖӗp$L9 85K)NtFVs?A ##% pAb+]$[Z񩑠$AN`"#̘ Dܸ>HY]OȔ..IX,Id%/@Czy[m q!^h" ,M`Zk2/e5zoŅLY Zd) Fd)YJ)4hYJh&jEw#2t w$9$ "KEF)яK_W`uLi D (òL4 H[[?]}Di$ .$RXej[Z,VFJ$ h nH`Ҭ"qErYϐE`ggr%,(nD0YM"`PhB:Ǹ]6r[A4/I6Rg3&$KK]9ͺ33$d@$R/D 9nx^z^*Cr/%ܽ,ˠ}|}dµ3"lU6 {]?[z3: -iTڵIKNBCTёMAeRh:O`H_,檞cz7"4ϊUek(j5x_rG3?~^٪ .RJrw/6ĀRPxCvuZ:-9dL %Kʮ@k>[<6gda $J-X7@tԋ`Q#YJ :z㓒Uӹ)MάN6_"h.FQ y_J [Jp"` m0H2h݂ILd5@[W{P,aKWPWf#ƀ5Vd +h\Vܫ}=[TyumMu fL@v]W Fp pN1.`K)`{8 ]f0SY$H1l@Zuz (J1LvZ2 P^ٸ f7`hb榇Эpc,lMڡ=m 6`|>ր̶1VnlZ񏙥|93 ٥.CF8˱:4GV28GSxPf`v^(LŢpHN7J]=HRX54!*Sp|Y?vٽ`8dP p&#2Jp$] X1 *qSi&w)C3[i`Yy|(Çhtw=Ě93ڐ4 IR,YR)nùVJטcM 1(@GuY{+Ŀ !@p8"% 4ҘdU\"i&49kwlaS-umIy'aَ`Gv9WT.fċcQR$-CV獻Sӧ`dfhKeC۾}B*s'Jjih5Pao8(I8d&wRu}/\*튋 xSc>BtI4@rQj< >~e{UvTi47A'␐:\* tw+.h A<%)foe4lFZhaFs\t*N$OZ (0UQKVFzb\E]X4y5:ܜnT!`+.O]2KڄzPK("薬Mtѽj/U "$~J ŋARׂM& qmG@T.ϵsre)4gxiu6"4(Gfժj\Qtd3[AHۀ5R"ka:&1XbT1/Bx2jL\pc͛LX ψzC ǓYb {9&Òc @5\r"Pяr `Ky1ɔdvwj}J Wbnr1@AېCH>pCJ}uMpHW[u0,uJKBOs̽ zIɫMgh+J@8)vaьBk-(T6åRdD[L3teQ)9WS.9JVCkuM Z/d& .Ҍl4I.)b1Z$ u Kdr9baF{TC䂣 *p!LE uds z/#hm28az&l=Hdik (J2YSrttK)=n 1uάC")/ E{Z,.f݀J_$ʓ ='PR YdX-!Z83 {b}@Rٓ C%#-r,\BWu)v2<棹xD""! h{G4/8"Υ3H1y$O5^ I8 Y*d\$ŵ>{nv WjL$r.CQHhBe7C Ž 0TXU Y=  >ZǐՔ]IV`0U@g)HC)/$pʝVжSkIȠMi榘jI, /ErSIX I zg@7Ҳ2*5E)75wA#u!.LY NJ9, Β ȴƁ %3 ("gDbs#1 %e\tHȚn#rU4$;pVqeU Tvq,dL)uЀK)@ZRI{JlKzm\| I`Ib6<53-8nN̂3@F&U=wWoTtpX\w 9iP .B'@A1"j%G_!Ng}QkgZЧmԨ;T+D+ LdJ S$ddQ%X = 4(򆚱Q3CF:j::`1!lD&T"G$i%#zJTs)F`\s\)ujy t0BIQ^BL,K)^e9|81Ya \RG j ų/EM esEzHLER0] &^&,aL-df -.%,@ɬKIJ!YpEF#0I*A pEbRdGBR5RK03cf%`FThHU)s9 4,YtzOV.<},ژაB'hz8w.NL2ڛLfqZanp-Q:(, Yj^R2KY$Ҙ:KaCЀhdGuF&UV Cp$G&z7HH)uaw)ijΓfUqAlzM4Z)2%wsi TpUcW##dT i^ݮ]]IUC[KՂ,*Xd]W:jYRbv\xvv@o P4ES^ ~JC5T1!P ^`jDN%\)uRI<E* 1bƄ +?󂈵-AR"ܫz^u0:;I#d~I*Qmj-̊l4j(@FT-"`TBcP|Zm/"vO]: Za,EB8$ *y. Miȣ < 45d_,[/#{kDД ֝jcARRT03@􈁍crl."IQVrRkߪOaFN]5[Entt30t}:3a5IyIИ8"|m>[imkmkߨmF3!" b{]E ?AC SK{M @pZf VӡܻbjoT4t NG-Q$#SNHwIVBke3 e.̫4PC$r.,UGr.fdJ[RkBO̺KKH|8D{Ʌy2S4z |Ek,8m#tH-+"$Aiފ ̇l/bx8XxL/"<1u4PuI$-s)}GaBXJR̖$yw݇P|) )L rKjM K.I'a&lX,C\>Z`龫6lh̘\wGp1hgo*jep,B$%u o9OTguQZaR?^#.Ò1ט4*xEWαRbנ5)Z\CSܥ e0dHJRrcK`dɥ5{)pڇ F(-I_:Њ!FzV}zb^k䈢QgK0%+[Pjt2`Bŵ OZfß@0oZnZxGY`Uc[ vdl_f Յ lgZR.@Jc"I\8Š"K(,f]t趩o(d6 F IDATɤk T5j">[ǘqX_7="zAjFLFᄻgLz\g F8sQL/ѡaµG-q.eZë%Ԩ0&}:fX%H΢9C>4(`(oWK0=4*:)șq>?ܑ=N9$axkQu1 ]ţ¯ɝ躾^|=3]vlk͞ݜR_y0;HYr :Xy7UƮԗ1+0QJ&􀢯_ &D[P+^ܢ6["kkXcyjf 8˃5Lv$B UH]0uXvD)@*>"s0mX{a []K2bf*5"K3f}[R9x8j`zmX%gE;SK<8uG C}K{d%j](^IA o3Xiͬ:AFzQZf(,6^#JGPOIt/J1B k4MMջcl&8vw* {'4RTo6 *eX3G:i8,VJ5u84ܩj&g"VnT#ʁ5-|v^Dv+}mDZ#h "`f HR$RVv؞(^T}rMR=vdR?|,eFyt=zf0)UDW"Z[,Ԫ S9@"S0«* >QBqSCe g ԰۱6X#m׵T\aѹzO畲+>y]\2uK*i}ÑGmġ.EęZu݋nÏh(<W܀! ]i= 6j`L`)^g"d)5#>qr\8([OSgRoݬ-%XJaFf#%Lde0x8g #5n}ҠbKxQ蹊Q-u0Tm"zԋF3T} Qzs2,&9<<6Sp"gx}^_SAoPH6ʦƽ׆*?@)=k2i*ֵq: T-UX'EfF  #drC?v}\Fؑ3u^G1[v=Qb3Ej{-E52M\go;=ci o8Xq/}Àk{3i/*Ն3U  0۫Q%(Z7ݘ*A0[ (mp QMXSUХaK0OL?)bscO,sIIW>~k_`ژmR$] ,RWk)^x)fd$(M\*D@Dqa'==?km:[ǵ]^H&[Ni Zc<"I䮵T!}&hkr/^hϟ/ n̾8x룬CGRjuGѩՒCU1j: T{vCBR֢妙F\wx^eΥ- JJR[jL5t5 )0Ԣcǎ/| 9Ϝt!D_C]ܣVl*E&s^dk(88ɕQ#{ъkKŽG3R4g+ߛ{4@&YD8vPN7$rnsӠ˖ՙQ6R[sF;a3tڠ#) x YH8*suN%Mo;nz8ȂuZLKȧDs\=椚@(8 oUU :vC9Y-=L`P]!DjWWi[s+Rq"$(7D"qղ$FKG%O) (qL){юRW^bHv])|w[gJi=T F P̄Vy|3z\EVNKft])VKEk`}r2'/ *oiӓk(~ F6P`Z'jW >mmq9OACfHy 'HaWMp F:Nِ!E fE=ĞhuOY.wv䞋J|٪Y?77燷ɊJoHC+(Z6R _Pl xypmXߢ $ : 0 rU%٫y1, "=3'ԯI)ٓ3ĵV/Z!KV>(jYkVg  QRCdob-ܩV|`zB u Vim6RmgF:J]'wS9Ps{$C]r?~r{'YʞiKR:lFX81 Rýe0' yrOs2dX{pֈ#+TxBsLŗ5a)ú*.@mhʑ 84\o+58R1r'@%xڹ3hB( ݙBc`V f}ސHEeD3ukGhE_+=D3|rCZn@t=c|5HU=%Olns.E@xJpgg`cc|"XcB>zbyhcv#:UjuDhU7Jp:^@Ajݍ-RdWXbttRJZSH RP4Kf tCYp Ԓ0SH1ԉoh{*Kf_k޷ @V2&&V^6Ԏ-%dgɖ_f/dսsVq gߜml moy葍Ç@xA&},)JGg"40k9mq| 8P"h14*($RT6ժpDQ2q?!u\{c($jU\j\VMDecW;+M{4_/3@Tܣ;rsv_rq)sk͝-;d_t8"LіhX2giFZJYu]ץsl[Lf}\Ǐ&q?tiKወ0&wK5*s13:JM0N/L`*AӊI(5YXV-d$QjҪ/!kA)b e0i1^Y3s8skE$b[:Y?u5n<j֯k6O(ۿ^m{Jcj רhsΙLQ?/\^ d6S{J/oIH]J]ژKJ~Ovѭ:r'+-u-!ZP] Kpw@֪M6N;h+VѬmV/yOP\_yk}L":ak'^|@uv}Xӝkkq.NQ*)Jk  mLVUhL)ZF"ʙ㏽X Ĕ$S:^$1#-勂% I: {N)KH4%t+:0G2CJ3KyW 7Rb(9w}ݼ]:~!;Iyg!yA}p+ ۩A*9,d 8HL ѥ.+;.^MXN.|e`jysȚ\0 ۫4`ht`CSbj# ռk .i読 R b٬CtYwlh׆Pgl-Pv5~W"N\_V;:T.C@) }'pp١Wsl (QX>eE--xCPxjծy킗Q{#q\nwa,հܨ]"^Ɔonl(δ&WG1@\k!Q.E|k#~{{{\1yLYW)=ewvt߽v/9|Tu)jSHJ顝9LDnT%ܞ-@9e)e\X.sB9u30 Ւ7}I]כٲ΂f#ΉG_q# ""O?KIflQZ91H[ɘ\IɒF{ФԵ x(msŁCEmyXJ?Eb"Gs2Dfm܎9pGp{9YNC9߸6ȾslR`(i dL<Ĉ68!^h)~*Q#B w-5v%{; @%Aݬ>)rwCMRTwLf)uO JJƮjRJɥ,Ur^澟]s͓'Cy,0%y{C[}I˒%3uf=’Oe೪W+Ѭx4L2td<\P!k0\rQku4w98~31AIwv凮hiP l)i`m{f- A<Eg9=kd| K kZP\-m#6F-g(CR^RK)R~hDt)FX54H!%vO-uܹu}uve/Yוe>qWœ;;eRr)Ac d_,lsagw}|KdYNFZQ d(f_4jH T{hz+[E[(rl(p@嗚zB<;[i}dTծ`—h ^Z*]BFuF0(?!SMgu-l Q!vN9AEpG)c'0؜'[ i*or/19fƬl>L5V4v) ''@\\;e*Ήww×^o\rcm Vc~5ˆqqZRj#* NpK)'9WF: 0S7ZDu.2^G2d=慊kgs/+V+?cB&Bd-QD."G[h.If}Ҷs)'N~sRYleAdk; pdO. # #}+_>zh䊖Rv%)KNvQ/x䞯m]rEښW=d& siDDs{غ6u@ZJrƅD6eyJzջwVVjӨ 1{~?CpM{fŇmš5}fTIT BCS̽bhI:$pre9{%/ݣɤwR Wb{2Hn}'h`V"jޡUA`R}?KGIlls~힝DD3/%γrBR|cyѯwe]?[j(둠aΫIXqZARG$LU7zGFg4]ݴmd/\OjHiMngGsNW\{㥽D?շÚ9BF]HXQVOXig43ձ I.H\ nҩH$6aEϴ(uJY6J*AYKO.`VI"’tIDD&DRr\r5cKqi}o}Uϟ' fYקX3/QKנ|nfRbgیs͑RG1Lf@O5Ygf"+٢,}Q,$o8 IDATuO#G4+UZ0a(^cŒ0,JJuG4PwL 5௔j4txa"i^6`W0CJ !@h]B_ xݰ~X- d¨:f4dūɚEhȾ%˼%(mWYnol>ߴ/}~'M}OZ{?<#<)N qB,jgMIiƦ-FTfz: cQh@]"gM{$K$AU{uE6Lb1 Xb1lfzyE֑WD?SfGFeVEv~3}zT+1(K=}uGf=3*]f='?yz~qgϟS{72.H8{eu 4Ff5mdgzf o:aA_w}UźG`S}wٶQf*V"ڥ2&DT )KCѕ8/P1kvlHFe6xU_Cύe,!; [@@JGsGpob}Ck%୧W.5 g>P%9)2ޙrsH2erHX6a]оGi Xޑr7]DDŋFg?n?|_-Xs@E{Y9rV6_,J ^NQAg= 4G *t|zg\#׾n!8l.dƺƺ_Ok~;f/X?&[Mlz}Y?]^^]"{S0œǟ݌KBm{O>OoZHٜ< ⌖9an/m8ᅡ9*Л5TѮqݗ>Kt+Q?:K߿ٵƇj>*6f0٪ DQF84D!ԽI0ӳs<ʈX#{Q+|~эYoDM~'g?7->HDNk4 +H:4o^4biîGG|Ͼ/7''`V[hV^IAZWzr#7(TN? 09Jb9gѽWfT-W7朲#/ ;; c ?opܿ7{7n?a `2'Q)]V`U7<+frrD ň}H@ K>h5zu]#zdfE( 09;vgggeͷ<}[DfKu|ifޟ={Zsw7swӳG~Ol0C=!*8  ˏT2aU+eCE,Q1epPkL VƤ.\eJ78+X01jqnsxG =H/aϞ<B^֟z_CxмfG ..Z.xp?*%RL bstW_:#Skh[kde%2G}OR -Rngg_?lv;ﶋ/$Jn]Lro_ѣ=~,˲Zkm{psp99-=R ҅4ѳ.9+sC"r!ӒFwvUx"+/xLJe2#$όpA2j71tCh1{3dL-` = 5 XtI }J4.WA/`e-صW+{ϕ8vwowTB9~*(s&?0Ym2D%r T8P?IMV%sMRdCc}Be n -'LU^Ur^hӳӳӳůΟ_~7mbuEts_vϞ>}ݷRd{nFvzyxK 3 6N3(m5 f)#2 y[f7-@荔ݍ8n67,dYm7zj|%pcG;޳bn}\ުi;l9JfoU*ف7f>EB4r8Yd<:!4To`0Z]_cC(I--RA(!3>^X36'zy9)gw}ݻY3r?};n_nv˭_^~NԪMgbmC gXՑ've\}E0fRW]4r犃stL3W/1F/3j8_j9^@2zΓzih/gD ;j(̂+MfN53K )Wi%J s6B߭=Ʉ'%'lBxq˳?G^}{(>?{̚2皠R\L}yŋ]b{ H6RAc8& %"Yw 5ړX*JX0 9݋whyG+/9sݹCGjs;ȗ[zJ6 F҆2Xe&˪PeyeǪ$'{0& 8cqS`1$`z~-sNԈ(,vȞk<{|O>neوlwk@@mH ϋz7l==}+/b22`̭GF~l?ۯ|=5Q#b_B=ݶmU+e6XATG- l^X26m_NVvhmSϟ=a7|{{ٵa+ʃ|`i&h,=F77fn}tîUH*X[B={:8sR Uʯ4he "3!7[v6Ϟ>/#3=!Kk{ >t[kj'}/0Pvof9ypƶYέ6ܔQJ)'C R-iU*'1gyvո{;8qn45PF^<1ڇ0޽m}+v~aw9s_^v+jl43$K̬fpVR9aYA}WwHU`*|>2Hdȵ#QkP*bPI ٴ椶f===&G.!W?Ylxdx䉤>Rqf٘SҠmӡ eY$(we* 8bQb(JRQB|* Oӊ5/%AȍϞ] ܵծKj7>|8Ls/ hX2O7/!؜Qj"a̬*2HD&M9nUO(XuU^ži˲,wIE"%$2kFg5Ka[lqu/.v'ϞxqϑG}FӬ2-$ҥHw4i.XYߧ=?i'gٞ>>=݇8ۓY6ޖ!k)#2#VD C1$QXFffIL)uM[qb뮆_Qf&")u$T,k3!2|Ify4g1+)>2w{ד=wbn ?`"to 2ۘR`lA4cE5vލ\|f0W, к9a2c3ve@,WCF RXw]]dsh>ًHE#D5)I]VY֋'R04~/#'ϟܹǏ>xO>>tym"S6^dF9Xhb‡U:T-u1=oe1x^̨먆=cc %eadןǨtޔݹ޽Ew=뚶}*:􇊿ړ1gj.cdӔ4j2ܜKցX• %d,Hʖv~gD.;ݐ+2SkFsNa+MQ(owmGFA- 7zr,t;]_l 0 @#\DEe~JˤYΌjJeRI'") x0и{}0`o;~w'W`ZEǿnfN7WR ,CNHV4bltbBqM PR%Z$2cN𣳨\f@3SKĤ(jö5$i|l*lId>OO7E*)ǹRszeF.͖怖5v뭉fSr0hq8.nmȪQ$K%N뵠Bsުpx~ ˞QV;\ceH_x'3 7qwܸ5~XM[7op2#0.SfT8%0}6*Zf9I > a f֌Q1#IoYs>tArn2{+,Qg<5"tAѤ:7CV& 98$FEk1&wnl7 fsWck jʉ8]N)"F}AXI4wy.Gy0`,jL$E ޶D@갾߷^˭qϝryom>`,pèj2VY1E㪨YԀҀ,M~1!Sj39$#bce?Mp$veU ֈ~/);"dVrSOd"PRTOipݼ5kn&妱Hm[##fy{xDM3F=t ε[A20:=$tydnnxz>vo?2k7t"AҐT(&$tyyɳ=kuy_x C~oGDʑMnѧ X3D 1%2RUCUGȖ To@cڌ8 g)m`2&%Gx6g&d )t"30oZ(k60ues4)b61jQgHhK,&uO.K[Y|>TS[CE=wy2huITbɷ4nNAT=e%sA$A ͦLv٬!l1'> úߙsnZEXHh lIМQY=j(~լ+zHiԣ=$d`S4n/xo]YwKR 3G`ɪOFqrnT25 '!/@HI$;FcdQnfޖܻ>$( ´(C̰Tn=p:bnaճ%2 4HH'džҀw*uyhv@M>wI#WhdmɌ,M`& fbpfnJ47qw6G^! kӅ$rvxk'ɻ|@iZR&a,~yz/:IR)$*3, Jil$$2"uxZ[ F*afX]y+k`VKeff2Y1c Fh6ԪݎѠG#R1.R)X=A*O,غ_o7{5~7¼E䠕F(k#}V}ƖfpQY:~ԑ^)f@"LJ! ݿt~⛮b=ĺg_>䬹O9N!Tj~"ٻ2{f5p/EB)V N2D*G4q2 2cfQ4%uU,80@*ϨF2F6 Yiڨ;[feh/`4)wwDѭd,W>H>H!IPP36 L9;ܼqO@ "jANw@A9ԍr瓀e0~OW)x|Uyokq< IDAT lg_tʌ) (bj4o#Ш9&)7ӁeKk͖M{F̺U2(8BaU*$]9IQЕ:"MGa1f&`KP@c ?D 9KMF4ԡ}wb]l!#Pb:g>o02ـ IM\9S9fr5P-^o_{A1vTKG̀U.hyB,,C̈1~RU !Bt6 $|i=#q`\ۍS*0) mLJZ|-f GHw>٪ !r=Z˒R]^lveFdCG3/_k#0fsܸ:7l5d]{/}7>7dJtrNڵD!ˮLD"8,]"Hd )VZ%cm8Նg$HBSl^d34EHNbN '$At*U&<R1 !4p]3)߯IJVJ-`\uG91ه;#R&=-~8*<)Q7S.w:Z"ZI$8ስFg"{Ȓzwe 36w2c@kTOzmilI&9_?ѸU^z`.MM92EzYԩA%H#@o%s?F +ybFw+[7,%Fr+VE  l.uyϗfJs>-=53F%%Wذ;b 4x}JI~~Fό/1'pkQ=Du=9=aL/ ǗIrd`GA&F9c4urr9;.N8$SEE"9=/1jW̬89g_Ӓ{oj*F}e^l!AioFqFg?Tko| ޴ <6#Gt4LpK(3#{ѣ[<*Q@Vh`¼yYH5e-Vd2FqY_2i!B.CYi)N(07>Y#ő.01szňkoIvٵ 7 :qDSa8 2$V~Ggfލ-?^^?۳_[o"V(N-)ԽSJfc&1$%u &qLMM?vir^xW-Ya/Ң[_"_(Wwt#pR!%* g~sT 2mU0ctsҹg26"<#SEK0-@Pt8Z3ɞJI@V,gv䯕Pس¾Rwi.֌^Yφ-LLLAak4JTE28FʄQꊘm<kށ#4>ڵo+d@H(k#CB @=Tdוoq=]m42Jc}j@I$3,2av2LI*ԾGޑУ4ZyIUfa\ڻ#}Eb}{9ux#Y=kH'##"s~&T2 L8š&&ᠳOϛZ27ËF߾]Өoj\d_"ԁBRjiU5LdWr,JU#0L<*OQf*:Rf47ݦF\]W]JD; a`k(tZhjܼגg  $,X  e ґwD-]صܸhQle8Xr5xDdFJ̴ᱍA!h0q7䪈k^獩i$ 3ro/ 1 ;z_-dMᠫS ΅LDG芪aV V}NTg3*_fÂ2#""{td6gPHC*PEO,D8̬9J0WkvL*! lguOH-; ~⾐iH&HKF"Č/($!yNA;}޸x{oVڟ2@]3kcr9fŖ˿[^/k8ra{>,& |îE*n"FNsm^LtB72 oQU<v3E>N Ym_ii[NI)A)Yb%Bt/|0mק➹,6qj%Kj#zCQ[HQi5'?"wGs_!sͯ?^i{w(†$A;kp;+SQbSU9db%`t954TP"'zFG%{=g&ӝ4zS$u][(R+%Fȯ cDץW^0F GU;@ggR Y"`Iϕ" '$bT Yxi_ㆽ~ɻ CoѢ+ko~0! 6z5f *4Sޣ9'J 2eTjH$7 .Ԅ[D*( VU[RR"a(!,E!U/gTӄAe& dYxH Y8콱Z;)mfxŃ!f=9MPr&HݽּF*VE"!SVL;cVfdKh Go@͘ҙf"=N֢SLo(*\FӮi.3I0PTl`>I) I a8CҌ8&xF+Kcߎu|]=vnܑ&DH<?jb)3(Ywl9~]EFIEd>:P; p_$]>)VHrD)_LP#(J"2Sp'%3.IElxl.‘$S(U֜D1CIG^иrF:TFsLؚ243qJ4_9BhYț)2G ǖs+6(D#sRrٵwʴ`V/_95P#2j(6Kλ D- $< FtfQ4H4 hi]BF7@29Iq#oA4jlϰ@0YZi10'Pe7miC F"Z\] ҕ-~hMa6¸mڎo7v!fX/ӆѝókڨug) ESst )͔-ʐ60 fsyqqq~ыbX+QzLC^)TV 0+\U Բt~ ^1C=% U UhGTMF9YkL3s6~{P9FY1ߏq#TXI 1)N)ݺWop=h]{^re>E&U_LLIYj١AVgɬ Tbk=M./=224 2g̛#)^  +b0Xꛠ6$47YRezH!<t].T^ lYI΃*s7. ai43:hdY^f=OWQXEG"lG}0Y^M{. > z2$G9xL{MW/oy~x֛`Leh4S›JALdR&sFZnft2zFmV;|SW.d"zz(Zqu-mPf?#{15b«9FE2T˜F%Q1@IiI BdLJzN z1z̠yd> fzź_ۃܯ4Xn2.D7,Ww6kz}UveFvHK5f-hf{&U M(ԍ9S=/VnPQ`(ΥLmqOjH $6޽mUAk8^D[=tB#Oo(PfKeaVN[+f/s@l{s3`Ӈ'_7OkB0sUAʵLȚWݓ4m`!)0Md 5Z"Fk%z<$07fhWi@!,/Lf2z/f5ziERffE m=}inN.R%ݗ/ۓ~NIl&4ż-Kآz_)W!,q@fc92ձ4X\iu2٢tSKbN"2lffEB=nHYF06pm5޷];XЧܼ={b璼 2p d=_k^|7F]x}bql=޲Af#e\֡,^q5_ūׯ}W#<|~3G|PV믙]/ tp:b^% ^ HrD%^7)w5/aq6s=9}NG;c}߽ܽ9<_7lʴNё[8[{tT+xf^y>nxKCvۼ}l7w0n6 /,^|}C86k_ӳ_d Y&jfBJ"0B4g3 %_Vu {Hf={n|]MF?|`{bϟ?|vO=z՟$yzrѣG}?""<ͷ\^f oAFîym"ߖtRL!Rq k~(xO=_k[|7>2$1Rpbݴmq7;i- .ŵX|60՞kd$Fs2s_hȾwjyn)FPA{ ۯk$Pv$gnO7I;;;9=;;;;=[6t~5ׯ=zB5 +r)T !^WLuEm.l9\UѨǺuݯC( "գEqCZXkx,3j{}q=aD[6g[o^}( EfO|IFPXwO~Wߜ?;$o!".../f'dY6?x,N<8}py~Gdo˳OO>z$rg<|w~/曯ޑPqYќFwZZ2,NԹ9`z,I~v_wx?ip;j;g}c!,2I1 zѳԑ2Е{DX3{f }0!&TfATei@d&C\C{ESLviqe]k_w~wu]ܭحF]h}2LN-*I3Qb̕w5{u}FfDR2RZ5sDFD_CP1P]EW"EFTW.֞A FD+]Dg#- ni٧׿S6<ߟ{~]v{mk&x7_7~vmg@Ťnޟ]{\̿ѧ?;pT8h>z JinܼnWK, 連1Tɔ\݄mACh>ba9vfU+Sy`$O ϡRZ̅O)-ViD)3dE$ޖFyf4G( (AVUYV^d~@aƯ7PKQv(̫Flg?{a7X_?{OR3{prz=YܝkFӳ>o~|GnN>O>OϾ/X6 &0}},] 0gi~9sr*W)rUcJ?nvn~n!`O8˨cJތFYW]銫lfnVZi3=2zD QQ6]3F5C6Hx'&ʷIHYʓ >4M ,)?W& kf4smZݜnͽހ{[:6BF9IT1~DJR upʯ#5B}>Xk?l ]\?Oxd9;=}xdY6;3գN7'ӧ__~~/_]8pzG_7q(n7|/Ó'-e,7t澮Ryc=lƭWWfL :mx`Ga?&1+ IDAT|}_]gۿڂ?;$2d0A5v:ute X!D%ggNigP++K>¶? Vd5}gdeŚ-KZ[N66-m֬({EW:JUaìh%r Eס,r]˚pzt,aJŢY|1[dq&EZks~tw^i̫}weӯV%wV]wYrffӰ_lz׾wv)o4>3 {X)^ۡeZ1StmyrNajj/7uO_tBX ^VWa8k)R{Ìk/{ǽ'(WiGw]Dx<*1^K0zLWҕz))P+nVm *4m-HC,9ҥ:VRrb΍4LR<@ւ%b$dxSG4Wgwݹxm!ddZ;1-0 \JM$ 0A)IJ)ӐH"DFn m5UN1_r.ĉ#T7b9E`Ĕoݸͯ^ZRaY[o9OgI]]N]Ϋ;׫RȪMכr0\]p{4}.7xcv)盷n_.֩RRL躒r0du~zvx;[?RǂZ\5@i iPiҢ#7}9kƞ+]9b:D9ăXHxh"6P$(pDiԚEdP5Uk5ԴVo-xoُͩ "QqΩ]וnUq<@s=i hB5ۗogȸ,`1 N._Za3\ˠ[X $D 2:@$,Y$ܑ$I"il,~cuhy <%.9rsI‡\uKf׿ɰZq|w\XHS)+eӯV*qJXDSRNVRrVq%7vsN|wajdفDrR-r5ӅaeM`ժ0[Ai1z޸v&@Xx(R K|IN, bi@,m/ `iZTs5ai`q+t4'fbhI9sʜ30Kc3[يì `j\n52ZCZy} .-cGGm1yi oWő$Fb4Q+%sr*@$u)PbƊƓYr_?:ll?i"xn{٬׫t])z}ׯV[]U".dNJ.N~_r>8:+oݺ1wOOs)Uo6V])"QVfta qfI"9K9DhNOq8=:>>::y}Û7oރN䰮yAXWv;lC3mAN-'abܘNď{kO[/ק536u)t# Z0!n #$qʜ¥ "r&l bڴ5xfdյPgQedD4u㱅B%`fb0ؙ*nf05Z'؇>ܩX$%IR&NqBRR<:ALGD K25B8;}֝_~s֍8f^u}R$$ȡY sYRKu}JΥBlզ?99y~34p~?萙id7=s@vKZx<}P\>>g jOuuN3X #gi+5lԉAI23Ř]aսHAY̨Elj7-IE"cL`& 3$ζL+ {;{l!“[XKQx n#jyUWk=Goedy1,qUA4!$L0sZtVjp"JQgC%jPCw[rZz{eZ ϘF<\*~_KN28:<̫n}.)zghfZ窦 E <<>s9ũx]u<|irtRb{In@a-ևW Qzg܀9=`[<7Z@)nf3 "詵OnnZ"rϱbO@}vg1I\ܕs&\V٬HC 1|cXg4ƫeQrhz5E]UI%vN$%1',IzWF[ΛyR )!by5WjV]KEDd 9تR0 ̜m~+_Oqew|LҥYsJ[zUMkZk\C/TjE:ܳd&a}W'ׯOfGG4wy$7ouR:>> &s)egb'}$Z:o*yZ϶O^νMS?}~CxcD${"Rɚ;NjZnիjpZ[s]X_Bqy,[I#ĭy<30HZ"j\R))'aj>  CbW2ksnY_L A0rB70 ` /T@}O -u80g7w$昈%m:fşlv4u{v>INܕs)0ZA֦lfs5 Nr27k~ls|(z9:8_^\n=<=3a:?=?\ %wM)֮vq}ݻ] !KP[@xHɄR<^>izmE=?Bى $ )\9;h6p#2nsSaN`K828c`ݙ)VwgŰخ(1#nYTrJ@BIYI.f psu6ք'w'ʳ{r£5Y`fҌ)QD@wRxd PUK8ڴEKHԽ:9ԁjnnLShs4Ǧ1"_=]nF."a7O~kӷޜ4nw[8_眻-4=h.aʾ08h@ 3r6lnϷfS$v^ҍ~:?;峟9<::?;#b ]qJyvN\f~|p~qVڐ9vAprnHG۟~8)} 㓎GO`" >s&UNZ)HZa՜Ĝ98] & _TB)sX2-m";Q3$#OEx7P ;R.ky0<))PA2 X \8(WmX;("i$E#<"`lGuy,+ss5ʑR^ݵ!fs~~{~~z~q^z~qQ9\J)Ơ;Y#{Mhtf4i5l9J,aw;Sf2y֫iv ߬%f]#WiAkR=<<*EBeozl;=l|[cE{u?R`zS}.}':- ,XNoFђ=[ f{EMb0cjJIXğC8$e)]W9w3-].6sOpCU31A&j&ȣlz͙``3[m;/2nP*yc}ǴR%n\|fDYlGH׌$26YKNwILjNf !΅WtuʅR&U-M2BkےyA5zi8)V!eY6)$DσB !HU0؛CUv;li ^\QmoH$gɝB֪ڕUjub&fc3r#[8jj_Wbku9Iɩ"m+, D& <s! p\ ^kAa 0O4n6YEYrWpsppp~~Yotۗ.M\Jђv?r1&J!FMgL?ZݍBR-"f"sa l~s///"]=?|_T2HK% @0 . %'J !gRfɍA#W 'ұnw׮t]_,%kGGGe iY`aT~Ws5r<)1hq慷- 53V:`2l'>qADŻ{c7Kh9O"b*ԃyh,0h='L{) K"ڼPEpI$7hug3ZcP-ee9D `f5Dꪡc ^`&Ⅲ 8nvB}) iK,H٣ @!7nFpPgjj L̒ IÅIJI9yVstg>mky>33̹!nH`#7(K N)RU_^\jW23o'Epi>::|DM)}JRJ7̓a&́8TeIWZ0V%%WuI qgڳWcm1ڎo j#! qb16!1Ğ$ ADR"N!"RyVwYfNL @tW8ѶYz}d#3 *YX-~|f)Dh`N&I2xQcGM=2"˕Ѣ_A6v_T6yIWCFDXم"_Tx݄Yh훯}v0LP`ӯX@0$4jA0\8N)yil¸ S 4Y2s!ɒJ.YҰQ_~ 8v]w98;iGaXi&֙9b ;yhWXJ̶f!"ճj]N&0\F {#fptCSK~q 3"iwo i\m OK$҉vFN$]'ILqy2-j`!!F&d1J.^]1qrμi*HKJvrzI"vTj1h'd sPBܺs ZZḾ?uq|aDq|?W᧬CǕhrLɉv'rn 5b73VBs`"]0mTjV!%-C&:drU'`$18$.Nb&|s6fVYAtrFjĒԪM["j,B$1_T Seq2l HR9 9Bs ;ȕ9f;J (`Շ2mG-yE9,⒙PJL),Tya~_[wxG?ۿS*t|փܯΫuΙF9p3y8UHr.:jdՓSJuM.$q)EL%,5#-"n`uxfUh:(3s8!pF򈪒\JB)Kf`HHB7#z'0pClS:`@86eU!&5*i`W\u1gRF}6\:  9.%Lg #b3%RZW՗_q{o3MJrvz6\|[V}Oa7?i ԕﻮ"4 ^Hck} ?0;}yS]vծ&3iP &nrn1@f5ᨨp٩ěZ]j%]971$WK(0P4rZ  $CxӏP' @,j!1goݭ6n}{U=ñ8M 1%JP4 SQf!fDmQ^NPQ"I2,$GXYgV}_}޿ރ] ggpsƳˋv7i2BuG'ǛՊ Zk&~BʚMNURJ+"UhU{ P) 2jZ+唄4,;@j5y>so&w̥eA$3"AK M'>J, 'SV¹>*U90 `J¶d9#@ Ƃɚ 1M5jH䵉b  %Ȃj&:SSFPR*ʶh HJRJ6C lky %aa6fNL^3\[k 8E %\Clw.MkVz$a$̒(4ނ PӪsMD µ|Guemˋat}ZV9!K*9 ߵZ6Gժ)1sr%fuS( ɔMu) @,əW5AAUk4$"&G)ED湺KX(ǎEtr^d mﺩ:(o 4 0Z]F)Q{'՟G<'/}=[A#qSU_2IA F?Z 0q%KfI$< ccn ѐާt '" ԙaT֜x9`V"IRI9t\[Cq q'NN)9Aݴj]UVFhZ,% $WwTu̜Qf(譻B ,9]KIXLbUmYq?P'U'e:ë]?9YޗySJ"t\^nw0 ONK.ﻎ͸F4 *I \qai0ԭI++5-0:眘aؕ"ۭ:,I$B%si.ZTyAqXUS({I_#_DhŵXWŠ39B&`s7\Qmi.qT݄jub9,̈`(=6H؊[0EW2^pUdI9~Uh5[_zW&/e!r=bg31bNh15I Y^]p6%SuV&uHłUo V ?< Hs-eD$Rx]iʥ@k'n; Zk5f8Lqr|rrt\Ӵ~4WJ"i{ש]^zL$Q4Wu4Yfi<H< n];f\8N|nYrG3W)!Pd1Z֔_$Mà ø܍S8\F ٝ]OTUi4 Hf aaq $ 1DX?V\{,@|$kOk :&a4.NCq2$-*M 1Tb:kؼ7FlͲqaoQt:S$\էRLID. Fq$p&Oyk K &&FlQk/SB5I« 1.-ZG PbJ1N 9p3?~+F6kr_uz{Mx%WǤ%\;:xW:nl~VR`AZ-ޑiy^aZ ]]sʹu]1NY=ib@uqJ@)ySfPg:aVz_nw++߽w^.ag?ߩTEl|Zrxn^;9~@%ӳ{is0wɔ/vwmr9Zu]ŒRWu.ig=wXUdbNQWt Vg8LS.'QP^x4a af{RETYI""2$fHd:,bQx8FXoc+Ll#T] x(Ix:<< :YYUPD(5?*u3Pa I\-k-+,/$ILNs,땮L(?V$nza NE-IoO?'rKNvlۏ7^/ݹqxs8`*K/k3yg`spڵpyw:s>:L9VzsUۤuR55si_뤦t)4 I$7:_ ܯr)vfFP6[qߛݧq)4WodCW3@JH}W0VN̒{=oFHoxB 0/A .PGt9P~Rq>K@=QLj!ΜB0Z96`1-@\2 s&|P jx:\_R:KD8qht"ZI܍JZoG?ʗ|`ܝ*}a*"^UǚXnߺyMzxu8n˯lݻ{-Μ wXV6}uIm64Ȝ8LœӺ'N[(|2!ܕ,b\lÛja&:ϩd!2a_zar7Ljb[pv~r.D"+aC9KdILBshFpAƤZ@gg~~{_ϾS}뷘׿.dUJɉ!Kʜ~8LZD˺/R6k'%%׺]wꖺ$,pstSk''DDU8w[[o \rvRXhgi:\<׉᫮'n;JE}UkNM e\9ژSO{9;Zϟ}jճ햛0.7M46$ ^K]ͱxF2%z̴1F=c_\ e&Fzj>.sFMWU cӓ]UqtzMj)=쟟}1۲ ل1vNh\V޿Ͽ_9;va?o\{ɴˉ$4);$= jUBr*LfN"M̬jVFk&ΓqcLa uݼADVuK9$!6Rrߕ˭ZV+e? W2ٜBi Ƶ^Z3m(x_c]/}|ǿ,?H,/)2cs9s1"a;D>$_3bfUM@R( ")D<*b6)TJ'4_L|???j5 CJ)>==W;; 68o88...,ٟٟ真ED?7^\'X"lU_v?\=}8{!~~a>OS*gpiJ.$Ҁj3KIiuR?Wkn\vt)>lجV]aD8:tJ)cfU-aD܈t0>xx;YL ȣƈX &H /J,g8O9<{`"<~B)PHn7-d_•uJ4~j,IRJ$Er.%Pm$f H8߻y___<==koo}WWַW^Ν;G|??w~p^|~ю˨Uk=Eh`FƠ}7UE`츞l{uފs_N`@\I)su]DGRWQfL"12UE2XQ4(vek+H"u/|1WUA@O# f68EYhfŒ`5'Xr`fAl;Rjgh"AnN.J!I`S=W40dDLLYR'IԇP),J5HJfr. `PŽKDbfK]n!yPsA3eS{yI,;5yu;F Qo;WQ .u c/@;N;t!$FbC "SX.pv!0F@!1uʷ4//Cz׻wx~ݷoߟٟ}x?r^}cwqOBeYý{~}~l6{_O~5y#Oef1t-\2 )0HF EJ)/ykkYN2O3b(t86!bfb<7שd43M@U0ˌI)Vi%圔⌰WԺ((P"RjE0qUW׵%M C,{؎3=g6|$gvx\ZD(pEp:.Ձ *hhBnPl (FAI V`@Ƒ 9rTQSΚ%甚,*QјCs`&%$̘(ڶ-r>_pG%^Mp3OK.~m{~\-C IDAT]Ó01#3"B hfNB擶l{45+:|fO;p_7r.ys?z_ahrrG1F&`3()3Cf24d:9u։lj2^T5YEESJM=L';x62[{YuQ/ffib(E]A*hhu]/Ty0&o 03+"a &jdhG=5?l%׷{ yLG¥lT{S(CCV NI3320%%$0vyoݖ-K w Cn芾 `.":Pժ˲DDI;رc+++)b{{{eeŖ !2"2Pe$kH^'@* D*n~[ W6!LvGn>pޛѶOl^Z+bj,E@2P76# F^P1EL(^\mZc\ܷpi5YܺrnJny49)-s(x# M-1C,E")(YN9ze/[/>: q 6bfFfDB&4$ CUn;mjoOո˥f:3ܴmn)"T6M&`,eeCPk˒ˢ jI:]`PSRR"e2P+cBXDF51 ȧ$g>=5 C__bqI á:  "!uBCg\;<$apA'.Oc:9<{Zfg2ϱBSNE3VofUѪi1]_?l8ܷuȱmю0zahP!3WE`,|>gO{ڡ~QADiYmJΈB,"MӶnR2 U1q!ޜSjڜ6jiSVŢ+!Q$":\WBAXqx=:0fy낓vxQ~ Ow8q3 )u``F6C?{#'_NNnsU [꼺=54.l:_:D#)yegK]{:aJxC!׹ğxcPRΐE bW\xDPCDP#p* |;vXqePBrvȠzeUz_ԯr#. ߊN} q{gv.. Kd  tiE̓D$ :v N` c$234[5.yJD7U[^9)e blW>U/{#tUE+bEQTWY3TtsY9 KnSr !լ^̦̏d:]cӺj^eTӔr m  TXMJm,0GH&ԈsdI鼿XhSEUm^ot5"dC"""spPA ̖!*d*vn:=|km>AY"sRC/'=%g5ƀhKZ3󛚚2  .'R40PC193jeZkj&4;O$He bi0XT<=R4mZԽwl{s4ol@N98"N ^+9Б;|ウ٬, b2 mLf1AY4KRCt/YSjIZj,'2ӄTuMEPPff⺩QH ڜ9^h]UI!(ލ}M}*D`Zv6  MA$!2CX*&]WU:8@TD7菌Gcii:}DjG3H]^^p2|<:qbm`0dbbWVVÁ$ =985fYZ"TUÜt CSD5kS"YDLZYrRmRۤ)fѬn! 6_gESScH@-GM$7|Ѩ HE/D_jlhhbFMskgURIzNRy;tKk*k'8әywHx'dэTL+]`=b@nf$#w0D LIE-E`db>~b_;lΧisJd1_/E/zQvo-| .awހ}bkX0X~m!窬`lشX :xZ(Mm7MܡT:{phEJUC R es$&$1rW"@(J̦y&.fp"ۚI6bOǹ߱q1^LomĆng`znB l#]YI;ȇvnW"*BD* h".@IJj)(*|7)Z:(d*%\Rm.{kfX4;j/yŏ^|%4.:t{?z#EQݳgmeuPT$X**69|jU%^ѫ~Pa`= +b2\WZd>#4J)ką$-2⼆bw8O-XH,0 M"gG`p(eT7FҒs wW: 4l8w^ċ'kfSTtZ ց"bj`Jr xta]HN#ΊI0L@hQ0"f1Uh C5%T ƎBdf6y^4|2=yB;W=yW۷mhgX4h?Woyvg %1r@$smBYbV$z+aY@ADZD ,(椐э좆n$k11*)]@rΚjnW׆MSJ$v3o@*Ju $IsfC !PpA(Jj b(v| |СCY#RG:ż~t4N̔(BD`5PA3  r!D $ƢBM隣 sx@^lu׾v||S۶WW^u%_'ڞM^gw7<|=ǎ",!XTUETEÔ%62 {CCH۶N)e1He],'Z1=`f-giX&H4T@s7Κ (e1CHټNI)n t ĔGl=|K3sPyDDYG D 2w9%)Q*hxa&;sn/BnSTS4EP`&9""):eSJeYʋZ,{])%WM)9\'i*".`d $~5?=,*Oln?ztb^B !<mz 鳟\0U%6aJ[1Nfz4]LP"eJdR1ČVZUm&)RI$e׏=i9e5UX۶I1P@ nM޽$bSHbGuԑ:ZɢȪh%BB3P ɦz\OZ; x}r?qy J`njHLeݽ-Zh-w13S?ckhSڵ` #ShS&p1B`@#H]F̨J.yֳ|>wl6{Ne?v_|u]կǷv.mKD/z -}4#׻#f$bW/g|OM{mfhkyx2g30l6:qbe2(Cp߾wd<%mjd2lm泅dm0`$% ML?WQP,\-E Y\"Y!B`LЦVTAGNCUSU 1FS.!0 PAQ рEl7>Bu8^O@=qI[~wB DD:*Itb6q9-D24Xr:] RV'E,1@ 0Fc*C???i9/馛f7tӛ՟?Ͼe/[U/F)!HЈ,YȔbƫ2OfDybxg4:yt4նi,yg4FkfZYY%AoPU^`xWw~s"lmnQ(*ZJ9*Q`єf;@EN8D1" 3@f#V7pynsJ c C$QYhED,WWVFYn-ֹi'j*)%HPG5OS<~r-D0@r ~}S79iڙx'j ^A!!!11&}6%׉ac@*h W$~?o{fѣGg[k}Ӟkn8rȳ/}KN8ַ_Wݻ]zǟ:Y4t2Q==i]['dx{{>5Y,WH @qexȑ"`aWjo߆ (;a}c}c!M,imj&E=XTrpvmhIu眓e61(39 OWƥ4)-a1|h6=&!}ytd$5U7s6UM) o>wu77s|>;6=pO:yDU5fاNp3#Ԅ7 \{םO(-ǣc(bZIDH;CB+m{[oqX\q]tQy05k>\tE!D׾җt^\va7B,kj4efy^7uCIy6FMN+kx&H1\߻o5yئ)cU+}{w-30DR$1E#CDDSs-2KbD{>CSZUq0u ].YJ!#U1B4A 䧓 tfFHW%CIMc}܀#Q tƵs74FD0d\[us5TYK :"@"P@.b@Bā峚\ECY޶ϒmZq\Ue!%zj۶ibٌbsf,NUUŢ,RRE(;i )p(0[~Q=$y6|>UJʈhL!H!~U]wT6w>RiJWe`O'^Xht>[,ŢST(FBF \énrE,jH`ѴO7A { @{p/m4IzE],yݴܕ`&KOi* r&IE[:bxew%w;7.}Di2z \E028eRl ֚ ;1b`bbdv )A|gO(K UCUfE0 N(rpПO}Sid@(2F4I X$-x:O-t<>r0"[[" ,Bng\| R_o~ߟs_y?%I7NkMzﯭbQMLTikuE&bvY,9mեs,)9oLvvR`^^Օ_P[եb0oLM :vw ec΂:ãn8B+.MN u`vl 'mL̨ΒbDg"$㹣C`gljlArwM IDATO33UɀĂRo׷(ue"N9bQVE](Umg4P6]|^y}G+}UW\}5}{^CB(42mJʢmm*+B$"SJmNYvB ]9"zUXnEH"1)ϿEqj1b'̈3o]n03 F&it=B<:3DqҒN@~ Nҡ|st= ssLHltpY:t97 y%Sյ()9nMb6ួ9뼝 rNlomonmL餩EZL!#W6M[ےSE,uֵv_|+/CQҗώMdmYI-fȁ$|eBD60eӬMA$JϋPjJxy  Z/ %+X82m:),Kld(K4Mrg] . ۭg87x>s `/8~8mL^:FB#Qο߁FC| @H8p1jΒRpG&!-e_(+brxu)$y]/j0h쌏{}?ϐC,+Hy6ܳgxżt=<Wʫ.{8rC߹*ݳQMTeYEDTu|Y6%isJ9ۜSJmʒ5gmff4NfuA]۷ouR+m o*4M""R={ LgEr&5P_U .Α^>pkXbMXaAxs~3/z4GOlݳABA 9)e1c"5jU6u6)$)&is΢"Ylh&  "YݻQu.ʤFʮ#DTUU b~2ogiݴ.5 f`D4=['jp.3Q;',ηs z֡OX } f!<]2בvET)AuTکO%9&O "(%ɚ/1ECT@R#16xp@zl^7mr OE$|`h(5K-CU q\p?vٕWm WGirs=_?vt}uxA pL5HNuIm53" MNMnsr,mJHۦ,%۔s`{*pK (3_Y׫baN&)gUDd t- y>cvVsKzƵGׁ̏`ޱpdzv+%@T}.au Y<"Þ~J.xڌQVV.dCizX!h'i3cPl h2O1 4=e7,xeqϝ_~g~!'^x:8ʢ(PL@p 03gzu ĺ Ի"+T7H0e@|JK*tENfEO ;X$: L̥[ b%31Xkg]솅u3ˑp>JNmJY$m` "iueUܨB3" Ny4ohm"n&{<&"2F=N9Ue,b 10fS5#uӶYLD=ydS/#"k"pЅ^?2eDBDlHrլ⵭fbecD\'IYD(¾=k)9L @>:.YʾI/]eS e\;۷D|3 @=åCyPԈP=ޙy2  &/ ;Ӭ\D@.|TB)7)EaR;u!7*m[肃ls")IIiY]'E 3s,8DF$v:h2/q(`,V(ֳ;*1@yt-(Dvg ީEum0nQaBE[__Y] V^f1XgSQK)mSe$,* b5mڶmU аHz0a&@NE:dX ۘ :~|i:v3x=Cjד(kcYE).8mhh77G,D 9 D4kN5zJBOrtsBiֆ냪'fuSJZmYƲ*0pF UP%55 -$rѶ߸eoaڡtZ7I@T d]MzG>zJ;}3k:OhȆ HdHLQ&8:Sfb D̅]:wD,wL}\55PU"\f4h4ڽQUrH۶ymsn|:^s50 6G_fV* Đ!(Y]G?^UaP+*ʲ(cQXH (a AŌ"JnrF[SU`#Fd@NS""L͘%-}vR@+gKL@>#/d1EUŢuEUi۶"&I];qͻf&,o봵9M!t*xL(}W.! |T}N垘|Y/=ds"\sUttuR$tux4uju7XGPu1Ǻy:GwvvDo4|#7pCS!/|~o~?o߮p |M7jUU~ggww˲җt__zYGDzp< E,Rِ#a٫Y5"( )biۺFiCj6aw$S|vh#ETL50fpXe(s$*6O̦3pdϦN!f,9. DsӢZpl6,bݓXT0 ۣosa.s\{ЧzF485|ɻD`>b=s Zd`Jז9 m7VzֶD"஽(AAQOsUA7ys??;;^}o_bqO~~_W.ꫯ?=NW~/xW򕝝￿,˪D|>b_~u{ 7|^c?c'>;|x,MM2 P /UU3A'Dt2-P0鯚R^P40h60IiDi[H+f@jF*b+sw8ۙ]ˏ2=֡U枈u23wڐCzщľ]9"3: 1zHaI&HQP<ɪg8`CW`'{a—}svp8|6>wi="rwo_җTU/rγ;СCkkk{=tP|eUUsϭy{ލ7|ƕ!7__cǎ>|n{82]yZ{sԔL "^4(*z[b5miOm>z+\6pE$v@HRIj8kxk}ΩT0*2 Uujkg2?w߽hѢ:bGHkI{O8@_oO')K!&KuڬWcZ:+AQIDI,eggXEff9kݺuȦ.ՍD6UJ % zhǕ0y} mBzG#je#*RBXc^4Ru.Dՙ֪Z_9 qءqġpTYc&).#>7f_on%P3~Į>n~ $r,)sCfb D$B삟 HǺ3UBxŘd'rQ|)RJ Zx2-Z o9VZjժM6=6lk$ټy}7::z5Xv`xx__.Äc/9$II),[~??,X^GQHaÆ/}KO>m_0 ,/9e} 4u$ژ4m4\);$# ` kjm8]VK118N$QB Vf hJټs.3$imII mS$r4M6̨jб/%B clL*eETI&qR*%q[* V6mORQZ;pft"vƱ;R!9̅8$~kzm_'ں7/SCcUXb!'>1!I–6D^FHERQcqUJ}w_[x_\T֭[w7va~Kҏ衇N;JR_/[/?ׯ_bEǾa›5k֬Z޺uwoҥ5kRDZ61.N(&0H&8)Eq9$muf2֛& ̹Nmlu,REqS&@Bkg5|"2V$ *G ^pWR)RJ*%T DyAR`AfZ˲HH)|lW46M6zd,JRMRO$wh6qR$gUzfU*C}=ϝ7^386(ԬYIR*~%k”QS_;̐A!j>! p5o,@+wa}~@h#tRJ3y&PCREJDi ĹMBy5W_7X̚dDoU%0V&2o[Vm&T*icR===[n&q眔{h7p֬Y۶mIӴR%IqeZk)|a "pLMErN^8dLV`mZ^kjV64e8*+qHRz1^hfVIE$xFGk hz ƀ@$XXEJJAX~ Z˶VQۚ*/L0ƤYVOz=5RT"g ?9JI* 4&kV?LZAʡYs?@YJ83+%1cU=1k`<0wp@8VT&3c#57{^[ni쉧W?aPNKxmF3kI'݁]Cwyذ&"prA. \ v> !i ˔$ebg}DMljfr#VJ&REOR.XRYL:"ѴٌgGpVP$II%9qo4z6Ξ?w``Ja7w_a iUFkR/w{줷ao;%q%pps@Di0 v>!eX}+h_G$R;&X»;Vd ǎ3g $">,PjX _:iU b;ܙsxo6NE ܶqS\+mVK4kX3MjUV7Lf2cX*l9imNF#qeMMGU]:3$A~q5R %Bu*2E;C Վ F:$8.9gx%ZIJ% ʥ/%)FF6nٔY$nvBQJe̺5kSZ| S?>YR!=P"mfLhgrQ0G1T^qx* _0[&E.l̡!X\$:% IOBIH I"(QKSxQ0 x IDAT }}R 3f֘O48z[GƪY5CbBeYmv&MScl2fVot~ЖBY , TREJ"dPWB5.<(RZ-[G*v!YGzjBDR )e̤e0_fdsͬ ]|Dm"biDV1ވ8Mj[#R JP\I2k8N,[kcRknTvƘ<"^Y cT DB"o&R(%2n` O '2oZ` $8IR8뜶Z70_)9FhLkHHE*IJ2Ri:RqldM_6՚c)E3&q I1R0DU$:) ")HIb$0ȅ%ݭ`&G i-oٺY}q$dq{wkG"J굦I'TMn4\QڔX*dv6ų.zjZ7g۰axITX{%!EyK)` E%Q:^ʾtC >јH#OO=ʀI-RIgsZZH)*{js9ׄH\J"!Kq2v>}c$3kظ͌$qPLgʹ)GHĖQfQ:ga,tzAD!^j 4]YP94|`.)|ȴNo>DvJVD:fB0`aæ&]aାكJO%@'JIa Q%q{F۾ʐ5eHQ%Rlj'ȶR__ YWRRE*2kqri2Y,Ia !ȹ]gIA3տu^FyȎeR0{Wz2q:[(5J*! Dp`XDA!Id[88gJȼDRĂ""$HX4ӆ.3f5$Jn޺7Fs,RE0LG&igPX4Wȴ꣣ͺ-}=A2x ;RqYRM(9J)v%Tug缻\68Mme֑EМt$,F꩞J H v6JFZk4$ɨ erp۔ ȸTbijeaFjaXh},1OMY.NLHDHTz7mI]֨5,d3n -t*숼OUa)/%u"ft[S0sse5ng$)%!"!?!Og/| y#<`cG.JǾe9C^w5hcBMv!k}`otαsNk3SP,ʏ;ݔ$");M ծ>@}KNBx{eDPoxm6,SDQD$i杽BjړZ-r'TB@ZU*=RI\h F#˚dLlm)`J:y~s0~9[T*5OAEe0;92/T:xvP-Me@oOJH)Zl42mp;!iȅ,cٱ=C>Q~rΰ8~ !|oI,b@ #R=XJfIM@y(|+6q"q$a4x$VJ$mQ;v*,;(:acs ǎH_m7מ.B! ]0,5e:;~vBo#}Crj-P+*dc2[/D9ˡ<ݴՄEF>!8bΰ5ZHHH8yLnU~Ṗ0%vl[_;z3 !9clqT.Ǒ֦> 1<IW!D\$p.*Rhlш8/EQlLfSuN)v-x` cK\ IιGjQj)rm?z~3Ƚs0gq)wZm7)'y³nY21jb, ·6B^,F"5#}M]ehH%(RiO:W6R:UEdYc+J6S4mf(2GB2krNb 5Zѣ o5 [P*P]~߶8fNI޳}bj9(cQg.=S%׉""ˎښLkm67\i5̗-`EEr.ZZ+Tkš2CaF0rI1XegӖp*p )9HS-DS({{*pfYPf3-DdY(JJe_IHb+p_dٱɘȱc$BdslWBma *ž3W"SGWtoN#GSCCgy||zzz|1?/f;666003{ö/ADZ\.D8>tqfksWRu7l[ʅ?,}cF!r$ų/BqŦ>tcZy˗Ypxxxx;Ri~=蠃,{#kx!`ϙfsk!r6qao6[&yށ"DV8 L$5"" '"OOh6jmVo4L[rDcb.XgeZHi PW)G"A*VIJITJ8H ﭕB*_E;#Â!z⤷\IJRf<QO~)l„+xkAi.6 plO-vCv~ a\:D.M3.Xk'>QT? /]9wꩧ6͗ygڵ .|gq[l9s. i>c>򑏔J%KJc9f .G?zGy_W(Zz 7}lΜ9Jy]}Ih4}E~wcB? 5V""n7fGN-KK!"!($qF`!9qpbǰega-2mzeXT^pϞ?oxxx'τu}sHoy$_Dpmغ38QR.ˉ%&)g. ~khM61i{fnu:C./GnP6Hs̈́rBs ,+W(}ڑe~{M7t]w-_NXt'?O<=yǞx≗\rIew޻gy榛nz+<.-[SF{.ҷ-{)200裏^ol288x[nݺu~nG?˯ڑ??q OB`4Y.'5u6t1x;mL#Zjm$ײaLC u2Kf' V$BPs9oKm,|:TkzXu|t4MmZ9u[l6O\sX[ yރsĎj`WUOOoTCn)f]~f_˟f,#Ο;oGXe&\P܏~5ۇn(.99-`vP뉳g޶mۆ oٟ=sWX}?Zb駟>44d}+^bŊo.hɒ%Dtgs= !([.袟sέj͛}oFFFV^}Ο?hhhٲeOK.|Yf}{+-rJ$IR[-r<׮];gΜ{ _АJ |۽~:y䑅 ~?~>WJMLLuRnذadddr.{^W=O)᜛3 \XgOƸFa 5ޛr] L=(1KIq:nj_})##C|CΈb|ŏhr0޶T*HD ޮi#ڴiӆ &_4Ep3xM'V]\:E;'}8.uNۿ=DmB!H͇Xfܕ ?ʶf6:m6E:]gVy#Ʀ-& Bj h^ ,dZ댈{fݮ}vhd)7aJά dIY|cFav&)XaBf *jVeH{7d\$ES;7UE"M'$O}OQlM OkLڥ}ˢAMzNݾ{bvH2$$;m㒍|B (VqÆsn)Q}Txn'?: R$~|HA\N\3P;P?km λgݨ9G]RQQ,^M:&^^$c fzRT5ibL}VLkNt'jfjM|^/ͯotDL5(jm'b4F(Ue`FQ.)ëZ[-:@喯_&_y@rAyYgPK0ubBa F(|{"L)nBpyS;r9 qk =M w.9 ^%LrYB)%++G'f|/gH.L_?0gbU*x}ø`B^* aGK~ԖaEވ۶oGއZ;2*Dt`Ǔ'aGÔ ~kԚ9iWӿ/OCM< m>%ڦ s)wvh8*gpAnb<}lFAr;(%=Oy51CX9ž}v8&rs젮ᣎomb Q1et*[~!Ϙ&]1 )Ϲ_kd`6F͔@Psڅ53rQ_P웺Fp# كё;b;(4O_9җȵ8rmO^CbCq^t֝P0*LzƆNeS0\J1µu"Z@]v*Tr5^;\DS8Cx9ImױZGLOV)-O.53ދ*WrGsϟ; Dy27n.@O%ڦaX[lVn۩Rz֘P{1W<#"!73[ǡ.n+ ЦnÅJoC &|XjMnݨ}r[$A۔TůރaQ1 Z0bE:4x?g׸Mx /Dua us80QBDS~1dY']I^&'JRRnPWHDR)-׃wkQfl1jc^8 R%$?wbR9JM8#II+9[A1h}mc6%O)Y/::+v_[f]~VuOnySPMtqS9'׿*( u"S!cv,Ӎ)SRf&pt N+]O7W/b|-d@}]ejK補A/ 55KV)pLPN1$oӱOrJHTEq)%#`J%2|"yxkyo!mCʹb@o) C{.jh5LY6~\P.ċh('WDnBh泂 ZH MǯQokfijvj{~vCY#}A)DMka +gYSpٲe=P^K}QE-_|k֬ygŊx 5l_j2X;5UƩ=n};zwWM6fTh [\[dvn pjָv>^pȏ pLz_lJRH)l8p"eADJBJRB()$)II%) %Ed(ӦG_Y ;Znv3|=i(w@-GknNS.xRs-I-<c ޓf2:Ffrʭ snsnjڟ&讍:ImQ嵾 V8Ȗ0,h7p#0~֍abE$ A²!ܬڏ32]{Ʀy|8~d9e']P'{e˴tϜr#slGO #x~6hzJ,⸍:e*Vc?:J{<r?afC /EC ɭ?HBQjɷ7XӰ_IDATpsN VYXihG_XC馛N;XlYZ5|_ꪫ;xO~?i UP^Ooƿs;ƫcAy.=H՚Aȅ*nEY"xy. d ͋Kqc$?-sk 9 (%{%uz4y{D#όDNؐ57lև$|_qCמeA_8$5qy+GP|-b2 } ) _QW!D563On/~>"_2Uhg p<snܝ'^K XDG_Z92?5}_H_/<}6vC?_}P8ҩWҧ[~KInj%+\?#?Ǽ>ة\{$ m_z% @aξR W`S1(s߾$wi~P&4}6(rek`gI]]q9ElATŲo:{ MA \i>o'M'߉d<l2j;U˅L}b=lߧVX'gAqcz1w_I)i>҃A%Z_QER(pߩO-Z4% ̚k#m`3ְLy=q"b-ٓ_z}WJ z"\xL]@]^)9RrbbDIQ:9<#g?yU{K /?uj<8[=J@:ݜ2BtBESq2ksW 7o/~8wO}Ss嵟zOsg4ף5 w0`(;sCdގ VN' Dow奶H3HʄJpd""J$a-$^RP$({A[%4_Ff@XZo~g7΍#O`3S56Y门ãǙMe8n.嵙n 1J5j$#R%/EbiҝA@85 WpVg@,i>*h%2AHP\ʞzh]aG~)Vc|9fۖO)|D OE14#IdJ\u\Vn7Ts:P/]=tpד8H@ȶ/@=O݄$k׼/*d}+*q#|DAJEQWc׉>T=3ĭ+( \E P${zqϓxn@ ~YoX7WC cLkf tg C]"{gjad=S1p vÝg}xϽ "FO~p'2G ?_)tl(|i?|?YA:' )n~j J?<{8s|) ض|T??kٳ{ =Z_B@"x Ό5G▷!z_z0Rқg22=m}E$x7ڙ:߽; MV!,=}>{u쫸i~'P%D N??<PfR#l1S'}j+ahmAFj3u%_[3} !V¯㩭3u>e1TXam|?']y%8m!<;R?ً Ɨ߀)!H ?O`='BK`1/9>Z3wCfS,ǫqOO/nڴi҇6mZpn.tymXhѲezSN9^'#{Gy$\fGy޻qеɠ͛75y_m\rݺu{M @wy=W3=;sttt/!Ĝ9sO;ITzѭ+WW\qu-_|5p 7om4rW_ `/m a^e˖./tymo|pppth ]?vϱw~.]K F {wk]tž?..b_C׺袋} NmIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/patch.1619.obb.mainpatch.current.obb0000644000175000017500000000000614620351225023454 0ustar00hanshansdummy ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/souch.smsbypass_9.apk0000644000175000017500000023661714620351225021221 0ustar00hanshansPKrHQHEcڳ META-INF/MANIFEST.MFIsHq&6:b0 $BEQ@U"׏Lt֕|/_ ЃElATYxA g}) 'OB 4O1|nB*u^|0< xA@%wx=3T-χA%(O 낢Po)p p] <mV5Ac^ %/M -yRJ2kš.>4˨zI`x۝)P'Ue0v jB%HCenRS+ qqȬB,^*>SURM,ls)H>|JN = cӝb)wW%fxO@QsQyŅ mKv/~a6(<Ԟ<Huڹ]jmPPR.W>+ښmJ`ZuMyzC[0ȥ;XW4EovNBRe~I="S14*~NdGhFX/֎m5QD%LNdx G98^L}g^u NavhU(zƍň׽9ݑ+RRΆUi-,xw3sLʼゥ裟Z^{xvy5Wβ"'7=eҵb=F(9ٚT}}xu >N ]s"q UB5[xނ̖w+8'5uaGҰr ?26TKe F]_&U@pP3ci$Z97zH{o5o9KYAI nxK/zG@ [k7A GkKŎMmbo"}t? 9Z!҈Y1n Jw|h,ސ$?&&i [νyq=4S\'s0==ns oe[l*eXOAa}T!e}?˴JW&3KC䞠 B(I 9Zj LmiѲpc?ZAPZt3⎔keYPX8sF9k;W>o~@fZ~͚duk;U9 |P>3S|r qkdijI" ~e+,atU-fYр_o֐J"L u?M,M,N&k86{ LHWfc-\ 3PSLkvnYK8 ?FMhJq(u4fk'PK) K PKrHQH+0.META-INF/1D0C682C.RSA3hbbjhδUڠUѐۀUIqAsAsAf&F&&i~0r$M`eaf 61q8a_^Pcæ%{$kLr?lrCGwlE;aV5wTv2D|je^& 0i61R70/d>-C31RGM,M {KghqK`޲4:_3BdRwߜgm,u,wkK`IO}<'r|[L)Z>-_S3_q`w^׸?(Ɉ~fK_:.(A}b >:dso̼7oZǚmju|wۑ]_:HkzK㞅oG]|ͧ&=P*Ѐ"Fa@2Ӑ-PK+0.PKSPK A`))PKS/4? BJKbcCJ3Nh)$k\8.\;;.… g_RɹK" ws==G)Q{u4/߁I*~6}+ H-πX/߀b~"}DCT@%2UiMU>1-&=0G{VA%0rkGzMν ΥNovӃ/WZ&QGURbD6Suv3&; ;ẅ[`jkdT}hb5T2SUh9]+A ~n%VYxM^{3ż؁ek]soq~V4q l`j<k?.{>4.W"jǎYq>h \>q}[FBנZJ9 {XSW1܂dDw,Ρh<h8k[g]?יs\y@EβYa_VpD9秉's͠jL}57UĞ0sOF#s^ϪwɳO豳Yiey@y(ɩ9z~ی|E6Ik8UTW^G d6r.620y7.f9>}mgQ[7FCރAqeV7Vݏ8~x>%{6Rl&n&z>G6Z0oV?5IڀAoYLRp \".)=>arw,%-rQ1*.)\TFQY1]* %{ךi~!ΊY_:߰ +?Wg·dupQߘc\qpb/(.|ϩyfnſW./Y~Wy?%ği_0_WCx_P:/v),zZp#Z]ߵ.~oi~37\[FV7+~a:b%!r,1.+?Wg!2Q~-W~9ŏ*~I[9VPK6u`$PK NqyxI hPH&(ȭJ m۞Y0s6{={f̬ogXS[C7>("8瘝9zΝ eX'OwTLt:>rk-Y,zu+a]։$Un399,"B$diJedYF$Ir0%hhĘ-v&I$ADN@ISBo1V :AD08޽{(6UG! "Lt:IF/%wy1 iňKD0Ƙ}]zy+{,}nw1PUʲ$EQ033~uB9k|(J#U`ic!/,]vEQ쟜099ug-9TJTŇ@--0Ù1ηt|].[#I!+ ˻7Ƙ VEQEA$}s cdY6/o/arļ/) Q9igu͑^CGڊ 9_ 8.^q@6+Ϊƀƀƀe h h h h hK:'HDH"H $c=k@U0b1/ D@ʌyƌr(!/ XB# hhl1 i"OiJZY<- bz4@B%O2Ps{%-8pzuB;!(JKM.;t.k ֔sL \ @upLۊWfr :uuEek4h Z]RvIk`"# ;ٺFCj5Bu==U FQk'%TEA9B+ϊE hRQxN |UODڬWU4ƅ4b}y|h@31;K4wߺ⒎5bD+Sb(K =^/%_6pVţ޴MYrsw㷋`+'=sK7OwCΦ3 }3Zեނ/~i]'eH8y[,A^Vdu):i?mz3ٿ{~m N/X~w hqg!L*]/ypg#k_8瓧؀T#7|n;>֝ye}rb'rU7=B5nUO^&'>?qk  |S04ןyp.□8y3}ɧvͲk8wơ X`sC56up>o7 yVPʲCl3n- &T m&~&-K.my q61g7Gb#|̒yZmZyA+kSٗO'%82*9)kt'%uX(1F2QQԄep j^hվj~c` F7xZm۶MYko"ƈ1 ;|T]446\ͷхv9kj]ׇUa[t:껭s(PFUΧ 377wP&oM*x=q嗿I!ӜIENDB`PK N!1)Դ̬ܼ| ̽R'L5aIENDB`PK NG[Ԇ K, SOXx2]'T Rk#"v 2~ҹq;, ze^ea %zb=w1C2εuY++zEr[kzS$z-16 4iF 6߉} Qx1_YŸI·&Bą@9Ἷ<') \}y~RU2)"}yca4AZkUx:OR+ \~ctb^,D čSR=֒ǟنg_&z;+" oVˎ+!2]DmD&8'ŴB{okMGUZ05(2!Q.p3,UZVMXx3j9Rg^A2J3/}Gvn(bb=-vO9}LIugoM1:o8'xWEKg iyiMd+Im˙sϾr[F>IZxC`)'{>g"%Kpp]5"O=1>rݼ7~c" Vin2i m$6h9Ā31jcF|zoddH&Z*6Y13fuJc}FE JWPSm !3MڍqF[ce^M"ls*uKl'''E=y H % H$1PlJ 8}={(UY(j:TUE9=1ƾ(RZ=zVo] IENDB`PK N  $F1Z B})" Z9uavOOi>=]d&{fϬZ7k #*oN3k}㺮Y>HTu2z)fy!w#)%R)?UVk#"c Zmԣ{҃Wjf!~RhiᓈYwߵEQ\Rq#HeXk#"W|sDCDo<0,øZO:ηEd9ʲ$Ĉ5֘̕%UUQ5UUQU{TUʲpr#">w|g,7βGEQؓ\"6!&xWCgY6  !=sp.Ax 1jURV@ꆃ1-ɽRjK1W/(֭[Ekm Xkx 8vH nDadʣoqq-Ci/V(q 2euS:v>[?H\>ImMW' s6ʂi 6xTԪJÙQ"AQ7dMɳ6ml}0Խ )q7K*7!P%e]RVW9zn%%xAD4E>Ad544-|H}\%/Xt}1iuqUs~> EK| 1 4<2NLMLŚ'zc ,U%KUIFM&{SW{>T/%SER mEQjOi}H>&5MZ+ 0woާ{n%H9CL$bsT4ľf91At0@=dVCf_VaQ vyx{t+Hc[(a m]E{NasY% _5OS|m[lK4~M L ZըV;]#G#J %;A]5}G98DQ\[6D^d6QJ ^~W;phL!Lސ@X{p޴+sv F~͕x{>OEAYxCy;YNxۿMH~MeG/c >ξ?\nU=cL_5K>-_/{-z|/`r᦯wbG>56?b?n5C[E1G#'A2<ݛIyYn'$&g3ͽ}1"rNH=߼ƅ2|Jp)& i=Zgʟq4n/-e.rq(/k^Q"ODNiuep? CW^BjOʚNA@>W ~ +;XZVrc_69+f~K!iZ+VdFӲȐ;C?9@dZӶyJ0is&ÊBKH¨QE !sr &Z-&Zt&[Lb`9lfB_LVʼ6⃧/꒪vƊMZD7 y3#k5Ť".M 2v튳su]1mb/dYE3eYs60ZBhTeY"o&aiRJoSJF/Q%IENDB`PK Nn}:Z{FN77@JBC=3l rR1nUYWv0ZRxV}%r<ǁD#31eS!]Bj"؈Q[;k-O g@cNmԇR+)+Q<}$^ BDE eoWf335(Sly_+Whe{/ / / / / /\]Ma{*g fb<@L@+VcEnǮۣSB r޽R4_s}gs)tBUQOQ%91T u)38lrsGUJ)'ְaնm ҡ9abTffjԜp)qUș:^*UA Q~lM|/}0 B@UMU>K)B`)*y,>e 994bIENDB`PK Nhʲ,K:UpXȒõ/fs] ~[n9㦛fssϹu6<<"2R{OYkJQ8vs bu4#1c$6iYx1gWߋ7n~pmֵԖ.˲?Λ&ƈk-!* YV_B td YaDbf4 RJSᡝ;a֭ڹ۶DlϞ=E=FZCĔІ91f_W»y4{njջ8 ֽwlۺk gYkY14441c-I~iX~GfQmιy_`։Gg5'9Gew=Ϥ1ZK0y1!&&'ksipx " V>[g]m(SӋBה :ietEeeL=Cݷ{C: 0`@ h 04!˛+%$IzBtcEBJ"$AP Dh3M[ȀP!8!T!2+,'|Lp%1)1D‡z*z+PQ /Iѐ~#E(PjP %9Lg&H@T)c`.TT%O(MEҊ!x*B=39[RV1ZbA ZP'XTf.ף! U%4bNT>H&">z *X"1?14fȐ4W<*c=y"RHD7UiLjf(6b#=S攔t>Il7"g½(G մDUvwj.q1E?Tkƫ4W45e1@^x~uÞ}ߟ^6є~D47yHQ/=6Ig2,RWi_gbh j2.NxOɒ=2z$ϏOs5gbf<Й,iW7UPўb㾠yU 9ꮧU_DEc zC/U$Ti^cPW]*?{t^$}ߛL]b XILE^)*Vl&cG=Rg_GwDb#{|b#(=&`WPTPx1wZ(IA@=gGg璟 VrT4; {zS'b0|Q/0f*C/rgq/E `?ѯIVuD < k94÷9[ԇNöo:},{xX+Kq7fۖM i-q m}={cIRl%O~-ʩȕ>U gqח곞?a\>7Un&ЏfySNF.Q.f v` Eۑ5DzR,揿VQNF.v+wlQ{2:gxR|F. ԋ>]#R3ugUQ/CU>`v" :7y_ e7pGYM[ .șcyк;7q6>Հs-s_G?8ˏA l.U93o]TnO}J|{/y _1*+`p\͎B {1`VF?&e6s^Cgg>@V$RQ~!3o/tVi1T>s1;p9cY?q>wG[~iqo^u2g \p6WN9+l_\hzX| .!Se(zNC{K#.,]z 4SdvG!O I-^QbFsR/'o0u0 ",8#5k Q})}w 25ϊY3k w!YdƒYGR3DSAm#Y Te RϷ̀s2kɬřz[QM+Α;G QA4A0_, AiuC-D[YFgV1g 9<9rp qpK:c)r$B$&Y!X!{x'-LHɐXkԋf [h VPvZzk6oYFiMxf(T`L)Q #YAnr4B h4,>d K|hT)R.W(\E+趋e̽= J]W 'y̝TvvVIIQM1Sb@g"%Ab]Qj8p6k>sdd)U.d#g faMcV{%eYn0Đ^OgOؔSY-RW5Ħw$j$i]5H+bwl{MnJt-Ղ!PA֠099ʚJ*ֹZ" &ǶTݖnm±QjCc)j];{7v[xh> [yf^x_*_FFF>eZׂ5U#u$b%2˰,9?8{/UeQgRsWok 7.{_c|Fv[qcJt:.^O^SةvӍ1 ث.vdm;o3~pm(IENDB`PK N\"T!P#Y-kAXzй{',ZMy?]"U"Q#~Wwи{,~Wzwи{'Vx~,.aZM]#V"R#Z.mB[|ѹ?Anh[O|4v3s4{@Umѻ޵׬͝ǘ•ƞ̧ϲ¼»cjtRNSDay.SSSOKTST9-W^__G^l IDATHc`$-\<$i R'A-J*jZ:zF[XZY;8:9FPKxDdTtLl\|BbRrJjZ:Z22bsr S RY RVD-ZFjB3-Z**RU(jj*s[Z;: kq0q)SM1s9̝7E,]|U׬]GP 7m޲u;w޳w1e)*IENDB`PK NYR%H, b$avisSSd!Ġnj|s}(EQuJiYUbwSVz-@kd #R)gR%XBTs JX NMb̌T}f R}k]j G3{H-@Wasss͛7nVpUԧ*3H4RBD(PZjZ9rh߾}""F!ϲn զ'8!<: ar Ν44u.7o[aW`333{s{ͲNsnt Y J]K)_vq:k~t w~G*{! `4X/ɾ)UJ*Nw.*&ɲ,#a!u5Uf>M0*lpnEKTotmN]~eHǸƉ]UpyOQW 87?=I){&+[ f+I*v4=]*J71I0X\ړ8Z Pk-@jjZZkjZkjZZkZZkjZZkjhjr7en7rr\e=2&Vm'X_..E VDkRb Osy bIN1ur,O9GY)nU&* 3E&If4FS}F%tq\>x,KagvN3ET 5HfȆE-HմD .Si%wF ON $/|F9 d>=;}"%z) #P3tpGLK'd L4)iXf1TK̚1 >BDYȂy%˔yy9Ǒ| t-$gvJ~*XEOLJR#K\H5i9GDԄz*pb* K VlG!$2i]D'3#t2蚠N<ޝkeJr/JDł8 F%S"3YDt=f:Gc&8Z< V*jRcGT&#ˌ(Q!DU[> E%M) *"5Rҡ˪UqOcΥ~AoЌ @!d L `8yRyAxq{x % ]YAIɈI8. 4TeQQKR &Ej@Ӝ2k`$-ݒCI(aDù̧t0̏ɴ,;(TIJjV-ziPKr)գֱhȪ *RE"H]*'%|R|JLVãc XfLT^-Dv}V3U<_[OoZh| ӕ]րjS:l1[qн$ҚT4\W|BU ;2l,Zx089-TBk*L R9 &U ¹S}^|H*=cĭjJ꜏`&O+egя|kP!.(_Q O'g^o3oװV^ [^}TsO[_8˺f1еgywJ]8vpyXP f?=)^[h{]oOs.'||[J?%q'󗷒bu#eZʨ;sNpa+F`Uclkjd{u6&C Pk-@kZk-@[tb_9"EO'FZ֌ kK< ymU.O~zCO>YzIxNL Z82_ȋ}?W uRyRQSW'^ZV| wlb7'IQ[Zh#}vfj$'~6U*\WSxųqշ̟N_4s\ YGaT'^^lt:v(#̶mff05㗷!"'[s>y! \ ^ $qE@9|Z6nc +w~L>5^ HmxDʟo#s{ qͻ-@ [g0_:}Mx,D$~k~.7b5Md HCs'y滇HD {~tdM+X 2Bp~2npz ??Α q⚈Y3;r)?.m+gWyWW%p3,&BDZBODP!c t|k{Y:x<ϱ}&Oy[5ejsv隳G=~w^]6̹v0-ن iOpӖyd?y[>]"RȬξpιqjo讌rPrZ+L.?\6Ncg8uKxvݱt]qj3זɟ- v/ogmSl4X8vp}{7r;zs dz-3K  Svfo  ʀ|68OоE/wLɇv0;a^ZГ瞙?3=fw G_Zƴƻlޕ艸';qvE=: 2- lٓOf3Y>sޭ?߯Է^Ti-<@fƮ[`zs€' ?vy[σhۇs+i *  Wx[P\vٲ+kfL|w&8K~g?81iwA[\6m 8/4M|7>w<1q?(S[J5{FF (x>'o1$>neӎ6s݆msQ qo21]E?x>H' Nxo3Eԝ̾g>8>3?~3Gxe)66hnz_Bp})͟rE- /iO|w{]~LD|oeN{RZnk+}z[{"Z,( Ώl_uPu}y~k-@4~lZZk&o6jSwH64Aktz"c/rn\n!]盷̎lcWµ?ZZ> 8{*5?vMk d}]-"GOXИ iTx(#V\8 Wo-)W"iU2z!7'պam~>֤)/R3 A@ư$4࡬93LhQ.Pi-w؛gT(1"dkRm;Gkܘa,SWJ_VwpbCDG0pʰKEp(`V Y}NS]J`;2ȼ'^{{DujOi.y2Rp+ h3~)`dT @Yj'@yɂ'<C \} SJNm>7+ *xr!P%踲҄P=HHHсsP8zRmTA7KJ)#Yf,3:y9 ]O g] W^Ź:!C-NjbD]N'4PT:!#:GB򎘄ybb >ObV)1FSE:5@ge9YB^Aɲ,| qF5@1óL<5))IF:LeB6z)%4$&R$u:R0hf-3E dYs|m'@HՂ23GfaԪRTuYHIRrYf%hI/]j_LFڠY@GJY}Y1:WK)%z1*YJi<;e8=&1yHE7 5Tc7\wRAwO>;뵎zh޽ {D @̱8Wr__֘+>@WlL@WT*6Thlwi]VoU6S`sss{333n;T1RTra: &|\ KJi 85 kNGfE'jcoٿJ)|Z<8 |cvvyVκy;G^Zs4^L Ūu)9?ALնf'{/y]?ll>uefSJ>hJ*;(~S5a[})% ڥ/bJ4JD6}_y衣P/)uȠjIENDB`PK NKꉿ?;D<"Ske16wfpcg=x7o|7"sHJ0)QǑSDڵؘDd'ՏU;~,T?rGn`0#9r&O-DMESy;@WD):UON4@57U1t ;ѵk*x6E", O?}z={DDR(9fϝk3=sz\=zcH "T aW+P C`JA2^o()tMO@wD3]p7+ D_FUsZaqc rJ\vmy6b fp^zwIUYysJGjңRJl$PU9v3nfwzv}˧e8~mǿ5cwkhx 3O?W^yQoܸe#s;Vkhωhn/o)7@M9~zlZ aDO=eB7o޼R}U~xl*88bHaYRZR8b+z=3;Ծԇ?|i__%Uxy(lmz",RJgCDkqzohB;s~7"^{aׯ?RږRl6JATA]렾V~ ݬ]ݠMsxRD~3?/ T})%9/<k8.`E! *UEE~ڵko)"RJ) ð2*eY1ڥ}3=p uK=XyAZZ׿)z;~H̙ⲏDE{Ә2햇]ku6]@\% ð /p ~Uuu:@]PWuu:@]PWhc}:_wʇ IN.]1=3my{$V6o_9v[ Zoפx{ ,gTEUNip*G;m!6:N47" sS3 <ﱼo U LL-SI22oG{A nWū78o[`dyGI,_a6-z]M <<#I UBb 2 %r()i:1Rp,_dd4*u㤞`A HxKBk`Ә5`~y:D u[HN9Urdl\())R02lC! wuɫƩב[))3ȆAv4TxܨnJukMTk9o!D wiǚU6S!gږs+ƦC <BQI$}m@}Nũnfj夎:ՃjFKEN~n2Nێw;Nv>@Dɓi9X0qHITwd.}Os-EWFoS֑ՠZ9A̗5<jۧ#'fPLR)9AP2š`8B&T+9e "0{acK*hN#Z(ޠ@澬TUt4,Q1$!VR͔dC(,)U7Fw̢9 S7=|˧zi-lsnTD@:شnjdN2#W $@9=d)6O>mTqcN+w򅳺NѱzX+C΀n y_zz q44xrr?3!tq :@MiЛ'|~^a@oz=LGw…k|WEg7[S_zaC&]U+PWzuu:@]PWWuuu:@]PWWuuu:@]PWuu:@]PWuu:@]PWuu:@]]PWuu:@]]PW荒<@["!hRߢs|z ԯ+< N$gH%a;[jr|y~ |Y}d9H҃ve!jH9 &.9EGT@E\@K TATN-75 < $UTFtr"p9>sؕs˺9OTJ%O3Hzt>HaN 9(EP -@Sjs@%ERG6-%3<Ӂg. !'%'$Ds'DKPD\Xɚ()S, N4A8L ")MH$hO"(Yw!kX6N&@n0<ɺz9H4 1O{m Eŭ(4?7Ji@HZȹ@UIS [rkާ]<Ý3AyȗTn3r )G.Ex(&h o0-c=nXl^;e+U"FB

R'_n SLe3\iJala.Fmd _Kga1Ar7pf8^ͻձ+"~ꙧwW^y7n0 ?4;t;ܒ*v}gY=63bnxkyA3(iz'"ЇZ:}aN3K֘]2rtt_4-gXPs'Χ{ݜh)xGy櫇a?IENDB`PKSϴ3٧(8l?ƾYJB" Ogz*C—"rw|$Q#o 3!R˄Тj0"Wqg!S~V9M ^ӓJN/R9"㊖وwa.Tz xʻ0wrD9+!Rߒ#E}T@sFY޾nP? rf7cg5"'ݾjNz)vȧ1smFԾg>+юRNqށWYGf:Wn"-nu^꼬b|t7U5B:$Ŝ'ZW~PKNZ! PKS]qBpGZT*ɿVHیǚ;a;OTr]!jZhS>!mxa蹩A:;T.b}3i!;i*ؒ|(k3M6cMNCe+ V`ZASN4MmqA+ F[\ }jn3y4oZ"5J%B bx͆72b{|?wa=!Əp|3o}TѣvfNT5Ou/5#ZNY{k#o]P|,H2ڿjVjVbghWs[R8SJkR-NR|բ~F)y63i8eRF)-ceo_zQ}/_W􆬯ԧdnC9$oo(z^}klJO?PK6{$PKSȽbFƽl{6lDgIw Qv;"w oqGmtэW;iqCȲ}94&BD3Z'x1vv4Ǝi ua!@~eTe}uQeWԾghoY[!0T]qJ^#ӰJ}[&= fN)?+=/幜sU83ۅa=PK.'u$PKS[[:!N@Ҳ?6AZ-KZ'EpMnP@^2RNJVM5W奼OޏkM5EgGo1}njNTXi6LmTQӷӡNKO{Τξ$j_jGk ' Zy2Tcs*z m{?D3H):RhD0z:>+ۯUH:SU:Ӣ}F_I+ib:z>FW~PK mAp PKS"pO{'gz1ڠ #Z'O^! n`vS0/;|_WNCyE2׌NG*VB8"[˖$"dʩݖH yZH̔ߊ2,.a"gQLX<.ƋQE >'/`B4:PJ棸VkGwҔd\|Y@PcG falX~b+>juhW3Uueyh76]=߷9N9Ƈo9Zj g{.*rݚߚ;Ws~ Gge/}U5 ߭/5owwc{ 5tPK `FPKS_bgb;@\.s.YRI1Dj"ƈSܪ [xl0K )@6P*Y|GT.˯0OmcEX^j5þ9CNԴyิڎ;vcɘ=T|q﹮C>2XcD\HWX$>[f?T(:]K`[~4+ N0|n<6ASwwZCᵢh3ҍg{ݩ=yA&>3 ozRb|M9Sm?c_.c5Sp;8诃?O|i?j ,ჶ>9y߂yY\%iҭ.㌺/v?$ ˉe%RJ?kˇ.WʞDj"o#彝KԹ+Q1v__*ŮY^[fJ>)rJ%ձ77EP 7//Y gWyZۚJyg)[>%7PKvXjPKS\ryoL<"tKyZK[iBM7X֓/[/PK쐉qPKSY/ս$<'ːLLd$4Ƹ@f^ B9ɱ-lme8Y-e΃@x\q%OyH1Ǚ30WbgG|? B'Է3t 5Z$ڭU𰎥kgU<vF-1b<<:[ۍZsT>^&nկ([^wW(rrlŗ/PKhc,PKS(8ocg:dz|҇Ah'ߋT5w㘨l:+LIA[.oWs33kfپW99 G=磞WBߴfg=-z[*m>`Ν+hUs_ ~uWKhRdz̴U{S[652cZoPWO?-謠PKw2PKSlG7pQ'd1K膞i؍;s$~ ރ{5;пD j nѠ ]%Re EQŚzc|i#Մȿ_]EJ+iu|S,]ߌ:&Z1֖Tl6Us5kSjޜf}ΚeAiJ پGz:[yl'Z٣xV'iz-H.-R㝎t):THJ<}m=w>ii7V>zTڮn^sǶ.|{Rzk10{ i9q3-wm%FwE.rd j6[ZH]D紹Obj [Hx3Z}080>c\ay?7ըO1*qo?W`aOSz(Q+)\0W;%|1ZSsyTV/]Ȉ?LyU8YN%ųYk.0X{zj]Ly&]ɈEpK0_VF[R|\iһfsS3u.;Z*ޤ~~fJ?[M+qgy6qE|oPo2pJTvnhFqhM%8?(ųPK/8PKS1ZmdVfs)I"FY6x `>#ps,5h4faE~XWzlbIV} z=r\W?(UV8 B)C CjIUFwN0,\eЙiZRqw^v<=MBvf:xDG"{dc,^3tC;_%?@ w Y5/Rj-Uy7JJi֊9Z9GDTX?_f~_ Io[-)hGA̚7r2b=Ҫ9eoo7PKoȯPKSI9N'OB~$+4@)N(*"Ir3۾S-V̫I,6ɷfg+S8.R8[z[RdD~Eas#"_?w/̌kd:! Rnxp2 s[o;:otjUZ~7'PKKPKSvfq7qARdD"9'_|7>NeB& Rqp2^Y??PKVDnxPK OL\d} ic_launcher ic_stat_alertbattery_facadecheckable_list_item_2content_filter_item filter_form filter_listfilter_list_itemfilter_list_pickerfilter_list_picker_itemmain message_listmessage_list_filtermessage_list_filter_itemmessage_list_itemmessage_viewersimple_list_item_2filtersmessagessaveBlockedMessagesversionvibratetextViewBatteryLevelTitlebatteryLevelText howtoStartfillSpaceTextView closeButtoncontent_stringclear chooseContact filterNameaddressaddContentFiltercontentFilterViewcontentFilterLayoutmessageFilterList messageListmessageEditText sendButtonlayout layoutInsidemessage receivedAtfilterviewdeleteaction_delete_allaction_export_messagesaddaddAnotherContentFilterallMessagesWillBeDeleted appMayNotWorkapp_dirapp_name app_versionbatteryLevelTitlebatteryNotificationMessageblockMessageIfItContainschooseContactFailedclose deleteAll deleteMessagedeleteMessageFilterdrafteditMessageFilterexportFileBasenameexportMessagesexportMessagesError filterDeletedfilterListPickerfilterNameAlreadyUsedfilterWillBeDeletedfiltersWillBeDeletedfrom fromAddressfromAddressAnyExplained max_versionmessageFiltersmessageOptionsmessageWillBeDeletedmessagesExportednewMessageFilternewMessageFilter2newMsgnoAddressSpecifiednoItemsSelectednoMessagesToDeletepartOfTheMessage pickContactpickMessageFiltersreceived saveMessages saveMessagesAndShowNotifications sendMessage sendSMSFailedsorrythisFieldMayNotBeEmptyvibrateSummaryviewAndEditMessageFiltersviewBlockedMessages viewMessagemessage_context_menumessage_filter_context_menumessage_list_filter_menumessage_list_menuHpP4HpP4HpP4HpP4@HpP4LHt4 0@P`p          H4H4 0@P`p 0@P`pZZZZZ !"#$%&'()*+,-./>H >@4 0@P`p 0@P`p 0@P`p 0@P`p0Y1X .234 5!6"7!8#9$%:&';(-)<*=+>,?-@[A/B0C1D2E34F5G6H7I8J9K:;L<M=N>O?@PAQBRCSDTEUFVGWHXIYJZK[L\M]N^O_P`QRSaTbUcVdW HX4 0efghPKS~w,d2IX!AaS  Y$3AwUZZZkE qmk~j+{ޙw&>9w_=sLkxSVt7t_rְ=Gqo|BADL"mCN%z Q@hI4W'=y/рiW,  | ||||Wy (@ P LXl.`^9_C4X ~<x8| %&'&`3p9c&Vcg=>%!9؅D`&XV@bYbrZ[_/_Xq)@ x>Q74+X+| d]Gt<0X | h(Pt?_yEM?*n*@ލ+ h^> ! ?!:,ۀ+ 1Kv,2>] &@3pp;'/agXnn/;[!xJt*` pp,+3j`.X kl| g'W}y` 0 8 T @ \\ xxpDX4<`7sy-@LNB`3ppp=pp7G`&yÁ@5[w/_·v@DVg?^>0F}0 Tu@tW7~| .\BpO. wwN0 3T&`RI0 f"F` @8~ycp&Z$>"Q5L!#,/= ^^oooowC{G>O3s//_|  jXL!K%H/%WJx7Uj ߊl e+ȥZMiy~S$Z p@2  Pe<ةdWfr|.-9c $,B_%a|e:c^-IW9e|^|S1.s_!Oma._I:9N[RuU2@ 8'J$ Pf"12O,$*H&la% 'Ix-G\"d [˓hnk++qEϖ>6Kl'ϰWylgI8dks|;5L9բK QwDxU: _mKf,KJ&[+[mڿVe _u527t`Ð~cAMM7}dZF |4Sz|^^fLMzJѹI5&Y 44=Fѫ5h* oQAkM>/(b0]E:~>:5f$QW&KohO@E+iɴLo7u~ۉDU`G7QCӟL#ɏ"j2ME5:!q~.`17B(کڋI{q4ChLߖ9#zߍBHP=Mߌqv~$BSCnQ""*JYWTLx{\,g'lN?tEuH*KSJL!B$&w'}-~)\ HBS7 YBs/}U~#BMBg],t6FFv8>7CTMBQP-' $tB ]$TuB녆.04u =VACh3NP2bM8ݦg|g6:}U|+=6zD跊>HOI?}F蟄1djItG~ ͧBQ]''ӕ*qe|L(EQN*r=*i0)~a2LLGh -Ľg үT4a*ڟrE=&*Iݞ' \P3~XE8E;9>XWo*:X|iǏY iPTOn7g%]hhCE=Jp|ҋCŗBXo+CvFc~E$xEHI8໤jzVb;>$:l+F93^M.3_LO|Sъf vHv%z@r3^5qw0x|7ժ$OQ'E3)-eH3h]Eq?t*My@Qt` :tߝFTY2rrLϡH Bݔ+whgQ8l2+Q/W(ׯ\ V`0WoeSq]J&SrIC=<*Rt *I0qAw+iD5hQ{eE>UTws.,n?RK=*|8L' zj!, Bdk`q"ԍz:֡E&ӹt |7y/=dpJ_ y`j|㦫e2@MG9ECCR0j5@ª\EWH{+03 "Ts:=-+OKM;NRtf_98=H0_ݥkBKgߺ[ś!k?kNR4LA E@+MP~/n;x89* _ońO1[LĄ/1!&ɼc2d1oLNu-B7J|#8'"_$7T|3ݬM9mmgm߶FEW(x 1E5  mnnn9**rGފuxR?%gPQmGou*UeV_Kw*~)sϒ9~gzlm?Psn.]gvY>e}z/ M ]֩~֩7*zZ'7 Bz@Q^=^=^=w{dzdzdzdzdzdzdzdzdzdzdzdz%GzzdzDODVT߹+ŧse=vv ϥ?wvvwȼ9}Z/qqqq'|.c1E4dAAS0=_] BzЋ^"R]%~K>Aw(ROL+?j;C]vrLj4R cEP@{hKݹ?AEB4NT*NNUtZd)z}_zkwSCbEJZGHu\zS݇"GW]!srpVwߣ+:}Zn_)zJW?/VԤaj妚="@ե{Ѯtz-V#vgP9߱B|~ , Z!wH [~PhW?|~'t)5]V*0 kmWωy&mV_%]8!w{jVv~ z H'K[>#G$d[#oh8%o[L{&D;|D?xW88J~,Ο]n}} M@ǗZԿFhȿ]ϰoqF7HqXoB~_t|k93旃=䟕6?wKiϑGCN8_JqpU{3Fmȟ~/l]wM/Oh>w~g$ DUw]9iA)%asXh;:o;rIx)Vt[8p;MۀO+1Im}~˫WII\&Nw(9cmlᱶCqD X,;]+tV[j[:[&[wHwX}Vg/J߶j i ;Mm:Vh%B =SUBozjT/hk02o.bM h["̤vG8^dK`HG䳥ڲq=k'=16N?~_ķ-dS(ԓEZijoRS:oBuyb:+Cr!>)2z#͉Xe =8ô9бCe Q91&OK*T|G<1 2_>2y=ߟY[w)6:'Os]^*,Uftda+lN3v{ z?SY|ʒZ?Y9}aK$}?G=1|/y)ՒQIr~5dȀ.'}bdz\ eyqu@AH_K.~2Wh曣TXY,l6f㜓;J(g~nDJc*Tڈ8}g$V"WQ_~V.$ci)͡P)fcJ=} kv^'C$kH氮 n -%7raZ)ܡq`YAyiYnzcEBp)mR'j+BG?21 `yT3g f`t0k Jx0f?,xA7|g*ݜ'ǰ\򣾋>#2ƦZ' zrm<٪*/WJz=`1Ȧw1usJ՟}vOGK>Iq^]li7ܫumx9WJ~(8Dv'k%m}|ǓtoMwaF)]ݫk =>ofޥv k?/%H1ԾO$bò'dclfl3!*e.u qTRYKNA2˩ӆpvAOlvT-?O'誕P%}Y&q8qTUBGM%M=9R;uNnksU @!ۋa=:"r&QɻNY }D'H0Y S9^rD7R)J ,<}n:sRO'}{ ςy3F)eiD~wC9?,s6( z9FWpwz;ѿ[Ë1}kt\!/ij7ӟ{c}GU%\w>Wh4Ú()d8\ϸoӟ{1~F֬!JjvRs{Dj~JjRYʳ`zTIԊkGeQlT5*540a`ybռJj/6( 0ЮjnD #UM^Yr.kOܘG@sU9Wn?ݧB#N9kσ6R' uɡ+t 3ODOuHQQj_T1tq+B7L/O\TyĥWNrs7sޘvǒQ9d.џE(kW5H<1:|M鑶1Zؽ:f}M"A٪yV|?ygCchyBrιq,]hh &FZ#yU^F0TrvsvypuE|G7H4,;R絽؉.7W<7UaI CɒOt)mTpp'hϳ^lubLfM.I#\̃7\/+kǩ=Fi{~#oS~]!5'Np!E̢Ehk$eo^^|Ls ^юr&}T>N<%O>yL[ m +aij\cy؈GMR>#8#d|.B;L~ `ljd}4`թ70U[{BF;]0e72ʞ._~?RmK{NҔrnuLI?JOBܪ3Aє8#zuZӾ>ϧC/=i1Χ|Zf;<)S*Q(*KFӨ %qQ=X݆>t`Z;`KLŴE%Zſ!/Z”žϻsmfʹvbUv/Ԧ&L%/Zz)IϢdpY 8ELQ(zGd4`h=5ߢu'>/Y_)L|J^%_ Q)c"Ka0un׽sdMY-Qm02۸eC8,4k|j=we%Qe^i !EXS:LLTiH+t%G>ŕ7my,(j;lO^ڟYϺ 7?jdp*-3%8Kjn͠|˺ aKR˓::8j 1+NW;P1BH UT:x;:X^HMNQtքLJco݉Pӗ{6h>j!ע Zo6-06[~K.KyҥsK7..Y ]ERD5h3Hv%˯A[ Kp^%x<§3_5uq9*YUB<ެ oc^*T>/1mdķ141^ՉyբY)nH;KKx:R#?~Y罩): L:[g+gR,66Co=܆78tWfٕL]ԁ.R'ZVДJQXsSx;kk =:ej06 N?Bxݺ, B'V@F9XVD˘ʣU0ZgV:[7SɅ!%3Pr,kr^j߶֢>[y:[SV3D;Wv&%Ymz6C3}GW2(ab`:4i$4=wrPDZ ֽy XޠӅ2:ѰV̟BKaP #>Iy'?.석RH~Yq=]ʃ"5&eRCBzLw ĺ0O,,hJX߅?e!&n7*?1'O uo旵^fchh3[I {浇/Zr^fYɣ|"2GU&8[~Qe>v5u*_gw{Enmh;KZG/_ȆKDGhUej.PJhEt OxQ(ivc iʳ*c?8_U+ؤsWUd}*K^~U}y a{]}VbPkgXw15I}eF N> }گ9> Osw~aQ[,7b P / (6)`Nw&J'yv?Hёk|ˎY4qVg[X *_3bjtZ,%lezCo ͻh\Jݴ_۸ 2Zn62^6ѝЬe+eW4(t_ݳ,1꺊#vInO_IE/w@SMke:~b߲{S<߳yy" ,O=a@[< XP*6΁QSWBY l~1W*KI%tRY=EIՔ ܰ (K#CWjOWK9 g3Y!l5"* ߬Z6 m&q)v<;/;1ٟ(D߿̨}8?a誇x ջ#YW#}Otr<.Si-Ei"}r։T-x )E}7amEOӍsJLs?̃;w@7cjF?jOߠ3H.^2J~ό;EmCε4ՙCщQQ:sc AxgGxBS.h%JsɛV)|p_Cef7gH|}sȅ5uIm%9@~lr^x.O#x&$9n3:e} \֧8_O ^-^|HF~LD^[m+^9W#ګh9Zs^FK|9i3ESG|D?}ˌX6 u[iVɴh=<.dZp uZ^[5:#]~6١R8Yb9uqh oN>]~؇ϩ_F?#/O|Lf^l9 ieؘ@3-'؟5|0gG8lXtqkvmם|t<26ŸqW!QyЕ?b,t*>%c_5.Ik.}nh+C緩cX-FrEAYk˳g1dz a!wz?%yyء/Xn2+k8o B_~^#/0 x6֦i>hfM%-o؁7|X>C}|۝^Du im77A_we_ jt^_~ կkO~]@)?~^{/?JFܩ5 ;{BG=zg-Yޫ {õߤ/ όxFJiߔz5iosrxJMfTZrҒ%0'D=p_kMпGVHpC^S'F`*KgC%X},+o{E෽lX༧$?`R?:|xyC=`_Ťu,x};U}q[.NTɅ&`We||@>4"L:_8}Y:Zcd}PrpNss>57f;z?2tOwB/8^pH'2?vP1:vы΁2 >9P =vkJ벮 񻊮<¡ŕsU2a֗Nuwmqw~ lɮ],eoB;ƱZy2R[__:ܤN}Mݩ>{qgDZ^mڰU:=}i\+!GHw[ׯY)tӱ<{~W݄$h=YTbp9g6յ⽖>Y9ɩWϚsQ8%[)>9y^?B\6[gh= > ^꽇Ncxn)0ό[@Є8˜0l') J8'pG+[Kw X/u}_2;Ra[z; Núd:A ϒPfGݘ7XWo=Mϵġ8^q*%J;Z=tB'߶$~ҏz.ǠYC(  Rzs韍'F`![9fJW\_4l.Ta5捦`Dv8Mݦ/^G̹+rwnBky{Cc'd92]|8"7.t{x377? T%Kag}~o?#`{7n1RT3w22#[嘾> iWu?VtOWn{Z^3Xo˓ǜ7;MggS>Q=Ծn4GjYX<KP7Vhz-ϸmO$>|Н|NkQ_ 6πVV3c:R(B̋oʾ9֟ c˫A+8+m,%C=^ONVy򖖃zi$߷ 8FhM;F55kj_\{[XJos%[}ڎ}Ɯ%VbWQ]?m-)Nawt7~״nKajաj?ȬٴjiJԸMt7db[~MY~:~Ȥ'3PVsUYu;tmV68BhYx]DS#9#&tt]cyh}f_ |uܿHogrZ^ϾzT~[ ܴoپccw@co9)6G"o9f)mfOliBVMT7Eu.PO tde';g-:u(F)J /3m}1tm.y &"p*] >xӨy%u[a{kof ]ST|}'ř©Y4n+A [l ~SIOudA7/!}{ ^/mr?J*oF!*:J~r{xe6[w:}}˴čxNb\Tvn+ *̘.1t. gq)gOH)?1? tneUS՝RwZfG떥eYj}(l ^M-+&_bf+: ?'-~ɴNэHuZj?wMӿgi5 iエ~?M+(~FuNOKN'MOmy.;-ִri3ůNk&ִrwI?)-~0-qZsZw>f/1ZͿ2i0Gh8c]Y^g ;BU3tr?QhBPa:Shm9$*6(tiIw *dVYia(;J_W} 䓾-Ag~;ސF[ԡ-Sc['侬|u>m<7]ƴs|lb Sw)[ij}oMfĸ=B'H^W+oڸoL5OObJLI %iɈ{Y<5v B3 -:JʌÚ2ӥߓԯPiWKl[Bw!朒,/Kȣ^BOK*+T瘕Jcfk= VG$FQpk B;T-*l.t=dGq|GBvJ& $L2Xb,@+]%cnѻ$ T747w<\,C7#.Y2QoB'DαMq2ɘzIɜqehioO" MM8O>j啡 T/m_]__>2ʫ/lt݈Xr(|ѢښrU ʛ]Ț``eU,j -[TMx<ܵyvSKSkx캦MnkoFV)JM gԆPVY01T^QaY\*w1)22д>X>hYkqgI[̙Hw{; \Rն]]M[:@@m[$U۴92'ˌ]SUɕW7.(_MDtIu]=+ϡ,EdUՕ5V.]XGU5!n& 몰3*Q7D +'sv-gז/Akٳ 旇QCӑѮ ) < )J/k e׆7ɨ!\55z̚ZrZ1y(;Yj{^mJ fꝫ<1Grz"xHHسCJX݄yk0v뷏(kLv9< Ca"X-uʊ`imjضrƵTGZڣ1X(e,tlj"XyidhìU6QH}ۚHS ϭecy\[t 0=;7mH7E֌+G]jKwuEFLN㍘L\UG؎ɷْ7;.mF:|(3~[uT-u[uH 앖xSo)u' 룀 K54qRjbRUG4"-eF>bxJXim5oZZIe3Su>)[Ex*+bKϮ䣥Wb_~:o#yG͟:Gl?Z*9Z67ϑ4tIj~\}9SK{U\kq4G>$UE;z V`tu|B_VQ5Cߥ؄Vlw+ž .{UK]O^JjQBt +ͧ s# oj:CmkGԬu7(Z19{kd~~}w{rwG6t+dureժ*/ +K,x<6&O5Ur;뷥, ՔעP6`4lŭ+JI$W/WDBmSAJ_/g0)2Ӳ폆r,yE啧4uwQM)l2DՕϙ_\ m\ .\@:];7q/ O]\]wUՍCsZXVJV]^L&Z, %26p[ %գ52xi'Zn D!v,Sy(5~vW st,HJwzI٭mX x{%uAFkOΐm3ò C ;QS˅2oSw=F>MkD+ 0_?7[`c&le +KV0YI&qKRAj\]{b*]M12VS>%pMdhe{S7"2N),V(.otn^CdɤxruZ"^Z4ɖ(3aZ&ţ-ߞҡG޿w. %:LFRwb>N3YS8bsM+:[%l4Gc8V E!b'[JE#7A[)ouw4n&L)ײ-A~끊8.g< $WlC#TٗK͈QJQP+\N.G"5&Wqwd'Ӿf~zF$= 5|ݳ!ytUZ?`k} 'pHRQj ꉡZAۄAD.wë!8;e%RDb&8jzn5G!6Zj1j"$]AYÌuR,@yvϾ[_Jznm9}16i,Ӟ1 u3=a:>I?b<|<˵ё5H6ļSҦ-ºM4|vQt+zY,\WMʫ6vT`fQڠ͍80 EpDlm.7յ3R,sƲ6vǙ(Q?T'6:2_~:VyCoŽ湥D2ݔ^FSܳK,&tf6% R*)\K䔯Gq#-ÚGr;%:31NNHdIMtQi3\I#Ր]#&GOiie = Z{߸uuQP%I:D̄79Oc#u u7FcZ+rҚ0jJp')y^:8)w( [g;]"pЕN%뻭ӝz^V'Hr;8|Mr=l~ZFNoX.чsK8f5݄4:1TSGvWLE[ܦhNc^?(N[xǜ4~~z´K0״G99UCQBc[Ʊd՛zP$X+ڸ78*?mV :Eܢi3+u-F pl-s%>.ً方,-xZ .1y-nIa–N/?^ LvDbS=/&ig,2Y`[Jy'n4OD omii.YfK9 B յO70HH1eL4O diW<u,JBniYZD6ѢB,O=j~ vd PڳR|cyXkzu4TΊkV3lĬV 9uu:Xb<TAݢ ݰaTnϼ\#% TɑBE`"ultK̋5N7,-a=,YNrS)g^j˰oDu34~O<=wK= Dy!Q0F8eUGEg`<Ѻ Sm]5v,3"oڔiαZ.UӻbEN>o?=H?~7Ze:rӡFN4S٭}ЖPY<) !]ZsLJ1ׇܶI_?5t$b=QkȁpR㻫ͧrڃ骺941tܴ';WFMXnN'H5G}V0cZˢn6Ւ?d3LYlss>k9NaL &h~DWpٱʸuɤFW[eIj[oc7nϪ5UyLӏ*kY'}-:]o-Svw9|n ܆ӱ[l6--ݒ$xůQh ,Nu:?lх]1^AvC݂=''U+:#f_*O pgE_) CTL8^ i%=̢8׉]:O-eG*ǭ|5nM GAAЇ@B= .^Wl*l,rE/7٦ТION]Ju3)PZZʚ5cpXvac@:ů^PFc k8e+3 %1׊ƏxWFCn!^Kix-D?ЮN!4.Cd`Aɭ. $=*&MU]$tgk,|b $Vpq@}6b[31-$QE~# :W̕[dҺB:kJ>[d Q(Ke,aSmu AR&(&8W4m:KʪlV p5f JŪBX5\Ƅob45 ū OV ICxBK6z=J* Vx8$lP?A˗nGUjWǂLʿm(b!6Q~%Rۺ BIl}}zX;o/&#]pw~#8ctp SP3؃iP I[\ʶ|z,+F`;i}dzAAusC_=!0nMmlAGʂ=GqPWQMA]UG( %9l lYQ*P:fEop.G.FprH~VG2SY†X{E|!w[zUY |W&y7:+},kG[qdՀroc+bcyh>d!k6\SZ1[D`.Ԭ0@(`l?WN 3',c|m4h4]p!-jJ{:-OEY^kǢ JSZwCe_ӭ9(w՟nmN#oyEn0ʅlר=bHA݇]|zRPÓѯx Ww^NOKAzG1 0auÆdX0:la= Ir;O%/p(gk0]Wt<4Oʋ:F^ONoQ`iqke_R\{c'073Ft$0!Mbʄ|Ht۽{[#2Jj.%RLʑJr# .1n=OX`'̕9zcMQ3^dEXXoKgcdR4 Y AGVI ,UnP߆ *pA%L+ݨl-浯Ww+E8q_-J$~0M{7UFk a]:_1T P y-ZUĀX8Wi+=)li]X\ѱ %IB}}JD6= `Py˔ 61',Խýg7Fۧ9= Λ^C7q%ISMM 5 5da\kq beAu>AbJ6L+@>q.%0@-r|9;rv6U[/j'}Zi91:F (~i@Z~/å\;Cz`'RuZP`#F}"u.*UO{fWgV (ɫprRؘ]dRhB1H ^)ֻ [ fjnAz6fB X5 ' hQD7 OP0,Ӻy⤰+^v) rްa ,r:F e(Y^$1$}&*3heMD.SFsPvR{`Zxw~]8=ckwe!Yyƒ5T 5)x s^3HB40;D2A 46XaQGsS&Ļ(|k&[ ҒgX^ i@.9s OS\!Ev-!(ВGok(X٥W(h6-Z4f'/ɝ |vX<%+й|Εl+,<דZx8ݍCHwJA~$,u[P_A*jG=R #wv $q\y܁6i7rJU-~ʸP`W3) bR(B&^e)jp|XM*w9b*hptj>j_(Eap?3 *th8y yE~va^٭rO HFW^W,YD&@ AS8S1M e by&Iͥ2+ `&rV! /'n)aBV8#5` *6< b王OkQPNSKl>F&58wt ij@w$I$P5 5x0pya! $ hFE7\;m亲%=uCǯb(yfgџw8le{[[ov9xwrF!9HhRJ ,פoM)Of|订Ewuu-JbK z "H*GI'^;o(]}4#RupB&} JP$\$$Br)1j\,0^##]1~o@.h"E @><#/ 0# FՑazw_yGEguGܹ8 lAu D!JA "Z$qı,ˢ,˺lTԨQQ MhE(@&P4 MhESERZEUxEkTE\QEP=EUQc1N&@#}6B/I,g8G|yˬzY}Q}8B/+#N>Bʏ # p*E <+y !VpTwy`9{<=<D0>[D(]do@G7FMqNjk`[;X"sT[0C[˿6I [" VGo`n6%rspFAo?s>ЋZFA̰@Q պ]Vŷ|е5k-X atCNQs|ްQ%q?_F|tpX05q\S sz"!]XZw'X|bكq1I"9H\O?VO9l_NYܿ^+9]봸_!tK4"XaM"{&Qj&5۫'{q>ޡzB=qFQ'c;禸ia RrmVf"(}Y:B=K*{5p476_$I4E0/>u6!]O#%&;qWM(xX. ,iܠgamjIjی&l۬Y$+Ȋ}5+ӷ 懛̚ᘄ)&wZt!xJÍnp/ E(;^> ddȵq^#ּAA!d're7IޤۚUZ߾5]@o mH봘]z]v!?!6f܍c.9^ "meFNGzoGlsq}T_7cޞbJHC@6_Qg~6#Cp 6>$B{4J{ >Oe=@'=l^{DGz׿};?4p?!W X)!!X7Rd\KG98 DGZG!X׉uGJuwr u?"\cV;Ex_I|.3 KvD އ;p0tv/("V(s`w/c1ϼG{!╧o;w^y}3 峰&ރsͼ?{[q.?q.f{f3"'c PKY;oPKrHQHEcڳ META-INF/MANIFEST.MFPKrHQH) K META-INF/1D0C682C.SFPKrHQH+0.3 META-INF/1D0C682C.RSAPKS!\R5ۂ[*^cȱ Ft^Ѡ7)kwUWA}M>TOsI֐j+?DS>g t[ZgglgTC̾t%v.9RV*{݃&}9ޣ RUDa))k*S 5VUs h:xlU#%J K#!);΁k >K^bgv]vOyW]ki׶yx,3¥C_>ۈڢ눋C(#t*AGnci\G &]U>uӸ;6-vb߆T|F0їsf̌qazN4#f|Gs}G$߈& 'Lq9Cr BI(-CYbs~=z75;*C7$}d9Dbs?(xAՉk΋-b57!yTgǤhylJ,^cu7uSFP[cCo;n ([c0Ѝ?"܏zcTcϺ󉋏K¾njx57'9gy IMm^r֜6탷 7m|b^GKh<3;r- oIl|$Ŗ֘7X}>7)%oi-uߺoYx/i-w*"gy<^XxxE5^+Wxe˳sxFz+;gxwooa^PKDy+PK AH=-res/drawable/ic_launcher.pngPNG  IHDRw=LIDATHǥyPuƟ{².˲ 8ႈ 628yr OCM5V^ʡbY"0,,{DPXϟ>ߋ4zљp a22x@-q &6'xnب4Ռs-<!a^zD\W6=YMQ2ɗw|՟-f̶vJA؜s1Ym®n>/]ҹr8୔@(r1.}j:Oi> DowJ'CRRVJ eMPy|{|7sRNQy(KNnቹM{p՝Ғ6Q:h++-LxȄsՆIT~M≹\{V{TTX@vL (Ćyq]zAnBFZmHocs  Çd6ihh CCfQ!j2OPSեlUY G?15t"GUˢy*(M6\$""DJiujdo5GcF^G"@ Vx\|T$SgOt ::erOK\]Ϟb¶hӫnZ>5^7 S~6B3Щb#RجJ[ =64%1N ('5+٥bvTD%W< `y*VnJK6͵[h8l3PA$M;QZ1[,U3|.nlIuG2 3 eb2V'0`ę&Uڂg ,.!蒎Q1 F|UJvuӆaL06 cLzN׎zXYٹLGBr8#0LmMOS7onDVv͞} DLژ.C{e 󳵴&cY,ZKSiZ=I`҇6%]Nm},ŅU5SN܈mݷ<65}E޷'0CקԄf.̙3;EnK=_d*/r.Ѵ#>)?/Ԟ H\o7aU%(|${hjǜIL~ cS/LҘPPX"1sgsLuP!!"@&849^1|'3}ȕs_-]$IVM1,,D-aEDA̤rIENDB`PKAHS Lres/layout/activity_main.xmluN@=[$BHA"5%$ 'Ql*x$ G;es;wofw} ƘMCt- G«& 99w%fmF)B[nTχUПg!F$~"u.m*~RUx:R}o{EO١R3~`)6d?Tޟ#]{ȣ>64u6Z?p̑?gqդ~,ᛙPKS LPK AHresources.arsc (0<xres/drawable/ic_launcher.pngres/layout/activity_main.xml&urzip-sNIl(uW[-1J;30@A:8-91(J1234Settings Hello world! info.guardianproject.urzip l, 0attrdrawablelayoutstring08Ln ic_launcher activity_mainapp_nameaction_settings hello_worldH\L4H\L4HT4 PKAHl/cH classes.dex l[uw//)R$u%YCuEKÎءؖe[$JM]җ,AdnlA IF!q [[lٖaڵCVt]6 {tV[tE =H]+[ ?=,8K۷Ro}>yDc]/Vh6RKDHڇAH'Z efS81GWYQ3&ʁ*8.'wOh%j :9$x;S)(x|ִ_?yp |:{ ypg_Ou$`l[$8 yp | *x5[=pSh d@]`Lx< /??p( @.U 9023CnpS`Ti[7߀8(&ʂ.N 5m` u`=6!OF(6] vN$~|E_b*ГJ:i*u]|Ry;Ji*O O^eoSuU!S<*ƽN\ֻO(/`з}o@PNϺ>%U~ʔ^9-*檗EstTGRLjX*y !b!!WżtFi|1FBjdtMDdDCFhA'>+J|}r-JJ*٦$JhZ2d BfBv)igW?,d2Ag, N䧕|N(߉CBaO){ qm=Mc:B&F)eqvD՘~T=|_2I)ּlU2Aϊ}8kdĹ#Dgl"ܣa%%eB! _ӻ%Ϗ`ݼn/U&m0 K]rh]ҷ q%ώyHϟ;!sV?m|{"SK@@}KuXt93< ߀MF쪨 mK!bvn/+ /$|T)j8~v~{1<&Qde”4-n޷WD|\щ{UQnΜB2Xek=nvG6 :+5+a6۵wF3`;ɀ&R>⡡ό^-jc͑ۅ^ BۃҞ9wd,-|s'ޣPyn c9ebbx?%0-j-W0`|J5}ZOF o'ge)i)3H]{j-֬."1=b"?B]r{fLL2T͆=&|xK> k=EQ10n6VM.ֻuڴҙ65c+VHY~pELFGVc]O"N\U JnTr@Jz.ae"Rv|w z?b}@h ZU lUKib#İw[Ůؙ'sO-JiwnhSY^j]u[ כIcS|[t,g۳"ixrEl $$1&69MWKna.Gv[t>[W"O TG;%qPTJ͘TEe۷VTj*UE~$V7&cXcXɃ\@xڌr!RS$w5bB]L OfE(.83M"p)\+x[$c.0B`v 4 6Q Q$ɿ0HD:e:Sgei]ܱ۟f΃:]X\aXX۵Fހ #4ĸ>^Ft$Kq+vfszYEnyNgK'YzR6ԵG٦~ C;HS,qHa=;iݸֱ' c ,=1ƽaCukV.mHruxouag6I;(C1 S M>CPDuηdӄ8y BBp=Zw7:L'% "c"2RQ <ڟ Gr$Z `% h(`$z27PF(D7%L?BB?9`{O{SA8 O'< -5j_9Axw6G8,8 b @0hvS'^w1m6]:e5DKOܹԎ< <{&B;Leoέj,9x";$s$>檊^=֛V_s\Ξ+磨vWb,"9 0#|l~⥝݃eͿyg4`HpA__)uV0icၬ7]ئ1_ >cv)i*c2>ұ,ChJi 7a _^kmv$*eǒzNPIc*1 clpIV@Iq0&s8mFJg]:Ψ^[F,t$M -~0ٕQ^hk5qHLw1[~q1{}=t1w' C+EjUʯ,wG7Z!6g[1K;co;pm(['}Ȟ}*nY=2p)[Y7"kdc .!.LiL 0 BouL#X#|1⚍,>0@TvVʪ ;(lZZ#ӺW7l+>c o"<VzezJ(qeo9/ ")oxlxv ~7FF>[_CR g5(&hL:g3igit@ڦ ݴ鞶QI۰ujaL8)gNTd3VhGkmrqA|۾tPc!\J*L1W_cǥ`ޑ! _JJ?ubC# ϝ;.NN&FP4~R! s>#g07e?amʺb}.Za"V1Mwgۥɤ_>uKZaOnMAgI5x\Ķ_(˖Ïeuwnd^:v(Tzg˨ <'Ee;t)]#gw5/]5|iFg~[dS7PK^ uPKAHDy+AndroidManifest.xmlPK AH=-res/drawable/ic_launcher.pngPKAHS L res/layout/activity_main.xmlPK AH resources.arscPKAHl/cH Pclasses.dexPKAH/%t/ META-INF/MANIFEST.MFPKAHr5!META-INF/CERT.SFPKAH^ u"META-INF/CERT.RSAPK *././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/repo/v1.v2.sig_1020.apk0000644000175000017500000003226514620351225017715 0ustar00hanshansPK^߲AndroidManifest.xml=pElAq,IVd,ɶNa 0cH$# aeN5d4HIAPHPQQL ;kuV:oۏ=O/JZ?A,6tZgs(-ABwW9Bt %\ԃVz =~=D[%4ڋvЯoПR7sg% ݇֡^ڥ*}AHzh69=d%*F_GG_P6}i5L`>==),~1:n{ᒕb:/=7m< q_A8Z#.E͓S/+}U/N\i&/cĺ`1cIš}QkqO+[EY +1ߞtG2ûѭK]o>uu'Tv F;~~m#1vU,#>56>tׄ {` ֪kvyO}klr~K2JTWkϮ" u=umCMaz\1<7Mƨ }OR7唉)*bPR#9m2fѻY&* 5T9PF =˸+G8\hB9hqI(@^9ȉ#Rп"N?jv[@~WTU_4ۮ@%-IV/h*~R^@Z[Yl^ /P.ܵ]x-ިS'?xK_s5xLCZsGo6>a7g h_`!ۘE})LM oJ% q ޴5޸7a1e4^/X)͞=g-]UrZaV`3-/-6ӆ\p2ߒN[»f sCx/xxz x9/߁'k7gK / y ^Bx 7o-XƄU ^7*QW0< ވF4g-xxEoт7$!h,xq5^+[7ʆ3G7D`o1|PKe4pSi  classes.dexil\}xgƱgeD gOo97oA۠Aׂ=` σY;|>VZ)5 npq x -Xv38U&=+-A AII Ic'X ր`Qo7l+vp% >p5;u`>F)f=# HSiLyXZvJovd|N(}vs_zv U:[s76-۠QzǾˣG{]cv!!T =⸕+WJcaWĺoHn2d#}S B6Qqy$Mc$wYK"NdN%W+Fɵ cCcz@q=̍$RM?~O["!M핞koMʸzΐZ%?@IAp"0)i>?aJ}4?V^#M:/MK3Nt[ [=iE}1fl=\ﶰI)"C; {3i@fGxnHۮzIĺڔ֏ EGعjLۑ\}I_{"Vw#(mh%0DŪz#V5ّR#:|>1}aV)iu ~Y?vvhig3ZG}ݫy~'rBDCV:3Au?^4֤XҚF)n3;^D=iKtij=n8ymDfzE\|1Wk)}p[uźpdXv OkYJ/_L #z-ڴ#=-цj w  ˹bGLhvdXQYNu%V1,\1^̓W! zQ>PcAa*;ᯢP$H+Z ^Fn/7Kҁf&Z; }z\;o+jǎ10a\o1YY}3{eXFS‚/>QIWJ+E$׳zV<ȎRX FηgFJKilӫ `%b(dUэv̷Gc>^'5[oxpeت.av //ach `#Pb Ɗk2t/sy0g6L֞,˘`({iE ٶ1g&,Hִm#K]${t)EծeO3[]rwne2{ ^tگ*:fJ%KUP(ϫN>MwOMKw\=\q=VAślBpv~,q]`ܺ`fi/tfX,bi:1vm_vY5#"_m˽Wq{!1#z{).-"vet a'cPtd˾d%I"n!ꩱزxv~~.ɒ6p|Pax|"sY.wn.ejoў(.?hLbb(Wj ۘ5)ʹGIu&e9cSI!fR b2PɊy0m נWp7b3j; #ٔT'- PF 6^MEM3FyO1sej1 ѢS%iQ59Q0* `sp9?iIv2ןN}WR@-^bmCr'wJCO( }=, ďSZN Nxx?&{0o?n){6!߉{!<}Z-A|7+ ^R%Ǘ]~iI:Je }B\n[~̿#e ȷ4Ke_;$._~ZyX@|i 3XDPK }sr res/drawable/ic_launcher.png5PNG  IHDRw=IDATHǭU[P[U=7y] ) I<+ tSGh sMfX^w} "`r?uRh-@@}xs؅l.n~[Y&cPf!ͅu޶e.o_a#_"Ц!GGmq OO@打h[rPVr4ƾ& 70A&өa0pь d7O&"$An<.9k_k1.N MI]x_B689p:][[Bq)5oBuƳ;\2&B@/JOKLhr?Ԭ=`0>WO?.0 'mvV1/.r3hFs!Z B|^%&M'NX}<Һ{^T).7{<9J)mٱɺPzG项MS Ȕn_(mjnx]/*-4h{{jr\5aa+Ѧ@{oMaHv%G7eKWk*dAn%jjn[rXS"DOE .>B']s;`+egⲰS6kLBȁsx_]η ؜YETb']p_$ Ԯo<܏q&c 1p'R0eh_^/_IENDB`PKTgres/layout/activity_main.xmluPN0C[:t`@֡C=#!XU[mI |gJy[*z{x#Kp3 5`Z R=ƕޢָHSo=:[=w )9Ar]á~uT=fQR\MaIX?Aż!"Pgǖqš1=}W:fAf{wd݇Ґ%d}dQ*B|q-v#PKPDDresources.arsc D09X Hello world!Settingsres/drawable/ic_launcher.pngres/layout/activity_main.xmlv1 v2 Signatures v1.v2.sig |\($drawablelayoutstring|00; ic_launcher activity_mainaction_settingsapp_name hello_worldThX@ThX@T`@ PK@>aMETA-INF/RELEASE.SFmn@{߁DY!խAGAia)0CFħ_tuNI$! aԖ@r9-Nc!shI$pT}2U=U_ %me,fY&6ɧ#=kL30':J?pj@HkXa[<n~2{zce0 QtbPqڟg,ip3L,퇛o[@2I;.vUlT"9nKZBA aM =ܞ~;z12cwhKF {&Z IۿVW{Qd`۸Q㲋P4:?a_<)]PGr oнJ/dTVأ 0>_PK@r!|META-INF/RELEASE.RSAU;ԋ݌HE}C*X 5TC#c %n5s(:,3~Ԉ,W<{~y`Q˄IB`,t(BPPDa,T8EBBh. X gaP qTN({K0(%sr/@l\A@zɡM遁~@aYRh[z3R;%So@`X (0pݖ`-3o:-8$C@$A]@A%I]Sÿv8L_8 & ΋X0(h?f4(bfך$-)E/8U6-\NsnC#*h C$T{2Vqhkwsxxekᐓy2ÒK 526Nߡ2&fB&a"?x=\p(AOL;Hl5nXxVw(yp x6mQUPx{f7L$l&Sb:ʲ+[EE m(k\LNpD])Dtn ߰^]C^*O;EZ=}$["庋V_lG! yAn{hY֧T}v8rͲ 3VI2:TrubRd9_Lb/ugBncsE08-8HJRy$6UQo4wq8><(1B41_S5vd.E;s_־3A^~?2*33dfyp4`Gf`ch't]R{~fie7Q{E"$e MFL&L?Jcp]| 9UhD3B޴5sn哂m;7d 4BPaMhGcl yvA-zmO2=6ߚL:Xx: l9 2t.yi~7Mɍ 'Ţb$62^_pK23[@Y~%t7 oI9:e6@JxAle}PPo%$оQ.q1PDP^HZ G]]*!"~ b'8LkE2l@eSRh1QHj3& sa& aMJ_o}& B3ʦ㞦4x dھR+aS70Ɠ jwK܁YBj\/㥆a/XA5U͎L.<ja.DW&zI(1bM`{>;1H]yJ$p:aYeș糨,K B$ ^XAhY WVN}%!kS;mRF!00U?{쥡"SNd{+0  *H  T # My9L~P1 0r+ˣVτ@UR̜}1ӂC>;>\jUCR+bЬ)-j )+oT)CcQt:өwH}7iLj` K8_WG*@fw1-xfQC3IIN?_ڳH3I'P5f>DMI܇u؉LlФ5E[B׽ (:bQ0>l5\q%Hh@܊Xcgw@~h,иGFsnsDM_xD_@qM W (xs^v̜uQ?yLO݊2Ur`>URCh`ȡ㬴| ]r?LT;RT|kƕf}Wdu0`V݂4@4>"i}Wл$v(oA~lL kqWf$Yײ;mBVo.YgaT7Zς{ ukT"G~;Rxt0g.VFdU][ \z2qOK;Fx7[UmM =/c2Ŝ_8qI8~Sr ~}m#dԃ3+=n^1+O[皗RzyFFOhơKz-u&0"0  *H 0 Nۢ>yvA-zmO2=6ߚL:Xx: l9 2t.yi~7Mɍ 'Ţb$62^_pK23[@Y~%t7 oI9:e6@JxAle}PPo%$оQ.q1PDP^HZ G]]*!"~ b'8LkE2l@eSRh1QHj3& sa& aMJ_o}& B3ʦ㞦4x dھR+aS70Ɠ jwK܁YBj\/㥆a/XA5U͎L.<ja.DW&zI(1bM`{>;1H]yJ$p:aYeș糨,K B$ ^XAhY WVN}%!kS;mRF_ APK Sig Block 42PK^߲AndroidManifest.xmlPKe4pSi  classes.dexPK }srures/drawable/ic_launcher.pngPKTgtres/layout/activity_main.xmlPKPDDresources.arscPK@>aMETA-INF/RELEASE.SFPK@r!|META-INF/RELEASE.RSAPKn#&META-INF/MANIFEST.MFPK2././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/rewritemeta.TestCase0000755000175000017500000002122214620351225020133 0ustar00hanshans#!/usr/bin/env python3 import logging import os import sys import unittest import tempfile import textwrap from pathlib import Path localmodule = Path(__file__).resolve().parent.parent print('localmodule: ' + str(localmodule)) if localmodule not in sys.path: sys.path.insert(0, str(localmodule)) from fdroidserver import common, metadata, rewritemeta from testcommon import TmpCwd, mkdtemp class RewriteMetaTest(unittest.TestCase): '''fdroidserver/publish.py''' def setUp(self): logging.basicConfig(level=logging.DEBUG) self.basedir = localmodule / 'tests' os.chdir(self.basedir) metadata.warnings_action = 'error' self._td = mkdtemp() self.testdir = self._td.name def tearDown(self): self._td.cleanup() def test_remove_blank_flags_from_builds_com_politedroid_3(self): """Unset fields in Builds: entries should be removed.""" appid = 'com.politedroid' app = metadata.read_metadata({appid: -1})[appid] builds = rewritemeta.remove_blank_flags_from_builds(app.get('Builds')) self.assertEqual( builds[0], { 'versionName': '1.2', 'versionCode': 3, 'commit': '6a548e4b19', 'target': 'android-10', 'antifeatures': { 'KnownVuln': {}, 'UpstreamNonFree': {}, 'NonFreeAssets': {}, }, }, ) def test_remove_blank_flags_from_builds_com_politedroid_4(self): """Unset fields in Builds: entries should be removed.""" appid = 'com.politedroid' app = metadata.read_metadata({appid: -1})[appid] builds = rewritemeta.remove_blank_flags_from_builds(app.get('Builds')) self.assertEqual( builds[1], { 'versionName': '1.3', 'versionCode': 4, 'commit': 'ad865b57bf3ac59580f38485608a9b1dda4fa7dc', 'target': 'android-15', }, ) def test_remove_blank_flags_from_builds_org_adaway_52(self): """Unset fields in Builds: entries should be removed.""" appid = 'org.adaway' app = metadata.read_metadata({appid: -1})[appid] builds = rewritemeta.remove_blank_flags_from_builds(app.get('Builds')) self.assertEqual( builds[-1], { 'buildjni': ['yes'], 'commit': 'v3.0', 'gradle': ['yes'], 'preassemble': ['renameExecutables'], 'subdir': 'AdAway', 'versionCode': 52, 'versionName': '3.0', }, ) def test_remove_blank_flags_from_builds_no_builds(self): """Unset fields in Builds: entries should be removed.""" self.assertEqual( rewritemeta.remove_blank_flags_from_builds(None), list(), ) self.assertEqual( rewritemeta.remove_blank_flags_from_builds(dict()), list(), ) self.assertEqual( rewritemeta.remove_blank_flags_from_builds(list()), list(), ) self.assertEqual( rewritemeta.remove_blank_flags_from_builds(set()), list(), ) self.assertEqual( rewritemeta.remove_blank_flags_from_builds(tuple()), list(), ) def test_remove_blank_flags_from_builds_0_is_a_value(self): self.assertEqual( rewritemeta.remove_blank_flags_from_builds([{'versionCode': 0}]), [{'versionCode': 0}], ) def test_remove_blank_flags_from_builds_values_to_purge(self): self.assertEqual( rewritemeta.remove_blank_flags_from_builds( [ { 'antifeatures': dict(), 'forceversion': False, 'init': None, 'rm': '', 'scandelete': list(), 'versionCode': 0, }, {'antifeatures': list(), 'versionCode': 1}, {'antifeatures': '', 'versionCode': 2}, ] ), [{'versionCode': 0}, {'versionCode': 1}, {'versionCode': 2}], ) def test_rewrite_no_builds(self): os.chdir(self.testdir) Path('metadata').mkdir() with Path('metadata/a.yml').open('w') as f: f.write('AutoName: a') rewritemeta.main() self.assertEqual( Path('metadata/a.yml').read_text(encoding='utf-8'), textwrap.dedent( '''\ License: Unknown AutoName: a AutoUpdateMode: None UpdateCheckMode: None ''' ), ) def test_rewrite_empty_build_field(self): os.chdir(self.testdir) Path('metadata').mkdir() with Path('metadata/a.yml').open('w') as fp: fp.write( textwrap.dedent( """ License: Apache-2.0 Builds: - versionCode: 4 versionName: a rm: """ ) ) rewritemeta.main() self.assertEqual( Path('metadata/a.yml').read_text(encoding='utf-8'), textwrap.dedent( '''\ License: Apache-2.0 Builds: - versionName: a versionCode: 4 AutoUpdateMode: None UpdateCheckMode: None ''' ), ) def test_remove_blank_flags_from_builds_app_with_special_build_params(self): appid = 'app.with.special.build.params' app = metadata.read_metadata({appid: -1})[appid] builds = rewritemeta.remove_blank_flags_from_builds(app.get('Builds')) self.assertEqual( builds[-1], { 'versionName': '2.1.2', 'versionCode': 51, 'disable': 'Labelled as pre-release, so skipped', }, ) def test_remove_blank_flags_from_builds_app_with_special_build_params_af(self): """Unset fields in Builds: entries should be removed.""" appid = 'app.with.special.build.params' app = metadata.read_metadata({appid: -1})[appid] builds = rewritemeta.remove_blank_flags_from_builds(app.get('Builds')) self.assertEqual( builds[-2], { 'antifeatures': { 'Ads': {'en-US': 'includes ad lib\n', 'zh-CN': '包括广告图书馆\n'}, 'Tracking': {'en-US': 'standard suspects\n'}, }, 'commit': '2.1.1', 'maven': '2', 'patch': [ 'manifest-ads.patch', 'mobilecore.patch', ], 'srclibs': ['FacebookSDK@sdk-version-3.0.2'], 'versionCode': 50, 'versionName': '2.1.1-c', }, ) def test_rewrite_scenario_trivial(self): sys.argv = ['rewritemeta', 'a', 'b'] with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): Path('metadata').mkdir() with Path('metadata/a.yml').open('w') as f: f.write('AutoName: a') with Path('metadata/b.yml').open('w') as f: f.write('AutoName: b') rewritemeta.main() self.assertEqual( Path('metadata/a.yml').read_text(encoding='utf-8'), textwrap.dedent( '''\ License: Unknown AutoName: a AutoUpdateMode: None UpdateCheckMode: None ''' ), ) self.assertEqual( Path('metadata/b.yml').read_text(encoding='utf-8'), textwrap.dedent( '''\ License: Unknown AutoName: b AutoUpdateMode: None UpdateCheckMode: None ''' ), ) if __name__ == "__main__": import argparse parser = argparse.ArgumentParser() parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) common.options = common.parse_args(parser) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(RewriteMetaTest)) unittest.main(failfast=False) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/run-tests0000755000175000017500000014537714620351225016057 0ustar00hanshans#!/bin/bash set -e # quit script on error echo_header() { { echo -e "==============================================================================\n$1"; } 2>/dev/null } get_fdroid_apk_filename() { if [ -z $aapt ]; then appid=$(androguard apkid "$1" | sed -En 's/ +"([a-z][^"]+)",$/\1/ip') versionCode=$(androguard apkid "$1" | sed -En 's/ +"([0-9]+)",$/\1/p') echo "${appid}_${versionCode}.apk" else $aapt dump badging "$1" | sed -n "s,^package: name='\(.*\)' versionCode='\([0-9][0-9]*\)' .*,\1_\2.apk,p" fi } copy_apks_into_repo() { set +x find $APKDIR -type f -name '*.apk' -print0 | while IFS= read -r -d '' f; do echo $f | grep -F -v -e unaligned -e unsigned -e badsig -e badcert -e bad-unicode -e janus.apk || continue apk=`get_fdroid_apk_filename "$f"` test "$f" -nt repo/$apk && rm -f repo/$apk # delete existing if $f is newer if [ ! -e repo/$apk ] && [ ! -e archive/$apk ]; then echo "$f --> repo/$apk" ln "$f" $1/repo/$apk || \ rsync -axv "$f" $1/repo/$apk # rsync if hard link is not possible touch $1/.found-apks fi done if [ ! -e $1/.found-apks ]; then echo "ERROR: The dir APKDIR must have APKs in it! $APKDIR does not." exit 1 fi set -x } # keep this as an old version to test the automatic parsing of build-tools # verion numbers in `fdroid init` create_fake_android_home() { mkdir $1/tools mkdir $1/platform-tools mkdir $1/build-tools mkdir $1/build-tools/19.0.2 touch $1/build-tools/19.0.2/aapt } create_test_dir() { test -e $WORKSPACE/.testfiles || mkdir $WORKSPACE/.testfiles mktemp -d $WORKSPACE/.testfiles/run-tests.XXXX } create_test_file() { test -e $WORKSPACE/.testfiles || mkdir $WORKSPACE/.testfiles TMPDIR=$WORKSPACE/.testfiles mktemp } fdroid_init_with_prebuilt_keystore() { if [ -z "$1" ]; then keystore=$WORKSPACE/tests/keystore.jks else keystore="$1" fi $fdroid init --keystore $keystore --repo-keyalias=sova echo 'keystorepass: r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' >> config.yml echo 'keypass: r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' >> config.yml } is_MD5_disabled() { javac $WORKSPACE/tests/IsMD5Disabled.java && java -cp $WORKSPACE/tests IsMD5Disabled } use_apksigner() { python3 -c " import sys sys.path.insert(0, '$WORKSPACE') from fdroidserver import common c = {'sdk_path': '$ANDROID_HOME'} common.find_apksigner(c) exit(c.get('apksigner') is None) " } err_handler() { # remove this to prevent git conflicts and complaining set +x rm -rf "$WORKSPACE"/fdroidserver.egg-info/ rm -rf "$WORKSPACE"/.testfiles/run-tests.* rm -rf "$WORKSPACE"/.testfiles/test_* rm -f "$WORKSPACE"/.testfiles/tmp.* test -d "$WORKSPACE"/.testfiles && \ (rmdir "$WORKSPACE"/.testfiles 2> /dev/null || \ rmdir --ignore-fail-on-non-empty "$WORKSPACE"/.testfiles 2> /dev/null) } trap err_handler INT EXIT #------------------------------------------------------------------------------# # "main" if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then set +x echo "Usage: $0 '/path/to/folder/with/apks'" exit 1 fi if [ -z "$ANDROID_HOME" ]; then if python3 -c "import androguard"; then echo "ANDROID_HOME is not set, using androguard" else echo "ERROR: ANDROID_HOME is not set, androguard is not available!" exit 1 fi else echo "Using ANDROID_HOME=$ANDROID_HOME" fi if [ -d tests ]; then cd tests fi if [ -z "$1" ]; then APKDIR=`pwd` else APKDIR=$1 fi if [ ! -d "$APKDIR" ]; then echo "ERROR: '$APKDIR' does not exist!" exit 1 fi if [ -z "$WORKSPACE" ]; then WORKSPACE="$(dirname "$(pwd)")" echo "Setting Workspace to $WORKSPACE" fi # allow the location of the script to be overridden if [ -z "$fdroid" ]; then fdroid="$WORKSPACE/fdroid" fi # allow the location of aapt to be overridden if [ -z "$aapt" ]; then aapt=`ls -1 $ANDROID_HOME/build-tools/*/aapt 2> /dev/null | sort | tail -1` fi # try to use GNU sed on OSX/BSD cuz BSD sed sucks if which gsed; then sed="gsed" else sed="sed" fi # allow the location of git to be overridden if [ -z "$git" ]; then # shellcheck disable=SC2089 git="env HOME= GIT_AUTHOR_NAME='Test' GIT_AUTHOR_EMAIL='no@mail' GIT_COMMITTER_NAME='Test' GIT_COMMITTER_EMAIL='no@mail' git" fi set -x # show each command as it is executed #------------------------------------------------------------------------------# echo_header "run commit hooks" cd $WORKSPACE test -x ./hooks/pre-commit && ./hooks/pre-commit #------------------------------------------------------------------------------# echo_header "run unit tests" cd $WORKSPACE/tests for testcase in $WORKSPACE/tests/*.TestCase; do if [ $testcase == $WORKSPACE/tests/install.TestCase ]; then echo "skipping install.TestCase, its too troublesome in CI builds" continue fi if [ $(uname) != "Linux" ] && [ $testcase == $WORKSPACE/tests/nightly.TestCase ]; then echo "skipping nightly.TestCase, it currently only works GNU/Linux" continue fi $testcase done #------------------------------------------------------------------------------# echo_header "print fdroid version" $fdroid --version #------------------------------------------------------------------------------# echo_header 'run process when building and signing are on separate machines' if use_apksigner; then REPOROOT=`create_test_dir` cd $REPOROOT cp $WORKSPACE/tests/keystore.jks $REPOROOT/ $fdroid init --keystore keystore.jks --repo-keyalias=sova echo 'make_current_version_link: true' >> config.yml echo 'keystorepass: r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' >> config.yml echo 'keypass: r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' >> config.yml echo 'keydname: "CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=California, C=US"' >> config.yml test -d archive || mkdir archive test -d metadata || mkdir metadata cp $WORKSPACE/tests/metadata/info.guardianproject.urzip.yml metadata/ test -d repo || mkdir repo test -d unsigned || mkdir unsigned cp $WORKSPACE/tests/urzip-release-unsigned.apk unsigned/info.guardianproject.urzip_100.apk $fdroid publish --verbose $fdroid update --verbose --nosign $fdroid signindex --verbose test -e repo/index.xml test -e repo/index.jar test -e repo/index-v1.jar test -e tmp/apkcache.json ! test -z tmp/apkcache.json test -L urzip.apk grep -F '> config.yml mkdir metadata cp $WORKSPACE/tests/urzip.apk $WORKSPACE/tests/bad-unicode*.apk repo/ cp $WORKSPACE/tests/metadata/info.guardianproject.urzip.yml metadata/ $fdroid readmeta $fdroid update #------------------------------------------------------------------------------# echo_header 'copy git import and run "fdroid scanner" on it' REPOROOT=`create_test_dir` cd $REPOROOT mkdir metadata echo "AutoName: Just A Test" > metadata/org.fdroid.ci.test.app.yml echo "WebSite: " >> metadata/org.fdroid.ci.test.app.yml echo "Builds:" >> metadata/org.fdroid.ci.test.app.yml echo " - versionName: 0.3" >> metadata/org.fdroid.ci.test.app.yml echo " versionCode: 300" >> metadata/org.fdroid.ci.test.app.yml echo " commit: 0.3" >> metadata/org.fdroid.ci.test.app.yml echo " subdir: app" >> metadata/org.fdroid.ci.test.app.yml echo " gradle:" >> metadata/org.fdroid.ci.test.app.yml echo " - yes" >> metadata/org.fdroid.ci.test.app.yml echo "" >> metadata/org.fdroid.ci.test.app.yml echo "Repo: https://gitlab.com/fdroid/ci-test-app.git" >> metadata/org.fdroid.ci.test.app.yml echo "RepoType: git" >> metadata/org.fdroid.ci.test.app.yml mkdir build git clone https://gitlab.com/fdroid/ci-test-app.git build/org.fdroid.ci.test.app ls -l build/org.fdroid.ci.test.app $fdroid scanner org.fdroid.ci.test.app --verbose #------------------------------------------------------------------------------# echo_header "copy tests/repo, generate java/gpg keys, update, and gpgsign" REPOROOT=`create_test_dir` GNUPGHOME=$REPOROOT/gnupghome cd $REPOROOT fdroid_init_with_prebuilt_keystore cp -a \ $WORKSPACE/tests/config \ $WORKSPACE/tests/metadata \ $WORKSPACE/tests/repo \ $WORKSPACE/tests/stats \ $REPOROOT/ cp -a $WORKSPACE/tests/gnupghome $GNUPGHOME chmod 0700 $GNUPGHOME echo "install_list: org.adaway" >> config.yml echo "uninstall_list: [com.android.vending, com.facebook.orca]" >> config.yml echo "gpghome: $GNUPGHOME" >> config.yml echo "gpgkey: CE71F7FB" >> config.yml echo "mirrors: ['http://foobarfoobarfoobar.onion/fdroid', 'https://foo.bar/fdroid']" >> config.yml $fdroid update --verbose --pretty test -e repo/index.xml test -e repo/index.jar test -e repo/index-v1.jar grep -F ' repo/index-v2.org.json $sed -z 's/,\s*"ipfsCIDv1": *"[a-z0-9]*"//g' repo/index-v2.json > repo/index-v2.mod.json $sed -i --expression='s,"timestamp": [0-9]*,"timestamp": 1676634233000,' repo/index-v2.mod.json diff -uw repo/index-v2.org.json repo/index-v2.mod.json #------------------------------------------------------------------------------# echo_header 'test moving lots of APKs to the archive' REPOROOT=`create_test_dir` cd $REPOROOT fdroid_init_with_prebuilt_keystore $sed -i.tmp '/allow_disabled_algorithms/d' config.yml test -d metadata || mkdir metadata cp $WORKSPACE/tests/metadata/*.yml metadata/ echo 'Summary: good test version of urzip' > metadata/info.guardianproject.urzip.yml echo 'Summary: good MD5 sig, which is disabled algorithm' > metadata/org.bitbucket.tickytacky.mirrormirror.yml $sed -i.tmp '/ArchivePolicy:/d' metadata/*.yml test -d repo || mkdir repo cp $WORKSPACE/tests/urzip.apk \ $WORKSPACE/tests/org.bitbucket.tickytacky.mirrormirror_[0-9].apk \ $WORKSPACE/tests/repo/com.politedroid_[0-9].apk \ $WORKSPACE/tests/repo/obb.main.twoversions_110161[357].apk \ repo/ printf '\narchive_older: 3\n' >> config.yml $fdroid update --pretty --nosign if use_apksigner; then test `grep '' archive/index.xml | wc -l` -eq 2 test `grep '' repo/index.xml | wc -l` -eq 10 else echo "This will fail when jarsigner allows MD5 for APK signatures" test `grep '' archive/index.xml | wc -l` -eq 5 test `grep '' repo/index.xml | wc -l` -eq 7 fi #------------------------------------------------------------------------------# if ! use_apksigner; then echo_header 'test per-app "Archive Policy"' REPOROOT=`create_test_dir` cd $REPOROOT fdroid_init_with_prebuilt_keystore test -d metadata || mkdir metadata cp $WORKSPACE/tests/metadata/com.politedroid.yml metadata/ test -d repo || mkdir repo cp $WORKSPACE/tests/repo/com.politedroid_[0-9].apk repo/ printf '\narchive_older: 3\n' >> config.yml $fdroid update --pretty --nosign test `grep '' archive/index.xml | wc -l` -eq 0 test `grep '' repo/index.xml | wc -l` -eq 4 grep -F com.politedroid_3.apk repo/index.xml grep -F com.politedroid_4.apk repo/index.xml grep -F com.politedroid_5.apk repo/index.xml grep -F com.politedroid_6.apk repo/index.xml test -e repo/com.politedroid_3.apk test -e repo/com.politedroid_4.apk test -e repo/com.politedroid_5.apk test -e repo/com.politedroid_6.apk echo "enable one app in the repo" $sed -i.tmp 's,^ArchivePolicy: 4,ArchivePolicy: 1,' metadata/com.politedroid.yml $fdroid update --pretty --nosign test `grep '' archive/index.xml | wc -l` -eq 3 test `grep '' repo/index.xml | wc -l` -eq 1 grep -F com.politedroid_3.apk archive/index.xml grep -F com.politedroid_4.apk archive/index.xml grep -F com.politedroid_5.apk archive/index.xml grep -F com.politedroid_6.apk repo/index.xml test -e archive/com.politedroid_3.apk test -e archive/com.politedroid_4.apk test -e archive/com.politedroid_5.apk test -e repo/com.politedroid_6.apk echo "remove all apps from the repo" $sed -i.tmp 's,^ArchivePolicy: 1,ArchivePolicy: 0,' metadata/com.politedroid.yml $fdroid update --pretty --nosign test `grep '' archive/index.xml | wc -l` -eq 4 test `grep '' repo/index.xml | wc -l` -eq 0 grep -F com.politedroid_3.apk archive/index.xml grep -F com.politedroid_4.apk archive/index.xml grep -F com.politedroid_5.apk archive/index.xml grep -F com.politedroid_6.apk archive/index.xml test -e archive/com.politedroid_3.apk test -e archive/com.politedroid_4.apk test -e archive/com.politedroid_5.apk test -e archive/com.politedroid_6.apk ! test -e repo/com.politedroid_6.apk echo "move back one from archive to the repo" $sed -i.tmp 's,^ArchivePolicy: 0,ArchivePolicy: 1,' metadata/com.politedroid.yml $fdroid update --pretty --nosign test `grep '' archive/index.xml | wc -l` -eq 3 test `grep '' repo/index.xml | wc -l` -eq 1 grep -F com.politedroid_3.apk archive/index.xml grep -F com.politedroid_4.apk archive/index.xml grep -F com.politedroid_5.apk archive/index.xml grep -F com.politedroid_6.apk repo/index.xml test -e archive/com.politedroid_3.apk test -e archive/com.politedroid_4.apk test -e archive/com.politedroid_5.apk ! test -e archive/com.politedroid_6.apk test -e repo/com.politedroid_6.apk echo "set an earlier version as CVC and test that it's the only one not archived" $sed -i.tmp 's,^CurrentVersionCode: 6,CurrentVersionCode: 5,' metadata/com.politedroid.yml $fdroid update --pretty --nosign test `grep '' archive/index.xml | wc -l` -eq 3 test `grep '' repo/index.xml | wc -l` -eq 1 grep -F com.politedroid_3.apk archive/index.xml grep -F com.politedroid_4.apk archive/index.xml grep -F com.politedroid_5.apk repo/index.xml grep -F com.politedroid_6.apk archive/index.xml test -e archive/com.politedroid_3.apk test -e archive/com.politedroid_4.apk test -e repo/com.politedroid_5.apk ! test -e repo/com.politedroid_6.apk test -e archive/com.politedroid_6.apk fi #------------------------------------------------------------------------------# echo_header 'test moving old APKs to and from the archive' REPOROOT=`create_test_dir` cd $REPOROOT fdroid_init_with_prebuilt_keystore test -d metadata || mkdir metadata cp $WORKSPACE/tests/metadata/com.politedroid.yml metadata/ $sed -i.tmp '/ArchivePolicy:/d' metadata/com.politedroid.yml test -d repo || mkdir repo cp $WORKSPACE/tests/repo/com.politedroid_[0-9].apk repo/ printf '\narchive_older: 3\n' >> config.yml $fdroid update --pretty --nosign test `grep '' archive/index.xml | wc -l` -eq 1 test `grep '' repo/index.xml | wc -l` -eq 3 grep -F com.politedroid_3.apk archive/index.xml grep -F com.politedroid_4.apk repo/index.xml grep -F com.politedroid_5.apk repo/index.xml grep -F com.politedroid_6.apk repo/index.xml test -e archive/com.politedroid_3.apk test -e repo/com.politedroid_4.apk test -e repo/com.politedroid_5.apk test -e repo/com.politedroid_6.apk $sed -i.tmp 's,archive_older: 3,archive_older: 1,' config.yml $fdroid update --pretty --nosign test `grep '' archive/index.xml | wc -l` -eq 3 test `grep '' repo/index.xml | wc -l` -eq 1 grep -F com.politedroid_3.apk archive/index.xml grep -F com.politedroid_4.apk archive/index.xml grep -F com.politedroid_5.apk archive/index.xml grep -F com.politedroid_6.apk repo/index.xml test -e archive/com.politedroid_3.apk test -e archive/com.politedroid_4.apk test -e archive/com.politedroid_5.apk test -e repo/com.politedroid_6.apk # disabling deletes from the archive $sed -i.tmp 's/\(versionCode: 4\)/\1\n disable: testing deletion/' metadata/com.politedroid.yml $fdroid update --pretty --nosign test `grep '' archive/index.xml | wc -l` -eq 2 test `grep '' repo/index.xml | wc -l` -eq 1 grep -F com.politedroid_3.apk archive/index.xml ! grep -F com.politedroid_4.apk archive/index.xml grep -F com.politedroid_5.apk archive/index.xml grep -F com.politedroid_6.apk repo/index.xml test -e archive/com.politedroid_3.apk ! test -e archive/com.politedroid_4.apk test -e archive/com.politedroid_5.apk test -e repo/com.politedroid_6.apk # disabling deletes from the repo, and promotes one from the archive $sed -i.tmp 's/\(versionCode: 6\)/\1\n disable: testing deletion/' metadata/com.politedroid.yml $fdroid update --pretty --nosign test `grep '' archive/index.xml | wc -l` -eq 1 test `grep '' repo/index.xml | wc -l` -eq 1 grep -F com.politedroid_3.apk archive/index.xml grep -F com.politedroid_5.apk repo/index.xml ! grep -F com.politedroid_6.apk repo/index.xml test -e archive/com.politedroid_3.apk test -e repo/com.politedroid_5.apk ! test -e repo/com.politedroid_6.apk #------------------------------------------------------------------------------# echo_header 'test that verify can succeed and fail' REPOROOT=`create_test_dir` cd $REPOROOT test -d tmp || mkdir tmp test -d unsigned || mkdir unsigned cp $WORKSPACE/tests/repo/com.politedroid_6.apk tmp/ cp $WORKSPACE/tests/repo/com.politedroid_6.apk unsigned/ $fdroid verify --reuse-remote-apk --verbose com.politedroid # force a fail cp $WORKSPACE/tests/repo/com.politedroid_5.apk unsigned/com.politedroid_6.apk ! $fdroid verify --reuse-remote-apk --verbose com.politedroid #------------------------------------------------------------------------------# echo_header 'test allowing disabled signatures in repo and archive' REPOROOT=`create_test_dir` cd $REPOROOT fdroid_init_with_prebuilt_keystore echo 'allow_disabled_algorithms: true' >> config.yml printf '\narchive_older: 3\n' >> config.yml test -d metadata || mkdir metadata cp $WORKSPACE/tests/metadata/com.politedroid.yml metadata/ echo 'Summary: good test version of urzip' > metadata/info.guardianproject.urzip.yml echo 'Summary: good MD5 sig, disabled algorithm' > metadata/org.bitbucket.tickytacky.mirrormirror.yml $sed -i.tmp '/ArchivePolicy:/d' metadata/*.yml test -d repo || mkdir repo cp $WORKSPACE/tests/repo/com.politedroid_[0-9].apk \ $WORKSPACE/tests/org.bitbucket.tickytacky.mirrormirror_[0-9].apk \ $WORKSPACE/tests/urzip-badsig.apk \ repo/ $fdroid update --pretty --nosign test `grep '' archive/index.xml | wc -l` -eq 2 test `grep '' repo/index.xml | wc -l` -eq 6 grep -F com.politedroid_3.apk archive/index.xml grep -F com.politedroid_4.apk repo/index.xml grep -F com.politedroid_5.apk repo/index.xml grep -F com.politedroid_6.apk repo/index.xml grep -F org.bitbucket.tickytacky.mirrormirror_1.apk archive/index.xml grep -F org.bitbucket.tickytacky.mirrormirror_2.apk repo/index.xml grep -F org.bitbucket.tickytacky.mirrormirror_3.apk repo/index.xml grep -F org.bitbucket.tickytacky.mirrormirror_4.apk repo/index.xml ! grep -F urzip-badsig.apk repo/index.xml ! grep -F urzip-badsig.apk archive/index.xml test -e archive/com.politedroid_3.apk test -e repo/com.politedroid_4.apk test -e repo/com.politedroid_5.apk test -e repo/com.politedroid_6.apk test -e archive/org.bitbucket.tickytacky.mirrormirror_1.apk test -e repo/org.bitbucket.tickytacky.mirrormirror_2.apk test -e repo/org.bitbucket.tickytacky.mirrormirror_3.apk test -e repo/org.bitbucket.tickytacky.mirrormirror_4.apk test -e archive/urzip-badsig.apk sed -i.tmp '/apksigner:/d' config.yml if ! use_apksigner; then $sed -i.tmp '/allow_disabled_algorithms/d' config.yml $fdroid update --pretty --nosign test `grep '' archive/index.xml | wc -l` -eq 5 test `grep '' repo/index.xml | wc -l` -eq 3 grep -F org.bitbucket.tickytacky.mirrormirror_1.apk archive/index.xml grep -F org.bitbucket.tickytacky.mirrormirror_2.apk archive/index.xml grep -F org.bitbucket.tickytacky.mirrormirror_3.apk archive/index.xml grep -F org.bitbucket.tickytacky.mirrormirror_4.apk archive/index.xml grep -F com.politedroid_3.apk archive/index.xml grep -F com.politedroid_4.apk repo/index.xml grep -F com.politedroid_5.apk repo/index.xml grep -F com.politedroid_6.apk repo/index.xml ! grep -F urzip-badsig.apk repo/index.xml ! grep -F urzip-badsig.apk archive/index.xml test -e archive/org.bitbucket.tickytacky.mirrormirror_1.apk test -e archive/org.bitbucket.tickytacky.mirrormirror_2.apk test -e archive/org.bitbucket.tickytacky.mirrormirror_3.apk test -e archive/org.bitbucket.tickytacky.mirrormirror_4.apk test -e archive/com.politedroid_3.apk test -e archive/urzip-badsig.apk test -e repo/com.politedroid_4.apk test -e repo/com.politedroid_5.apk test -e repo/com.politedroid_6.apk fi # test unarchiving when disabled_algorithms are allowed again echo 'allow_disabled_algorithms: true' >> config.yml $fdroid update --pretty --nosign test `grep '' archive/index.xml | wc -l` -eq 2 test `grep '' repo/index.xml | wc -l` -eq 6 grep -F com.politedroid_3.apk archive/index.xml grep -F com.politedroid_4.apk repo/index.xml grep -F com.politedroid_5.apk repo/index.xml grep -F com.politedroid_6.apk repo/index.xml grep -F org.bitbucket.tickytacky.mirrormirror_1.apk archive/index.xml grep -F org.bitbucket.tickytacky.mirrormirror_2.apk repo/index.xml grep -F org.bitbucket.tickytacky.mirrormirror_3.apk repo/index.xml grep -F org.bitbucket.tickytacky.mirrormirror_4.apk repo/index.xml ! grep -F urzip-badsig.apk repo/index.xml ! grep -F urzip-badsig.apk archive/index.xml test -e archive/com.politedroid_3.apk test -e repo/com.politedroid_4.apk test -e repo/com.politedroid_5.apk test -e repo/com.politedroid_6.apk test -e archive/org.bitbucket.tickytacky.mirrormirror_1.apk test -e repo/org.bitbucket.tickytacky.mirrormirror_2.apk test -e repo/org.bitbucket.tickytacky.mirrormirror_3.apk test -e repo/org.bitbucket.tickytacky.mirrormirror_4.apk test -e archive/urzip-badsig.apk #------------------------------------------------------------------------------# echo_header 'rename apks with `fdroid update --rename-apks`, --nosign for speed' REPOROOT=`create_test_dir` cd $REPOROOT fdroid_init_with_prebuilt_keystore echo 'keydname: "CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=California, C=US"' >> config.yml test -d metadata || mkdir metadata cp $WORKSPACE/tests/metadata/info.guardianproject.urzip.yml metadata/ test -d repo || mkdir repo cp $WORKSPACE/tests/urzip.apk "repo/asdfiuhk urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234 ö.apk" $fdroid update --rename-apks --pretty --nosign test -e repo/info.guardianproject.urzip_100.apk grep -F 'info.guardianproject.urzip_100.apk' repo/index-v1.json repo/index.xml cp $WORKSPACE/tests/urzip-release.apk repo/ $fdroid update --rename-apks --pretty --nosign test -e repo/info.guardianproject.urzip_100.apk test -e repo/info.guardianproject.urzip_100_b4964fd.apk grep -F 'info.guardianproject.urzip_100.apk' repo/index-v1.json repo/index.xml grep -F 'info.guardianproject.urzip_100_b4964fd.apk' repo/index-v1.json ! grep -F 'info.guardianproject.urzip_100_b4964fd.apk' repo/index.xml cp $WORKSPACE/tests/urzip-release.apk repo/ $fdroid update --rename-apks --pretty --nosign test -e repo/info.guardianproject.urzip_100.apk test -e repo/info.guardianproject.urzip_100_b4964fd.apk test -e duplicates/repo/info.guardianproject.urzip_100_b4964fd.apk grep -F 'info.guardianproject.urzip_100.apk' repo/index-v1.json repo/index.xml grep -F 'info.guardianproject.urzip_100_b4964fd.apk' repo/index-v1.json ! grep -F 'info.guardianproject.urzip_100_b4964fd.apk' repo/index.xml #------------------------------------------------------------------------------# echo_header "test for added date being set correctly for repo and archive" REPOROOT=`create_test_dir` cd $REPOROOT fdroid_init_with_prebuilt_keystore printf '\narchive_older: 3\n' >> config.yml mkdir -p {repo,archive,metadata,stats} cp $WORKSPACE/tests/repo/com.politedroid_5.apk archive cp $WORKSPACE/tests/repo/com.politedroid_6.apk repo cp $WORKSPACE/tests/metadata/com.politedroid.yml metadata #TODO: the timestamp of the oldest apk in the file should be used, even if that # doesn't exist anymore echo "com.politedroid_4.apk com.politedroid 2016-01-01" > stats/known_apks.txt echo "com.politedroid_5.apk com.politedroid 2017-01-01" >> stats/known_apks.txt echo "com.politedroid_6.apk com.politedroid 2018-01-01" >> stats/known_apks.txt $sed -i -e 's/ArchivePolicy:.*/ArchivePolicy: 1 versions/' metadata/com.politedroid.yml timestamp=1483228800 # $(date -u --date=2017-01-01 +%s)000 $fdroid update --pretty --nosign grep -F "\"added\": $timestamp" repo/index-v1.json # the archive will have the added timestamp for the app and for the apk, both need to be there if [ $(grep -F "\"added\": $timestamp" archive/index-v1.json | wc -l) == 2 ]; then true; else false;fi #------------------------------------------------------------------------------# echo_header "test whatsnew from fastlane without CVC set" REPOROOT=`create_test_dir` cd $REPOROOT fdroid_init_with_prebuilt_keystore mkdir -p metadata/com.politedroid/en-US/changelogs/ cp $WORKSPACE/tests/repo/com.politedroid_6.apk repo cp $WORKSPACE/tests/metadata/com.politedroid.yml metadata echo "whatsnew test" > metadata/com.politedroid/en-US/changelogs/6.txt $sed -i -e '/CurrentVersion/d' metadata/com.politedroid.yml $fdroid update --pretty --nosign grep -F 'whatsnew' repo/index-v1.json #------------------------------------------------------------------------------# echo_header "test metadata checks" REPOROOT=`create_test_dir` cd $REPOROOT mkdir repo cp $WORKSPACE/tests/urzip.apk $REPOROOT/repo/ set +e $fdroid build if [ $? -eq 0 ]; then echo "This should have failed because there is no metadata!" exit 1 else echo "testing metadata checks passed" fi set -e mkdir $REPOROOT/metadata/ cp $WORKSPACE/tests/metadata/org.smssecure.smssecure.yml $REPOROOT/metadata/ $fdroid readmeta #------------------------------------------------------------------------------# echo_header "ensure commands that don't need the JDK work without a JDK configed" REPOROOT=`create_test_dir` cd $REPOROOT mkdir repo mkdir metadata echo "License: GPL-2.0-only" >> metadata/fake.yml echo "Summary: Yup still fake" >> metadata/fake.yml echo "Categories: [Internet]" >> metadata/fake.yml echo "Description: |" >> metadata/fake.yml echo " this is fake" >> metadata/fake.yml # fake that no JDKs are available cat > config.yml <> config.yml $fdroid checkupdates --allow-dirty || true which gpg && $fdroid gpgsign $fdroid lint $fdroid readmeta $fdroid rewritemeta fake $fdroid deploy $fdroid deploy $fdroid scanner # run these to get their output, but the are not setup, so don't fail $fdroid build || true $fdroid import || true $fdroid install || true #------------------------------------------------------------------------------# # only run this test if running from a git repo, not all files are in the tarball if [ -e .git/config ]; then echo_header "create a source tarball" cd $WORKSPACE ./setup.py compile_catalog sdist REPOROOT=`create_test_dir` cd $REPOROOT tar xzf `ls -1 $WORKSPACE/dist/fdroidserver-*.tar.gz | sort -n | tail -1` cd $REPOROOT # shellcheck disable=SC2211 ./fdroidserver-*/fdroid init copy_apks_into_repo $REPOROOT # shellcheck disable=SC2211 ./fdroidserver-*/fdroid update --create-metadata --verbose fi #------------------------------------------------------------------------------# echo_header "test config checks of local_copy_dir" REPOROOT=`create_test_dir` cd $REPOROOT $fdroid init $fdroid update --create-metadata --verbose $fdroid readmeta LOCAL_COPY_DIR=`create_test_dir`/fdroid $fdroid deploy --local-copy-dir=$LOCAL_COPY_DIR $fdroid deploy --local-copy-dir=$LOCAL_COPY_DIR --verbose # now test the errors work set +e $fdroid deploy --local-copy-dir=thisisnotanabsolutepath if [ $? -eq 0 ]; then echo "This should have failed because thisisnotanabsolutepath is not an absolute path!" exit 1 else echo "testing absolute path checker passed" fi $fdroid deploy --local-copy-dir=/tmp/IReallyDoubtThisPathExistsasdfasdf if [ $? -eq 0 ]; then echo "This should have failed because the path does not end with 'fdroid'!" exit 1 else echo "testing dirname exists checker passed" fi $fdroid deploy --local-copy-dir=/tmp/IReallyDoubtThisPathExistsasdfasdf/fdroid if [ $? -eq 0 ]; then echo "This should have failed because the dirname path does not exist!" exit 1 else echo "testing dirname exists checker passed" fi set -e #------------------------------------------------------------------------------# echo_header "setup a new repo from scratch using ANDROID_HOME and do a local sync" REPOROOT=`create_test_dir` cd $REPOROOT fdroid_init_with_prebuilt_keystore copy_apks_into_repo $REPOROOT $fdroid update --create-metadata --verbose $fdroid readmeta grep -F '> config.yml echo 'repo_keyalias: foo' >> config.yml echo 'keystorepass: foo' >> config.yml echo 'keypass: foo' >> config.yml set +e $fdroid update --create-metadata --verbose if [ $? -eq 0 ]; then echo "This should have failed because this repo has a bad/fake keystore!" exit 1 else echo '`fdroid update` prompted to add keystore' fi set -e #------------------------------------------------------------------------------# echo_header "copy tests/repo, update with binary transparency log" REPOROOT=`create_test_dir` GIT_REMOTE=`create_test_dir` GNUPGHOME=$REPOROOT/gnupghome cd $REPOROOT fdroid_init_with_prebuilt_keystore cp -a $WORKSPACE/tests/metadata $WORKSPACE/tests/repo $WORKSPACE/tests/stats $REPOROOT/ echo "binary_transparency_remote: $GIT_REMOTE" >> config.yml $fdroid update --verbose $fdroid deploy --verbose test -e repo/index.xml test -e repo/index.jar test -e repo/index-v1.jar grep -F '> config.yml printf "servergitmirrors: $SERVER_GIT_MIRROR\n" >> config.yml cp $WORKSPACE/tests/repo/com.politedroid_[345].apk repo/ $fdroid update --create-metadata $fdroid deploy test -e $GIT_MIRROR/fdroid/repo/com.politedroid_3.apk test -e $GIT_MIRROR/fdroid/repo/com.politedroid_4.apk test -e $GIT_MIRROR/fdroid/repo/com.politedroid_5.apk test -e $SERVER_GIT_MIRROR/fdroid/repo/com.politedroid_3.apk test -e $SERVER_GIT_MIRROR/fdroid/repo/com.politedroid_4.apk test -e $SERVER_GIT_MIRROR/fdroid/repo/com.politedroid_5.apk date > $GIT_MIRROR/.git/test-stamp # add one more APK to trigger archiving cp $WORKSPACE/tests/repo/com.politedroid_6.apk repo/ $fdroid update $fdroid deploy test -e $REPOROOT/archive/com.politedroid_3.apk ! test -e $GIT_MIRROR/fdroid/archive/com.politedroid_3.apk ! test -e $SERVER_GIT_MIRROR/fdroid/archive/com.politedroid_3.apk test -e $GIT_MIRROR/fdroid/repo/com.politedroid_4.apk test -e $GIT_MIRROR/fdroid/repo/com.politedroid_5.apk test -e $GIT_MIRROR/fdroid/repo/com.politedroid_6.apk test -e $SERVER_GIT_MIRROR/fdroid/repo/com.politedroid_4.apk test -e $SERVER_GIT_MIRROR/fdroid/repo/com.politedroid_5.apk test -e $SERVER_GIT_MIRROR/fdroid/repo/com.politedroid_6.apk before=`du -s --bytes $GIT_MIRROR/.git/ | awk '{print $1}'` echo "git_mirror_size_limit: 60kb" >> config.yml $fdroid update $fdroid deploy test -e $REPOROOT/archive/com.politedroid_3.apk ! test -e $SERVER_GIT_MIRROR/fdroid/archive/com.politedroid_3.apk after=`du -s --bytes $GIT_MIRROR/.git/ | awk '{print $1}'` ! test -e $GIT_MIRROR/.git/test-stamp $git -C "$GIT_MIRROR" gc $git -C "$SERVER_GIT_MIRROR" gc test $before -gt $after #------------------------------------------------------------------------------# echo_header "sign binary repo in offline box, then publishing from online box" OFFLINE_ROOT=`create_test_dir` KEYSTORE=$WORKSPACE/tests/keystore.p12 LOCAL_COPY_DIR=`create_test_dir`/fdroid mkdir $LOCAL_COPY_DIR ONLINE_ROOT=`create_test_dir` SERVERWEBROOT=`create_test_dir`/fdroid # create offline binary transparency log cd $OFFLINE_ROOT mkdir binary_transparency cd binary_transparency $git init --initial-branch=master # fake git remote server for binary transparency log BINARY_TRANSPARENCY_REMOTE=`create_test_dir` # fake git remote server for repo mirror SERVER_GIT_MIRROR=`create_test_dir` cd $SERVER_GIT_MIRROR $git init --initial-branch=master $git config receive.denyCurrentBranch updateInstead cd $OFFLINE_ROOT fdroid_init_with_prebuilt_keystore printf '\narchive_older: 3\n' >> config.yml cp -a $WORKSPACE/tests/metadata $WORKSPACE/tests/repo $WORKSPACE/tests/stats $OFFLINE_ROOT/ mkdir $OFFLINE_ROOT/unsigned cp $WORKSPACE/tests/urzip-release-unsigned.apk $OFFLINE_ROOT/unsigned echo "mirrors: ['http://foo.bar/fdroid', 'http://asdflkdsfjafdsdfhkjh.onion/fdroid']" >> config.yml echo "servergitmirrors: $SERVER_GIT_MIRROR" >> config.yml echo "local_copy_dir: $LOCAL_COPY_DIR" >> config.yml $fdroid update --pretty grep -F '' repo/index.xml grep -F '/fdroid/archive' archive/index.xml test `grep '' repo/index.xml | wc -l` -eq 2 test `grep '' archive/index.xml | wc -l` -eq 2 cd binary_transparency [ "$($git rev-list --count HEAD)" == "1" ] cd .. $fdroid deploy --verbose test -e $LOCAL_COPY_DIR/unsigned/urzip-release-unsigned.apk grep -F '> config.yml test -d metadata || mkdir metadata cp $WORKSPACE/tests/metadata/com.politedroid.yml metadata/ test -d repo || mkdir repo test -d unsigned || mkdir unsigned cp $WORKSPACE/tests/repo/com.politedroid_6.apk unsigned/ $fdroid signatures unsigned/com.politedroid_6.apk test -d metadata/com.politedroid/signatures/6 test -f metadata/com.politedroid/signatures/6/MANIFEST.MF test -f metadata/com.politedroid/signatures/6/RELEASE.RSA test -f metadata/com.politedroid/signatures/6/RELEASE.SF ! test -f repo/com.politedroid_6.apk $fdroid publish test -f repo/com.politedroid_6.apk if which apksigner; then apksigner verify repo/com.politedroid_6.apk fi if which jarsigner; then jarsigner -verify repo/com.politedroid_6.apk fi fi #------------------------------------------------------------------------------# echo_header 'test mirroring a repo' if which wget; then TESTROOT=`create_test_dir` REPOROOT=`create_test_dir` cp -r "$WORKSPACE/tests" "$TESTROOT" cd "$TESTROOT/tests" test -d archive || mkdir archive cp repo/index-v1.json $REPOROOT/ $fdroid update $fdroid signindex mv $REPOROOT/index-v1.json repo/index-v1.json port=321${RANDOM:3} test $(printf $port | wc -m) -le 3 && port=52734 # when $RANDOM doesn't work timeout 5m python3 -m http.server $port --bind 127.0.0.1 > $REPOROOT/http.server.log 2>&1 & http_server_pid=$! cd $REPOROOT # shellcheck disable=SC1007 http_proxy= HTTP_PROXY= $fdroid mirror http://127.0.0.1:${port}/ test -e 127.0.0.1\:${port}/repo/souch.smsbypass_9.apk test -e 127.0.0.1\:${port}/repo/icons-640/souch.smsbypass.9.png # the index shouldn't be saved unless it was verified ! test -e 127.0.0.1\:${port}/repo/index-v1.jar # shellcheck disable=SC1007 ! http_proxy= HTTP_PROXY= $fdroid mirror "http://127.0.0.1:${port}/?fingerprint=asdfasdf" ! test -e 127.0.0.1\:${port}/repo/index-v1.jar # shellcheck disable=SC1007 http_proxy= HTTP_PROXY= $fdroid mirror "http://127.0.0.1:${port}/?fingerprint=F49AF3F11EFDDF20DFFD70F5E3117B9976674167ADCA280E6B1932A0601B26F6" test -e 127.0.0.1\:${port}/repo/index-v1.jar # clean up kill -9 $http_server_pid rm -f 127.0.0.1\:${port}/repo/*.apk 127.0.0.1\:${port}/repo/*/*/*/*.png sleep 1 # wait for webserver thread to quit else echo "WARNING: wget not installed, skipping" fi #------------------------------------------------------------------------------# echo_header "Test recovering from from broken git submodules" # On some platforms, checkupdates submodule tests need explicit perms to use file:/// export GIT_ALLOW_PROTOCOL=file ROOT=$(create_test_dir) cd "$ROOT" mkdir foo bar cd foo $git init echo a > a $git add a $git commit -m "a" cd ../bar $git init $git submodule add "file://$(pwd)/../foo" baz rm .gitmodules $git commit -am "a" rm -rf baz $git checkout baz $git tag 2 cd .. mkdir repo mkdir metadata echo "RepoType: git" >> metadata/fake.yml echo "Repo: file://$(pwd)/bar" >> metadata/fake.yml echo "AutoUpdateMode: Version" >> metadata/fake.yml echo "UpdateCheckMode: Tags" >> metadata/fake.yml echo "UpdateCheckData: '|||'" >> metadata/fake.yml echo "CurrentVersion: 1" >> metadata/fake.yml echo "CurrentVersionCode: 1" >> metadata/fake.yml $fdroid checkupdates --allow-dirty grep "CurrentVersionCode: 2" metadata/fake.yml #------------------------------------------------------------------------------# echo_header "checkupdates ignore broken submodule" ROOT=$(create_test_dir) cd "$ROOT" mkdir foo bar cd foo $git init echo a > a $git add a $git commit -m a cd ../bar $git init $git submodule add "file://$(pwd)/../foo" baz $git commit -am a $git tag 2 cd ../foo # delete the commit referenced in bar $git commit --amend -m aa $git reflog expire --expire=now --all $git gc --aggressive --prune=now cd .. mkdir repo mkdir metadata echo "RepoType: git" >> metadata/fake.yml echo "Repo: file://$(pwd)/bar" >> metadata/fake.yml echo "Builds:" >> metadata/fake.yml echo " - versionName: 1" >> metadata/fake.yml echo " versionCode: 1" >> metadata/fake.yml echo " submodules: true" >> metadata/fake.yml echo "AutoUpdateMode: Version" >> metadata/fake.yml echo "UpdateCheckMode: Tags" >> metadata/fake.yml echo "UpdateCheckData: '|||'" >> metadata/fake.yml echo "CurrentVersion: 1" >> metadata/fake.yml echo "CurrentVersionCode: 1" >> metadata/fake.yml $fdroid checkupdates --allow-dirty grep "CurrentVersionCode: 2" metadata/fake.yml #------------------------------------------------------------------------------# echo_header "checkupdates check version in submodule" ROOT=$(create_test_dir) cd "$ROOT" mkdir app sub cd sub $git init echo 1 > ver $git add ver $git commit -m 1 cd ../app $git init $git submodule add "file://$(pwd)/../sub" $git commit -am 1 $git tag 1 cd ../sub echo 2 > ver $git commit -am 2 cd ../app $git init $git submodule update --remote $git commit -am 2 cd .. mkdir repo mkdir metadata cat > metadata/fake.yml < """ ) ) def make_fake_apk(output, build): with open(build.output, 'w') as fp: fp.write('APK PLACEHOLDER') return output with mock.patch('fdroidserver.common.replace_build_vars', wraps=make_fake_apk): with mock.patch('fdroidserver.common.get_native_code', return_value='x86'): with mock.patch( 'fdroidserver.common.get_apk_id', return_value=(app.id, build.versionCode, build.versionName), ): with mock.patch( 'fdroidserver.common.is_debuggable_or_testOnly', return_value=False, ): fdroidserver.build.build_local( app, build, vcs, build_dir=self.testdir, output_dir=self.testdir, log_dir=None, srclib_dir=None, extlib_dir=None, tmp_dir=None, force=False, onserver=False, refresh=False, ) self.assertTrue(os.path.exists('baz.so')) self.assertTrue(os.path.exists('foo.aar')) self.assertFalse(os.path.exists('gradle-wrapper.jar')) def test_gradle_maven_url_regex(self): """Check the regex can find all the cases""" with open(os.path.join(self.basedir, 'gradle-maven-blocks.yaml')) as fp: data = yaml.safe_load(fp) urls = [] for entry in data: found = False for m in fdroidserver.scanner.MAVEN_URL_REGEX.findall(entry): urls.append(m) found = True self.assertTrue(found, 'this block should produce a URL:\n' + entry) self.assertEqual(len(data), len(urls), 'each data example should produce a URL') def test_scan_gradle_file_with_multiple_problems(self): """Check that the scanner can handle scandelete with gradle files with multiple problems""" os.chdir(self.testdir) fdroidserver.scanner.config = None fdroidserver.common.options = mock.Mock() build = fdroidserver.metadata.Build() build.scandelete = ['build.gradle'] with open('build.gradle', 'w', encoding='utf-8') as fp: fp.write( textwrap.dedent( """ maven { url 'https://maven.fabric.io/public' } maven { url 'https://evilcorp.com/maven' } """ ) ) count = fdroidserver.scanner.scan_source(self.testdir, build) self.assertFalse(os.path.exists("build.gradle")) self.assertEqual(0, count, 'there should be this many errors') def test_get_embedded_classes(self): config = dict() fdroidserver.common.config = config fdroidserver.common.fill_config_defaults(config) for f in ( 'apk.embedded_1.apk', 'bad-unicode-πÇÇ现代通用字-български-عربي1.apk', 'janus.apk', 'minimal_targetsdk_30_unsigned.apk', 'no_targetsdk_minsdk1_unsigned.apk', 'org.bitbucket.tickytacky.mirrormirror_1.apk', 'org.bitbucket.tickytacky.mirrormirror_2.apk', 'org.bitbucket.tickytacky.mirrormirror_3.apk', 'org.bitbucket.tickytacky.mirrormirror_4.apk', 'org.dyndns.fules.ck_20.apk', 'SpeedoMeterApp.main_1.apk', 'urzip.apk', 'urzip-badcert.apk', 'urzip-badsig.apk', 'urzip-release.apk', 'urzip-release-unsigned.apk', 'repo/com.example.test.helloworld_1.apk', 'repo/com.politedroid_3.apk', 'repo/com.politedroid_4.apk', 'repo/com.politedroid_5.apk', 'repo/com.politedroid_6.apk', 'repo/duplicate.permisssions_9999999.apk', 'repo/info.zwanenburg.caffeinetile_4.apk', 'repo/no.min.target.sdk_987.apk', 'repo/obb.main.oldversion_1444412523.apk', 'repo/obb.mainpatch.current_1619_another-release-key.apk', 'repo/obb.mainpatch.current_1619.apk', 'repo/obb.main.twoversions_1101613.apk', 'repo/obb.main.twoversions_1101615.apk', 'repo/obb.main.twoversions_1101617.apk', 'repo/souch.smsbypass_9.apk', 'repo/urzip-; Рахма́, [rɐxˈmanʲɪnəf] سيرجي_رخمانينوف 谢·.apk', 'repo/v1.v2.sig_1020.apk', ): self.assertNotEqual( set(), fdroidserver.scanner.get_embedded_classes(f), 'should return results for ' + f, ) def test_get_embedded_classes_empty_archives(self): config = dict() fdroidserver.common.config = config fdroidserver.common.fill_config_defaults(config) print('basedir') for f in ( 'Norway_bouvet_europe_2.obf.zip', 'repo/fake.ota.update_1234.zip', ): self.assertEqual( set(), fdroidserver.scanner.get_embedded_classes(f), 'should return not results for ' + f, ) @unittest.skipIf( sys.hexversion < 0x03090000, 'Python < 3.9 has a limited zipfile.is_zipfile()' ) def test_get_embedded_classes_secret_apk(self): """Try to hide an APK+DEX in an APK and see if we can find it""" config = dict() fdroidserver.common.config = config fdroidserver.common.fill_config_defaults(config) apk = 'urzip.apk' mapzip = 'Norway_bouvet_europe_2.obf.zip' secretfile = os.path.join( self.basedir, 'org.bitbucket.tickytacky.mirrormirror_1.apk' ) with tempfile.TemporaryDirectory() as tmpdir: shutil.copy(apk, tmpdir) shutil.copy(mapzip, tmpdir) os.chdir(tmpdir) with zipfile.ZipFile(mapzip, 'a') as zipfp: zipfp.write(secretfile, 'secretapk') with zipfile.ZipFile(apk) as readfp: with readfp.open('classes.dex') as cfp: zipfp.writestr('secretdex', cfp.read()) with zipfile.ZipFile(apk, 'a') as zipfp: zipfp.write(mapzip) cls = fdroidserver.scanner.get_embedded_classes(apk) self.assertTrue( 'org/bitbucket/tickytacky/mirrormirror/MainActivity' in cls, 'this should find the classes in the hidden, embedded APK', ) self.assertTrue( 'DEX file with fake name: secretdex' in cls, 'badly named embedded DEX fils should throw an error', ) self.assertTrue( 'ZIP file without proper file extension: secretapk' in cls, 'badly named embedded ZIPs should throw an error', ) class Test_scan_binary(unittest.TestCase): def setUp(self): self.basedir = os.path.join(localmodule, 'tests') config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.common.options = mock.Mock() fdroidserver.scanner._SCANNER_TOOL = mock.Mock() fdroidserver.scanner._SCANNER_TOOL.regexs = {} fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'] = { "java/lang/Object": re.compile( r'.*java/lang/Object', re.IGNORECASE | re.UNICODE ) } fdroidserver.scanner._SCANNER_TOOL.regexs['warn_code_signatures'] = {} def test_code_signature_match(self): apkfile = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk') self.assertEqual( 1, fdroidserver.scanner.scan_binary(apkfile), "Did not find expected code signature '{}' in binary '{}'".format( fdroidserver.scanner._SCANNER_TOOL.regexs[ 'err_code_signatures' ].values(), apkfile, ), ) @unittest.skipIf( sys.version_info < (3, 9), "Our implementation for traversing zip files will silently fail to work" "on older python versions, also see: " "https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1110#note_932026766", ) def test_bottom_level_embedded_apk_code_signature(self): apkfile = os.path.join(self.basedir, 'apk.embedded_1.apk') fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'] = { "org/bitbucket/tickytacky/mirrormirror/MainActivity": re.compile( r'.*org/bitbucket/tickytacky/mirrormirror/MainActivity', re.IGNORECASE | re.UNICODE, ) } self.assertEqual( 1, fdroidserver.scanner.scan_binary(apkfile), "Did not find expected code signature '{}' in binary '{}'".format( fdroidserver.scanner._SCANNER_TOOL.regexs[ 'err_code_signatures' ].values(), apkfile, ), ) def test_top_level_signature_embedded_apk_present(self): apkfile = os.path.join(self.basedir, 'apk.embedded_1.apk') fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'] = { "org/fdroid/ci/BuildConfig": re.compile( r'.*org/fdroid/ci/BuildConfig', re.IGNORECASE | re.UNICODE ) } self.assertEqual( 1, fdroidserver.scanner.scan_binary(apkfile), "Did not find expected code signature '{}' in binary '{}'".format( fdroidserver.scanner._SCANNER_TOOL.regexs[ 'err_code_signatures' ].values(), apkfile, ), ) class Test_SignatureDataController(unittest.TestCase): # __init__ def test_init(self): sdc = fdroidserver.scanner.SignatureDataController( 'nnn', 'fff.yml', 'https://example.com/test.json' ) self.assertEqual(sdc.name, 'nnn') self.assertEqual(sdc.filename, 'fff.yml') self.assertEqual(sdc.cache_duration, timedelta(999999)) self.assertDictEqual(sdc.data, {}) # check_last_updated def test_check_last_updated_ok(self): sdc = fdroidserver.scanner.SignatureDataController( 'nnn', 'fff.yml', 'https://example.com/test.json' ) sdc.data['last_updated'] = datetime.utcnow().timestamp() sdc.check_last_updated() def test_check_last_updated_exception_cache_outdated(self): sdc = fdroidserver.scanner.SignatureDataController( 'nnn', 'fff.yml', 'https://example.com/test.json' ) sdc.cache_duration = timedelta(days=7) sdc.data['last_updated'] = (datetime.utcnow() - timedelta(days=30)).timestamp() with self.assertRaises(fdroidserver.scanner.SignatureDataOutdatedException): sdc.check_last_updated() def test_check_last_updated_exception_not_string(self): sdc = fdroidserver.scanner.SignatureDataController( 'nnn', 'fff.yml', 'https://example.com/test.json' ) sdc.data['last_updated'] = 'sepp' with self.assertRaises(fdroidserver.scanner.SignatureDataMalformedException): sdc.check_last_updated() def test_check_last_updated_exception_not_iso_formatted_string(self): sdc = fdroidserver.scanner.SignatureDataController( 'nnn', 'fff.yml', 'https://example.com/test.json' ) sdc.data['last_updated'] = '01/09/2002 10:11' with self.assertRaises(fdroidserver.scanner.SignatureDataMalformedException): sdc.check_last_updated() def test_check_last_updated_no_exception_missing_when_last_updated_not_set(self): sdc = fdroidserver.scanner.SignatureDataController( 'nnn', 'fff.yml', 'https://example.com/test.json' ) sdc.check_last_updated() # check_data_version def test_check_data_version_ok(self): sdc = fdroidserver.scanner.SignatureDataController( 'nnn', 'fff.yml', 'https://example.com/test.json' ) sdc.data['version'] = fdroidserver.scanner.SCANNER_CACHE_VERSION sdc.check_data_version() def test_check_data_version_exception(self): sdc = fdroidserver.scanner.SignatureDataController( 'nnn', 'fff.yml', 'https://example.com/test.json' ) with self.assertRaises( fdroidserver.scanner.SignatureDataVersionMismatchException ): sdc.check_data_version() def test_load_ok(self): sdc = fdroidserver.scanner.SignatureDataController( 'nnn', 'fff.yml', 'https://example.com/test.json' ) func_lfc = mock.Mock() func_vd = mock.Mock() func_clu = mock.Mock() with mock.patch( 'fdroidserver.scanner.SignatureDataController.load_from_cache', func_lfc, ), mock.patch( 'fdroidserver.scanner.SignatureDataController.verify_data', func_vd, ), mock.patch( 'fdroidserver.scanner.SignatureDataController.check_last_updated', func_clu, ): sdc.load() func_lfc.assert_called_once_with() func_vd.assert_called_once_with() func_clu.assert_called_once_with() def test_load_initial_cache_miss(self): sdc = fdroidserver.scanner.SignatureDataController( 'nnn', 'fff.yml', 'https://example.com/test.json' ) func_lfc = mock.Mock( side_effect=fdroidserver.scanner.SignatureDataCacheMissException ) func_lfd = mock.Mock() with mock.patch( 'fdroidserver.scanner.SignatureDataController.load_from_cache', func_lfc, ), mock.patch( 'fdroidserver.scanner.SignatureDataController.load_from_defaults', func_lfd, ): sdc.load() func_lfc.assert_called_once_with() func_lfd.assert_called_once_with() def test_load_cache_auto_refresh(self): sdc = fdroidserver.scanner.SignatureDataController( 'nnn', 'fff.yml', 'https://example.com/test.json' ) func_lfc = mock.Mock() func_vd = mock.Mock() func_clu = mock.Mock( side_effect=fdroidserver.scanner.SignatureDataOutdatedException() ) func_fsfw = mock.Mock() func_wtc = mock.Mock() with mock.patch( 'fdroidserver.scanner.SignatureDataController.load_from_cache', func_lfc, ), mock.patch( 'fdroidserver.scanner.SignatureDataController.verify_data', func_vd, ), mock.patch( 'fdroidserver.scanner.SignatureDataController.check_last_updated', func_clu, ), mock.patch( 'fdroidserver.scanner.SignatureDataController.fetch_signatures_from_web', func_fsfw, ), mock.patch( 'fdroidserver.scanner.SignatureDataController.write_to_cache', func_wtc, ): sdc.load() func_lfc.assert_called_once_with() func_vd.assert_called_once_with() func_clu.assert_called_once_with() func_fsfw.assert_called_once_with() func_wtc.assert_called_once_with() def test_load_try_web_when_no_defaults(self): sdc = fdroidserver.scanner.SignatureDataController( 'nnn', 'fff.yml', 'https://example.com/test.json' ) func_lfc = mock.Mock( side_effect=fdroidserver.scanner.SignatureDataCacheMissException() ) func_lfd = mock.Mock( side_effect=fdroidserver.scanner.SignatureDataNoDefaultsException() ) func_fsfw = mock.Mock() func_wtc = mock.Mock() with mock.patch( 'fdroidserver.scanner.SignatureDataController.load_from_cache', func_lfc, ), mock.patch( 'fdroidserver.scanner.SignatureDataController.load_from_defaults', func_lfd, ), mock.patch( 'fdroidserver.scanner.SignatureDataController.fetch_signatures_from_web', func_fsfw, ), mock.patch( 'fdroidserver.scanner.SignatureDataController.write_to_cache', func_wtc, ): sdc.load() func_lfc.assert_called_once_with() func_lfd.assert_called_once_with() func_fsfw.assert_called_once_with() func_wtc.assert_called_once_with() @unittest.skipIf( sys.version_info < (3, 9, 0), "mock_open doesn't allow easy access to written data in older python versions", ) def test_write_to_cache(self): open_func = mock.mock_open() sdc = fdroidserver.scanner.SignatureDataController( 'nnn', 'fff.yml', 'https://example.com/test.json' ) sdc.data = {"mocked": "data"} with mock.patch("builtins.open", open_func), mock.patch( "fdroidserver.scanner._scanner_cachedir", return_value=pathlib.Path('.'), ): sdc.write_to_cache() open_func.assert_called_with(pathlib.Path('fff.yml'), 'w', encoding="utf-8") self.assertEqual(mock_open_to_str(open_func), """{\n "mocked": "data"\n}""") class Test_ScannerTool(unittest.TestCase): def setUp(self): fdroidserver.common.options = None fdroidserver.common.config = None self.basedir = os.path.join(localmodule, 'tests') os.chdir(self.basedir) self._td = mkdtemp() self.testdir = self._td.name def tearDown(self): fdroidserver.common.options = None fdroidserver.common.config = None os.chdir(self.basedir) self._td.cleanup() def test_load(self): st = mock.Mock() st.sdcs = [mock.Mock(), mock.Mock()] fdroidserver.scanner.ScannerTool.load(st) st.sdcs[0].load.assert_called_once_with() st.sdcs[1].load.assert_called_once_with() def test_refresh_no_options_or_config(self): """This simulates what happens when running something like scan_source()""" with mock.patch('fdroidserver.scanner.ScannerTool.refresh') as refresh: fdroidserver.scanner.ScannerTool() refresh.assert_not_called() def test_refresh_true(self): fdroidserver.common.options = mock.Mock() fdroidserver.common.options.refresh_scanner = True with mock.patch('fdroidserver.scanner.ScannerTool.refresh') as refresh: fdroidserver.scanner.ScannerTool() refresh.assert_called_once() def test_refresh_false(self): fdroidserver.common.options = mock.Mock() fdroidserver.common.options.refresh_scanner = False with mock.patch('fdroidserver.scanner.ScannerTool.refresh') as refresh: fdroidserver.scanner.ScannerTool() refresh.assert_not_called() def test_refresh_from_config(self): os.chdir(self.testdir) pathlib.Path('config.yml').write_text('refresh_scanner: true') with mock.patch('fdroidserver.scanner.ScannerTool.refresh') as refresh: fdroidserver.scanner.ScannerTool() refresh.assert_called_once() def test_refresh_options_overrides_config(self): fdroidserver.common.options = mock.Mock() fdroidserver.common.options.refresh_scanner = True os.chdir(self.testdir) pathlib.Path('config.yml').write_text('refresh_scanner: false') with mock.patch('fdroidserver.scanner.ScannerTool.refresh') as refresh: fdroidserver.scanner.ScannerTool() refresh.assert_called_once() class Test_main(unittest.TestCase): def setUp(self): self.args = ["com.example.app", "local/additional.apk", "another.apk"] self.exit_func = mock.Mock() self.read_app_args_func = mock.Mock(return_value={}) self.scan_binary_func = mock.Mock(return_value=0) def test_parsing_appid(self): """ This test verifies that app id get parsed correctly (doesn't test how they get processed) """ self.args = ["com.example.app"] with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir), mock.patch( "sys.exit", self.exit_func ), mock.patch("sys.argv", ["fdroid scanner", *self.args]), mock.patch( "fdroidserver.common.read_app_args", self.read_app_args_func ), mock.patch( "fdroidserver.scanner.scan_binary", self.scan_binary_func ): fdroidserver.scanner.main() self.exit_func.assert_not_called() self.read_app_args_func.assert_called_once_with( ['com.example.app'], collections.OrderedDict(), True ) self.scan_binary_func.assert_not_called() def test_parsing_apkpath(self): """ This test verifies that apk paths get parsed correctly (doesn't test how they get processed) """ self.args = ["local.application.apk"] with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir), mock.patch( "sys.exit", self.exit_func ), mock.patch("sys.argv", ["fdroid scanner", *self.args]), mock.patch( "fdroidserver.common.read_app_args", self.read_app_args_func ), mock.patch( "fdroidserver.scanner.scan_binary", self.scan_binary_func ): pathlib.Path(self.args[0]).touch() fdroidserver.scanner.main() self.exit_func.assert_not_called() self.read_app_args_func.assert_not_called() self.scan_binary_func.assert_called_once_with('local.application.apk') if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) import argparse parser = argparse.ArgumentParser() parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTests( [ unittest.makeSuite(ScannerTest), unittest.makeSuite(Test_scan_binary), unittest.makeSuite(Test_SignatureDataController), unittest.makeSuite(Test_main), ] ) unittest.main(failfast=False) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/signatures.TestCase0000755000175000017500000000512314620351225017771 0ustar00hanshans#!/usr/bin/env python3 import inspect import os import sys import unittest import hashlib import logging from tempfile import TemporaryDirectory localmodule = os.path.realpath( os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') ) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) from testcommon import TmpCwd from fdroidserver import common, signatures class SignaturesTest(unittest.TestCase): def setUp(self): logging.basicConfig(level=logging.DEBUG) common.config = None config = common.read_config() config['jarsigner'] = common.find_sdk_tools_cmd('jarsigner') config['verbose'] = True common.config = config def test_main(self): # option fixture class: class OptionsFixture: APK = [os.path.abspath(os.path.join('repo', 'com.politedroid_3.apk'))] with TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): signatures.extract(OptionsFixture()) # check if extracted signatures are where they are supposed to be # also verify weather if extracted file contian what they should filesAndHashes = ( (os.path.join('metadata', 'com.politedroid', 'signatures', '3', 'MANIFEST.MF'), '7dcd83f0c41a75457fd2311bf3c4578f80d684362d74ba8dc52838d353f31cf2'), (os.path.join('metadata', 'com.politedroid', 'signatures', '3', 'RELEASE.RSA'), '883ef3d5a6e0bf69d2a58d9e255a7930f08a49abc38e216ed054943c99c8fdb4'), (os.path.join('metadata', 'com.politedroid', 'signatures', '3', 'RELEASE.SF'), '99fbb3211ef5d7c1253f3a7ad4836eadc9905103ce6a75916c40de2831958284'), ) for path, checksum in filesAndHashes: self.assertTrue(os.path.isfile(path), msg="check whether '{path}' was extracted " "correctly.".format(path=path)) with open(path, 'rb') as f: self.assertEqual(hashlib.sha256(f.read()).hexdigest(), checksum) if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) import argparse parser = argparse.ArgumentParser() parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) common.options = common.parse_args(parser) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(SignaturesTest)) unittest.main(failfast=False) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/signindex/0000755000175000017500000000000014620351546016142 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/signindex/guardianproject-v1.jar0000644000175000017500000004674514620351225022357 0ustar00hanshansPKBJMETA-INF/MANIFEST.MFMLK-. K-*ϳR03r.JM,IMu X*h%&*8%krr%Z)d楤Ver{8d RpsJ3*w )7, ru 7 I-6PKePKBJ META-INF/1.SFmn0EH!J-1 PH"`A P{@LsrY(aOthV0w<#9(W' /5 :GI^cGDUldNAXxiQ@"FaMqqNWh9Y/ έE˴ PK6|PKBJMETA-INF/1.RSAUWYM!(0 H x(qhJQj0j^F" %0.m0% :ԅYw~{; "qQ=B<$ iA!0\Ȃ,K턈nݬaP@v0Pg!ى ¢p4:Оo i@rB"I8odvQ(7|7H 'v)Tȿ@xN?%ACC=CMOY=,ҷ-@PD# ,T;%)@l79es^7&?=q }$5Sv닧TxemY[ѡN8yqضD_6†وO#y У6`IG>4Ne%4~qzv35\S&useK(ku0꩛g2Ye|'MI얕ʭ_nTŊ{.`#UeUS(fcI(aVA(ބ{#4bgW $l߻&Qn=[*˹?^U?b$ ~6sI ItG(KMi!8ŲbROpCsZ@# Bw#//mEr$ v~4J}! ۊ0QBLyWI'`;,*ee7S:U $bp{b=jIyj˿1Ա:䫴?tUwnjc-&kaj2ayWH<$P]qn#pw5G&;ZGUXA\x O̿cPyFTwrݭgwrsQ CtnQ!r p[wb2C7TECs0kqڮ}DJlr4 lˉlU'9+!! ,`%&wB`޷M ^}o_ + -rFRGqɮ5*A(O.ƑrnK]C7r+@ ɚIkz0  1>_=bmm'3s +yⶍ+T6UMVv~Zzt\rJ!da͸9jD.6 RhϾ;ȿ̈́ʢ˦qܘ6T&/:|d?vr0^Cb^DlOZPV} RB Qx.käDIKVsμE%f]h=u;K&S:dZ;Q(zl,ufj(F7UZӽLDAB`(r 8kE/{ǀ@zFs88mPL~yiNEȹS&Q~##5IP:³US_c~Weѣ~s/E:B2Ō:DV+JFaӁzj0PKgbPKBJ index-v1.json}rȑg}t3$ )z{."P8HQˬKjgg;EuffYΣHMR27Id]2ME@qG!by"c td?d$v} 8zN*t=w|}P6·qz1L\7I-&i:O>}Ƒ~dn.M؟|*Dd>]Q#6CpDC!zG j!}v`9cY%tAh H ?i# S '{wHʦ9\Xt*X=p3?_ j4=LE!elq6QȌcX2uoqlD.;xߞsϵPh6i; i$iHc_{>f;&IF1q4^?@G{%|l}dS gao`17(ءž0 T}ٌ+=c%~Jv6cί|Q1uC1E56ԴxQ#HQ;9D^` |=wa+lbU5Y7!~{Pl@a5E*%?8~Jpp.yCcBdډ~+\;GX87,Ös.|f l@f$E$ć„,^@S &haRh1S(s&L.|,"&x~؀0F9{l rKd=?N`#/I$o>ͣWq(@ \|:(vA7<|8O61(u.T}07t&){hy#I_>ud4^YЏ>v(29|;8b%loIҁS@$J9ڏ3.SqԜ~xWRr=3;M]Lς/\Κ~_\&S nӧS]k$J/`49izYw4|{d1rvǣ.ONf M.-2Ң2?HKMSa=Y c~!x,:mS \{g Ѯav #!S<Bـ J89 ) 0M_0 L# sc3$ r^P XUKV-HhD EUș>5\Pἰ! 3 X1LH5*(QKa"G1Ҁ ͚9gARmV%Mے+ҀAуQ؂f3i5l&<t0πV wX1<j#EKf*H@t tdKtP,Y8/j݁0vI*'G]͈'3~4K-~h2'sB ]ki!7YZ/MMcOjMZ]_:`M!OqagmW- 8 $J WWiNBpB>-#h&G|+ӼMRcov_wӎYqesT;li&fd *B8,J4 j*gF,z~&4[B;}+c#Hд i'+5 ơ`&cP_\ *>L6~ќHHvV߹n ` =lwVPoKfNVG޶Vꘂ ۧt~Khc\K(<zELN`J!q/ 1;iۙ +/'C'@FAV@O_s hAΠv*Z"L(0j! (t5siNZp$]‰k+d[5zB MDNvkEp2-JB(g)2,s2pVp_vF;p(ȡ/&-"Ȯ>T@U-&f8 6 dStL,me"}A t&A$X ~ .˘fn &Z@eFTUl7qmј='-z`Am )vYۇ\Z&e|eh +;v_˺m]i; pD6Xd7քL>+7/UNG R7.-zjv@JGĚcY#׼y>}<~Brd^ک|?MW}99:7ImK7||8NGþX;g5Onk6Qdވ+wEKg5^׫|v2qDfɢ7uI=ϒzt5oo2Wu1UG~rc>=?'98m>M^97Ҵa/"cɪH:ir8Wvu/ϩ 5t tDjL#j_Qά97"FZ|!f(cpI;\7=L9l K2D=:X҃4Qg~0iʣj2 o 2oWu(-( M;>.FzU{,8=AiǷ[8ܹמּOG,8_.l d[B!apf5Ԏ3zt|=B SQm dqЖ8k 9#FSN|`Bʹ:tl"'%KŵaXNꬷcYxZOƺ]ow ƋY3<?2: ^/Ü Xn\3JR0wХGn~Db+~%’s.N Hn'LoEb0#CUOx!GhSfV;'M'w19z-@eA/|#aq84F3##,dO΋47hن0)AA eOѝeo4;ɗ \3,0]e1⯰01[.gf.Zh% Q1(.cЏCrgE 2"1u r39r@ ԠFߤ?{{)8D,ltnDwMa:n·Y2Y~"3kG'x0S`/Sy C)&4CvbeNa'36tĺ*]ۂ}B Pgθƽpѷvu$z7*q fdhw dq(E/8sAڰ)Wn0!qUұ8kۄ \|t7S+p?.vWTmsbx z-)@&^@†fJ^Pτ:HE^a19FL]r-<ۓdfw)O@%q:p)ס:B\a<治{@e ?Zoy6eKZiY9AZ\M`]b-FH~9ss~=(S\3GK[ʣ@865()b.()u=gB,FrL;k`񊻒6]}c 9k蘚O  l6Se!PoC$FBAGb.5ƅglF-˘ X;^(;$'qlozC]i6 fLg:;GB2di,#r 'I)lX.(t_EQ7G.gakݷ0cEC.S%9s giGeo^f'V|P|w~_WGR:O(o:s^뛓WW 4+ѾIґz|J1ɒŷWo҄r)1˜[\Pftm.Wۺ8kMҤ@ޕ/dKKLbo0Rb1e$?AW4N@L>)u{߹I`VS@ >0H1 [0/jWnr1G-l#B{\28>{-VGBeyE6K93ybL+{h#ʑ[=-:#Ps7v~QK M?_~N4i'HϾ~8_>1i ctc`F؝G0Xiv֓ C ;cB-`WL9KX.܋Dx<`^yV;Ho`=\edteJ٨Fr[QS3K咯"p?ӧ`"|Mń|g4(g @{8n)%aN)1Jy@}?GtQN&tu!y~ۡ!zY5 6&/mI>7w&/1j'ڳ?qHde+bsOᏈ \/ r ^K gYstx,x|~OPOL-+wz͆ 9hBUog_ȃ87WuQ~.e|Y?]34t]d]x'yyvrݬߺXQ3}v2)ƺ[dz=Ƿ9кy:;۽CQK/{TVxR&e4jDjK?Kn]dN^_.ԺM–_aqHolW/p< .m݉='˦g7Am{T-bvP~_ w[['vС+X.Js|e}]r y\W̡怏31h, \*VHC!Gr`2x# #>HmSa 4z*[b `p-.ġ/{ ky` q[>g@5WswG?`yXż#9?1qV@86x ?փAlm:5ISN=aK\(L>gu*tjiT _vx 7otFY8E5cvڙ7=p9Pu4mh+bN<1x{@1L# w\;kqB9?xu[v:5#R>w0!Z)S~~7XlA9*.G#RF J6@wN|P/ak' Gf0'0.$@?$i|ذ wN<<~R-g{Y:ah7kMWׄZ݀N NQa9w']H8wdH؊v_' E60_ܭI+n bmΠ@Gsf]3NDɰD$9+Spd^${qFxTf6p@S]$BNuĜ0߂e0NJ'vq$FAlB ]᛻*:^p@Ǜ.0r]-_>S(ָl8! Gfk|"09!hѵ*Ia@\#v.M;bo(+?Pr<,G(aʏ`ai/=ڣlm{`U %goi45 u?v~3伡~+z!+BY&I ]nK(l.I;j-|juK}(n_-tN8>'IEuB\95r&!1砜r\^S*k0_Ok%iAȔ?Y9/8nVЄO3 DR~%Я4<毭?ⴒn|q}N~ׄB>VumhH~v[Y2aHkU*N C 7O\o35JtDe[xǥ/WJsSB%??GHJkC0Qy1J)\`jpn'6?ahYle+v{Vhsv1#b~Yvu}y J6㍸a6BL-QeـZ>2cRk+ iM*1gDoYwm LHNɳr饄t2b5 2fц4 i \t֔(I:+c«P=yyoX^i72v+h 7pzff Qy/u(Յ5-=q?߰ENHom6> |i7B*-k Q=thCpiUQ\pv^*yl -}1eQTl_ mzX}6n)d ׎YckHƣ ǹ|L:/  aD']|/̻2 BYܮ~.tkJ'Wq~'dgBvrBzok܍ &0E w)H~<s`'O#W:x :0h`2fyM?FqY<],lkBy`Fsfi5Ee],gT[fxקb^nK,sgUrj'afy2@Z^WBe+ X4La&< %PϏĆ3b0% sh(_PZyCiD /D"W ܘy_L%pXxI̓o~Ih:*me\.6p%=i G/JfE:+xQ #f/n)|gIᓙsw%Ḿg)=_Xv328m hpv=(Vg zr8}q1Aw1꫃qEj_?Fiv.f񛇋΍{u^6n|E4ŃZm>2'3`"N/Ժч]QhZ,/i]eifݞv|2dKV_+v  oUM}i{;{L f*k5c'~|c^8V.v]G1BÔ{fW,l,~-%]lkYކJx-b*RMT$ !h]ڝ虚WwL>n~c1fQR G"Xl+ ^:yRNwF7&Q蒩֦؋\Vxe I/۾ m0_yZ)'^ ;Ex_ HX%Rxe^ٙU>JwI,BwV0I>V kTd e[s(]@kme^$5?|eXY =Z$eՃx"H,JClSY]JG1+VOEMh'AK^`P;_w 43;>1,_&tXɁ(O'~8ع>5u}V{IR-R}=t.a _Q:{gZb4WBb5sy^^{ <*qa} }w̲<8P^ T`D>+akZ>a5cs,Ðt`UTt.dc.(ZDIG 3xo$o["JrASWkл AY>"0b>˲~x >fm$( @ߝ"\,oKh{ 9Y RNJ 0JX7x-4Vc1yyXINr* !?A#f16O 3UFǃMPɦ> ] {eH1iY<;ݥT2;]ą j7__.y{ɅEu^{T5lvԂd>oD[0cWHfۭ+g0|X./z'rzڞCVYk+:NX drW7{#BJ\RvIzRuԥkZ޻σ_{z/GuTv9m4WקƳFluVpJMylC}YVWӑJ#}|j̜m>}щxew֨)r$˓Ac:4Nщ/v`|C7iyz)6?vY;>]GjM_F_߇+]߶J FzX&k?ŜLHVjwNh|{$312:}>JN./I|'[:׌!&j<xKPfG|Qjq>L~V,2X9|DgF‚p(mDe_^jh^*6~6w *tAg}y;{$t #Ͱ.Rܢe0 *LuJ_ u(ʐa25m{Ş8Ur tP7;;av^8OI1+X݄uNEE@T'47?;r6> -x>coRMEMoyM܍}0)j~# :XXddD$^z,(mC9M=u^|/\{[Yxq7_q_Z[?f\[:zsn׿n釼2^\ ]HV`wW.H5VYPx'PYvG~v}SM U/:\^{['1I0bYlC%=`Y󅯌Z{W#0@1V}|;a,9Pq㽑Cşfű^iƱ]n^`~'?2jſڿ>D^4* D%d DaXYAQQK5oբ\ީ~~ޤe>K#]*<:q<>tվGj+ēJt=?'asgJv6Fg8NkUWKy~ܿ9 <~_ӡ^ e<8'-ylzke:։w9/͋S0KXD6NVӶw5.ɼkÛ͠S;nLWarVz榾GH!0dthˑtE}p5 EBmW˗]8 {<aJPlOuwl{#!:*.Vqw_iϷM&n썃f&GyOFw'YtݵlCmi_j=\K(ۡ3> A;6=dbʛ&m=r/_po D]ƅ-'ƅȉ#yv~w!=٭½{z]WR2voԲ (OK$̯ +~]IC"#355*V]~ i!N,pvS"_:nwZn6lw;o7wjQ ᷖUn [ۍjѨ]ovvu5vlw߲Cm&Yvor `ug@A~ ۵oi^ybT5O~*G؈ȢZ=+xlXh/Jb|6oFy5d86؆aتi Xg9(K pS"nX5ʦb)YYYkFy5ꚬog6kDSȺc:L`(,h*z*+be:ȲkRM/`WfG`M{x?jwI}??03|ڙPgJW۶ *$c=pO =JX[ *SM-XhvlB JǔaRZ뾃{ou.nhh* /ş$Jpsf "djeP"D4\ T}Ke{(TU;&ag"*!&VTq` W (l"SȞp\LpmQ$"IOJdn S7^=I^̼Mm13̙۸hit*TզԐ 8s&1lݵaȢFށ;uU|v%]StI^¯h!bf}ަY9'{]L@;,L14m_;A=(%gԔL4tQL t[ OT ,:e٦1eU%jOzzEf &y"Ox@Ǵ-IMٵ JbjjW4lѥ&am".[H~ n j&oۼ]*vTh!T,[ 92M]sEwDLѶtzp$ITXc1%Ԏ"L);J`Fvt˂Ԕeː$tfP%KG:Hꚶ{vQDe['K5Uh,1l,SLْN"EVuGupa2 (}l*R7mנʬJ+TP5RG%KN簨F}5ְ|<^=h_3PdQ4D+֗ SVm3gY;C\G'˰,jˊQJ[EeӁF "DT}JG~7lH"dU34fQN70']ZTj6-i/R֩n[Da<Ӗ50M*[+HHxx(+Лlߠ75\ިAКY (΋RG1 Cڑz$nekKmD5tW^}莭c(L"AlY[U@8b#+;:UE75`o7 Mdޖ;Pۂ._ڛ,Tvj6bX4lbRXDjbQo% ;$,5ieoꉂ7E%إHzisJĥ(h&:xTPKLՖ\O 0\]b|jϓ⯮Ag~'R,S ﺝCcmC/:KmmYH/"/CvDY3-7RؤTmP-Ǒ-W4O=ЈΉh@6d3C}[_UU4^ ;!B|1/ak|z:QHuJ%@x&܂NMPTb(v Pߣc^5D|IF\m\=Q *Q\50e1&XYaNf>{/u PK0CPKBJeMETA-INF/MANIFEST.MFPKBJ6| META-INF/1.SFPKBJgbMETA-INF/1.RSAPKBJ0C p index-v1.jsonPKL././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/signindex/guardianproject.jar0000644000175000017500000003652714620351225022030 0ustar00hanshansPK@IMETA-INF/MANIFEST.MFMLK-. K-*ϳR03r.JM,IMu *h%&*8%krr%Z)d楤VUr{8d RH7K0*2,ͱ2.1,H-PKPKBI META-INF/1.SFmͽn0=Rc+j :8(C)JYiqmR*uyxʟ-Z ¢8 dtGpN@MgNgͫu|1rট CAo;Z^V[ Mo)'fׇ&KNhe7a*umVF!]C6>]u:Z o PKU%PKBIMETA-INF/1.RSAUWM!!$`@@!4AT"ŀ "Rq(2Rf$|*"{ "(FEa("Eay|o?0wݻι{ jɧeA,aP(!0 W#xp6RQ3soKEmap2RF!eD(xDcxFLv(gtՙvه`Iz_)8ǟ/w*Q 8׵4*5))1,Q 8AT$ŰjĽYdm 0A0(7XH2;ߦ}" + OWFC 7^}Y%M-j@ Cy`bUśF&V~iU m2a ȯ~FJ}Ɂ" Uj+ɟڽ Ɲ7u' |~-+69v!Sc/_9q*1 Tck yqPW[V~W׏N4h-/tCB]헂jdH>՗8V`IJJ GrF!Y~>sD^gM~PBN}Zҡ{tzDu`QÈc hbI&3qɥbme1_4 zO+IqSёƴ1\٩hk A@m-$߉M1Ntapx8dpGO.=[m na}-!\Zňl.fmj9VE]Ɩ'aAJ)e!ɷ Jnqrg֩e@]cg= @¿FpWN'T!V^'|^pq? (~ΘL|p6G l?=' _,@U hDa2)> + zԽ;_*S~1:i_>pJl3w?)$i48.5N(Up :˼22zDk΃מ{<k`BTYu 'CO/s}efzNdYRؘa$L}y?<@iYy\=,u'+$r{>-,z"I.k29JaS{.1{&7N n)-u}!c z6ׇÖP)}nTvE cq$H||#e-Ūֶ&N*Oh}gSR!mҡfv1}Qle8[]Ox7QtQR|t.-PWe/s47r A'\pZ}2"zc:B6N1~^haZD^4V*sPM% _\guKQ'[Xdtk^kmA*S '<}f?%"ApUg});98ݗB6%<_n 맔TQ$kdm;2y5GW7I?jX9Sxԭ9ʁ3!EAY=9C[#% x}A'ε>15*~) kxN7 +2! ׻Duȡ֍Bt gRv9[$:~4+ASEtYsYgYkdǡX.7~fƹ sDf%?PK+ePK=I META-INF/PKPK=I index.xml}vG衧{+U(JX9$ewu^j(4 E?e`f9FdVF qmD=#"|Knݰ.'>I\T_={2N>?A^Ж?Vuf$7곺rϞH覯nYr%ޗT]$'w Ks ̤)M4U4*sƪq6iAU.yKw'wЎ TR!cOIs2Ze+ZlJs9<Rx'6U!)2! КHB[ғ[;NJ,\"%D"3ڴϔ8X@wIF_ _rSyO:hRJNL/a4%)lYA(хss31 QTTQ ትdCfZSWpsi%&39h1R ϭ:eGo(!j|F45)1p<,U)c1L$ j$'Ȥrȉ¤TTZS<͵%Tc S؜ri&fP QX+Ta,u s0*@߷0-*4)[E2i+Jr0Y‚VLg\NҔq(*L(s@d 8j'(`rI&(P'c{ɜ\Ίep)r+if-pgaF> \2\a{Y K3>-:E3xh;/E&S&aP H)%s XrQ2} ChHVBQyS..P΀ 0)Y/i-s4W43 Tx](3ZC 8&\D`4P- rOay\ՀP1au(  gs_h X*F*Y[nRcӆI uFXT `22eЫ$"́%raq 6c16t` c$*BT[8@3-QIn2Ӕj \ 0cY%sYWw# $9I ;װ1ؑr/4MW&QRnAS3~۔fI   5HxA4 \<j 8.RǁaKjhi@""-TE `Vë.,];x`̥}]\Q G!`ip!X';8؏T=Ia`aAwoU`?|?77jxeY+ 7^Hp \}߶;@yTg0 џ0B'=@Vwur_Qf1?n"Än 7)1uXU8D۸:U2G将> q#F0}$^'w: 0;l7P ]UOw꾋 +Ybx7XΌ~~m0a20Zf+LT>!kۇ4( wX^P~,{=MN<03\rYҵğhf`nhD~ `W x~SbWne+WCĉ=|܏5OO.Lv ::/AvtJxq5sK]؁5L[YV(9<@+|[W^7_aLoAߌ{ q:nG _2KĔ eNZȾF ^/\7O~dV,3:JE)Y԰S!9t@{?ac$3K%I˸7FCn~Ycd?Q@,-||5uϋ3ƒ_ϑPtmi7.B,&z?0ji^tB7\NLri{$ ,~V`?y6ԠJ?Dʱ&0`%N)t̢Y$ Sغm" (1 .@c#l9XC`/?`u3?\х} x2{B p v8 %` 8,30$yFW)E܂lz>gw4؍b@~zF%{&rL p29aTV?!dv&Y'eK3P}Nqzq$ dnPnE]m:emQwc/|gC?V_C{|19!0nޟ!cTe9yU-ο߿z=* _  n$ Ȃ%vW:ÌNX,섎g:"=Qir3Z0M- MɥMA "74ܡ83Lf2NKNeg0f2vPLH568?_^|wUJ:Mv,>ܹQ;@#̲LL"u2Ϥ0EJ r!sZSlw9+ȝwm z} r[ެqN=t5U=ZW-'Q돒+t^V<<Ƚ:r,^d/oΒ? Ԏ|d踳UCCx/]lO `YS;Voh?N9uͷBb=U"NS vt~j, S͘8XnM%ȼy&RvR@nBB ;q}_P;Ns&)(ɀ7q5V\JlMO|07kF6JBq:7s+-K $Xdj֘{`Vt3(mZ: IoŽ:$y3-c5~bĠFwjy p[a=ax෗0|6D}evfťN_ BXK66mm[z4t&}njKg'H7EgXYcD^Q5`hW['oӁDMu/y{r~ %N~ף΋A5 K=np&ɝ[n0e|)x=\N[ӹb(ث׏.a\؏hHnL3%qiF 7"Ťa"̌+@$ej P5J >\0'#6p_/qVa GHFkXu.6XfBWG[bߢW(zF޺$]#!^PdW15i&$ tvE C ^Y09HR\O #D\_q2!N\PYhFBq#Ez/J0y[b)r}d]QNWv["G26v.A*c0RDž1R+D|S ! 4A5ÙL8,< d9|hWsu0e Ek C@P&mD.~/dji\Y'RL4,5[`/s9 Y VsbҜ<'[=n2GֺDڴVJ +kSoKjs+YNs,hn NP2BLsY+4_%2ГͿW~?^厅`A3PRZXP4L\QA">W̡F!{0sNgC_}}Q hDj˵CHt_c١rF7k;Տcf3`Mqպѻ*Kԭ*{_x=ɽhmZ/խd4&pYD*Z9nN qr^ )1FMC /HOεDP(22“LK[ ‰ZݱB0I6ocO;^ٳNkPa rINV7eyt>U>ur#̲+x?ct`ncrw]] mC|&c1z F65AV4UU`@6{I,krtunSRg q 01l]=0p2`V8I;q,^ i'&;:5la;[Ou |1X~z/PU?mmt,čLBs=$POP$Yª9muYzo>?<tTÐ }!N3T'i^o]֗Gg{Iy˫r?|sXHU`~w\Oz o^%` WF7uep4p_@돢 Z:Ol;R_-eʭc 05j J}w!v8!?˘a3ӄ@xq 4;88Mt֛NP5r*꠰ D$K9 3kg + ۈvhʌ"R7[ @FOVX)²9-(x8 Wѯf-} oGpAa@C`蘛;J IsʦYTsA% :p=,9> ~ÃO&>!Pvkb"_w"n۾RX}   8ˤs:l]VN~[t}g$yV$@g/ϷqlQm;lsI*wăY‰Rɘ%- Js+=/h!IZX0\BX9 p9*E2ZTi``ZQ%HFrQiSh͔~lb_E8fҭA] *DG:y o7Mgms3lPE-_N]@!ZA/o'q=.[gbqj2a^W -P]8vQs'R4sqrՌPF?Ġd-Y]ɍ]Wvdڨ>~* v5hXD;wضX(ԯRD6eޟ 4AEӨ/WzhyKP ec X/83@iDD߇6wl`I1/b&$Cߠ(U ]l7( }[xvKa&`E vP&! \BM7 %F\[ G- ܦj"Sُ4}៶* EBvwէR%%?`ϡi1᪃ %MT4M??@ ڼ?/jD_۰L 4YD7RW%sY^PN+MO`vAB93}$aw2Sߩ*-#o&@,&YeYJ<|@ydN*R]NiCIh4Ԁ i2.r\gnm2]N\aAwj%fauA3 GX)wALLq7dQʄt쎌?H -wu=m㶊M|”*dpeq#5㜤t3T)Xt4R;,m[3-*aj>WKֵyXt諕?5ظXhA$HQrnP|UuP'S5uasaApA:সFUm]:Tx}rS-9ÛcP`P7uPգ8}xuSލ TXٟ9DMo0^3BWxXBfs;à4a5WM)x%װ  ^L Ɵ?j\?0jãFUMŽFMޯډYE.:@VB5(ZGS5{8xtbP\R!2N5N}z/_c0>X @MpWF40d\oP~vH V揺 [']zДGj\vj *p6T%z+Ƿa% "q1*ic^c7n/U/X͝8C|\L$搸qSe"MBBm?_ q)(N)tF\L'3@t<( ^N16`/5DwG:߻^\E5lf_rYvΏ^[<%N:E.L!3Y+(xR0E-M-"LyM#|gE%Yt]:v6ƿV~RbiRa Yn1:Jԕ IzO^pҒ(\g8ݷ޷]Mz:hlf?"zc A|9|Ś@B;15Y23XcIs[+ќٱbsw/.^>rԖu]0L8B[N~=u] ?/_!/³/98<Ԯa`g-?7/Pz.$NٰXFwnY* !ѹ}g{Msk*Ms+M asxRƃsm3'YVE{ϥTx3D/;/h;%,U#"\qh+'=[m5Y"+ )^3MV̱`YD:)"c9qM(V`K3d u*k;ۼ~| QMɹźs!Kpeicu\,Pѓ?V\Do`1XIc6>Lw'`70oO/_<)L巧/?;7wS=&`PKXYen.-[,W߽=;Y|ȶ+&eȅЫivWn xμ0q9X;Y&=nMʤJF%&<۪;}_oJن{%7JaK}pSfq.4@7RKC#x%nj6(/T@#mU-фa[%Y;(G!SmۤͲrteO]aзX@ (TVԤLd], ]]Br5T&wtT k?%|bUkIl3!uJ>NWʬᓉNNg0""3>Lu"5,͍Z#Z̩KqEsRg8FU)""@%5h/s :zPm{Mq]j5?Cոoj׻օy(f@$18@>Ɗ3[X.," a3 O5@P޸XJQЌ-@l Iv  yXLf,>ie:_ `pC|150[P[ǃxW7ι4x/7XOEO \a}bkz6'jbOXE@XK;woU弗\h']`2|ۆj}VlE 6F%OO2b3#7>Я=5*03,z cDySPP +!fzXǡ(`$ VJE_w¸BMQr+(S$m\( uXt#$h0٦v>bBlzr27uZ+cC$Jc\n ][#UXogLG WE+J[RMd`ra^2`yc5DSc 55‹\G`x,FRmgX/pYliCC7 lwQk6*&e4n [U6w&xٻq+]_1?ڕ?b'q,`3V4&HbhpMr~uG^5I[-">r[{Xn<ӺV|y=0HL H"kXɿ|Kd-79٢_(Z;ꆕy|aKX[z0DldK6ٳ7 ?[`Ϟ/OW4΢`ZƺHȁCid>Q8cIP[_b 4!%5JOxOXy3QW(&2ֶe%Zè,_?YɎݏr/>nʫwS~AڄtJ!JR^V]sh^DsN]S(nfC'W =H$_18=7C۹wPKLR-#1osq =ū#^?tCk tWCͺ*,7Z̈_ʚygbPOcxSQs2yLU+>op/^ae\KۇN1-ANn>xN wX-|FIr^sdw(a!ND߃*s]^8Ǯ'O)]'N[ukuhJ(l0,XZfT\`Sգ[3%L/:zAq\{'{śiBItdO &G|a*nga\n!foy{dFC͌|Y eIG*yH۸4W|d&D氩1g YW[cס^S"|'eFO݂) @fCk"KoSMW9szO"\Y| c~/vqV&}rDLX "E/&ڟ8/"oG!QGXDuLN}u.]=լmt'U+Խѽr|UVW؄oxQIXt>! Q87l/$y_,:]9dWG8Ƽ׉[ taS|jAEЇtVr嶰)CLi.bj`މྎԑ@ x&yg}M1ŖuauZ^MΘ.D0HPί`;ա ]Qs %:qK=_+Ե5b+Vf}v|2cPS^ CIt3rWm"*QYOm>}#mY1גǰzP^h|Cp4iij4t4xC(z 0C,`$Q&ZZkXZ v\˜j?  ( #,!^T^~=c(8L$Ap``916RD0o0'@@h D 5+:MehD9cSz-jNcL44p#08F8\BG 0/$$ch3PUADA \3y b$p:7gH)-,\E 8{h+`>R)\75@O@5G4  Gz yJ uY ˍ \%)f XA<TMA@8 ~ J3.Rzo'x#"S#P0dP0p/@X’ܐXA^{ rx' CC&@`%`\0uBRb0 ^D ` X:F=` |J&)V*fRA,Qlx*LL0a"TReZd @DNo A`H'F0FP@~+p+1 *EᘀցRS s=LV`V_:-(xF@ PI/Q_n&?|4d|Y/ ps_^aF \y}qwɕqo2} cݍ;adž8vg/uwwtT=LR)KQx#s=zaܱc[3F?U8+×A_yihxG.J2ZM;yׁvЭۓ?@\cuo76sۗSjeW/7 G|/nɆxjү^N(Y?67_0~θ:>42s=nA{ ?C-nL &F*PФ?.Ae%(lgPh O@a# O2(`C[`Z(Q˼PY؉0K[^KKEd .(/y O-ek){ #ZjVF @wgCz6fp*<@a˅?B Tx:gm [&Xxzϖ`Aj"xk]Gm 2Y˂Jf(qA`cAYDg2WDZpAQ)ʀMn6DM2Djב e1K?gi"OÍP|yCޒTX?ghO緍 Ǎvr<D5ȽF'Án{ޭST慭N|$gFdEI<ϰ&3ьKR3U5;8XF(M YH#Yd㪬Q ӑÈK_ZCD*345ӫ]ɹq=vcaiobjPPXA1)kmƩӳˋw'v/>\_YwWN>TXw7/d{qpr?^u_䕞?9ޟy\beJxl hr*xl{wpEü9oy.|:x{0mŲYM-7;"?9ؽx=?Ί_%4e՛G'W翝_/hԞOy{?;A=U?GJ+Mwû3hBWBR, ulo{L="]%J|[0`5;)9B'u}1Eߔx<OƷ㞛S{a0Yr#[7Q+AmE!4H&j؀̵ߡ-`iPVYx:UCZB`\k󣐒Uw4WE)8cքxcpN`i+ >h$58]ϥKҞ1vY3[zq.#s߮"NCrkظV.ǃj}sve ^>ۃ O?=Nodp64~fK0Ҍ c6+Xv<[kKY^RlW3>\e: E&g1AtpFQ*$% '+CkLo̘׷a)<+1-9l ڭAFլT$[sfbcᑄduSe1𘎺mi"FSXꀭS)^婥lM9PV5%cmQ ސv0U?#jI0MOlm2[Pw:jde6.MMwpdGOc`&iS+ôIGarfstb'y<~?RQf|/E7k1Ġfr֔N9{w2t҃C#h_zdusCS:0bR?≮1΅8 !@!Y`D;Pt+| ҥ& C^uQҽ|>ioйE=i\..R?LM#`;ߝ~ȹWDI^iJ5PFKgQ`2qZߥ 7EPR)0q/Aϸ%x:y.gǷ&:| |-g7 &Guvug:w6$gu>\=9?]ůX*qv=kſ؟}m~;],ݭ)}hw'W,.WX,/~-VֻjĪkq~4¿zü/Q(vް4.=FqeG{GBqx7X'~bbU;3@юQȼR)+\ؚ@~*WRE[2LϓG/‹ɋ/v^݋Z(k(p\$Y#*HH(rtm"aL3^+|[J`)bؒV[Q*5UkؼI%) 0̥058W2_nOm#Q W s ?:xw|rҰ{Ovurzqptw9V9/{]{={p|)Y<]$(T̗_O(tO- -{S fT&6PIHq|MZ|YFߞ~OokFҍuU3N9A>a^,eHgxÔ TiFMvӶ$"1V"j0C\땣qDũ-8X$YT*G k(U^0*7 _s-ɻC,7 //ߜ߻zw~_Wήv8VUރ-o4kjʆݏOvVPZ>Új>;-\aGp!3FLTȥ"J+C3S1qDU{ĪPYêI⽲ |XFpN!ַ۫pj+!\缈?zXHU LSچ{HT|l*x(bfWB;%cN,2)%MJ1Ȫ)y&p\B(L,3CS@w[P%J21XRz(f)0<***F-A\pςRRwQVO7oߥBFǴjcJ1%`J2.;|C[.-™b\@Ź`B7|Ç Mwt|reX9/nm]FT4x?ˇd٫bRWY*9qSEI ж(ؽұjn&E7SJ ?[pz+1sjm_߾ꞞS{ͭ#3=wcsWP66}|sky:e)ZVlB. Fd)Qǫ{+)ԁ=a8#5^ 9RJ ă Sn|ަLI2Zt<LM@jR?q:'$}2GTju'p6F7'z tQCtpxYo8u䨺 @ke~_ј $x{ QTW3?h4!hyCEXވ 21rPi2FW0AD\^¨i JneɼԵ, liõܵ١>ӄU˗R׀`qc VڑIw64 ]P9W&[ _J1\xq>hJc=!:`-R(NJ绥ܴɅ7,IGb4&LW*VŦl*nx<s w0 W$ 2}S`uYAO"/9ߗv˫L -0Gga)SR6WBH\GRhI;M"t@zEQ+ݣ˔+tuJ]ewҧ4.m$)NG\ݞ|!&8GH R*g8.TlTw bJ"owX`mĬ a6x1DHvq-ijZFg婧v"Od'B*"9JXhU!g'ZCrն!cU%PDIfm!XQ|QSse@ҶqIǡlEVe<fnbc*1t):FԁyݚȞ]nw15)c"9y>6wqt`D='Ә%` \Ym*"8vN#& ]?MiS.""ehtS&Ў׵M*,/AO>GX8A?_s3 ?'~c8+$ QN*Vt%4j |av{Z2dsyRYQ4͠5HQlԶcbuX[/Y10XT'WǏP~p̂?Bovz[VvFGZX}ؖhkFb xښ$4:M6%v}초gTxÝ JH&LyY<$!-NGcfo9kvbTax\< Qo*>;}=E=*=PcZz An {J>P.NNsU ṙi^Sd?Z/YH8Z8. RӇahIi*ӥ[%=[?CIZ&ZEӳԷ˯v6cG{ë٢|Igrfrxb5#hQAY8eNh6h Mt+J`I=}fSMut5s&}@vy{pv~q\C+X<;d!q԰uTЏY~TvRPX{Ou&͸7ap]B~o{f˼2n7'#xk:u b NDieԒjy'*(k.Aa2 |֕k')'c=#W[BN$8ucRػ<:촛{{r^ Nyan~̉c?P_({X[zZ5)g^Ά7yOܥ%tsk~j由mqeԞ?1CX+LեڜѴK64Da$*X)qRYlp^ȭ\F4QiP,`#*P9WOYd/e- Fxux^,Nld>.fs ?#SM M]~_Y̽ي~5o߯>uayJkm66Â="yfH4cID WGM,8 B%;$LtQ4* g"|s# ꪽB2ɤS 6)E'{^YMk\iS 2Z%By)"JIq -At<\JyαRqFXaz㯖)b*echŻMc> xspx;#fg3,yk[CȋU`X d=XEYwAMkV zc(sL6WJ 2HVi0jmaf.A*eArrE)+ ,Qk8G)+jVpy?`oA2|KgZz;-̷Jlf5AT}yK=,>`=MJm/S}g;:jWv9@:oqJ}Bwf֎-ۦˠOWQx7nz>\-"~vx)nOevBKp^P+3&< ԅ\PI~hPe6(F9SD1c )xo `*S s WazhµX:kPeh R׷-DKUe8Jxr2޿#ϔ3LFwL'`O`S`OH !wđVʣ e6s̐0Sg-iƈĊ1+tKI'.~cԙ\l`~oPRykk /gqm0+[a ̂̉T;rͬO3TB_%y 3†#O t& 4fYutB#e4(^UcR)ˆC[#b#L1` km̓LP[bbN R/{3GoM{YD+q8STãÇl,C݂xjZA-yLN2(U0zUp?% Z˚zD@x6:z~VE|hUuHը E8!XD_ ]ǵtN]-=M]f.sGˏUiVGU7lƴI(d,?e;|%dEvty{h\/hnƄsr"m0iivڜ$x*Z͉"xNpGK9 "5z^Ŋ3iy;|gVݶMz"kFz/19j VzM&lK<`D K_yG| '&e?_=v>mu; +D_d9N|skU fF[nQس'sKg"#u бx-S~bH/G(P:CFxNH>PaHf;e2ޕo~aϹԆSJL \UZCUJ <p7,4zKPNRZH)c$hJ$1齩SK Lop7jL@gf B$kڴm^};kz2Tb`V{Ak\{r({<9,_l tM'-uNqVt~fU3hccNUegq9{a\YT!Lm(I]d8H4N”Q؆hTO,RfA*`v#C;g;j?הuU9WxZqjb0!0RB@a05ؘF )(/g'ZpV>z8MF## dHUp]Yʙ~k͛kenET,`-B@^Z-ro7߆ 30ilvDw˜;`Na5P?>W{ ;;X3vbm{4a+0|$*)e$0[0 jN)"pߞ2mSG۲1oN>@.Ў3UGi㵁).&J26"+P, ;QjVmDV OLZX zCo Nˡ0wnxr.~;W+GQ~m-F[̏U'YD1qF& ۛmy_/)\0 ֬H}lA뢴T+Hi&J0JAP`k "*qTS""(k\:To>$xFAD,!Ќ 䙒c+eޯ=qE)Z!}I,V *[5 +b <ڈg_ ?n Ak8ך Ґ,&^)X1\geTBN"a)5#&RTzl$1E&PAJ Ńr,h0hMXiIF${0-'h3cD^{?~)ʡ&Oo IS6Ԓt`K!7;}"!>}n QFW3 ,/trWp*.60kl[*`Clߺڶ4V*@CAy:A%JnJk{W G$eM#`tRs\ $N'i/*Tya*WFMذH]<8-nu]zaIQB:a'iPy;ng\&@G`~ ǝ!JFngܛGZt=dI婥wL~d2W:383XԽ M8RW{VZ0@NtHE!\;I3E1nǡ%bI(E2(&`qڲ*\s7 ~0Dꂞ棼QNI6(7y1}Ѹ36t鍼pnamt1f 4ifۙ<0NT'Χ1P(ҿd꼻&WO05 '\œ]ࠕ/Ő[; )hwێCG΍fHeBC@v:0zɗ_܅=ǹT]~{>k@|~4UQ}"rmu mb1 3 X}?O.pt -cWc ]c@z\⬯7ChF/b4nOҨd{Тp+LA(qֹo+MCaP0@J(4MQ ym vFי-ЕM)x{لڻK,?MN(׃nk1 V6(#ԓuEy]a܅a@єbӞ,d} ߽+VL1:20 mkP‰s&MD֜IrCSCroI稧p2xPTCb| &1vnf4:nzP2@{4a2'N7?BkD0c9y`ʫ>BƝw7Alzӛ?s҃ɑerӂf)5ԯQ܏(3_@ʼYsNIg̱ڜ-9y_9$|͒ R YJ NjgѿSi/$\>:~k{9m*?I_Lf⯅hLx,͓e^]l*vOZkzD^˸/.ڱ7' oPu?%,X1A}Mwwׯ_^ R&,t"(`-ߛwb@Ǡs5#}sryѹg Kznm<Z^^\̳܄ #$@Gþwj9,`iz Hgy q:T V 䢵FqnsL:RjluaL+ 0'IFMIIA(9Pr<nxER78ZTp)^y_&# Z %v++boz.kj]#bAOųzӴ5 5^!JsۍfZO6-~HX1T1ARШu:-I^wqKBYҊZ/(RL *c>wj$)w1Ph\Tn|{=xŚ;Q#$LX-!IY֤Y;ӟnLsZ] L{߯Y@)zo߷3maP&.:awZ82g0I0рV-=`ji@1> e!IrFPECY'ȶ A$G/$ؠt BZnF bS. ϸAJn T`W.*BQb-b|< Œh[8X\hЬ7U~o5! ퟝǝ,nq9-ѨZa)=@_"`)(\+Pqi}CZ=# fnlr~vW[J%LZuJ˦JFy܀ D8#SI)NxRC/%fȨ D<~ @1FXHB N`E}5u̹nxR1 +ԼvRQO$%ۻYƍ˱Q@+/vTzꃕC{݋Tydƍt&Ka {w 51Y(Ӌdр 2H t?פ5.H&9s 39DZYEcؐƑd J[T+ fE}1iXxȍ(HrʜK)#fdӶOʿv {:2_D[˺b)GC՛wgr{MЙF2mAN9_Y٪n"]lܭfpl9?ZFpziFf}Eۓe)Ynq o.'|1Rl{FJVp=qNbAyJN QYEu9V㱏GD1ab c"W%^ǃO noXf0+@Xz5#*ʂ<)4s{s}Q?QI-GFag|5{%K(7}A"ʼn+yhq wq=h vM fN7u*HZ8WTJz<*&i"dAdQ*'viu"/$KfeQ%+msz&OE)=-Db@R ıșE` G1#dPMwԸtG/1FՖ YJЈzf,>Ab=!. 0ĸ beKMYfY`gsd[њ7!kz>{~%[C??Pƕ{ڤLg%hH&@XyIQhQKJt:8%>"jU4y G%H*ұ2X@*/K-a˘KPK`ZKPK5thJMETA-INF/MANIFEST.MFPK5thJӗtMETA-INF/SOVA.SFPK5thJ 3)qMETA-INF/SOVA.RSAPK5thJ 6 META-INF/PK5thJ`ZK s index.xmlPK1U././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/signindex/unsigned.jar0000644000175000017500000004714414620351225020460 0ustar00hanshansPK5thJMETA-INF/MANIFEST.MFMLK-. K-*ϳR03r.JM,IMu X*h%&*8%krr%Z)d楤VUr{8d RJv Lɵ0( (N.,-s522PK5thJӗtMETA-INF/SOVA.SFmOO0$|gL c*lRus m)gWu^L}\Iͭ3`z ϔ%:ƩFBgThGhvNEv aI=BXL p /!4$"h2\ԀZy{HSSQ&yN+^*Q7u PK5thJ META-INF/PK5thJ`ZK index.xmlYs$˒WGf#Ȏ}ӧjlg^`5]TzO|_hwҤgI2j1qJ3YkVf" {^\b=|wѸ7 /0pC\$_GÞjKvҗnpKg`nï {$'/9|A,7q DAu((Gib`J(;L1(SsĐ"%3&B F1?C&)'|CpQPD%gkw_zZ@Hmq14/' "o Eh|Cp4iij4t4xC(z 0C,`$Q&ZZkXZ v\˜j?  ( #,!^T^~=c(8L$Ap``916RD0o0'@@h D 5+:MehD9cSz-jNcL44p#08F8\BG 0/$$ch3PUADA \3y b$p:7gH)-,\E 8{h+`>R)\75@O@5G4  Gz yJ uY ˍ \%)f XA<TMA@8 ~ J3.Rzo'x#"S#P0dP0p/@X’ܐXA^{ rx' CC&@`%`\0uBRb0 ^D ` X:F=` |J&)V*fRA,Qlx*LL0a"TReZd @DNo A`H'F0FP@~+p+1 *EᘀցRS s=LV`V_:-(xF@ PI/Q_n&?|4d|Y/ ps_^aF \y}qwɕqo2} cݍ;adž8vg/uwwtT=LR)KQx#s=zaܱc[3F?U8+×A_yihxG.J2ZM;yׁvЭۓ?@\cuo76sۗSjeW/7 G|/nɆxjү^N(Y?67_0~θ:>42s=nA{ ?C-nL &F*PФ?.Ae%(lgPh O@a# O2(`C[`Z(Q˼PY؉0K[^KKEd .(/y O-ek){ #ZjVF @wgCz6fp*<@a˅?B Tx:gm [&Xxzϖ`Aj"xk]Gm 2Y˂Jf(qA`cAYDg2WDZpAQ)ʀMn6DM2Djב e1K?gi"OÍP|yCޒTX?ghO緍 Ǎvr<D5ȽF'Án{ޭST慭N|$gFdEI<ϰ&3ьKR3U5;8XF(M YH#Yd㪬Q ӑÈK_ZCD*345ӫ]ɹq=vcaiobjPPXA1)kmƩӳˋw'v/>\_YwWN>TXw7/d{qpr?^u_䕞?9ޟy\beJxl hr*xl{wpEü9oy.|:x{0mŲYM-7;"?9ؽx=?Ί_%4e՛G'W翝_/hԞOy{?;A=U?GJ+Mwû3hBWBR, ulo{L="]%J|[0`5;)9B'u}1Eߔx<OƷ㞛S{a0Yr#[7Q+AmE!4H&j؀̵ߡ-`iPVYx:UCZB`\k󣐒Uw4WE)8cքxcpN`i+ >h$58]ϥKҞ1vY3[zq.#s߮"NCrkظV.ǃj}sve ^>ۃ O?=Nodp64~fK0Ҍ c6+Xv<[kKY^RlW3>\e: E&g1AtpFQ*$% '+CkLo̘׷a)<+1-9l ڭAFլT$[sfbcᑄduSe1𘎺mi"FSXꀭS)^婥lM9PV5%cmQ ސv0U?#jI0MOlm2[Pw:jde6.MMwpdGOc`&iS+ôIGarfstb'y<~?RQf|/E7k1Ġfr֔N9{w2t҃C#h_zdusCS:0bR?≮1΅8 !@!Y`D;Pt+| ҥ& C^uQҽ|>ioйE=i\..R?LM#`;ߝ~ȹWDI^iJ5PFKgQ`2qZߥ 7EPR)0q/Aϸ%x:y.gǷ&:| |-g7 &Guvug:w6$gu>\=9?]ůX*qv=kſ؟}m~;],ݭ)}hw'W,.WX,/~-VֻjĪkq~4¿zü/Q(vް4.=FqeG{GBqx7X'~bbU;3@юQȼR)+\ؚ@~*WRE[2LϓG/‹ɋ/v^݋Z(k(p\$Y#*HH(rtm"aL3^+|[J`)bؒV[Q*5UkؼI%) 0̥058W2_nOm#Q W s ?:xw|rҰ{Ovurzqptw9V9/{]{={p|)Y<]$(T̗_O(tO- -{S fT&6PIHq|MZ|YFߞ~OokFҍuU3N9A>a^,eHgxÔ TiFMvӶ$"1V"j0C\땣qDũ-8X$YT*G k(U^0*7 _s-ɻC,7 //ߜ߻zw~_Wήv8VUރ-o4kjʆݏOvVPZ>Új>;-\aGp!3FLTȥ"J+C3S1qDU{ĪPYêI⽲ |XFpN!ַ۫pj+!\缈?zXHU LSچ{HT|l*x(bfWB;%cN,2)%MJ1Ȫ)y&p\B(L,3CS@w[P%J21XRz(f)0<***F-A\pςRRwQVO7oߥBFǴjcJ1%`J2.;|C[.-™b\@Ź`B7|Ç Mwt|reX9/nm]FT4x?ˇd٫bRWY*9qSEI ж(ؽұjn&E7SJ ?[pz+1sjm_߾ꞞS{ͭ#3=wcsWP66}|sky:e)ZVlB. Fd)Qǫ{+)ԁ=a8#5^ 9RJ ă Sn|ަLI2Zt<LM@jR?q:'$}2GTju'p6F7'z tQCtpxYo8u䨺 @ke~_ј $x{ QTW3?h4!hyCEXވ 21rPi2FW0AD\^¨i JneɼԵ, liõܵ١>ӄU˗R׀`qc VڑIw64 ]P9W&[ _J1\xq>hJc=!:`-R(NJ绥ܴɅ7,IGb4&LW*VŦl*nx<s w0 W$ 2}S`uYAO"/9ߗv˫L -0Gga)SR6WBH\GRhI;M"t@zEQ+ݣ˔+tuJ]ewҧ4.m$)NG\ݞ|!&8GH R*g8.TlTw bJ"owX`mĬ a6x1DHvq-ijZFg婧v"Od'B*"9JXhU!g'ZCrն!cU%PDIfm!XQ|QSse@ҶqIǡlEVe<fnbc*1t):FԁyݚȞ]nw15)c"9y>6wqt`D='Ә%` \Ym*"8vN#& ]?MiS.""ehtS&Ў׵M*,/AO>GX8A?_s3 ?'~c8+$ QN*Vt%4j |av{Z2dsyRYQ4͠5HQlԶcbuX[/Y10XT'WǏP~p̂?Bovz[VvFGZX}ؖhkFb xښ$4:M6%v}초gTxÝ JH&LyY<$!-NGcfo9kvbTax\< Qo*>;}=E=*=PcZz An {J>P.NNsU ṙi^Sd?Z/YH8Z8. RӇahIi*ӥ[%=[?CIZ&ZEӳԷ˯v6cG{ë٢|Igrfrxb5#hQAY8eNh6h Mt+J`I=}fSMut5s&}@vy{pv~q\C+X<;d!q԰uTЏY~TvRPX{Ou&͸7ap]B~o{f˼2n7'#xk:u b NDieԒjy'*(k.Aa2 |֕k')'c=#W[BN$8ucRػ<:촛{{r^ Nyan~̉c?P_({X[zZ5)g^Ά7yOܥ%tsk~j由mqeԞ?1CX+LեڜѴK64Da$*X)qRYlp^ȭ\F4QiP,`#*P9WOYd/e- Fxux^,Nld>.fs ?#SM M]~_Y̽ي~5o߯>uayJkm66Â="yfH4cID WGM,8 B%;$LtQ4* g"|s# ꪽB2ɤS 6)E'{^YMk\iS 2Z%By)"JIq -At<\JyαRqFXaz㯖)b*echŻMc> xspx;#fg3,yk[CȋU`X d=XEYwAMkV zc(sL6WJ 2HVi0jmaf.A*eArrE)+ ,Qk8G)+jVpy?`oA2|KgZz;-̷Jlf5AT}yK=,>`=MJm/S}g;:jWv9@:oqJ}Bwf֎-ۦˠOWQx7nz>\-"~vx)nOevBKp^P+3&< ԅ\PI~hPe6(F9SD1c )xo `*S s WazhµX:kPeh R׷-DKUe8Jxr2޿#ϔ3LFwL'`O`S`OH !wđVʣ e6s̐0Sg-iƈĊ1+tKI'.~cԙ\l`~oPRykk /gqm0+[a ̂̉T;rͬO3TB_%y 3†#O t& 4fYutB#e4(^UcR)ˆC[#b#L1` km̓LP[bbN R/{3GoM{YD+q8STãÇl,C݂xjZA-yLN2(U0zUp?% Z˚zD@x6:z~VE|hUuHը E8!XD_ ]ǵtN]-=M]f.sGˏUiVGU7lƴI(d,?e;|%dEvty{h\/hnƄsr"m0iivڜ$x*Z͉"xNpGK9 "5z^Ŋ3iy;|gVݶMz"kFz/19j VzM&lK<`D K_yG| '&e?_=v>mu; +D_d9N|skU fF[nQس'sKg"#u бx-S~bH/G(P:CFxNH>PaHf;e2ޕo~aϹԆSJL \UZCUJ <p7,4zKPNRZH)c$hJ$1齩SK Lop7jL@gf B$kڴm^};kz2Tb`V{Ak\{r({<9,_l tM'-uNqVt~fU3hccNUegq9{a\YT!Lm(I]d8H4N”Q؆hTO,RfA*`v#C;g;j?הuU9WxZqjb0!0RB@a05ؘF )(/g'ZpV>z8MF## dHUp]Yʙ~k͛kenET,`-B@^Z-ro7߆ 30ilvDw˜;`Na5P?>W{ ;;X3vbm{4a+0|$*)e$0[0 jN)"pߞ2mSG۲1oN>@.Ў3UGi㵁).&J26"+P, ;QjVmDV OLZX zCo Nˡ0wnxr.~;W+GQ~m-F[̏U'YD1qF& ۛmy_/)\0 ֬H}lA뢴T+Hi&J0JAP`k "*qTS""(k\:To>$xFAD,!Ќ 䙒c+eޯ=qE)Z!}I,V *[5 +b <ڈg_ ?n Ak8ך Ґ,&^)X1\geTBN"a)5#&RTzl$1E&PAJ Ńr,h0hMXiIF${0-'h3cD^{?~)ʡ&Oo IS6Ԓt`K!7;}"!>}n QFW3 ,/trWp*.60kl[*`Clߺڶ4V*@CAy:A%JnJk{W G$eM#`tRs\ $N'i/*Tya*WFMذH]<8-nu]zaIQB:a'iPy;ng\&@G`~ ǝ!JFngܛGZt=dI婥wL~d2W:383XԽ M8RW{VZ0@NtHE!\;I3E1nǡ%bI(E2(&`qڲ*\s7 ~0Dꂞ棼QNI6(7y1}Ѹ36t鍼pnamt1f 4ifۙ<0NT'Χ1P(ҿd꼻&WO05 '\œ]ࠕ/Ő[; )hwێCG΍fHeBC@v:0zɗ_܅=ǹT]~{>k@|~4UQ}"rmu mb1 3 X}?O.pt -cWc ]c@z\⬯7ChF/b4nOҨd{Тp+LA(qֹo+MCaP0@J(4MQ ym vFי-ЕM)x{لڻK,?MN(׃nk1 V6(#ԓuEy]a܅a@єbӞ,d} ߽+VL1:20 mkP‰s&MD֜IrCSCroI稧p2xPTCb| &1vnf4:nzP2@{4a2'N7?BkD0c9y`ʫ>BƝw7Alzӛ?s҃ɑerӂf)5ԯQ܏(3_@ʼYsNIg̱ڜ-9y_9$|͒ R YJ NjgѿSi/$\>:~k{9m*?I_Lf⯅hLx,͓e^]l*vOZkzD^˸/.ڱ7' oPu?%,X1A}Mwwׯ_^ R&,t"(`-ߛwb@Ǡs5#}sryѹg Kznm<Z^^\̳܄ #$@Gþwj9,`iz Hgy q:T V 䢵FqnsL:RjluaL+ 0'IFMIIA(9Pr<nxER78ZTp)^y_&# Z %v++boz.kj]#bAOųzӴ5 5^!JsۍfZO6-~HX1T1ARШu:-I^wqKBYҊZ/(RL *c>wj$)w1Ph\Tn|{=xŚ;Q#$LX-!IY֤Y;ӟnLsZ] L{߯Y@)zo߷3maP&.:awZ82g0I0рV-=`ji@1> e!IrFPECY'ȶ A$G/$ؠt BZnF bS. ϸAJn T`W.*BQb-b|< Œh[8X\hЬ7U~o5! ퟝǝ,nq9-ѨZa)=@_"`)(\+Pqi}CZ=# fnlr~vW[J%LZuJ˦JFy܀ D8#SI)NxRC/%fȨ D<~ @1FXHB N`E}5u̹nxR1 +ԼvRQO$%ۻYƍ˱Q@+/vTzꃕC{݋Tydƍt&Ka {w 51Y(Ӌdр 2H t?פ5.H&9s 39DZYEcؐƑd J[T+ fE}1iXxȍ(HrʜK)#fdӶOʿv {:2_D[˺b)GC՛wgr{MЙF2mAN9_Y٪n"]lܭfpl9?ZFpziFf}Eۓe)Ynq o.'|1Rl{FJVp=qNbAyJN QYEu9V㱏GD1ab c"W%^ǃO noXf0+@Xz5#*ʂ<)4s{s}Q?QI-GFag|5{%K(7}A"ʼn+yhq wq=h vM fN7u*HZ8WTJz<*&i"dAdQ*'viu"/$KfeQ%+msz&OE)=-Db@R ıșE` G1#dPMwԸtG/1FՖ YJЈzf,>Ab=!. 0ĸ beKMYfY`gsd[њ7!kz>{~%[C??Pƕ{ڤLg%hH&@XyIQhQKJt:8%>"jU4y G%H*ұ2X@*/K-a˘KPK5thJMETA-INF/MANIFEST.MFPK5thJӗtMETA-INF/SOVA.SFPK5thJ META-INF/PK5thJ`ZK index.xmlPK\M././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/signindex.TestCase0000755000175000017500000001722414620351225017602 0ustar00hanshans#!/usr/bin/env python3 import inspect import json import logging import os import shutil import subprocess import sys import tempfile import unittest localmodule = os.path.realpath( os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') ) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) from fdroidserver import apksigcopier, common, exception, signindex, update from pathlib import Path from unittest.mock import patch class Options: allow_disabled_algorithms = False clean = False delete_unknown = False nosign = False pretty = True rename_apks = False verbose = False class SignindexTest(unittest.TestCase): basedir = Path(__file__).resolve().parent def setUp(self): signindex.config = None config = common.read_config() config['jarsigner'] = common.find_sdk_tools_cmd('jarsigner') config['verbose'] = True config['keystore'] = str(self.basedir / 'keystore.jks') config['repo_keyalias'] = 'sova' config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' signindex.config = config logging.basicConfig(level=logging.DEBUG) self.tempdir = tempfile.TemporaryDirectory() os.chdir(self.tempdir.name) self.repodir = Path('repo') self.repodir.mkdir() def tearDown(self): self.tempdir.cleanup() def test_sign_index(self): shutil.copy(str(self.basedir / 'repo/index-v1.json'), 'repo') signindex.sign_index(str(self.repodir), 'index-v1.json') self.assertTrue((self.repodir / 'index-v1.jar').exists()) self.assertTrue((self.repodir / 'index-v1.json').exists()) def test_sign_index_corrupt(self): with open('repo/index-v1.json', 'w') as fp: fp.write('corrupt JSON!') with self.assertRaises(json.decoder.JSONDecodeError, msg='error on bad JSON'): signindex.sign_index(str(self.repodir), 'index-v1.json') def test_sign_entry(self): entry = 'repo/entry.json' v2 = 'repo/index-v2.json' shutil.copy(self.basedir / entry, entry) shutil.copy(self.basedir / v2, v2) signindex.sign_index(self.repodir, 'entry.json') self.assertTrue((self.repodir / 'entry.jar').exists()) def test_sign_entry_corrupt(self): """sign_index should exit with error if entry.json is bad JSON""" entry = 'repo/entry.json' with open(entry, 'w') as fp: fp.write('{') with self.assertRaises(json.decoder.JSONDecodeError, msg='error on bad JSON'): signindex.sign_index(self.repodir, 'entry.json') self.assertFalse((self.repodir / 'entry.jar').exists()) def test_sign_entry_corrupt_leave_entry_jar(self): """sign_index should not touch existing entry.jar if entry.json is corrupt""" existing = 'repo/entry.jar' testvalue = "Don't touch!" with open(existing, 'w') as fp: fp.write(testvalue) with open('repo/entry.json', 'w') as fp: fp.write('{') with self.assertRaises(json.decoder.JSONDecodeError, msg='error on bad JSON'): signindex.sign_index(self.repodir, 'entry.json') with open(existing) as fp: self.assertEqual(testvalue, fp.read()) def test_sign_corrupt_index_v2_json(self): """sign_index should exit with error if index-v2.json JSON is corrupt""" with open('repo/index-v2.json', 'w') as fp: fp.write('{"key": "not really an index"') good_entry = { "timestamp": 1676583021000, "version": 20002, "index": { "name": "/index-v2.json", "sha256": common.sha256sum('repo/index-v2.json'), "size": os.path.getsize('repo/index-v2.json'), "numPackages": 0, }, } with open('repo/entry.json', 'w') as fp: json.dump(good_entry, fp) with self.assertRaises(json.decoder.JSONDecodeError, msg='error on bad JSON'): signindex.sign_index(self.repodir, 'entry.json') self.assertFalse((self.repodir / 'entry.jar').exists()) def test_sign_index_v2_corrupt_sha256(self): """sign_index should exit with error if SHA-256 of file in entry is wrong""" entry = 'repo/entry.json' v2 = 'repo/index-v2.json' shutil.copy(self.basedir / entry, entry) shutil.copy(self.basedir / v2, v2) with open(v2, 'a') as fp: fp.write(' ') with self.assertRaises(exception.FDroidException, msg='error on bad SHA-256'): signindex.sign_index(self.repodir, 'entry.json') self.assertFalse((self.repodir / 'entry.jar').exists()) def test_signindex(self): if common.find_apksigner({}) is None: # TODO remove me for buildserver-bullseye self.skipTest('SKIPPING test_signindex, apksigner not installed!') os.mkdir('archive') metadata = Path('metadata') metadata.mkdir() with (metadata / 'info.guardianproject.urzip.yml').open('w') as fp: fp.write('# placeholder') shutil.copy(str(self.basedir / 'urzip.apk'), 'repo') index_files = [] for f in ( 'entry.jar', 'entry.json', 'index-v1.jar', 'index-v1.json', 'index-v2.json', 'index.jar', 'index.xml', ): for section in (Path('repo'), Path('archive')): path = section / f self.assertFalse(path.exists(), '%s should not exist yet!' % path) index_files.append(path) common.options = Options with patch('sys.argv', ['fdroid update']): update.main() with patch('sys.argv', ['fdroid signindex', '--verbose']): signindex.main() for f in index_files: self.assertTrue(f.exists(), '%s should exist!' % f) self.assertFalse(os.path.exists('index-v2.jar')) # no JAR version of this file # index.jar aka v0 must by signed by SHA1withRSA f = 'repo/index.jar' common.verify_deprecated_jar_signature(f) self.assertIsNone(apksigcopier.extract_v2_sig(f, expected=False)) cp = subprocess.run( ['jarsigner', '-verify', '-verbose', f], stdout=subprocess.PIPE ) self.assertTrue(b'SHA1withRSA' in cp.stdout) # index-v1.jar must by signed by SHA1withRSA f = 'repo/index-v1.jar' common.verify_deprecated_jar_signature(f) self.assertIsNone(apksigcopier.extract_v2_sig(f, expected=False)) cp = subprocess.run( ['jarsigner', '-verify', '-verbose', f], stdout=subprocess.PIPE ) self.assertTrue(b'SHA1withRSA' in cp.stdout) # entry.jar aka index v2 must by signed by a modern algorithm f = 'repo/entry.jar' common.verify_deprecated_jar_signature(f) self.assertIsNone(apksigcopier.extract_v2_sig(f, expected=False)) cp = subprocess.run( ['jarsigner', '-verify', '-verbose', f], stdout=subprocess.PIPE ) self.assertFalse(b'SHA1withRSA' in cp.stdout) if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) import argparse parser = argparse.ArgumentParser() parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) common.options = common.parse_args(parser) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(SignindexTest)) unittest.main(failfast=False) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/0000755000175000017500000000000014620351546016552 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/Zillode/0000755000175000017500000000000014620351546020154 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/Zillode/syncthing-silk/0000755000175000017500000000000014620351546023122 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/Zillode/syncthing-silk/build.gradle0000644000175000017500000000370014620351225025373 0ustar00hanshans/* * Copyright (c) 2015 OpenSilk Productions LLC * * 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 . */ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { mavenCentral() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.1.3' classpath 'me.tatarka:gradle-retrolambda:2.5.0' classpath 'org.robolectric:robolectric-gradle-plugin:1.0.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { mavenCentral() jcenter() maven { url '../../m2/repository' } maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } } } // Build config ext.compileSdkVersion = 22 ext.buildToolsVersion = "22.0.1" // defaultConfig ext.targetSdkVersion = 22 ext.supportLibVersion = "22.1.1" ext.dagger2Version = "2.0" ext.rxAndroidVersion = "0.23.0" ext.timberVersion = "2.5.0" ext.commonsLangVersion = "3.3.2" ext.butterKnifeVersion = "6.0.0" ext.commonsIoVersion = "2.4" ext.gsonVersion = "2.3" def gitSha() { return 'git rev-parse --short HEAD'.execute().text.trim() } def getDebugVersionSuffix() { return "${gitSha()}".isEmpty() ? "-SNAPSHOT" : "-SNAPSHOT-${gitSha()}" } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/at.bitfire.davdroid/0000755000175000017500000000000014620351546022374 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/at.bitfire.davdroid/build.gradle0000644000175000017500000000676614620351225024664 0ustar00hanshans/* * Copyright (c) Ricki Hirner (bitfire web engineering). * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html */ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plugin: 'org.jetbrains.dokka-android' android { compileSdkVersion 27 buildToolsVersion '27.0.1' defaultConfig { applicationId "at.bitfire.davdroid" versionCode 197 buildConfigField "long", "buildTime", System.currentTimeMillis() + "L" buildConfigField "boolean", "customCerts", "true" minSdkVersion 19 // Android 4.4 targetSdkVersion 27 // Android 8.1 // when using this, make sure that notification icons are real bitmaps vectorDrawables.useSupportLibrary = true } flavorDimensions "type" productFlavors { standard { versionName "1.9.8.1-ose" buildConfigField "boolean", "customCerts", "true" buildConfigField "boolean", "customCertsUI", "true" } } buildTypes { debug { minifyEnabled false } release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } lintOptions { disable 'GoogleAppIndexingWarning' // we don't need Google indexing, thanks disable 'ImpliedQuantity', 'MissingQuantity' // quantities from Transifex may vary disable 'MissingTranslation', 'ExtraTranslation' // translations from Transifex are not always up to date disable "OnClick" // doesn't recognize Kotlin onClick methods disable 'Recycle' // doesn't understand Lombok's @Cleanup disable 'RtlEnabled' disable 'RtlHardcoded' disable 'Typos' } packagingOptions { exclude 'META-INF/DEPENDENCIES' exclude 'META-INF/LICENSE' } defaultConfig { testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } } dependencies { compile project(':cert4android') compile project(':dav4android') compile project(':ical4android') compile project(':vcard4android') compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" compile 'com.android.support:appcompat-v7:27.0.2' compile 'com.android.support:cardview-v7:27.0.2' compile 'com.android.support:design:27.0.2' compile 'com.android.support:preference-v14:27.0.2' compile 'com.github.yukuku:ambilwarna:2.0.1' compile 'com.squareup.okhttp3:logging-interceptor:3.9.1' compile 'commons-io:commons-io:2.6' compile 'dnsjava:dnsjava:2.1.8' compile 'org.apache.commons:commons-lang3:3.6' compile 'org.apache.commons:commons-collections4:4.1' // for tests //noinspection GradleDynamicVersion androidTestCompile('com.android.support.test:runner:+') { exclude group: 'com.android.support', module: 'support-annotations' } //noinspection GradleDynamicVersion androidTestCompile('com.android.support.test:rules:+') { exclude group: 'com.android.support', module: 'support-annotations' } androidTestCompile 'junit:junit:4.12' androidTestCompile 'com.squareup.okhttp3:mockwebserver:3.9.1' testCompile 'junit:junit:4.12' testCompile 'com.squareup.okhttp3:mockwebserver:3.9.1' } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/cn.wildfirechat.chat/0000755000175000017500000000000014620351546022534 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/cn.wildfirechat.chat/avenginekit/0000755000175000017500000000000014620351546025040 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/cn.wildfirechat.chat/avenginekit/build.gradle0000644000175000017500000000012714620351225027311 0ustar00hanshansconfigurations.maybeCreate("default") artifacts.add("default", file('avenginekit.aar'))././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/cn.wildfirechat.chat/build.gradle0000644000175000017500000000171314620351225025007 0ustar00hanshans// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { google() jcenter() mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:3.4.2' classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { google() jcenter() maven { url "http://developer.huawei.com/repo/" } maven { url 'https://jitpack.io' } maven { url 'https://dl.bintray.com/jenly/maven' } } configurations { all { resolutionStrategy { //force "android.arch.lifecycle:runtime:1.1.1" } } } } task clean(type: Delete) { delete rootProject.buildDir } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/cn.wildfirechat.chat/chat/0000755000175000017500000000000014620351546023453 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/cn.wildfirechat.chat/chat/build.gradle0000644000175000017500000000772714620351225025741 0ustar00hanshansapply plugin: 'com.android.application' android { signingConfigs { wfc { keyAlias 'wfc' keyPassword 'wildfirechat' storeFile file('../wfc.keystore') storePassword 'wildfirechat' } } compileSdkVersion 28 aaptOptions.cruncherEnabled = false aaptOptions.useNewCruncher = false defaultConfig { applicationId "cn.wildfirechat.chat" minSdkVersion 16 targetSdkVersion 28 //当targetversion大于23时,需要使用fileprovider versionCode 23 versionName "0.6.9" multiDexEnabled true javaCompileOptions { annotationProcessorOptions { includeCompileClasspath true } } signingConfig signingConfigs.wfc // buildConfigField("String", "BuglyId", '"34490ba79f"') ndk { abiFilters "armeabi-v7a", 'x86', 'x86_64' // ,'armeabi', 'arm64-v8a', 'x86', 'x86_64' } } buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.wfc } debug { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.wfc } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } lintOptions { abortOnError false } sourceSets { main { // wfc kit start jniLibs.srcDirs += ['libs', 'kit/libs'] res.srcDirs += ['kit/src/main/res', 'kit/src/main/res-av'] assets.srcDirs += ['kit/src/main/assets'] java.srcDirs += ['kit/src/main/java'] // wfc kit end } } productFlavors { } compileOptions { sourceCompatibility 1.8 targetCompatibility 1.8 } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation files('libs/TencentLocationSDK_v4.9.7.12_r247861_161205_1104.jar') implementation files('libs/TencentMapSDK_Raster_v_1.2.7_51ae0e7.jar') implementation files('libs/TencentSearch1.1.3.jar') implementation 'com.tencent.bugly:crashreport:2.8.6.0' implementation 'com.tencent.bugly:nativecrashreport:3.6.0.1' implementation 'com.lqr.adapter:library:1.0.2' implementation 'com.jaeger.statusbaruitl:library:1.3.5' implementation project(':push') // wfc kit start implementation fileTree(include: ['*.jar'], dir: 'kit/libs') implementation 'androidx.appcompat:appcompat:1.1.0-beta01' implementation 'com.google.android.material:material:1.1.0-alpha10' implementation 'cjt.library.wheel:camera:1.1.9' implementation 'com.kyleduo.switchbutton:library:1.4.4' implementation 'com.squareup.okhttp3:okhttp:3.11.0' implementation 'com.squareup.okio:okio:1.14.0' implementation 'com.jakewharton:butterknife:10.2.0' annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.0' implementation 'com.github.bumptech.glide:glide:4.8.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0' implementation 'com.github.chrisbanes:PhotoView:2.3.0' implementation 'org.webrtc:google-webrtc:1.0.21929' implementation 'com.afollestad.material-dialogs:core:0.9.6.0' implementation 'q.rorbin:badgeview:1.1.3' implementation 'com.google.code.gson:gson:2.8.5' // ViewModel and LiveData def lifecycle_version = '2.2.0-alpha05' implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version" implementation project(':client') implementation project(':avenginekit') implementation project(':emojilibrary') implementation project(':imagepicker') implementation 'com.king.zxing:zxing-lite:1.1.1' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0' // kit wfc end } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/cn.wildfirechat.chat/client/0000755000175000017500000000000014620351546024012 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/cn.wildfirechat.chat/client/build.gradle0000644000175000017500000000244514620351225026270 0ustar00hanshansapply plugin: 'com.android.library' apply plugin: 'com.github.dcendents.android-maven' group = 'com.github.wildfirechat' android { compileSdkVersion 28 defaultConfig { minSdkVersion 16 targetSdkVersion 28 versionCode 1 versionName "1.0" // testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" ndk { // TODO: changes this for your application if needed moduleName = "mmnet" //abiFilter "armeabi" //去掉armeabi架构,armeabi-v7a可以兼容armeabi架构。 abiFilter "armeabi-v7a" abiFilter "arm64-v8a" abiFilter "x86" abiFilter "x86_64" } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } sourceSets { main { jniLibs.srcDirs = ['libs'] } } lintOptions { abortOnError false } compileOptions { targetCompatibility 1.8 sourceCompatibility 1.8 } } dependencies { api project(':mars-core-release') def lifecycle_version = '2.0.0-beta01' implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version" } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/cn.wildfirechat.chat/client/src/0000755000175000017500000000000014620351546024601 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/cn.wildfirechat.chat/client/src/main/0000755000175000017500000000000014620351546025525 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/cn.wildfirechat.chat/client/src/main/AndroidManifest.xml0000644000175000017500000000242714620351225031315 0ustar00hanshans ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/cn.wildfirechat.chat/emojilibrary/0000755000175000017500000000000014620351546025224 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/cn.wildfirechat.chat/emojilibrary/build.gradle0000755000175000017500000000125514620351225027503 0ustar00hanshansapply plugin: 'com.android.library' android { compileSdkVersion 28 defaultConfig { minSdkVersion 16 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } android { lintOptions { abortOnError false } } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'androidx.appcompat:appcompat:1.0.0-beta01' }././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/cn.wildfirechat.chat/gradle/0000755000175000017500000000000014620351546023772 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/cn.wildfirechat.chat/gradle/build_libraries.gradle0000644000175000017500000000216214620351225030300 0ustar00hanshansdef checkExecResult(execResult) { if (execResult) { if (execResult.getExitValue() != 0) { throw new GradleException('Non-zero exit value: ' + execResult.getExitValue()) } } else { throw new GradleException('Returned a null execResult object') } } task buildLibrariesForAndroid(type: Exec) { workingDir '../' def sdkDir = System.env.ANDROID_HOME def ndkDir = System.env.ANDROID_NDK_HOME if (rootProject.file("local.properties").exists()) { Properties properties = new Properties() properties.load(project.rootProject.file('local.properties').newDataInputStream()) sdkDir = properties.getProperty('sdk.dir') ndkDir = properties.getProperty('ndk.dir') } def path = System.env.PATH def envMap = [ 'ANDROID_HOME' : sdkDir, 'ANDROID_NDK_HOME': ndkDir, '_ARCH_' : 'armeabi', 'PATH' : ndkDir, ] environment envMap print envMap commandLine 'python', 'build_android.py', '2', 'armeabi' doLast { checkExecResult(execResult) } } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/cn.wildfirechat.chat/imagepicker/0000755000175000017500000000000014620351546025014 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/cn.wildfirechat.chat/imagepicker/build.gradle0000755000175000017500000000131414620351225027267 0ustar00hanshansapply plugin: 'com.android.library' android { compileSdkVersion 28 defaultConfig { minSdkVersion 16 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } lintOptions { abortOnError false } } dependencies { implementation 'androidx.appcompat:appcompat:1.0.0-beta01' implementation 'com.github.chrisbanes.photoview:library:1.2.4' implementation 'com.github.bumptech.glide:glide:4.8.0' } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/cn.wildfirechat.chat/mars-core-release/0000755000175000017500000000000014620351546026042 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/cn.wildfirechat.chat/mars-core-release/build.gradle0000644000175000017500000000013514620351225030312 0ustar00hanshansconfigurations.maybeCreate("default") artifacts.add("default", file('mars-core-release.aar'))././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/cn.wildfirechat.chat/push/0000755000175000017500000000000014620351546023513 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/cn.wildfirechat.chat/push/build.gradle0000644000175000017500000000266214620351225025772 0ustar00hanshansapply plugin: 'com.android.library' android { compileSdkVersion 28 defaultConfig { minSdkVersion 16 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" manifestPlaceholders = [ MI_APP_ID : "2882303761517722456", MI_APP_KEY : "5731772292456", HMS_APP_ID : "100221325", MEIZU_APP_ID : "113616", MEIZU_APP_KEY: "fcd886f51c144b45b87a67a28e2934d1", VIVO_APP_ID : "12918", VIVO_APP_KEY : "c42feb05-de6c-427d-af55-4f902d9e0a75" ] } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility 1.8 targetCompatibility 1.8 } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.huawei.android.hms:push:2.5.3.305' implementation 'com.huawei.android.hms:base:2.5.3.305' implementation 'androidx.appcompat:appcompat:1.0.0-beta01' implementation project(':client') implementation 'com.meizu.flyme.internet:push-internal:3.4.2@aar' def lifecycle_version = '2.2.0-alpha05' implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version" } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/cn.wildfirechat.chat/settings.gradle0000644000175000017500000000023314620351225025544 0ustar00hanshansinclude ':client', ':push', ':chat', ':mars-core-release', ':emojilibrary', ':imagepicker', ':avenginekit' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.anpmech.launcher/0000755000175000017500000000000014620351546022542 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.anpmech.launcher/app/0000755000175000017500000000000014620351546023322 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.anpmech.launcher/app/build.gradle0000644000175000017500000000432214620351225025574 0ustar00hanshans/* * Copyright 2015-2017 Hayai Software * Copyright 2018 The KeikaiLauncher Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND * either express or implied. See the License for the specific language governing permissions and * limitations under the License. */ plugins { id 'com.android.application' id 'pl.allegro.tech.build.axion-release' version '1.8.1' } scmVersion { tag { prefix = '' } } /** * Takes version {@code major.minor.patch[-suffix]} and returns numeric versionCode based on it * Example: {@code 1.2.3-SNAPSHOT} will return {@code 1002003} */ static int versionCode(String versionName) { def matcher = (versionName =~ /(\d+)\.(\d+)\.(\d+).*/) return matcher.matches() ? matcher.collect { version, major, minor, patch -> major.toInteger() * 10000 + minor.toInteger() * 100 + patch.toInteger() }.head() : -1 } def androidVersion = [ name: scmVersion.version, code: versionCode(scmVersion.version), ] android { compileSdkVersion 28 defaultConfig { applicationId 'com.anpmech.launcher' minSdkVersion 15 targetSdkVersion 28 versionName androidVersion.name versionCode androidVersion.code } lintOptions { abortOnError false } buildTypes { all { buildConfigField("String", "GITHUB_USER", "\"KeikaiLauncher\"") buildConfigField("String", "GITHUB_PROJECT", "\"KeikaiLauncher\"") } release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.txt' } debug { versionNameSuffix "-debug" } } dependencies { implementation 'com.android.support:support-annotations:28.0.0' } } dependencies { } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.anpmech.launcher/app/src/0000755000175000017500000000000014620351546024111 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.anpmech.launcher/app/src/main/0000755000175000017500000000000014620351546025035 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.anpmech.launcher/app/src/main/AndroidManifest.xml0000644000175000017500000000533314620351225030624 0ustar00hanshans ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.anpmech.launcher/build.gradle0000644000175000017500000000226314620351225025016 0ustar00hanshans/* * Copyright 2015-2017 Hayai Software * Copyright 2018 The KeikaiLauncher Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND * either express or implied. See the License for the specific language governing permissions and * limitations under the License. */ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { jcenter() google() } dependencies { classpath 'com.android.tools.build:gradle:3.2.1' } } allprojects { repositories { jcenter() google() } } buildscript { repositories { mavenCentral() } dependencies { classpath 'org.owasp:dependency-check-gradle:5.2.4' } } apply plugin: 'org.owasp.dependencycheck' dependencyCheck { format='JSON' } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.anpmech.launcher/settings.gradle0000644000175000017500000000121514620351225025553 0ustar00hanshans/* * Copyright 2015-2017 Hayai Software * Copyright 2018 The KeikaiLauncher Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND * either express or implied. See the License for the specific language governing permissions and * limitations under the License. */ include ':app' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.github.jameshnsears.quoteunquote/0000755000175000017500000000000014620351546026050 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.github.jameshnsears.quoteunquote/build.gradle0000644000175000017500000001721114620351225030323 0ustar00hanshansapply plugin: 'com.android.application' apply plugin: 'com.google.gms.google-services' apply plugin: 'kotlin-android' apply from: '../jacoco.gradle' apply from: '../ktlint.gradle' apply from: '../detekt.gradle' apply from: '../checkstyle.gradle' apply from: '../sonarcube.gradle' def localPropertiesFile = rootProject.file("local.properties") def localProperties = new Properties() if (!localPropertiesFile.exists()) { localProperties.setProperty("RELEASE_STORE_PASSWORD", "") localProperties.setProperty("RELEASE_KEY_PASSWORD", "") localProperties.setProperty("RELEASE_KEY_ALIAS", "") localProperties.setProperty("RELEASE_STORE_FILE", "keystore.jks") Writer writer = new FileWriter(localPropertiesFile, false) localProperties.store(writer, "empty, as creating the file is done manually via gpg") writer.close() file(project(':app').projectDir.path + "/keystore.jks").text = "" } localProperties.load(new FileInputStream(localPropertiesFile)) android { compileSdkVersion 30 // compileSdkVersion "android-S" signingConfigs { googleplay { keyAlias localProperties['RELEASE_KEY_ALIAS'] keyPassword localProperties['RELEASE_KEY_PASSWORD'] storeFile file(localProperties['RELEASE_STORE_FILE']) storePassword localProperties['RELEASE_STORE_PASSWORD'] } } defaultConfig { minSdkVersion 24 targetSdkVersion 30 // minSdkVersion "S" // targetSdkVersion "S" applicationId "com.github.jameshnsears.quoteunquote" versionCode 73 versionName "2.5.2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunnerArguments clearPackageData: 'true' javaCompileOptions { annotationProcessorOptions { arguments += ["room.schemaLocation": "$projectDir/schemas".toString()] } } } packagingOptions { exclude "**/module-info.class" exclude 'LICENSE' exclude 'README.md' } lintOptions { abortOnError true warningsAsErrors false checkAllWarnings = true xmlReport false htmlReport true } buildTypes { def gitHash = { -> def stdout = new ByteArrayOutputStream() exec { commandLine 'git', 'rev-parse', '--short=8', 'HEAD' standardOutput = stdout } return stdout.toString().trim() } release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' buildConfigField("String", "GIT_HASH", "\"$gitHash\"") buildConfigField("String", "DATABASE_QUOTATIONS", "\"quotations.db.prod\"") } debug { testCoverageEnabled true buildConfigField("String", "GIT_HASH", "\"$gitHash\"") buildConfigField("String", "DATABASE_QUOTATIONS", "\"quotations.db.dev\"") } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = JavaVersion.VERSION_1_8.toString() } flavorDimensions 'Version' productFlavors { 'googleplay' { dimension 'Version' versionNameSuffix "-googleplay" signingConfig signingConfigs.googleplay } 'googleplayS' { dimension 'Version' versionNameSuffix "-googleplay-S" signingConfig signingConfigs.googleplay } 'fdroid' { dimension 'Version' versionNameSuffix "-fdroid" isDefault true } 'fdroidS' { dimension 'Version' versionNameSuffix "-fdroid-S" } } sourceSets { androidTest { assets.srcDirs += files("$projectDir/schemas".toString()) } fdroid { assets.srcDirs = ['src/main/assets'] java.srcDirs = ['src/main/java', 'src/fdroid/java'] } fdroidS { assets.srcDirs = ['src/main/assets'] java.srcDirs = ['src/main/java', 'src/fdroid/java'] } googleplay { assets.srcDirs = ['src/main/assets'] java.srcDirs = ['src/main/java'] } googleplayS { assets.srcDirs = ['src/main/assets'] java.srcDirs = ['src/main/java'] } } testOptions { // will make tests run very slowly on the emulator/device + affects coverage # // execution 'ANDROIDX_TEST_ORCHESTRATOR' animationsDisabled true unitTests { includeAndroidResources = true returnDefaultValues = true all { maxHeapSize = "1024m" jacoco { includeNoLocationClasses = true excludes = ['jdk.internal.*'] } } } } buildFeatures { viewBinding = true } } dependencies { androidTestImplementation "androidx.arch.core:core-testing:2.1.0" androidTestImplementation 'androidx.room:room-testing:2.3.0' androidTestImplementation 'androidx.test:core:1.4.0-beta01' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test:rules:1.3.0' androidTestImplementation 'androidx.test:runner:1.3.0' androidTestImplementation 'io.mockk:mockk-android:1.11.0' annotationProcessor 'androidx.room:room-compiler:2.3.0' debugImplementation 'androidx.fragment:fragment-testing:1.3.4' debugImplementation 'androidx.test:core:1.4.0-beta01' debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7' implementation 'androidx.activity:activity:1.2.3' implementation 'androidx.fragment:fragment:1.3.4' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'androidx.core:core-ktx:1.5.0' fdroidSImplementation 'androidx.core:core-ktx:1.6.0-beta02' googleplaySImplementation 'androidx.core:core-ktx:1.6.0-beta02' implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'androidx.lifecycle:lifecycle-common-java8:2.3.1' implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1' implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.room:room-guava:2.3.0' implementation 'androidx.room:room-runtime:2.3.0' implementation 'androidx.room:room-rxjava2:2.3.0' implementation 'com.google.android.material:material:1.3.0' implementation 'com.jakewharton.rxbinding2:rxbinding:2.2.0' implementation 'com.jakewharton.timber:timber:4.7.1' implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation 'io.reactivex.rxjava2:rxjava:2.2.21' implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.5.10' implementation project(path: ':cloudLib') implementation project(path: ':utilsLib') testImplementation 'androidx.arch.core:core-testing:2.1.0' testImplementation 'androidx.room:room-testing:2.3.0' testImplementation 'androidx.test:core-ktx:1.3.0' testImplementation 'androidx.test.ext:junit:1.1.2' testImplementation 'androidx.test:rules:1.3.0' testImplementation 'com.google.guava:guava:30.1.1-jre' testImplementation 'io.mockk:mockk:1.11.0' testImplementation 'junit:junit:4.13.2' testImplementation 'org.robolectric:robolectric:4.5.1' } repositories { mavenCentral() } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/0000755000175000017500000000000014620351546023605 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/build.gradle0000644000175000017500000000054614620351225026063 0ustar00hanshans// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.2' classpath 'com.google.gms:google-services:3.0.0' } } allprojects { repositories { jcenter() } } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/gradle/0000755000175000017500000000000014620351546025043 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/gradle/wrapper/0000755000175000017500000000000014620351546026523 5ustar00hanshans././@PaxHeader0000000000000000000000000000021000000000000010206 xustar00114 path=fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/gradle/wrapper/gradle-wrapper.properties 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/gradle/wrapper/gradle-wrapper.proper0000644000175000017500000000034614620351225032665 0ustar00hanshans#Wed Mar 15 14:07:53 EET 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/localeapi/0000755000175000017500000000000014620351546025536 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/localeapi/build.gradle0000644000175000017500000000066114620351225030012 0ustar00hanshansapply plugin: 'com.android.library' android { compileSdkVersion 25 buildToolsVersion "25.0.3" defaultConfig { minSdkVersion 9 targetSdkVersion 17 } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } } dependencies { compile 'com.android.support:support-v4:25.1.0' } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/localeapi/src/0000755000175000017500000000000014620351546026325 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/localeapi/src/main/0000755000175000017500000000000014620351546027251 5ustar00hanshans././@PaxHeader0000000000000000000000000000020600000000000010213 xustar00112 path=fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/localeapi/src/main/AndroidManifest.xml 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/localeapi/src/main/AndroidManifest.x0000644000175000017500000000042114620351225032500 0ustar00hanshans ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/oneSheeld/0000755000175000017500000000000014620351546025513 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/oneSheeld/build.gradle0000644000175000017500000000776514620351225030003 0ustar00hanshansbuildscript { repositories { jcenter() maven { url 'https://maven.fabric.io/public' } } dependencies { classpath 'io.fabric.tools:gradle:1.+' } } apply plugin: 'com.android.application' apply plugin: 'io.fabric' repositories { jcenter() maven { url 'https://maven.fabric.io/public' } maven { url "https://jitpack.io" } } android { compileSdkVersion 25 buildToolsVersion "25.0.3" defaultConfig { applicationId "com.integreight.onesheeld" minSdkVersion 9 targetSdkVersion 25 versionCode 170521 versionName "1.9.0" archivesBaseName = "1Sheeld.v$versionName.$versionCode" buildConfigField "long", "TIMESTAMP", System.currentTimeMillis() + "L" } buildTypes.all { ext.enableCrashlytics = isCrashlyticsPropertiesAvailable() } buildTypes { debug { versionNameSuffix getWorkingBranchSuffix() minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } release { minifyEnabled true debuggable false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } packagingOptions { exclude 'META-INF/LICENSE' exclude 'META-INF/NOTICE' exclude 'META-INF/LICENSE.txt' exclude 'META-INF/NOTICE.txt' } lintOptions { abortOnError false } useLibrary 'org.apache.http.legacy' } dependencies { compile project(':localeapi') compile project(':pullToRefreshlibrary') compile project(':quickReturnHeader') compile project(':pagerIndicator') compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:support-v4:25.3.1' compile 'com.facebook.android:facebook-android-sdk:4.5.0' compile 'com.google.android.gms:play-services-analytics:10.0.1' compile 'com.google.android.gms:play-services-location:10.0.1' compile 'com.google.android.gms:play-services-auth:10.0.1' compile 'com.google.android.gms:play-services-vision:10.0.1' compile 'com.loopj.android:android-async-http:1.4.9' compile 'com.snappydb:snappydb-lib:0.5.0' compile 'com.esotericsoftware.kryo:kryo:2.24.0' compile 'com.github.hotchemi:android-rate:0.5.0' compile('com.crashlytics.sdk.android:crashlytics:2.6.8@aar') { transitive = true; } compile('com.google.android.gms:play-services-identity:10.0.1') { transitive = true; } compile('com.google.api-client:google-api-client-android:1.22.0') { exclude group: 'org.apache.httpcomponents' } compile('com.google.apis:google-api-services-gmail:v1-rev48-1.22.0') { exclude group: 'org.apache.httpcomponents' } compile 'org.twitter4j:twitter4j-core:4.0.4' compile 'org.twitter4j:twitter4j-async:4.0.4' compile 'org.twitter4j:twitter4j-stream:4.0.4' compile 'cz.msebera.android:httpclient:4.4.1.1' compile 'net.sf.supercsv:super-csv:2.4.0' compile 'com.github.amlcurran.showcaseview:library:5.4.3' compile 'com.github.emanzanoaxa:RippleEffect:52ea2a0ab6' compile 'com.drewnoakes:metadata-extractor:2.8.1' compile 'com.integreight.onesheeld:sdk:2.2.0' compile 'com.google.firebase:firebase-core:10.0.1' compile 'com.google.firebase:firebase-messaging:10.0.1' } def isCrashlyticsPropertiesAvailable() { return new File("./oneSheeld/fabric.properties").exists() } def getWorkingBranchSuffix() { def workingBranchSuffix = "" try { def workingBranch = "git --git-dir=${rootDir}/.git --work-tree=${rootDir} rev-parse --abbrev-ref HEAD".execute().text.trim() workingBranchSuffix = (workingBranch != "") ? " - branch:" + workingBranch : "" } catch (all) { } return workingBranchSuffix } def isGoogleServicesFileAvailable() { return new File("./oneSheeld/google-services.json").exists() } if (isGoogleServicesFileAvailable()) { apply plugin: 'com.google.gms.google-services' }././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/oneSheeld/src/0000755000175000017500000000000014620351546026302 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/oneSheeld/src/main/0000755000175000017500000000000014620351546027226 5ustar00hanshans././@PaxHeader0000000000000000000000000000020600000000000010213 xustar00112 path=fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/oneSheeld/src/main/AndroidManifest.xml 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/oneSheeld/src/main/AndroidManifest.x0000644000175000017500000003031314620351225032460 0ustar00hanshans ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/pagerIndicator/0000755000175000017500000000000014620351546026540 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/pagerIndicator/build.gradle0000644000175000017500000000066014620351225031013 0ustar00hanshansapply plugin: 'com.android.library' android { compileSdkVersion 25 buildToolsVersion "25.0.3" defaultConfig { minSdkVersion 9 targetSdkVersion 9 } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } } dependencies { compile 'com.android.support:support-v4:25.1.0' } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/pagerIndicator/src/0000755000175000017500000000000014620351546027327 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/pagerIndicator/src/main/0000755000175000017500000000000014620351546030253 5ustar00hanshans././@PaxHeader0000000000000000000000000000021300000000000010211 xustar00117 path=fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/pagerIndicator/src/main/AndroidManifest.xml 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/pagerIndicator/src/main/AndroidManif0000644000175000017500000000041014620351225032516 0ustar00hanshans ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/pullToRefreshlibrary/0000755000175000017500000000000014620351546027770 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/pullToRefreshlibrary/build.gradle0000644000175000017500000000057214620351225032245 0ustar00hanshansapply plugin: 'com.android.library' android { compileSdkVersion 25 buildToolsVersion "25.0.3" defaultConfig { minSdkVersion 9 targetSdkVersion 9 } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } } dependencies { }././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/pullToRefreshlibrary/src/0000755000175000017500000000000014620351546030557 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/pullToRefreshlibrary/src/main/0000755000175000017500000000000014620351546031503 5ustar00hanshans././@PaxHeader0000000000000000000000000000022100000000000010210 xustar00123 path=fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/pullToRefreshlibrary/src/main/AndroidManifest.xml 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/pullToRefreshlibrary/src/main/Androi0000644000175000017500000000045314620351225032636 0ustar00hanshans ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/quickReturnHeader/0000755000175000017500000000000014620351546027232 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/quickReturnHeader/build.gradle0000644000175000017500000000066114620351225031506 0ustar00hanshansapply plugin: 'com.android.library' android { compileSdkVersion 25 buildToolsVersion "25.0.3" defaultConfig { minSdkVersion 9 targetSdkVersion 17 } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } } dependencies { compile 'com.android.support:support-v4:25.1.0' } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/quickReturnHeader/src/0000755000175000017500000000000014620351546030021 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/quickReturnHeader/src/main/0000755000175000017500000000000014620351546030745 5ustar00hanshans././@PaxHeader0000000000000000000000000000021600000000000010214 xustar00120 path=fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/quickReturnHeader/src/main/AndroidManifest.xml 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/quickReturnHeader/src/main/AndroidMa0000644000175000017500000000050214620351225032515 0ustar00hanshans ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.integreight.onesheeld/settings.gradle0000644000175000017500000000020114620351225026610 0ustar00hanshansinclude ':pagerIndicator' include ':pullToRefreshlibrary' include ':quickReturnHeader' include ':localeapi' include ':oneSheeld' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.jens.automation2/0000755000175000017500000000000014620351546022527 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.jens.automation2/app/0000755000175000017500000000000014620351546023307 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.jens.automation2/app/build.gradle0000644000175000017500000000460714620351225025567 0ustar00hanshansplugins { id 'com.android.application' } android { compileSdkVersion 29 defaultConfig { applicationId "com.jens.automation2" minSdkVersion 16 compileSdkVersion 29 buildToolsVersion '29.0.2' useLibrary 'org.apache.http.legacy' versionCode 96 versionName "1.6.21" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } lintOptions { checkReleaseBuilds false abortOnError false } flavorDimensions "version" productFlavors { googlePlayFlavor { dimension "version" // applicationIdSuffix ".googlePlay" versionNameSuffix "-googlePlay" targetSdkVersion 29 } fdroidFlavor { dimension "version" // applicationIdSuffix ".fdroid" versionNameSuffix "-fdroid" targetSdkVersion 28 } apkFlavor { dimension "version" // applicationIdSuffix ".apk" versionNameSuffix "-apk" targetSdkVersion 28 } } } dependencies { googlePlayFlavorImplementation 'com.google.firebase:firebase-appindexing:19.2.0' googlePlayFlavorImplementation 'com.google.android.gms:play-services-location:17.1.0' apkFlavorImplementation 'com.google.firebase:firebase-appindexing:19.2.0' apkFlavorImplementation 'com.google.android.gms:play-services-location:17.1.0' implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'com.google.android.material:material:1.3.0' testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' }././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.jens.automation2/build.gradle0000644000175000017500000000416614620351225025007 0ustar00hanshansplugins { id 'com.android.application' } android { compileSdkVersion 29 defaultConfig { applicationId "com.jens.automation2" minSdkVersion 16 compileSdkVersion 29 buildToolsVersion '29.0.2' useLibrary 'org.apache.http.legacy' versionCode 105 versionName "1.6.34" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } lintOptions { checkReleaseBuilds false abortOnError false } flavorDimensions "version" productFlavors { googlePlayFlavor { dimension "version" // applicationIdSuffix ".googlePlay" versionNameSuffix "-googlePlay" targetSdkVersion 29 } fdroidFlavor { dimension "version" // applicationIdSuffix ".fdroid" versionNameSuffix "-fdroid" targetSdkVersion 28 } apkFlavor { dimension "version" // applicationIdSuffix ".apk" versionNameSuffix "-apk" targetSdkVersion 28 } } } dependencies { implementation 'com.linkedin.dexmaker:dexmaker:2.25.0' implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'com.google.android.material:material:1.3.0' testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.kunzisoft.testcase/0000755000175000017500000000000014620351546023175 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.kunzisoft.testcase/build.gradle0000644000175000017500000000575514620351225025462 0ustar00hanshansapply plugin: 'com.android.application' android { compileSdkVersion 27 defaultConfig { applicationId "com.kunzisoft.fdroidtest.applicationidsuffix" minSdkVersion 14 targetSdkVersion 27 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled = false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } dexOptions { } flavorDimensions "tier" productFlavors { libre { applicationIdSuffix = ".libre" versionNameSuffix "-libre" buildConfigField "boolean", "FULL_VERSION", "true" buildConfigField "boolean", "CLOSED_STORE", "false" // ApplicationId : com.kunzisoft.fdroidtest.applicationidsuffix.libre // Version code : 1 // Version name : 1.0-libre } pro { applicationIdSuffix = ".pro" versionCode 20180430 versionName "20180430-pro" buildConfigField "boolean", "FULL_VERSION", "true" buildConfigField "boolean", "CLOSED_STORE", "true" // ApplicationId : com.kunzisoft.fdroidtest.applicationidsuffix.pro // Version code : 20180430 // Version name : 20180430-pro } free { versionNameSuffix "-free" buildConfigField "boolean", "FULL_VERSION", "false" buildConfigField "boolean", "CLOSED_STORE", "true" // ApplicationId : com.kunzisoft.fdroidtest.applicationidsuffix // Version code : 1 // Version name : 1.0-free } underscore { applicationIdSuffix = ".underscore" versionCode 2018_04_30 versionName "20180430-underscore" buildConfigField "boolean", "FULL_VERSION", "true" buildConfigField "boolean", "CLOSED_STORE", "true" // ApplicationId : com.kunzisoft.fdroidtest.applicationidsuffix.underscore // Version code : 2018_04_30 // Version name : 20180430-underscore } underscore_first { applicationIdSuffix = ".underscore_first" versionCode _04_30 buildConfigField "boolean", "FULL_VERSION", "true" buildConfigField "boolean", "CLOSED_STORE", "true" // ApplicationId : com.kunzisoft.fdroidtest.applicationidsuffix.underscore_first // Version code : 1 // Version name : 1.0 } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support.constraint:constraint-layout:1.1.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/0000755000175000017500000000000014620351546022611 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/build.gradle0000644000175000017500000002110114620351225025055 0ustar00hanshans// Gradle build file // // This project was started in Eclipse and later moved to Android Studio. In the transition, both IDEs were supported. // Due to this, the files layout is not the usual in new projects created with Android Studio / gradle. This file // merges declarations usually split in two separates build.gradle file, one for global settings of the project in // its root folder, another one for the app module in subfolder of root. buildscript { repositories { jcenter() maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } google() } dependencies { classpath 'com.android.tools.build:gradle:3.0.1' classpath 'com.google.gms:google-services:3.0.0' } } apply plugin: 'com.android.application' apply plugin: 'checkstyle' apply plugin: 'pmd' apply plugin: 'findbugs' configurations.all { // check for updates every build resolutionStrategy.cacheChangingModulesFor 0, 'seconds' } ext { supportLibraryVersion = '26.1.0' googleLibraryVersion = '11.2.2' travisBuild = System.getenv("TRAVIS") == "true" // allows for -Dpre-dex=false to be set preDexEnabled = "true".equals(System.getProperty("pre-dex", "true")) } repositories { jcenter() maven { url "https://jitpack.io" } maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } google() flatDir { dirs 'libs' } } android { lintOptions { abortOnError false htmlReport true htmlOutput file("$project.buildDir/reports/lint/lint.html") disable 'MissingTranslation' } dexOptions { javaMaxHeapSize "4g" } compileSdkVersion 26 buildToolsVersion '26.0.2' defaultConfig { testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" // arguments to be passed to functional tests testInstrumentationRunnerArgument "TEST_USER", "\"$System.env.OCTEST_APP_USERNAME\"" testInstrumentationRunnerArgument "TEST_PASSWORD", "\"$System.env.OCTEST_APP_PASSWORD\"" testInstrumentationRunnerArgument "TEST_SERVER_URL", "\"$System.env.OCTEST_SERVER_BASE_URL\"" multiDexEnabled true versionCode = 20000099 versionName = "2.0.0" // adapt structure from Eclipse to Gradle/Android Studio expectations; // see http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Configuring-the-Structure flavorDimensions "default" productFlavors { // used for f-droid generic { applicationId 'com.nextcloud.client' dimension "default" } gplay { applicationId 'com.nextcloud.client' dimension "default" } modified { // structure is: // domain tld // domain name // .client applicationId 'com.custom.client' dimension "default" } versionDev { applicationId "com.nextcloud.android.beta" dimension "default" versionCode 20171223 versionName "20171223" } } configurations { modifiedCompile } } // adapt structure from Eclipse to Gradle/Android Studio expectations; // see http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Configuring-the-Structure dexOptions { // Skip pre-dexing when running on Travis CI or when disabled via -Dpre-dex=false. preDexLibraries = preDexEnabled && !travisBuild } packagingOptions { exclude 'META-INF/LICENSE.txt' exclude 'META-INF/LICENSE' } task checkstyle(type: Checkstyle) { configFile = file("${rootProject.projectDir}/checkstyle.xml") configProperties.checkstyleSuppressionsPath = file("${project.rootDir}/config/quality/checkstyle/suppressions.xml").absolutePath source 'src' include '**/*.java' exclude '**/gen/**' classpath = files() } task pmd(type: Pmd) { ruleSetFiles = files("${project.rootDir}/pmd-ruleset.xml") ignoreFailures = false ruleSets = [] source 'src' include '**/*.java' exclude '**/gen/**' reports { xml.enabled = false html.enabled = true xml { destination = file("$project.buildDir/reports/pmd/pmd.xml") } html { destination = file("$project.buildDir/reports/pmd/pmd.html") } } } task findbugs(type: FindBugs) { ignoreFailures = false effort = "max" reportLevel = "high" classes = files("$project.buildDir/intermediates/classes") excludeFilter = new File("${project.rootDir}/findbugs-filter.xml") source 'src' include '**/*.java' exclude '**/gen/**' reports { xml.enabled = false html.enabled = true html { destination = file("$project.buildDir/reports/findbugs/findbugs.html") } } classpath = files() } check.dependsOn 'checkstyle', 'findbugs', 'pmd', 'lint' compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { /// dependencies for app building implementation 'com.android.support:multidex:1.0.2' implementation 'com.github.nextcloud:android-library:1.0.33' versionDevImplementation 'com.github.nextcloud:android-library:master-SNAPSHOT' // use always latest master implementation "com.android.support:support-v4:${supportLibraryVersion}" implementation "com.android.support:design:${supportLibraryVersion}" implementation 'com.jakewharton:disklrucache:2.0.2' implementation "com.android.support:appcompat-v7:${supportLibraryVersion}" implementation "com.android.support:cardview-v7:${supportLibraryVersion}" implementation "com.android.support:exifinterface:${supportLibraryVersion}" implementation 'com.github.tobiasKaminsky:android-floating-action-button:1.10.2' implementation 'com.github.albfernandez:juniversalchardet:v2.0.0' implementation 'com.google.code.findbugs:annotations:2.0.1' implementation 'commons-io:commons-io:2.5' implementation 'com.github.evernote:android-job:v1.2.0' implementation 'com.jakewharton:butterknife:8.5.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1' implementation 'org.greenrobot:eventbus:3.0.0' implementation 'com.googlecode.ez-vcard:ez-vcard:0.10.2' implementation 'org.lukhnos:nnio:0.2' // uncomment for gplay, modified // implementation "com.google.firebase:firebase-messaging:${googleLibraryVersion}" // implementation "com.google.android.gms:play-services-base:${googleLibraryVersion}" // implementation "com.google.android.gms:play-services-gcm:${googleLibraryVersion}" // implementation "com.google.firebase:firebase-core:${googleLibraryVersion}" implementation 'org.parceler:parceler-api:1.1.6' annotationProcessor 'org.parceler:parceler:1.1.6' implementation 'com.github.bumptech.glide:glide:3.7.0' implementation 'com.caverock:androidsvg:1.2.1' implementation "com.android.support:support-annotations:${supportLibraryVersion}" /// dependencies for local unit tests testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:1.10.19' /// dependencies for instrumented tests // JUnit4 Rules androidTestImplementation 'com.android.support.test:rules:1.0.1' // Android JUnit Runner androidTestImplementation 'com.android.support.test:runner:1.0.1' // Espresso core androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' // UIAutomator - for cross-app UI tests, and to grant screen is turned on in Espresso tests //androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' // fix conflict in dependencies; see http://g.co/androidstudio/app-test-app-conflict for details //androidTestImplementation "com.android.support:support-annotations:${supportLibraryVersion}" implementation 'org.jetbrains:annotations:15.0' } configurations.all { resolutionStrategy.cacheChangingModulesFor 0, 'seconds' } tasks.withType(Test) { /// increased logging for tests testLogging { events "passed", "skipped", "failed" } } // uncomment for gplay, modified (must be at the bottom) //apply plugin: 'com.google.gms.google-services' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/src/0000755000175000017500000000000014620351546023400 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/src/generic/0000755000175000017500000000000014620351546025014 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/src/generic/fastlane/0000755000175000017500000000000014620351546026611 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/src/generic/fastlane/metadata/0000755000175000017500000000000014620351546030371 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/src/generic/fastlane/metadata/android/0000755000175000017500000000000014620351546032011 5ustar00hanshans././@PaxHeader0000000000000000000000000000021500000000000010213 xustar00113 path=fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/src/generic/fastlane/metadata/android/en-US/ 28 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/src/generic/fastlane/metadata/android/en-0000755000175000017500000000000014620351546032411 5ustar00hanshans././@PaxHeader0000000000000000000000000000023300000000000010213 xustar00133 path=fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/src/generic/fastlane/metadata/android/en-US/full_description.txt 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/src/generic/fastlane/metadata/android/en-0000644000175000017500000000206114620351225032404 0ustar00hanshansThe copyleft libre software Nextcloud Android app, gives you access to all the files in your Nextcloud.\n\nFeatures:\n* Easy, modern interface, suited to the theme of your server\n* Upload files to your Nextcloud server\n* Share them with others\n* Keep your favorite files and folders synced\n* Search across all folders on your server\n* Auto Upload for photos and videos taken by your device\n* Keep up to date with notifications\n* Multi-account support\n* Secure access to your data with fingerprint or PIN\n* Integration with DAVdroid for easy setup of calendar & Contacts synchronization\n\nPlease report all issues at https://github.com/nextcloud/android/issues and discuss this app at https://help.nextcloud.com/c/clients/android\n\nNew to Nextcloud? Nextcloud is a private file sync & share and communication server. It is libre software, and you can host it yourself or pay a company to do it for you. That way, you are in control of your photos, your calendar and contact data, your documents and everything else.\n\nCheck out Nextcloud at https://nextcloud.com././@PaxHeader0000000000000000000000000000023400000000000010214 xustar00134 path=fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/src/generic/fastlane/metadata/android/en-US/short_description.txt 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/src/generic/fastlane/metadata/android/en-0000644000175000017500000000011614620351225032403 0ustar00hanshansThe Nextcloud Android app gives you access to all your files in your Nextcloud././@PaxHeader0000000000000000000000000000022000000000000010207 xustar00122 path=fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/src/generic/fastlane/metadata/android/en-US/title.txt 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/src/generic/fastlane/metadata/android/en-0000644000175000017500000000001114620351225032375 0ustar00hanshansNextcloud././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/src/versionDev/0000755000175000017500000000000014620351546025524 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/src/versionDev/fastlane/0000755000175000017500000000000014620351546027321 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata/0000755000175000017500000000000014620351546031101 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata/android/0000755000175000017500000000000014620351546032521 5ustar00hanshans././@PaxHeader0000000000000000000000000000022000000000000010207 xustar00116 path=fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata/android/en-US/ 28 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata/android/0000755000175000017500000000000014620351546032521 5ustar00hanshans././@PaxHeader0000000000000000000000000000023600000000000010216 xustar00136 path=fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata/android/en-US/full_description.txt 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata/android/0000644000175000017500000000111214620351225032510 0ustar00hanshansThe Open Source Nextcloud Android app allows you to access all your files on your Nextcloud.\nThis is a dev version of the official Nextcloud app and includes brand-new, untested features which might lead to instabilities and data loss. The app is designed for users willing to test the new features and to report bugs if they occur. Do not use it for your productive work!\n\nThe dev version can be installed alongside the official Nextcloud app which is available at F-Droid, too. Once a day it is checked if the source code was updated, so there can be longer pauses between builds. ././@PaxHeader0000000000000000000000000000023700000000000010217 xustar00137 path=fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata/android/en-US/short_description.txt 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata/android/0000644000175000017500000000011714620351225032514 0ustar00hanshansThe Nextcloud Dev app is a development snapshot and can be installed parallel. ././@PaxHeader0000000000000000000000000000022300000000000010212 xustar00125 path=fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata/android/en-US/title.txt 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata/android/0000644000175000017500000000001514620351225032511 0ustar00hanshansNextcloud Dev././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/0000755000175000017500000000000014620351546023366 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/0000755000175000017500000000000014620351546024155 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/generic/0000755000175000017500000000000014620351546025571 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/generic/fastlane/0000755000175000017500000000000014620351546027366 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/generic/fastlane/metadata/0000755000175000017500000000000014620351546031146 5ustar00hanshans././@PaxHeader0000000000000000000000000000021300000000000010211 xustar00111 path=fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/generic/fastlane/metadata/android/ 28 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/generic/fastlane/metadata/android0000755000175000017500000000000014620351546032507 5ustar00hanshans././@PaxHeader0000000000000000000000000000022100000000000010210 xustar00117 path=fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/generic/fastlane/metadata/android/en-US/ 28 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/generic/fastlane/metadata/android0000755000175000017500000000000014620351546032507 5ustar00hanshans././@PaxHeader0000000000000000000000000000023700000000000010217 xustar00137 path=fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/generic/fastlane/metadata/android/en-US/full_description.txt 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/generic/fastlane/metadata/android0000644000175000017500000000206114620351225032502 0ustar00hanshansThe copyleft libre software Nextcloud Android app, gives you access to all the files in your Nextcloud.\n\nFeatures:\n* Easy, modern interface, suited to the theme of your server\n* Upload files to your Nextcloud server\n* Share them with others\n* Keep your favorite files and folders synced\n* Search across all folders on your server\n* Auto Upload for photos and videos taken by your device\n* Keep up to date with notifications\n* Multi-account support\n* Secure access to your data with fingerprint or PIN\n* Integration with DAVdroid for easy setup of calendar & Contacts synchronization\n\nPlease report all issues at https://github.com/nextcloud/android/issues and discuss this app at https://help.nextcloud.com/c/clients/android\n\nNew to Nextcloud? Nextcloud is a private file sync & share and communication server. It is libre software, and you can host it yourself or pay a company to do it for you. That way, you are in control of your photos, your calendar and contact data, your documents and everything else.\n\nCheck out Nextcloud at https://nextcloud.com././@PaxHeader0000000000000000000000000000024000000000000010211 xustar00138 path=fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/generic/fastlane/metadata/android/en-US/short_description.txt 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/generic/fastlane/metadata/android0000644000175000017500000000011614620351225032501 0ustar00hanshansThe Nextcloud Android app gives you access to all your files in your Nextcloud././@PaxHeader0000000000000000000000000000022400000000000010213 xustar00126 path=fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/generic/fastlane/metadata/android/en-US/title.txt 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/generic/fastlane/metadata/android0000644000175000017500000000001114620351225032473 0ustar00hanshansNextcloud././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/versionDev/0000755000175000017500000000000014620351546026301 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/versionDev/fastlane/0000755000175000017500000000000014620351546030076 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/versionDev/fastlane/metadata/0000755000175000017500000000000014620351546031656 5ustar00hanshans././@PaxHeader0000000000000000000000000000021600000000000010214 xustar00114 path=fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/versionDev/fastlane/metadata/android/ 28 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/versionDev/fastlane/metadata/andr0000755000175000017500000000000014620351546032523 5ustar00hanshans././@PaxHeader0000000000000000000000000000022400000000000010213 xustar00120 path=fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/versionDev/fastlane/metadata/android/en-US/ 28 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/versionDev/fastlane/metadata/andr0000755000175000017500000000000014620351546032523 5ustar00hanshans././@PaxHeader0000000000000000000000000000024200000000000010213 xustar00140 path=fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/versionDev/fastlane/metadata/android/en-US/full_description.txt 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/versionDev/fastlane/metadata/andr0000644000175000017500000000111214620351225032512 0ustar00hanshansThe Open Source Nextcloud Android app allows you to access all your files on your Nextcloud.\nThis is a dev version of the official Nextcloud app and includes brand-new, untested features which might lead to instabilities and data loss. The app is designed for users willing to test the new features and to report bugs if they occur. Do not use it for your productive work!\n\nThe dev version can be installed alongside the official Nextcloud app which is available at F-Droid, too. Once a day it is checked if the source code was updated, so there can be longer pauses between builds. ././@PaxHeader0000000000000000000000000000024300000000000010214 xustar00141 path=fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/versionDev/fastlane/metadata/android/en-US/short_description.txt 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/versionDev/fastlane/metadata/andr0000644000175000017500000000011714620351225032516 0ustar00hanshansThe Nextcloud Dev app is a development snapshot and can be installed parallel. ././@PaxHeader0000000000000000000000000000022700000000000010216 xustar00129 path=fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/versionDev/fastlane/metadata/android/en-US/title.txt 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.nextcloud.client.dev/src/versionDev/fastlane/metadata/andr0000644000175000017500000000001514620351225032513 0ustar00hanshansNextcloud Dev././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.seafile.seadroid2/0000755000175000017500000000000014620351546022612 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.seafile.seadroid2/app/0000755000175000017500000000000014620351546023372 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.seafile.seadroid2/app/build.gradle0000644000175000017500000001207214620351225025645 0ustar00hanshansapply plugin: 'com.android.application' android { compileSdkVersion rootProject.ext.compileSdkVersion defaultConfig { applicationId 'com.seafile.seadroid2' minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 93 versionName "2.2.18" multiDexEnabled true resValue "string", "authorities", applicationId + '.cameraupload.provider' resValue "string", "account_type", "com.seafile.seadroid2.account.api2" buildConfigField "String", "ACCOUNT_TYPE", '"com.seafile.seadroid2.account.api2"' ndk { abiFilters 'armeabi', 'armeabi-v7a', 'x86' } } lintOptions { abortOnError false disable 'MissingTranslation' } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } signingConfigs { debug { // def props = new Properties() // props.load(new FileInputStream(project.file("debugkey.properties"))) // storeFile project.file(props.keyStore) // storePassword props.keyStorePassword // keyAlias props.keyAlias // keyPassword props.keyAliasPassword } release { // Signing code for manual signing // storeFile file(System.console().readLine("\n\$ Enter keystore path: ")) // storePassword System.console().readPassword("\n\$ Enter keystore password: ").toString() // keyAlias System.console().readLine("\n\$ Enter key alias: ") // keyPassword System.console().readPassword("\n\$ Enter key password: ").toString() def props = new Properties() props.load(new FileInputStream(project.file("key.properties"))) storeFile project.file(props.keyStore) storePassword props.keyStorePassword keyAlias props.keyAlias keyPassword props.keyAliasPassword } } buildTypes { debug { debuggable true applicationIdSuffix ".debug" resValue "string", "authorities", defaultConfig.applicationId + '.debug.cameraupload.provider' resValue "string", "account_type", "com.seafile.seadroid2.debug.account.api2" buildConfigField "String", "ACCOUNT_TYPE", '"com.seafile.seadroid2.debug.account.api2"' signingConfig signingConfigs.debug minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' applicationVariants.all { variant -> variant.outputs.all { output -> if (output.outputFile != null && output.outputFile.name.endsWith('.apk')) { if (variant.name == "debug") outputFileName = "seafile-debug-" + defaultConfig.versionName + ".apk" } } } } release { signingConfig signingConfigs.release minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' applicationVariants.all { variant -> variant.outputs.all { output -> if (output.outputFile != null && output.outputFile.name.endsWith('.apk')) { if (variant.name == "release") { outputFileName = "seafile-" + defaultConfig.versionName + ".apk" } } } } } } allprojects { repositories { maven { url 'https://jitpack.io' } } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}" implementation "com.android.support:design:${rootProject.ext.supportLibVersion}" implementation 'com.github.JakeWharton:ViewPagerIndicator:2.4.1' implementation 'com.github.kevinsawicki:http-request:6.0' implementation 'commons-io:commons-io:2.4' implementation 'com.google.guava:guava:18.0' implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.3' implementation 'com.cocosw:bottomsheet:1.3.1' implementation 'com.commit451:PhotoView:1.2.4' implementation 'com.joanzapata.iconify:android-iconify-material-community:2.2.1' testImplementation 'junit:junit:4.12' testImplementation 'org.robolectric:robolectric:3.0' implementation 'com.madgag.spongycastle:core:1.54.0.0' implementation 'com.madgag.spongycastle:prov:1.54.0.0' implementation 'com.shuyu:gsyVideoPlayer-java:2.1.0' implementation 'com.shuyu:gsyVideoPlayer-ex_so:2.1.0' implementation 'com.squareup.okhttp3:okhttp:3.9.1' implementation 'com.yydcdut:markdown-processor:0.1.3' implementation 'ren.qinc.edit:lib:0.0.5'//editor undo redo implementation 'com.github.tiagohm.MarkdownView:library:0.19.0' } } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.ubergeek42.WeechatAndroid/0000755000175000017500000000000014620351546024146 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.ubergeek42.WeechatAndroid/app/0000755000175000017500000000000014620351546024726 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.ubergeek42.WeechatAndroid/app/build.gradle.kts0000644000175000017500000002645614620351225030014 0ustar00hanshansimport com.android.build.api.transform.* import com.android.build.api.variant.VariantInfo import com.android.utils.FileUtils import org.gradle.internal.os.OperatingSystem import org.aspectj.bridge.IMessage import org.aspectj.bridge.MessageHandler import org.aspectj.tools.ajc.Main plugins { id("com.android.application") kotlin("android") kotlin("kapt") } dependencies { implementation(project(":cats")) implementation(project(":relay")) implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.0") // these two are required for logging within the relay module. todo remove? implementation("org.slf4j:slf4j-api:1.7.36") implementation("com.noveogroup.android:android-logger:1.3.6") implementation("androidx.core:core-ktx:1.8.0") implementation("androidx.legacy:legacy-support-v4:1.0.0") implementation("androidx.annotation:annotation:1.3.0") // For @Nullable/@NonNull implementation("androidx.appcompat:appcompat:1.4.2") implementation("androidx.emoji2:emoji2:1.1.0") implementation("androidx.preference:preference-ktx:1.2.0") // preference fragment & al implementation("androidx.legacy:legacy-preference-v14:1.0.0") // styling for the fragment implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.4.1") implementation("androidx.lifecycle:lifecycle-common-java8:2.4.1") implementation("androidx.sharetarget:sharetarget:1.2.0-rc01") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.2") implementation("com.github.bumptech.glide:glide:4.13.2") kapt("com.github.bumptech.glide:compiler:4.13.2") implementation("com.squareup.okhttp3:okhttp:4.10.0") val roomVersion = "2.4.2" implementation("androidx.room:room-runtime:$roomVersion") annotationProcessor("androidx.room:room-compiler:$roomVersion") kapt("androidx.room:room-compiler:$roomVersion") implementation("org.yaml:snakeyaml:1.30") implementation("org.bouncycastle:bcpkix-jdk15on:1.70") // needed for thread-safe date formatting as SimpleDateFormat isn"t thread-safe // the alternatives, including apache commons and threetenabp, seem to be much slower // todo perhaps replace with core library desugaring, if it"s fast implementation("net.danlew:android.joda:2.10.14") implementation("org.greenrobot:eventbus:3.3.1") debugImplementation("org.aspectj:aspectjrt:1.9.9.1") debugImplementation("com.squareup.leakcanary:leakcanary-android:2.9.1") testImplementation("org.junit.jupiter:junit-jupiter:5.8.2") testImplementation("org.junit.jupiter:junit-jupiter-params:5.8.2") } tasks.withType { options.encoding = "UTF-8" } android { compileSdk = 31 defaultConfig { versionCode = 1_08_01 versionName = "1.8.1" minSdk = 21 targetSdk = 31 buildConfigField("String", "VERSION_BANNER", "\"" + versionBanner() + "\"") vectorDrawables.useSupportLibrary = true javaCompileOptions { annotationProcessorOptions { arguments["room.schemaLocation"] = "$projectDir/schemas" arguments["room.incremental"] = "true" } } kotlinOptions { freeCompilerArgs = listOf( "-language-version", "1.7", "-api-version", "1.7") jvmTarget = "11" } } signingConfigs { create("dev") { try { storeFile = file(project.properties["devStorefile"] as String) storePassword = project.properties["devStorePassword"] as String keyAlias = project.properties["devKeyAlias"] as String keyPassword = project.properties["devKeyPassword"] as String } catch (e: Exception) { project.logger.warn("WARNING: Set the values devStorefile, devStorePassword, " + "devKeyAlias, and devKeyPassword " + "in ~/.gradle/gradle.properties to sign the release.") } } } buildTypes { getByName("debug") { applicationIdSuffix = ".debug" versionNameSuffix = "-debug" } getByName("release") { isMinifyEnabled = true proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro", "../cats/proguard-rules.pro") // kotlinx-coroutines-core debug-only artifact // see https://github.com/Kotlin/kotlinx.coroutines#avoiding-including-the-debug-infrastructure-in-the-resulting-apk packagingOptions { resources.excludes += "DebugProbesKt.bin" } } create("dev") { initWith(getByName("release")) matchingFallbacks += listOf("release") applicationIdSuffix = ".dev" versionNameSuffix = "-dev" signingConfig = signingConfigs.getByName("dev") } compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } } buildFeatures { viewBinding = true } } fun versionBanner(): String { val os = org.apache.commons.io.output.ByteArrayOutputStream() project.exec { commandLine = "git describe --long".split(" ") standardOutput = os } return String(os.toByteArray()).trim() } //////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////// cats //////////////////////////////////////////////////////////////////////////////////////////////////// // ajc gets hold of some files such as R.jar, and on Windows it leads to errors such as: // The process cannot access the file because it is being used by another process // to avoid these, weave in a process, which `javaexec` will helpfully launch for us. fun weave(classPath: Iterable, aspectPath: Iterable, input: Iterable, output: File) { val runInAProcess = OperatingSystem.current().isWindows val bootClassPath = android.bootClasspath println(if (runInAProcess) ":: weaving in a process..." else ":: weaving...") println(":: boot class path: $bootClassPath") println(":: class path: $classPath") println(":: aspect path: $aspectPath") println(":: input: $input") println(":: output: $output") val arguments = listOf("-showWeaveInfo", "-1.8", "-preserveAllLocals", "-bootclasspath", bootClassPath.asArgument, "-classpath", classPath.asArgument, "-aspectpath", aspectPath.asArgument, "-inpath", input.asArgument, "-d", output.absolutePath) if (runInAProcess) { javaexec { classpath = weaving main = "org.aspectj.tools.ajc.Main" args = arguments } } else { val handler = MessageHandler(true) Main().run(arguments.toTypedArray(), handler) val log = project.logger for (message in handler.getMessages(null, true)) { when (message.kind) { IMessage.DEBUG -> log.debug("DEBUG " + message.message, message.thrown) IMessage.INFO -> log.info("INFO: " + message.message, message.thrown) IMessage.WARNING -> log.warn("WARN: " + message.message, message.thrown) IMessage.FAIL, IMessage.ERROR, IMessage.ABORT -> log.error("ERROR: " + message.message, message.thrown) } } } } // the only purpose of the following is to get a hold of aspectjtools jar // this jar is already on build script classpath, but that classpath is impossible to get // see https://discuss.gradle.org/t/how-do-i-determine-buildscript-classpath/37973/3 val weaving: Configuration by configurations.creating dependencies { weaving("org.aspectj:aspectjtools:1.9.9.1") } // historical note: the problem with weaving Kotlin and Java in-place is that: // * Java is compiled by task compileDebugJavaWithJavac // * gradle can run either one of these tasks, or both of them // * compileDebugJavaWithJavac depends on compileDebugKotlin // * weaving Kotlin requires Java classes // // a transformation is a poorly advertised feature that works on merged code, and also has its own // inputs and outputs, so this fixes all of our problems... class TransformCats : Transform() { override fun getName(): String = TransformCats::class.simpleName!! override fun getInputTypes() = setOf(QualifiedContent.DefaultContentType.CLASSES) // only look for annotations in app classes // transformation will consume these and put woven classes in the output dir override fun getScopes() = mutableSetOf(QualifiedContent.Scope.PROJECT) // but also have the rest on our class path // these will not be touched by the transformation override fun getReferencedScopes() = mutableSetOf(QualifiedContent.Scope.SUB_PROJECTS, QualifiedContent.Scope.EXTERNAL_LIBRARIES) override fun isIncremental() = false // only run on debug builds override fun applyToVariant(variant: VariantInfo) = variant.isDebuggable override fun transform(invocation: TransformInvocation) { if (!invocation.isIncremental) { invocation.outputProvider.deleteAll() } val output = invocation.outputProvider.getContentLocation(name, outputTypes, scopes, Format.DIRECTORY) if (output.isDirectory) FileUtils.deleteDirectoryContents(output) FileUtils.mkdirs(output) val input = mutableListOf() val classPath = mutableListOf() val aspectPath = mutableListOf() invocation.inputs.forEach { source -> source.directoryInputs.forEach { dir -> input.add(dir.file) classPath.add(dir.file) } source.jarInputs.forEach { jar -> input.add(jar.file) classPath.add(jar.file) } } invocation.referencedInputs.forEach { source -> source.directoryInputs.forEach { dir -> classPath.add(dir.file) } source.jarInputs.forEach { jar -> classPath.add(jar.file) // this used to read `if (jar.name == ":cats") ...`, // but with android gradle plugin 4.2.0 jar names contain garbage // this is a very simple but a bit fragile workaround. todo improve if (jar.file.directoriesInsideRootProject().contains("cats")) { aspectPath.add(jar.file) } } } weave(classPath, aspectPath, input, output) } } android.registerTransform(TransformCats()) val Iterable.asArgument get() = joinToString(File.pathSeparator) fun File.directoriesInsideRootProject() = sequence { var file = this@directoriesInsideRootProject while (true) { yield(file.name) file = file.parentFile ?: break if (file == rootProject.projectDir) break } } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.ubergeek42.WeechatAndroid/app/src/0000755000175000017500000000000014620351546025515 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.ubergeek42.WeechatAndroid/app/src/main/0000755000175000017500000000000014620351546026441 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/com.ubergeek42.WeechatAndroid/app/src/main/res/0000755000175000017500000000000014620351546027232 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/com.ubergeek42.WeechatAndroid/app/src/main/res/values/0000755000175000017500000000000014620351546030531 5ustar00hanshans././@PaxHeader0000000000000000000000000000020700000000000010214 xustar00113 path=fdroidserver-2.3a1/tests/source-files/com.ubergeek42.WeechatAndroid/app/src/main/res/values/strings.xml 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/com.ubergeek42.WeechatAndroid/app/src/main/res/values/strings.0000644000175000017500000014273314620351225032227 0ustar00hanshans ]> Weechat-Android com.ubergeek42.WeechatAndroid Relay host is not set Relay password is not set SSH host is not set SSH password is not set SSH private key is not set Server unexpectedly closed connection while connecting. Wrong password or connection type? Could not resolve address %s Error: %s Buffer lost some hot messages because of new lines There are no hot buffers for now Not connected Buffer list empty Activity not found for intent %s Upload file Tab Upload Send Cancel search Search up Search down More Go to bottom Fetch more lines Fetching lines… search filter Open drawer Close drawer Search Users Hotlist Show hot message Close Connect Disconnect Stop connecting Settings Filter lines Dark theme Attach image Attach media Attach file Attach image Attach media Take photo Debug Sync hotlist Die Prefix Message Both Regex Case sensitive With timestamps Without timestamps Messages only Connection Status Hotlist Waiting for network Will connect in %d seconds… Connecting now… Connected to %s %d message %d messages  in %d buffer  in %d buffers New message in %2$s %1$d new messages in %2$s (user unknown) (users unknown) (message not fetched) (message not fetched) (%d messages not fetched) Me Reply %1$s (%2$s) %1$d user %1$d users %s (away) Copy Select text Paste Permission required To take photos, app needs write access to public storage OK Issued to:
%1$s

Issued by:
%2$s

Validity period:
Issued on: %3$s
Expires on: %4$s

SHA-256 fingerprint:
%5$s ]]> Unknown Reject Back to safety Invalid hostname %1$s but the certificate is only valid for the following hosts: %2$s ]]> Note that Android P and beyond does not fall back to Common Name (CN) validation. Subject Alternative Name (SAN) must be used instead.
Learn more ]]>       %s ]]>       (none) ]]> Certificate expired This certificate is no longer valid. Please make sure that the device date is correct. Certificate not yet valid This certificate will be valid in the future. Please make sure that the device date is correct. Untrusted certificate This certificate isn’t trusted by Android, but you can still connect. The app will remember the selected certificate and trust it and any certificates signed by it. Accept selected Certificate not pinned This server is trusted by Android, but a setting requires you to confirm that you trust it as well. The app will remember the selected certificate and trust it and any certificates signed by it. Pin selected Unknown Unknown server %1$s
has never been encountered.

%2$s key SHA256 fingerprint:
%3$s ]]> Accept server key Reject Server changed key ⚠ Warning:
it’s possible that someone is trying to hijack this connection!

Server at %1$s is known, but its key doesn’t match the key you previously accepted.

%2$s key SHA256 fingerprint:
%3$s

If you want to continue, please clear known hosts in preferences. ]]> Clear Paste Choose file %1$s (%2$s) set not set Clipboard is empty password Save Default Discard changes? Cancel Discard None Unknown Invalid number No spaces allowed in hostnames Connection Connection type Plain connection WeeChat SSL SSH tunnel WebSocket WebSocket (SSL) WebSocket path SSL settings Require certificate pins Prompt to confirm that you trust the server, even if the system trusts it Clear certificates No trusted certificates One trusted certificate One trusted certificate %s trusted certificates Clear certificates? Clear Cancel Certificates cleared Could not clear certificates Client certificate PKCS #12 file containing private key and client certificate Certificate was stored inside security hardware Certificate was stored inside software key store Certificate was stored inside key store Certificate forgotten Server is asking for a client certificate but none is set. Wanted: %1$s certificate issued by: %2$s Server is asking for a client certificate but the one we have doesn’t fit. Wanted: %1$s certificate issued by: %2$s SSH tunnel settings SSH host SSH port SSH username Authentication method Password Key Password Private key Ed25519, ECDSA, RSA or DSA key %s key was stored inside security hardware %s key was stored inside software key store %s key was stored inside key store %1$s key was stored inside the app. \n \nThe key couldn’t be stored in the key store: %2$s Key forgotten Clear known hosts No entries %s entry %s entries Clear known hosts? Cancel Clear Known hosts cleared Failed to authenticate with password Failed to authenticate with key Relay Relay host Relay port Relay password Handshake settings Handshake Compatibility Modern & fast Modern In compatibility mode, the password isn’t hashed. This is the fastest method. This method is required if using WeeChat < 2.9, but works on the later versions as well.

Modern & fast handshake limits algorithms to the SHA-2 family.

Modern handshake also includes PBKDF2. These algorithms can be very slow, depending on the number of iterations.

Password hashing offers little to no benefit if the connection is encrypted. Learn more ]]> Synchronization settings Only sync open buffers Can significantly reduce traffic and battery usage, but hotlist updates will only happen once 5 minutes Sync buffer read status Mark buffers as read in WeeChat when you read them in this app Number of lines to fetch The number of lines requested when opening a buffer or when you press the “Load more lines” button (%s) Number of lines to fetch for search When starting a new search, unless already fetched, the app will request up to this many lines from WeeChat (%s) These settings take effect after reconnection. Note that due to filtering the number of lines actually shown might be less than the number of loaded lines. Also note that due to WeeChat’s limitations the app has to re-fetch all lines every times it requests more lines. Miscellaneous Reconnect on connection loss Connect on system boot Ping settings Enable ping Periodically check that the relay connection is still alive when idle Idle time Number of seconds to wait before sending a ping when the connection is idle (%s) Ping timeout Number of seconds to wait before closing an unresponsive connection (%s) Buffer list Sort buffer list Sort by number of highlights/private messages/unread messages Hide non-conversation buffers E.g. server buffers and plugin buffers Hide hidden buffers Hide buffers hidden with /buffer hide Show buffer filter Filter matches full buffer names and reveals matching hidden buffers System gesture exclusion zone On Android Q, the left side of the screen is reserved for the back gesture. Enable this to have a small area in the bottom of the screen where you can open the buffer list normally. Look & feel Text size Hide action bar Hide action bar when the keyboard is open or when scrolling up Filter messages Hide messages filtered by WeeChat (e.g. irc_smart_filter) Prefix alignment Left aligned Right aligned Timestamp aligned No alignment Maximum width of prefix In terms of letters; longer nicknames will be cut (%s) Enclose nicknames Enclose the nicknames in < and > Timestamp format %s (default: HH:mm:ss) Invalid timestamp format Buffer font Default Import Imported: %s Non-monospace fonts will not work well with alignment. Import fonts from the dialog, or put them into one of the following locations:%1$s Theme @string/pref__theme__theme__system Dark Light Set by battery saver Theme switch Show theme switch in the menu Light color scheme Dark color scheme Error loading color scheme %s Not set Error Import Imported: %s Learn more

Import color schemes from the dialogs or put them into the following location:%1$s ]]>
Dim down non-human lines Display joins/quits in a faint color, as set in the color scheme Buttons Show tab button Show send button Show paperclip button Paperclip button short tap @string/pref__buttons__paperclip__actions__content_images @string/pref__buttons__paperclip__actions__content_media @string/pref__buttons__paperclip__actions__content_anything @string/pref__buttons__paperclip__actions__mediastore_images @string/pref__buttons__paperclip__actions__mediastore_media @string/pref__buttons__paperclip__actions__camera Paperclip button long tap @string/pref__buttons__paperclip__actions__none @string/pref__buttons__paperclip__actions__content_images @string/pref__buttons__paperclip__actions__content_media @string/pref__buttons__paperclip__actions__content_anything @string/pref__buttons__paperclip__actions__mediastore_images @string/pref__buttons__paperclip__actions__mediastore_media @string/pref__buttons__paperclip__actions__camera Disabled System: attach images System: attach images and videos System: attach any files Gallery: attach images Gallery: attach images and videos Take photo When the paperclip button gets hidden to provide more space for the input field, you can still attach files via overflow menu. Volume buttons change text size If set, volume buttons will change text size instead of volume Notifications Enable notifications Notify about hot messages such as private messages or highlights Notification sound Vibration Notification light Media preview Enabled Never On Wi-Fi only On unmetered networks only Always Context Disabled everywhere Enabled for %s Chat Paste dialog Notifications Insecure requests Allow Rewrite as HTTPS Disallow
⚠ Warning: the app is accessing the web directly. A malicious person could craft a website to learn your IP address and other data. To prevent the app from accessing websites you don’t know, remove the strategy for the wildcard host “*” or set it to “none”. Learn more ]]>
Strategies Defines the ways images are fetched from individual websites, and some filters. \n \n%1$s; %2$s; \n \n%3$s Error Message filter set Message filter not set line filters not set %d line filter set %d line filters set No strategies loaded Strategies: %s "# don’t look for links in the part # of the message that matches the # following regex. this prevents # the app from showing broken links # in matrix clients’ quotes, e.g. # <nick "http://broken.co"> message #message filter: # ^<[^ ]{1,16} \".{1,33}\">\\s line filters: # don’t display thumbnails for any # lines that match the following regex - regex: '^(?:Title: |[↑^] )' # don’t display thumbnails # for any lines from bot #- nicks: [bot] # don’t display thumbnails # for any lines from bot # that also math the given regex #- nicks: [bot] # regex: ^<\\S+>\\s strategies: - name: skip pastebins type: none hosts: - pastebin.com - bpa.st - dpaste.com - termbin.com - name: skip site banners type: none hosts: - github.com - gist.github.com - stackoverflow.com - '*.stackexchange.com' - twitch.tv - '*.twitch.tv' #- name: skip the rest, including redirects # type: none # hosts: ['*'] - name: try the rest type: any hosts: ['*'] - name: youtube type: image hosts: [www.youtube.com, m.youtube.com, youtube.com, youtu.be] regex: (?i)^https?://(?:(?:www\\.|m\\.)?youtube\\.com/watch\\?v=|youtu\\.be/)([A-Za-z0-9_-]+) small: https://img.youtube.com/vi/$1/mqdefault.jpg big: https://img.youtube.com/vi/$1/hqdefault.jpg - name: i.imgur type: image hosts: [i.imgur.com] regex: (?i)^https?://i\\.imgur\\.com/([A-Za-z0-9]+) small: https://i.imgur.com/$1m.jpg big: https://i.imgur.com/$1h.jpg - name: imgur/gallery type: any hosts: [imgur.com, www.imgur.com] regex: (?i)^https?://(?:www\\.)?imgur\\.com/gallery/(.*) sub: https://imgur.com/a/$1 - name: 9gag type: image hosts: [9gag.com, img-9gag-fun.9cache.com] regex: (?i)^https?://(?:9gag\\.com/gag|img-9gag-fun\\.9cache\\.com/photo)/([^_]+) small: https://images-cdn.9gag.com/photo/$1_700b.jpg big: https://images-cdn.9gag.com/photo/$1_700b.jpg - name: mobile.twitter type: any hosts: [mobile.twitter.com] regex: (?i)^https?://mobile\\.twitter\\.com/(.*) sub: https://twitter.com/$1 - name: common type: any regex: (?i)^https?://(.+) sub: https://$1 hosts: - '*.wikipedia.org' - gfycat.com - imgur.com - name: reddit type: any hosts: [v.redd.it, reddit.com, www.reddit.com, old.reddit.com] body size: 196608 " Advanced Download size limit %s MB Disk cache %s MB; takes effect on restart Success cooldown %s hours. The app will consider successfully fetched image available, either from cache or the web, for the specified amount of time. Thumbnail width Minimum thumbnail height Maximum thumbnail height File sharing Accept from other apps Text only Text, images and videos Everything Direct share Disabled Up to one buffer Up to two buffers Up to three buffers Up to four buffers Upload URL File field Regex
curl -s --user user:pass \\
  --header \'Additional: Header\' \\
  --form additional=field \\
  --form file=@file.ext \\
  https://example.com | perl -nle \\
  \'m#^https://\\S+#; print $1//$&\'


If the regular expression is set, it is used to find the URL in the response body; either the first capture group is used, or the whole match. Learn more ]]>
Advanced Additional headers Additional fields Authentication None Basic User Password Remember uploads for %s hours About Weechat-Android %s created by ubergeek42 build ID %s Unknown version ID \nThis project uses the following libraries: \n \n    • Android Logger by Noveo Group \n    • AspectJ by Eclipse Foundation \n    • Bouncy Castle \n    • EventBus by greenrobot \n    • Glide by Bump Technologies \n    • Hugo by Jake Wharton \n    • Java-WebSocket by Nathan Rajlich \n    • joda-time-android by Daniel Lew \n    • JSch by JCraft \n    • LeakCanary by Square, Inc \n    • Mockito by Szczepan Faber and friends \n    • nv-websocket-client by Takahiko Kawasaki \n    • OkHttp by Square, Inc \n    • SLF4J by QOS.ch \n    • SnakeYAML by Andrey Somov \n    • sshlib by ConnectBot \n \nPlease create an issue on GitHub if you find a bug or have a feature request. \n \n ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/de.varengold.activeTAN/0000755000175000017500000000000014620351546022737 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/de.varengold.activeTAN/build.gradle0000644000175000017500000000717714620351225025224 0ustar00hanshansapply plugin: 'com.android.application' android { compileSdkVersion versions.compileSdk defaultConfig { versionCode 34 versionName "2021-06-30" // Requires API level 23 (Android 6.0) to use Android keystore system for cryptography. minSdkVersion 23 targetSdkVersion versions.targetSdk testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true javaCompileOptions { annotationProcessorOptions { // Export database schema history as JSON files. arguments = ["room.schemaLocation": "$projectDir/schemas".toString()] } } sourceSets { // Include database schema history for migration testing. androidTest.assets.srcDirs += files("$projectDir/schemas".toString()) } } buildFeatures { viewBinding = true } buildTypes { debug { // Don't mess with the release versions during debugging, so use a different appId. applicationIdSuffix ".debug" debuggable true } release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } flavorDimensions "client", "environment" productFlavors { prod { dimension "environment" } qs { dimension "environment" // To be able to install a second app variant, we must change the applicationId. // Otherwise it would not be possible to use the same device for testing and production. applicationIdSuffix ".QS" } EFD { // Demo portal efdis-online.de (extern) / dailybuild.efdis-online.de (intern) dimension "client" applicationId "de.efdis.activeTAN" } VAR { dimension "client" applicationId "de.varengold.activeTAN" } } compileOptions { // ZXing uses Java 8 language features from the core library coreLibraryDesugaringEnabled true targetCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_8 } } tasks.withType(JavaCompile) { options.deprecation = true } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation project(':material-design-icons') implementation project(":barcodescanner") implementation 'com.google.android.material:material:1.3.0' implementation 'androidx.appcompat:appcompat:1.3.0' implementation 'androidx.biometric:biometric:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'androidx.recyclerview:recyclerview:1.2.1' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' implementation 'com.google.zxing:core:' + versions.zxing def room_version = '2.3.0' implementation "androidx.room:room-runtime:$room_version" annotationProcessor "androidx.room:room-compiler:$room_version" androidTestImplementation "androidx.room:room-testing:$room_version" testImplementation 'junit:junit:4.13.1' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test:runner:1.3.0' androidTestImplementation 'androidx.test:rules:1.3.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.3.0' androidTestImplementation 'androidx.test.espresso:espresso-intents:3.3.0' } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/dev.patrickgold.florisboard/0000755000175000017500000000000014620351546024137 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/dev.patrickgold.florisboard/app/0000755000175000017500000000000014620351546024717 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/dev.patrickgold.florisboard/app/build.gradle.kts0000644000175000017500000000715514620351225030000 0ustar00hanshansplugins { id("com.android.application") version "4.1.2" kotlin("android") version "1.4.30" } android { compileSdkVersion(30) buildToolsVersion("30.0.3") compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = JavaVersion.VERSION_1_8.toString() freeCompilerArgs = listOf("-Xallow-result-return-type") // enables use of kotlin.Result } defaultConfig { applicationId = "dev.patrickgold.florisboard" minSdkVersion(23) targetSdkVersion(30) versionCode(29) versionName("0.3.10") testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } buildFeatures { viewBinding = true } buildTypes { named("debug").configure { applicationIdSuffix = ".debug" versionNameSuffix = "-debug" resValue("mipmap", "floris_app_icon", "@mipmap/ic_app_icon_debug") resValue("mipmap", "floris_app_icon_round", "@mipmap/ic_app_icon_debug_round") resValue("string", "floris_app_name", "FlorisBoard Debug") } create("beta") // Needed because by default the "beta" BuildType does not exist named("beta").configure { applicationIdSuffix = ".beta" versionNameSuffix = "-beta01" proguardFiles.add(getDefaultProguardFile("proguard-android-optimize.txt")) resValue("mipmap", "floris_app_icon", "@mipmap/ic_app_icon_beta") resValue("mipmap", "floris_app_icon_round", "@mipmap/ic_app_icon_beta_round") resValue("string", "floris_app_name", "FlorisBoard Beta") } named("release").configure { proguardFiles.add(getDefaultProguardFile("proguard-android-optimize.txt")) resValue("mipmap", "floris_app_icon", "@mipmap/ic_app_icon_release") resValue("mipmap", "floris_app_icon_round", "@mipmap/ic_app_icon_release_round") resValue("string", "floris_app_name", "@string/app_name") } } testOptions { unitTests { isIncludeAndroidResources = true } } lintOptions { isAbortOnError = false } } dependencies { implementation("androidx.activity", "activity-ktx", "1.2.1") implementation("androidx.appcompat", "appcompat", "1.2.0") implementation("androidx.core", "core-ktx", "1.3.2") implementation("androidx.fragment", "fragment-ktx", "1.3.0") implementation("androidx.preference", "preference-ktx", "1.1.1") implementation("androidx.constraintlayout", "constraintlayout", "2.0.4") implementation("androidx.lifecycle", "lifecycle-service", "2.2.0") implementation("com.google.android", "flexbox", "2.0.1") // requires jcenter as of version 2.0.1 implementation("com.squareup.moshi", "moshi-kotlin", "1.11.0") implementation("com.squareup.moshi", "moshi-adapters", "1.11.0") implementation("com.google.android.material", "material", "1.3.0") implementation("org.jetbrains.kotlinx", "kotlinx-coroutines-android", "1.4.2") implementation("com.jaredrummler", "colorpicker", "1.1.0") implementation("com.jakewharton.timber", "timber", "4.7.1") implementation("com.nambimobile.widgets", "expandable-fab", "1.0.2") testImplementation("junit", "junit", "4.13.1") testImplementation("org.mockito", "mockito-inline", "3.7.7") testImplementation("org.robolectric", "robolectric", "4.5.1") androidTestImplementation("androidx.test.ext", "junit", "1.1.2") androidTestImplementation("androidx.test.espresso", "espresso-core", "3.3.0") } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/eu.siacs.conversations/0000755000175000017500000000000014620351546023160 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/eu.siacs.conversations/build.gradle0000644000175000017500000000675414620351225025445 0ustar00hanshans// Top-level build file where you can add configuration options common to all // sub-projects/modules. buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.3' } } apply plugin: 'com.android.application' repositories { jcenter() mavenCentral() maven { url 'https://maven.google.com' } } configurations { playstoreCompile freeCompile } ext { supportLibVersion = '27.0.2' } dependencies { compile project(':libs:MemorizingTrustManager') playstoreCompile 'com.google.android.gms:play-services-gcm:11.6.2' compile 'org.sufficientlysecure:openpgp-api:10.0' compile 'com.soundcloud.android:android-crop:1.0.1@aar' compile "com.android.support:support-v13:$supportLibVersion" compile "com.android.support:appcompat-v7:$supportLibVersion" compile "com.android.support:support-emoji:$supportLibVersion" freeCompile "com.android.support:support-emoji-bundled:$supportLibVersion" compile 'org.bouncycastle:bcmail-jdk15on:1.52' compile 'org.jitsi:org.otr4j:0.22' compile 'org.gnu.inet:libidn:1.15' compile 'com.google.zxing:core:3.2.1' compile 'com.google.zxing:android-integration:3.2.1' compile 'de.measite.minidns:minidns-hla:0.2.4' compile 'de.timroes.android:EnhancedListView:0.3.4' compile 'me.leolin:ShortcutBadger:1.1.19@aar' compile 'com.kyleduo.switchbutton:library:1.2.8' compile 'org.whispersystems:signal-protocol-java:2.6.2' compile 'com.makeramen:roundedimageview:2.3.0' compile "com.wefika:flowlayout:0.4.1" compile 'net.ypresto.androidtranscoder:android-transcoder:0.2.0' } ext { travisBuild = System.getenv("TRAVIS") == "true" preDexEnabled = System.getProperty("pre-dex", "true") } android { compileSdkVersion 26 buildToolsVersion "26.0.2" defaultConfig { minSdkVersion 14 targetSdkVersion 25 versionCode 245 versionName "1.23.1" archivesBaseName += "-$versionName" applicationId "eu.siacs.conversations" } dexOptions { // Skip pre-dexing when running on Travis CI or when disabled via -Dpre-dex=false. preDexLibraries = preDexEnabled && !travisBuild jumboMode true } compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } productFlavors { playstore free } if(new File("signing.properties").exists()) { Properties props = new Properties() props.load(new FileInputStream(file("signing.properties"))) signingConfigs { release { storeFile file(props['keystore']) storePassword props['keystore.password'] keyAlias props['keystore.alias'] keyPassword props['keystore.password'] } } buildTypes.release.signingConfig = signingConfigs.release } lintOptions { disable 'MissingTranslation', 'InvalidPackage', 'MissingQuantity', 'AppCompatResource' } subprojects { afterEvaluate { if (getPlugins().hasPlugin('android') || getPlugins().hasPlugin('android-library')) { configure(android.lintOptions) { disable 'AndroidGradlePluginVersion', 'MissingTranslation' } } } } packagingOptions { exclude 'META-INF/BCKEY.DSA' exclude 'META-INF/BCKEY.SF' } } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/eu.siacs.conversations/metadata/0000755000175000017500000000000014620351546024740 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/eu.siacs.conversations/metadata/en-US/0000755000175000017500000000000014620351546025667 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/eu.siacs.conversations/metadata/en-US/name.txt0000644000175000017500000000001514620351225027336 0ustar00hanshansConversations././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/fdroid/0000755000175000017500000000000014620351546020021 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/fdroid/fdroidclient/0000755000175000017500000000000014620351546022467 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/fdroid/fdroidclient/AndroidManifest.xml0000644000175000017500000005003314620351225026253 0ustar00hanshans ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/fdroid/fdroidclient/build.gradle0000644000175000017500000002017214620351225024742 0ustar00hanshansapply plugin: 'com.android.application' if ( !hasProperty( 'sourceDeps' ) ) { logger.info "Setting up *binary* dependencies for F-Droid (if you'd prefer to build from source, pass the -PsourceDeps argument to gradle while building)." repositories { jcenter() // This is here until we sort out all dependencies from mavenCentral/jcenter. Once all of // the dependencies below have been sorted out, this can be removed. flatDir { dirs 'libs/binaryDeps' } } dependencies { compile 'com.android.support:support-v4:22.1.0', 'com.android.support:appcompat-v7:22.1.0', 'com.android.support:support-annotations:22.1.0', 'org.thoughtcrime.ssl.pinning:AndroidPinning:1.0.0', 'com.nostra13.universalimageloader:universal-image-loader:1.9.4', 'com.google.zxing:core:3.2.0', 'eu.chainfire:libsuperuser:1.0.0.201504231659', // We use a slightly modified spongycastle, see // openkeychain/spongycastle with some changes on top of 1.51.0.0 'com.madgag.spongycastle:pkix:1.51.0.0', 'com.madgag.spongycastle:prov:1.51.0.0', 'com.madgag.spongycastle:core:1.51.0.0' // Upstream doesn't have a binary on mavenCentral/jcenter yet: // https://github.com/kolavar/android-support-v4-preferencefragment/issues/13 compile(name: 'support-v4-preferencefragment-release', ext: 'aar') // Fork for F-Droid, including support for https. Not merged into upstream // yet (seems to be a little unsupported as of late), so not using mavenCentral/jcenter. compile(name: 'nanohttpd-2.1.0') // Upstream doesn't have a binary on mavenCentral. compile(name: 'zipsigner') // Project semi-abandoned, 3.4.1 is from 2011 and we use trunk from 2013 compile(name: 'jmdns') androidTestCompile 'commons-io:commons-io:2.2' } } else { logger.info "Setting up *source* dependencies for F-Droid (because you passed in the -PsourceDeps argument to gradle while building)." repositories { jcenter() } dependencies { compile project(':extern:AndroidPinning') compile project(':extern:UniversalImageLoader:library') compile project(':extern:libsuperuser:libsuperuser') compile project(':extern:nanohttpd:core') compile project(':extern:jmdns') compile project(':extern:zipsigner') compile project(':extern:zxing-core') compile( project(':extern:support-v4-preferencefragment') ) { exclude module: 'support-v4' } // Until the android team updates the gradle plugin version from 0.10.0 to // a newer version, we can't build this from source with our gradle version // of 1.0.0. They use API's which have been moved in the newer plugin. // So yes, this is a little annoying that our "source dependencies" include // a bunch of binaries from jcenter - but the ant build file (which is the // one used to build F-Droid which is distributed on https://f-droid.org // builds these from source - well - not support-v4). // // If the android team gets the build script working with the newer plugin, // then you can find the relevant portions of the ../build.gradle file that // include magic required to make it work at around about the v0.78 git tag. // They have since been removed to clean up the build file. compile 'com.android.support:support-v4:22.1.0', 'com.android.support:appcompat-v7:22.1.0', 'com.android.support:support-annotations:22.1.0' androidTestCompile 'commons-io:commons-io:2.2' } } task cleanBinaryDeps(type: Delete) { enabled = project.hasProperty('sourceDeps') description = "Removes all .jar and .aar files from F-Droid/libs/. Requires the sourceDeps property to be set (\"gradle -PsourceDeps cleanBinaryDeps\")" delete fileTree('libs/binaryDeps') { include '*.aar' include '*.jar' } } task binaryDeps(type: Copy, dependsOn: ':F-Droid:prepareReleaseDependencies') { enabled = project.hasProperty('sourceDeps') description = "Copies .jar and .aar files from subproject dependencies in extern/ to F-Droid/libs. Requires the sourceDeps property to be set (\"gradle -PsourceDeps binaryDeps\")" from ('../extern/' ) { include 'support-v4-preferencefragment/build/outputs/aar/support-v4-preferencefragment-release.aar', 'nanohttpd/core/build/libs/nanohttpd-2.1.0.jar', 'zipsigner/build/libs/zipsigner.jar', 'jmdns/build/libs/jmdns.jar', 'Support/v4/build/libs/support-v4.jar' } into 'libs/binaryDeps' includeEmptyDirs false eachFile { FileCopyDetails details -> // Don't copy to a sub folder such as libs/binaryDeps/Project/build/outputs/aar/project.aar, but // rather libs/binaryDeps/project.aar. details.path = details.name } } android { compileSdkVersion 21 buildToolsVersion '22.0.1' defaultConfig { flavorDimensions "default" productFlavors { devVersion { applicationId "org.fdroid.fdroid.dev" dimension "default" versionCode 949 versionName "0.95-dev" } } } sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } androidTest.setRoot('test') androidTest { manifest.srcFile 'test/AndroidManifest.xml' java.srcDirs = ['test/src'] resources.srcDirs = ['test/src'] aidl.srcDirs = ['test/src'] renderscript.srcDirs = ['test/src'] res.srcDirs = ['test/res'] assets.srcDirs = ['test/assets'] } } buildTypes { release { minifyEnabled false } buildTypes { debug { debuggable true } } } compileOptions { compileOptions.encoding = "UTF-8" // Use Java 1.7, requires minSdk 8 sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } lintOptions { checkReleaseBuilds false abortOnError false } // Enable all Android lint warnings gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs << "-Xlint:all" } } } // This person took the example code below from another blogpost online, however // I lost the reference to it: // http://stackoverflow.com/questions/23297562/gradle-javadoc-and-android-documentation android.applicationVariants.all { variant -> task("generate${variant.name}Javadoc", type: Javadoc) { title = "$name $version API" description "Generates Javadoc for F-Droid." source = variant.javaCompile.source def sdkDir Properties properties = new Properties() File localProps = project.rootProject.file('local.properties') if (localProps.exists()) { properties.load(localProps.newDataInputStream()) sdkDir = properties.getProperty('sdk.dir') } else { sdkDir = System.getenv('ANDROID_HOME') } if (!sdkDir) { throw new ProjectConfigurationException("Cannot find android sdk. Make sure sdk.dir is defined in local.properties or the environment variable ANDROID_HOME is set.", null) } ext.androidJar = "${sdkDir}/platforms/${android.compileSdkVersion}/android.jar" classpath = files(variant.javaCompile.classpath.files) + files(ext.androidJar) options.links("http://docs.oracle.com/javase/7/docs/api/"); options.links("http://d.android.com/reference/"); exclude '**/BuildConfig.java' exclude '**/R.java' } } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/firebase-allowlisted/0000755000175000017500000000000014620351546022653 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/firebase-allowlisted/app/0000755000175000017500000000000014620351546023433 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/firebase-allowlisted/app/build.gradle0000644000175000017500000000015514620351225025705 0ustar00hanshansdependencies { compile 'com.firebase:firebase-jobdispatcher:0.8.4' testCompile 'junit:junit:4.12' } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/firebase-allowlisted/build.gradle0000644000175000017500000000031114620351225025117 0ustar00hanshansbuildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.3' } } allprojects { repositories { jcenter() } } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/firebase-suspect/0000755000175000017500000000000014620351546022016 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/firebase-suspect/app/0000755000175000017500000000000014620351546022576 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/firebase-suspect/app/build.gradle0000644000175000017500000000015414620351225025047 0ustar00hanshansdependencies { compile 'com.google.firebase:firebase-core:11.6.2' testCompile 'junit:junit:4.12' } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/firebase-suspect/build.gradle0000644000175000017500000000027514620351225024273 0ustar00hanshansbuildscript { dependencies { classpath 'com.android.tools.build:gradle:2.3.3' } } allprojects { repositories { maven { url "https://maven.google.com" } } } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/info.guardianproject.ripple/0000755000175000017500000000000014620351546024157 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/info.guardianproject.ripple/build.gradle0000644000175000017500000000062514620351225026433 0ustar00hanshansbuildscript { repositories { maven { url 'file:///usr/share/maven-repo' } maven { url 'https://maven.google.com' } jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.2.2' } } allprojects { repositories { maven { url 'file:///usr/share/maven-repo' } maven { url 'https://maven.google.com' } jcenter() } } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/open-keychain/0000755000175000017500000000000014620351546021304 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/open-keychain/open-keychain/0000755000175000017500000000000014620351546024036 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/open-keychain/open-keychain/OpenKeychain/0000755000175000017500000000000014620351546026413 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/open-keychain/open-keychain/OpenKeychain/build.gradle0000644000175000017500000002710114620351225030665 0ustar00hanshansapply plugin: 'com.android.application' apply plugin: 'witness' apply plugin: 'jacoco' apply plugin: 'com.github.kt3k.coveralls' dependencies { // NOTE: Always use fixed version codes not dynamic ones, e.g. 0.7.3 instead of 0.7.+, see README for more information // NOTE: libraries are pinned to a specific build, see below // from local Android SDK compile 'com.android.support:support-v4:22.1.1' compile 'com.android.support:appcompat-v7:22.1.1' compile 'com.android.support:recyclerview-v7:22.1.0' compile 'com.android.support:cardview-v7:22.1.0' // Unit tests in the local JVM with Robolectric // https://developer.android.com/training/testing/unit-testing/local-unit-tests.html // https://github.com/nenick/AndroidStudioAndRobolectric // http://www.vogella.com/tutorials/Robolectric/article.html testCompile 'junit:junit:4.12' testCompile 'org.robolectric:robolectric:3.0-rc3' // UI testing with Espresso androidTestCompile 'com.android.support.test:runner:0.3' androidTestCompile 'com.android.support.test:rules:0.3' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2' androidTestCompile ('com.android.support.test.espresso:espresso-contrib:2.2') { exclude group: 'com.android.support', module: 'appcompat' exclude group: 'com.android.support', module: 'support-v4' exclude module: 'recyclerview-v7' } // Temporary workaround for bug: https://code.google.com/p/android-test-kit/issues/detail?id=136 // from https://github.com/googlesamples/android-testing/blob/master/build.gradle#L21 configurations.all { resolutionStrategy.force 'com.android.support:support-annotations:22.1.1' } // JCenter etc. compile 'com.eftimoff:android-patternview:1.0.1@aar' compile 'com.journeyapps:zxing-android-embedded:2.3.0@aar' compile 'com.journeyapps:zxing-android-integration:2.3.0@aar' compile 'com.google.zxing:core:3.2.0' compile 'com.jpardogo.materialtabstrip:library:1.0.9' compile 'com.getbase:floatingactionbutton:1.9.0' compile 'org.commonjava.googlecode.markdown4j:markdown4j:2.2-cj-1.0' compile 'com.splitwise:tokenautocomplete:1.3.3@aar' compile 'se.emilsjolander:stickylistheaders:2.6.0' compile 'org.sufficientlysecure:html-textview:1.1' compile 'com.mikepenz.materialdrawer:library:2.8.2@aar' compile 'com.mikepenz.iconics:library:0.9.1@aar' compile 'com.mikepenz.iconics:octicons-typeface:2.2.0@aar' compile 'com.mikepenz.iconics:meteocons-typeface:1.1.1@aar' compile 'com.mikepenz.iconics:community-material-typeface:1.0.0@aar' compile 'com.nispok:snackbar:2.10.8' // libs as submodules compile project(':extern:openpgp-api-lib:openpgp-api') compile project(':extern:openkeychain-api-lib:openkeychain-intents') compile project(':extern:spongycastle:core') compile project(':extern:spongycastle:pg') compile project(':extern:spongycastle:pkix') compile project(':extern:spongycastle:prov') compile project(':extern:minidns') compile project(':extern:KeybaseLib:Lib') compile project(':extern:safeslinger-exchange') } // Output of ./gradlew -q calculateChecksums // Comment out the libs referenced as git submodules! dependencyVerification { verify = [ 'com.android.support:support-v4:1e2e4d35ac7fd30db5ce3bc177b92e4d5af86acef2ef93e9221599d733346f56', 'com.android.support:appcompat-v7:9a2355537c2f01cf0b95523605c18606b8d824017e6e94a05c77b0cfc8f21c96', 'com.android.support:recyclerview-v7:522d323079a29bcd76173bd9bc7535223b4af3e5eefef9d9287df1f9e54d0c10', 'com.android.support:cardview-v7:8dc99af71fec000baa4470c3907755264f15f816920861bc015b2babdbb49807', 'com.eftimoff:android-patternview:cec80e7265b8d8278b3c55b5fcdf551e4600ac2c8bf60d8dd76adca538af0b1e', 'com.journeyapps:zxing-android-embedded:702a4f58154dbd9baa80f66b6a15410f7a4d403f3e73b66537a8bfb156b4b718', 'com.journeyapps:zxing-android-integration:562737821b6d34c899b6fd2234ce0a8a31e02ff1fd7c59f6211961ce9767c7c8', 'com.google.zxing:core:7fe5a8ff437635a540e56317649937b768b454795ce999ed5f244f83373dee7b', 'com.jpardogo.materialtabstrip:library:c6ef812fba4f74be7dc4a905faa4c2908cba261a94c13d4f96d5e67e4aad4aaa', 'com.getbase:floatingactionbutton:052aa2a94e49e5dccc97cb99f2add87e8698b84859f0e3ac181100c0bc7640ca', 'org.commonjava.googlecode.markdown4j:markdown4j:e952e825d29e1317d96f79f346bfb6786c7c5eef50bd26e54a80823704b62e13', 'com.splitwise:tokenautocomplete:20bee71cc59b3828eb000b684d46ddf738efd56b8fee453a509cd16fda42c8cb', 'se.emilsjolander:stickylistheaders:8c05981ec5725be33f7cee5e68c13f3db49cd5c75f1aaeb04024920b1ef96ad4', 'org.sufficientlysecure:html-textview:ca24b1522be88378634093815ce9ff1b4920c72e7513a045a7846e14069ef988', 'com.mikepenz.materialdrawer:library:970317ed1a3cb96317f7b8d62ff592b3103eb46dfd68d9b244e7143623dc6d7a', 'com.mikepenz.iconics:library:4698a36ee4c2af765d0a85779c61474d755b90d66a59020105b6760a8a909e9e', 'com.mikepenz.iconics:octicons-typeface:67ed7d456a9ce5f5307b85f955797bfb3dd674e2f6defb31c6b8bbe2ede290be', 'com.mikepenz.iconics:meteocons-typeface:39a8a9e70cd8287cdb119af57a672a41dd09240dba6697f5a0dbda1ccc33298b', 'com.mikepenz.iconics:community-material-typeface:f1c5afee5f0f10d66beb3ed0df977246a02a9c46de4e05d7c0264bcde53b6b7f', 'com.nispok:snackbar:80bebc8e5d8b3d728cd5f2336e2d0c1cc2a6b7dc4b55d36acd6b75a78265590a', // 'OpenKeychain.extern:openpgp-api-lib:f05a9215cdad3a6597e4c5ece6fcec92b178d218195a3e88d2c0937c48dd9580', // 'OpenKeychain.extern:openkeychain-api-lib:50f6ebb5452d3fdc7be137ccf857a0ff44d55539fcb7b91baef495766ed7f429', // 'com.madgag.spongycastle:core:df8fcc028a95ac5ffab3b78c9163f5cfa672e41cd50128ca55d458b6cfbacf4b', // 'com.madgag.spongycastle:pg:160b345b10a2c92dc731453eec87037377f66a8e14a0648d404d7b193c4e380d', // 'com.madgag.spongycastle:pkix:0b4f3301ea12dd9f25d71770e6ea9f75e0611bf53062543e47be5bc15340a7e4', // 'com.madgag.spongycastle:prov:7325942e0b39f5fb35d6380818eed4b826e7dfc7570ad35b696d778049d8c36a', // 'OpenKeychain.extern:minidns:77b1786d29469e3b21f9404827cab811edc857cd68bc732cd57f11307c332eae', // 'OpenKeychain.extern.KeybaseLib:Lib:c91cda4a75692d8664644cd17d8ac962ce5bc0e266ea26673a639805f1eccbdf', // 'OpenKeychain.extern:safeslinger-exchange:d222721bb35408daaab9f46449364b2657112705ee571d7532f81cbeb9c4a73f', // 'OpenKeychain.extern.snackbar:lib:52357426e5275412e2063bdf6f0e6b957a3ea74da45e0aef35d22d9afc542e23', 'com.android.support:support-annotations:7bc07519aa613b186001160403bcfd68260fa82c61cc7e83adeedc9b862b94ae', ] } android { compileSdkVersion rootProject.ext.compileSdkVersion buildToolsVersion rootProject.ext.buildToolsVersion defaultConfig { minSdkVersion 15 targetSdkVersion 22 versionCode 32300 versionName "3.2.3" applicationId "org.sufficientlysecure.keychain" // the androidjunitrunner is broken regarding coverage, see here: // https://code.google.com/p/android/issues/detail?id=170607 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" // this workaround runner fixes the coverage problem, BUT doesn't work // with android studio single test execution. use it to generate coverage // data, but keep the other one otherwis // testInstrumentationRunner "org.sufficientlysecure.keychain.JacocoWorkaroundJUnitRunner" } compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' // Reference them in the java files with e.g. BuildConfig.ACCOUNT_TYPE. buildConfigField "String", "ACCOUNT_TYPE", "\"org.sufficientlysecure.keychain.account\"" // Reference them in .xml files. resValue "string", "account_type", "org.sufficientlysecure.keychain.account" } debug { applicationIdSuffix ".debug" // Reference them in the java files with e.g. BuildConfig.ACCOUNT_TYPE. buildConfigField "String", "ACCOUNT_TYPE", "\"org.sufficientlysecure.keychain.debug.account\"" // Reference them in .xml files. resValue "string", "account_type", "org.sufficientlysecure.keychain.debug.account" // Enable code coverage (Jacoco) testCoverageEnabled true } } /* * To sign release build, create file gradle.properties in ~/.gradle/ with this content: * * signingStoreLocation=/home/key.store * signingStorePassword=xxx * signingKeyAlias=alias * signingKeyPassword=xxx */ if (project.hasProperty('signingStoreLocation') && project.hasProperty('signingStorePassword') && project.hasProperty('signingKeyAlias') && project.hasProperty('signingKeyPassword')) { println "Found sign properties in gradle.properties! Signing build…" signingConfigs { release { storeFile file(signingStoreLocation) storePassword signingStorePassword keyAlias signingKeyAlias keyPassword signingKeyPassword } } buildTypes.release.signingConfig = signingConfigs.release } else { buildTypes.release.signingConfig = null } // NOTE: Lint is disabled because it slows down builds, // to enable it comment out the code at the bottom of this build.gradle lintOptions { // Do not abort build if lint finds errors abortOnError false checkAllWarnings true htmlReport true htmlOutput file('lint-report.html') } // Disable preDexing, causes com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000) on some systems dexOptions { preDexLibraries = false } packagingOptions { exclude 'LICENSE.txt' } } // apply plugin: 'spoon' task jacocoTestReport(type:JacocoReport) { group = "Reporting" description = "Generate Jacoco coverage reports" classDirectories = fileTree( dir: "${buildDir}/intermediates/classes/debug", excludes: ['**/R.class', '**/R$*.class', '**/*$ViewInjector*.*', '**/BuildConfig.*', '**/Manifest*.*'] ) sourceDirectories = files("${buildDir.parent}/src/main/java") additionalSourceDirs = files([ "${buildDir}/generated/source/buildConfig/debug", "${buildDir}/generated/source/r/debug" ]) executionData = files([ "${buildDir}/jacoco/testDebug.exec", "${buildDir}/outputs/code-coverage/connected/coverage.ec" ]) reports { xml.enabled = true html.enabled = true } } // Fix for: No report file available: [/home/travis/build/open-keychain/open-keychain/OpenKeychain/build/reports/cobertura/coverage.xml, /home/travis/build/open-keychain/open-keychain/OpenKeychain/build/reports/jacoco/test/jacocoTestReport.xml] coveralls { jacocoReportPath 'build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml' } // NOTE: This disables Lint! tasks.whenTaskAdded { task -> if (task.name.contains('lint')) { task.enabled = false } } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/open-keychain/open-keychain/build.gradle0000644000175000017500000000243014620351225026306 0ustar00hanshansbuildscript { repositories { jcenter() } dependencies { // NOTE: Always use fixed version codes not dynamic ones, e.g. 0.7.3 instead of 0.7.+, see README for more information classpath 'com.android.tools.build:gradle:1.2.3' classpath files('gradle-witness.jar') // bintray dependency to satisfy dependency of openpgp-api lib classpath 'com.novoda:bintray-release:0.2.7' classpath 'org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.0.1' // classpath 'com.stanfy.spoon:spoon-gradle-plugin:1.0.2' } } allprojects { repositories { jcenter() } } task wrapper(type: Wrapper) { gradleVersion = '2.4' } subprojects { tasks.withType(Test) { maxParallelForks = 1 } } // Ignore tests for external spongycastle project(':extern:spongycastle') { subprojects { // Need to re-apply the plugin here otherwise the test property below can't be set. apply plugin: 'java' test.enabled = false } } // SDK Version and Build Tools used by all subprojects // See http://tools.android.com/tech-docs/new-build-system/tips#TOC-Controlling-Android-properties-of-all-your-modules-from-the-main-project. ext { compileSdkVersion = 22 buildToolsVersion = '22.0.1' } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/org.mozilla.rocket/0000755000175000017500000000000014620351546022275 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/org.mozilla.rocket/app/0000755000175000017500000000000014620351546023055 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/org.mozilla.rocket/app/build.gradle0000644000175000017500000004054514620351225025336 0ustar00hanshansapply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' apply plugin: 'com.google.android.gms.oss-licenses-plugin' apply from: '../buildSrc/pmd.gradle' apply from: '../buildSrc/checkstyle.gradle' apply from: '../buildSrc/findbugs.gradle' apply from: 'buildscripts/l10n.gradle' android { compileSdkVersion Versions.compile_sdk buildToolsVersion Versions.build_tools defaultConfig { applicationId "org.mozilla" minSdkVersion Versions.min_sdk targetSdkVersion Versions.target_sdk versionCode Versions.version_code versionName Versions.version_name if (SystemEnv.auto_screenshot == "1") { testInstrumentationRunner "org.mozilla.focus.test.runner.ScreenshotTestRunner" testInstrumentationRunnerArguments clearPackageData: 'true' } else { // general UI test, using notAnnotation to filter out auto screenshot classes testInstrumentationRunner "org.mozilla.focus.test.runner.CustomTestRunner" testInstrumentationRunnerArguments clearPackageData: 'true', notAnnotation: 'org.mozilla.focus.annotation.ScreengrabOnly,android.support.test.filters.FlakyTest' } testInstrumentationRunnerArgument 'disableAnalytics', 'true' multiDexEnabled true vectorDrawables { useSupportLibrary false generatedDensities = [] } def bitrise_build_number = System.getenv("BITRISE_BUILD_NUMBER") if (bitrise_build_number?.trim()) { versionCode bitrise_build_number.toInteger() versionNameSuffix "(" + bitrise_build_number + ")" } // used by Room, to test migrations javaCompileOptions { annotationProcessorOptions { arguments = ["room.schemaLocation": "$projectDir/schemas".toString()] } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dexOptions { preDexLibraries true } bundle { language { enableSplit = false } density { enableSplit = false } abi { enableSplit = true } } // We have a three dimensional build configuration: // BUILD TYPE (debug, release) buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' matchingFallbacks = ["firebase"] } debug { def userName = System.getenv("USER") applicationIdSuffix ".debug." + userName versionNameSuffix applicationIdSuffix matchingFallbacks = ["firebase_no_op"] } // Use a separate buildType for coverage: testCoverageEnabled produces slower code (4-5x slower // in places that I've benchmarked), and more importantly seems to break debugging with Android Studio // for some developers (i.e. variables can't be inspected or seen). coverage { initWith debug applicationIdSuffix ".coverage" testCoverageEnabled true matchingFallbacks = ["debug", "firebase_no_op"] } // special build type to develop Firebase related stuff firebase { initWith debug applicationIdSuffix ".debug.firebase" versionNameSuffix applicationIdSuffix matchingFallbacks = ["debug", "firebase"] } } testBuildType "firebase" testOptions { animationsDisabled = true unitTests.returnDefaultValues = true unitTests.includeAndroidResources = true execution 'ANDROID_TEST_ORCHESTRATOR' } // used by Room, to test migrations sourceSets { androidTest.assets.srcDirs += files("$projectDir/schemas".toString()) } flavorDimensions "product", "engine" productFlavors { focus { resConfigs Localization.KEPT_LOCALE dimension "product" applicationIdSuffix ".rocket" } preview { dimension "product" applicationId "gro.allizom.zelda.beta" applicationIdSuffix "" versionNameSuffix ".nightly" } // We can build with two engines: webkit or gecko webkit { dimension "engine" } } variantFilter { variant -> def flavors = variant.flavors*.name // We only need a nightly release for now if (flavors.contains("preview") && variant.buildType.name != "release") { setIgnore(true) } } sourceSets { test { resources { // Make the default asset folder available as test resource folder. Robolectric seems // to fail to read assets for our setup. With this we can just read the files directly // and do not need to rely on Robolectric. srcDir "${projectDir}/src/main/assets/" } } preview { res.srcDir 'src/preview/res' } // used by Room, to test migrations androidTest.assets.srcDirs += files("$projectDir/schemas".toString()) } } repositories { flatDir { dirs 'libs' } mavenCentral() } dependencies { implementation project(':telemetry-annotation') kapt project(':telemetry-compiler') implementation project(':third_party:subsampling-scale-image-view') implementation project(':third_party:glide:annotation') implementation project(':third_party:glide:library') kapt "com.github.bumptech.glide:compiler:${Versions.glide}" implementation project(':firebase') implementation project(':feature-tabs') implementation project(':HttpRequest') implementation project(':httptask') implementation project(':urlutils') implementation project(':fileutils') implementation project(':icon') implementation project(':logger') implementation project(':threadutils') implementation project(':cachedrequestloader') implementation project(':permissionhandler') implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${Versions.kotlin}" // We didn't use CustomTabs so far. This is a build hack to force Android-Components to use // same version of support library as we are. Android-Components depends on CustomTabs which // version will be override by this. // We can get rid of this once Android-Components' issue #404 has been resolve. implementation "com.android.support:customtabs:${Versions.support}" implementation "com.android.support:support-v4:${Versions.support}" implementation "com.android.support:appcompat-v7:${Versions.support}" implementation "com.android.support:design:${Versions.support}" implementation "com.android.support:cardview-v7:${Versions.support}" implementation "com.android.support:recyclerview-v7:${Versions.support}" implementation "com.android.support.constraint:constraint-layout:${Versions.constraint}" implementation "android.arch.work:work-runtime:${Versions.arch_work}" // Architecture components implementation "android.arch.lifecycle:extensions:${Versions.lifecycle}" implementation "android.arch.lifecycle:common-java8:${Versions.lifecycle}" implementation "android.arch.persistence.room:runtime:${Versions.room}" implementation "android.arch.navigation:navigation-fragment:${Versions.navigation}" kapt "android.arch.persistence.room:compiler:${Versions.room}" implementation("com.google.code.findbugs:annotations:${Versions.findbugs}", { // We really only need the SuppressFBWarnings annotation, everything else can be ignored. // Without this we get weird failures due to dependencies. transitive = false }) implementation "org.mozilla.components:browser-session:${Versions.android_components}" implementation "org.mozilla.components:service-telemetry:${Versions.android_components}" implementation "org.mozilla.components:browser-domains:${Versions.android_components}" implementation "org.mozilla.components:ui-autocomplete:${Versions.android_components}" implementation "com.adjust.sdk:adjust-android:${Versions.adjust}" implementation "com.google.android.gms:play-services-analytics:${Versions.firebase}" // Required by Adjust // Required by Adjust implementation "com.airbnb.android:lottie:${Versions.lottie}" testImplementation "junit:junit:${Versions.junit}" testImplementation "org.robolectric:robolectric:${Versions.robolectric}" testImplementation "org.mockito:mockito-core:${Versions.mockito}" androidTestImplementation("com.android.support.test.espresso:espresso-core:${Versions.espresso}", { exclude group: 'com.android.support', module: 'support-annotations' }) androidTestImplementation "com.android.support.test:runner:${Versions.test_runner}" androidTestImplementation "com.android.support.test.espresso:espresso-idling-resource:${Versions.espresso}" androidTestImplementation "com.android.support:support-annotations:${Versions.support}" androidTestImplementation "com.android.support.test.uiautomator:uiautomator-v18:${Versions.uiautomator}" androidTestImplementation "com.squareup.okhttp3:mockwebserver:${Versions.mockwebserver}" androidTestImplementation "android.arch.persistence.room:testing:${Versions.room}" androidTestImplementation "android.arch.core:core-testing:${Versions.arch_core}" androidTestImplementation("com.android.support.test.espresso:espresso-contrib:${Versions.espresso}", { exclude group: 'com.android.support', module: 'appcompat' exclude group: 'com.android.support', module: 'support-v4' exclude module: 'recyclerview-v7' }) androidTestImplementation "com.android.support.test.espresso:espresso-web:${Versions.espresso}" androidTestImplementation "com.android.support.test.espresso:espresso-intents:${Versions.espresso}" androidTestImplementation "tools.fastlane:screengrab:${Versions.fastlane_screengrab}" androidTestImplementation "com.jraska:falcon:${Versions.jraska_falcon}" androidTestUtil "com.android.support.test:orchestrator:${Versions.test_runner}" // LeakCanary debugImplementation "com.squareup.leakcanary:leakcanary-android:${Versions.leakcanary}" coverageImplementation "com.squareup.leakcanary:leakcanary-android-no-op:${Versions.leakcanary}" releaseImplementation "com.squareup.leakcanary:leakcanary-android-no-op:${Versions.leakcanary}" firebaseImplementation "com.squareup.leakcanary:leakcanary-android:${Versions.leakcanary}" implementation project(':bhaskar') implementation project(':newspoint') implementation project(':partnerrepository') } // ------------------------------------------------------------------------------------------------- // LeakCanary - Ensure the no-op dependency is always used in JVM tests. // ------------------------------------------------------------------------------------------------- configurations.all { config -> if (config.name.contains('UnitTest') || config.name.contains('AndroidTest')) { config.resolutionStrategy.eachDependency { details -> if (details.requested.group == 'com.squareup.leakcanary' && details.requested.name == 'leakcanary-android') { details.useTarget(group: details.requested.group, name: 'leakcanary-android-no-op', version: details.requested.version) } } } } // ------------------------------------------------------------------------------------------------- // Generate blocklists // ------------------------------------------------------------------------------------------------- def blockListOutputDir = 'src/webkit/res/raw' task buildBlocklists(type: Copy) { from('../shavar-prod-lists') { include '*.json' } into blockListOutputDir // Android can't handle dashes in the filename, so we need to rename: rename 'disconnect-blacklist.json', 'blocklist.json' rename 'disconnect-entitylist.json', 'entitylist.json' // google_mapping.json already has an expected name } clean.doLast { file(blockListOutputDir).deleteDir() } tasks.whenTaskAdded { task -> def name = task.name if (name.contains("generate") && name.contains("Webkit") && name.contains("Resources")) { task.dependsOn buildBlocklists } } // ------------------------------------------------------------------------------------------------- // Adjust: Read token from environment variable (Only release builds) // ------------------------------------------------------------------------------------------------- android.applicationVariants.all { variant -> def variantName = variant.getName() print(variantName + ": ") // release and nightly will have Adjust. just nightly will use sandbox environment. if (variantName.contains("Release")) { def token = System.getenv("ADJUST_TOKEN_FOCUS") ?: null if (token != null) { buildConfigField 'String', 'ADJUST_TOKEN', '"' + token + '"' if (variantName.contains("preview")) { buildConfigField 'String', 'ADJUST_ENVIRONMENT', 'com.adjust.sdk.AdjustConfig.ENVIRONMENT_SANDBOX' } else if (variantName.contains("focus")) { buildConfigField 'String', 'ADJUST_ENVIRONMENT', 'com.adjust.sdk.AdjustConfig.ENVIRONMENT_PRODUCTION' } else { buildConfigField 'String', 'ADJUST_ENVIRONMENT', 'null' } println "Added adjust token set from environment variable" def tracker = System.getenv("ADJUST_SIDELOAD_TRACKER") ?: null if (tracker != null) { buildConfigField 'String', 'ADJUST_DEFAULT_TRACKER', '"' + tracker + '"' } else { buildConfigField 'String', 'ADJUST_DEFAULT_TRACKER', 'null' logger.error(variant.getName() + ": Not setting adjust default tracker (environment variable not set)") } } else { buildConfigField 'String', 'ADJUST_TOKEN', 'null' buildConfigField 'String', 'ADJUST_ENVIRONMENT', 'null' buildConfigField 'String', 'ADJUST_DEFAULT_TRACKER', 'null' println("Not setting adjust token (environment variable not set)") } } else { buildConfigField 'String', 'ADJUST_TOKEN', 'null' buildConfigField 'String', 'ADJUST_ENVIRONMENT', 'null' buildConfigField 'String', 'ADJUST_DEFAULT_TRACKER', 'null' println("Not setting adjust token (Not a focus release build)") } if (variant.buildType.name == "release" || variant.buildType.name == "firebase") { variant.assemble.doFirst { if (SystemEnv.google_app_id == null || SystemEnv.default_web_client_id == null || SystemEnv.firebase_database_url == null || SystemEnv.gcm_defaultSenderId == null || SystemEnv.google_api_key == null || SystemEnv.google_crash_reporting_api_key == null || SystemEnv.project_id == null) { logger.warn("If you want to enable Firebase, please follow the steps:") logger.warn("1. Download google-services.json and put it in the folder where you run below command.") logger.warn("2. Run 'python./tools/firebase/firebase_setup.py' and follow the steps.\n") } } } } tasks.whenTaskAdded { task -> if (name.contains("compile")) { task.dependsOn generatePreviewLocaleList task.dependsOn generateFocusLocaleList } } tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { kotlinOptions { kotlinOptions.allWarningsAsErrors = true } } afterEvaluate { check.dependsOn 'findbugs', 'pmd', 'checkstyle', 'checkTelemetryDocDirty', 'ktlint' } task checkTelemetryDocDirty() { doLast { Process p = Runtime.getRuntime().exec("git diff ./docs/events.md"); p.waitFor(); BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); StringBuilder sb = new StringBuilder(); String line = ""; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } if (sb.length() > 0) { throw new GradleException("events.md is drity, please commit the change first.\n" + sb.toString()) } } } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/org.noise_planet.noisecapture/0000755000175000017500000000000014620351546024520 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/org.noise_planet.noisecapture/app/0000755000175000017500000000000014620351546025300 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/org.noise_planet.noisecapture/app/build.gradle0000644000175000017500000001014214620351225027547 0ustar00hanshansapply plugin: 'com.android.application' def getCheckedOutGitCommitHash() { 'git rev-parse --verify --short HEAD'.execute().text.trim() } def getAvailableLocales() { new File("app/src/main/res").list(new FilenameFilter() { @Override boolean accept(File dir, String name) { return name.startsWith("values-") && new File(new File(dir,name), "strings.xml").exists(); } }).collect() { fold -> fold.substring("values-".length())}.join(",") } android { compileSdkVersion 30 buildToolsVersion '30.0.0' def signingFilePath = System.getProperty("user.home") + "/.idea/signing.gradle" if (new File(signingFilePath).exists()) { apply from: signingFilePath } defaultConfig { applicationId "org.noise_planet.noisecapture" minSdkVersion 15 targetSdkVersion 30 versionCode 55 versionName "1.2.19" // Store build date in apk buildConfigField "long", "TIMESTAMP", System.currentTimeMillis() + "L" buildConfigField "String", "GITHASH", "\"${getCheckedOutGitCommitHash().toString()}\"" buildConfigField "String", "SUPPORTEDLOCALES", "\"${getAvailableLocales()}\"" // Enabling multidex support. multiDexEnabled false vectorDrawables.useSupportLibrary = true testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } dexOptions { javaMaxHeapSize "4g" } lintOptions { abortOnError false disable 'MissingTranslation' } buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' if (new File(signingFilePath).exists()) { signingConfig signingConfigs.release } } debug { debuggable true if (new File(signingFilePath).exists()) { signingConfig signingConfigs.debug } } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } testOptions { unitTests { includeAndroidResources = true } } } // For using the MPAndroidChart package // https://github.com/PhilJay/MPAndroidChart // Apache License, Version 2.0 task listrepos { doLast { println "Repositories:" project.repositories.each { println "Name: " + it.name + "; url: " + it.url } } } repositories { mavenLocal() } dependencies { implementation 'com.github.PhilJay:MPAndroidChart:v2.2.5' implementation 'org.slf4j:slf4j-simple:1.7.12' implementation name: 'org/noise-planet/jwarble/0.2.3/jwarble-0.2.3' implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.10' implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.9.10' // multithreaded FFT for realtime visualisation of spectrum only implementation 'com.github.wendykierp:JTransforms:3.1' implementation 'org.apache.commons:commons-math3:3.5' implementation 'androidx.appcompat:appcompat:1.0.0' implementation 'com.google.android.material:material:1.0.0' implementation 'androidx.vectordrawable:vectordrawable:1.0.0' implementation 'com.nhaarman.supertooltips:library:3.0.0' //compile 'com.android.support:multidex:1.0.0' // Testing-only dependencies // Force usage of support annotations in the test app, since it is internally used by the runner module. implementation 'androidx.constraintlayout:constraintlayout:1.1.3' androidTestImplementation 'androidx.annotation:annotation:1.0.0' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test:rules:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0' // unit test testImplementation group: 'org.robolectric', name: 'robolectric', version: '4.3.1' testImplementation 'junit:junit:4.12' testImplementation group: 'com.googlecode.soundlibs', name: 'jorbis', version: '0.0.17.4' implementation project(':sosfilter') } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/org.noise_planet.noisecapture/settings.gradle0000644000175000017500000000003314620351225027526 0ustar00hanshansinclude 'sosfilter', 'app' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9283834 fdroidserver-2.3a1/tests/source-files/org.noise_planet.noisecapture/sosfilter/0000755000175000017500000000000014620351546026532 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/org.noise_planet.noisecapture/sosfilter/build.gradle0000644000175000017500000000145614620351225031011 0ustar00hanshansapply plugin: 'java' apply plugin: 'idea' apply plugin: 'java' group = 'org.orbisgis' version = '1.0-SNAPSHOT' description = """Signal processing, A-weighting and third-octave bands filtering""" compileJava { sourceCompatibility = 1.7 targetCompatibility = 1.7 } repositories { mavenCentral() } dependencies { compile group: 'org.slf4j', name: 'slf4j-api', version:'1.7.12' compile group: 'com.github.wendykierp', name: 'JTransforms', version:'3.1' testCompile group: 'org.slf4j', name: 'slf4j-simple', version:'1.7.12' testCompile group: 'junit', name: 'junit', version:'4.12' } // Copy resource for unit tests task copyTestResources(type: Copy) { from "${projectDir}/src/test/resources" into "${buildDir}/classes/test" } processTestResources.dependsOn copyTestResources ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/source-files/org.tasks/0000755000175000017500000000000014620351546020465 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/source-files/org.tasks/app/0000755000175000017500000000000014620351546021245 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/org.tasks/app/build.gradle.kts0000644000175000017500000002052214620351225024317 0ustar00hanshansimport com.android.build.gradle.api.ApplicationVariant plugins { id("com.android.application") id("checkstyle") id("io.fabric") id("com.cookpad.android.licensetools") kotlin("android") } repositories { jcenter() google() maven(url = "https://jitpack.io") } android { bundle { language { enableSplit = false } } dexOptions { javaMaxHeapSize = "2g" } lintOptions { setLintConfig(file("lint.xml")) textOutput("stdout") textReport = true } compileSdkVersion(Versions.targetSdk) defaultConfig { testApplicationId = "org.tasks.test" applicationId = "org.tasks" versionCode = 651 versionName = "7.6.1" targetSdkVersion(Versions.targetSdk) minSdkVersion(Versions.minSdk) multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" javaCompileOptions { annotationProcessorOptions { arguments["room.schemaLocation"] = "$projectDir/schemas" } } } signingConfigs { create("release") { val tasksKeyAlias: String? by project val tasksStoreFile: String? by project val tasksStorePassword: String? by project val tasksKeyPassword: String? by project keyAlias = tasksKeyAlias storeFile = file(tasksStoreFile?: "none") storePassword = tasksStorePassword keyPassword = tasksKeyPassword } } compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } @Suppress("LocalVariableName") buildTypes { getByName("debug") { val tasks_mapbox_key_debug: String? by project val tasks_google_key_debug: String? by project applicationIdSuffix = ".debug" resValue("string", "mapbox_key", tasks_mapbox_key_debug ?: "") resValue("string", "google_key", tasks_google_key_debug ?: "") isTestCoverageEnabled = true } getByName("release") { val tasks_mapbox_key: String? by project val tasks_google_key: String? by project resValue("string", "mapbox_key", tasks_mapbox_key ?: "") resValue("string", "google_key", tasks_google_key ?: "") isMinifyEnabled = true proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard.pro") signingConfig = signingConfigs.getByName("release") } } applicationVariants.all(object : Action { override fun execute(variant: ApplicationVariant) { variant.resValue("string", "app_package", variant.applicationId) } }) flavorDimensions("store") productFlavors { create("generic") { setDimension("store") proguardFile("generic.pro") } create("googleplay") { setDimension("store") } create("amazon") { setDimension("store") } } viewBinding { isEnabled = true } dataBinding { isEnabled = true } packagingOptions { exclude("META-INF/*.kotlin_module") } } configure { configFile = project.file("google_checks.xml") toolVersion = "8.16" } configurations.all { exclude(group = "com.google.guava", module = "guava-jdk5") exclude(group = "org.apache.httpcomponents", module = "httpclient") exclude(group = "com.google.http-client", module = "google-http-client-apache") resolutionStrategy { force("com.squareup.okhttp3:okhttp:" + Versions.okhttp) } } val googleplayImplementation by configurations val amazonImplementation by configurations dependencies { implementation("com.gitlab.bitfireAT:dav4jvm:1.0") implementation("com.gitlab.bitfireAT:ical4android:be6d515db8") { exclude(group = "org.threeten", module = "threetenbp") } implementation("com.gitlab.bitfireAT:cert4android:1488e39a66") annotationProcessor("com.google.dagger:dagger-compiler:${Versions.dagger}") implementation("com.google.dagger:dagger:${Versions.dagger}") implementation("androidx.room:room-rxjava2:${Versions.room}") annotationProcessor("androidx.room:room-compiler:${Versions.room}") implementation("androidx.lifecycle:lifecycle-extensions:2.1.0") implementation("io.reactivex.rxjava2:rxandroid:2.1.1") implementation("androidx.paging:paging-runtime:2.1.1") annotationProcessor("com.jakewharton:butterknife-compiler:${Versions.butterknife}") implementation("com.jakewharton:butterknife:${Versions.butterknife}") debugImplementation("com.facebook.flipper:flipper:${Versions.flipper}") debugImplementation("com.facebook.flipper:flipper-network-plugin:${Versions.flipper}") debugImplementation("com.facebook.soloader:soloader:0.8.0") debugImplementation("com.squareup.leakcanary:leakcanary-android:${Versions.leakcanary}") implementation("org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlin}") implementation("io.github.luizgrp.sectionedrecyclerviewadapter:sectionedrecyclerviewadapter:2.0.0") implementation("androidx.multidex:multidex:2.0.1") implementation("me.saket:better-link-movement-method:2.2.0") implementation("com.squareup.okhttp3:okhttp:${Versions.okhttp}") implementation("com.google.code.gson:gson:2.8.5") implementation("com.github.rey5137:material:1.2.5") implementation("com.nononsenseapps:filepicker:4.2.1") implementation("com.google.android.material:material:1.1.0-rc01") implementation("androidx.annotation:annotation:1.1.0") implementation("androidx.constraintlayout:constraintlayout:2.0.0-beta4") implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.0.0") implementation("com.jakewharton.timber:timber:4.7.1") implementation("com.jakewharton.threetenabp:threetenabp:1.2.1") implementation("com.google.guava:guava:27.1-android") implementation("com.jakewharton:process-phoenix:2.0.0") implementation("com.google.android.apps.dashclock:dashclock-api:2.0.0") implementation("com.twofortyfouram:android-plugin-api-for-locale:1.0.2") implementation("com.rubiconproject.oss:jchronic:0.2.6") { isTransitive = false } implementation("org.scala-saddle:google-rfc-2445:20110304") { isTransitive = false } implementation("com.wdullaer:materialdatetimepicker:4.0.1") implementation("me.leolin:ShortcutBadger:1.1.22@aar") implementation("com.google.apis:google-api-services-tasks:v1-rev59-1.25.0") implementation("com.google.apis:google-api-services-drive:v3-rev188-1.25.0") implementation("com.google.api-client:google-api-client-android:1.30.7") implementation("androidx.work:work-runtime:${Versions.work}") implementation("com.mapbox.mapboxsdk:mapbox-android-sdk:7.3.0") implementation("com.mapbox.mapboxsdk:mapbox-sdk-services:4.6.0") googleplayImplementation("com.crashlytics.sdk.android:crashlytics:${Versions.crashlytics}") googleplayImplementation("com.google.firebase:firebase-analytics:${Versions.firebase}") googleplayImplementation("com.google.android.gms:play-services-location:17.0.0") googleplayImplementation("com.google.android.gms:play-services-maps:17.0.0") googleplayImplementation("com.google.android.libraries.places:places:2.1.0") googleplayImplementation("com.android.billingclient:billing:1.2.2") amazonImplementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) amazonImplementation("com.crashlytics.sdk.android:crashlytics:${Versions.crashlytics}") amazonImplementation("com.google.firebase:firebase-core:${Versions.firebase}") androidTestAnnotationProcessor("com.google.dagger:dagger-compiler:${Versions.dagger}") androidTestAnnotationProcessor("com.jakewharton:butterknife-compiler:${Versions.butterknife}") androidTestImplementation("com.google.dexmaker:dexmaker-mockito:1.2") androidTestImplementation("com.natpryce:make-it-easy:4.0.1") androidTestImplementation("androidx.test:runner:1.2.0") androidTestImplementation("androidx.test:rules:1.2.0") androidTestImplementation("androidx.test.ext:junit:1.1.1") androidTestImplementation("androidx.annotation:annotation:1.1.0") } apply(mapOf("plugin" to "com.google.gms.google-services")) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/org.tasks/build.gradle0000644000175000017500000000035014620351225022734 0ustar00hanshans buildscript { repositories { mavenCentral() } dependencies { classpath 'org.owasp:dependency-check-gradle:1.3.2.1' } } apply plugin: 'org.owasp.dependencycheck' dependencyCheck { format='JSON' } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/org.tasks/build.gradle.kts0000644000175000017500000000147214620351225023542 0ustar00hanshansbuildscript { repositories { jcenter() google() maven("https://maven.fabric.io/public") } dependencies { classpath("com.android.tools.build:gradle:3.6.0-rc01") classpath("com.google.gms:google-services:4.3.3") // https://docs.fabric.io/android/changelog.html#fabric-gradle-plugin classpath("io.fabric.tools:gradle:1.31.2") classpath("com.github.ben-manes:gradle-versions-plugin:0.27.0") classpath("com.cookpad.android.licensetools:license-tools-plugin:1.7.0") classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.kotlin}") } } plugins { id("com.github.ben-manes.versions") version "0.21.0" } tasks.getByName("wrapper") { gradleVersion = "5.6.4" distributionType = Wrapper.DistributionType.ALL } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/source-files/org.tasks/buildSrc/0000755000175000017500000000000014620351546022234 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/org.tasks/buildSrc/build.gradle.kts0000644000175000017500000000007414620351225025306 0ustar00hanshansplugins { `kotlin-dsl` } repositories { jcenter() }././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/org.tasks/settings.gradle.kts0000644000175000017500000000002014620351225024267 0ustar00hanshansinclude(":app") ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/osmandapp/0000755000175000017500000000000014620351546020534 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/source-files/osmandapp/osmand/0000755000175000017500000000000014620351546022015 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/osmandapp/osmand/build.gradle0000644000175000017500000002026414620351225024272 0ustar00hanshansapply plugin: 'com.android.application' // Global Parameters accepted // APK_NUMBER_VERSION - version number of apk // APK_VERSION - build number like #9999Z, for dev builds appended to app_version like 2.0.0 in no_translate.xml) // flavor Z : M=-master, D=-design, B=-Blackberry, MD=-main-default, MQA=-main-qt-arm, MQDA=-main-qt-default-arm, S=-sherpafy // TARGET_APP_NAME - app name // APP_EDITION - date stamp of builds // APP_FEATURES - features +play_market +gps_status -parking_plugin -blackberry -free_version -amazon // 1. To be done Filter fonts // // // // // // // Less important android { compileSdkVersion 21 buildToolsVersion "21.1.2" signingConfigs { development { storeFile file("../keystores/debug.keystore") storePassword "android" keyAlias "androiddebugkey" keyPassword "android" } publishing { storeFile file("/var/lib/jenkins/osmand_key") storePassword System.getenv("OSMAND_APK_PASSWORD") keyAlias "osmand" keyPassword System.getenv("OSMAND_APK_PASSWORD") } } defaultConfig { minSdkVersion 9 targetSdkVersion 21 versionCode System.getenv("APK_NUMBER_VERSION") ? System.getenv("APK_NUMBER_VERSION").toInteger() : versionCode //versionName already assigned in code //versionName System.getenv("APK_VERSION")? System.getenv("APK_VERSION").toString(): versionName } lintOptions { lintConfig file("lint.xml") abortOnError false warningsAsErrors false } // This is from OsmAndCore_android.aar - for some reason it's not inherited aaptOptions { // Don't compress any embedded resources noCompress "qz" } dexOptions { jumboMode = true } sourceSets { main { manifest.srcFile "AndroidManifest.xml" jni.srcDirs = [] jniLibs.srcDirs = ["libs"] aidl.srcDirs = ["src"] java.srcDirs = ["src"] resources.srcDirs = ["src"] renderscript.srcDirs = ["src"] res.srcDirs = ["res"] assets.srcDirs = ["assets"] } free { manifest.srcFile "AndroidManifest-free.xml" } legacy { jniLibs.srcDirs = ["libgnustl"] } } flavorDimensions "version", "coreversion", "abi" productFlavors { // ABI armv7 { flavorDimension "abi" ndk { abiFilter "armeabi-v7a" } } armv5 { flavorDimension "abi" ndk { abiFilter "armeabi" } } x86 { flavorDimension "abi" ndk { abiFilter "x86" } } mips { flavorDimension "abi" ndk { abiFilter "mips" } } fat { flavorDimension "abi" } // Version free { flavorDimension "version" applicationId "net.osmand" } full { flavorDimension "version" applicationId "net.osmand.plus" } // CoreVersion legacy { flavorDimension "coreversion" } qtcore { flavorDimension "coreversion" } qtcoredebug { flavorDimension "coreversion" } } buildTypes { debug { // proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' // minifyEnabled true // proguardFiles 'proguard-project.txt' signingConfig signingConfigs.development } release { // proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' // minifyEnabled true //proguardFiles 'proguard-project.txt' signingConfig signingConfigs.publishing } } } def replaceNoTranslate(line) { if (line.contains("\"app_name\"") && System.getenv("TARGET_APP_NAME")) { return line.replaceAll(">[^<]*<", ">" + System.getenv("TARGET_APP_NAME") + "<") } if (line.contains("\"app_edition\"") && System.getenv("APP_EDITION")) { return line.replaceAll(">[^<]*<", ">" + System.getenv("APP_EDITION") + "<") } if (line.contains("\"app_version\"") && System.getenv("APK_VERSION")) { return line.replaceAll(">[^<]*<", ">" + System.getenv("APK_VERSION") + "<") } if (line.contains("\"app_version\"") && System.getenv("APK_VERSION_SUFFIX")) { // appends build number to version number for dev builds return line.replaceAll("[^<]*<", ">" + System.getenv("APP_FEATURES") + "<") } return line; } task updateNoTranslate(type: Copy) { from('.') { include 'no_translate.xml' filter { line -> replaceNoTranslate(line); } } into 'res/values/' } task collectVoiceAssets(type: Sync) { from "../../resources/voice" into "assets/voice" include "**/*.p" } task collectHelpContentsAssets(type: Sync) { from "../../help/help" into "assets/help" include "*.html" include "images/**/*.png" from "assets/" into "assets/help" include "style.css" } task collectRoutingResources(type: Sync) { from "../../resources/routing" into "src/net/osmand/router" include "*.xml" } task collectMiscResources(type: Copy) { into "src/net/osmand/osm" from("../../resources/obf_creation") { include "rendering_types.xml" } from("../../resources/poi") { include "poi_types.xml" } } task collectRenderingStylesResources(type: Sync) { from "../../resources/rendering_styles" into "src/net/osmand/render" include "*.xml" } task collectRegionsInfoResources(type: Copy) { from "../../resources/countries-info" into "src/net/osmand/map" include "regions.ocbf" } task copyStyleIcons(type: Copy) { from "../../resources/rendering_styles/style-icons/" into "res/" include "**/*.png" } task collectExternalResources << {} collectExternalResources.dependsOn collectVoiceAssets, collectHelpContentsAssets, collectRoutingResources, collectRenderingStylesResources, collectRegionsInfoResources, collectMiscResources, copyStyleIcons, updateNoTranslate // tasks.whenTaskAdded { task -> // if (task.name.startsWith("generate") && task.name.endsWith("Resources")) { // task.dependsOn collectExternalResources // } // } // Legacy core build import org.apache.tools.ant.taskdefs.condition.Os task buildOsmAndCore(type: Exec) { description "Build Legacy OsmAndCore" if (!Os.isFamily(Os.FAMILY_WINDOWS)) { commandLine "bash", file("./old-ndk-build.sh").getAbsolutePath() } else { commandLine "cmd", "/c", "echo", "Not supported" } } task cleanupDuplicatesInCore() { dependsOn buildOsmAndCore // doesn't work for legacy debug builds doLast { file("libgnustl/armeabi").mkdirs() file("libs/armeabi/libgnustl_shared.so").renameTo(file("libgnustl/armeabi/libgnustl_shared.so")) file("libgnustl/armeabi-v7a").mkdirs() file("libs/armeabi-v7a/libgnustl_shared.so").renameTo(file("libgnustl/armeabi-v7a/libgnustl_shared.so")) file("libgnustl/mips").mkdirs() file("libs/mips/libgnustl_shared.so").renameTo(file("libgnustl/mips/libgnustl_shared.so")) file("libgnustl/x86").mkdirs() file("libs/x86/libgnustl_shared.so").renameTo(file("libgnustl/x86/libgnustl_shared.so")) } } tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn << [collectExternalResources, buildOsmAndCore, cleanupDuplicatesInCore] } clean.dependsOn 'cleanNoTranslate' task cleanNoTranslate() { delete ('res/values/no_translate.xml') } repositories { ivy { name = "OsmAndBinariesIvy" url = "http://builder.osmand.net" layout "pattern", { artifact "ivy/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" } } // mavenCentral() } dependencies { compile project(path: ":OsmAnd-java", configuration: "android") compile project(":eclipse-compile:appcompat") compile fileTree( dir: "libs", include: ["*.jar"], exclude: [ "QtAndroid-bundled.jar", "QtAndroidAccessibility-bundled.jar", "OsmAndCore_android.jar", "OsmAndCore_wrapper.jar"]) // compile "com.github.ksoichiro:android-observablescrollview:1.5.0" // compile "com.android.support:appcompat-v7:21.0.3" // compile "com.github.shell-software:fab:1.0.5" legacyCompile "net.osmand:OsmAndCore_android:0.1-SNAPSHOT@jar" qtcoredebugCompile "net.osmand:OsmAndCore_androidNativeDebug:0.1-SNAPSHOT@aar" qtcoredebugCompile "net.osmand:OsmAndCore_android:0.1-SNAPSHOT@aar" qtcoreCompile "net.osmand:OsmAndCore_androidNativeRelease:0.1-SNAPSHOT@aar" qtcoreCompile "net.osmand:OsmAndCore_android:0.1-SNAPSHOT@aar" } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/osmandapp/osmand/gradle/0000755000175000017500000000000014620351546023253 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/source-files/osmandapp/osmand/gradle/wrapper/0000755000175000017500000000000014620351546024733 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/osmandapp/osmand/gradle/wrapper/gradle-wrapper.properties0000644000175000017500000000035114620351225031756 0ustar00hanshans#Mon Sep 01 10:23:06 EEST 2014 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/realm/0000755000175000017500000000000014620351546017652 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/realm/react-native/0000755000175000017500000000000014620351546022234 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/source-files/realm/react-native/android/0000755000175000017500000000000014620351546023654 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/realm/react-native/android/build.gradle0000644000175000017500000003202314620351225026125 0ustar00hanshansbuildscript { repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.1.4' classpath 'de.undercouch:gradle-download-task:1.2' } } allprojects { repositories { google() jcenter() mavenLocal() maven { // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm url "$projectDir/../../tests/react-test-app/node_modules/react-native/android" } } } apply plugin: 'com.android.library' apply plugin: 'maven' apply plugin: 'signing' apply plugin: 'de.undercouch.download' import de.undercouch.gradle.tasks.download.Download import org.apache.tools.ant.taskdefs.condition.Os import org.apache.tools.ant.filters.ReplaceTokens // We download various C++ open-source dependencies into downloads. // We then copy both the downloaded code and our custom makefiles and headers into third-party-ndk. // After that we build native code from src/main/jni with module path pointing at third-party-ndk. ext.coreVersion = getDependenciesVersion("REALM_CORE_VERSION").trim() ext.syncVersion = getDependenciesVersion("REALM_SYNC_VERSION").trim() def currentVersion = getDependenciesVersion("VERSION").trim() println "Realm Core Version: $ext.coreVersion" println "Realm Sync Version: $ext.syncVersion" def downloadsDir = new File("$projectDir/downloads") def jscDownloadDir = new File("$projectDir/src/main/jni/jsc") def coreDownloadDir = new File("$projectDir/src/main/jni") def publishDir = new File("$projectDir/../../android/") // to build with sync run: ./gradlew assembleDebug -PbuildWithSync=true ext.buildSync = project.hasProperty('buildWithSync') ? project.getProperty('buildWithSync').toBoolean() : true task generateVersionClass(type: Copy) { from 'src/main/templates/Version.java' into 'build/generated-src/main/java/io/realm/react' filter(ReplaceTokens, tokens: [version: currentVersion]) outputs.upToDateWhen { false } } task createNativeDepsDirectories { downloadsDir.mkdirs() } task downloadJSCHeaders(type: Download) { def jscAPIBaseURL = 'https://svn.webkit.org/repository/webkit/!svn/bc/174650/trunk/Source/JavaScriptCore/API/' def jscHeaderFiles = ['JSBase.h', 'JSContextRef.h', 'JSObjectRef.h', 'JSRetainPtr.h', 'JSStringRef.h', 'JSValueRef.h', 'WebKitAvailability.h'] def output = new File(jscDownloadDir, 'JavaScriptCore') output.mkdirs() src(jscHeaderFiles.collect { headerName -> "$jscAPIBaseURL$headerName" }) onlyIfNewer true overwrite false dest output } task downloadRealmCore(type: Download) { if (project.buildSync) { src "https://static.realm.io/downloads/sync/realm-sync-android-${project.syncVersion}.tar.gz" } else { src "https://static.realm.io/downloads/core/realm-core-android-${project.coreVersion}.tar.gz" } onlyIfNewer true overwrite true if (project.buildSync) { dest new File(downloadsDir, "realm-core-android-${project.syncVersion}.tar.gz") } else { dest new File(downloadsDir, "realm-core-android-${project.coreVersion}.tar.gz") } } task prepareRealmCore(dependsOn: downloadRealmCore, type:Copy) { from tarTree(downloadRealmCore.dest) into "$coreDownloadDir/core" rename { String fileName -> fileName.replace("-arm-", "-armeabi-") } } task downloadOpenSSL_x86(type: Download) { src "https://static.realm.io/downloads/openssl/1.0.2k/Android/x86/openssl-release-1.0.2k-Android-x86.tar.gz" onlyIfNewer true overwrite true dest new File(downloadsDir, "openssl-release-1.0.2k-Android-x86.tar.gz") } task prepareOpenSSL_x86(dependsOn: downloadOpenSSL_x86, type:Copy) { from tarTree(downloadOpenSSL_x86.dest) into "$coreDownloadDir/core" } task downloadOpenSSL_arm(type: Download) { src "https://static.realm.io/downloads/openssl/1.0.2k/Android/armeabi-v7a/openssl-release-1.0.2k-Android-armeabi-v7a.tar.gz" onlyIfNewer true overwrite true dest new File(downloadsDir, "openssl-release-1.0.2k-Android-armeabi-v7a.tar.gz") } task prepareOpenSSL_arm(dependsOn: downloadOpenSSL_arm, type:Copy) { from tarTree(downloadOpenSSL_arm.dest) into "$coreDownloadDir/core" rename { String fileName -> fileName.replace("-arm-", "-armeabi-") } } def getDependenciesVersion(keyName) { def inputFile = new File(buildscript.sourceFile.getParent() + "/../../dependencies.list") def line inputFile.withReader { reader -> while ((line = reader.readLine())!=null) { def (key, value) = line.tokenize('=') if (keyName == key) { return value } } throw new GradleException("${keyName} not found in dependencies.list.") } } def getNdkBuildName() { if (Os.isFamily(Os.FAMILY_WINDOWS)) { return "ndk-build.cmd" } else { return "ndk-build" } } def findNdkBuildFullPath() { // we allow to provide full path to ndk-build tool if (hasProperty('ndk.command')) { return property('ndk.command') } // or just a path to the containing directory if (hasProperty('ndk.path')) { def ndkDir = property('ndk.path') return new File(ndkDir, getNdkBuildName()).getAbsolutePath() } if (System.getenv('ANDROID_NDK') != null) { def ndkDir = System.getenv('ANDROID_NDK') return new File(ndkDir, getNdkBuildName()).getAbsolutePath() } if (System.getenv('ANDROID_NDK_HOME') != null) { def ndkDir = System.getenv('ANDROID_NDK_HOME') return new File(ndkDir, getNdkBuildName()).getAbsolutePath() } def ndkDir = android.hasProperty('plugin') ? android.plugin.ndkFolder : plugins.getPlugin('com.android.library').sdkHandler.getNdkFolder() if (ndkDir) { return new File(ndkDir, getNdkBuildName()).getAbsolutePath() } return null } def checkNdkVersion(ndkBuildFullPath) { def ndkPath = new File(ndkBuildFullPath).getParent() def detectedNdkVersion def releaseFile = new File(ndkPath, 'RELEASE.TXT') def propertyFile = new File(ndkPath, 'source.properties') if (releaseFile.isFile()) { detectedNdkVersion = releaseFile.text.trim().split()[0].split('-')[0] } else if (propertyFile.isFile()) { detectedNdkVersion = getValueFromPropertiesFile(propertyFile, 'Pkg.Revision') if (detectedNdkVersion == null) { throw new GradleException("Failed to obtain the NDK version information from ${ndkPath}/source.properties") } } else { throw new GradleException("Neither ${releaseFile.getAbsolutePath()} nor ${propertyFile.getAbsolutePath()} is a file.") } if (detectedNdkVersion != project.ndkVersion) { throw new GradleException("Your NDK version: ${detectedNdkVersion}." + " Realm JNI must be compiled with the version ${project.ndkVersion} of NDK.") } } static def getValueFromPropertiesFile(File propFile, String key) { if (!propFile.isFile() || !propFile.canRead()) { return null } def prop = new Properties() def reader = propFile.newReader() try { prop.load(reader) } finally { reader.close() } return prop.get(key) } def getNdkBuildFullPath() { def ndkBuildFullPath = findNdkBuildFullPath() if (ndkBuildFullPath == null) { throw new GradleScriptException( "ndk-build binary cannot be found, check if you've set " + "\$ANDROID_NDK environment variable correctly or if ndk.dir is " + "setup in local.properties", null) } if (!new File(ndkBuildFullPath).canExecute()) { throw new GradleScriptException( "ndk-build binary " + ndkBuildFullPath + " doesn't exist or isn't executable.\n" + "Check that the \$ANDROID_NDK environment variable, or ndk.dir in local.proerties, is set correctly.\n" + "(On Windows, make sure you escape backslashes in local.properties or use forward slashes, e.g. C:\\\\ndk or C:/ndk rather than C:\\ndk)", null) } checkNdkVersion(ndkBuildFullPath); return ndkBuildFullPath } task buildReactNdkLib(dependsOn: [downloadJSCHeaders,prepareRealmCore,prepareOpenSSL_x86,prepareOpenSSL_arm], type: Exec) { inputs.files('src/main/jni') outputs.dir("$buildDir/realm-react-ndk/all") commandLine getNdkBuildFullPath(), '-e', project.buildSync ? 'BUILD_TYPE_SYNC=1' : 'BUILD_TYPE_SYNC=0', 'NDK_PROJECT_PATH=null', "NDK_APPLICATION_MK=$projectDir/src/main/jni/Application.mk", 'NDK_OUT=' + temporaryDir, "NDK_LIBS_OUT=$buildDir/realm-react-ndk/all", '-C', file('src/main/jni').absolutePath, 'NDK_LOG=1', 'NDK_DEBUG=' + (DEBUG_BUILD.toBoolean() ? '1' : '0'), '--jobs', Runtime.runtime.availableProcessors(), 'V=1' } task cleanReactNdkLib(type: Exec) { commandLine getNdkBuildFullPath(), '-C', file('src/main/jni').absolutePath, 'clean' } task packageReactNdkLibs(dependsOn: buildReactNdkLib, type: Copy) { from "$buildDir/realm-react-ndk/all" exclude '**/libjsc.so' exclude '**/gdbserver' exclude '**/gdb.setup' into "$buildDir/realm-react-ndk/exported" } android { compileSdkVersion 26 defaultConfig { minSdkVersion 16 targetSdkVersion 26 } sourceSets.main { java.srcDir "$buildDir/generated-src/main/java" jni.srcDirs = [] jniLibs.srcDir "$buildDir/realm-react-ndk/exported" res.srcDirs = ['src/main/res/devsupport', 'src/main/res/shell'] } tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn generateVersionClass, packageReactNdkLibs } clean.dependsOn cleanReactNdkLib lintOptions { abortOnError false } } task publishAndroid(dependsOn: [generateVersionClass, packageReactNdkLibs], type: Sync) { // Copy task can only have one top level into "$publishDir" // copy java source into ('/src/main') { from "$projectDir/src/main", "$buildDir/generated-src/main" exclude '**/jni/**', '**/templates/**' } // add compiled shared object into ('/src/main/jniLibs') { from "$buildDir/realm-react-ndk/exported/" } // copy gradle wrapper files FileTree gradleWrapper = fileTree(projectDir).include('gradlew*').include('gradle/**') into ('/') { from gradleWrapper } // copy and rename template build.gradle into ('/') { from "$projectDir/publish_android_template" rename { String fileName -> 'build.gradle' } } // copy analytics script into ('/') { from "$projectDir/analytics_template" rename { String fileName -> 'analytics.gradle' } } } // publishing into maven local def configureRealmReactNativePom(def pom) { pom.project { name POM_NAME artifactId POM_ARTIFACT_ID packaging POM_PACKAGING description POM_DESCRIPTION url 'https://github.com/realm/realm-js' issueManagement { system 'github' url 'https://github.com/realm/realm-js/issues' } scm { url 'scm:https://github.com/realm/realm-js' connection 'scm:git@github.com:realm/realm-js.git' developerConnection 'scm:git@github.com:realm/realm-js.git' } licenses { license { name 'The Apache Software License, Version 2.0' url 'http://www.apache.org/licenses/LICENSE-2.0.txt' distribution 'repo' } } } } afterEvaluate { project -> task androidSourcesJar(type: Jar) { classifier = 'sources' from android.sourceSets.main.java.srcDirs include '**/*.java' } android.libraryVariants.all { variant -> def name = variant.name.capitalize() task "jar${name}"(type: Jar, dependsOn: variant.javaCompile) { from variant.javaCompile.destinationDir } } artifacts { archives androidSourcesJar } version = currentVersion group = GROUP signing { required { false } sign configurations.archives } task installArchives(type: Upload) { configuration = configurations.archives repositories.mavenDeployer { beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } repository url: "file://${System.properties['user.home']}/.m2/repository" configureRealmReactNativePom pom } } } def dependencyType = "implementation" def providedDependencyType = "compileOnly" try { project.getConfigurations().getByName("implementation") } catch (UnknownConfigurationException e) { // Pre 3.0 Android Gradle Plugin dependencyType = "compile" providedDependencyType = "provided" } project.dependencies { add(providedDependencyType, 'com.squareup.okhttp3:okhttp:3.9.0') add(providedDependencyType, 'com.facebook.react:react-native:+') add(dependencyType, 'org.nanohttpd:nanohttpd:2.2.0') } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/source-files/se.manyver/0000755000175000017500000000000014620351546020641 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/source-files/se.manyver/android/0000755000175000017500000000000014620351546022261 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/source-files/se.manyver/android/app/0000755000175000017500000000000014620351546023041 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/se.manyver/android/app/build.gradle0000644000175000017500000002503514620351225025317 0ustar00hanshansapply plugin: "com.android.application" import com.android.build.OutputFile /** * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets * and bundleReleaseJsAndAssets). * These basically call `react-native bundle` with the correct arguments during the Android build * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the * bundle directly from the development server. Below you can see all the possible configurations * and their defaults. If you decide to add a configuration block, make sure to add it before the * `apply from: "../../node_modules/react-native/react.gradle"` line. * * project.ext.react = [ * // the name of the generated asset file containing your JS bundle * bundleAssetName: "index.android.bundle", * * // the entry file for bundle generation * entryFile: "index.android.js", * * // https://facebook.github.io/react-native/docs/performance#enable-the-ram-format * bundleCommand: "ram-bundle", * * // whether to bundle JS and assets in debug mode * bundleInDebug: false, * * // whether to bundle JS and assets in release mode * bundleInRelease: true, * * // whether to bundle JS and assets in another build variant (if configured). * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants * // The configuration property can be in the following formats * // 'bundleIn${productFlavor}${buildType}' * // 'bundleIn${buildType}' * // bundleInFreeDebug: true, * // bundleInPaidRelease: true, * // bundleInBeta: true, * * // whether to disable dev mode in custom build variants (by default only disabled in release) * // for example: to disable dev mode in the staging build type (if configured) * devDisabledInStaging: true, * // The configuration property can be in the following formats * // 'devDisabledIn${productFlavor}${buildType}' * // 'devDisabledIn${buildType}' * * // the root of your project, i.e. where "package.json" lives * root: "../../", * * // where to put the JS bundle asset in debug mode * jsBundleDirDebug: "$buildDir/intermediates/assets/debug", * * // where to put the JS bundle asset in release mode * jsBundleDirRelease: "$buildDir/intermediates/assets/release", * * // where to put drawable resources / React Native assets, e.g. the ones you use via * // require('./image.png')), in debug mode * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug", * * // where to put drawable resources / React Native assets, e.g. the ones you use via * // require('./image.png')), in release mode * resourcesDirRelease: "$buildDir/intermediates/res/merged/release", * * // by default the gradle tasks are skipped if none of the JS files or assets change; this means * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to * // date; if you have any other folders that you want to ignore for performance reasons (gradle * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/ * // for example, you might want to remove it from here. * inputExcludes: ["android/**", "ios/**"], * * // override which node gets called and with what additional arguments * nodeExecutableAndArgs: ["node"], * * // supply additional arguments to the packager * extraPackagerArgs: [] * ] */ project.ext.vectoricons = [ iconFontNames: [ 'MaterialIcons.ttf', 'MaterialCommunityIcons.ttf' ] ] project.ext.react = [ entryFile: "index.android.js", enableHermes: false, // clean and rebuild if changing hermesCommand: "../../node_modules/hermes-engine/%OS-BIN%/hermes", ] apply from: "../../node_modules/react-native-vector-icons/fonts.gradle" apply from: "../../node_modules/react-native/react.gradle" /** * Set this to true to create two separate APKs instead of one: * - An APK that only works on ARM devices * - An APK that only works on x86 devices * The advantage is the size of the APK is reduced by about 4MB. * Upload all the APKs to the Play Store and people will download * the correct one based on the CPU architecture of their device. */ def enableSeparateBuildPerCPUArchitecture = false /** * Run Proguard to shrink the Java bytecode in release builds. */ def enableProguardInReleaseBuilds = false /** * The preferred build flavor of JavaScriptCore. * * For example, to use the international variant, you can use: * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` * * The international variant includes ICU i18n library and necessary data * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that * give correct results when using with locales other than en-US. Note that * this variant is about 6MiB larger per architecture than default. */ def jscFlavor = 'org.webkit:android-jsc:+' /** * Whether to enable the Hermes VM. * * This should be set on project.ext.react and mirrored here. If it is not set * on project.ext.react, JavaScript will not be compiled to Hermes Bytecode * and the benefits of using Hermes will therefore be sharply reduced. */ def enableHermes = project.ext.react.get("enableHermes", false); android { compileSdkVersion rootProject.ext.compileSdkVersion compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } flavorDimensions "store" defaultConfig { versionCode 78 versionName "0.1911.27-beta" applicationId "se.manyver" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion missingDimensionStrategy "RNN.reactNativeVersion", "reactNative60" ndk { abiFilters "armeabi-v7a", "arm64-v8a" // , "x86", "x86_64" } aaptOptions { ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:!CVS:!thumbs.db:!picasa.ini:!*~' } vectorDrawables.useSupportLibrary = true } // dexOptions { // javaMaxHeapSize "4g" // } productFlavors { indie { dimension "store" } googlePlay { dimension "store" versionNameSuffix "-googlePlay" targetSdkVersion rootProject.ext.targetSdkVersionForGooglePlay } } signingConfigs { // debug { // storeFile file('debug.keystore') // storePassword 'android' // keyAlias 'androiddebugkey' // keyPassword 'android' // } release { if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) { storeFile file(MYAPP_RELEASE_STORE_FILE) storePassword MYAPP_RELEASE_STORE_PASSWORD keyAlias MYAPP_RELEASE_KEY_ALIAS keyPassword MYAPP_RELEASE_KEY_PASSWORD } } } splits { abi { reset() enable enableSeparateBuildPerCPUArchitecture universalApk false // If true, also generate a universal APK include "armeabi-v7a", "arm64-v8a"//, "x86", "x86_64" } } buildTypes { debug { signingConfig signingConfigs.debug } release { // Caution! In production, you need to generate your own keystore file. // see https://facebook.github.io/react-native/docs/signed-apk-android. // signingConfig signingConfigs.debug minifyEnabled enableProguardInReleaseBuilds proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) { signingConfig signingConfigs.release } } } // applicationVariants are e.g. debug, release applicationVariants.all { variant -> variant.outputs.each { output -> // For each separate APK per architecture, set a unique version code as described here: // https://developer.android.com/studio/build/configure-apk-splits.html def versionCodes = ["armeabi-v7a": 1, "arm64-v8a": 2] //, "x86":3, "x86_64":4] def abi = output.getFilter(OutputFile.ABI) if (abi != null) { // null for the universal-debug, universal-release variants output.versionCodeOverride = versionCodes.get(abi) * 1048576 + defaultConfig.versionCode } } } } def acraVersion = '5.3.0' dependencies { implementation "ch.acra:acra-core:$acraVersion" implementation "ch.acra:acra-mail:$acraVersion" implementation "ch.acra:acra-dialog:$acraVersion" implementation project(':nodejs-mobile-react-native') implementation project(':@react-native-community_async-storage') implementation project(':react-native-bluetooth-socket-bridge') implementation project(':react-native-bluetooth-status') implementation project(':react-native-dialogs') implementation project(':react-native-vector-icons') implementation project(':react-native-os-staltz') implementation project(':react-native-randombytes') implementation project(':react-native-image-crop-picker') implementation project(':react-native-navigation') implementation project(':react-native-android-local-notification') implementation project(':react-native-android-wifi') implementation project(':react-native-has-internet') implementation project(':react-native-flag-secure-android') implementation project(':react-native-orientation-locker') implementation project(':react-native-fs') implementation project(':react-native-splash-screen') implementation project(':@react-native-community_viewpager') implementation fileTree(dir: "libs", include: ["*.jar"]) implementation 'androidx.appcompat:appcompat:1.0.2' implementation("com.facebook.react:react-native:+") { force = true } implementation 'com.facebook.fresco:animated-gif:1.3.0' if (enableHermes) { def hermesPath = "../../node_modules/hermes-engine/android/"; debugImplementation files(hermesPath + "hermes-debug.aar") releaseImplementation files(hermesPath + "hermes-release.aar") } else { implementation jscFlavor } } // Run this once to be able to run the application with BUCK // puts all compile dependencies into folder libs for BUCK to use task copyDownloadableDepsToLibs(type: Copy) { from configurations.compile into 'libs' } apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/se.manyver/android/build.gradle0000644000175000017500000000372614620351225024542 0ustar00hanshans// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ext { minSdkVersion = 21 targetSdkVersion = 26 targetSdkVersionForGooglePlay = 28 compileSdkVersion = 28 } repositories { google() jcenter() mavenLocal() mavenCentral() } dependencies { classpath("com.android.tools.build:gradle:3.4.2") // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { mavenCentral() mavenLocal() maven { // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm url("$rootDir/../node_modules/react-native/android") } maven { // Android JSC is installed from npm url("$rootDir/../node_modules/jsc-android/dist") } maven { url 'https://maven.google.com' } maven { url "https://jitpack.io" } google() jcenter() } } subprojects { subproject -> afterEvaluate { if ((subproject.plugins.hasPlugin('android') || subproject.plugins.hasPlugin('android-library'))) { android { variantFilter { variant -> def names = variant.flavors*.name if (names.contains("reactNative51")) setIgnore(true) if (names.contains("reactNative55")) setIgnore(true) if (names.contains("reactNative56")) setIgnore(true) if (names.contains("reactNative57")) setIgnore(true) if (names.contains("reactNative57_5")) setIgnore(true) if (names.contains("reactNative57WixFork")) setIgnore(true) if (names.contains("reactNative59")) setIgnore(true) } } } } } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/se.manyver/android/gradle/0000755000175000017500000000000014620351546023517 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/source-files/se.manyver/android/gradle/wrapper/0000755000175000017500000000000014620351546025177 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/se.manyver/android/gradle/wrapper/gradle-wrapper.properties0000644000175000017500000000030714620351225032223 0ustar00hanshansdistributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-5.5-all.zip././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/se.manyver/android/gradle.properties0000644000175000017500000000165214620351225025633 0ustar00hanshans# Project-wide Gradle settings. # IDE (e.g. Android Studio) users: # Gradle settings configured through the IDE *will override* # any settings specified in this file. # For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. # Default value: -Xmx10248m -XX:MaxPermSize=256m # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true android.useAndroidX=true android.enableJetifier=true org.gradle.jvmargs=-Xmx4608M././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/se.manyver/android/settings.gradle0000644000175000017500000000663714620351225025307 0ustar00hanshansrootProject.name = 'Manyverse' apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) include ':@react-native-community_async-storage' project(':@react-native-community_async-storage').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/async-storage/android') include ':react-native-bluetooth-status' project(':react-native-bluetooth-status').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-bluetooth-status/android') include ':react-native-bluetooth-socket-bridge' project(':react-native-bluetooth-socket-bridge').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-bluetooth-socket-bridge/android') include ':react-native-image-crop-picker' project(':react-native-image-crop-picker').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-image-crop-picker/android') include ':nodejs-mobile-react-native' project(':nodejs-mobile-react-native').projectDir = new File(rootProject.projectDir, '../node_modules/nodejs-mobile-react-native/android') include ':react-native-dialogs' project(':react-native-dialogs').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-dialogs/android') include ':react-native-vector-icons' project(':react-native-vector-icons').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-vector-icons/android') include ':react-native-os-staltz' project(':react-native-os-staltz').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-os-staltz/android') include ':react-native-randombytes' project(':react-native-randombytes').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-randombytes/android') include ':react-native-navigation' project(':react-native-navigation').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-navigation/lib/android/app/') include ':react-native-android-local-notification' project(':react-native-android-local-notification').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-android-local-notification/android') include ':react-native-android-wifi' project(':react-native-android-wifi').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-android-wifi/android') include ':react-native-has-internet' project(':react-native-has-internet').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-has-internet/android') include ':react-native-flag-secure-android' project(':react-native-flag-secure-android').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-flag-secure-android/android') include ':react-native-orientation-locker', ':app' project(':react-native-orientation-locker').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-orientation-locker/android') include ':react-native-fs' project(':react-native-fs').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-fs/android') include ':react-native-splash-screen' project(':react-native-splash-screen').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-splash-screen/android') include ':@react-native-community_viewpager' project(':@react-native-community_viewpager').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/viewpager/android') include ':app' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/se.manyver/app.json0000644000175000017500000000007014620351225022303 0ustar00hanshans{ "name": "Manyverse", "displayName": "Manyverse" } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/se.manyver/index.android.js0000644000175000017500000000107314620351225023720 0ustar00hanshans/* Copyright (C) 2018-2019 The Manyverse Authors. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ import 'react-native-ssb-shims'; import {run} from 'cycle-native-navigation'; import { screens, drivers, welcomeLayout, defaultNavOptions, } from './lib/frontend/index'; // import './snoopy'; // Log and debug the React Native JS<-->Native Bridge run(screens, drivers, welcomeLayout, defaultNavOptions); ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/se.manyver/package.json0000644000175000017500000001216514620351225023126 0ustar00hanshans{ "name": "manyverse", "version": "0.1911.27-beta", "private": true, "scripts": { "postinstall": "patch-package", "lib": "tsc", "clean-bundler": "watchman watch-del-all && rm -rf $TMPDIR/react-*", "clean-android": "adb uninstall se.manyver && cd android && ./gradlew clean", "full-clean": "npm run clean-android && npm run clean-bundler && rm -rf node_modules && rm -rf lib", "propagate-replacements": "propagate-replacement-fields --field=react-native", "build-backend": "./tools/build-backend && ./tools/minify-backend", "build-android-assets": "npm run lib && npm run propagate-replacements && npm run build-backend", "build-android-debug": "npm run build-android-assets && react-native run-android --variant=indieDebug", "build-android-release": "npm run build-android-assets && cd android && ./gradlew assembleRelease && cd ..", "start": "npm run lib && npm run propagate-replacements && react-native start", "psdr": "./tools/print-service-desk-report.js", "test-e2e-android": "./tools/test-e2e-android", "changelog": "npm run update-repo-changelog && npm run update-dat-latest-readme", "update-repo-changelog": "./tools/update-repo-changelog.js", "update-dat-latest-readme": "./tools/update-dat-latest-readme.js", "echo-ssb-post": "./tools/echo-ssb-post.js", "update-version": "./tools/update-version.js", "dat-release": "./tools/dat-release", "commit-release": "./tools/commit-release", "release": "npm run update-version && npm run clean-bundler && npm run clean-android && npm run build-android-release && npm run test-e2e-android && npm run changelog && npm run commit-release && npm run dat-release && npm run echo-ssb-post" }, "dependencies": { "@cycle/isolate": "5.1.0", "@cycle/react": "2.6.0", "@cycle/run": "5.3.0", "@cycle/state": "1.3.0", "@react-native-community/viewpager": "3.1.0", "@types/node": "~12.7.5", "@types/react": "16.9.x", "@types/react-native": "0.60.23", "@types/react-native-vector-icons": "6.4.3", "buffer": "5.4.3", "color-hash": "1.0.3", "cycle-native-alert": "1.1.0", "cycle-native-android-local-notification": "1.1.0", "cycle-native-asyncstorage": "2.0.0", "cycle-native-clipboard": "1.0.0", "cycle-native-keyboard": "1.2.0", "cycle-native-linking": "1.1.0", "cycle-native-navigation": "6.1.0", "cycle-native-share": "1.1.0", "cycle-native-toastandroid": "1.1.0", "mdast-normalize-react-native": "3.2.x", "nodejs-mobile-react-native": "0.5.0", "path": "~0.12.7", "promisify-tuple": "1.0.0", "pull-flat-list": "2.10.0", "pull-pushable": "2.2.0", "pull-stream": "3.6.14", "pull-thenable": "1.0.0", "react": "16.9.0", "react-human-time": "^1.1.0", "react-markdown": "4.0.2", "react-native": "0.61.5", "react-native-android-local-notification": "3.0.0", "react-native-android-wifi": "0.0.41", "react-native-bluetooth-socket-bridge": "1.2.0", "react-native-bluetooth-status": "1.3.0", "react-native-dialogs": "1.1.0", "react-native-flag-secure-android": "1.0.2", "react-native-floating-action": "1.19.1", "react-native-fs": "~2.16.2", "react-native-has-internet": "4.0.0", "react-native-image-crop-picker": "~0.26.1", "react-native-image-view": "~2.1.6", "react-native-navigation": "4.0.2", "react-native-orientation-locker": "1.1.7", "react-native-popup-menu": "0.15.6", "react-native-splash-screen": "^3.2.0", "react-native-ssb-client": "7.0.0", "react-native-ssb-shims": "4.6.0", "react-native-swiper": "1.5.14", "react-native-vector-icons": "6.6.0", "react-propify-methods": "16.3.1", "react-xstream-hoc": "1.0.0", "remark": "~9.0.0", "remark-gemoji-to-emoji": "1.1.0", "remark-images-to-ssb-serve-blobs": "2.1.0-1", "remark-linkify-regex": "1.0.0", "remark-ssb-mentions": "~2.0.0", "rn-viewpager": "1.2.9", "ssb-cached-about": "~1.0.0", "ssb-conn-query": "~0.4.4", "ssb-ref": "2.13.9", "ssb-room": "~1.1.1", "ssb-serve-blobs": "2.1.0", "ssb-threads": "3.6.0", "ssb-typescript": "1.4.0", "xstream": "11.11.0", "xstream-backoff": "1.0", "xstream-between": "1.0", "xstream-from-callback": "1.0", "xstream-from-pull-stream": "1.1", "xstream-sample": "1.0" }, "devDependencies": { "@babel/core": "~7.7.2", "@babel/runtime": "~7.7.2", "add-stream": "~1.0.0", "conventional-changelog": "~3.1.15", "husky": "^3.1.0", "into-stream": "~5.1.1", "jase": "1.2.0", "left-pad": "1.3.0", "metro-react-native-babel-preset": "^0.56.0", "patch-package": "6.2.0", "prettier": "~1.19.1", "pretty-quick": "~2.0.1", "propagate-replacement-fields": "1.2.0", "react-native-version": "3.2.0", "rn-snoopy": "2.0.2", "tslint": "~5.20.1", "typescript": "~3.7.2" }, "optionalDependencies": { "appium": "1.14.0", "tap-spec": "5.0.0", "tape": "~4.9.1", "wd": "1.11.3" }, "husky": { "hooks": { "pre-commit": "pretty-quick --staged --pattern \"**/*.*(ts|tsx|js|jsx)\"" } }, "react-native": { "os": "react-native-os-staltz" } } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/se.manyver/react-native.config.js0000644000175000017500000000102314620351225025013 0ustar00hanshansmodule.exports = { dependencies: { 'nodejs-mobile-react-native': { // Ignored because we need to set this up manually in order to // call some APIs of this library directly in our MainActivity.java platforms: { android: null, }, }, 'react-native-bluetooth-socket-bridge': { // This package needs some config passed as arguments to the constructor // so we need to "link" it manually in MainApplication.java platforms: { android: null, }, }, }, }; ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/source-files/ut.ewh.audiometrytest/0000755000175000017500000000000014620351546023045 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/source-files/ut.ewh.audiometrytest/app/0000755000175000017500000000000014620351546023625 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/ut.ewh.audiometrytest/app/build.gradle0000644000175000017500000000214714620351225026102 0ustar00hanshansapply plugin: 'android' android { compileSdkVersion 21 buildToolsVersion "21.1.1" defaultConfig { minSdkVersion 8 targetSdkVersion 21 versionCode 14 versionName "1.65" } signingConfigs{ releaseSign{ storeFile file("/Users/reecestevens/keys/keystore.jks") //storePassword System.console().readLine("\nKeystore password: ") storePassword System.getenv("KSTOREPWD") keyAlias "AppKey" //keyPassword System.console().readLine("\nKey password: ") keyPassword System.getenv("KEYPWD") } } buildTypes { release { minifyEnabled true; debuggable false signingConfig signingConfigs.releaseSign proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } } repositories { maven { url "https://jitpack.io" } } dependencies { compile 'com.android.support:appcompat-v7:21.0.2' compile 'com.github.PhilJay:MPAndroidChart:v2.0.9' compile fileTree(dir: 'libs', include: ['*.jar']) } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/ut.ewh.audiometrytest/app/src/0000755000175000017500000000000014620351546024414 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/source-files/ut.ewh.audiometrytest/app/src/main/0000755000175000017500000000000014620351546025340 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/ut.ewh.audiometrytest/app/src/main/AndroidManifest.xml0000644000175000017500000001314114620351225031123 0ustar00hanshans ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/ut.ewh.audiometrytest/build.gradle0000644000175000017500000000104414620351225025315 0ustar00hanshans// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:1.0.0-rc4' } } allprojects { repositories { mavenCentral() } } buildscript { repositories { mavenCentral() } dependencies { classpath 'org.owasp:dependency-check-gradle:1.3.2.1' } } apply plugin: 'org.owasp.dependencycheck' dependencyCheck { format='JSON' } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/ut.ewh.audiometrytest/settings.gradle0000644000175000017500000000001714620351225026055 0ustar00hanshansinclude ':app' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/yuriykulikov/0000755000175000017500000000000014620351546021340 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/yuriykulikov/AlarmClock/0000755000175000017500000000000014620351546023350 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/source-files/yuriykulikov/AlarmClock/gradle/0000755000175000017500000000000014620351546024606 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/source-files/yuriykulikov/AlarmClock/gradle/wrapper/0000755000175000017500000000000014620351546026266 5ustar00hanshans././@PaxHeader0000000000000000000000000000020600000000000010213 xustar00112 path=fdroidserver-2.3a1/tests/source-files/yuriykulikov/AlarmClock/gradle/wrapper/gradle-wrapper.properties 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/source-files/yuriykulikov/AlarmClock/gradle/wrapper/gradle-wrapper.properti0000644000175000017500000000035614620351225032766 0ustar00hanshans#Wed Jan 30 10:59:12 CET 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/stats/0000755000175000017500000000000014620351546015310 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/stats/known_apks.txt0000644000175000017500000000216214620351225020216 0ustar00hanshanscom.example.test.helloworld_1.apk com.example.test.helloworld 2023-02-17 com.politedroid_3.apk com.politedroid 2017-06-23 com.politedroid_4.apk com.politedroid 2017-06-23 com.politedroid_5.apk com.politedroid 2017-06-23 com.politedroid_6.apk com.politedroid 2017-06-23 duplicate.permisssions_9999999.apk duplicate.permisssions 2017-12-22 fake.ota.update_1234.zip fake.ota.update 2016-03-10 info.zwanenburg.caffeinetile_4.apk info.zwanenburg.caffeinetile 2018-10-10 no.min.target.sdk_987.apk no.min.target.sdk 2018-10-10 obb.main.oldversion_1444412523.apk obb.main.oldversion 2013-12-31 obb.main.twoversions_1101613.apk obb.main.twoversions 2015-10-12 obb.main.twoversions_1101615.apk obb.main.twoversions 2016-01-01 obb.main.twoversions_1101617.apk obb.main.twoversions 2016-06-20 obb.mainpatch.current_1619.apk obb.mainpatch.current 2016-04-23 obb.mainpatch.current_1619_another-release-key.apk obb.mainpatch.current 2017-06-01 souch.smsbypass_9.apk souch.smsbypass 2018-04-26 urzip-; Рахма́, [rɐxˈmanʲɪnəf] سيرجي_رخمانينوف 谢·.apk info.guardianproject.urzip 2016-06-23 v1.v2.sig_1020.apk v1.v2.sig 2023-02-17 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/test-gradlew-fdroid0000755000175000017500000000402314620351225017740 0ustar00hanshans#!/bin/bash red='\033[0;31m' green='\033[0;32m' nocolor='\033[0m' TEST_VALUE='HELLO WORLD!' run_test() { cd $source_files/$1 printf "\n${1}:\n" if ($basedir/gradlew-fdroid 2>/dev/null || true) | grep -Fo "$2"; then printf "${green}passed: $1\n" else printf "${red}ERROR: $2 not found in $1\n" ((exit_value++)) fi printf $nocolor } download_cache_test() { if $basedir/gradlew-fdroid helloWorld 2>/dev/null | grep -F "$TEST_VALUE"; then printf "${green}passed: $1\n" else printf "${red}ERROR: \n" $basedir/gradlew-fdroid helloWorld ((exit_value++)) fi printf $nocolor } exit_value=0 basedir=$(cd $(dirname $0)/..; pwd) source_files=$basedir/tests/source-files export https_proxy=127.7.7.7:7 # fake proxy to block downloading run_test osmandapp/osmand 2.2.1 run_test com.integreight.onesheeld 3.3 run_test se.manyver/android 5.5 run_test yuriykulikov/AlarmClock 5.1.1 printf "\n\nforce test files to have Windows linefeeds:\n" tmpdir=`mktemp -d` cp -a $source_files/osmandapp $source_files/yuriykulikov $tmpdir/ awk 'sub("$", "\r")' \ $source_files/yuriykulikov/AlarmClock/gradle/wrapper/gradle-wrapper.properties \ > $tmpdir/yuriykulikov/AlarmClock/gradle/wrapper/gradle-wrapper.properties awk 'sub("$", "\r")' \ $source_files/osmandapp/osmand/build.gradle \ > $tmpdir/osmandapp/osmand/build.gradle source_files=$tmpdir run_test yuriykulikov/AlarmClock 5.1.1 run_test osmandapp/osmand 2.2.1 cd $tmpdir mkdir -p download_cache_test/gradle/wrapper cd download_cache_test echo 'distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip' \ > gradle/wrapper/gradle-wrapper.properties printf "task helloWorld {\n\tdoLast {\n\t\tprintln '$TEST_VALUE'\n\t}\n}" > build.gradle export GRADLE_VERSION_DIR=$tmpdir/gradle/versions mkdir -p $GRADLE_VERSION_DIR unset https_proxy printf "download, unpack, and run: " download_cache_test 7.3 printf "unpack and run: " rm -rf $GRADLE_VERSION_DIR/7.3/ download_cache_test 7.3 printf "just run: " download_cache_test 7.3 exit $exit_value ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/testcommon.py0000644000175000017500000000506314620351225016712 0ustar00hanshans#!/usr/bin/env python3 # # Copyright (C) 2017, Michael Poehn # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import os import sys import tempfile import unittest from pathlib import Path from unittest import mock class TmpCwd: """Context-manager for temporarily changing the current working directory.""" def __init__(self, new_cwd): self.new_cwd = new_cwd def __enter__(self): self.orig_cwd = os.getcwd() os.chdir(self.new_cwd) def __exit__(self, a, b, c): os.chdir(self.orig_cwd) class TmpPyPath: """Context-manager for temporarily adding a directory to Python path.""" def __init__(self, additional_path): self.additional_path = additional_path def __enter__(self): sys.path.append(self.additional_path) def __exit__(self, a, b, c): sys.path.remove(self.additional_path) def mock_open_to_str(mock): """For accessing all data written into a unittest.mock.mock_open() instance as a string.""" return "".join( [x.args[0] for x in mock.mock_calls if str(x).startswith("call().write(")] ) def mkdtemp(): if sys.version_info < (3, 10): # ignore_cleanup_errors was added in 3.10 return tempfile.TemporaryDirectory() else: return tempfile.TemporaryDirectory(ignore_cleanup_errors=True) def mkdir_testfiles(localmodule, test): """Keep the test files in a labeled test dir for easy reference""" testroot = Path(localmodule) / '.testfiles' testroot.mkdir(exist_ok=True) testdir = testroot / unittest.TestCase.id(test) testdir.mkdir(exist_ok=True) return tempfile.mkdtemp(dir=testdir) def parse_args_for_test(parser, args): """Only send --flags to the ArgumentParser, not test classes, etc.""" from fdroidserver.common import parse_args flags = [] for arg in args: if arg[0] == '-': flags.append(flags) with mock.patch('sys.argv', flags): parse_args(parser) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-2/0000755000175000017500000000000014620351546016051 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/triple-t-2/build/0000755000175000017500000000000014620351546017150 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/0000755000175000017500000000000014620351546022653 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/0000755000175000017500000000000014620351546023433 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/.gitignore0000644000175000017500000000000714620351225025412 0ustar00hanshans/build ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/build.gradle0000644000175000017500000001257014620351225025711 0ustar00hanshansplugins { id("com.android.application") id("com.github.triplet.play") version "2.0.0" } def isCi = "true" == System.getenv("CI") def preDexEnabled = "true" == System.getProperty("pre-dex", "true") if (project.file('../PiwigoSigning.properties').exists()) { Properties props = new Properties() props.load(new FileInputStream(file('../PiwigoSigning.properties'))) android { signingConfigs { release { storeFile file("../piwigo_android_keystore.jks") storePassword props['keystore.password'] keyAlias 'publishing' keyPassword props['key.password'] } localRelease { storeFile file("${System.properties['user.home']}${File.separator}/.android_keystore_default") storePassword props['keystore_default.password'] keyAlias 'defaultRelease' keyPassword props['key_default.password'] } } buildTypes { release { signingConfig signingConfigs.release } localRelease { signingConfig signingConfigs.localRelease } } } play { defaultToAppBundles = true track = 'beta' } } android { compileSdkVersion 29 defaultConfig { applicationId "org.piwigo.android" minSdkVersion 16 targetSdkVersion 29 versionCode 95 versionName "0.9.5-beta" multiDexEnabled true } buildTypes { debug { applicationIdSuffix ".debug" versionNameSuffix "-debug" } release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } flavorDimensions "default" compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } lintOptions { disable 'InvalidPackage' abortOnError false } dexOptions { preDexLibraries = preDexEnabled && !isCi } dataBinding { enabled = true } testOptions { unitTests { returnDefaultValues = true includeAndroidResources = true } } /* Triple-T GPP is applied as plugin in all cases, so we need to configure it always */ play { serviceAccountCredentials = file("../upload_key.json") } } def daggerVersion = '2.23.2' def okhttpVersion = '3.11.0' def retrofitVersion = '2.6.1' def assertjVersion = '1.2.0' def acraVersion = '5.4.0' dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.annotation:annotation:1.1.0' implementation 'com.google.android.material:material:1.0.0' implementation 'androidx.cardview:cardview:1.0.0' implementation 'com.android.support:multidex:1.0.3' implementation "com.google.dagger:dagger:${daggerVersion}" implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0' annotationProcessor 'androidx.lifecycle:lifecycle-compiler:2.1.0' annotationProcessor "com.google.dagger:dagger-compiler:${daggerVersion}" implementation "com.google.dagger:dagger-android:${daggerVersion}" implementation "com.google.dagger:dagger-android-support:${daggerVersion}" annotationProcessor "com.google.dagger:dagger-android-processor:${daggerVersion}" implementation "com.squareup.okhttp3:okhttp:${okhttpVersion}" implementation "com.squareup.okhttp3:logging-interceptor:${okhttpVersion}" implementation "com.squareup.retrofit2:retrofit:${retrofitVersion}" implementation "com.squareup.retrofit2:converter-gson:${retrofitVersion}" implementation "com.squareup.retrofit2:adapter-rxjava:${retrofitVersion}" implementation 'com.squareup.picasso:picasso:2.5.2' implementation 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0' implementation 'io.reactivex:rxjava:1.3.2' implementation 'io.reactivex:rxandroid:1.2.1' implementation 'com.google.guava:guava:24.1-jre' annotationProcessor 'com.google.guava:guava:24.1-jre' implementation 'org.apache.commons:commons-lang3:3.8.1' implementation "ch.acra:acra-mail:$acraVersion" implementation "ch.acra:acra-dialog:$acraVersion" implementation 'com.github.jorgecastilloprz:fabprogresscircle:1.01@aar' implementation "com.leinardi.android:speed-dial:3.0.0" implementation 'com.github.tingyik90:snackprogressbar:6.1.1' implementation 'org.greenrobot:eventbus:3.1.1' /* Don't forget to add to string libraries if you add a library here. */ debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.0-beta-3' testImplementation 'junit:junit:4.12' testImplementation 'org.robolectric:robolectric:4.3' testImplementation("com.squareup.assertj:assertj-android:${assertjVersion}") { exclude group: 'com.android.support' } testAnnotationProcessor "com.google.dagger:dagger-compiler:${daggerVersion}" testImplementation 'androidx.arch.core:core-testing:2.1.0' testImplementation 'org.mockito:mockito-core:2.19.0' testImplementation 'com.google.guava:guava:24.1-jre' testImplementation 'androidx.appcompat:appcompat:1.1.0' testAnnotationProcessor 'com.google.guava:guava:24.1-jre' testImplementation 'com.google.code.findbugs:jsr305:3.0.2' } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/0000755000175000017500000000000014620351546024222 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/debug/0000755000175000017500000000000014620351546025310 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/debug/res/0000755000175000017500000000000014620351546026101 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/debug/res/values/0000755000175000017500000000000014620351546027400 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/debug/res/values/constants.xml0000644000175000017500000000016214620351225032127 0ustar00hanshans org.piwigo.account_debug ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/debug/res/values/strings.xml0000644000175000017500000000014014620351225031600 0ustar00hanshans Piwigo Debug ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/0000755000175000017500000000000014620351546025146 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/java/0000755000175000017500000000000014620351546026067 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/java/org/0000755000175000017500000000000014620351546026656 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/java/org/piwigo/0000755000175000017500000000000014620351546030154 5ustar00hanshans././@PaxHeader0000000000000000000000000000022000000000000010207 xustar00122 path=fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/java/org/piwigo/PiwigoApplication.java 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/java/org/piwigo/PiwigoAppl0000644000175000017500000000773514620351225032160 0ustar00hanshans/* * Piwigo for Android * Copyright (C) 2016-2017 Piwigo Team http://piwigo.org * Copyright (C) 2018 Raphael Mack http://www.raphael-mack.de * * 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 . */ package org.piwigo; import android.app.Activity; import android.app.Application; import android.app.Service; import android.content.Context; import androidx.databinding.DataBindingUtil; import androidx.multidex.MultiDex; import org.acra.ACRA; import org.acra.ReportField; import org.acra.annotation.AcraCore; import org.acra.annotation.AcraDialog; import org.acra.annotation.AcraMailSender; import org.acra.data.StringFormat; import org.piwigo.helper.DialogHelper; import org.piwigo.helper.NetworkHelper; import org.piwigo.helper.NotificationHelper; import org.piwigo.internal.di.component.ApplicationComponent; import org.piwigo.internal.di.component.BindingComponent; import org.piwigo.internal.di.component.DaggerApplicationComponent; import org.piwigo.internal.di.component.DaggerBindingComponent; import org.piwigo.internal.di.module.ApplicationModule; import javax.inject.Inject; import dagger.android.AndroidInjector; import dagger.android.DispatchingAndroidInjector; import dagger.android.HasActivityInjector; import dagger.android.HasServiceInjector; @AcraCore(reportContent = { ReportField.APP_VERSION_CODE, ReportField.APP_VERSION_NAME, ReportField.USER_COMMENT, ReportField.SHARED_PREFERENCES, ReportField.ANDROID_VERSION, ReportField.CUSTOM_DATA, ReportField.STACK_TRACE, ReportField.BUILD, ReportField.BUILD_CONFIG, ReportField.CRASH_CONFIGURATION, ReportField.DISPLAY }, alsoReportToAndroidFramework = true, reportFormat = StringFormat.KEY_VALUE_LIST ) @AcraMailSender(mailTo = "android@piwigo.org") @AcraDialog(resCommentPrompt = R.string.crash_dialog_comment_prompt, resText = R.string.crash_dialog_text) public class PiwigoApplication extends Application implements HasActivityInjector, HasServiceInjector { @Inject DispatchingAndroidInjector dispatchingAndroidInjector; @Inject DispatchingAndroidInjector dispatchingAndroidServiceInjector; private ApplicationComponent applicationComponent; @Override public void onCreate() { super.onCreate(); new NetworkHelper(); new NotificationHelper(getApplicationContext()); new DialogHelper() ; initializeDependencyInjection(); } @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(base); ACRA.init(this); } @Override public AndroidInjector activityInjector() { return dispatchingAndroidInjector; } private void initializeDependencyInjection() { applicationComponent = DaggerApplicationComponent.builder() .applicationModule(new ApplicationModule(this)) .build(); applicationComponent.inject(this); BindingComponent bindingComponent = DaggerBindingComponent.builder() .applicationComponent(applicationComponent) .build(); DataBindingUtil.setDefaultComponent(bindingComponent); } /** * Returns an {@link AndroidInjector} of {@link Service}s. */ @Override public AndroidInjector serviceInjector() { return dispatchingAndroidServiceInjector; } }././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/0000755000175000017500000000000014620351546026113 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/contact-email.txt0000644000175000017500000000002314620351225031361 0ustar00hanshansandroid@piwigo.org ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/contact-website.txt0000644000175000017500000000002714620351225031740 0ustar00hanshanshttps://www.piwigo.org ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/default-language.txt0000644000175000017500000000000614620351225032047 0ustar00hanshansen-US ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/0000755000175000017500000000000014620351546027747 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/de-DE/0000755000175000017500000000000014620351546030625 5ustar00hanshans././@PaxHeader0000000000000000000000000000022200000000000010211 xustar00124 path=fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/de-DE/full-description.txt 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/de-DE/full-d0000644000175000017500000000100614620351225031722 0ustar00hanshansPiwigo ist eine Android-APP für die freie Open Source-Foto-Hosting-Plattform Piwigo. Mit dieser App können Sie sich selbst gehostete Galerie ansehen und Fotos von Ihrem Smart-Gerät hochladen. Piwigo wird von einer aktiven Community von Benutzern und Entwicklern bereitgestellt. Piwigo ermöglicht eine eigene Fotogalerie im Internet zu erstellen und bietet viele leistungsstarke Funktionen wie Alben, Tags, Geolokalisierung, viele Anpassungsstufen, Upload von Besuchern, Privatsphäre, Kalender oder Statistiken. ././@PaxHeader0000000000000000000000000000022300000000000010212 xustar00125 path=fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/de-DE/short-description.txt 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/de-DE/short-0000644000175000017500000000007214620351225031755 0ustar00hanshansGreifen Sie auf die Bilder Ihrer Piwigo-Foto-Gallerie zu. ././@PaxHeader0000000000000000000000000000020700000000000010214 xustar00113 path=fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/de-DE/title.txt 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/de-DE/title.0000644000175000017500000000000714620351225031736 0ustar00hanshansPiwigo ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/0000755000175000017500000000000014620351546030676 5ustar00hanshans././@PaxHeader0000000000000000000000000000022200000000000010211 xustar00124 path=fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/full-description.txt 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/full-d0000644000175000017500000000073614620351225032004 0ustar00hanshansPiwigo is a native Android Application for the free and open source photo hosting platform Piwigo. With this app you can browse you self-hosted gallery and upload photos from your smart device. Piwigo is built by an active community of users and developers. Piwigo empowers you to create your own photo gallery on the web and includes many powerful features such as albums, tags, geolocation, many levels of customization, upload by visitors, privacy, calendar or statistics. ././@PaxHeader0000000000000000000000000000021500000000000010213 xustar00113 path=fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphics/ 28 mtime=1715589989.8803818 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphi0000755000175000017500000000000014620351546032071 5ustar00hanshans././@PaxHeader0000000000000000000000000000023500000000000010215 xustar00129 path=fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphics/feature-graphic/ 28 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphi0000755000175000017500000000000014620351546032071 5ustar00hanshans././@PaxHeader0000000000000000000000000000024600000000000010217 xustar00144 path=fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphics/feature-graphic/piwigo-full.png 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphi0000644000175000017500000000230514620351225032065 0ustar00hanshansPNG  IHDRdgAMA a cHRMz&u0`:pQ<PLTEwNNNL cNNNNNNNNNNNNNNNNNNNNNNNNwwsjks@轗洈uwNNNNNNNNNNNNNNNNNNNNNNNNDLRa*v@5y+}wwNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNIMP[1wwNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHMQZ)GwNNNNNNNNNNNNNNNNNNNNNNNNNNNIMPaG/xNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGLQY4?NNNNNNNNNIMP_.5| CCyNNN6HYulur%/vjaОs]xtuwxtrKLM_`bvwtqIIJOQR-/..Νqzt{\1QIN `tRNS(WK D) QEP7. (LfSl^:Z)IuCN#_zxRYg r|{_%tEXtdate:create2019-10-04T10:06:15+02:00M%tEXtdate:modify2019-10-04T10:05:31+02:00<tEXtSoftwarewww.inkscape.org<IENDB`././@PaxHeader0000000000000000000000000000022200000000000010211 xustar00118 path=fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphics/icon/ 28 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphi0000755000175000017500000000000014620351546032071 5ustar00hanshans././@PaxHeader0000000000000000000000000000023300000000000010213 xustar00133 path=fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphics/icon/piwigo-icon.png 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphi0000644000175000017500000000212614620351225032066 0ustar00hanshansPNG  IHDR ^gAMA a cHRMz&u0`:pQ<PLTEw~zV/  bwtÙtĿywwwwvrptwvwwwwwuxvwwwwwwwwwwwwwwwwtի}#v)KJߋAw wv5ƖкμϱouMṲ̈̀!{}]]]cccjjjlMMMNNNLLLоƖKKK¼>ƗVVV}~~?qXXXwyz &rtvUUVxWɊ_`aYZ[kmnЭw@ӻ~z%v**5tRNSAU%`~'x#!cdM&K bKGD`z pHYs B(xtIME  `LIDAT(c`ؙrprq 0EDą%L-,,%eZdUTml54!ZNN.n^N@:0ig_?C#"cb㜰H{'$&%&';cJ;edf%%%%FdzcI'a..I.-+bseUuVbbrMm]=997465w`SgWpwOo_Vi' 'M, Q$!X #ðg&Ew%tEXtdate:create2019-10-04T10:06:15+02:00M%tEXtdate:modify2019-10-04T10:05:31+02:00<tEXtSoftwarewww.inkscape.org<IENDB`././@PaxHeader0000000000000000000000000000023700000000000010217 xustar00131 path=fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphics/phone-screenshots/ 28 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphi0000755000175000017500000000000014620351546032071 5ustar00hanshans././@PaxHeader0000000000000000000000000000024500000000000010216 xustar00143 path=fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphics/phone-screenshots/01_Login.jpg 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphi0000644000175000017500000000170414620351225032067 0ustar00hanshansJFIFCC"  + T#QSё!a ?U6Ók͕v=FH}nYsPv5 d75Z̎C"L|;Thvr5nčS>,Kb%GS+m%aw9+řoCİH ZTyc$̞y 1ڡNF0p\YV/տgo/=q>~sN,aVYxSSkw>eXĦRsco"j,Uhyc^BFM%l׃W5-@~W;J23Hi[D|D^# REIy1X;ZL-p5{U0#W{u]tUQWqе,92I>HI]BAz|=- j0HK8]s1۪%뺶3S*ru)Q6& Ʊfb_V=*v&ñ&rG -.jw?::a~>'K?././@PaxHeader0000000000000000000000000000024600000000000010217 xustar00144 path=fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphics/phone-screenshots/02_Albums.jpg 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphi0000644000175000017500000000212414620351225032064 0ustar00hanshansJFIFCC" *WUX1Aa!'FeCQTUb ?rȝ^v}o[[&v`XN")R.aڱ'B¡1bVBC|*P%uSh.[4R!V9a@QW i7DQ2y\GdQ2hkQlB&,DEV8 ­9 .m6p(!<钕Mu>P<5R \9 ERUr`ֳ[ EDÐW{2ZRuKNq}C?xjhJMx)Z1u'n7Sm  wQҽQjť^XޏcY5wUlDk0%8@&[],7*g]Z׻5-!oiՔȢK%V=c"ɣHqB ]]=}u{\:ӡ nkp,v9hꡚٚ[?- ~G}U>//}ׯ^6Ahzg././@PaxHeader0000000000000000000000000000024600000000000010217 xustar00144 path=fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphics/phone-screenshots/03_Photos.jpg 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphi0000644000175000017500000000215314620351225032066 0ustar00hanshansJFIFCC" + W!V1 Aa!FUbe%&EQfq ?b7gYn*޶,!eT-~q` 8G$0TNR0BOZW 6I_^GVǂW^z3 G㖄McFB$=EڤOnսt-,,?#[,4^YE=!G N({եz Ci7lHkĺKuSz}2C?pb(3 $ n~: Ūbj^vXl֨5ޚmkX1e%`ַl 䄆ZAI-"{#Em L$dϢRwКm?/g;?~4R>!3]W$=^έMjd&w,ܗ 9J"X9"3[V^빯jgt +pU_U[ 4r-W_L#SisGC'HoL.\kjkU+/]8780rӄ"10A,B$|e$_]QQ=qȵMZd\*+ !:"Ljx0וf9l02! ="'kQ|-t+-XCWƪ3Klc"!$pE CZ P Kk9ԝ^Fĕ:'悯QP7w!]uwK././@PaxHeader0000000000000000000000000000026100000000000010214 xustar00155 path=fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphics/phone-screenshots/04_Albums_horizontal.jpg 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-2/build/org.piwigo.android/app/src/main/play/listings/en-US/graphi0000644000175000017500000000203414620351225032064 0ustar00hanshansJFIFCC"  /  679:uwxy*2t!#45qs ?\:Wڪ&M&Rc>ݜ EJHSSWGhͦL+R|FL<[mPpڂGun:@E^ə. "2ՙ-M*^'eg ϻ&\u٢mkJt:%O,rDʄ))#=sTɄ,*S%,ǚ5[HַΆX[Ll@kN*HkKo2FEj&tZs,S,z\f]bdI՚YvChS2L$&6P{*WRqQ+[a=4UqX* Ik>g`V^E*KF%mg%:.>p rP(v%Ԕ߁-W390N 9VbLx.BbJ=^uܥN\ZZ}wʺEϙFUE֚"6,Z˕sVF?B*g;#Q#,EJMJ2!1!+ 4P\Dհ36ǜk;V)~Le[5;qڎ\t*j/+Y+RUޤs5F_&^Oۯk;o؇/2~O#}<?QxC_VbZ &X86 VsΊ%3qژ_B^.l׌@º+P24,9B"/.lN l$;ĥ*R~ FD0 29g$,pֱ,This app has been deprecated in favor of https://f-droid.org/en/packages/com.anysoftkeyboard.languagepack.dutch_oss/
This is the Dutch language pack for AnySoftKeyboard. It offers an extensive Dutch dictionary and optimised keyboard. In order to use it, first install https://f-droid.org/packages/com.menny.android.anysoftkeyboard – a practical input method for Android smartphones and tablets. The dictionary is based on the word list from Stichting OpenTaal and has the Quality Mark Spelling (Keurmerk Spelling) of the Dutch Language Union (Taalunie). This language pack has been created by Stichting OpenTaal and can be installed by all without any costs. The language-specific files in this language pack have a dual license. Both the BSD 2-Clause License as the Creative Commons, Attribution 4.0 (unported) apply. Please, help us create free and open Dutch writing tools. Donate tax free to our foundation at https://www.opentaal.org/vrienden-van-opentaal RepoType: git Repo: https://github.com/AnySoftKeyboard/AnySoftKeyboard.git Builds: - versionName: '1.0' versionCode: 1 disable: wait for upstream commit: c5efd5986ce9beec299919f7ae9f174abd33b156 gradle: - yes forceversion: true preassemble: - :makeDictionary - versionName: '1.4' versionCode: 5 commit: dutch-1.4 gradle: - yes forceversion: true preassemble: - :makeDictionary - versionName: 4.0.1396 versionCode: 2908 commit: 1.10-r4 subdir: addons/languages/dutch sudo: - apt-get update || apt-get update - apt-get install -t bullseye openjdk-11-jdk-headless openjdk-11-jre-headless - update-alternatives --auto java gradle: - yes output: ../../../outputs/apks/release/addons-languages-*-$$VERCODE$$.apk prebuild: - echo "//gradleVersion = '6.8.3'" | tee build.gradle - sed -i -e "s calculateApplicationId(project) 'com.anysoftkeyboard.languagepack.dutch' " ../../../gradle/apk_module.gradle - sed -i -e '/Data\.versionCode/ c versionCode $$VERCODE$$' -e '/Data\.versionName/ c versionName "$$VERSION$$"' ../../../gradle/versioning_apk.gradle scanignore: - addons/languages/*/pack/dictionary/*.gz ndk: r14b MaintainerNotes: Package ID is now com.anysoftkeyboard.languagepack.dutch_oss AutoUpdateMode: None UpdateCheckMode: None CurrentVersion: 4.0.1396 CurrentVersionCode: 2908 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-anysoftkeyboard/metadata/com.menny.android.anysoftkeyboard.yml0000644000175000017500000003557314620351225032153 0ustar00hanshansCategories: - Writing License: Apache-2.0 WebSite: https://anysoftkeyboard.github.io SourceCode: https://github.com/AnySoftKeyboard/AnySoftKeyboard IssueTracker: https://github.com/AnySoftKeyboard/AnySoftKeyboard/issues Translation: https://crowdin.com/project/anysoftkeyboard Changelog: https://github.com/AnySoftKeyboard/AnySoftKeyboard/releases Donate: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=KDYBGNUNMMN94&lc=US&item_name=AnySoftKeyboard AutoName: AnySoftKeyboard RepoType: git Repo: https://github.com/AnySoftKeyboard/AnySoftKeyboard.git Builds: - versionName: '20120528' versionCode: 74 commit: d6c2f7448 srclibs: - AnySoftKeyboard-API@78768bc479 prebuild: sed -i 's@\(android.library.reference.1=\).*@\1$$AnySoftKeyboard-API$$@' project.properties buildjni: - yes ndk: r12b - versionName: 20120814-eye-candy versionCode: 76 disable: doesn't build commit: unknown - see disabled srclibs: - AnySoftKeyboard-API@78768bc479 prebuild: sed -i 's@\(android.library.reference.1=\).*@\1$$AnySoftKeyboard-API$$@' project.properties buildjni: - yes ndk: r12b - versionName: 20130106-eye-candy versionCode: 85 commit: a7723e1db5 srclibs: - AnySoftKeyboard-API@b21d8907 prebuild: - sed -i 's@\(android.library.reference.1=\).*@\1$$AnySoftKeyboard-API$$@' project.properties - rm -rf libs/armeabi*/ libs/x86/ libs/mips/ ant/ keyboard_keystore StoreStuff/ res/raw/words_1.dict - wget https://softkeyboard.googlecode.com/svn-history/r544/trunk/project/dict_creation/makedict_Linux - wget https://github.com/AnySoftKeyboard/AnySoftKeyboardTools/blob/HEAD/makedict/makedict.jar?raw=true -O makedict.jar - chmod +x makedict_Linux - ./makedict_Linux dict/words.xml buildjni: - yes ndk: r12b - versionName: 20130222-skinny-eye-candy versionCode: 95 commit: 50daad0b0a srclibs: - AnySoftKeyboard-API@b21d8907 - AnySoftKeyboardTools@73e9a09496 prebuild: - sed -i 's@\(android.library.reference.1=\).*@\1$$AnySoftKeyboard-API$$@' project.properties - sed -i 's@..\/AnySoftKeyboardTools@$$AnySoftKeyboardTools$$@g' build.xml - rm -rf libs/armeabi*/ libs/x86/ libs/mips/ ant/ keyboard_keystore StoreStuff/ res/raw/words_1.dict buildjni: - yes ndk: r12b - versionName: 20130501-skinny-eye-candy-post-birthday versionCode: 98 commit: 6f51b8a9d srclibs: - AnySoftKeyboard-API@2c864957 - AnySoftKeyboardTools@73e9a09496 prebuild: - sed -i 's@\(android.library.reference.1=\).*@\1$$AnySoftKeyboard-API$$@' project.properties - sed -i 's@..\/AnySoftKeyboardTools@$$AnySoftKeyboardTools$$@g' build.xml - rm -rf libs/armeabi*/ libs/x86/ libs/mips/ ant/ keyboard_keystore StoreStuff/ res/raw/words_1.dict buildjni: - yes ndk: r12b - versionName: '20130528' versionCode: 102 commit: 72fd519 srclibs: - AnySoftKeyboard-API@8d8a958e17 - AnySoftKeyboardTools@73e9a09496 prebuild: - sed -i 's@\(reference.1=\).*@\1$$AnySoftKeyboard-API$$@' project.properties - sed -i 's@..\/AnySoftKeyboardTools@$$AnySoftKeyboardTools$$@g' build.xml - rm -rf libs/armeabi*/ libs/x86/ libs/mips/ ant/ keyboard_keystore StoreStuff/ res/raw/words_1.dict buildjni: - yes ndk: r12b - versionName: '20130709' versionCode: 106 commit: f1ba2de srclibs: - AnySoftKeyboard-API@30851236d7 - AnySoftKeyboardTools@73e9a09496 prebuild: - sed -i 's@\(.1=\).*@\1$$AnySoftKeyboard-API$$@' project.properties - sed -i 's@..\/AnySoftKeyboardTools@$$AnySoftKeyboardTools$$@g' build.xml - rm -rf libs/armeabi*/ libs/x86/ libs/mips/ ant/ keyboard_keystore StoreStuff/ res/raw/words_1.dict buildjni: - yes ndk: r12b - versionName: '20130807' versionCode: 107 disable: not published commit: unknown - see disabled - versionName: '20130919' versionCode: 111 commit: 2a68963f srclibs: - AnySoftKeyboard-API@30851236d7 - AnySoftKeyboardTools@73e9a09496 prebuild: - sed -i 's@\(.1=\).*@\1$$AnySoftKeyboard-API$$@' project.properties - sed -i 's@..\/AnySoftKeyboardTools@$$AnySoftKeyboardTools$$@g' build.xml - rm -rf libs/armeabi*/ libs/x86/ libs/mips/ ant/ keyboard_keystore StoreStuff/ res/raw/words_1.dict buildjni: - yes ndk: r12b - versionName: '20131101' versionCode: 114 disable: no longer uses ant, prebuilts commit: 82538d456f8 srclibs: - AnySoftKeyboard-API@08b452ff4 - AnySoftKeyboardTools@73e9a09496 prebuild: - sed -i 's@\(.1=\).*@\1$$AnySoftKeyboard-API$$@' project.properties - sed -i 's@..\/AnySoftKeyboardTools@$$AnySoftKeyboardTools$$@g' build.xml - rm -rf libs/armeabi*/ libs/x86/ libs/mips/ ant/ keyboard_keystore StoreStuff/ res/raw/words_1.dict buildjni: - yes ndk: r12b - versionName: 1.2.20140705 versionCode: 140 disable: build words dict from source, no idea what version name/code it is commit: 1.5-r4.1 gradle: - yes rm: - res/raw/words_1.dict - versionName: 1.8.84 versionCode: 1409 commit: 1.8-r1 init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' build.gradle gradle: - yes rm: - src/main/res/raw/words_1.dict preassemble: - makeEnglishDictionary - versionName: 1.8.133 versionCode: 1458 disable: broken subdir commit: 1.8-r3 subdir: app init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' ../build.gradle build.gradle gradle: - yes rm: - app/src/main/res/raw/words_1.dict preassemble: - :makeEnglishDictionary - versionName: 1.8.146 versionCode: 1471 commit: 1.8-r4 subdir: app init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' ../build.gradle build.gradle gradle: - yes rm: - app/src/main/res/raw/words_1.dict preassemble: - :makeEnglishDictionary - versionName: 1.8.190 versionCode: 1515 disable: weird version/vc-issue commit: 1.8-r5.1 subdir: app init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' ../build.gradle build.gradle gradle: - yes rm: - app/src/main/res/raw/words_1.dict preassemble: - :makeEnglishDictionary - versionName: 1.8.195 versionCode: 1520 commit: 1.8-r5.2 subdir: app init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' ../build.gradle build.gradle gradle: - yes rm: - app/src/main/res/raw/words_1.dict preassemble: - :makeEnglishDictionary - versionName: 1.8.253 versionCode: 1578 commit: 1.8-r6 subdir: app init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' ../build.gradle build.gradle gradle: - yes forceversion: true rm: - app/src/main/res/raw/words_1.dict prebuild: sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' build.gradle preassemble: - :makeEnglishDictionary - versionName: 1.8.329 versionCode: 1654 commit: 1.8-r7 subdir: app init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' ../build.gradle build.gradle gradle: - yes forceversion: true rm: - app/src/main/res/raw/words_1.dict prebuild: sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' build.gradle preassemble: - :makeEnglishDictionary - versionName: 1.8.401 versionCode: 1726 commit: 1.8-r7.1 subdir: app init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' ../build.gradle build.gradle gradle: - yes forceversion: true rm: - app/src/main/res/raw/words_1.dict prebuild: - sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' build.gradle - sed -i -e '/crashlytics/,$d' build.gradle preassemble: - :makeEnglishDictionary - versionName: 1.8.503 versionCode: 1828 commit: 1.8-r8 subdir: app init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' ../build.gradle build.gradle gradle: - yes forceversion: true rm: - app/src/main/res/raw/words_*.dict prebuild: - sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' build.gradle - sed -i -e '/crashlytics/,$d' build.gradle preassemble: - :makeEnglishDictionary - versionName: 1.8.585 versionCode: 1910 commit: 1.8-r9 subdir: app init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' ../build.gradle build.gradle gradle: - yes forceversion: true rm: - app/src/main/res/raw/words_*.dict prebuild: - sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' build.gradle - sed -i -e '/crashlytics/,$d' build.gradle preassemble: - :makeEnglishDictionary - versionName: 1.8.735 versionCode: 2060 commit: 1.8-r10 subdir: app init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' ../build.gradle build.gradle gradle: - yes forceversion: true rm: - app/src/main/res/raw/words_*.dict prebuild: - sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' build.gradle - sed -i -e '/crashlytics/,$d' build.gradle preassemble: - :makeEnglishDictionary - versionName: 1.8.844 versionCode: 2169 commit: 1.8-r11 subdir: app init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' ../build.gradle build.gradle gradle: - yes forceversion: true rm: - app/src/main/res/raw/words_*.dict prebuild: - sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' build.gradle - sed -i -e '/crashlytics/,$d' build.gradle preassemble: - :makeEnglishDictionary - versionName: 1.8.1241 versionCode: 2566 commit: 1.8-r12 subdir: app init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' ../build.gradle build.gradle gradle: - yes forceversion: true rm: - app/src/main/res/raw/words_*.dict prebuild: - sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' build.gradle - sed -i -e '/crashlytics/,$d' build.gradle preassemble: - :makeEnglishDictionary - versionName: 1.8.1333 versionCode: 2658 commit: 1.8-r12.2 subdir: app init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' ../build.gradle build.gradle gradle: - yes forceversion: true rm: - app/src/main/res/raw/words_*.dict prebuild: - sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' build.gradle - sed -i -e '/crashlytics/,$d' build.gradle ndk: r11c preassemble: - :makeEnglishDictionary - versionName: 1.9.1117 versionCode: 3692 commit: 1.9-r1 subdir: app init: sed -i -e '/fabric/d' -e '/canaryImplementation/,+2d' ../build.gradle build.gradle gradle: - yes forceversion: true rm: - app/src/main/res/raw/words_*.dict prebuild: - sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' -e '/crashlytics/,$d' build.gradle - sed -i -e 's/gradle:3.1.0-alpha06/gradle:3.0.1/' ../build.gradle scandelete: - buildSrc - app/src/debug ndk: r14b preassemble: - :makeEnglishDictionary - versionName: 1.9.1944 versionCode: 4519 commit: 1.9-r3-fdroid subdir: app init: sed -i -e '/fabric/d' -e '/canaryImplementation/d' ../build.gradle build.gradle gradle: - yes forceversion: true rm: - app/src/main/res/raw/words_*.dict prebuild: sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' -e '/crashlytics/,$d' build.gradle scandelete: - buildSrc - app/src/debug ndk: r14b preassemble: - :makeEnglishDictionary - versionName: 1.9.2055 versionCode: 4630 commit: 1.9-r4 subdir: app init: sed -i -e '/fabric/d' -e '/canaryImplementation/d' ../build.gradle build.gradle gradle: - yes forceversion: true rm: - app/src/main/res/raw/words_*.dict prebuild: sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' -e '/crashlytics/,$d' build.gradle scandelete: - buildSrc - app/src/debug ndk: r14b preassemble: - :makeEnglishDictionary - versionName: 1.9.2445 versionCode: 5020 commit: 1.9-r5.1 subdir: app gradle: - yes forceversion: true rm: - app/src/main/res/raw/words_*.dict prebuild: sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' build.gradle scandelete: - buildSrc - app/src/debug ndk: r14b preassemble: - :makeEnglishDictionary - versionName: 1.9.2629 versionCode: 5204 commit: 1.9-r6 subdir: app gradle: - yes forceversion: true prebuild: sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' build.gradle scandelete: - buildSrc ndk: r14b - versionName: 1.10.364 versionCode: 5539 commit: 1.10-r1 subdir: app gradle: - yes forceversion: true prebuild: sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' build.gradle scandelete: - buildSrc ndk: r14b - versionName: 1.10.606 versionCode: 5781 commit: 1.10-r2 subdir: app gradle: - yes forceversion: true prebuild: sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' build.gradle scandelete: - buildSrc ndk: r14b - versionName: 1.10.1109 versionCode: 6279 commit: e57c9cc852aefdc1ff60b024e52d4341337b3df7 subdir: app gradle: - yes forceversion: true prebuild: sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' build.gradle scanignore: - buildSrc ndk: r14b gradleprops: - forceVersionBuildCount=4709 - versionName: 1.10.1786 versionCode: 6956 commit: 1.10-r4 subdir: ime/app sudo: - apt-get update || apt-get update - apt-get install -t bullseye openjdk-11-jdk-headless openjdk-11-jre-headless - update-alternatives --auto java gradle: - yes prebuild: - sed -i -e "/EnvKey/ a //gradleVersion = '6.8.3'" ../build.gradle - sed -i -e '/Data\.versionCode/ c versionCode $$VERCODE$$' -e '/Data\.versionName/ c versionName "$$VERSION$$"' ../../gradle/versioning_apk.gradle scanignore: - addons/languages/*/pack/dictionary/*.gz ndk: r14b MaintainerNotes: |- * Prior to 1.9.2629, generates english dictionary binary (src/main/res/raw/words_*.dict) from source files (under `english_dictionary` folder. Mostly AOSP word-list) Summary and Description have been moved to the new localizable text files: https://f-droid.org/docs/All_About_Descriptions_Graphics_and_Screenshots AutoUpdateMode: None UpdateCheckMode: None CurrentVersion: 1.10.1786 CurrentVersionCode: 6956 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-flutter/0000755000175000017500000000000014620351546017375 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-flutter/build/0000755000175000017500000000000014620351546020474 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-flutter/build/fr.emersion.goguma/0000755000175000017500000000000014620351546024201 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-flutter/build/fr.emersion.goguma/android/0000755000175000017500000000000014620351546025621 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/0000755000175000017500000000000014620351546026401 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/0000755000175000017500000000000014620351546027170 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/0000755000175000017500000000000014620351546030114 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/0000755000175000017500000000000014620351546031061 5ustar00hanshans././@PaxHeader0000000000000000000000000000022000000000000010207 xustar00122 path=fdroidserver-2.3a1/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/contact-website.txt 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/contact0000644000175000017500000000002414620351225032425 0ustar00hanshanshttps://emersion.fr ././@PaxHeader0000000000000000000000000000021400000000000010212 xustar00112 path=fdroidserver-2.3a1/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/ 28 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listing0000755000175000017500000000000014620351546032453 5ustar00hanshans././@PaxHeader0000000000000000000000000000022200000000000010211 xustar00118 path=fdroidserver-2.3a1/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/ 28 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listing0000755000175000017500000000000014620351546032453 5ustar00hanshans././@PaxHeader0000000000000000000000000000024000000000000010211 xustar00138 path=fdroidserver-2.3a1/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/full-description.txt 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listing0000644000175000017500000000110114620351225032440 0ustar00hanshansAn IRC client for mobile devices. Goals:

  • Modern: support for many IRCv3 extensions, plus some special support for IRC bouncers.
  • Easy to use: offer a simple, straightforward interface.
  • Offline-first: users should be able to read past conversations while offline, and network disruptions should be handled transparently.
  • Lightweight: go easy on resource usage to run smoothly on older phones and save battery power.
  • Cross-platform: the main target platforms are Linux and Android.
././@PaxHeader0000000000000000000000000000024100000000000010212 xustar00139 path=fdroidserver-2.3a1/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/short-description.txt 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listing0000644000175000017500000000004114620351225032442 0ustar00hanshansAn IRC client for mobile devices ././@PaxHeader0000000000000000000000000000022500000000000010214 xustar00127 path=fdroidserver-2.3a1/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/title.txt 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listing0000644000175000017500000000000714620351225032444 0ustar00hanshansGoguma ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/triple-t-flutter/metadata/0000755000175000017500000000000014620351546021155 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-flutter/metadata/fr.emersion.goguma.yml0000644000175000017500000000154414620351225025403 0ustar00hanshansCategories: - Internet License: AGPL-3.0-only WebSite: https://sr.ht/~emersion/goguma SourceCode: https://git.sr.ht/~emersion/goguma IssueTracker: https://todo.sr.ht/~emersion/goguma AutoName: Goguma RepoType: git Repo: https://git.sr.ht/~emersion/goguma Builds: - versionName: 0.1.0 versionCode: 1 commit: 944d2d1e000901365392e850a98ee03f5dedba32 output: build/app/outputs/flutter-apk/app-release.apk srclibs: - flutter@2.10.2 build: - $$flutter$$/bin/flutter config --no-analytics - $$flutter$$/bin/flutter create --org fr.emersion --project-name goguma --platforms android --no-overwrite . - $$flutter$$/bin/flutter build apk --release --verbose AutoUpdateMode: Version UpdateCheckMode: Tags UpdateCheckData: pubspec.yaml|version:\s.+\+(\d+)|.|version:\s(.+)\+ CurrentVersion: 0.1.0 CurrentVersionCode: 1 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-multiple/0000755000175000017500000000000014620351546017543 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-multiple/build/0000755000175000017500000000000014620351546020642 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/0000755000175000017500000000000014620351546030173 5ustar00hanshans././@PaxHeader0000000000000000000000000000020700000000000010214 xustar00113 path=fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/settings.gradle 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/settings.gra0000644000175000017500000000007014620351225032515 0ustar00hanshansinclude ':common' include ':verifier' include ':wallet' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/verifier/0000755000175000017500000000000014620351546032006 5ustar00hanshans././@PaxHeader0000000000000000000000000000021300000000000010211 xustar00111 path=fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/verifier/src/ 28 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/verifier/src0000755000175000017500000000000014620351546032516 5ustar00hanshans././@PaxHeader0000000000000000000000000000022000000000000010207 xustar00116 path=fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/verifier/src/main/ 28 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/verifier/src0000755000175000017500000000000014620351546032516 5ustar00hanshans././@PaxHeader0000000000000000000000000000022500000000000010214 xustar00121 path=fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/verifier/src/main/play/ 28 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/verifier/src0000755000175000017500000000000014620351546032516 5ustar00hanshans././@PaxHeader0000000000000000000000000000023600000000000010216 xustar00130 path=fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/verifier/src/main/play/listings/ 28 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/verifier/src0000755000175000017500000000000014620351546032516 5ustar00hanshans././@PaxHeader0000000000000000000000000000024400000000000010215 xustar00136 path=fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/verifier/src/main/play/listings/en-US/ 28 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/verifier/src0000755000175000017500000000000014620351546032516 5ustar00hanshans././@PaxHeader0000000000000000000000000000024700000000000010220 xustar00145 path=fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/verifier/src/main/play/listings/en-US/title.txt 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/verifier/src0000644000175000017500000000002714620351225032511 0ustar00hanshansCOVID Certificate Check././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/wallet/0000755000175000017500000000000014620351546031463 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/wallet/src/0000755000175000017500000000000014620351546032252 5ustar00hanshans././@PaxHeader0000000000000000000000000000021600000000000010214 xustar00114 path=fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/wallet/src/main/ 28 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/wallet/src/m0000755000175000017500000000000014620351546032427 5ustar00hanshans././@PaxHeader0000000000000000000000000000022300000000000010212 xustar00119 path=fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/wallet/src/main/play/ 28 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/wallet/src/m0000755000175000017500000000000014620351546032427 5ustar00hanshans././@PaxHeader0000000000000000000000000000023400000000000010214 xustar00128 path=fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/wallet/src/main/play/listings/ 28 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/wallet/src/m0000755000175000017500000000000014620351546032427 5ustar00hanshans././@PaxHeader0000000000000000000000000000024200000000000010213 xustar00134 path=fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/wallet/src/main/play/listings/en-US/ 28 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/wallet/src/m0000755000175000017500000000000014620351546032427 5ustar00hanshans././@PaxHeader0000000000000000000000000000024500000000000010216 xustar00143 path=fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/wallet/src/main/play/listings/en-US/title.txt 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/wallet/src/m0000644000175000017500000000002114620351225032414 0ustar00hanshansCOVID Certificate././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/0000755000175000017500000000000014620351546027650 5ustar00hanshans././@PaxHeader0000000000000000000000000000020500000000000010212 xustar00111 path=fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/settings.gradle 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/settings.gradl0000644000175000017500000000007014620351225032512 0ustar00hanshansinclude ':common' include ':verifier' include ':wallet' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/verifier/0000755000175000017500000000000014620351546031463 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/verifier/src/0000755000175000017500000000000014620351546032252 5ustar00hanshans././@PaxHeader0000000000000000000000000000021600000000000010214 xustar00114 path=fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/verifier/src/main/ 28 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/verifier/src/m0000755000175000017500000000000014620351546032427 5ustar00hanshans././@PaxHeader0000000000000000000000000000022300000000000010212 xustar00119 path=fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/verifier/src/main/play/ 28 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/verifier/src/m0000755000175000017500000000000014620351546032427 5ustar00hanshans././@PaxHeader0000000000000000000000000000023400000000000010214 xustar00128 path=fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/verifier/src/main/play/listings/ 28 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/verifier/src/m0000755000175000017500000000000014620351546032427 5ustar00hanshans././@PaxHeader0000000000000000000000000000024200000000000010213 xustar00134 path=fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/verifier/src/main/play/listings/en-US/ 28 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/verifier/src/m0000755000175000017500000000000014620351546032427 5ustar00hanshans././@PaxHeader0000000000000000000000000000024500000000000010216 xustar00143 path=fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/verifier/src/main/play/listings/en-US/title.txt 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/verifier/src/m0000644000175000017500000000002714620351225032422 0ustar00hanshansCOVID Certificate Check././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/wallet/0000755000175000017500000000000014620351546031140 5ustar00hanshans././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/wallet/src/0000755000175000017500000000000014620351546031727 5ustar00hanshans././@PaxHeader0000000000000000000000000000021400000000000010212 xustar00112 path=fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/wallet/src/main/ 28 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/wallet/src/mai0000755000175000017500000000000014620351546032416 5ustar00hanshans././@PaxHeader0000000000000000000000000000022100000000000010210 xustar00117 path=fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/wallet/src/main/play/ 28 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/wallet/src/mai0000755000175000017500000000000014620351546032416 5ustar00hanshans././@PaxHeader0000000000000000000000000000023200000000000010212 xustar00126 path=fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/wallet/src/main/play/listings/ 28 mtime=1715589989.8843818 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/wallet/src/mai0000755000175000017500000000000014620351546032416 5ustar00hanshans././@PaxHeader0000000000000000000000000000024000000000000010211 xustar00132 path=fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/wallet/src/main/play/listings/en-US/ 28 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/wallet/src/mai0000755000175000017500000000000014620351546032416 5ustar00hanshans././@PaxHeader0000000000000000000000000000024300000000000010214 xustar00141 path=fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/wallet/src/main/play/listings/en-US/title.txt 22 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/wallet/src/mai0000644000175000017500000000002114620351225032403 0ustar00hanshansCOVID Certificate././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/triple-t-multiple/metadata/0000755000175000017500000000000014620351546021323 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-multiple/metadata/ch.admin.bag.covidcertificate.verifier.yml0000644000175000017500000000334114620351225031372 0ustar00hanshansAntiFeatures: - Tracking Categories: - Sports & Health License: MPL-2.0 AuthorName: Swiss Admin AuthorWebSite: https://www.bit.admin.ch SourceCode: https://github.com/admin-ch/CovidCertificate-App-Android IssueTracker: https://github.com/admin-ch/CovidCertificate-App-Android/issues Changelog: https://github.com/admin-ch/CovidCertificate-App-Android/releases AutoName: Covid Cert RepoType: git Repo: https://github.com/admin-ch/CovidCertificate-App-Android Binaries: https://github.com/admin-ch/CovidCertificate-App-Android/releases/download/v%v-%c-verifier/verifier-prod-%v-%c-signed.apk Builds: - versionName: 1.2.0 versionCode: 1200 commit: v1.2.0-1200-verifier subdir: verifier submodules: true gradle: - prod rm: - sdk/sdk/testKeystore - wallet/testKeystore - verifier/testKeystore prebuild: printf '\nbuildTimestamp=%s\n' "$(curl -sL https://github.com/admin-ch/CovidCertificate-App-Android/releases/download/v$$VERSION$$-$$VERCODE$$-verifier/verifier-prod-$$VERSION$$-$$VERCODE$$-buildtimestamp.txt | tr -cd '0-9')" >> gradle.properties - versionName: 2.0.0 versionCode: 2000 commit: 5a871eabf1fce16b84e4c7b97c94fd3f2a37e910 subdir: verifier submodules: true gradle: - prod rm: - sdk/sdk/testKeystore - wallet/testKeystore - verifier/testKeystore prebuild: printf '\nbuildTimestamp=%s\n' "$(curl -sL https://github.com/admin-ch/CovidCertificate-App-Android/releases/download/v$$VERSION$$-$$VERCODE$$-verifier/verifier-prod-$$VERSION$$-$$VERCODE$$-buildtimestamp.txt | tr -cd '0-9')" >> gradle.properties AutoUpdateMode: Version UpdateCheckMode: Tags ^v[\d.]+-\d+-verifier$ CurrentVersion: 2.0.0 CurrentVersionCode: 2000 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/triple-t-multiple/metadata/ch.admin.bag.covidcertificate.wallet.yml0000644000175000017500000000331514620351225031050 0ustar00hanshansAntiFeatures: - Tracking Categories: - Sports & Health License: MPL-2.0 AuthorName: Swiss Admin AuthorWebSite: https://www.bit.admin.ch SourceCode: https://github.com/admin-ch/CovidCertificate-App-Android IssueTracker: https://github.com/admin-ch/CovidCertificate-App-Android/issues Changelog: https://github.com/admin-ch/CovidCertificate-App-Android/releases AutoName: Covid Cert RepoType: git Repo: https://github.com/admin-ch/CovidCertificate-App-Android Binaries: https://github.com/admin-ch/CovidCertificate-App-Android/releases/download/v%v-%c-wallet/wallet-prod-%v-%c-signed.apk Builds: - versionName: 1.2.0 versionCode: 1200 commit: v1.2.0-1200-wallet subdir: wallet submodules: true gradle: - prod rm: - sdk/sdk/testKeystore - wallet/testKeystore - verifier/testKeystore prebuild: printf '\nbuildTimestamp=%s\n' "$(curl -sL https://github.com/admin-ch/CovidCertificate-App-Android/releases/download/v$$VERSION$$-$$VERCODE$$-wallet/wallet-prod-$$VERSION$$-$$VERCODE$$-buildtimestamp.txt | tr -cd '0-9')" >> gradle.properties - versionName: 2.0.0 versionCode: 2000 commit: 5a871eabf1fce16b84e4c7b97c94fd3f2a37e910 subdir: wallet submodules: true gradle: - prod rm: - sdk/sdk/testKeystore - wallet/testKeystore - verifier/testKeystore prebuild: printf '\nbuildTimestamp=%s\n' "$(curl -sL https://github.com/admin-ch/CovidCertificate-App-Android/releases/download/v$$VERSION$$-$$VERCODE$$-wallet/wallet-prod-$$VERSION$$-$$VERCODE$$-buildtimestamp.txt | tr -cd '0-9')" >> gradle.properties AutoUpdateMode: Version UpdateCheckMode: Tags ^v[\d.]+-\d+-wallet$ CurrentVersion: 2.0.0 CurrentVersionCode: 2000 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/update.TestCase0000755000175000017500000030750614620351225017101 0ustar00hanshans#!/usr/bin/env python3 # http://www.drdobbs.com/testing/unit-testing-with-python/240165163 import copy import git import glob import hashlib import inspect import json import logging import os import random import shutil import string import subprocess import sys import tempfile import unittest import yaml import zipfile import textwrap from binascii import hexlify from datetime import datetime from pathlib import Path from unittest import mock try: # these were moved in androguard 4.0 from androguard.core.apk import APK except ImportError: from androguard.core.bytecodes.apk import APK try: from yaml import CSafeLoader as SafeLoader except ImportError: from yaml import SafeLoader try: from yaml import CFullLoader as FullLoader except ImportError: try: # FullLoader is available from PyYaml 5.1+, as we don't load user # controlled data here, it's okay to fall back the unsafe older # Loader from yaml import FullLoader except ImportError: from yaml import Loader as FullLoader localmodule = os.path.realpath( os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') ) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) import fdroidserver.common import fdroidserver.exception import fdroidserver.metadata import fdroidserver.update from fdroidserver.common import CATEGORIES_CONFIG_NAME from fdroidserver.looseversion import LooseVersion from testcommon import TmpCwd, mkdtemp, parse_args_for_test DONATION_FIELDS = ('Donate', 'Liberapay', 'OpenCollective') class Options: allow_disabled_algorithms = False clean = False delete_unknown = False nosign = False pretty = True rename_apks = False verbose = False class UpdateTest(unittest.TestCase): '''fdroid update''' def setUp(self): logging.basicConfig(level=logging.INFO) from PIL import PngImagePlugin logging.getLogger(PngImagePlugin.__name__).setLevel(logging.INFO) self.basedir = os.path.join(localmodule, 'tests') os.chdir(self.basedir) self._td = mkdtemp() self.testdir = self._td.name fdroidserver.common.config = None fdroidserver.common.options = None def tearDown(self): os.chdir(self.basedir) self._td.cleanup() def test_insert_store_metadata(self): os.chdir(self.testdir) config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.update.config = config repo_dir = os.path.join(self.basedir, 'repo') os.mkdir('metadata') for packageName in ( 'obb.mainpatch.current', 'org.videolan.vlc', ): shutil.copytree( os.path.join(repo_dir, packageName), os.path.join('repo', packageName) ) for packageName in ( 'info.guardianproject.checkey', 'info.guardianproject.urzip', 'org.smssecure.smssecure', ): if not os.path.exists('metadata'): os.mkdir('metadata') shutil.copytree( os.path.join(self.basedir, 'metadata', packageName), os.path.join('metadata', packageName), ) for packageName in ( 'com.nextcloud.client', 'com.nextcloud.client.dev', 'eu.siacs.conversations', ): shutil.copytree( os.path.join(self.basedir, 'source-files', packageName), os.path.join(self.testdir, 'build', packageName), ) testfilename = 'icon_yAfSvPRJukZzMMfUzvbYqwaD1XmHXNtiPBtuPVHW-6s=.png' testfile = os.path.join(repo_dir, 'org.videolan.vlc', 'en-US', 'icon.png') cpdir = os.path.join('metadata', 'org.videolan.vlc', 'en-US') cpfile = os.path.join(cpdir, testfilename) os.makedirs(cpdir, exist_ok=True) shutil.copy(testfile, cpfile) shutil.copystat(testfile, cpfile) apps = dict() for packageName in ( 'info.guardianproject.urzip', 'org.videolan.vlc', 'obb.mainpatch.current', 'com.nextcloud.client', 'com.nextcloud.client.dev', 'eu.siacs.conversations', ): apps[packageName] = fdroidserver.metadata.App() apps[packageName]['id'] = packageName apps[packageName]['CurrentVersionCode'] = 0xCAFEBEEF apps['info.guardianproject.urzip']['CurrentVersionCode'] = 100 buildnextcloudclient = fdroidserver.metadata.Build() buildnextcloudclient.gradle = ['generic'] apps['com.nextcloud.client']['Builds'] = [buildnextcloudclient] buildnextclouddevclient = fdroidserver.metadata.Build() buildnextclouddevclient.gradle = ['versionDev'] apps['com.nextcloud.client.dev']['Builds'] = [buildnextclouddevclient] build_conversations = fdroidserver.metadata.Build() build_conversations.gradle = ['free'] apps['eu.siacs.conversations']['Builds'] = [build_conversations] fdroidserver.update.insert_localized_app_metadata(apps) fdroidserver.update.ingest_screenshots_from_repo_dir(apps) appdir = os.path.join('repo', 'info.guardianproject.urzip', 'en-US') self.assertTrue( os.path.isfile( os.path.join( appdir, 'icon_NJXNzMcyf-v9i5a1ElJi0j9X1LvllibCa48xXYPlOqQ=.png' ) ) ) self.assertTrue( os.path.isfile( os.path.join( appdir, 'featureGraphic_GFRT5BovZsENGpJq1HqPODGWBRPWQsx25B95Ol5w_wU=.png', ) ) ) self.assertEqual(6, len(apps)) for packageName, app in apps.items(): self.assertTrue('localized' in app, packageName) self.assertTrue('en-US' in app['localized']) self.assertEqual(1, len(app['localized'])) if packageName == 'info.guardianproject.urzip': self.assertEqual(7, len(app['localized']['en-US'])) self.assertEqual('full description\n', app['localized']['en-US']['description']) self.assertEqual('title', app['localized']['en-US']['name']) self.assertEqual('short description', app['localized']['en-US']['summary']) self.assertEqual('video', app['localized']['en-US']['video']) self.assertEqual('icon_NJXNzMcyf-v9i5a1ElJi0j9X1LvllibCa48xXYPlOqQ=.png', app['localized']['en-US']['icon']) self.assertEqual('featureGraphic_GFRT5BovZsENGpJq1HqPODGWBRPWQsx25B95Ol5w_wU=.png', app['localized']['en-US']['featureGraphic']) self.assertEqual('100\n', app['localized']['en-US']['whatsNew']) elif packageName == 'org.videolan.vlc': self.assertEqual(testfilename, app['localized']['en-US']['icon']) self.assertEqual(9, len(app['localized']['en-US']['phoneScreenshots'])) self.assertEqual(15, len(app['localized']['en-US']['sevenInchScreenshots'])) elif packageName == 'obb.mainpatch.current': self.assertEqual('icon_WI0pkO3LsklrsTAnRr-OQSxkkoMY41lYe2-fAvXLiLg=.png', app['localized']['en-US']['icon']) self.assertEqual('featureGraphic_ffhLaojxbGAfu9ROe1MJgK5ux8d0OVc6b65nmvOBaTk=.png', app['localized']['en-US']['featureGraphic']) self.assertEqual(1, len(app['localized']['en-US']['phoneScreenshots'])) self.assertEqual(1, len(app['localized']['en-US']['sevenInchScreenshots'])) elif packageName == 'com.nextcloud.client': self.assertEqual('Nextcloud', app['localized']['en-US']['name']) self.assertEqual(1073, len(app['localized']['en-US']['description'])) self.assertEqual(78, len(app['localized']['en-US']['summary'])) elif packageName == 'com.nextcloud.client.dev': self.assertEqual('Nextcloud Dev', app['localized']['en-US']['name']) self.assertEqual(586, len(app['localized']['en-US']['description'])) self.assertEqual(78, len(app['localized']['en-US']['summary'])) elif packageName == 'eu.siacs.conversations': self.assertEqual('Conversations', app['localized']['en-US']['name']) def test_insert_fastlane_default_txt_changelog(self): """Test that Fastlane's default.txt is handled properly https://docs.fastlane.tools/actions/supply/#changelogs-whats-new """ os.chdir(self.testdir) config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.update.config = config app = fdroidserver.metadata.App() app.id = 'com.example.app' changelogs_dir = 'build/%s/metadata/en-US/changelogs' % app.id os.makedirs(changelogs_dir) with open(os.path.join(changelogs_dir, 'default.txt'), 'w') as fp: fp.write('default') with open(os.path.join(changelogs_dir, '42.txt'), 'w') as fp: fp.write('42') apps = {app.id: app} build = fdroidserver.metadata.Build() build.versionCode = 42 app['Builds'] = [build] fdroidserver.update.insert_localized_app_metadata(apps) self.assertEqual('default', apps[app.id]['localized']['en-US']['whatsNew']) app.CurrentVersionCode = 1 fdroidserver.update.insert_localized_app_metadata(apps) self.assertEqual('default', apps[app.id]['localized']['en-US']['whatsNew']) app.CurrentVersionCode = 10000 fdroidserver.update.insert_localized_app_metadata(apps) self.assertEqual('default', apps[app.id]['localized']['en-US']['whatsNew']) app.CurrentVersionCode = 42 fdroidserver.update.insert_localized_app_metadata(apps) self.assertEqual('42', apps[app.id]['localized']['en-US']['whatsNew']) def test_name_title_scraping(self): """metadata file --> fdroiddata localized files --> fastlane/triple-t in app source --> APK""" shutil.copytree(self.basedir, self.testdir, dirs_exist_ok=True) config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config os.chdir(self.testdir) fdroidserver.common.options = Options fdroidserver.update.options = fdroidserver.common.options fdroidserver.update.options.clean = True fdroidserver.update.options.delete_unknown = True apps = fdroidserver.metadata.read_metadata() apps['info.guardianproject.urzip']['CurrentVersionCode'] = 100 knownapks = fdroidserver.common.KnownApks() apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks, False) fdroidserver.update.insert_localized_app_metadata(apps) fdroidserver.update.ingest_screenshots_from_repo_dir(apps) fdroidserver.update.apply_info_from_latest_apk(apps, apks) app = apps['info.guardianproject.urzip'] self.assertIsNone(app.Name) self.assertTrue('localized' in app) self.assertEqual('title', app['localized']['en-US']['name']) self.assertEqual('100\n', app['localized']['en-US']['whatsNew']) app = apps['org.videolan.vlc'] self.assertIsNone(app.Name) self.assertTrue('localized' in app) self.assertFalse('name' in app['localized']['en-US']) app = apps['info.guardianproject.checkey'] self.assertEqual('Checkey the app!', app.Name) self.assertTrue('localized' in app) self.assertEqual('Checkey: info on local apps', app['localized']['en-US']['name']) self.assertEqual('Checkey: ローカルアプリの情報', app['localized']['ja-JP']['name']) app = apps['org.adaway'] self.assertIsNone(app.Name) self.assertFalse('localized' in app) app = apps['obb.main.twoversions'] self.assertIsNone(app.Name) self.assertFalse('localized' in app) def test_insert_missing_app_names_from_apks(self): """en-US serves as the final, default, fallback value with index-v1""" testvalue = 'TESTVALUE!' apps = { 'none': {}, 'name': {'Name': testvalue}, 'onlyapk': {'Name': None}, 'autoname': {'AutoName': 'autoname', 'Name': None}, 'onlylocalized': {'localized': {'en-US': {'name': testvalue}}}, 'non_en_us_localized': {'localized': {'de-AT': {'name': 'leiwand'}}}, 'apks': {}, } apks = [ {'packageName': 'none', 'name': '', 'versionCode': 1}, {'packageName': 'name', 'name': 'fromapk', 'versionCode': 1}, {'packageName': 'onlyapk', 'name': testvalue, 'versionCode': 1}, {'packageName': 'autoname', 'name': testvalue, 'versionCode': 1}, {'packageName': 'onlylocalized', 'name': 'fromapk', 'versionCode': 1}, {'packageName': 'non_en_us_localized', 'name': testvalue, 'versionCode': 0xcafe}, {'packageName': 'apks', 'name': 'fromapk1', 'versionCode': 1}, {'packageName': 'apks', 'name': 'fromapk2', 'versionCode': 2}, {'packageName': 'apks', 'name': testvalue, 'versionCode': 3}, ] fdroidserver.common.options = Options fdroidserver.update.insert_missing_app_names_from_apks(apps, apks) for appid, app in apps.items(): if appid == 'none': self.assertIsNone(app.get('Name')) self.assertIsNone(app.get('localized')) elif appid == 'onlyapk': self.assertIsNone(app.get('Name')) self.assertEqual(testvalue, app['localized']['en-US']['name']) elif appid == 'autoname': self.assertIsNone(app.get('Name')) self.assertEqual(testvalue, app['localized']['en-US']['name']) elif appid == 'onlylocalized': self.assertIsNone(app.get('Name')) self.assertEqual(testvalue, app['localized']['en-US']['name']) elif appid == 'non_en_us_localized': self.assertIsNone(app.get('Name')) self.assertEqual(testvalue, app['localized']['en-US']['name']) elif appid == 'name': self.assertEqual(testvalue, app['Name']) self.assertIsNone(app.get('localized')) elif appid == 'apks': self.assertIsNone(app.get('Name')) self.assertEqual(testvalue, app['localized']['en-US']['name']) def test_insert_missing_app_names_from_apks_from_repo(self): os.chdir(self.testdir) shutil.copytree(self.basedir, self.testdir, dirs_exist_ok=True) config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config fdroidserver.common.options = Options fdroidserver.update.options = fdroidserver.common.options fdroidserver.update.options.clean = True fdroidserver.update.options.delete_unknown = True apps = fdroidserver.metadata.read_metadata() knownapks = fdroidserver.common.KnownApks() apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks, False) appid = 'info.guardianproject.checkey' testapps = {appid: copy.copy(apps[appid])} self.assertEqual('Checkey the app!', testapps[appid]['Name']) del testapps[appid]['Name'] fdroidserver.update.insert_missing_app_names_from_apks(testapps, apks) self.assertIsNone(testapps[appid].get('Name')) repoapps = fdroidserver.update.prepare_apps(apps, apks, 'repo') fdroidserver.update.insert_missing_app_names_from_apks(repoapps, apks) self.assertIsNone(repoapps['com.politedroid']['Name']) self.assertEqual('Polite Droid', repoapps['com.politedroid']['localized']['en-US']['name']) self.assertEqual('Duplicate Permisssions', repoapps['duplicate.permisssions']['Name']) self.assertEqual('Caffeine Tile', repoapps['info.zwanenburg.caffeinetile']['Name']) self.assertEqual('No minSdkVersion or targetSdkVersion', repoapps['no.min.target.sdk']['Name']) self.assertIsNone(repoapps['obb.main.oldversion'].get('Name')) self.assertEqual('OBB Main Old Version', repoapps['obb.main.oldversion']['localized']['en-US']['name']) self.assertIsNone(repoapps['obb.main.twoversions'].get('Name')) self.assertEqual('OBB Main Two Versions', repoapps['obb.main.twoversions']['localized']['en-US']['name']) self.assertIsNone(repoapps['souch.smsbypass'].get('Name')) self.assertEqual('Battery level', repoapps['souch.smsbypass']['localized']['en-US']['name']) self.assertIsNone(repoapps['info.guardianproject.urzip'].get('Name')) self.assertEqual('title', repoapps['info.guardianproject.urzip']['localized']['en-US']['name']) self.assertIsNone(repoapps['obb.mainpatch.current'].get('Name')) del repoapps['info.guardianproject.urzip']['localized'] fdroidserver.update.insert_missing_app_names_from_apks(repoapps, apks) self.assertEqual('urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234', repoapps['info.guardianproject.urzip']['localized']['en-US']['name']) def test_insert_triple_t_metadata(self): importer = os.path.join(self.basedir, 'tmp', 'importer') packageName = 'org.fdroid.ci.test.app' if not os.path.isdir(importer): logging.warning('skipping test_insert_triple_t_metadata, import.TestCase must run first!') return packageDir = os.path.join(self.testdir, 'build', packageName) shutil.copytree(importer, packageDir) # always use the same commit so these tests work when ci-test-app.git is updated repo = git.Repo(packageDir) for remote in repo.remotes: remote.fetch() repo.git.reset('--hard', 'b9e5d1a0d8d6fc31d4674b2f0514fef10762ed4f') repo.git.clean('-fdx') os.mkdir(os.path.join(self.testdir, 'metadata')) metadata = dict() metadata['Description'] = 'This is just a test app' with open(os.path.join(self.testdir, 'metadata', packageName + '.yml'), 'w') as fp: yaml.dump(metadata, fp) config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config os.chdir(self.testdir) apps = fdroidserver.metadata.read_metadata() fdroidserver.update.copy_triple_t_store_metadata(apps) # TODO ideally, this would compare the whole dict like in metadata.TestCase's test_read_metadata() correctlocales = [ 'ar', 'ast_ES', 'az', 'ca', 'ca_ES', 'cs-CZ', 'cs_CZ', 'da', 'da-DK', 'de', 'de-DE', 'el', 'en-US', 'es', 'es-ES', 'es_ES', 'et', 'fi', 'fr', 'fr-FR', 'he_IL', 'hi-IN', 'hi_IN', 'hu', 'id', 'it', 'it-IT', 'it_IT', 'iw-IL', 'ja', 'ja-JP', 'kn_IN', 'ko', 'ko-KR', 'ko_KR', 'lt', 'nb', 'nb_NO', 'nl', 'nl-NL', 'no', 'pl', 'pl-PL', 'pl_PL', 'pt', 'pt-BR', 'pt-PT', 'pt_BR', 'ro', 'ro_RO', 'ru-RU', 'ru_RU', 'sv-SE', 'sv_SE', 'te', 'tr', 'tr-TR', 'uk', 'uk_UA', 'vi', 'vi_VN', 'zh-CN', 'zh_CN', 'zh_TW', ] locales = sorted(list(apps['org.fdroid.ci.test.app']['localized'].keys())) self.assertEqual(correctlocales, locales) def test_insert_triple_t_2_metadata(self): packageName = 'org.piwigo.android' shutil.copytree(os.path.join(self.basedir, 'triple-t-2'), self.testdir, dirs_exist_ok=True) os.chdir(self.testdir) config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config apps = fdroidserver.metadata.read_metadata() self.assertTrue(packageName in apps) fdroidserver.update.copy_triple_t_store_metadata(apps) correctlocales = ['de-DE', 'en-US', 'fr-FR', 'kn-IN'] app = apps[packageName] self.assertEqual('android@piwigo.org', app['authorEmail']) self.assertEqual('https://www.piwigo.org', app['authorWebSite']) locales = sorted(list(app['localized'].keys())) self.assertEqual(correctlocales, locales) kn_IN = app['localized']['kn-IN'] self.assertTrue('description' in kn_IN) self.assertTrue('name' in kn_IN) self.assertTrue('summary' in kn_IN) en_US = app['localized']['en-US'] self.assertTrue('whatsNew' in en_US) os.chdir(os.path.join('repo', packageName)) self.assertTrue(os.path.exists(os.path.join('en-US', 'icon.png'))) self.assertTrue(os.path.exists(os.path.join('en-US', 'featureGraphic.png'))) self.assertTrue(os.path.exists(os.path.join('en-US', 'phoneScreenshots', '01_Login.jpg'))) self.assertTrue(os.path.exists(os.path.join('en-US', 'sevenInchScreenshots', '01_Login.png'))) self.assertFalse(os.path.exists(os.path.join('de-DE', 'icon.png'))) self.assertFalse(os.path.exists(os.path.join('de-DE', 'featureGraphic.png'))) self.assertFalse(os.path.exists(os.path.join('de-DE', 'phoneScreenshots', '01_Login.jpg'))) self.assertFalse(os.path.exists(os.path.join('de-DE', 'sevenInchScreenshots', '01_Login.png'))) def test_insert_triple_t_anysoftkeyboard(self): packages = ('com.anysoftkeyboard.languagepack.dutch', 'com.menny.android.anysoftkeyboard') names = ('Dutch for AnySoftKeyboard', 'AnySoftKeyboard') shutil.copytree(os.path.join(self.basedir, 'triple-t-anysoftkeyboard'), self.testdir, dirs_exist_ok=True) os.chdir(self.testdir) for packageName, name in zip(packages, names): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config fdroidserver.update.options = fdroidserver.common.options apps = fdroidserver.metadata.read_metadata() self.assertTrue(packageName in apps) fdroidserver.update.copy_triple_t_store_metadata(apps) app = apps[packageName] self.assertEqual(app['localized']['en-US']['name'], name) def test_insert_triple_t_multiple_metadata(self): namespace = 'ch.admin.bag.covidcertificate.' packages = ('verifier', 'wallet') names = dict(verifier='COVID Certificate Check', wallet='COVID Certificate') shutil.copytree(os.path.join(self.basedir, 'triple-t-multiple'), self.testdir, dirs_exist_ok=True) os.chdir(self.testdir) for p in packages: packageName = namespace + p config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config fdroidserver.update.options = fdroidserver.common.options apps = fdroidserver.metadata.read_metadata() self.assertTrue(packageName in apps) fdroidserver.update.copy_triple_t_store_metadata(apps) app = apps[packageName] self.assertEqual(app['localized']['en-US']['name'], names[p]) def test_insert_triple_t_flutter(self): packageName = 'fr.emersion.goguma' shutil.copytree(os.path.join(self.basedir, 'triple-t-flutter'), self.testdir, dirs_exist_ok=True) os.chdir(self.testdir) config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config fdroidserver.update.options = fdroidserver.common.options apps = fdroidserver.metadata.read_metadata() self.assertTrue(packageName in apps) fdroidserver.update.copy_triple_t_store_metadata(apps) app = apps[packageName] self.assertEqual(app['authorWebSite'], 'https://emersion.fr') self.assertEqual(app['localized']['en-US']['name'], 'Goguma') self.assertEqual(app['localized']['en-US']['summary'], 'An IRC client for mobile devices') def testBadGetsig(self): """getsig() should still be able to fetch the fingerprint of bad signatures""" # config needed to use jarsigner and keytool config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.update.config = config apkfile = 'urzip-badsig.apk' sig = fdroidserver.update.getsig(apkfile) self.assertEqual(sig, 'e0ecb5fc2d63088e4a07ae410a127722', "python sig should be: " + str(sig)) apkfile = 'urzip-badcert.apk' sig = fdroidserver.update.getsig(apkfile) self.assertEqual(sig, 'e0ecb5fc2d63088e4a07ae410a127722', "python sig should be: " + str(sig)) def test_getsig(self): # config needed to use jarsigner and keytool config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.update.config = config sig = fdroidserver.update.getsig('urzip-release-unsigned.apk') self.assertIsNone(sig) good_fingerprint = 'b4964fd759edaa54e65bb476d0276880' apkpath = 'urzip-release.apk' # v1 only sig = fdroidserver.update.getsig(apkpath) self.assertEqual(good_fingerprint, sig, 'python sig was: ' + str(sig)) apkpath = 'repo/v1.v2.sig_1020.apk' sig = fdroidserver.update.getsig(apkpath) self.assertEqual(good_fingerprint, sig, 'python sig was: ' + str(sig)) # check that v1 and v2 have the same certificate apkobject = APK(apkpath) cert_encoded = apkobject.get_certificates_der_v2()[0] self.assertEqual(good_fingerprint, sig, hashlib.md5(hexlify(cert_encoded)).hexdigest()) # nosec just used as ID for signing key filename = 'v2.only.sig_2.apk' with zipfile.ZipFile(filename) as z: self.assertTrue('META-INF/MANIFEST.MF' in z.namelist(), 'META-INF/MANIFEST.MF required') for f in z.namelist(): # ensure there are no v1 signature files self.assertIsNone(fdroidserver.common.SIGNATURE_BLOCK_FILE_REGEX.match(f)) sig = fdroidserver.update.getsig(filename) self.assertEqual(good_fingerprint, sig, "python sig was: " + str(sig)) def testScanApksAndObbs(self): os.chdir(self.testdir) shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') shutil.copytree(os.path.join(self.basedir, 'metadata'), 'metadata') config = dict() fdroidserver.common.fill_config_defaults(config) config['ndk_paths'] = dict() fdroidserver.common.config = config fdroidserver.update.config = config fdroidserver.common.options = Options fdroidserver.update.options = fdroidserver.common.options fdroidserver.update.options.clean = True fdroidserver.update.options.delete_unknown = True apps = fdroidserver.metadata.read_metadata() knownapks = fdroidserver.common.KnownApks() apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks, False) self.assertEqual(len(apks), 17) apk = apks[1] self.assertEqual(apk['packageName'], 'com.politedroid') self.assertEqual(apk['versionCode'], 3) self.assertEqual(apk['minSdkVersion'], 3) self.assertIsNone(apk.get('targetSdkVersion')) self.assertFalse('maxSdkVersion' in apk) apk = apks[8] self.assertEqual(apk['packageName'], 'obb.main.oldversion') self.assertEqual(apk['versionCode'], 1444412523) self.assertEqual(apk['minSdkVersion'], 4) self.assertEqual(apk['targetSdkVersion'], 18) self.assertFalse('maxSdkVersion' in apk) fdroidserver.update.insert_obbs('repo', apps, apks) for apk in apks: if apk['packageName'] == 'obb.mainpatch.current': self.assertEqual(apk.get('obbMainFile'), 'main.1619.obb.mainpatch.current.obb') self.assertEqual(apk.get('obbPatchFile'), 'patch.1619.obb.mainpatch.current.obb') elif apk['packageName'] == 'obb.main.oldversion': self.assertEqual(apk.get('obbMainFile'), 'main.1434483388.obb.main.oldversion.obb') self.assertIsNone(apk.get('obbPatchFile')) elif apk['packageName'] == 'obb.main.twoversions': self.assertIsNone(apk.get('obbPatchFile')) if apk['versionCode'] == 1101613: self.assertEqual(apk.get('obbMainFile'), 'main.1101613.obb.main.twoversions.obb') elif apk['versionCode'] == 1101615: self.assertEqual(apk.get('obbMainFile'), 'main.1101615.obb.main.twoversions.obb') elif apk['versionCode'] == 1101617: self.assertEqual(apk.get('obbMainFile'), 'main.1101615.obb.main.twoversions.obb') else: self.assertTrue(False) elif apk['packageName'] == 'info.guardianproject.urzip': self.assertIsNone(apk.get('obbMainFile')) self.assertIsNone(apk.get('obbPatchFile')) def test_apkcache_json(self): """test the migration from pickle to json""" os.chdir(self.testdir) shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') config = dict() fdroidserver.common.fill_config_defaults(config) config['ndk_paths'] = dict() fdroidserver.common.config = config fdroidserver.update.config = config fdroidserver.common.options = Options fdroidserver.update.options = fdroidserver.common.options fdroidserver.update.options.clean = True fdroidserver.update.options.delete_unknown = True fdroidserver.metadata.read_metadata() knownapks = fdroidserver.common.KnownApks() apkcache = fdroidserver.update.get_cache() self.assertEqual(2, len(apkcache)) self.assertEqual(fdroidserver.update.METADATA_VERSION, apkcache["METADATA_VERSION"]) self.assertEqual(fdroidserver.update.options.allow_disabled_algorithms, apkcache['allow_disabled_algorithms']) apks, cachechanged = fdroidserver.update.process_apks(apkcache, 'repo', knownapks, False) fdroidserver.update.write_cache(apkcache) fdroidserver.update.options.clean = False read_from_json = fdroidserver.update.get_cache() self.assertEqual(19, len(read_from_json)) for f in glob.glob('repo/*.apk'): self.assertTrue(os.path.basename(f) in read_from_json) fdroidserver.update.options.clean = True reset = fdroidserver.update.get_cache() self.assertEqual(2, len(reset)) def test_scan_repo_files(self): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config os.chdir(self.testdir) os.mkdir('repo') os.mkdir('stats') with open(os.path.join('stats', 'known_apks.txt'), 'w') as fp: fp.write('se.manyver_30.apk se.manyver 2018-10-10\n') filename = 'Norway_bouvet_europe_2.obf.zip' shutil.copy(os.path.join(self.basedir, filename), 'repo') knownapks = fdroidserver.common.KnownApks() files, fcachechanged = fdroidserver.update.scan_repo_files(dict(), 'repo', knownapks, False) knownapks.writeifchanged() self.assertTrue(fcachechanged) info = files[0] self.assertEqual(filename, info['apkName']) self.assertEqual(datetime, type(info['added'])) self.assertEqual(os.path.getsize(os.path.join('repo', filename)), info['size']) self.assertEqual( '531190bdbc07e77d5577249949106f32dac7f62d38d66d66c3ae058be53a729d', info['hash'], ) def test_read_added_date_from_all_apks(self): os.chdir(self.testdir) shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config fdroidserver.common.options = Options apps = fdroidserver.metadata.read_metadata() knownapks = fdroidserver.common.KnownApks() apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks) fdroidserver.update.read_added_date_from_all_apks(apps, apks) def test_apply_info_from_latest_apk(self): os.chdir(self.testdir) shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config fdroidserver.common.options = Options fdroidserver.update.options = fdroidserver.common.options apps = fdroidserver.metadata.read_metadata() knownapks = fdroidserver.common.KnownApks() apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks) fdroidserver.update.apply_info_from_latest_apk(apps, apks) def test_scan_apk(self): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config os.chdir(self.basedir) if 'apksigner' in config: apk_info = fdroidserver.update.scan_apk('v2.only.sig_2.apk') self.assertIsNone(apk_info.get('maxSdkVersion')) self.assertEqual(apk_info.get('versionName'), 'v2-only') self.assertEqual(apk_info.get('versionCode'), 2) else: print('WARNING: skipping v2-only test since apksigner cannot be found') apk_info = fdroidserver.update.scan_apk('repo/v1.v2.sig_1020.apk') self.assertIsNone(apk_info.get('maxSdkVersion')) self.assertEqual(apk_info.get('versionName'), 'v1+2') self.assertEqual(apk_info.get('versionCode'), 1020) apk_info = fdroidserver.update.scan_apk('repo/souch.smsbypass_9.apk') self.assertIsNone(apk_info.get('maxSdkVersion')) self.assertEqual(apk_info.get('versionName'), '0.9') apk_info = fdroidserver.update.scan_apk('repo/duplicate.permisssions_9999999.apk') self.assertEqual(apk_info.get('versionName'), '') self.assertEqual(apk_info['icons_src'], {'160': 'res/drawable/ic_launcher.png', '-1': 'res/drawable/ic_launcher.png'}) apk_info = fdroidserver.update.scan_apk('org.dyndns.fules.ck_20.apk') self.assertEqual(apk_info['icons_src'], {'240': 'res/drawable-hdpi-v4/icon_launcher.png', '120': 'res/drawable-ldpi-v4/icon_launcher.png', '160': 'res/drawable-mdpi-v4/icon_launcher.png', '-1': 'res/drawable-mdpi-v4/icon_launcher.png'}) self.assertEqual(apk_info['icons'], {}) self.assertEqual(apk_info['features'], []) self.assertEqual(apk_info['antiFeatures'], dict()) self.assertEqual(apk_info['versionName'], 'v1.6pre2') self.assertEqual(apk_info['hash'], '897486e1f857c6c0ee32ccbad0e1b8cd82f6d0e65a44a23f13f852d2b63a18c8') self.assertEqual(apk_info['packageName'], 'org.dyndns.fules.ck') self.assertEqual(apk_info['versionCode'], 20) self.assertEqual(apk_info['size'], 132453) self.assertEqual(apk_info['nativecode'], ['arm64-v8a', 'armeabi', 'armeabi-v7a', 'mips', 'mips64', 'x86', 'x86_64']) self.assertEqual(apk_info['minSdkVersion'], 7) self.assertEqual(apk_info['sig'], '9bf7a6a67f95688daec75eab4b1436ac') self.assertEqual(apk_info['hashType'], 'sha256') self.assertEqual(apk_info['targetSdkVersion'], 8) apk_info = fdroidserver.update.scan_apk('org.bitbucket.tickytacky.mirrormirror_4.apk') self.assertEqual(apk_info.get('versionName'), '1.0.3') self.assertEqual(apk_info['icons_src'], {'160': 'res/drawable-mdpi/mirror.png', '-1': 'res/drawable-mdpi/mirror.png'}) apk_info = fdroidserver.update.scan_apk('repo/info.zwanenburg.caffeinetile_4.apk') self.assertEqual(apk_info.get('versionName'), '1.3') self.assertEqual(apk_info['icons_src'], {}) apk_info = fdroidserver.update.scan_apk('repo/com.politedroid_6.apk') self.assertEqual(apk_info.get('versionName'), '1.5') self.assertEqual(apk_info['icons_src'], {'120': 'res/drawable-ldpi-v4/icon.png', '160': 'res/drawable-mdpi-v4/icon.png', '240': 'res/drawable-hdpi-v4/icon.png', '320': 'res/drawable-xhdpi-v4/icon.png', '-1': 'res/drawable-mdpi-v4/icon.png'}) apk_info = fdroidserver.update.scan_apk('SpeedoMeterApp.main_1.apk') self.assertEqual(apk_info.get('versionName'), '1.0') self.assertEqual(apk_info['icons_src'], {}) def test_scan_apk_no_min_target(self): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config apk_info = fdroidserver.update.scan_apk('repo/no.min.target.sdk_987.apk') self.maxDiff = None expected = { 'icons': {}, 'icons_src': {'-1': 'res/drawable/ic_launcher.png', '160': 'res/drawable/ic_launcher.png'}, 'name': 'No minSdkVersion or targetSdkVersion', 'signer': '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', 'hashType': 'sha256', 'packageName': 'no.min.target.sdk', 'features': [], 'antiFeatures': dict(), 'size': 14102, 'sig': 'b4964fd759edaa54e65bb476d0276880', 'versionName': '1.2-fake', 'uses-permission-sdk-23': [], 'hash': 'e2e1dc1d550df2b5bc383860139207258645b5540abeccd305ed8b2cb6459d2c', 'versionCode': 987, 'minSdkVersion': 3, 'uses-permission': [ fdroidserver.update.UsesPermission(name='android.permission.WRITE_EXTERNAL_STORAGE', maxSdkVersion=None), fdroidserver.update.UsesPermission(name='android.permission.READ_PHONE_STATE', maxSdkVersion=None), fdroidserver.update.UsesPermission(name='android.permission.READ_EXTERNAL_STORAGE', maxSdkVersion=None), ], } if config.get('ipfs_cid'): expected['ipfsCIDv1'] = 'bafybeidwxseoagnew3gtlasttqovl7ciuwxaud5a5p4a5pzpbrfcfj2gaa' self.assertDictEqual(apk_info, expected) def test_scan_apk_no_sig(self): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config os.chdir(self.basedir) if os.path.basename(os.getcwd()) != 'tests': raise Exception('This test must be run in the "tests/" subdir') with self.assertRaises(fdroidserver.exception.BuildException): fdroidserver.update.scan_apk('urzip-release-unsigned.apk') def test_scan_apk_bad_zip(self): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config os.chdir(self.testdir) os.mkdir('repo') apkfile = 'repo/badzip_1.apk' with open(apkfile, 'w') as fp: fp.write('this is not a zip file') with self.assertRaises(fdroidserver.exception.BuildException): fdroidserver.update.scan_apk(apkfile) @unittest.skipUnless( os.path.exists('tests/SystemWebView-repack.apk'), "file too big for sdist" ) def test_scan_apk_bad_icon_id(self): """Some APKs can produce an exception when extracting the icon This kind of parsing exception should be reported then ignored so that working APKs can be included in the index. There are so many weird things that make it into APKs, that does not automatically disqualify them from inclusion. For example: ValueError: invalid literal for int() with base 16: '<0x801FF, type 0x07>' The test APK was made from: https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1018#note_690565333 It was then stripped down by doing: * mkdir SystemWebView * cd SystemWebView/ * unzip ../SystemWebView.apk * rm -rf META-INF/ lib assets/icudtl.dat assets/stored-locales/ * jar cf ../SystemWebView-repack.apk * """ # reset the state, perhaps this should be in setUp() config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): os.mkdir('repo') apkfile = 'repo/SystemWebView-repack.apk' shutil.copy(os.path.join(self.basedir, os.path.basename(apkfile)), apkfile) fdroidserver.update.scan_apk(apkfile) def test_scan_apk_bad_namespace_in_manifest(self): """Some APKs can produce an exception when parsing the AndroidManifest.xml This kind of parsing exception should be reported then ignored so that working APKs can be included in the index. There are so many weird things that make it into APKs, that does not automatically disqualify them from inclusion. This APK has elements with messed up namespaces: """ # reset the state, perhaps this should be in setUp() config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): os.mkdir('repo') apkfile = 'repo/org.sajeg.fallingblocks_3.apk' shutil.copy(os.path.join(self.basedir, os.path.basename(apkfile)), apkfile) fdroidserver.update.scan_apk(apkfile) def test_process_apk(self): def _build_yaml_representer(dumper, data): '''Creates a YAML representation of a Build instance''' return dumper.represent_dict(data) os.chdir(self.testdir) shutil.copytree(self.basedir, 'tests') config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config os.chdir("tests") config['ndk_paths'] = dict() fdroidserver.common.config = config fdroidserver.update.config = config fdroidserver.common.options = Options fdroidserver.update.options = fdroidserver.common.options fdroidserver.update.options.clean = True fdroidserver.update.options.delete_unknown = True for icon_dir in fdroidserver.update.get_all_icon_dirs('repo'): if not os.path.exists(icon_dir): os.makedirs(icon_dir) knownapks = fdroidserver.common.KnownApks() apkList = ['../urzip.apk', '../org.dyndns.fules.ck_20.apk'] for apkName in apkList: _, apk, cachechanged = fdroidserver.update.process_apk({}, apkName, 'repo', knownapks, False) # Don't care about the date added to the repo and relative apkName self.assertEqual(datetime, type(apk['added'])) del apk['added'] del apk['apkName'] # ensure that icons have been extracted properly if apkName == '../urzip.apk': self.assertEqual(apk['icon'], 'info.guardianproject.urzip.100.png') if apkName == '../org.dyndns.fules.ck_20.apk': self.assertEqual(apk['icon'], 'org.dyndns.fules.ck.20.png') for density in fdroidserver.update.screen_densities: icon_path = os.path.join( fdroidserver.update.get_icon_dir('repo', density), apk['icon'] ) self.assertTrue(os.path.isfile(icon_path)) self.assertTrue(os.path.getsize(icon_path) > 1) savepath = os.path.join('metadata', 'apk', apk['packageName'] + '.yaml') # Uncomment to save APK metadata # with open(savepath, 'w') as f: # yaml.add_representer(fdroidserver.metadata.Build, _build_yaml_representer) # yaml.dump(apk, f, default_flow_style=False) # CFullLoader doesn't always work # https://github.com/yaml/pyyaml/issues/266#issuecomment-559116876 TestLoader = FullLoader try: testyaml = '- !!python/object/new:fdroidserver.update.UsesPermission\n - test\n - null' from_yaml = yaml.load(testyaml, Loader=TestLoader) except yaml.constructor.ConstructorError: from yaml import UnsafeLoader as TestLoader with open(savepath, 'r') as f: from_yaml = yaml.load(f, Loader=TestLoader) self.maxDiff = None if not config.get('ipfs_cid'): del from_yaml['ipfsCIDv1'] # handle when ipfs_cid is not installed self.assertEqual(apk, from_yaml) def test_process_apk_signed_by_disabled_algorithms(self): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.update.config = config config['ndk_paths'] = dict() fdroidserver.common.config = config fdroidserver.update.config = config fdroidserver.common.options = Options fdroidserver.update.options = fdroidserver.common.options fdroidserver.update.options.clean = True fdroidserver.update.options.verbose = True fdroidserver.update.options.delete_unknown = True knownapks = fdroidserver.common.KnownApks() with tempfile.TemporaryDirectory() as tmptestsdir, TmpCwd(tmptestsdir): os.mkdir('repo') os.mkdir('archive') # setup the repo, create icons dirs, etc. fdroidserver.update.process_apks({}, 'repo', knownapks) fdroidserver.update.process_apks({}, 'archive', knownapks) disabledsigs = ['org.bitbucket.tickytacky.mirrormirror_2.apk'] for apkName in disabledsigs: shutil.copy(os.path.join(self.basedir, apkName), os.path.join(tmptestsdir, 'repo')) skip, apk, cachechanged = fdroidserver.update.process_apk({}, apkName, 'repo', knownapks, allow_disabled_algorithms=True, archive_bad_sig=False) self.assertFalse(skip) self.assertIsNotNone(apk) self.assertTrue(cachechanged) self.assertFalse(os.path.exists(os.path.join('archive', apkName))) self.assertTrue(os.path.exists(os.path.join('repo', apkName))) if os.path.exists('/usr/bin/apksigner') or 'apksigner' in config: print('SKIPPING: apksigner installed and it allows MD5 signatures') return javac = config['jarsigner'].replace('jarsigner', 'javac') v = subprocess.check_output([javac, '-version'], stderr=subprocess.STDOUT)[6:-1].decode('utf-8') if LooseVersion(v) < LooseVersion('1.8.0_132'): print('SKIPPING: running tests with old Java (' + v + ')') return # this test only works on systems with fully updated Java/jarsigner # that has MD5 listed in jdk.jar.disabledAlgorithms in java.security # https://blogs.oracle.com/java-platform-group/oracle-jre-will-no-longer-trust-md5-signed-code-by-default skip, apk, cachechanged = fdroidserver.update.process_apk({}, apkName, 'repo', knownapks, allow_disabled_algorithms=False, archive_bad_sig=True) self.assertTrue(skip) self.assertIsNone(apk) self.assertFalse(cachechanged) self.assertTrue(os.path.exists(os.path.join('archive', apkName))) self.assertFalse(os.path.exists(os.path.join('repo', apkName))) skip, apk, cachechanged = fdroidserver.update.process_apk({}, apkName, 'archive', knownapks, allow_disabled_algorithms=False, archive_bad_sig=False) self.assertFalse(skip) self.assertIsNotNone(apk) self.assertTrue(cachechanged) self.assertTrue(os.path.exists(os.path.join('archive', apkName))) self.assertFalse(os.path.exists(os.path.join('repo', apkName))) # ensure that icons have been moved to the archive as well for density in fdroidserver.update.screen_densities: icon_path = os.path.join(fdroidserver.update.get_icon_dir('archive', density), apk['icon']) self.assertTrue(os.path.isfile(icon_path)) self.assertTrue(os.path.getsize(icon_path) > 1) badsigs = ['urzip-badcert.apk', 'urzip-badsig.apk', 'urzip-release-unsigned.apk', ] for apkName in badsigs: shutil.copy(os.path.join(self.basedir, apkName), os.path.join(self.testdir, 'repo')) skip, apk, cachechanged = fdroidserver.update.process_apk({}, apkName, 'repo', knownapks, allow_disabled_algorithms=False, archive_bad_sig=False) self.assertTrue(skip) self.assertIsNone(apk) self.assertFalse(cachechanged) def test_process_invalid_apk(self): os.chdir(self.basedir) if os.path.basename(os.getcwd()) != 'tests': raise Exception('This test must be run in the "tests/" subdir') config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config fdroidserver.common.options = Options fdroidserver.update.options = fdroidserver.common.options fdroidserver.update.options.delete_unknown = False knownapks = fdroidserver.common.KnownApks() apk = 'fake.ota.update_1234.zip' # this is not an APK, scanning should fail (skip, apk, cachechanged) = fdroidserver.update.process_apk({}, apk, 'repo', knownapks, False) self.assertTrue(skip) self.assertIsNone(apk) self.assertFalse(cachechanged) def test_get_apks_without_allowed_signatures(self): """Test when no AllowedAPKSigningKeys is specified""" os.chdir(self.testdir) shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.common.options = Options fdroidserver.update.options = fdroidserver.common.options app = fdroidserver.metadata.App() knownapks = fdroidserver.common.KnownApks() apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks) apkfile = 'v1.v2.sig_1020.apk' (skip, apk, cachechanged) = fdroidserver.update.process_apk( {}, apkfile, 'repo', knownapks, False ) r = fdroidserver.update.get_apks_without_allowed_signatures(app, apk) self.assertIsNone(r) def test_get_apks_without_allowed_signatures_allowed(self): """Test when the APK matches the specified AllowedAPKSigningKeys""" os.chdir(self.testdir) shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.common.options = Options fdroidserver.update.options = fdroidserver.common.options app = fdroidserver.metadata.App( { 'AllowedAPKSigningKeys': '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6' } ) knownapks = fdroidserver.common.KnownApks() apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks) apkfile = 'v1.v2.sig_1020.apk' (skip, apk, cachechanged) = fdroidserver.update.process_apk( {}, apkfile, 'repo', knownapks, False ) r = fdroidserver.update.get_apks_without_allowed_signatures(app, apk) self.assertIsNone(r) def test_get_apks_without_allowed_signatures_blocked(self): """Test when the APK does not match any specified AllowedAPKSigningKeys""" os.chdir(self.testdir) shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.common.options = Options fdroidserver.update.options = fdroidserver.common.options app = fdroidserver.metadata.App( { 'AllowedAPKSigningKeys': 'fa4edeadfa4edeadfa4edeadfa4edeadfa4edeadfa4edeadfa4edeadfa4edead' } ) knownapks = fdroidserver.common.KnownApks() apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks) apkfile = 'v1.v2.sig_1020.apk' (skip, apk, cachechanged) = fdroidserver.update.process_apk( {}, apkfile, 'repo', knownapks, False ) r = fdroidserver.update.get_apks_without_allowed_signatures(app, apk) self.assertEqual(apkfile, r) def test_update_with_AllowedAPKSigningKeys(self): """Test that APKs without allowed signatures get deleted.""" os.chdir(self.testdir) os.mkdir('repo') testapk = os.path.join('repo', 'com.politedroid_6.apk') shutil.copy(os.path.join(self.basedir, testapk), testapk) os.mkdir('metadata') metadatafile = os.path.join('metadata', 'com.politedroid.yml') # Copy and manipulate metadata file shutil.copy(os.path.join(self.basedir, metadatafile), metadatafile) with open(metadatafile, 'a') as fp: fp.write( '\n\nAllowedAPKSigningKeys: 32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6\n' ) # Set up options fdroidserver.common.options = Options config = fdroidserver.common.read_config() if 'apksigner' not in config: # TODO remove me for buildserver-bullseye self.skipTest('SKIPPING test_update_with_AllowedAPKSigningKeys, apksigner not installed!') config['repo_keyalias'] = 'sova' config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' config['keystore'] = os.path.join(self.basedir, 'keystore.jks') self.assertTrue(os.path.exists(testapk)) # Test for non-deletion with mock.patch('sys.argv', ['fdroid update', '--delete-unknown']): fdroidserver.update.main() self.assertTrue(os.path.exists(testapk)) # Copy and manipulate metadata file again shutil.copy(os.path.join(self.basedir, metadatafile), metadatafile) with open(metadatafile, 'a') as fp: fp.write( '\n\nAllowedAPKSigningKeys: fa4edeadfa4edeadfa4edeadfa4edeadfa4edeadfa4edeadfa4edeadfa4edead\n' ) # Test for deletion with mock.patch('sys.argv', ['fdroid update', '--delete-unknown']): fdroidserver.update.main() self.assertFalse(os.path.exists(testapk)) def test_translate_per_build_anti_features(self): os.chdir(self.testdir) shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') shutil.copytree(os.path.join(self.basedir, 'metadata'), 'metadata') config = dict() fdroidserver.common.fill_config_defaults(config) config['ndk_paths'] = dict() fdroidserver.common.config = config fdroidserver.update.config = config fdroidserver.common.options = Options fdroidserver.update.options = fdroidserver.common.options fdroidserver.update.options.clean = True fdroidserver.update.options.delete_unknown = True apps = fdroidserver.metadata.read_metadata() knownapks = fdroidserver.common.KnownApks() apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks, False) fdroidserver.update.translate_per_build_anti_features(apps, apks) self.assertEqual(len(apks), 17) foundtest = False for apk in apks: if apk['packageName'] == 'com.politedroid' and apk['versionCode'] == 3: antiFeatures = apk.get('antiFeatures') self.assertTrue('KnownVuln' in antiFeatures) self.assertEqual(3, len(antiFeatures)) foundtest = True self.assertTrue(foundtest) def test_create_metadata_from_template(self): os.chdir(self.testdir) os.mkdir('repo') os.mkdir('metadata') shutil.copy(os.path.join(localmodule, 'tests', 'urzip.apk'), 'repo') config = dict() fdroidserver.common.fill_config_defaults(config) config['ndk_paths'] = dict() fdroidserver.common.config = config fdroidserver.update.config = config fdroidserver.common.options = Options fdroidserver.update.options = fdroidserver.common.options fdroidserver.update.options.clean = True knownapks = fdroidserver.common.KnownApks() apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks, False) self.assertEqual(1, len(apks)) apk = apks[0] testfile = 'metadata/info.guardianproject.urzip.yml' # create empty 0 byte .yml file, run read_metadata, it should work open(testfile, 'a').close() apps = fdroidserver.metadata.read_metadata() self.assertEqual(1, len(apps)) os.remove(testfile) # test using internal template apps = fdroidserver.metadata.read_metadata() self.assertEqual(0, len(apps)) fdroidserver.update.create_metadata_from_template(apk) self.assertTrue(os.path.exists(testfile)) apps = fdroidserver.metadata.read_metadata() self.assertEqual(1, len(apps)) for app in apps.values(): self.assertEqual('urzip', app['Name']) self.assertEqual(1, len(app['Categories'])) break # test using external template.yml os.remove(testfile) self.assertFalse(os.path.exists(testfile)) shutil.copy(os.path.join(localmodule, 'examples', 'template.yml'), self.testdir) fdroidserver.update.create_metadata_from_template(apk) self.assertTrue(os.path.exists(testfile)) apps = fdroidserver.metadata.read_metadata() self.assertEqual(1, len(apps)) for app in apps.values(): self.assertEqual('urzip', app['Name']) self.assertEqual(1, len(app['Categories'])) self.assertEqual('Internet', app['Categories'][0]) break with open(testfile) as fp: data = yaml.load(fp, Loader=SafeLoader) self.assertEqual('urzip', data['Name']) self.assertEqual('urzip', data['Summary']) def test_has_known_vulnerability(self): good = [ 'org.bitbucket.tickytacky.mirrormirror_1.apk', 'org.bitbucket.tickytacky.mirrormirror_2.apk', 'org.bitbucket.tickytacky.mirrormirror_3.apk', 'org.bitbucket.tickytacky.mirrormirror_4.apk', 'org.dyndns.fules.ck_20.apk', 'urzip.apk', 'urzip-badcert.apk', 'urzip-badsig.apk', 'urzip-release.apk', 'urzip-release-unsigned.apk', 'repo/com.politedroid_3.apk', 'repo/com.politedroid_4.apk', 'repo/com.politedroid_5.apk', 'repo/com.politedroid_6.apk', 'repo/obb.main.oldversion_1444412523.apk', 'repo/obb.mainpatch.current_1619_another-release-key.apk', 'repo/obb.mainpatch.current_1619.apk', 'repo/obb.main.twoversions_1101613.apk', 'repo/obb.main.twoversions_1101615.apk', 'repo/obb.main.twoversions_1101617.apk', 'repo/urzip-; Рахма́, [rɐxˈmanʲɪnəf] سيرجي_رخمانينوف 谢·.apk', ] for f in good: self.assertFalse(fdroidserver.update.has_known_vulnerability(f)) with self.assertRaises(fdroidserver.exception.FDroidException): fdroidserver.update.has_known_vulnerability('janus.apk') def test_get_apk_icon_when_src_is_none(self): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config # pylint: disable=protected-access icons_src = fdroidserver.update._get_apk_icons_src('urzip-release.apk', None) assert not icons_src def test_strip_and_copy_image(self): in_file = os.path.join(self.basedir, 'metadata', 'info.guardianproject.urzip', 'en-US', 'images', 'icon.png') out_file = os.path.join(self.testdir, 'icon.png') fdroidserver.update._strip_and_copy_image(in_file, out_file) self.assertTrue(os.path.exists(out_file)) in_file = os.path.join(self.basedir, 'corrupt-featureGraphic.png') out_file = os.path.join(self.testdir, 'corrupt-featureGraphic.png') fdroidserver.update._strip_and_copy_image(in_file, out_file) self.assertFalse(os.path.exists(out_file)) def test_create_metadata_from_template_empty_keys(self): apk = {'packageName': 'rocks.janicerand'} with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): os.mkdir('metadata') with open('template.yml', 'w') as f: f.write( textwrap.dedent( '''\ Disabled: License: AuthorName: AuthorEmail: AuthorWebSite: WebSite: SourceCode: IssueTracker: Translation: Changelog: Donate: FlattrID: Bitcoin: Litecoin: Name: AutoName: Summary: RequiresRoot: RepoType: Repo: Binaries: Builds: ArchivePolicy: AutoUpdateMode: UpdateCheckMode: UpdateCheckIgnore: VercodeOperation: UpdateCheckName: UpdateCheckData: CurrentVersion: CurrentVersionCode: NoSourceSince: ''' ) ) fdroidserver.update.create_metadata_from_template(apk) with open(os.path.join('metadata', 'rocks.janicerand.yml')) as f: metadata_content = yaml.load(f, Loader=SafeLoader) self.maxDiff = None self.assertDictEqual( metadata_content, { 'ArchivePolicy': None, 'AuthorEmail': '', 'AuthorName': '', 'AuthorWebSite': '', 'AutoName': 'rocks.janicerand', 'AutoUpdateMode': '', 'Binaries': '', 'Bitcoin': '', 'Builds': None, 'Changelog': '', 'CurrentVersion': '', 'CurrentVersionCode': None, 'Disabled': '', 'Donate': '', 'FlattrID': '', 'IssueTracker': '', 'License': '', 'Litecoin': '', 'Name': 'rocks.janicerand', 'NoSourceSince': '', 'Repo': '', 'RepoType': '', 'RequiresRoot': None, 'SourceCode': '', 'Summary': 'rocks.janicerand', 'Translation': '', 'UpdateCheckData': '', 'UpdateCheckIgnore': '', 'UpdateCheckMode': '', 'UpdateCheckName': '', 'VercodeOperation': None, 'WebSite': '', }, ) def test_insert_funding_yml_donation_links(self): os.chdir(self.testdir) os.mkdir('build') content = textwrap.dedent( """ community_bridge: '' custom: [LINK1, LINK2] github: USERNAME issuehunt: USERNAME ko_fi: USERNAME liberapay: USERNAME open_collective: USERNAME otechie: USERNAME patreon: USERNAME """ ) app = fdroidserver.metadata.App() app.id = 'fake.app.id' apps = {app.id: app} os.mkdir(os.path.join('build', app.id)) fdroidserver.update.insert_funding_yml_donation_links(apps) for field in DONATION_FIELDS: self.assertFalse(app.get(field)) with open(os.path.join('build', app.id, 'FUNDING.yml'), 'w') as fp: fp.write(content) fdroidserver.update.insert_funding_yml_donation_links(apps) for field in DONATION_FIELDS: self.assertIsNotNone(app.get(field), field) self.assertEqual('LINK1', app.get('Donate')) self.assertEqual('USERNAME', app.get('Liberapay')) self.assertEqual('USERNAME', app.get('OpenCollective')) app['Donate'] = 'keepme' app['Liberapay'] = 'keepme' app['OpenCollective'] = 'keepme' fdroidserver.update.insert_funding_yml_donation_links(apps) for field in DONATION_FIELDS: self.assertEqual('keepme', app.get(field)) def test_insert_funding_yml_donation_links_one_at_a_time(self): """Exercise the FUNDING.yml code one entry at a time""" os.chdir(self.testdir) os.mkdir('build') app = fdroidserver.metadata.App() app.id = 'fake.app.id' apps = {app.id: app} os.mkdir(os.path.join('build', app.id)) fdroidserver.update.insert_funding_yml_donation_links(apps) for field in DONATION_FIELDS: self.assertIsNone(app.get(field)) content = textwrap.dedent( """ community_bridge: 'blah-de-blah' github: USERNAME issuehunt: USERNAME ko_fi: USERNAME liberapay: USERNAME open_collective: USERNAME patreon: USERNAME """ ) for line in content.split('\n'): if not line: continue app = fdroidserver.metadata.App() app.id = 'fake.app.id' apps = {app.id: app} with open(os.path.join('build', app.id, 'FUNDING.yml'), 'w') as fp: fp.write(line) data = yaml.load(line, Loader=SafeLoader) fdroidserver.update.insert_funding_yml_donation_links(apps) if 'liberapay' in data: self.assertEqual(data['liberapay'], app.get('Liberapay')) elif 'open_collective' in data: self.assertEqual(data['open_collective'], app.get('OpenCollective')) else: for v in data.values(): self.assertEqual(app.get('Donate', '').split('/')[-1], v) def test_insert_funding_yml_donation_links_with_corrupt_file(self): os.chdir(self.testdir) os.mkdir('build') app = fdroidserver.metadata.App() app.id = 'fake.app.id' apps = {app.id: app} os.mkdir(os.path.join('build', app.id)) with open(os.path.join('build', app.id, 'FUNDING.yml'), 'w') as fp: fp.write( textwrap.dedent( """ opencollective: foo custom: [] liberapay: : """ ) ) fdroidserver.update.insert_funding_yml_donation_links(apps) for field in DONATION_FIELDS: self.assertIsNone(app.get(field)) def test_sanitize_funding_yml(self): with open(os.path.join(self.basedir, 'funding-usernames.yaml')) as fp: data = yaml.load(fp, Loader=SafeLoader) for k, entries in data.items(): for entry in entries: if k in 'custom': m = fdroidserver.update.sanitize_funding_yml_entry(entry) else: m = fdroidserver.update.sanitize_funding_yml_name(entry) if k == 'bad': self.assertIsNone(m) else: self.assertIsNotNone(m) self.assertIsNone(fdroidserver.update.sanitize_funding_yml_entry('foo\nbar')) self.assertIsNone(fdroidserver.update.sanitize_funding_yml_entry( ''.join(chr(random.randint(65, 90)) for _ in range(2049)))) # not recommended but valid entries self.assertIsNotNone(fdroidserver.update.sanitize_funding_yml_entry(12345)) self.assertIsNotNone(fdroidserver.update.sanitize_funding_yml_entry(5.0)) self.assertIsNotNone(fdroidserver.update.sanitize_funding_yml_entry(' WhyIncludeWhitespace ')) self.assertIsNotNone(fdroidserver.update.sanitize_funding_yml_entry(['first', 'second'])) def test_set_localized_text_entry(self): os.chdir(self.testdir) config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.update.config = config fdroidserver.update.options = fdroidserver.common.options files = { 'full-description.txt': 'description', 'short-description.txt': 'summary', 'title.txt': 'name', 'video-url.txt': 'video', } for f, key in files.items(): limit = config['char_limits'][key] with open(f, 'w') as fp: fp.write(''.join(random.choice(string.ascii_letters) for i in range(limit + 100))) locale = 'ru_US' app = dict() fdroidserver.update._set_localized_text_entry(app, locale, key, f) self.assertEqual(limit, len(app['localized'][locale][key])) f = 'badlink-' + f os.symlink('/path/to/nowhere', f) app = dict() fdroidserver.update._set_localized_text_entry(app, locale, key, f) self.assertIsNone(app['localized'].get(locale, {}).get(key)) def test_set_author_entry(self): os.chdir(self.testdir) config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.update.config = config fdroidserver.update.options = fdroidserver.common.options f = 'contact-website.txt' key = 'author' url = 'https://f-droid.org/' limit = config['char_limits']['author'] with open(f, 'w') as fp: fp.write(url) fp.write('\n') app = dict() fdroidserver.update._set_author_entry(app, key, f) self.assertEqual(url, app[key]) f = 'limits.txt' key = 'author' limit = config['char_limits']['author'] for key in ('authorEmail', 'authorPhone', 'authorWebSite'): with open(f, 'w') as fp: fp.write(''.join(random.choice(string.ascii_letters) for i in range(limit + 100))) app = dict() fdroidserver.update._set_author_entry(app, key, f) self.assertEqual(limit, len(app[key])) f = 'badlink.txt' os.symlink('/path/to/nowhere', f) app = dict() fdroidserver.update._set_author_entry(app, key, f) self.assertIsNone(app.get(key)) def test_status_update_json(self): fdroidserver.common.config = {} fdroidserver.update.config = {} fdroidserver.update.options = Options with tempfile.TemporaryDirectory() as tmpdir: os.chdir(tmpdir) with mock.patch('sys.argv', ['fdroid update', '']): fdroidserver.update.status_update_json([], []) with open('repo/status/update.json') as fp: data = json.load(fp) self.assertTrue('apksigner' in data) fdroidserver.update.config = { 'apksigner': 'apksigner', } fdroidserver.update.status_update_json([], []) with open('repo/status/update.json') as fp: data = json.load(fp) self.assertEqual(shutil.which(fdroidserver.update.config['apksigner']), data['apksigner']) fdroidserver.update.config = {} fdroidserver.common.fill_config_defaults(fdroidserver.update.config) fdroidserver.update.status_update_json([], []) with open('repo/status/update.json') as fp: data = json.load(fp) self.assertEqual(fdroidserver.update.config.get('apksigner'), data['apksigner']) self.assertEqual(fdroidserver.update.config['jarsigner'], data['jarsigner']) self.assertEqual(fdroidserver.update.config['keytool'], data['keytool']) def test_scan_metadata_androguard(self): def _create_apkmetadata_object(apkName): """Create an empty apk metadata object.""" apk = {} apk['apkName'] = apkName apk['uses-permission'] = [] apk['uses-permission-sdk-23'] = [] apk['features'] = [] apk['icons_src'] = {} return apk apkList = [ ( 'org.dyndns.fules.ck_20.apk', { 'apkName': 'org.dyndns.fules.ck_20.apk', 'uses-permission': [ fdroidserver.update.UsesPermission( name='android.permission.BIND_INPUT_METHOD', maxSdkVersion=None, ), fdroidserver.update.UsesPermission( name='android.permission.READ_EXTERNAL_STORAGE', maxSdkVersion=None, ), fdroidserver.update.UsesPermission( name='android.permission.VIBRATE', maxSdkVersion=None ), ], 'uses-permission-sdk-23': [], 'features': [], 'icons_src': { '240': 'res/drawable-hdpi-v4/icon_launcher.png', '120': 'res/drawable-ldpi-v4/icon_launcher.png', '160': 'res/drawable-mdpi-v4/icon_launcher.png', '-1': 'res/drawable-mdpi-v4/icon_launcher.png', }, 'packageName': 'org.dyndns.fules.ck', 'versionCode': 20, 'versionName': 'v1.6pre2', 'minSdkVersion': 7, 'name': 'Compass Keyboard', 'targetSdkVersion': 8, 'nativecode': [ 'arm64-v8a', 'armeabi', 'armeabi-v7a', 'mips', 'mips64', 'x86', 'x86_64', ], }, ) ] for apkfile, apkaapt in apkList: apkandroguard = _create_apkmetadata_object(apkfile) fdroidserver.update.scan_apk_androguard(apkandroguard, apkfile) self.maxDiff = None self.assertEqual(apkaapt, apkandroguard) def test_exclude_disabled_apks(self): os.chdir(self.testdir) os.mkdir('repo') testapk = os.path.join('repo', 'com.politedroid_6.apk') testapk_new = os.path.join('repo', 'Politedroid-1.5.apk') shutil.copy(os.path.join(self.basedir, testapk), testapk_new) config = dict() fdroidserver.common.fill_config_defaults(config) config['ndk_paths'] = dict() fdroidserver.common.config = config fdroidserver.update.config = config fdroidserver.common.options = Options fdroidserver.update.options = fdroidserver.common.options fdroidserver.update.options.clean = True app = fdroidserver.metadata.App() app.id = 'com.politedroid' apps = {app.id: app} build = fdroidserver.metadata.Build() build.versionCode = 6 build.disable = "disabled" app['Builds'] = [build] knownapks = fdroidserver.common.KnownApks() apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks, False, apps) self.assertEqual([], apks) def test_archive_old_apks_ArchivePolicy_0(self): app = fdroidserver.metadata.App() app.id = 'test' app.ArchivePolicy = 0 apps = {app.id: app} with self.assertLogs(level='DEBUG') as cm: fdroidserver.update.archive_old_apks(apps, [], [], '', '', 3) self.assertEqual(cm.output, [ "DEBUG:root:Checking archiving for test - apks:0, keepversions:0, archapks:0" ]) def test_archive_old_apks(self): app = fdroidserver.metadata.App() app.id = 'test' app.VercodeOperation = ['%c+1', '%c+2', '%c+3', '%c+4'] apps = {app.id: app} with self.assertLogs(level='DEBUG') as cm: fdroidserver.update.archive_old_apks(apps, [], [], '', '', 3) self.assertEqual(cm.output, [ "DEBUG:root:Checking archiving for test - apks:0, keepversions:12, archapks:0" ]) app = fdroidserver.metadata.App() app.id = 'org.smssecure.smssecure' app.CurrentVersionCode = 135 apps = {app.id: app} with self.assertLogs(level='DEBUG') as cm: fdroidserver.update.archive_old_apks(apps, [], [], '', '', 3) self.assertEqual(cm.output, [ "DEBUG:root:Checking archiving for org.smssecure.smssecure - apks:0, keepversions:6, archapks:0" ]) def test_categories_txt_is_removed_by_delete_unknown(self): """categories.txt used to be a part of this system, now its nothing.""" os.chdir(self.testdir) Path('config.yml').write_text('repo_pubkey: ffffffffffffffffffffffffffffffffffffffff') categories_txt = Path('repo/categories.txt') categories_txt.parent.mkdir() categories_txt.write_text('placeholder') self.assertTrue(categories_txt.exists()) with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']): fdroidserver.update.main() self.assertFalse(categories_txt.exists()) def test_no_blank_auto_defined_categories(self): """When no app has Categories, there should be no definitions in the repo.""" os.chdir(self.testdir) os.mkdir('metadata') os.mkdir('repo') Path('config.yml').write_text( 'repo_pubkey: ffffffffffffffffffffffffffffffffffffffff' ) testapk = os.path.join('repo', 'com.politedroid_6.apk') shutil.copy(os.path.join(self.basedir, testapk), testapk) Path('metadata/com.politedroid.yml').write_text('Name: Polite') with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']): fdroidserver.update.main() with open('repo/index-v2.json') as fp: index = json.load(fp) self.assertFalse(CATEGORIES_CONFIG_NAME in index['repo']) def test_auto_defined_categories(self): """Repos that don't define categories in config/ should use auto-generated.""" os.chdir(self.testdir) os.mkdir('metadata') os.mkdir('repo') Path('config.yml').write_text( 'repo_pubkey: ffffffffffffffffffffffffffffffffffffffff' ) testapk = os.path.join('repo', 'com.politedroid_6.apk') shutil.copy(os.path.join(self.basedir, testapk), testapk) Path('metadata/com.politedroid.yml').write_text('Categories: [Time]') with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']): fdroidserver.update.main() with open('repo/index-v2.json') as fp: index = json.load(fp) self.assertEqual( {'Time': {'name': {'en-US': 'Time'}}}, index['repo'][CATEGORIES_CONFIG_NAME], ) def test_auto_defined_categories_two_apps(self): """Repos that don't define categories in config/ should use auto-generated.""" os.chdir(self.testdir) os.mkdir('metadata') os.mkdir('repo') Path('config.yml').write_text( 'repo_pubkey: ffffffffffffffffffffffffffffffffffffffff' ) testapk = os.path.join('repo', 'com.politedroid_6.apk') shutil.copy(os.path.join(self.basedir, testapk), testapk) Path('metadata/com.politedroid.yml').write_text('Categories: [bar]') testapk = os.path.join('repo', 'souch.smsbypass_9.apk') shutil.copy(os.path.join(self.basedir, testapk), testapk) Path('metadata/souch.smsbypass.yml').write_text('Categories: [foo, bar]') with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']): fdroidserver.update.main() with open('repo/index-v2.json') as fp: index = json.load(fp) self.assertEqual( {'bar': {'name': {'en-US': 'bar'}}, 'foo': {'name': {'en-US': 'foo'}}}, index['repo'][CATEGORIES_CONFIG_NAME], ) def test_auto_defined_categories_mix_into_config_categories(self): """Repos that don't define all categories in config/ also use auto-generated.""" os.chdir(self.testdir) os.mkdir('config') Path('config/categories.yml').write_text('System: {name: System Apps}') os.mkdir('metadata') os.mkdir('repo') Path('config.yml').write_text( 'repo_pubkey: ffffffffffffffffffffffffffffffffffffffff' ) testapk = os.path.join('repo', 'com.politedroid_6.apk') shutil.copy(os.path.join(self.basedir, testapk), testapk) Path('metadata/com.politedroid.yml').write_text('Categories: [Time]') testapk = os.path.join('repo', 'souch.smsbypass_9.apk') shutil.copy(os.path.join(self.basedir, testapk), testapk) Path('metadata/souch.smsbypass.yml').write_text('Categories: [System, Time]') with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']): fdroidserver.update.main() with open('repo/index-v2.json') as fp: index = json.load(fp) self.assertEqual( { 'System': {'name': {'en-US': 'System Apps'}}, 'Time': {'name': {'en-US': 'Time'}}, }, index['repo'][CATEGORIES_CONFIG_NAME], ) def test_empty_categories_not_in_index(self): """A category with no apps should be ignored, even if defined in config.""" os.chdir(self.testdir) os.mkdir('config') Path('config/categories.yml').write_text('System: {name: S}\nTime: {name: T}\n') os.mkdir('metadata') os.mkdir('repo') Path('config.yml').write_text( 'repo_pubkey: ffffffffffffffffffffffffffffffffffffffff' ) testapk = os.path.join('repo', 'com.politedroid_6.apk') shutil.copy(os.path.join(self.basedir, testapk), testapk) Path('metadata/com.politedroid.yml').write_text('Categories: [Time]') with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']): fdroidserver.update.main() with open('repo/index-v2.json') as fp: index = json.load(fp) self.assertEqual( {'Time': {'name': {'en-US': 'T'}}}, index['repo'][CATEGORIES_CONFIG_NAME], ) class TestParseIpa(unittest.TestCase): def test_parse_ipa(self): self.maxDiff = None try: import biplist # Fedora does not have a biplist package biplist # silence the linters except ImportError as e: self.skipTest(str(e)) ipa_path = os.path.join( os.path.dirname(os.path.abspath(__file__)), 'com.fake.IpaApp_1000000000001.ipa', ) result = fdroidserver.update.parse_ipa(ipa_path, 'fake_size', 'fake_sha') self.maxDiff = None self.assertDictEqual( result, { 'apkName': 'com.fake.IpaApp_1000000000001.ipa', 'hash': 'fake_sha', 'hashType': 'sha256', 'packageName': 'org.onionshare.OnionShare', 'size': 'fake_size', 'versionCode': 1000000000001, 'versionName': '1.0.1', 'ipa_DTPlatformVersion': '16.4', 'ipa_MinimumOSVersion': '15.0', 'ipa_entitlements': set(), 'ipa_permissions': { 'NSCameraUsageDescription': 'Please allow access to your ' 'camera, if you want to ' 'create photos or videos for ' 'direct sharing.', 'NSMicrophoneUsageDescription': 'Please allow access to ' 'your microphone, if you ' 'want to create videos ' 'for direct sharing.', 'NSPhotoLibraryUsageDescription': 'Please allow access to ' 'your photo library, if ' 'you want to share ' 'photos.', }, 'name': 'OnionShare', }, ) class TestUpdateVersionStringToInt(unittest.TestCase): def test_version_string_to_int(self): self.assertEqual( fdroidserver.update.version_string_to_int("1.2.3"), 1000002000003 ) self.assertEqual(fdroidserver.update.version_string_to_int("0.0.0003"), 3) self.assertEqual(fdroidserver.update.version_string_to_int("0.0.0"), 0) self.assertEqual( fdroidserver.update.version_string_to_int("4321.321.21"), 4321000321000021 ) self.assertEqual( fdroidserver.update.version_string_to_int("18446744.073709.551615"), 18446744073709551615, ) def test_version_string_to_int_value_errors(self): with self.assertRaises(ValueError): fdroidserver.update.version_string_to_int("1.2.3a") with self.assertRaises(ValueError): fdroidserver.update.version_string_to_int("asdfasdf") with self.assertRaises(ValueError): fdroidserver.update.version_string_to_int("1.2.-3") with self.assertRaises(ValueError): fdroidserver.update.version_string_to_int("-1.2.-3") with self.assertRaises(ValueError): fdroidserver.update.version_string_to_int("0.0.0x3") class TestScanRepoForIpas(unittest.TestCase): def setUp(self): self.maxDiff = None def test_scan_repo_for_ipas_no_cache(self): self.maxDiff = None with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): os.mkdir("repo") with open('repo/abc.Def_123.ipa', 'w') as f: f.write('abc') with open('repo/xyz.XXX_123.ipa', 'w') as f: f.write('xyz') apkcache = mock.MagicMock() # apkcache['a'] = 1 repodir = "repo" knownapks = mock.MagicMock() def mocked_parse(p, s, c): # pylint: disable=unused-argument return {'packageName': 'abc' if 'abc' in p else 'xyz'} with mock.patch('fdroidserver.update.parse_ipa', mocked_parse): ipas, checkchanged = fdroidserver.update.scan_repo_for_ipas( apkcache, repodir, knownapks ) self.assertEqual(checkchanged, True) self.assertEqual(len(ipas), 2) package_names_in_ipas = [x['packageName'] for x in ipas] self.assertTrue('abc' in package_names_in_ipas) self.assertTrue('xyz' in package_names_in_ipas) apkcache_setter_package_name = [ x.args[1]['packageName'] for x in apkcache.__setitem__.mock_calls ] self.assertTrue('abc' in apkcache_setter_package_name) self.assertTrue('xyz' in apkcache_setter_package_name) self.assertEqual(apkcache.__setitem__.call_count, 2) knownapks.recordapk.call_count = 2 self.assertTrue( unittest.mock.call('abc.Def_123.ipa', 'abc') in knownapks.recordapk.mock_calls ) self.assertTrue( unittest.mock.call('xyz.XXX_123.ipa', 'xyz') in knownapks.recordapk.mock_calls ) class TestParseIosScreenShotName(unittest.TestCase): def setUp(self): self.maxDiff = None def test_parse_ios_screenshot_name_atforamt_iphone8(self): self.assertEqual( fdroidserver.update.parse_ios_screenshot_name(Path("iPhone 8+ @ iOS 16-1.png")), ("phoneScreenshots", "iPhone 8+", "iOS 16",), ) def test_parse_ios_screenshot_name_atforamt_ipad13(self): self.assertEqual( fdroidserver.update.parse_ios_screenshot_name(Path("iPad Pro 12.9\" 2gen @ iOS 16-1.png")), ("tenInchScreenshots", "iPad Pro 12.9\" 2gen", "iOS 16",), ) def test_parse_ios_screenshot_name_underscoreforamt_ipad(self): self.assertEqual( fdroidserver.update.parse_ios_screenshot_name(Path("1_ipadPro129_1.1.png")), ("tenInchScreenshots", "ipadpro129", "unknown",), ) def test_parse_ios_screenshot_name_underscoreforamt_iphone(self): self.assertEqual( fdroidserver.update.parse_ios_screenshot_name(Path("1_iphone6Plus_1.1.png")), ("phoneScreenshots", "iphone6plus", "unknown",), ) class TestInsertLocalizedIosAppMetadata(unittest.TestCase): def test_insert_localized_ios_app_metadata(self): self.maxDiff = None self.apps_with_packages = { "org.fake": {} } def _mock_discover(fastlane_dir): self.assertEqual( fastlane_dir, Path('build/org.fake/fastlane'), ) return {"fake screenshots": "fake"} def _mock_copy(screenshots, package_name): self.assertEqual(screenshots, {"fake screenshots": "fake"}) self.assertEqual(package_name, "org.fake") with mock.patch('fdroidserver.update.discover_ios_screenshots', _mock_discover): self.set_localized_mock = mock.Mock() with mock.patch('fdroidserver.update.copy_ios_screenshots_to_repo', _mock_copy): with mock.patch("fdroidserver.update._set_localized_text_entry", self.set_localized_mock): return fdroidserver.update.insert_localized_ios_app_metadata( self.apps_with_packages ) self.assertListEqual( self.set_localized_mock.call_args_list, [ mock.call({}, 'en-US', 'name', Path('build/org.fake/fastlane/metadata/en-US/name.txt')), mock.call({}, 'en-US', 'summary', Path('build/org.fake/fastlane/metadata/en-US/subtitle.txt')), mock.call({}, 'en-US', 'description', Path('build/org.fake/fastlane/metadata/en-US/description.txt')), mock.call({}, 'de-DE', 'name', Path('build/org.fake/fastlane/metadata/de-DE/name.txt')), mock.call({}, 'de-DE', 'summary', Path('build/org.fake/fastlane/metadata/de-DE/subtitle.txt')), mock.call({}, 'de-DE', 'description', Path('build/org.fake/fastlane/metadata/de-DE/description.txt')), ], ) class TestDiscoverIosScreenshots(unittest.TestCase): def test_discover_ios_screenshots(self): self.maxDiff = None with tempfile.TemporaryDirectory() as fastlane_dir: fastlane_dir = Path(fastlane_dir) (fastlane_dir / "screenshots/en-US").mkdir(parents=True) with open(fastlane_dir / "screenshots/en-US/iPhone 8+ @ iOS 16-1.png", 'w') as f: f.write("1") with open(fastlane_dir / "screenshots/en-US/iPad Pro 12.9\" 2gen @ iOS 16-1.png", "w") as f: f.write("2") with open(fastlane_dir / "screenshots/en-US/iPad Pro 12.9\" 2gen @ iOS 16-2.png", "w") as f: f.write("3") (fastlane_dir / "screenshots/de-DE").mkdir(parents=True) with open(fastlane_dir / "screenshots/de-DE/1_ipadPro129_1.1.png", "w") as f: f.write("4") screenshots = fdroidserver.update.discover_ios_screenshots(fastlane_dir) self.assertDictEqual( screenshots, { "en-US": { "phoneScreenshots": [ fastlane_dir / "screenshots/en-US/iPhone 8+ @ iOS 16-1.png", ], "tenInchScreenshots": [ fastlane_dir / "screenshots/en-US/iPad Pro 12.9\" 2gen @ iOS 16-1.png", fastlane_dir / "screenshots/en-US/iPad Pro 12.9\" 2gen @ iOS 16-2.png", ], }, "de-DE": { "tenInchScreenshots": [ fastlane_dir / "screenshots/de-DE/1_ipadPro129_1.1.png", ], }, }, ) class TestCopyIosScreenshotsToRepo(unittest.TestCase): def test_copy_ios_screenshots_to_repo(self): self.maxDiff = None screenshot_dir_en = Path("build/org.fake/fastlane/screenshots/en-US") s1 = screenshot_dir_en / "iPhone 8+ @ iOS 16-1.png" s2 = screenshot_dir_en / "iPad Pro 12.9\" 2gen @ iOS 16-1.png" s3 = screenshot_dir_en / "iPad Pro 12.9\" 2gen @ iOS 16-2.png" screenshot_dir_de = Path("build/org.fake/fastlane/screenshots/de-DE") s4 = screenshot_dir_de / "1_ipadPro129_1.1.png" cmock = mock.Mock() with mock.patch("fdroidserver.update._strip_and_copy_image", cmock): fdroidserver.update.copy_ios_screenshots_to_repo( { "en-US": { "phoneScreenshots": [s1], "tenInchScreenshots": [s2, s3], }, "de-DE": { "tenInchScreenshots": [s4], }, }, "org.fake", ) self.assertListEqual( cmock.call_args_list, [ mock.call( 'build/org.fake/fastlane/screenshots/en-US/iPhone 8+ @ iOS 16-1.png', 'repo/org.fake/en-US/phoneScreenshots/iPhone_8+_@_iOS_16-1.png', ), mock.call( 'build/org.fake/fastlane/screenshots/en-US/iPad Pro 12.9" 2gen @ iOS 16-1.png', 'repo/org.fake/en-US/tenInchScreenshots/iPad_Pro_12.9"_2gen_@_iOS_16-1.png', ), mock.call( 'build/org.fake/fastlane/screenshots/en-US/iPad Pro 12.9" 2gen @ iOS 16-2.png', 'repo/org.fake/en-US/tenInchScreenshots/iPad_Pro_12.9"_2gen_@_iOS_16-2.png', ), mock.call( 'build/org.fake/fastlane/screenshots/de-DE/1_ipadPro129_1.1.png', 'repo/org.fake/de-DE/tenInchScreenshots/1_ipadPro129_1.1.png', ), ], ) class TestGetIpaIcon(unittest.TestCase): def test_get_ipa_icon(self): self.maxDiff = None with tempfile.TemporaryDirectory() as tmpdir: tmpdir = Path(tmpdir) (tmpdir / 'OnionBrowser.xcodeproj').mkdir() with open(tmpdir / 'OnionBrowser.xcodeproj/project.pbxproj', "w") as f: f.write("") icondir = tmpdir / "fake_icon.appiconset" icondir.mkdir() with open(icondir / "Contents.json", "w", encoding="utf-8") as f: f.write(""" {"images": [ {"scale": "2x", "size": "128x128", "filename": "nope"}, {"scale": "1x", "size": "512x512", "filename": "nope"}, {"scale": "1x", "size": "16x16", "filename": "nope"}, {"scale": "1x", "size": "32x32", "filename": "yep"} ]} """) pfp = mock.Mock(return_value="fake_icon") with mock.patch("fdroidserver.update._parse_from_pbxproj", pfp): p = fdroidserver.update._get_ipa_icon(tmpdir) self.assertEqual(str(icondir / "yep"), p) class TestParseFromPbxproj(unittest.TestCase): def test_parse_from_pbxproj(self): self.maxDiff = None with tempfile.TemporaryDirectory() as tmpdir: with open(Path(tmpdir) / "asdf.pbxproj", 'w', encoding="utf-8") as f: f.write(""" 230jfaod=flc' ASSETCATALOG_COMPILER_APPICON_NAME = MyIcon; cm opa1c p[m """) v = fdroidserver.update._parse_from_pbxproj( Path(tmpdir) / "asdf.pbxproj", "ASSETCATALOG_COMPILER_APPICON_NAME" ) self.assertEqual(v, "MyIcon") if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) import argparse parser = argparse.ArgumentParser() parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(UpdateTest)) newSuite.addTest(unittest.makeSuite(TestUpdateVersionStringToInt)) newSuite.addTest(unittest.makeSuite(TestScanRepoForIpas)) newSuite.addTest(unittest.makeSuite(TestParseIosScreenShotName)) newSuite.addTest(unittest.makeSuite(TestInsertLocalizedIosAppMetadata)) newSuite.addTest(unittest.makeSuite(TestDiscoverIosScreenshots)) newSuite.addTest(unittest.makeSuite(TestGetIpaIcon)) unittest.main(failfast=False) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/urzip-badcert.apk0000644000175000017500000002330514620351225017417 0ustar00hanshansPK OC=-res/drawable/ic_launcher.pngPNG  IHDRw=LIDATHǥyPuƟ{².˲ 8ႈ 628yr OCM5V^ʡbY"0,,{DPXϟ>ߋ4zљp a22x@-q &6'xnب4Ռs-<!a^zD\W6=YMQ2ɗw|՟-f̶vJA؜s1Ym®n>/]ҹr8୔@(r1.}j:Oi> DowJ'CRRVJ eMPy|{|7sRNQy(KNnቹM{p՝Ғ6Q:h++-LxȄsՆIT~M≹\{V{TTX@vL (Ćyq]zAnBFZmHocs  Çd6ihh CCfQ!j2OPSեlUY G?15t"GUˢy*(M6\$""DJiujdo5GcF^G"@ Vx\|T$SgOt ::erOK\]Ϟb¶hӫnZ>5^7 S~6B3Щb#RجJ[ =64%1N ('5+٥bvTD%W< `y*VnJK6͵[h8l3PA$M;QZ1[,U3|.nlIuG2 3 eb2V'0`ę&Uڂg ,.!蒎Q1 F|UJvuӆaL06 cLzN׎zXYٹLGBr8#0LmMOS7onDVv͞} DLژ.C{e 󳵴&cY,ZKSiZ=I`҇6%]Nm},ŅU5SN܈mݷ<65}E޷'0CקԄf.̙3;EnK=_d*/r.Ѵ#>)?/Ԟ H\o7aU%(|${hjǜIL~ cS/LҘPPX"1sgsLuP!!"@&849^1|'3}ȕs_-]$IVM1,,D-aEDA̤rIENDB`PKOCS Lres/layout/activity_main.xmluN@=[$BHA"5%$ 'Ql*x$ G;es;wofw} ƘMCt- G«& 99w%fmF)B[nTχUПg!F$~"u.m*~RUx:R}o{EO١R3~`)6d?Tޟ#]{ȣ>64u6Z?p̑?gqդ~,ᛙPKOCIדAndroidManifest.xmlKoSGϵM'ǘR"!Tmqh˦E,.. 좟U V,*枩'|WϽg͙3sQS:AQuS8OA MzQz } }="4TCC?CA@D_@@/ 1eh ZBB/} =~z -Uh%oriG{vhxlإi٧*zb#(:bquT;8ؾWgW*} ۺ0qUaںʓ}Xo-V ^QwA-ܷ}5qm { hUBY- {V越UH^ʛ_U?|}!Q*2`1kQű*UЫW9tO#/");W `WKz: ԡ:o"]sBֻZ%BKo/D]ˈKwJ(Tf@hUwӦ)}*k[mWh -чo;EuĮ EFo>¿'z=zlNsq:t9vMtLI3ds&=>yiBy @Qhf[)fv4ώS܆B-bng$3ƘI܆CF7bTިF ^K aoބ؎i`cY,mwD̈́ߤ2iqoM5C7e&az$yώӼ5wНwӷ>\?.>уl=?ȿ|㫝D%"Z+Iz$4_׉!DW!<# '@vz]`<s"x.WWkSo& ^@w3N?~2 Z=A~:x|wi#{ȃx|?~| 0A?#` <΁ge m{m:1oN-`O<(3<" p~|>,)`<  2x| :'`C`^4`^"#t`,&Ly@70A%97` `lwmj] ;Np' `#S`<)pn"jRPJ/@oTz :9i*u]kZI<+8<$\Q c*{RUY_Q:Հ~Eݨʎx մ '`ˀ~-_Я+:? 䙂>߯i4-*ʤ$ǩJrVpDɣJE,[eq H*("8-dqX YO{,Ec b!uHr հ<+s>:>,|ƃ2t? C߂/!}!Tv=dsk{}1YoU)/^D^ʮпʺ{w!W(S!ȾwUjI#hpFϒkWAzk5ِF9"t7Oky>ZXJn:\MlAbZs3梛h@O b1:A+Ml#e?ON{LFΑ6~+vǩfs;E{Ȳղ eJ=(G|>#f2H!pih 4vF <|p;x ~6j'>EEDy>l q(هSWoG_(u'l܊ s㑭9io1a3iFgGy$⠉8ı&JF'B VY]cЋ>hc(&5( Gt.φpsOkޭoҾ.mq\ˆ"PxVD%"<\ Ӓ뉢?WFy_ن]͛?;m)zns,?}3&6ܯ5UϓY9gY'sS!uVJ:FuP9&6uDT=WJ5{L8JV>׮W̝Ϣh> ER%{66o6=C:Ӓ鱨\l  EoL'֥;ץץT4?|LĹoxp٫|[C-J(-3S2c)[U>s95E!\!5еYj܂9U*S9;L=ۭ&ǵ+G}gj&_>槭@A0UP)Y3V+N17ST*.9r wE[+Z0u$Ϥھ^<2Ȳ&Y:UY&;S;櫖_p,{'|%WrJHrw-oMVS3|uv3^f+W|Ĝvن)w;S*&ɰS_+9CTl.Ljhdwkp7NQi0}c޶or.lfi/Z|n󊶵V0ṄO΀푪[q[8& )ZP:+z]œ󟌪eJ1!Ч5c :2TEJv)\-x["c*V1B`t3wĬ Q7ɜHNsi6e3k "{괬k,fCXX; HSxGq~IK e;W#tdh,*38gq sSE^]Nz}J6q(bݘ3b#QRN5EAr^ýs*^5 vx;vΨ7h*+>ރEM!b2 >j2,4X7$+a0shNbk(-f_.|PK*uE*M._META-INF/CERT.RSAUT wSwSux 3hbfajhδAG&FFCnN6Vm>f&)Vn"M/ f&F&&FS^FVs ̡,lL| 0c^JQ~fHY*Tn 'khd`dhfddd`l%kX@8ٍ ̍ L w;',fڦQV^:|Ʊ  F;f\=oOz<*}yC7Zl//23J^w0ɯy_U0|I7'ܘvg&ݳĽ hA t/'k?LVprsV7Yʮ}:FKO6{Ul{[kP–k2ئq/2klj+~=}$!ۿ*%,sҸ-}&c˪ޠ^aKaZj6>1h|Ld<4} %'h`il0TonՔ#3< 5Cԋ/Z__}賀_9O|P,)I=|oaw{_h\2Q=g_vjҵW*Za4ӥr y9:q}k PK OC=-res/drawable/ic_launcher.pngPKOCS Lres/layout/activity_main.xmlPKOCIדAndroidManifest.xmlPK OC?} resources.arscPKOCT~ classes.dexPKOC,2META-INF/MANIFEST.MFPKOCl=T,7{ META-INF/CERT.SFPK*uE*M._!META-INF/CERT.RSAUTwSux PK%$././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/urzip-badsig.apk0000644000175000017500000002330314620351225017242 0ustar00hanshansPK OC=-res/drawable/ic_launcher.pngPNG  IHDRw=LIDATHǥyPuƟ{².˲ 8ႈ 628yr OCM5V^ʡbY"0,,{DPXϟ>ߋ4zљp a22x@-q &6'xnب4Ռs-<!a^zD\W6=YMQ2ɗw|՟-f̶vJA؜s1Ym®n>/]ҹr8୔@(r1.}j:Oi> DowJ'CRRVJ eMPy|{|7sRNQy(KNnቹM{p՝Ғ6Q:h++-LxȄsՆIT~M≹\{V{TTX@vL (Ćyq]zAnBFZmHocs  Çd6ihh CCfQ!j2OPSեlUY G?15t"GUˢy*(M6\$""DJiujdo5GcF^G"@ Vx\|T$SgOt ::erOK\]Ϟb¶hӫnZ>5^7 S~6B3Щb#RجJ[ =64%1N ('5+٥bvTD%W< `y*VnJK6͵[h8l3PA$M;QZ1[,U3|.nlIuG2 3 eb2V'0`ę&Uڂg ,.!蒎Q1 F|UJvuӆaL06 cLzN׎zXYٹLGBr8#0LmMOS7onDVv͞} DLژ.C{e 󳵴&cY,ZKSiZ=I`҇6%]Nm},ŅU5SN܈mݷ<65}E޷'0CקԄf.̙3;EnK=_d*/r.Ѵ#>)?/Ԟ H\o7aU%(|${hjǜIL~ cS/LҘPPX"1sgsLuP!!"@&849^1|'3}ȕs_-]$IVM1,,D-aEDA̤rIENDB`PKOCS Lres/layout/activity_main.xmluN@=[$BHA"5%$ 'Ql*x$ G;es;wofw} ƘMCt- G«& 99w%fmF)B[nTχUПg!F$~"u.m*~RUx:R}o{EO١R3~`)6d?Tޟ#]{ȣ>64u6Z?p̑?gqդ~,ᛙPKOCIדAndroidManifest.xmlKoSGϵM'ǘR"!Tmqh˦E,.. 좟U V,*枩'|WϽg͙3sQS:AQuS8OA MzQz } }="4TCC?CA@D_@@/ 1eh ZBB/} =~z -Uh%oriG{vhxlإi٧*zb#(:bquT;8ؾWgW*} ۺ0qUaںʓ}Xo-V ^QwA-ܷ}5qm { hUBY- {V越UH^ʛ_U?|}!Q*2`1kQű*UЫW9tO#/");W `WKz: ԡ:o"]sBֻZ%BKo/D]ˈKwJ(Tf@hUwӦ)}*k[mWh -чo;EuĮ EFo>¿'z=zlNsq:t9vMtLI3ds&=>yiBy @Qhf[)fv4ώS܆B-bng$3ƘI܆CF7bTިF ^K aoބ؎i`cY,mwD̈́ߤ2iqoM5C7e&az$yώӼ5wНwӷ>\?.>уl=?ȿ|㫝D%"Z+Iz$4_׉!DW!<# '@vz]`<s"x.WWkSo& ^@w3N?~2 Z=A~:x|wi#{ȃx|?~| 0A?#` <΁ge m{m:1oN-`O<(3<" p~|>,)`<  2x| :'`C`^4`^"#t`,&Ly@70A%97` `lwmj] ;Np' `#S`<)pn"jRPJ/@oTz :9i*u]kZI<+8<$\Q c*{RUY_Q:Հ~Eݨʎx մ '`ˀ~-_Я+:? 䙂>߯i4-*ʤ$ǩJrVpDɣJE,[eq H*("8-dqX YO{,Ec b!uHr հ<+s>:>,|ƃ2t? C߂/!}!Tv=dsk{}1YoU)/^D^ʮпʺ{w!W(S!ȾwUjI#hpFϒkWAzk5ِF9"t7Oky>ZXJn:\MlAbZs3梛h@O b1:A+Ml#e?ON{LFΑ6~+vǩfs;E{Ȳղ eJ=(G|>#f2H!pih 4vF <|p;x ~6j'>EEDy>l q(هSWoG_(u'l܊ s㑭9io1a3iFgGy$⠉8ı&JF'B VY]cЋ>hc(&5( Gt.φpsOkޭoҾ.mq\ˆ"PxVD%"<\ Ӓ뉢?WFy_ن]͛?;m)zns,?}3&6ܯ5UϓY9gY'sS!uVJ:FuP9&6uDT=WJ5{L8JV>׮W̝Ϣh> ER%{66o6=C:Ӓ鱨\l  EoL'֥;ץץT4?|LĹoxp٫|[C-J(-3S2c)[U>s95E!\!5еYj܂9U*S9;L=ۭ&ǵ+G}gj&_>槭@A0UP)Y3V+N17ST*.9r wE[+Z0u$Ϥھ^<2Ȳ&Y:UY&;S;櫖_p,{'|%WrJHrw-oMVS3|uv3^f+W|Ĝvن)w;S*&ɰS_+9CTl.Ljhdwkp7NQi0}c޶or.lfi/Z|n󊶵V0ṄO΀푪[q[8& )ZP:+z]œ󟌪eJ1!Ч5c :2TEJv)\-x["c*V1B`t3wĬ Q7ɜHNsi6e3k "{괬k,fCXX; HSxGq~IK e;W߳hcUS(y,HPU2쟇f۶=q! E B&YuG=wbI"B^\K"_+֬ Q 6c8'ʞyPKOCl=T,7META-INF/CERT.SFmIo@;cmMz`"-^0 8:l3K/ixM pEUV:I(<;d1. 5&VOLtO|i{>#tdh,*38gq sSE^]Nz}J6q(bݘ3b#QRN5EAr^ýs*^5 vx;vΨ7h*+>ރEM!b2 >j2,4X7$+a0shNbk(-f_.|PKOC _META-INF/CERT.RSA3hbfajhδAG&FFCnN6Vm>f&)Vn"M/ f&F&&FS^FVs ̡,lL| 0c^JQ~fHY*Tn 'khd`dhfddd`l%kX@8ٍ ̍ L w;',fڦQV^:|Ʊ  F;f\=oOz<*}yC7Zl//23J^w0ɯy_U0|I7'ܘvg&ݳĽ hA t/'k?LVprsV7Yʮ}:FKO6{Ul{[kP–k2ئq/2klj+~=}$!ۿ*%,sҸ-}&c˪ޠ^aKaZj6>1h|Ld<4} %'h`il6Z&G}U&gk7ޒ:!r _{[սrYFi3.WݫegOnP:g؞[7,|iowi^ί-x΅ǟ_.6PK OC=-res/drawable/ic_launcher.pngPKOCS Lres/layout/activity_main.xmlPKOCIדAndroidManifest.xmlPK OC?} resources.arscPKOCT~ classes.dexPKENgW2META-INF/MANIFEST.MFUTSTux PKOCl=T,7 META-INF/CERT.SFPKOC _!META-INF/CERT.RSAPK%$././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/urzip-release-unsigned.apk0000644000175000017500000002042714620351225021247 0ustar00hanshansPK/EAndroidManifest.xmlKo[UNbHqrc'~\ǏѴ@*iEҰp:džU5kKuP5 ?ss=gwf{sDũ&*Sv#; t Qաcg/T݀ЗЏ?D( }5o("jA'/Sw(2D ݅c 4!\R5ۂ[*^cȱ Ft^Ѡ7)kwUWA}M>TOsI֐j+?DS>g t[ZgglgTC̾t%v.9RV*{݃&}9ޣ RUDa))k*S 5VUs h:xlU#%J K#!);΁k >K^bgv]vOyW]ki׶yx,3¥C_>ۈڢ눋C(#t*AGnci\G &]U>uӸ;6-vb߆T|F0їsf̌qazN4#f|Gs}G$߈& 'Lq9Cr BI(-CYbs~=z75;*C7$}d9Dbs?(xAՉk΋-b57!yTgǤhylJ,^cu7uSFP[cCo;n ([c0Ѝ?"܏zcTcϺ󉋏K¾njx57'9gy IMm^r֜6탷 7m|b^GKh<3;r- oIl|$Ŗ֘7X}>7)%oi-uߺoYx/i-w*"gy<^XxxE5^+Wxe˳sxFz+;gxwooa^PKDy+PK PC=-res/drawable/ic_launcher.pngPNG  IHDRw=LIDATHǥyPuƟ{².˲ 8ႈ 628yr OCM5V^ʡbY"0,,{DPXϟ>ߋ4zљp a22x@-q &6'xnب4Ռs-<!a^zD\W6=YMQ2ɗw|՟-f̶vJA؜s1Ym®n>/]ҹr8୔@(r1.}j:Oi> DowJ'CRRVJ eMPy|{|7sRNQy(KNnቹM{p՝Ғ6Q:h++-LxȄsՆIT~M≹\{V{TTX@vL (Ćyq]zAnBFZmHocs  Çd6ihh CCfQ!j2OPSեlUY G?15t"GUˢy*(M6\$""DJiujdo5GcF^G"@ Vx\|T$SgOt ::erOK\]Ϟb¶hӫnZ>5^7 S~6B3Щb#RجJ[ =64%1N ('5+٥bvTD%W< `y*VnJK6͵[h8l3PA$M;QZ1[,U3|.nlIuG2 3 eb2V'0`ę&Uڂg ,.!蒎Q1 F|UJvuӆaL06 cLzN׎zXYٹLGBr8#0LmMOS7onDVv͞} DLژ.C{e 󳵴&cY,ZKSiZ=I`҇6%]Nm},ŅU5SN܈mݷ<65}E޷'0CקԄf.̙3;EnK=_d*/r.Ѵ#>)?/Ԟ H\o7aU%(|${hjǜIL~ cS/LҘPPX"1sgsLuP!!"@&849^1|'3}ȕs_-]$IVM1,,D-aEDA̤rIENDB`PK/Eres/layout/activity_main.xmluN@=[$BHA"5%$ 'Ql*x$ G;es;wofw} ƘMCt- G«& 99w%fmF)B[nTχUПg!F$~"u.m*~RUx:R}o{EO١R3~`)6d?Tޟ#]{ȣ>64u6Z?p̑?gqդ~,ᛙPKS LPK /Eresources.arsc 0<xres/drawable/ic_launcher.pngres/layout/activity_main.xmlurzipSettings Hello world! info.guardianproject.urzip l, 0attrdrawablelayoutstring08Ln ic_launcher activity_mainapp_nameaction_settings hello_worldDXH0DXH0DP0 PK.E classes.dexyluofg\{"ARHJ!,"mZaVʉ<#-gV壢 %qluDQm8U\Vİq mUPhiE 9%$>-ڋw.Ճ?{oқ~De"Z<~g6HڷhD!C1!BFy[MWGN5ht;xO x| > Dnp CՌ%!`\W@ s e&> u~pcsy"^_{o?߂h+rL {0`̃'g%2C'm]guK_ X l8P<}p? |>,` <  x|)s#p;`9C`4`]"#B0Q`i< t\F ^6;/v w{. a10$8jM%JJJE c\ו%L!ULs{3Ii~G~GSJry+zvL+./~=C@Я|$"Pg?~;)O-*ʤ}$FrTpDcJVD.%y|R߁d.y5sb>?Bj*W|U'WdJBRG/ NW/.dJF%J6awI٪d>!d>%da*٦I!!;騐q:!i%_PKbgERľ {b5^{]3j v}Q8yBF}/@f Sy!{bKw!SB6*/M8sdM*M/G߃[B<-WJvIkI&Ě{a|@Osz_/&}k!tZ/&ϐfh[={Hco?Qfuma߁M{)oe_3??UQB2ߗSw]l\G0 tc>Vn vB9DԠCp_g'ê zi`Z3;s."7 'Y=dXn6@r_bu\EV6l럦fwktN&֏8~F=|뽿%\."׉zdSz|v yF[9wN0THt!jO]0'd5П.ZlYn/Цlލ6=5FGi$Ƞpy.Y~ x ypSxlwQZVyFLzӂ7) ɯF-DVĒEXes3MlF>\OLxw Kiݻ78uhF|F4(/eP}tG^Dm~4?b]M݉n {am;MTAMk02Ab"@gô~g(պ9X#ޡmAO9&s\eT@T?V^N֎~EffrS{Ū dzu56}yN}Sz'V1aOsYܩ-<]֧Fѝ` niV^Z߸hLKFBs6q=3XN)))2Se~O k1^\O}Sn۬JnRO-v!K٬gzg]gwM ;D,=Te̪g_$6@lÎT Qj攊;,j\fmߤ(/8,F|ssN6ŪoD^niI'&')Ib(Mr3tmrZ'-{Nq*S=?D{s[bW<]xweUUλ)r&w7#oIK;;0y%ZC]çQ{vVy-}& ^p\tHDZ(#-b y۷䀭S_]4|1cn?#g!1XdԾ++ kEbI;C8?B4i'FMR~q9uV`W*^j%kBI~zɊ]m▊Z6n"_sl L `)*oXBEjQhW0#Vut(Q&pfpR'fS2rEP"{ѩT+7 㟇xhB Myi˅ ;B`PTC(ġ|x3a&AϷJ<K%9/~PS8Yjna5> {dzzh/8/}+*bګί\[x ҍԻ(;3s~y+V6y۔[̢h5OqUc˳SRlƤ*.[5P[¾]X @T-`!cXsX6ӛ\`\'E+SB@H RzrQsM)&WɢQ}JX'J؆I_.k"J2R .f8;pG@Em>A&s"if/ˬkZ^f-x~E{质٫,6 gXXEH$aGc?me\ߊ:3Sc٤'Xsi]Cϲ=ƚtv{u;ړl ngϱȖzh_g:nzYH׬ gY C[\†녞It耻4> UMd$1u*o];ZEWX6iC%9\_~Wz{(ۘMeلl,ZÙlFܕٖٙ1znbٜl˲M,i~A/2 ]@^`^>f,-5C]kR nJ ok[X({-Z- "/O/.+wZְv-Ȯ]۴m}mL|TcZ'留=c>ͮ3nή΂,N{w|X>aSYJ¿WL9.OWwcfr!\R5ۂ[*^cȱ Ft^Ѡ7)kwUWA}M>TOsI֐j+?DS>g t[ZgglgTC̾t%v.9RV*{݃&}9ޣ RUDa))k*S 5VUs h:xlU#%J K#!);΁k >K^bgv]vOyW]ki׶yx,3¥C_>ۈڢ눋C(#t*AGnci\G &]U>uӸ;6-vb߆T|F0їsf̌qazN4#f|Gs}G$߈& 'Lq9Cr BI(-CYbs~=z75;*C7$}d9Dbs?(xAՉk΋-b57!yTgǤhylJ,^cu7uSFP[cCo;n ([c0Ѝ?"܏zcTcϺ󉋏K¾njx57'9gy IMm^r֜6탷 7m|b^GKh<3;r- oIl|$Ŗ֘7X}>7)%oi-uߺoYx/i-w*"gy<^XxxE5^+Wxe˳sxFz+;gxwooa^PKDy+PK bE=-res/drawable/ic_launcher.pngPNG  IHDRw=LIDATHǥyPuƟ{².˲ 8ႈ 628yr OCM5V^ʡbY"0,,{DPXϟ>ߋ4zљp a22x@-q &6'xnب4Ռs-<!a^zD\W6=YMQ2ɗw|՟-f̶vJA؜s1Ym®n>/]ҹr8୔@(r1.}j:Oi> DowJ'CRRVJ eMPy|{|7sRNQy(KNnቹM{p՝Ғ6Q:h++-LxȄsՆIT~M≹\{V{TTX@vL (Ćyq]zAnBFZmHocs  Çd6ihh CCfQ!j2OPSեlUY G?15t"GUˢy*(M6\$""DJiujdo5GcF^G"@ Vx\|T$SgOt ::erOK\]Ϟb¶hӫnZ>5^7 S~6B3Щb#RجJ[ =64%1N ('5+٥bvTD%W< `y*VnJK6͵[h8l3PA$M;QZ1[,U3|.nlIuG2 3 eb2V'0`ę&Uڂg ,.!蒎Q1 F|UJvuӆaL06 cLzN׎zXYٹLGBr8#0LmMOS7onDVv͞} DLژ.C{e 󳵴&cY,ZKSiZ=I`҇6%]Nm},ŅU5SN܈mݷ<65}E޷'0CקԄf.̙3;EnK=_d*/r.Ѵ#>)?/Ԟ H\o7aU%(|${hjǜIL~ cS/LҘPPX"1sgsLuP!!"@&849^1|'3}ȕs_-]$IVM1,,D-aEDA̤rIENDB`PKbES Lres/layout/activity_main.xmluN@=[$BHA"5%$ 'Ql*x$ G;es;wofw} ƘMCt- G«& 99w%fmF)B[nTχUПg!F$~"u.m*~RUx:R}o{EO١R3~`)6d?Tޟ#]{ȣ>64u6Z?p̑?gqդ~,ᛙPKS LPK cEresources.arsc 0<xres/drawable/ic_launcher.pngres/layout/activity_main.xmlurzipSettings Hello world! info.guardianproject.urzip l, 0attrdrawablelayoutstring08Ln ic_launcher activity_mainapp_nameaction_settings hello_worldDXH0DXH0DP0 PKbE_>P classes.dex{p\u޽j%Yڗl]e,?f%XJ{-]{u,9 6!0 BC4fڐtJNNN6gڴ`IBﱫkaHs~wd/FnNګ~'-ѱUo]MT!:H]!J>B:ZoBB2!_A0B4ȌIx</ooo_NtApLs w a%7}6c`v!0.ς~]Da4 }x "D V` -`; g"x< _o 4YPVpA0 >WW7wk['=%A [x@"x \/???ow#>u`wU(x 6x|| cm5}4CD9X-@k@/0A(\` `6`Pa0f l[p(]v8  _i#jSPRJ_-@Js]Wz'TLcRqxMڹS77POw(]U롔yU\I{(}UjY~P怾- z<ux6@~'aSRr6>ǡE\(yZ 9GyJ"Ra%/B2D,$*WΈ9M/SqBH,+̗h "OHY=M!{sB+ח,צdJv%;㑲[4M Bƕ SI}\ȼ&}V(߅#B1!tVɲQ%?3bgDnR'ž {Zӈ#n2! uN/#-Ƭ?/kI-楿+d  JF__8wd-<ۂ{4wR&5GFm𿔗|Nc8XyyvSisb0$yn:Q F-e_ _v5$|#+V_ST ȵ^7Պ!rhz.k-}Iˢyv8+h]Ti}8Mh=)>F='d8T=Cr_`1:F*fVqrsfdsr=u!Vmx/@:7!Q#"jL-wx}vn;' /$|d-j8~v~λacxy0&!r-b~Y>ţΙ-Mm}'XGd]O|89yW+f0ڨ`dރt<\? W ݏBM=/nj dN#J ,30[rVѷ"[8c}I԰7gAOOYf効AAڣsӊow |pl&}[ #Yo;ɀ&R>.⡡ό^#jgۃ^ @Ei75nGXxGx#z*{T%\G(8#|.1~.ύiA;چ{%ns w +[ӯk V|r&SRT?3_SZ˽l5kV:WI!V{N #kMS3Wz&\v><ݛ+w+yr4s=J!FQ*#i:ֶR69:::&ǢBsͼ|w m^ޱ"oE+%f*7j="S|xqrmRrܨ`]Y&b/eǟz7`꽀#4q >If3I*&]qv"FN4湧١3ւEck^͜mf%7)1;+ƾ{Pϸ{y~)ۦX4OS|i$v NLPĐfuOXnҰU ETL>5ۭ HMk׆"u5M^uxouɝguE Gnliל7[D*/8g-A8 Syֽk^?"݇tZ9H6NCg,؇# xo@ #}4ȸ>*,;IzYq*+}VGvf3z,{˴=,3lˮaI<,n\eXHצ9& c ,1ƽaz 3h?ԩe6`$kpnjcmEXCkю}MTS{=E'iϤ2m,-GSC}Z 3i=}KzgzkZer-әYw<#"/%FPӋ,=&޺G..w2tAih/w&BbtKc/w'vx^%l7g;yn~25t]^& E2n7|n]J39Z{O͔'u_|gP{)ߋQSwPK_>PPKbEgyMETA-INF/MANIFEST.MFmj@} eDB&jl֪3_Ǒ̌+" ݾpN8+ wZo[7RP|o[5C έ$7=̶A9N|%fG KX|q$(KT}Mw2<=tOϗO _v J5-v Qj* u{/zR/(LAHFt{ǬGFǃ _D!.smKo{QQ=COu PKgyPKbEպ7META-INF/CERT.SFmKk@p">bBNhJ%n¨5cbB tw9p>w ")Due#YET[ 5G32Vx= !SQpq`D$!fغӾcK{etv;VI)< ';*U6-u6^f"D{ @u0|+!Y"؎}f}c#Xw4A i 7" xQL- ̽0??+!m@A_Cpe0P{GtPKպ7PKbE.1wMETA-INF/CERT.RSAU;ԋb!CwƮc)nBFa !K3h#K Iy/V'!BM9Wʸu{~yy 2QZvB2& DP( #b0@A˘(0z \SMP([J*p$ z/NaQVQ8YP;%M Ş'E)FSBNA!4VM)VڎcM !+yƇGĂ 283'dD p8h{c<,(c{ x @! H 8/Nz<+IBÄ5qJId)g;b9h`F;|``#VP7.KNE ӿ*65bDp}\}Y[Bw\vFKCU+Ure{gl:g6O.?ת}PpzS]|BdJ6a''QQC~) K 玬r]LIMvKJiP#`n0VS5$M4pCi N=An^_JO'W|PZwzՙ}Hz>,GNn+SX[ 4>֜k㭖dߴq ||͹,h~^en2b<0"g7?AN%76W-}*nݡ{mJv=|K2}J;L1 !ErJy^aiTROǪTHbpiEJu9;9Opvп\xp?%5ub^`حkS?z^yg ⣒pV^X/P2yg7ޅn*aAMDe8lϽ!tuND{ hվ(I؛6;&^n8uĂWl+ 9SB䠾rz|cy4쪅JIax_8īO#?Wh~~^:>4 4ܵ= 5өa=KzF7 4|3o>[Ӄ32Xz)*iK^Y$S,ߦeT׵`+aFB4al=;\J\XUn>5җF>wnT`*'$O/~`.8 b~"+>2ȦĶsP+TzI\ ujrk|Fv~p-^'DkmK[e|*Vchɡ+~^:]#e3ym\ɬtw[ WhjVmr\{vF7H]Dm?32$ts$[~P classes.dexPKbEgyMETA-INF/MANIFEST.MFPKbEպ7@!META-INF/CERT.SFPKbE.1w"META-INF/CERT.RSAPK k*././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/urzip.apk0000644000175000017500000002336114620351225016017 0ustar00hanshansPK OC=-res/drawable/ic_launcher.pngPNG  IHDRw=LIDATHǥyPuƟ{².˲ 8ႈ 628yr OCM5V^ʡbY"0,,{DPXϟ>ߋ4zљp a22x@-q &6'xnب4Ռs-<!a^zD\W6=YMQ2ɗw|՟-f̶vJA؜s1Ym®n>/]ҹr8୔@(r1.}j:Oi> DowJ'CRRVJ eMPy|{|7sRNQy(KNnቹM{p՝Ғ6Q:h++-LxȄsՆIT~M≹\{V{TTX@vL (Ćyq]zAnBFZmHocs  Çd6ihh CCfQ!j2OPSեlUY G?15t"GUˢy*(M6\$""DJiujdo5GcF^G"@ Vx\|T$SgOt ::erOK\]Ϟb¶hӫnZ>5^7 S~6B3Щb#RجJ[ =64%1N ('5+٥bvTD%W< `y*VnJK6͵[h8l3PA$M;QZ1[,U3|.nlIuG2 3 eb2V'0`ę&Uڂg ,.!蒎Q1 F|UJvuӆaL06 cLzN׎zXYٹLGBr8#0LmMOS7onDVv͞} DLژ.C{e 󳵴&cY,ZKSiZ=I`҇6%]Nm},ŅU5SN܈mݷ<65}E޷'0CקԄf.̙3;EnK=_d*/r.Ѵ#>)?/Ԟ H\o7aU%(|${hjǜIL~ cS/LҘPPX"1sgsLuP!!"@&849^1|'3}ȕs_-]$IVM1,,D-aEDA̤rIENDB`PKOCres/layout/activity_main.xmluN@=[$BHA"5%$ 'Ql*x$ G;es;wofw} ƘMCt- G«& 99w%fmF)B[nTχUПg!F$~"u.m*~RUx:R}o{EO١R3~`)6d?Tޟ#]{ȣ>64u6Z?p̑?gqդ~,ᛙPKS LPKOCAndroidManifest.xmlKoSGϵM'ǘR"!Tmqh˦E,.. 좟U V,*枩'|WϽg͙3sQS:AQuS8OA MzQz } }="4TCC?CA@D_@@/ 1eh ZBB/} =~z -Uh%oriG{vhxlإi٧*zb#(:bquT;8ؾWgW*} ۺ0qUaںʓ}Xo-V ^QwA-ܷ}5qm { hUBY- {V越UH^ʛ_U?|}!Q*2`1kQű*UЫW9tO#/");W `WKz: ԡ:o"]sBֻZ%BKo/D]ˈKwJ(Tf@hUwӦ)}*k[mWh -чo;EuĮ EFo>¿'z=zlNsq:t9vMtLI3ds&=>yiBy @Qhf[)fv4ώS܆B-bng$3ƘI܆CF7bTިF ^K aoބ؎i`cY,mwD̈́ߤ2iqoM5C7e&az$yώӼ5wНwӷ>\?.>уl=?ȿ|㫝D%"Z+Iz$4_׉!DW!<# '@vz]`<s"x.WWkSo& ^@w3N?~2 Z=A~:x|wi#{ȃx|?~| 0A?#` <΁ge m{m:1oN-`O<(3<" p~|>,)`<  2x| :'`C`^4`^"#t`,&Ly@70A%97` `lwmj] ;Np' `#S`<)pn"jRPJ/@oTz :9i*u]kZI<+8<$\Q c*{RUY_Q:Հ~Eݨʎx մ '`ˀ~-_Я+:? 䙂>߯i4-*ʤ$ǩJrVpDɣJE,[eq H*("8-dqX YO{,Ec b!uHr հ<+s>:>,|ƃ2t? C߂/!}!Tv=dsk{}1YoU)/^D^ʮпʺ{w!W(S!ȾwUjI#hpFϒkWAzk5ِF9"t7Oky>ZXJn:\MlAbZs3梛h@O b1:A+Ml#e?ON{LFΑ6~+vǩfs;E{Ȳղ eJ=(G|>#f2H!pih 4vF <|p;x ~6j'>EEDy>l q(هSWoG_(u'l܊ s㑭9io1a3iFgGy$⠉8ı&JF'B VY]cЋ>hc(&5( Gt.φpsOkޭoҾ.mq\ˆ"PxVD%"<\ Ӓ뉢?WFy_ن]͛?;m)zns,?}3&6ܯ5UϓY9gY'sS!uVJ:FuP9&6uDT=WJ5{L8JV>׮W̝Ϣh> ER%{66o6=C:Ӓ鱨\l  EoL'֥;ץץT4?|LĹoxp٫|[C-J(-3S2c)[U>s95E!\!5еYj܂9U*S9;L=ۭ&ǵ+G}gj&_>槭@A0UP)Y3V+N17ST*.9r wE[+Z0u$Ϥھ^<2Ȳ&Y:UY&;S;櫖_p,{'|%WrJHrw-oMVS3|uv3^f+W|Ĝvن)w;S*&ɰS_+9CTl.Ljhdwkp7NQi0}c޶or.lfi/Z|n󊶵V0ṄO΀푪[q[8& )ZP:+z]œ󟌪eJ1!Ч5c :2TEJv)\-x["c*V1B`t3wĬ Q7ɜHNsi6e3k "{괬k,fCXX; HSxGq~IK e;W#tdh,*38gq sSE^]Nz}J6q(bݘ3b#QRN5EAr^ýs*^5 vx;vΨ7h*+>ރEM!b2 >j2,4X7$+a0shNbk(-f_.|PKl=T,7PKOCMETA-INF/CERT.RSA3hbfajhδAG&FFCnN6Vm>f&)Vn"M/ f&F&&FS^FVs ̡,lL| 0c^JQ~fHY*Tn 'khd`dhfddd`l%kX@8ٍ ̍ L w;',fڦQV^:|Ʊ  F;f\=oOz<*}yC7Zl//23J^w0ɯy_U0|I7'ܘvg&ݳĽ hA t/'k?LVprsV7Yʮ}:FKO6{Ul{[kP–k2ئq/2klj+~=}$!ۿ*%,sҸ-}&c˪ޠ^aKaZj6>1h|Ld<4} %'h`il6Z&G}U&gk7ޒ:!r _{[սrYFi3.WݫegOnP:g؞[7,|iowi^ί-x΅ǟ_.6PK _PK OC=-res/drawable/ic_launcher.pngPKOCS Lres/layout/activity_main.xmlPKOCIדAndroidManifest.xmlPK OC?} resources.arscPKOCT~ classes.dexPKOC,bMETA-INF/MANIFEST.MFPKOCl=T,7 META-INF/CERT.SFPKOC _0"META-INF/CERT.RSAPK $././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/v2.only.sig_2.apk0000644000175000017500000002746614620351225017171 0ustar00hanshansPKjݲAndroidManifest.xml=PGa%a @ɐL&3$($-#0|MSL*eTT\H"e {V;Z$ڽ~voR/:HPO?Z"4MCA{ z EE&N]GPE?hBO+{O(ET@ Z!z "QBi %Qm*wвšlE Qzh}7Pt [TP۠/G}Lڡ;TgX1e߇3F-[eze(j[sUp|x.ۨo}0%^Aqh.~\%UcYdϜ93&3ٱǐu=bƖ1Cfh]@u څ΄a[;Y<-x|l[e`5 p</?Xh+8*x` ~( 6 </{h3^}&x| Z6h@/`/M4xowDA tj7 T>.1)x Zct^pLpGy2x > $%BAxkZ]`6i`sp+U`'׀Q\bOoBoVУJ:€4G21KK K;׃aY>*tӪ-J_rMmܗ.MRսF\ME};]z֥]zKosY2} g>ԥlyB!g2eYɊV+U:bnXUWT187*9 +2:)G9MtLBj4Ҷ_ݔ^RLN F_r%nBXa)tDEȠ~2LB*O+D0;(*A&+i LJީYW~BzGRأ._6a~cB6%d*{rqJ_@+1\%b]a$7 U$⿃ B6 qvy$HnEJQr֓dž38 /fn"y^b-!Gx] LU۫\ &e\G]gH"/)ܝ?$<`oR|/0 #I/C~+ ^߉ڼ4qNfCr.8m} l 8=Ęݳ'sebC'w($ΰvAWk#Bu)mQtsԘz\}I_{m|FP-JJ`ԗ7U&/ kJ#0z4{+n.;8kbvNuψ(h9fEWN kDz}|Tڕ?^ DMP&gQ+g1H|[ =둨G?0j-nAXnυmGp{ĹqOŠxJɔ?;סM;BpP_kD:ZC!91x$J*GŜYUĜ0O>0uxcH@:+ǰB""U92;_EA?W1zer_&쮿/˩;iL̷`,Q5c-6גމfm@ո#}|HF"]k59|7oFܕ|O7 ɷvjTOڟY{#j}[RJI^:O8#D|`0$߅K#+3c^4`[5b(bMv31k暭U_<Ǟ[8bl5 oq45 uuGSM6鵴f?Xza?ts?me᧬ V^3PH]]a *)!y#nůG*olWKM7So&u)ê0g;7&֤KzlU {YuҺl}ؿ?;<406.f%}ȱ\I;7f]ʎtv`QlXXt8GټQ _v:c 2:T0>Zy2öm:*"#*`Ȋ9hMF`dd8ڕbzj8y˰KN񨙫mV)=bXK}VCaT2-}\"TqԔaT f#fV+B N_Xe!ox433Ki=/_0_J {:=X,Lc at5sG'e;P+֬yGOĶs+Vߘ^>K]5Cvܕ1:Y69IJOy #V1cWvrtftzJ[+]1]gOTyPjtqX|frgE(u? gl`/DSBSS-e)6ŃݝYLɐ6p|Pax#|"s F.g˝[zzQ{ t-e25j. 󵥥:x`6fMC3X{_^o&ș[ǽo0o-~|,mѼP3Mh)ƴ$Z;bSm$c&=g)ς/~F[#1 B&1h>tCmcX'ۋ)W;_ϩ<4xheB %z~mBBv9^Peygn%Yy sK=$K?Y҅pY>Hs}'C׾־#b|/<"=?tɫN}&e1ODڹA|6ePK }sr res/drawable/ic_launcher.png5PNG  IHDRw=IDATHǭU[P[U=7y] ) I<+ tSGh sMfX^w} "`r?uRh-@@}xs؅l.n~[Y&cPf!ͅu޶e.o_a#_"Ц!GGmq OO@打h[rPVr4ƾ& 70A&өa0pь d7O&"$An<.9k_k1.N MI]x_B689p:][[Bq)5oBuƳ;\2&B@/JOKLhr?Ԭ=`0>WO?.0 'mvV1/.r3hFs!Z B|^%&M'NX}<Һ{^T).7{<9J)mٱɺPzG项MS Ȕn_(mjnx]/*-4h{{jr\5aa+Ѧ@{oMaHv%G7eKWk*dAn%jjn[rXS"DOE .>B']s;`+egⲰS6kLBȁsx_]η ؜YETb']p_$ Ԯo<܏q&c 1p'R0eh_^/_IENDB`PKTgres/layout/activity_main.xmluPN0C[:t`@֡C=#!XU[mI |gJy[*z{x#Kp3 5`Z R=ƕޢָHSo=:[=w )9Ar]á~uT=fQR\MaIX?Aż!"Pgǖqš1=}W:fAf{wd݇Ґ%d}dQ*B|q-v#PK DDresources.arsc D09X Hello world!Settingsres/drawable/ic_launcher.pngres/layout/activity_main.xmlv2 only Signature v2.only.sig |\($drawablelayoutstring|00; ic_launcher activity_mainaction_settingsapp_name hello_worldThX@ThX@T`@ ?  q7 3 LH@6#U0҆Lgy4D`rDu7Y|W*Dl]X8W J00}).Ҟ0  *H  0{1 0 UUS1 0 UNY10UBrooklyn10U Guardian Project10U Unknown10UHans-Christoph Steiner0 140623163212Z 411108163212Z0{1 0 UUS1 0 UNY10UBrooklyn10U Guardian Project10U Unknown10UHans-Christoph Steiner0"0  *H 0 Nۢ>yvA-zmO2=6ߚL:Xx: l9 2t.yi~7Mɍ 'Ţb$62^_pK23[@Y~%t7 oI9:e6@JxAle}PPo%$оQ.q1PDP^HZ G]]*!"~ b'8LkE2l@eSRh1QHj3& sa& aMJ_o}& B3ʦ㞦4x dھR+aS70Ɠ jwK܁YBj\/㥆a/XA5U͎L.<ja.DW&zI(1bM`{>;1H]yJ$p:aYeș糨,K B$ ^XAhY WVN}%!kS;mRF!00U?{쥡"SNd{+0  *H  T # My9L~P1 0r+ˣVτ@UR̜}1ӂC>;>\jUCR+bЬ)-j )+oT)CcQt:өwH}7iLj` K8_WG*@fw1-xfQC3IIN?_ڳH3I'P5f>DMI܇u؉LlФ5E[B׽ (:bQ0>l5\q%Hh@܊Xcgw@~h,иGFsnsDM_xD_@qM W (xs^v̜uQ?yLO݊2Ur`>URCh`ȡ㬴| ]r?LT;RT|kƕf}Wdu0`V݂4@4>"i}-D&ɇҹ|~y,=OS9htJfaF @+ϩ1e+381WR7_{*&2[vq,ML0ĜxM3s\E7STjX.w8f,ឍ6YHe)+20d:"ˉ˰t,0$hZ-zWYCp0l`ssjU0zњ,u&4hK_mQ"CYH_A ; &0"0  *H 0 Nۢ>yvA-zmO2=6ߚL:Xx: l9 2t.yi~7Mɍ 'Ţb$62^_pK23[@Y~%t7 oI9:e6@JxAle}PPo%$оQ.q1PDP^HZ G]]*!"~ b'8LkE2l@eSRh1QHj3& sa& aMJ_o}& B3ʦ㞦4x dھR+aS70Ɠ jwK܁YBj\/㥆a/XA5U͎L.<ja.DW&zI(1bM`{>;1H]yJ$p:aYeș糨,K B$ ^XAhY WVN}%!kS;mRFwerBAPK Sig Block 42PKjݲAndroidManifest.xmlPKcQWMETA-INF/MANIFEST.MFPK2wj  fclasses.dexPK }srres/drawable/ic_launcher.pngPKTgres/layout/activity_main.xmlPK DD$resources.arscPK-././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1715589989.9323833 fdroidserver-2.3a1/tests/valid-package-names/0000755000175000017500000000000014620351546017743 5ustar00hanshans././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/valid-package-names/RandomPackageNames.java0000644000175000017500000002115714620351225024266 0ustar00hanshans import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.Writer; import java.io.InputStreamReader; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.IntBuffer; import java.util.Random; // apt-get install libcommons-lang3-java //import org.apache.commons.lang3.RandomStringUtils; public class RandomPackageNames { private static Writer validWriter; private static Writer invalidWriter; private static final String[] py = { "python3", "-c", "import sys,re\n" + "m = re.search(r'''" // + "^(?:[a-z_]+(?:\\d*[a-zA-Z_]*)*)(?:\\.[a-z_]+(?:\\d*[a-zA-Z_]*)*)*$" + "^[a-z_]+(?:\\d*[a-zA-Z_]*)(?:\\.[a-z_]+(?:\\d*[a-zA-Z_]*)*)*$" + "''', sys.stdin.read())\n" + "if m is not None:\n" + " with open('/tmp/foo', 'w') as fp:\n" + " fp.write(m.group() + '\\n')\n" + "sys.exit(m is None)" }; public static boolean checkAgainstPython(String packageName) throws IOException, InterruptedException { ProcessBuilder pb = new ProcessBuilder(py); Process process = pb.start(); OutputStream output = process.getOutputStream(); output.write(packageName.getBytes()); output.write("\n".getBytes()); output.flush(); output.close(); int exitVal = process.waitFor(); return exitVal == 0; } private static boolean isValidJavaIdentifier(String packageName) { if (packageName.length() == 0 || !Character.isJavaIdentifierStart(packageName.charAt(0))) { //System.out.println("invalid first char: '" + packageName + "'"); return false; } for (int codePoint : packageName.codePoints().toArray()) { if (codePoint != 46 && !Character.isJavaIdentifierPart(codePoint)) { //System.out.println("invalid char: '" // + new StringBuilder().appendCodePoint(codePoint).toString() + "' " // + codePoint); return false; } } return true; } private static void write(String packageName) throws IOException { if (isValidJavaIdentifier(packageName)) { validWriter.write(packageName); validWriter.write("\n"); } else { invalidWriter.write(packageName); invalidWriter.write("\n"); } } private static void compare(String packageName) throws IOException, InterruptedException { boolean python = checkAgainstPython(packageName); boolean java = isValidJavaIdentifier(packageName); if (python && !java) { System.out.println("MISMATCH: '" + packageName + "' " + (python ? "py:✔" : "py:☹") + " " + (java ? "ja:✔" : "ja:☹") + " "); } } public static void main (String[] args) throws IOException, InterruptedException, UnsupportedEncodingException { int[] data; byte[] bytes; ByteBuffer byteBuffer; Random random = new Random(); validWriter = new OutputStreamWriter(new FileOutputStream("valid.txt"), "UTF-8"); invalidWriter = new OutputStreamWriter(new FileOutputStream("invalid.txt"), "UTF-8"); //System.out.print("."); char[] validFirstLetters = new char[27]; validFirstLetters[0] = 95; // _ for (int i = 1; i < 27; i++) { validFirstLetters[i] = (char) (i + 96); } char[] validLetters = new char[64]; int j = 0; for (char c = 32; c < 123; c++) { if ((c == 46) || (c > 47 && c < 58) || (c > 64 && c < 91) || (c > 96)) { validLetters[j] = c; j++; } } for (File f : new File("/home/hans/code/fdroid/fdroiddata/metadata").listFiles()) { String name = f.getName(); if (name.endsWith(".yml")) { compare(name.substring(0, name.length() - 4)); } } compare("SpeedoMeterApp.main"); compare("uk.co.turtle-player"); compare("oVPb"); compare(" _LS"); compare("r.vq"); compare("r.vQ"); compare("ra.vQ"); compare("s.vQ"); compare("r.tQ"); compare("r.vR"); compare("any.any"); compare("org.fdroid.fdroid"); compare("me.unfollowers.droid"); compare("me_.unfollowers.droid"); compare("me._unfollowers.droid"); compare("me.unfo11llowers.droid"); compare("me11.unfollowers.droid"); compare("m11e.unfollowers.droid"); compare("1me.unfollowers.droid"); compare("me.unfollowers23.droid"); compare("me.unfollowers.droid23d"); compare("me.unfollowers_.droid"); compare("me.unfollowers._droid"); compare("me.unfollowers_._droid"); compare("me.unfollowers.droid_"); compare("me.unfollowers.droid32"); compare("me.unfollowers.droid/"); compare("me:.unfollowers.droid"); compare(":me.unfollowers.droid"); compare("me.unfollowers.dro;id"); compare("me.unfollowe^rs.droid"); compare("me.unfollowers.droid."); compare("me.unfollowers..droid"); compare("me.unfollowers.droid._"); compare("me.unfollowers.11212"); compare("me.1.unfollowers.11212"); compare("me..unfollowers.11212"); compare("abc"); compare("abc."); compare(".abc"); for (int i = 0; i < 300000; i++) { String packageName; int count = random.nextInt(10) + 1; byte valid = (byte) random.ints(97, 122).limit(1).toArray()[0]; // only valid data = random.ints(46, 122) .limit(count) .filter(c -> (c == 46) || (c > 47 && c < 58) || (c > 64 && c < 91) || (c > 96)) .toArray(); byteBuffer = ByteBuffer.allocate(data.length); for (int value : data) { byteBuffer.put((byte)value); } if (data.length > 0) { bytes = byteBuffer.array(); bytes[0] = valid; packageName = new String(byteBuffer.array(), "UTF-8"); //System.out.println(packageName + ": " + isValidJavaIdentifier(packageName)); compare(packageName); write(packageName); } // full US-ASCII data = random.ints(32, 126).limit(count).toArray(); byteBuffer = ByteBuffer.allocate(data.length); for (int value : data) { byteBuffer.put((byte)value); } bytes = byteBuffer.array(); packageName = new String(bytes, "UTF-8"); //System.out.println(packageName + ": " + isValidJavaIdentifier(packageName)); compare(packageName); write(packageName); // full US-ASCII with valid first letter data = random.ints(32, 127).limit(count).toArray(); byteBuffer = ByteBuffer.allocate(data.length * 4); byteBuffer.asIntBuffer().put(data); bytes = byteBuffer.array(); bytes[0] = valid; packageName = new String(bytes, "UTF-8"); //System.out.println(packageName + ": " + isValidJavaIdentifier(packageName)); compare(packageName); write(packageName); // full unicode data = random.ints(32, 0xFFFD).limit(count).toArray(); byteBuffer = ByteBuffer.allocate(data.length * 4); byteBuffer.asIntBuffer().put(data); packageName = new String(byteBuffer.array(), "UTF-32"); //System.out.println(packageName + ": " + isValidJavaIdentifier(packageName)); compare(packageName); write(packageName); // full unicode with valid first letter data = random.ints(32, 0xFFFD).limit(count).toArray(); byteBuffer = ByteBuffer.allocate(data.length * 4); byteBuffer.asIntBuffer().put(data); bytes = byteBuffer.array(); bytes[0] = 0; bytes[1] = 0; bytes[2] = 0; bytes[3] = 120; packageName = new String(bytes, "UTF-32"); //System.out.println(packageName + ": " + isValidJavaIdentifier(packageName)); compare(packageName); write(packageName); } validWriter.close(); invalidWriter.close(); } } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/valid-package-names/random-package-names0000755000175000017500000000030414620351225023632 0ustar00hanshans#!/bin/sh set -e set -x export CLASSPATH=/usr/share/java/commons-lang3.jar:. cd $(dirname $0) javac -classpath $CLASSPATH RandomPackageNames.java java -classpath $CLASSPATH RandomPackageNames ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/valid-package-names/test.py0000755000175000017500000000156514620351225021300 0ustar00hanshans#!/usr/bin/env python3 import re def test(packageName): m = ANDROID_APPLICATION_ID_REGEX.match(packageName.strip()) return m is not None ANDROID_APPLICATION_ID_REGEX = re.compile(r'''(?:^[a-z_]+(?:\d*[a-zA-Z_]*)*)(?:\.[a-z_]+(?:\d*[a-zA-Z_]*)*)*$''') valid = 0 invalid = 0 test('org.fdroid.fdroid') with open('valid.txt', encoding="utf-8") as fp: for packageName in fp: packageName = packageName.strip() if not test(packageName): valid += 1 # print('should be valid:', packageName) with open('invalid.txt', encoding="utf-8") as fp: for packageName in fp: packageName = packageName.strip() if test(packageName): invalid += 1 print('should be not valid: "' + packageName + '"') print(valid, 'Java thinks is valid, but the Android regex does not') print(invalid, 'invalid mistakes') ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1715589781.0 fdroidserver-2.3a1/tests/vcs.TestCase0000755000175000017500000000652514620351225016407 0ustar00hanshans#!/usr/bin/env python3 # http://www.drdobbs.com/testing/unit-testing-with-python/240165163 import inspect import logging import os import sys import unittest from git import Repo localmodule = os.path.realpath( os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') ) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) import fdroidserver.build import fdroidserver.common import fdroidserver.metadata import fdroidserver.scanner from testcommon import mkdtemp, parse_args_for_test class VCSTest(unittest.TestCase): """For some reason the VCS classes are in fdroidserver/common.py""" def setUp(self): logging.basicConfig(level=logging.DEBUG) self.basedir = os.path.join(localmodule, 'tests') os.chdir(self.basedir) self._td = mkdtemp() self.testdir = self._td.name def tearDown(self): self._td.cleanup() os.chdir(self.basedir) def test_remote_set_head_can_fail(self): os.chdir(self.testdir) # First create an upstream repo with one commit upstream_repo = Repo.init("upstream_repo") with open(upstream_repo.working_dir + "/file", 'w') as f: f.write("Hello World!") upstream_repo.index.add([upstream_repo.working_dir + "/file"]) upstream_repo.index.commit("initial commit") commitid = upstream_repo.head.commit.hexsha # Now clone it once manually, like gitlab runner gitlab-runner sets up a repo during CI clone1 = Repo.init("clone1") clone1.create_remote("upstream", "file://" + upstream_repo.working_dir) clone1.remote("upstream").fetch() clone1.head.reference = clone1.commit(commitid) clone1.head.reset(index=True, working_tree=True) self.assertTrue(clone1.head.is_detached) # and now we want to use this clone as a source repo for fdroid build config = {} os.mkdir("build") config['sdk_path'] = 'MOCKPATH' config['ndk_paths'] = {'r10d': os.getenv('ANDROID_NDK_HOME')} config['java_paths'] = {'fake': 'fake'} fdroidserver.common.config = config app = fdroidserver.metadata.App() app.RepoType = 'git' app.Repo = clone1.working_dir app.id = 'com.gpl.rpg.AndorsTrail' build = fdroidserver.metadata.Build() build.commit = commitid build.androidupdate = ['no'] vcs, build_dir = fdroidserver.common.setup_vcs(app) # force an init of the repo, the remote head error only occurs on the second gotorevision call vcs.gotorevision(build.commit) fdroidserver.common.prepare_source( vcs, app, build, build_dir=build_dir, srclib_dir="ignore", extlib_dir="ignore", ) self.assertTrue(os.path.isfile("build/com.gpl.rpg.AndorsTrail/file")) if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) import argparse parser = argparse.ArgumentParser() parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(VCSTest)) unittest.main(failfast=False)